From 43669c082cee7c0f5f8f072cd03e1621f8d46a53 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Mon, 25 Apr 2022 23:09:52 +0200 Subject: [PATCH 001/260] gofmt --- backend/pkg/dev/profiling/profiling.go | 25 +- backend/pkg/env/aws.go | 2 +- backend/pkg/env/vars.go | 7 +- backend/pkg/env/worker-id.go | 4 +- backend/pkg/flakeid/flakeid.go | 2 +- backend/pkg/hashid/hashid.go | 1 - backend/pkg/intervals/intervals.go | 6 +- backend/pkg/log/queue.go | 99 +- backend/pkg/messages/facade.go | 2 +- backend/pkg/messages/filters.go | 3 +- backend/pkg/messages/get-timestamp.go | 118 +- .../pkg/messages/legacy-message-transform.go | 15 +- backend/pkg/messages/messages.go | 2304 ++++++------- .../pkg/messages/performance/performance.go | 3 +- backend/pkg/messages/primitives.go | 6 +- backend/pkg/messages/read-message.go | 2846 ++++++++--------- backend/pkg/redisstream/producer.go | 13 +- backend/pkg/redisstream/redis.go | 8 +- backend/pkg/storage/s3.go | 41 +- backend/pkg/url/assets/css.go | 2 +- backend/pkg/url/method.go | 10 +- backend/services/assets/jsexception.go | 8 +- backend/services/assets/main.go | 1 + backend/services/db/heuristics/anr.go | 13 +- backend/services/db/heuristics/clickrage.go | 17 +- backend/services/db/heuristics/heuristics.go | 13 +- backend/services/db/heuristics/performance.go | 25 +- .../db/heuristics/readyMessageStore.go | 5 +- backend/services/db/heuristics/session.go | 12 +- backend/services/db/stats.go | 20 +- backend/services/ender/builder/builderMap.go | 9 +- .../ender/builder/clikRageDetector.go | 26 +- .../services/ender/builder/cpuIssueFinder.go | 29 +- .../ender/builder/deadClickDetector.go | 24 +- .../services/ender/builder/domDropDetector.go | 11 +- .../ender/builder/inputEventBuilder.go | 11 +- .../ender/builder/memoryIssueFinder.go | 24 +- .../ender/builder/pageEventBuilder.go | 16 +- .../builder/performanceTrackAggrBuilder.go | 23 +- backend/services/http/assets.go | 4 +- backend/services/http/handlers-depricated.go | 2 +- backend/services/http/ios-device.go | 256 +- backend/services/http/uuid.go | 2 +- .../integrations/clientManager/manager.go | 24 +- .../integrations/integration/cloudwatch.go | 43 +- .../integrations/integration/elasticsearch.go | 6 +- .../integrations/integration/rollbar.go | 66 +- .../integrations/integration/utils.go | 19 +- backend/services/storage/gzip.go | 19 +- 49 files changed, 3097 insertions(+), 3148 deletions(-) diff --git a/backend/pkg/dev/profiling/profiling.go b/backend/pkg/dev/profiling/profiling.go index 139aaeac6..c05c47549 100644 --- a/backend/pkg/dev/profiling/profiling.go +++ b/backend/pkg/dev/profiling/profiling.go @@ -1,24 +1,23 @@ package profiling import ( - "log" - "net/http" - "github.com/gorilla/mux" - _ "net/http/pprof" -) + "github.com/gorilla/mux" + "log" + "net/http" + _ "net/http/pprof" +) func Profile() { go func() { - router := mux.NewRouter() - router.PathPrefix("/debug/pprof/").Handler(http.DefaultServeMux) - log.Println("Starting profiler...") - if err := http.ListenAndServe(":6060", router); err != nil { - panic(err) - } + router := mux.NewRouter() + router.PathPrefix("/debug/pprof/").Handler(http.DefaultServeMux) + log.Println("Starting profiler...") + if err := http.ListenAndServe(":6060", router); err != nil { + panic(err) + } }() } - /* docker run -p 6060:6060 -e REQUIRED_ENV=http://value -e ANOTHER_ENV=anothervalue workername @@ -34,4 +33,4 @@ go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30 THEN https://www.speedscope.app/ -*/ \ No newline at end of file +*/ diff --git a/backend/pkg/env/aws.go b/backend/pkg/env/aws.go index 6573c8551..cb7445797 100644 --- a/backend/pkg/env/aws.go +++ b/backend/pkg/env/aws.go @@ -19,7 +19,7 @@ func AWSSessionOnRegion(region string) *_session.Session { if AWS_ENDPOINT != "" { config.Endpoint = aws.String(AWS_ENDPOINT) config.DisableSSL = aws.Bool(true) - config.S3ForcePathStyle = aws.Bool(true) + config.S3ForcePathStyle = aws.Bool(true) } aws_session, err := _session.NewSession(config) if err != nil { diff --git a/backend/pkg/env/vars.go b/backend/pkg/env/vars.go index 33ae9da3c..eb88b3c6b 100644 --- a/backend/pkg/env/vars.go +++ b/backend/pkg/env/vars.go @@ -22,7 +22,7 @@ func Uint64(key string) uint64 { v := String(key) n, err := strconv.ParseUint(v, 10, 64) if err != nil { - log.Fatalln(key + " has a wrong value. ", err) + log.Fatalln(key+" has a wrong value. ", err) } return n } @@ -31,12 +31,13 @@ func Uint16(key string) uint16 { v := String(key) n, err := strconv.ParseUint(v, 10, 16) if err != nil { - log.Fatalln(key + " has a wrong value. ", err) + log.Fatalln(key+" has a wrong value. ", err) } return uint16(n) } const MAX_INT = uint64(^uint(0) >> 1) + func Int(key string) int { val := Uint64(key) if val > MAX_INT { @@ -54,4 +55,4 @@ func Bool(key string) bool { return true } return false -} \ No newline at end of file +} diff --git a/backend/pkg/env/worker-id.go b/backend/pkg/env/worker-id.go index 47fdffc43..22d077832 100644 --- a/backend/pkg/env/worker-id.go +++ b/backend/pkg/env/worker-id.go @@ -5,9 +5,9 @@ import ( ) func hashHostname(hostname string) uint16 { - var h uint16 ; + var h uint16 for i, b := range hostname { - h += uint16(i+1)*uint16(b) + h += uint16(i+1) * uint16(b) } return h } diff --git a/backend/pkg/flakeid/flakeid.go b/backend/pkg/flakeid/flakeid.go index 13e064896..c54b990a5 100644 --- a/backend/pkg/flakeid/flakeid.go +++ b/backend/pkg/flakeid/flakeid.go @@ -8,7 +8,7 @@ const ( TIMESTAMP_MAX = 1< m.Timestamp || prt.mints == 0 { - prt.mints = m.Timestamp - } - prt.lastts = m.Timestamp - prt.lastID = m.ID - prt.count += 1 + if prt.maxts < m.Timestamp { + prt.maxts = m.Timestamp + } + if prt.mints > m.Timestamp || prt.mints == 0 { + prt.mints = m.Timestamp + } + prt.lastts = m.Timestamp + prt.lastID = m.ID + prt.count += 1 - - select { - case <-qs.tick: - qs.LogThenReset() - default: - } + select { + case <-qs.tick: + qs.LogThenReset() + default: + } } - func (qs *queueStats) LogThenReset() { - s := "Queue Statistics: " - for i, p := range qs.prts { - s = fmt.Sprintf("%v | %v:: lastTS %v, lastID %v, count %v, maxTS %v, minTS %v", - s, i, p.lastts, p.lastID, p.count, p.maxts, p.mints) - } - log.Println(s) - // reset - qs.prts = make(map[int32]*partitionStats) + s := "Queue Statistics: " + for i, p := range qs.prts { + s = fmt.Sprintf("%v | %v:: lastTS %v, lastID %v, count %v, maxTS %v, minTS %v", + s, i, p.lastts, p.lastID, p.count, p.maxts, p.mints) + } + log.Println(s) + // reset + qs.prts = make(map[int32]*partitionStats) } - // TODO: list of message id to log (mb filter function with callback in messages/utils.go or something) func LogMessage(s string, sessionID uint64, msg messages.Message, m *types.Meta) { - log.Printf("%v | SessionID: %v, Queue info: %v, Message: %v", s, sessionID, m, msg) + log.Printf("%v | SessionID: %v, Queue info: %v, Message: %v", s, sessionID, m, msg) } - diff --git a/backend/pkg/messages/facade.go b/backend/pkg/messages/facade.go index 91d896d19..5c024f2f6 100644 --- a/backend/pkg/messages/facade.go +++ b/backend/pkg/messages/facade.go @@ -36,6 +36,6 @@ func Encode(msg Message) []byte { // } func GetMessageTypeID(b []byte) (uint64, error) { - reader := bytes.NewReader(b) + reader := bytes.NewReader(b) return ReadUint(reader) } diff --git a/backend/pkg/messages/filters.go b/backend/pkg/messages/filters.go index f43f40142..44b2c7959 100644 --- a/backend/pkg/messages/filters.go +++ b/backend/pkg/messages/filters.go @@ -1,9 +1,8 @@ // Auto-generated, do not edit package messages - func IsReplayerType(id uint64) bool { - return 0 == id || 2 == id || 4 == id || 5 == id || 6 == id || 7 == id || 8 == id || 9 == id || 10 == id || 11 == id || 12 == id || 13 == id || 14 == id || 15 == id || 16 == id || 18 == id || 19 == id || 20 == id || 22 == id || 37 == id || 38 == id || 39 == id || 40 == id || 41 == id || 44 == id || 45 == id || 46 == id || 47 == id || 48 == id || 49 == id || 54 == id || 55 == id || 59 == id || 69 == id || 70 == id || 90 == id || 93 == id || 96 == id || 100 == id || 102 == id || 103 == id || 105 == id + return 0 == id || 2 == id || 4 == id || 5 == id || 6 == id || 7 == id || 8 == id || 9 == id || 10 == id || 11 == id || 12 == id || 13 == id || 14 == id || 15 == id || 16 == id || 18 == id || 19 == id || 20 == id || 22 == id || 37 == id || 38 == id || 39 == id || 40 == id || 41 == id || 44 == id || 45 == id || 46 == id || 47 == id || 48 == id || 49 == id || 54 == id || 55 == id || 59 == id || 69 == id || 70 == id || 90 == id || 93 == id || 96 == id || 100 == id || 102 == id || 103 == id || 105 == id } func IsIOSType(id uint64) bool { diff --git a/backend/pkg/messages/get-timestamp.go b/backend/pkg/messages/get-timestamp.go index c8e42f756..8b44764a7 100644 --- a/backend/pkg/messages/get-timestamp.go +++ b/backend/pkg/messages/get-timestamp.go @@ -1,65 +1,63 @@ // Auto-generated, do not edit package messages - func GetTimestamp(message Message) uint64 { - switch msg := message.(type) { - - case *IOSBatchMeta: - return msg.Timestamp - - case *IOSSessionStart: - return msg.Timestamp - - case *IOSSessionEnd: - return msg.Timestamp - - case *IOSMetadata: - return msg.Timestamp - - case *IOSCustomEvent: - return msg.Timestamp - - case *IOSUserID: - return msg.Timestamp - - case *IOSUserAnonymousID: - return msg.Timestamp - - case *IOSScreenChanges: - return msg.Timestamp - - case *IOSCrash: - return msg.Timestamp - - case *IOSScreenEnter: - return msg.Timestamp - - case *IOSScreenLeave: - return msg.Timestamp - - case *IOSClickEvent: - return msg.Timestamp - - case *IOSInputEvent: - return msg.Timestamp - - case *IOSPerformanceEvent: - return msg.Timestamp - - case *IOSLog: - return msg.Timestamp - - case *IOSInternalError: - return msg.Timestamp - - case *IOSNetworkCall: - return msg.Timestamp - - case *IOSIssueEvent: - return msg.Timestamp - - } - return uint64(message.Meta().Timestamp) -} + switch msg := message.(type) { + case *IOSBatchMeta: + return msg.Timestamp + + case *IOSSessionStart: + return msg.Timestamp + + case *IOSSessionEnd: + return msg.Timestamp + + case *IOSMetadata: + return msg.Timestamp + + case *IOSCustomEvent: + return msg.Timestamp + + case *IOSUserID: + return msg.Timestamp + + case *IOSUserAnonymousID: + return msg.Timestamp + + case *IOSScreenChanges: + return msg.Timestamp + + case *IOSCrash: + return msg.Timestamp + + case *IOSScreenEnter: + return msg.Timestamp + + case *IOSScreenLeave: + return msg.Timestamp + + case *IOSClickEvent: + return msg.Timestamp + + case *IOSInputEvent: + return msg.Timestamp + + case *IOSPerformanceEvent: + return msg.Timestamp + + case *IOSLog: + return msg.Timestamp + + case *IOSInternalError: + return msg.Timestamp + + case *IOSNetworkCall: + return msg.Timestamp + + case *IOSIssueEvent: + return msg.Timestamp + + } + return uint64(message.Meta().Timestamp) +} diff --git a/backend/pkg/messages/legacy-message-transform.go b/backend/pkg/messages/legacy-message-transform.go index 637f8d443..031c4444a 100644 --- a/backend/pkg/messages/legacy-message-transform.go +++ b/backend/pkg/messages/legacy-message-transform.go @@ -1,21 +1,20 @@ package messages - func transformDepricated(msg Message) Message { switch m := msg.(type) { case *MouseClickDepricated: - meta := m.Meta() + meta := m.Meta() meta.TypeID = 33 return &MouseClick{ - meta: meta, - ID: m.ID, + meta: meta, + ID: m.ID, HesitationTime: m.HesitationTime, - Label: m.Label, + Label: m.Label, // Selector: '', } // case *FetchDepricated: // return &Fetch { - // Method: m.Method, + // Method: m.Method, // URL: m.URL, // Request: m.Request, // Response: m.Response, @@ -25,8 +24,6 @@ func transformDepricated(msg Message) Message { // // Headers: '' // } default: - return msg + return msg } } - - diff --git a/backend/pkg/messages/messages.go b/backend/pkg/messages/messages.go index 38a1f61ba..e9aec5788 100644 --- a/backend/pkg/messages/messages.go +++ b/backend/pkg/messages/messages.go @@ -2,1693 +2,1693 @@ package messages type Message interface { - Encode() []byte - Meta() *meta + Encode() []byte + Meta() *meta } type meta struct { - Timestamp int64 - Index uint64 - TypeID uint64 + Timestamp int64 + Index uint64 + TypeID uint64 } // Might also implement Encode() here (?) func (m *meta) Meta() *meta { - return m + return m } type BatchMeta struct { - *meta - PageNo uint64 - FirstIndex uint64 - Timestamp int64 + *meta + PageNo uint64 + FirstIndex uint64 + Timestamp int64 } func (msg *BatchMeta) Encode() []byte { - buf := make([]byte, 31) - buf[0] = 80 - p := 1 - p = WriteUint(msg.PageNo, buf, p) - p = WriteUint(msg.FirstIndex, buf, p) - p = WriteInt(msg.Timestamp, buf, p) - return buf[:p] + buf := make([]byte, 31) + buf[0] = 80 + p := 1 + p = WriteUint(msg.PageNo, buf, p) + p = WriteUint(msg.FirstIndex, buf, p) + p = WriteInt(msg.Timestamp, buf, p) + return buf[:p] } type Timestamp struct { - *meta - Timestamp uint64 + *meta + Timestamp uint64 } func (msg *Timestamp) Encode() []byte { - buf := make([]byte, 11) - buf[0] = 0 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - return buf[:p] + buf := make([]byte, 11) + buf[0] = 0 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + return buf[:p] } type SessionStart struct { - *meta - Timestamp uint64 - ProjectID uint64 - TrackerVersion string - RevID string - UserUUID string - UserAgent string - UserOS string - UserOSVersion string - UserBrowser string - UserBrowserVersion string - UserDevice string - UserDeviceType string - UserDeviceMemorySize uint64 - UserDeviceHeapSize uint64 - UserCountry string - UserID string + *meta + Timestamp uint64 + ProjectID uint64 + TrackerVersion string + RevID string + UserUUID string + UserAgent string + UserOS string + UserOSVersion string + UserBrowser string + UserBrowserVersion string + UserDevice string + UserDeviceType string + UserDeviceMemorySize uint64 + UserDeviceHeapSize uint64 + UserCountry string + UserID string } func (msg *SessionStart) Encode() []byte { - buf := make([]byte, 161+len(msg.TrackerVersion)+len(msg.RevID)+len(msg.UserUUID)+len(msg.UserAgent)+len(msg.UserOS)+len(msg.UserOSVersion)+len(msg.UserBrowser)+len(msg.UserBrowserVersion)+len(msg.UserDevice)+len(msg.UserDeviceType)+len(msg.UserCountry)+len(msg.UserID)) - buf[0] = 1 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.ProjectID, buf, p) - p = WriteString(msg.TrackerVersion, buf, p) - p = WriteString(msg.RevID, buf, p) - p = WriteString(msg.UserUUID, buf, p) - p = WriteString(msg.UserAgent, buf, p) - p = WriteString(msg.UserOS, buf, p) - p = WriteString(msg.UserOSVersion, buf, p) - p = WriteString(msg.UserBrowser, buf, p) - p = WriteString(msg.UserBrowserVersion, buf, p) - p = WriteString(msg.UserDevice, buf, p) - p = WriteString(msg.UserDeviceType, buf, p) - p = WriteUint(msg.UserDeviceMemorySize, buf, p) - p = WriteUint(msg.UserDeviceHeapSize, buf, p) - p = WriteString(msg.UserCountry, buf, p) - p = WriteString(msg.UserID, buf, p) - return buf[:p] + buf := make([]byte, 161+len(msg.TrackerVersion)+len(msg.RevID)+len(msg.UserUUID)+len(msg.UserAgent)+len(msg.UserOS)+len(msg.UserOSVersion)+len(msg.UserBrowser)+len(msg.UserBrowserVersion)+len(msg.UserDevice)+len(msg.UserDeviceType)+len(msg.UserCountry)+len(msg.UserID)) + buf[0] = 1 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.ProjectID, buf, p) + p = WriteString(msg.TrackerVersion, buf, p) + p = WriteString(msg.RevID, buf, p) + p = WriteString(msg.UserUUID, buf, p) + p = WriteString(msg.UserAgent, buf, p) + p = WriteString(msg.UserOS, buf, p) + p = WriteString(msg.UserOSVersion, buf, p) + p = WriteString(msg.UserBrowser, buf, p) + p = WriteString(msg.UserBrowserVersion, buf, p) + p = WriteString(msg.UserDevice, buf, p) + p = WriteString(msg.UserDeviceType, buf, p) + p = WriteUint(msg.UserDeviceMemorySize, buf, p) + p = WriteUint(msg.UserDeviceHeapSize, buf, p) + p = WriteString(msg.UserCountry, buf, p) + p = WriteString(msg.UserID, buf, p) + return buf[:p] } type SessionDisconnect struct { - *meta - Timestamp uint64 + *meta + Timestamp uint64 } func (msg *SessionDisconnect) Encode() []byte { - buf := make([]byte, 11) - buf[0] = 2 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - return buf[:p] + buf := make([]byte, 11) + buf[0] = 2 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + return buf[:p] } type SessionEnd struct { - *meta - Timestamp uint64 + *meta + Timestamp uint64 } func (msg *SessionEnd) Encode() []byte { - buf := make([]byte, 11) - buf[0] = 3 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - return buf[:p] + buf := make([]byte, 11) + buf[0] = 3 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + return buf[:p] } type SetPageLocation struct { - *meta - URL string - Referrer string - NavigationStart uint64 + *meta + URL string + Referrer string + NavigationStart uint64 } func (msg *SetPageLocation) Encode() []byte { - buf := make([]byte, 31+len(msg.URL)+len(msg.Referrer)) - buf[0] = 4 - p := 1 - p = WriteString(msg.URL, buf, p) - p = WriteString(msg.Referrer, buf, p) - p = WriteUint(msg.NavigationStart, buf, p) - return buf[:p] + buf := make([]byte, 31+len(msg.URL)+len(msg.Referrer)) + buf[0] = 4 + p := 1 + p = WriteString(msg.URL, buf, p) + p = WriteString(msg.Referrer, buf, p) + p = WriteUint(msg.NavigationStart, buf, p) + return buf[:p] } type SetViewportSize struct { - *meta - Width uint64 - Height uint64 + *meta + Width uint64 + Height uint64 } func (msg *SetViewportSize) Encode() []byte { - buf := make([]byte, 21) - buf[0] = 5 - p := 1 - p = WriteUint(msg.Width, buf, p) - p = WriteUint(msg.Height, buf, p) - return buf[:p] + buf := make([]byte, 21) + buf[0] = 5 + p := 1 + p = WriteUint(msg.Width, buf, p) + p = WriteUint(msg.Height, buf, p) + return buf[:p] } type SetViewportScroll struct { - *meta - X int64 - Y int64 + *meta + X int64 + Y int64 } func (msg *SetViewportScroll) Encode() []byte { - buf := make([]byte, 21) - buf[0] = 6 - p := 1 - p = WriteInt(msg.X, buf, p) - p = WriteInt(msg.Y, buf, p) - return buf[:p] + buf := make([]byte, 21) + buf[0] = 6 + p := 1 + p = WriteInt(msg.X, buf, p) + p = WriteInt(msg.Y, buf, p) + return buf[:p] } type CreateDocument struct { - *meta + *meta } func (msg *CreateDocument) Encode() []byte { - buf := make([]byte, 1) - buf[0] = 7 - p := 1 + buf := make([]byte, 1) + buf[0] = 7 + p := 1 - return buf[:p] + return buf[:p] } type CreateElementNode struct { - *meta - ID uint64 - ParentID uint64 - index uint64 - Tag string - SVG bool + *meta + ID uint64 + ParentID uint64 + index uint64 + Tag string + SVG bool } func (msg *CreateElementNode) Encode() []byte { - buf := make([]byte, 51+len(msg.Tag)) - buf[0] = 8 - p := 1 - p = WriteUint(msg.ID, buf, p) - p = WriteUint(msg.ParentID, buf, p) - p = WriteUint(msg.index, buf, p) - p = WriteString(msg.Tag, buf, p) - p = WriteBoolean(msg.SVG, buf, p) - return buf[:p] + buf := make([]byte, 51+len(msg.Tag)) + buf[0] = 8 + p := 1 + p = WriteUint(msg.ID, buf, p) + p = WriteUint(msg.ParentID, buf, p) + p = WriteUint(msg.index, buf, p) + p = WriteString(msg.Tag, buf, p) + p = WriteBoolean(msg.SVG, buf, p) + return buf[:p] } type CreateTextNode struct { - *meta - ID uint64 - ParentID uint64 - Index uint64 + *meta + ID uint64 + ParentID uint64 + Index uint64 } func (msg *CreateTextNode) Encode() []byte { - buf := make([]byte, 31) - buf[0] = 9 - p := 1 - p = WriteUint(msg.ID, buf, p) - p = WriteUint(msg.ParentID, buf, p) - p = WriteUint(msg.Index, buf, p) - return buf[:p] + buf := make([]byte, 31) + buf[0] = 9 + p := 1 + p = WriteUint(msg.ID, buf, p) + p = WriteUint(msg.ParentID, buf, p) + p = WriteUint(msg.Index, buf, p) + return buf[:p] } type MoveNode struct { - *meta - ID uint64 - ParentID uint64 - Index uint64 + *meta + ID uint64 + ParentID uint64 + Index uint64 } func (msg *MoveNode) Encode() []byte { - buf := make([]byte, 31) - buf[0] = 10 - p := 1 - p = WriteUint(msg.ID, buf, p) - p = WriteUint(msg.ParentID, buf, p) - p = WriteUint(msg.Index, buf, p) - return buf[:p] + buf := make([]byte, 31) + buf[0] = 10 + p := 1 + p = WriteUint(msg.ID, buf, p) + p = WriteUint(msg.ParentID, buf, p) + p = WriteUint(msg.Index, buf, p) + return buf[:p] } type RemoveNode struct { - *meta - ID uint64 + *meta + ID uint64 } func (msg *RemoveNode) Encode() []byte { - buf := make([]byte, 11) - buf[0] = 11 - p := 1 - p = WriteUint(msg.ID, buf, p) - return buf[:p] + buf := make([]byte, 11) + buf[0] = 11 + p := 1 + p = WriteUint(msg.ID, buf, p) + return buf[:p] } type SetNodeAttribute struct { - *meta - ID uint64 - Name string - Value string + *meta + ID uint64 + Name string + Value string } func (msg *SetNodeAttribute) Encode() []byte { - buf := make([]byte, 31+len(msg.Name)+len(msg.Value)) - buf[0] = 12 - p := 1 - p = WriteUint(msg.ID, buf, p) - p = WriteString(msg.Name, buf, p) - p = WriteString(msg.Value, buf, p) - return buf[:p] + buf := make([]byte, 31+len(msg.Name)+len(msg.Value)) + buf[0] = 12 + p := 1 + p = WriteUint(msg.ID, buf, p) + p = WriteString(msg.Name, buf, p) + p = WriteString(msg.Value, buf, p) + return buf[:p] } type RemoveNodeAttribute struct { - *meta - ID uint64 - Name string + *meta + ID uint64 + Name string } func (msg *RemoveNodeAttribute) Encode() []byte { - buf := make([]byte, 21+len(msg.Name)) - buf[0] = 13 - p := 1 - p = WriteUint(msg.ID, buf, p) - p = WriteString(msg.Name, buf, p) - return buf[:p] + buf := make([]byte, 21+len(msg.Name)) + buf[0] = 13 + p := 1 + p = WriteUint(msg.ID, buf, p) + p = WriteString(msg.Name, buf, p) + return buf[:p] } type SetNodeData struct { - *meta - ID uint64 - Data string + *meta + ID uint64 + Data string } func (msg *SetNodeData) Encode() []byte { - buf := make([]byte, 21+len(msg.Data)) - buf[0] = 14 - p := 1 - p = WriteUint(msg.ID, buf, p) - p = WriteString(msg.Data, buf, p) - return buf[:p] + buf := make([]byte, 21+len(msg.Data)) + buf[0] = 14 + p := 1 + p = WriteUint(msg.ID, buf, p) + p = WriteString(msg.Data, buf, p) + return buf[:p] } type SetCSSData struct { - *meta - ID uint64 - Data string + *meta + ID uint64 + Data string } func (msg *SetCSSData) Encode() []byte { - buf := make([]byte, 21+len(msg.Data)) - buf[0] = 15 - p := 1 - p = WriteUint(msg.ID, buf, p) - p = WriteString(msg.Data, buf, p) - return buf[:p] + buf := make([]byte, 21+len(msg.Data)) + buf[0] = 15 + p := 1 + p = WriteUint(msg.ID, buf, p) + p = WriteString(msg.Data, buf, p) + return buf[:p] } type SetNodeScroll struct { - *meta - ID uint64 - X int64 - Y int64 + *meta + ID uint64 + X int64 + Y int64 } func (msg *SetNodeScroll) Encode() []byte { - buf := make([]byte, 31) - buf[0] = 16 - p := 1 - p = WriteUint(msg.ID, buf, p) - p = WriteInt(msg.X, buf, p) - p = WriteInt(msg.Y, buf, p) - return buf[:p] + buf := make([]byte, 31) + buf[0] = 16 + p := 1 + p = WriteUint(msg.ID, buf, p) + p = WriteInt(msg.X, buf, p) + p = WriteInt(msg.Y, buf, p) + return buf[:p] } type SetInputTarget struct { - *meta - ID uint64 - Label string + *meta + ID uint64 + Label string } func (msg *SetInputTarget) Encode() []byte { - buf := make([]byte, 21+len(msg.Label)) - buf[0] = 17 - p := 1 - p = WriteUint(msg.ID, buf, p) - p = WriteString(msg.Label, buf, p) - return buf[:p] + buf := make([]byte, 21+len(msg.Label)) + buf[0] = 17 + p := 1 + p = WriteUint(msg.ID, buf, p) + p = WriteString(msg.Label, buf, p) + return buf[:p] } type SetInputValue struct { - *meta - ID uint64 - Value string - Mask int64 + *meta + ID uint64 + Value string + Mask int64 } func (msg *SetInputValue) Encode() []byte { - buf := make([]byte, 31+len(msg.Value)) - buf[0] = 18 - p := 1 - p = WriteUint(msg.ID, buf, p) - p = WriteString(msg.Value, buf, p) - p = WriteInt(msg.Mask, buf, p) - return buf[:p] + buf := make([]byte, 31+len(msg.Value)) + buf[0] = 18 + p := 1 + p = WriteUint(msg.ID, buf, p) + p = WriteString(msg.Value, buf, p) + p = WriteInt(msg.Mask, buf, p) + return buf[:p] } type SetInputChecked struct { - *meta - ID uint64 - Checked bool + *meta + ID uint64 + Checked bool } func (msg *SetInputChecked) Encode() []byte { - buf := make([]byte, 21) - buf[0] = 19 - p := 1 - p = WriteUint(msg.ID, buf, p) - p = WriteBoolean(msg.Checked, buf, p) - return buf[:p] + buf := make([]byte, 21) + buf[0] = 19 + p := 1 + p = WriteUint(msg.ID, buf, p) + p = WriteBoolean(msg.Checked, buf, p) + return buf[:p] } type MouseMove struct { - *meta - X uint64 - Y uint64 + *meta + X uint64 + Y uint64 } func (msg *MouseMove) Encode() []byte { - buf := make([]byte, 21) - buf[0] = 20 - p := 1 - p = WriteUint(msg.X, buf, p) - p = WriteUint(msg.Y, buf, p) - return buf[:p] + buf := make([]byte, 21) + buf[0] = 20 + p := 1 + p = WriteUint(msg.X, buf, p) + p = WriteUint(msg.Y, buf, p) + return buf[:p] } type MouseClickDepricated struct { - *meta - ID uint64 - HesitationTime uint64 - Label string + *meta + ID uint64 + HesitationTime uint64 + Label string } func (msg *MouseClickDepricated) Encode() []byte { - buf := make([]byte, 31+len(msg.Label)) - buf[0] = 21 - p := 1 - p = WriteUint(msg.ID, buf, p) - p = WriteUint(msg.HesitationTime, buf, p) - p = WriteString(msg.Label, buf, p) - return buf[:p] + buf := make([]byte, 31+len(msg.Label)) + buf[0] = 21 + p := 1 + p = WriteUint(msg.ID, buf, p) + p = WriteUint(msg.HesitationTime, buf, p) + p = WriteString(msg.Label, buf, p) + return buf[:p] } type ConsoleLog struct { - *meta - Level string - Value string + *meta + Level string + Value string } func (msg *ConsoleLog) Encode() []byte { - buf := make([]byte, 21+len(msg.Level)+len(msg.Value)) - buf[0] = 22 - p := 1 - p = WriteString(msg.Level, buf, p) - p = WriteString(msg.Value, buf, p) - return buf[:p] + buf := make([]byte, 21+len(msg.Level)+len(msg.Value)) + buf[0] = 22 + p := 1 + p = WriteString(msg.Level, buf, p) + p = WriteString(msg.Value, buf, p) + return buf[:p] } type PageLoadTiming struct { - *meta - RequestStart uint64 - ResponseStart uint64 - ResponseEnd uint64 - DomContentLoadedEventStart uint64 - DomContentLoadedEventEnd uint64 - LoadEventStart uint64 - LoadEventEnd uint64 - FirstPaint uint64 - FirstContentfulPaint uint64 + *meta + RequestStart uint64 + ResponseStart uint64 + ResponseEnd uint64 + DomContentLoadedEventStart uint64 + DomContentLoadedEventEnd uint64 + LoadEventStart uint64 + LoadEventEnd uint64 + FirstPaint uint64 + FirstContentfulPaint uint64 } func (msg *PageLoadTiming) Encode() []byte { - buf := make([]byte, 91) - buf[0] = 23 - p := 1 - p = WriteUint(msg.RequestStart, buf, p) - p = WriteUint(msg.ResponseStart, buf, p) - p = WriteUint(msg.ResponseEnd, buf, p) - p = WriteUint(msg.DomContentLoadedEventStart, buf, p) - p = WriteUint(msg.DomContentLoadedEventEnd, buf, p) - p = WriteUint(msg.LoadEventStart, buf, p) - p = WriteUint(msg.LoadEventEnd, buf, p) - p = WriteUint(msg.FirstPaint, buf, p) - p = WriteUint(msg.FirstContentfulPaint, buf, p) - return buf[:p] + buf := make([]byte, 91) + buf[0] = 23 + p := 1 + p = WriteUint(msg.RequestStart, buf, p) + p = WriteUint(msg.ResponseStart, buf, p) + p = WriteUint(msg.ResponseEnd, buf, p) + p = WriteUint(msg.DomContentLoadedEventStart, buf, p) + p = WriteUint(msg.DomContentLoadedEventEnd, buf, p) + p = WriteUint(msg.LoadEventStart, buf, p) + p = WriteUint(msg.LoadEventEnd, buf, p) + p = WriteUint(msg.FirstPaint, buf, p) + p = WriteUint(msg.FirstContentfulPaint, buf, p) + return buf[:p] } type PageRenderTiming struct { - *meta - SpeedIndex uint64 - VisuallyComplete uint64 - TimeToInteractive uint64 + *meta + SpeedIndex uint64 + VisuallyComplete uint64 + TimeToInteractive uint64 } func (msg *PageRenderTiming) Encode() []byte { - buf := make([]byte, 31) - buf[0] = 24 - p := 1 - p = WriteUint(msg.SpeedIndex, buf, p) - p = WriteUint(msg.VisuallyComplete, buf, p) - p = WriteUint(msg.TimeToInteractive, buf, p) - return buf[:p] + buf := make([]byte, 31) + buf[0] = 24 + p := 1 + p = WriteUint(msg.SpeedIndex, buf, p) + p = WriteUint(msg.VisuallyComplete, buf, p) + p = WriteUint(msg.TimeToInteractive, buf, p) + return buf[:p] } type JSException struct { - *meta - Name string - Message string - Payload string + *meta + Name string + Message string + Payload string } func (msg *JSException) Encode() []byte { - buf := make([]byte, 31+len(msg.Name)+len(msg.Message)+len(msg.Payload)) - buf[0] = 25 - p := 1 - p = WriteString(msg.Name, buf, p) - p = WriteString(msg.Message, buf, p) - p = WriteString(msg.Payload, buf, p) - return buf[:p] + buf := make([]byte, 31+len(msg.Name)+len(msg.Message)+len(msg.Payload)) + buf[0] = 25 + p := 1 + p = WriteString(msg.Name, buf, p) + p = WriteString(msg.Message, buf, p) + p = WriteString(msg.Payload, buf, p) + return buf[:p] } type RawErrorEvent struct { - *meta - Timestamp uint64 - Source string - Name string - Message string - Payload string + *meta + Timestamp uint64 + Source string + Name string + Message string + Payload string } func (msg *RawErrorEvent) Encode() []byte { - buf := make([]byte, 51+len(msg.Source)+len(msg.Name)+len(msg.Message)+len(msg.Payload)) - buf[0] = 26 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - p = WriteString(msg.Source, buf, p) - p = WriteString(msg.Name, buf, p) - p = WriteString(msg.Message, buf, p) - p = WriteString(msg.Payload, buf, p) - return buf[:p] + buf := make([]byte, 51+len(msg.Source)+len(msg.Name)+len(msg.Message)+len(msg.Payload)) + buf[0] = 26 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + p = WriteString(msg.Source, buf, p) + p = WriteString(msg.Name, buf, p) + p = WriteString(msg.Message, buf, p) + p = WriteString(msg.Payload, buf, p) + return buf[:p] } type RawCustomEvent struct { - *meta - Name string - Payload string + *meta + Name string + Payload string } func (msg *RawCustomEvent) Encode() []byte { - buf := make([]byte, 21+len(msg.Name)+len(msg.Payload)) - buf[0] = 27 - p := 1 - p = WriteString(msg.Name, buf, p) - p = WriteString(msg.Payload, buf, p) - return buf[:p] + buf := make([]byte, 21+len(msg.Name)+len(msg.Payload)) + buf[0] = 27 + p := 1 + p = WriteString(msg.Name, buf, p) + p = WriteString(msg.Payload, buf, p) + return buf[:p] } type UserID struct { - *meta - ID string + *meta + ID string } func (msg *UserID) Encode() []byte { - buf := make([]byte, 11+len(msg.ID)) - buf[0] = 28 - p := 1 - p = WriteString(msg.ID, buf, p) - return buf[:p] + buf := make([]byte, 11+len(msg.ID)) + buf[0] = 28 + p := 1 + p = WriteString(msg.ID, buf, p) + return buf[:p] } type UserAnonymousID struct { - *meta - ID string + *meta + ID string } func (msg *UserAnonymousID) Encode() []byte { - buf := make([]byte, 11+len(msg.ID)) - buf[0] = 29 - p := 1 - p = WriteString(msg.ID, buf, p) - return buf[:p] + buf := make([]byte, 11+len(msg.ID)) + buf[0] = 29 + p := 1 + p = WriteString(msg.ID, buf, p) + return buf[:p] } type Metadata struct { - *meta - Key string - Value string + *meta + Key string + Value string } func (msg *Metadata) Encode() []byte { - buf := make([]byte, 21+len(msg.Key)+len(msg.Value)) - buf[0] = 30 - p := 1 - p = WriteString(msg.Key, buf, p) - p = WriteString(msg.Value, buf, p) - return buf[:p] + buf := make([]byte, 21+len(msg.Key)+len(msg.Value)) + buf[0] = 30 + p := 1 + p = WriteString(msg.Key, buf, p) + p = WriteString(msg.Value, buf, p) + return buf[:p] } type PageEvent struct { - *meta - MessageID uint64 - Timestamp uint64 - URL string - Referrer string - Loaded bool - RequestStart uint64 - ResponseStart uint64 - ResponseEnd uint64 - DomContentLoadedEventStart uint64 - DomContentLoadedEventEnd uint64 - LoadEventStart uint64 - LoadEventEnd uint64 - FirstPaint uint64 - FirstContentfulPaint uint64 - SpeedIndex uint64 - VisuallyComplete uint64 - TimeToInteractive uint64 + *meta + MessageID uint64 + Timestamp uint64 + URL string + Referrer string + Loaded bool + RequestStart uint64 + ResponseStart uint64 + ResponseEnd uint64 + DomContentLoadedEventStart uint64 + DomContentLoadedEventEnd uint64 + LoadEventStart uint64 + LoadEventEnd uint64 + FirstPaint uint64 + FirstContentfulPaint uint64 + SpeedIndex uint64 + VisuallyComplete uint64 + TimeToInteractive uint64 } func (msg *PageEvent) Encode() []byte { - buf := make([]byte, 171+len(msg.URL)+len(msg.Referrer)) - buf[0] = 31 - p := 1 - p = WriteUint(msg.MessageID, buf, p) - p = WriteUint(msg.Timestamp, buf, p) - p = WriteString(msg.URL, buf, p) - p = WriteString(msg.Referrer, buf, p) - p = WriteBoolean(msg.Loaded, buf, p) - p = WriteUint(msg.RequestStart, buf, p) - p = WriteUint(msg.ResponseStart, buf, p) - p = WriteUint(msg.ResponseEnd, buf, p) - p = WriteUint(msg.DomContentLoadedEventStart, buf, p) - p = WriteUint(msg.DomContentLoadedEventEnd, buf, p) - p = WriteUint(msg.LoadEventStart, buf, p) - p = WriteUint(msg.LoadEventEnd, buf, p) - p = WriteUint(msg.FirstPaint, buf, p) - p = WriteUint(msg.FirstContentfulPaint, buf, p) - p = WriteUint(msg.SpeedIndex, buf, p) - p = WriteUint(msg.VisuallyComplete, buf, p) - p = WriteUint(msg.TimeToInteractive, buf, p) - return buf[:p] + buf := make([]byte, 171+len(msg.URL)+len(msg.Referrer)) + buf[0] = 31 + p := 1 + p = WriteUint(msg.MessageID, buf, p) + p = WriteUint(msg.Timestamp, buf, p) + p = WriteString(msg.URL, buf, p) + p = WriteString(msg.Referrer, buf, p) + p = WriteBoolean(msg.Loaded, buf, p) + p = WriteUint(msg.RequestStart, buf, p) + p = WriteUint(msg.ResponseStart, buf, p) + p = WriteUint(msg.ResponseEnd, buf, p) + p = WriteUint(msg.DomContentLoadedEventStart, buf, p) + p = WriteUint(msg.DomContentLoadedEventEnd, buf, p) + p = WriteUint(msg.LoadEventStart, buf, p) + p = WriteUint(msg.LoadEventEnd, buf, p) + p = WriteUint(msg.FirstPaint, buf, p) + p = WriteUint(msg.FirstContentfulPaint, buf, p) + p = WriteUint(msg.SpeedIndex, buf, p) + p = WriteUint(msg.VisuallyComplete, buf, p) + p = WriteUint(msg.TimeToInteractive, buf, p) + return buf[:p] } type InputEvent struct { - *meta - MessageID uint64 - Timestamp uint64 - Value string - ValueMasked bool - Label string + *meta + MessageID uint64 + Timestamp uint64 + Value string + ValueMasked bool + Label string } func (msg *InputEvent) Encode() []byte { - buf := make([]byte, 51+len(msg.Value)+len(msg.Label)) - buf[0] = 32 - p := 1 - p = WriteUint(msg.MessageID, buf, p) - p = WriteUint(msg.Timestamp, buf, p) - p = WriteString(msg.Value, buf, p) - p = WriteBoolean(msg.ValueMasked, buf, p) - p = WriteString(msg.Label, buf, p) - return buf[:p] + buf := make([]byte, 51+len(msg.Value)+len(msg.Label)) + buf[0] = 32 + p := 1 + p = WriteUint(msg.MessageID, buf, p) + p = WriteUint(msg.Timestamp, buf, p) + p = WriteString(msg.Value, buf, p) + p = WriteBoolean(msg.ValueMasked, buf, p) + p = WriteString(msg.Label, buf, p) + return buf[:p] } type ClickEvent struct { - *meta - MessageID uint64 - Timestamp uint64 - HesitationTime uint64 - Label string - Selector string + *meta + MessageID uint64 + Timestamp uint64 + HesitationTime uint64 + Label string + Selector string } func (msg *ClickEvent) Encode() []byte { - buf := make([]byte, 51+len(msg.Label)+len(msg.Selector)) - buf[0] = 33 - p := 1 - p = WriteUint(msg.MessageID, buf, p) - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.HesitationTime, buf, p) - p = WriteString(msg.Label, buf, p) - p = WriteString(msg.Selector, buf, p) - return buf[:p] + buf := make([]byte, 51+len(msg.Label)+len(msg.Selector)) + buf[0] = 33 + p := 1 + p = WriteUint(msg.MessageID, buf, p) + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.HesitationTime, buf, p) + p = WriteString(msg.Label, buf, p) + p = WriteString(msg.Selector, buf, p) + return buf[:p] } type ErrorEvent struct { - *meta - MessageID uint64 - Timestamp uint64 - Source string - Name string - Message string - Payload string + *meta + MessageID uint64 + Timestamp uint64 + Source string + Name string + Message string + Payload string } func (msg *ErrorEvent) Encode() []byte { - buf := make([]byte, 61+len(msg.Source)+len(msg.Name)+len(msg.Message)+len(msg.Payload)) - buf[0] = 34 - p := 1 - p = WriteUint(msg.MessageID, buf, p) - p = WriteUint(msg.Timestamp, buf, p) - p = WriteString(msg.Source, buf, p) - p = WriteString(msg.Name, buf, p) - p = WriteString(msg.Message, buf, p) - p = WriteString(msg.Payload, buf, p) - return buf[:p] + buf := make([]byte, 61+len(msg.Source)+len(msg.Name)+len(msg.Message)+len(msg.Payload)) + buf[0] = 34 + p := 1 + p = WriteUint(msg.MessageID, buf, p) + p = WriteUint(msg.Timestamp, buf, p) + p = WriteString(msg.Source, buf, p) + p = WriteString(msg.Name, buf, p) + p = WriteString(msg.Message, buf, p) + p = WriteString(msg.Payload, buf, p) + return buf[:p] } type ResourceEvent struct { - *meta - MessageID uint64 - Timestamp uint64 - Duration uint64 - TTFB uint64 - HeaderSize uint64 - EncodedBodySize uint64 - DecodedBodySize uint64 - URL string - Type string - Success bool - Method string - Status uint64 + *meta + MessageID uint64 + Timestamp uint64 + Duration uint64 + TTFB uint64 + HeaderSize uint64 + EncodedBodySize uint64 + DecodedBodySize uint64 + URL string + Type string + Success bool + Method string + Status uint64 } func (msg *ResourceEvent) Encode() []byte { - buf := make([]byte, 121+len(msg.URL)+len(msg.Type)+len(msg.Method)) - buf[0] = 35 - p := 1 - p = WriteUint(msg.MessageID, buf, p) - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.Duration, buf, p) - p = WriteUint(msg.TTFB, buf, p) - p = WriteUint(msg.HeaderSize, buf, p) - p = WriteUint(msg.EncodedBodySize, buf, p) - p = WriteUint(msg.DecodedBodySize, buf, p) - p = WriteString(msg.URL, buf, p) - p = WriteString(msg.Type, buf, p) - p = WriteBoolean(msg.Success, buf, p) - p = WriteString(msg.Method, buf, p) - p = WriteUint(msg.Status, buf, p) - return buf[:p] + buf := make([]byte, 121+len(msg.URL)+len(msg.Type)+len(msg.Method)) + buf[0] = 35 + p := 1 + p = WriteUint(msg.MessageID, buf, p) + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.Duration, buf, p) + p = WriteUint(msg.TTFB, buf, p) + p = WriteUint(msg.HeaderSize, buf, p) + p = WriteUint(msg.EncodedBodySize, buf, p) + p = WriteUint(msg.DecodedBodySize, buf, p) + p = WriteString(msg.URL, buf, p) + p = WriteString(msg.Type, buf, p) + p = WriteBoolean(msg.Success, buf, p) + p = WriteString(msg.Method, buf, p) + p = WriteUint(msg.Status, buf, p) + return buf[:p] } type CustomEvent struct { - *meta - MessageID uint64 - Timestamp uint64 - Name string - Payload string + *meta + MessageID uint64 + Timestamp uint64 + Name string + Payload string } func (msg *CustomEvent) Encode() []byte { - buf := make([]byte, 41+len(msg.Name)+len(msg.Payload)) - buf[0] = 36 - p := 1 - p = WriteUint(msg.MessageID, buf, p) - p = WriteUint(msg.Timestamp, buf, p) - p = WriteString(msg.Name, buf, p) - p = WriteString(msg.Payload, buf, p) - return buf[:p] + buf := make([]byte, 41+len(msg.Name)+len(msg.Payload)) + buf[0] = 36 + p := 1 + p = WriteUint(msg.MessageID, buf, p) + p = WriteUint(msg.Timestamp, buf, p) + p = WriteString(msg.Name, buf, p) + p = WriteString(msg.Payload, buf, p) + return buf[:p] } type CSSInsertRule struct { - *meta - ID uint64 - Rule string - Index uint64 + *meta + ID uint64 + Rule string + Index uint64 } func (msg *CSSInsertRule) Encode() []byte { - buf := make([]byte, 31+len(msg.Rule)) - buf[0] = 37 - p := 1 - p = WriteUint(msg.ID, buf, p) - p = WriteString(msg.Rule, buf, p) - p = WriteUint(msg.Index, buf, p) - return buf[:p] + buf := make([]byte, 31+len(msg.Rule)) + buf[0] = 37 + p := 1 + p = WriteUint(msg.ID, buf, p) + p = WriteString(msg.Rule, buf, p) + p = WriteUint(msg.Index, buf, p) + return buf[:p] } type CSSDeleteRule struct { - *meta - ID uint64 - Index uint64 + *meta + ID uint64 + Index uint64 } func (msg *CSSDeleteRule) Encode() []byte { - buf := make([]byte, 21) - buf[0] = 38 - p := 1 - p = WriteUint(msg.ID, buf, p) - p = WriteUint(msg.Index, buf, p) - return buf[:p] + buf := make([]byte, 21) + buf[0] = 38 + p := 1 + p = WriteUint(msg.ID, buf, p) + p = WriteUint(msg.Index, buf, p) + return buf[:p] } type Fetch struct { - *meta - Method string - URL string - Request string - Response string - Status uint64 - Timestamp uint64 - Duration uint64 + *meta + Method string + URL string + Request string + Response string + Status uint64 + Timestamp uint64 + Duration uint64 } func (msg *Fetch) Encode() []byte { - buf := make([]byte, 71+len(msg.Method)+len(msg.URL)+len(msg.Request)+len(msg.Response)) - buf[0] = 39 - p := 1 - p = WriteString(msg.Method, buf, p) - p = WriteString(msg.URL, buf, p) - p = WriteString(msg.Request, buf, p) - p = WriteString(msg.Response, buf, p) - p = WriteUint(msg.Status, buf, p) - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.Duration, buf, p) - return buf[:p] + buf := make([]byte, 71+len(msg.Method)+len(msg.URL)+len(msg.Request)+len(msg.Response)) + buf[0] = 39 + p := 1 + p = WriteString(msg.Method, buf, p) + p = WriteString(msg.URL, buf, p) + p = WriteString(msg.Request, buf, p) + p = WriteString(msg.Response, buf, p) + p = WriteUint(msg.Status, buf, p) + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.Duration, buf, p) + return buf[:p] } type Profiler struct { - *meta - Name string - Duration uint64 - Args string - Result string + *meta + Name string + Duration uint64 + Args string + Result string } func (msg *Profiler) Encode() []byte { - buf := make([]byte, 41+len(msg.Name)+len(msg.Args)+len(msg.Result)) - buf[0] = 40 - p := 1 - p = WriteString(msg.Name, buf, p) - p = WriteUint(msg.Duration, buf, p) - p = WriteString(msg.Args, buf, p) - p = WriteString(msg.Result, buf, p) - return buf[:p] + buf := make([]byte, 41+len(msg.Name)+len(msg.Args)+len(msg.Result)) + buf[0] = 40 + p := 1 + p = WriteString(msg.Name, buf, p) + p = WriteUint(msg.Duration, buf, p) + p = WriteString(msg.Args, buf, p) + p = WriteString(msg.Result, buf, p) + return buf[:p] } type OTable struct { - *meta - Key string - Value string + *meta + Key string + Value string } func (msg *OTable) Encode() []byte { - buf := make([]byte, 21+len(msg.Key)+len(msg.Value)) - buf[0] = 41 - p := 1 - p = WriteString(msg.Key, buf, p) - p = WriteString(msg.Value, buf, p) - return buf[:p] + buf := make([]byte, 21+len(msg.Key)+len(msg.Value)) + buf[0] = 41 + p := 1 + p = WriteString(msg.Key, buf, p) + p = WriteString(msg.Value, buf, p) + return buf[:p] } type StateAction struct { - *meta - Type string + *meta + Type string } func (msg *StateAction) Encode() []byte { - buf := make([]byte, 11+len(msg.Type)) - buf[0] = 42 - p := 1 - p = WriteString(msg.Type, buf, p) - return buf[:p] + buf := make([]byte, 11+len(msg.Type)) + buf[0] = 42 + p := 1 + p = WriteString(msg.Type, buf, p) + return buf[:p] } type StateActionEvent struct { - *meta - MessageID uint64 - Timestamp uint64 - Type string + *meta + MessageID uint64 + Timestamp uint64 + Type string } func (msg *StateActionEvent) Encode() []byte { - buf := make([]byte, 31+len(msg.Type)) - buf[0] = 43 - p := 1 - p = WriteUint(msg.MessageID, buf, p) - p = WriteUint(msg.Timestamp, buf, p) - p = WriteString(msg.Type, buf, p) - return buf[:p] + buf := make([]byte, 31+len(msg.Type)) + buf[0] = 43 + p := 1 + p = WriteUint(msg.MessageID, buf, p) + p = WriteUint(msg.Timestamp, buf, p) + p = WriteString(msg.Type, buf, p) + return buf[:p] } type Redux struct { - *meta - Action string - State string - Duration uint64 + *meta + Action string + State string + Duration uint64 } func (msg *Redux) Encode() []byte { - buf := make([]byte, 31+len(msg.Action)+len(msg.State)) - buf[0] = 44 - p := 1 - p = WriteString(msg.Action, buf, p) - p = WriteString(msg.State, buf, p) - p = WriteUint(msg.Duration, buf, p) - return buf[:p] + buf := make([]byte, 31+len(msg.Action)+len(msg.State)) + buf[0] = 44 + p := 1 + p = WriteString(msg.Action, buf, p) + p = WriteString(msg.State, buf, p) + p = WriteUint(msg.Duration, buf, p) + return buf[:p] } type Vuex struct { - *meta - Mutation string - State string + *meta + Mutation string + State string } func (msg *Vuex) Encode() []byte { - buf := make([]byte, 21+len(msg.Mutation)+len(msg.State)) - buf[0] = 45 - p := 1 - p = WriteString(msg.Mutation, buf, p) - p = WriteString(msg.State, buf, p) - return buf[:p] + buf := make([]byte, 21+len(msg.Mutation)+len(msg.State)) + buf[0] = 45 + p := 1 + p = WriteString(msg.Mutation, buf, p) + p = WriteString(msg.State, buf, p) + return buf[:p] } type MobX struct { - *meta - Type string - Payload string + *meta + Type string + Payload string } func (msg *MobX) Encode() []byte { - buf := make([]byte, 21+len(msg.Type)+len(msg.Payload)) - buf[0] = 46 - p := 1 - p = WriteString(msg.Type, buf, p) - p = WriteString(msg.Payload, buf, p) - return buf[:p] + buf := make([]byte, 21+len(msg.Type)+len(msg.Payload)) + buf[0] = 46 + p := 1 + p = WriteString(msg.Type, buf, p) + p = WriteString(msg.Payload, buf, p) + return buf[:p] } type NgRx struct { - *meta - Action string - State string - Duration uint64 + *meta + Action string + State string + Duration uint64 } func (msg *NgRx) Encode() []byte { - buf := make([]byte, 31+len(msg.Action)+len(msg.State)) - buf[0] = 47 - p := 1 - p = WriteString(msg.Action, buf, p) - p = WriteString(msg.State, buf, p) - p = WriteUint(msg.Duration, buf, p) - return buf[:p] + buf := make([]byte, 31+len(msg.Action)+len(msg.State)) + buf[0] = 47 + p := 1 + p = WriteString(msg.Action, buf, p) + p = WriteString(msg.State, buf, p) + p = WriteUint(msg.Duration, buf, p) + return buf[:p] } type GraphQL struct { - *meta - OperationKind string - OperationName string - Variables string - Response string + *meta + OperationKind string + OperationName string + Variables string + Response string } func (msg *GraphQL) Encode() []byte { - buf := make([]byte, 41+len(msg.OperationKind)+len(msg.OperationName)+len(msg.Variables)+len(msg.Response)) - buf[0] = 48 - p := 1 - p = WriteString(msg.OperationKind, buf, p) - p = WriteString(msg.OperationName, buf, p) - p = WriteString(msg.Variables, buf, p) - p = WriteString(msg.Response, buf, p) - return buf[:p] + buf := make([]byte, 41+len(msg.OperationKind)+len(msg.OperationName)+len(msg.Variables)+len(msg.Response)) + buf[0] = 48 + p := 1 + p = WriteString(msg.OperationKind, buf, p) + p = WriteString(msg.OperationName, buf, p) + p = WriteString(msg.Variables, buf, p) + p = WriteString(msg.Response, buf, p) + return buf[:p] } type PerformanceTrack struct { - *meta - Frames int64 - Ticks int64 - TotalJSHeapSize uint64 - UsedJSHeapSize uint64 + *meta + Frames int64 + Ticks int64 + TotalJSHeapSize uint64 + UsedJSHeapSize uint64 } func (msg *PerformanceTrack) Encode() []byte { - buf := make([]byte, 41) - buf[0] = 49 - p := 1 - p = WriteInt(msg.Frames, buf, p) - p = WriteInt(msg.Ticks, buf, p) - p = WriteUint(msg.TotalJSHeapSize, buf, p) - p = WriteUint(msg.UsedJSHeapSize, buf, p) - return buf[:p] + buf := make([]byte, 41) + buf[0] = 49 + p := 1 + p = WriteInt(msg.Frames, buf, p) + p = WriteInt(msg.Ticks, buf, p) + p = WriteUint(msg.TotalJSHeapSize, buf, p) + p = WriteUint(msg.UsedJSHeapSize, buf, p) + return buf[:p] } type GraphQLEvent struct { - *meta - MessageID uint64 - Timestamp uint64 - OperationKind string - OperationName string - Variables string - Response string + *meta + MessageID uint64 + Timestamp uint64 + OperationKind string + OperationName string + Variables string + Response string } func (msg *GraphQLEvent) Encode() []byte { - buf := make([]byte, 61+len(msg.OperationKind)+len(msg.OperationName)+len(msg.Variables)+len(msg.Response)) - buf[0] = 50 - p := 1 - p = WriteUint(msg.MessageID, buf, p) - p = WriteUint(msg.Timestamp, buf, p) - p = WriteString(msg.OperationKind, buf, p) - p = WriteString(msg.OperationName, buf, p) - p = WriteString(msg.Variables, buf, p) - p = WriteString(msg.Response, buf, p) - return buf[:p] + buf := make([]byte, 61+len(msg.OperationKind)+len(msg.OperationName)+len(msg.Variables)+len(msg.Response)) + buf[0] = 50 + p := 1 + p = WriteUint(msg.MessageID, buf, p) + p = WriteUint(msg.Timestamp, buf, p) + p = WriteString(msg.OperationKind, buf, p) + p = WriteString(msg.OperationName, buf, p) + p = WriteString(msg.Variables, buf, p) + p = WriteString(msg.Response, buf, p) + return buf[:p] } type FetchEvent struct { - *meta - MessageID uint64 - Timestamp uint64 - Method string - URL string - Request string - Response string - Status uint64 - Duration uint64 + *meta + MessageID uint64 + Timestamp uint64 + Method string + URL string + Request string + Response string + Status uint64 + Duration uint64 } func (msg *FetchEvent) Encode() []byte { - buf := make([]byte, 81+len(msg.Method)+len(msg.URL)+len(msg.Request)+len(msg.Response)) - buf[0] = 51 - p := 1 - p = WriteUint(msg.MessageID, buf, p) - p = WriteUint(msg.Timestamp, buf, p) - p = WriteString(msg.Method, buf, p) - p = WriteString(msg.URL, buf, p) - p = WriteString(msg.Request, buf, p) - p = WriteString(msg.Response, buf, p) - p = WriteUint(msg.Status, buf, p) - p = WriteUint(msg.Duration, buf, p) - return buf[:p] + buf := make([]byte, 81+len(msg.Method)+len(msg.URL)+len(msg.Request)+len(msg.Response)) + buf[0] = 51 + p := 1 + p = WriteUint(msg.MessageID, buf, p) + p = WriteUint(msg.Timestamp, buf, p) + p = WriteString(msg.Method, buf, p) + p = WriteString(msg.URL, buf, p) + p = WriteString(msg.Request, buf, p) + p = WriteString(msg.Response, buf, p) + p = WriteUint(msg.Status, buf, p) + p = WriteUint(msg.Duration, buf, p) + return buf[:p] } type DOMDrop struct { - *meta - Timestamp uint64 + *meta + Timestamp uint64 } func (msg *DOMDrop) Encode() []byte { - buf := make([]byte, 11) - buf[0] = 52 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - return buf[:p] + buf := make([]byte, 11) + buf[0] = 52 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + return buf[:p] } type ResourceTiming struct { - *meta - Timestamp uint64 - Duration uint64 - TTFB uint64 - HeaderSize uint64 - EncodedBodySize uint64 - DecodedBodySize uint64 - URL string - Initiator string + *meta + Timestamp uint64 + Duration uint64 + TTFB uint64 + HeaderSize uint64 + EncodedBodySize uint64 + DecodedBodySize uint64 + URL string + Initiator string } func (msg *ResourceTiming) Encode() []byte { - buf := make([]byte, 81+len(msg.URL)+len(msg.Initiator)) - buf[0] = 53 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.Duration, buf, p) - p = WriteUint(msg.TTFB, buf, p) - p = WriteUint(msg.HeaderSize, buf, p) - p = WriteUint(msg.EncodedBodySize, buf, p) - p = WriteUint(msg.DecodedBodySize, buf, p) - p = WriteString(msg.URL, buf, p) - p = WriteString(msg.Initiator, buf, p) - return buf[:p] + buf := make([]byte, 81+len(msg.URL)+len(msg.Initiator)) + buf[0] = 53 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.Duration, buf, p) + p = WriteUint(msg.TTFB, buf, p) + p = WriteUint(msg.HeaderSize, buf, p) + p = WriteUint(msg.EncodedBodySize, buf, p) + p = WriteUint(msg.DecodedBodySize, buf, p) + p = WriteString(msg.URL, buf, p) + p = WriteString(msg.Initiator, buf, p) + return buf[:p] } type ConnectionInformation struct { - *meta - Downlink uint64 - Type string + *meta + Downlink uint64 + Type string } func (msg *ConnectionInformation) Encode() []byte { - buf := make([]byte, 21+len(msg.Type)) - buf[0] = 54 - p := 1 - p = WriteUint(msg.Downlink, buf, p) - p = WriteString(msg.Type, buf, p) - return buf[:p] + buf := make([]byte, 21+len(msg.Type)) + buf[0] = 54 + p := 1 + p = WriteUint(msg.Downlink, buf, p) + p = WriteString(msg.Type, buf, p) + return buf[:p] } type SetPageVisibility struct { - *meta - hidden bool + *meta + hidden bool } func (msg *SetPageVisibility) Encode() []byte { - buf := make([]byte, 11) - buf[0] = 55 - p := 1 - p = WriteBoolean(msg.hidden, buf, p) - return buf[:p] + buf := make([]byte, 11) + buf[0] = 55 + p := 1 + p = WriteBoolean(msg.hidden, buf, p) + return buf[:p] } type PerformanceTrackAggr struct { - *meta - TimestampStart uint64 - TimestampEnd uint64 - MinFPS uint64 - AvgFPS uint64 - MaxFPS uint64 - MinCPU uint64 - AvgCPU uint64 - MaxCPU uint64 - MinTotalJSHeapSize uint64 - AvgTotalJSHeapSize uint64 - MaxTotalJSHeapSize uint64 - MinUsedJSHeapSize uint64 - AvgUsedJSHeapSize uint64 - MaxUsedJSHeapSize uint64 + *meta + TimestampStart uint64 + TimestampEnd uint64 + MinFPS uint64 + AvgFPS uint64 + MaxFPS uint64 + MinCPU uint64 + AvgCPU uint64 + MaxCPU uint64 + MinTotalJSHeapSize uint64 + AvgTotalJSHeapSize uint64 + MaxTotalJSHeapSize uint64 + MinUsedJSHeapSize uint64 + AvgUsedJSHeapSize uint64 + MaxUsedJSHeapSize uint64 } func (msg *PerformanceTrackAggr) Encode() []byte { - buf := make([]byte, 141) - buf[0] = 56 - p := 1 - p = WriteUint(msg.TimestampStart, buf, p) - p = WriteUint(msg.TimestampEnd, buf, p) - p = WriteUint(msg.MinFPS, buf, p) - p = WriteUint(msg.AvgFPS, buf, p) - p = WriteUint(msg.MaxFPS, buf, p) - p = WriteUint(msg.MinCPU, buf, p) - p = WriteUint(msg.AvgCPU, buf, p) - p = WriteUint(msg.MaxCPU, buf, p) - p = WriteUint(msg.MinTotalJSHeapSize, buf, p) - p = WriteUint(msg.AvgTotalJSHeapSize, buf, p) - p = WriteUint(msg.MaxTotalJSHeapSize, buf, p) - p = WriteUint(msg.MinUsedJSHeapSize, buf, p) - p = WriteUint(msg.AvgUsedJSHeapSize, buf, p) - p = WriteUint(msg.MaxUsedJSHeapSize, buf, p) - return buf[:p] + buf := make([]byte, 141) + buf[0] = 56 + p := 1 + p = WriteUint(msg.TimestampStart, buf, p) + p = WriteUint(msg.TimestampEnd, buf, p) + p = WriteUint(msg.MinFPS, buf, p) + p = WriteUint(msg.AvgFPS, buf, p) + p = WriteUint(msg.MaxFPS, buf, p) + p = WriteUint(msg.MinCPU, buf, p) + p = WriteUint(msg.AvgCPU, buf, p) + p = WriteUint(msg.MaxCPU, buf, p) + p = WriteUint(msg.MinTotalJSHeapSize, buf, p) + p = WriteUint(msg.AvgTotalJSHeapSize, buf, p) + p = WriteUint(msg.MaxTotalJSHeapSize, buf, p) + p = WriteUint(msg.MinUsedJSHeapSize, buf, p) + p = WriteUint(msg.AvgUsedJSHeapSize, buf, p) + p = WriteUint(msg.MaxUsedJSHeapSize, buf, p) + return buf[:p] } type LongTask struct { - *meta - Timestamp uint64 - Duration uint64 - Context uint64 - ContainerType uint64 - ContainerSrc string - ContainerId string - ContainerName string + *meta + Timestamp uint64 + Duration uint64 + Context uint64 + ContainerType uint64 + ContainerSrc string + ContainerId string + ContainerName string } func (msg *LongTask) Encode() []byte { - buf := make([]byte, 71+len(msg.ContainerSrc)+len(msg.ContainerId)+len(msg.ContainerName)) - buf[0] = 59 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.Duration, buf, p) - p = WriteUint(msg.Context, buf, p) - p = WriteUint(msg.ContainerType, buf, p) - p = WriteString(msg.ContainerSrc, buf, p) - p = WriteString(msg.ContainerId, buf, p) - p = WriteString(msg.ContainerName, buf, p) - return buf[:p] + buf := make([]byte, 71+len(msg.ContainerSrc)+len(msg.ContainerId)+len(msg.ContainerName)) + buf[0] = 59 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.Duration, buf, p) + p = WriteUint(msg.Context, buf, p) + p = WriteUint(msg.ContainerType, buf, p) + p = WriteString(msg.ContainerSrc, buf, p) + p = WriteString(msg.ContainerId, buf, p) + p = WriteString(msg.ContainerName, buf, p) + return buf[:p] } type SetNodeAttributeURLBased struct { - *meta - ID uint64 - Name string - Value string - BaseURL string + *meta + ID uint64 + Name string + Value string + BaseURL string } func (msg *SetNodeAttributeURLBased) Encode() []byte { - buf := make([]byte, 41+len(msg.Name)+len(msg.Value)+len(msg.BaseURL)) - buf[0] = 60 - p := 1 - p = WriteUint(msg.ID, buf, p) - p = WriteString(msg.Name, buf, p) - p = WriteString(msg.Value, buf, p) - p = WriteString(msg.BaseURL, buf, p) - return buf[:p] + buf := make([]byte, 41+len(msg.Name)+len(msg.Value)+len(msg.BaseURL)) + buf[0] = 60 + p := 1 + p = WriteUint(msg.ID, buf, p) + p = WriteString(msg.Name, buf, p) + p = WriteString(msg.Value, buf, p) + p = WriteString(msg.BaseURL, buf, p) + return buf[:p] } type SetCSSDataURLBased struct { - *meta - ID uint64 - Data string - BaseURL string + *meta + ID uint64 + Data string + BaseURL string } func (msg *SetCSSDataURLBased) Encode() []byte { - buf := make([]byte, 31+len(msg.Data)+len(msg.BaseURL)) - buf[0] = 61 - p := 1 - p = WriteUint(msg.ID, buf, p) - p = WriteString(msg.Data, buf, p) - p = WriteString(msg.BaseURL, buf, p) - return buf[:p] + buf := make([]byte, 31+len(msg.Data)+len(msg.BaseURL)) + buf[0] = 61 + p := 1 + p = WriteUint(msg.ID, buf, p) + p = WriteString(msg.Data, buf, p) + p = WriteString(msg.BaseURL, buf, p) + return buf[:p] } type IssueEvent struct { - *meta - MessageID uint64 - Timestamp uint64 - Type string - ContextString string - Context string - Payload string + *meta + MessageID uint64 + Timestamp uint64 + Type string + ContextString string + Context string + Payload string } func (msg *IssueEvent) Encode() []byte { - buf := make([]byte, 61+len(msg.Type)+len(msg.ContextString)+len(msg.Context)+len(msg.Payload)) - buf[0] = 62 - p := 1 - p = WriteUint(msg.MessageID, buf, p) - p = WriteUint(msg.Timestamp, buf, p) - p = WriteString(msg.Type, buf, p) - p = WriteString(msg.ContextString, buf, p) - p = WriteString(msg.Context, buf, p) - p = WriteString(msg.Payload, buf, p) - return buf[:p] + buf := make([]byte, 61+len(msg.Type)+len(msg.ContextString)+len(msg.Context)+len(msg.Payload)) + buf[0] = 62 + p := 1 + p = WriteUint(msg.MessageID, buf, p) + p = WriteUint(msg.Timestamp, buf, p) + p = WriteString(msg.Type, buf, p) + p = WriteString(msg.ContextString, buf, p) + p = WriteString(msg.Context, buf, p) + p = WriteString(msg.Payload, buf, p) + return buf[:p] } type TechnicalInfo struct { - *meta - Type string - Value string + *meta + Type string + Value string } func (msg *TechnicalInfo) Encode() []byte { - buf := make([]byte, 21+len(msg.Type)+len(msg.Value)) - buf[0] = 63 - p := 1 - p = WriteString(msg.Type, buf, p) - p = WriteString(msg.Value, buf, p) - return buf[:p] + buf := make([]byte, 21+len(msg.Type)+len(msg.Value)) + buf[0] = 63 + p := 1 + p = WriteString(msg.Type, buf, p) + p = WriteString(msg.Value, buf, p) + return buf[:p] } type CustomIssue struct { - *meta - Name string - Payload string + *meta + Name string + Payload string } func (msg *CustomIssue) Encode() []byte { - buf := make([]byte, 21+len(msg.Name)+len(msg.Payload)) - buf[0] = 64 - p := 1 - p = WriteString(msg.Name, buf, p) - p = WriteString(msg.Payload, buf, p) - return buf[:p] + buf := make([]byte, 21+len(msg.Name)+len(msg.Payload)) + buf[0] = 64 + p := 1 + p = WriteString(msg.Name, buf, p) + p = WriteString(msg.Payload, buf, p) + return buf[:p] } type PageClose struct { - *meta + *meta } func (msg *PageClose) Encode() []byte { - buf := make([]byte, 1) - buf[0] = 65 - p := 1 + buf := make([]byte, 1) + buf[0] = 65 + p := 1 - return buf[:p] + return buf[:p] } type AssetCache struct { - *meta - URL string + *meta + URL string } func (msg *AssetCache) Encode() []byte { - buf := make([]byte, 11+len(msg.URL)) - buf[0] = 66 - p := 1 - p = WriteString(msg.URL, buf, p) - return buf[:p] + buf := make([]byte, 11+len(msg.URL)) + buf[0] = 66 + p := 1 + p = WriteString(msg.URL, buf, p) + return buf[:p] } type CSSInsertRuleURLBased struct { - *meta - ID uint64 - Rule string - Index uint64 - BaseURL string + *meta + ID uint64 + Rule string + Index uint64 + BaseURL string } func (msg *CSSInsertRuleURLBased) Encode() []byte { - buf := make([]byte, 41+len(msg.Rule)+len(msg.BaseURL)) - buf[0] = 67 - p := 1 - p = WriteUint(msg.ID, buf, p) - p = WriteString(msg.Rule, buf, p) - p = WriteUint(msg.Index, buf, p) - p = WriteString(msg.BaseURL, buf, p) - return buf[:p] + buf := make([]byte, 41+len(msg.Rule)+len(msg.BaseURL)) + buf[0] = 67 + p := 1 + p = WriteUint(msg.ID, buf, p) + p = WriteString(msg.Rule, buf, p) + p = WriteUint(msg.Index, buf, p) + p = WriteString(msg.BaseURL, buf, p) + return buf[:p] } type MouseClick struct { - *meta - ID uint64 - HesitationTime uint64 - Label string - Selector string + *meta + ID uint64 + HesitationTime uint64 + Label string + Selector string } func (msg *MouseClick) Encode() []byte { - buf := make([]byte, 41+len(msg.Label)+len(msg.Selector)) - buf[0] = 69 - p := 1 - p = WriteUint(msg.ID, buf, p) - p = WriteUint(msg.HesitationTime, buf, p) - p = WriteString(msg.Label, buf, p) - p = WriteString(msg.Selector, buf, p) - return buf[:p] + buf := make([]byte, 41+len(msg.Label)+len(msg.Selector)) + buf[0] = 69 + p := 1 + p = WriteUint(msg.ID, buf, p) + p = WriteUint(msg.HesitationTime, buf, p) + p = WriteString(msg.Label, buf, p) + p = WriteString(msg.Selector, buf, p) + return buf[:p] } type CreateIFrameDocument struct { - *meta - FrameID uint64 - ID uint64 + *meta + FrameID uint64 + ID uint64 } func (msg *CreateIFrameDocument) Encode() []byte { - buf := make([]byte, 21) - buf[0] = 70 - p := 1 - p = WriteUint(msg.FrameID, buf, p) - p = WriteUint(msg.ID, buf, p) - return buf[:p] + buf := make([]byte, 21) + buf[0] = 70 + p := 1 + p = WriteUint(msg.FrameID, buf, p) + p = WriteUint(msg.ID, buf, p) + return buf[:p] } type IOSBatchMeta struct { - *meta - Timestamp uint64 - Length uint64 - FirstIndex uint64 + *meta + Timestamp uint64 + Length uint64 + FirstIndex uint64 } func (msg *IOSBatchMeta) Encode() []byte { - buf := make([]byte, 31) - buf[0] = 107 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.Length, buf, p) - p = WriteUint(msg.FirstIndex, buf, p) - return buf[:p] + buf := make([]byte, 31) + buf[0] = 107 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.Length, buf, p) + p = WriteUint(msg.FirstIndex, buf, p) + return buf[:p] } type IOSSessionStart struct { - *meta - Timestamp uint64 - ProjectID uint64 - TrackerVersion string - RevID string - UserUUID string - UserOS string - UserOSVersion string - UserDevice string - UserDeviceType string - UserCountry string + *meta + Timestamp uint64 + ProjectID uint64 + TrackerVersion string + RevID string + UserUUID string + UserOS string + UserOSVersion string + UserDevice string + UserDeviceType string + UserCountry string } func (msg *IOSSessionStart) Encode() []byte { - buf := make([]byte, 101+len(msg.TrackerVersion)+len(msg.RevID)+len(msg.UserUUID)+len(msg.UserOS)+len(msg.UserOSVersion)+len(msg.UserDevice)+len(msg.UserDeviceType)+len(msg.UserCountry)) - buf[0] = 90 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.ProjectID, buf, p) - p = WriteString(msg.TrackerVersion, buf, p) - p = WriteString(msg.RevID, buf, p) - p = WriteString(msg.UserUUID, buf, p) - p = WriteString(msg.UserOS, buf, p) - p = WriteString(msg.UserOSVersion, buf, p) - p = WriteString(msg.UserDevice, buf, p) - p = WriteString(msg.UserDeviceType, buf, p) - p = WriteString(msg.UserCountry, buf, p) - return buf[:p] + buf := make([]byte, 101+len(msg.TrackerVersion)+len(msg.RevID)+len(msg.UserUUID)+len(msg.UserOS)+len(msg.UserOSVersion)+len(msg.UserDevice)+len(msg.UserDeviceType)+len(msg.UserCountry)) + buf[0] = 90 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.ProjectID, buf, p) + p = WriteString(msg.TrackerVersion, buf, p) + p = WriteString(msg.RevID, buf, p) + p = WriteString(msg.UserUUID, buf, p) + p = WriteString(msg.UserOS, buf, p) + p = WriteString(msg.UserOSVersion, buf, p) + p = WriteString(msg.UserDevice, buf, p) + p = WriteString(msg.UserDeviceType, buf, p) + p = WriteString(msg.UserCountry, buf, p) + return buf[:p] } type IOSSessionEnd struct { - *meta - Timestamp uint64 + *meta + Timestamp uint64 } func (msg *IOSSessionEnd) Encode() []byte { - buf := make([]byte, 11) - buf[0] = 91 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - return buf[:p] + buf := make([]byte, 11) + buf[0] = 91 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + return buf[:p] } type IOSMetadata struct { - *meta - Timestamp uint64 - Length uint64 - Key string - Value string + *meta + Timestamp uint64 + Length uint64 + Key string + Value string } func (msg *IOSMetadata) Encode() []byte { - buf := make([]byte, 41+len(msg.Key)+len(msg.Value)) - buf[0] = 92 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.Length, buf, p) - p = WriteString(msg.Key, buf, p) - p = WriteString(msg.Value, buf, p) - return buf[:p] + buf := make([]byte, 41+len(msg.Key)+len(msg.Value)) + buf[0] = 92 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.Length, buf, p) + p = WriteString(msg.Key, buf, p) + p = WriteString(msg.Value, buf, p) + return buf[:p] } type IOSCustomEvent struct { - *meta - Timestamp uint64 - Length uint64 - Name string - Payload string + *meta + Timestamp uint64 + Length uint64 + Name string + Payload string } func (msg *IOSCustomEvent) Encode() []byte { - buf := make([]byte, 41+len(msg.Name)+len(msg.Payload)) - buf[0] = 93 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.Length, buf, p) - p = WriteString(msg.Name, buf, p) - p = WriteString(msg.Payload, buf, p) - return buf[:p] + buf := make([]byte, 41+len(msg.Name)+len(msg.Payload)) + buf[0] = 93 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.Length, buf, p) + p = WriteString(msg.Name, buf, p) + p = WriteString(msg.Payload, buf, p) + return buf[:p] } type IOSUserID struct { - *meta - Timestamp uint64 - Length uint64 - Value string + *meta + Timestamp uint64 + Length uint64 + Value string } func (msg *IOSUserID) Encode() []byte { - buf := make([]byte, 31+len(msg.Value)) - buf[0] = 94 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.Length, buf, p) - p = WriteString(msg.Value, buf, p) - return buf[:p] + buf := make([]byte, 31+len(msg.Value)) + buf[0] = 94 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.Length, buf, p) + p = WriteString(msg.Value, buf, p) + return buf[:p] } type IOSUserAnonymousID struct { - *meta - Timestamp uint64 - Length uint64 - Value string + *meta + Timestamp uint64 + Length uint64 + Value string } func (msg *IOSUserAnonymousID) Encode() []byte { - buf := make([]byte, 31+len(msg.Value)) - buf[0] = 95 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.Length, buf, p) - p = WriteString(msg.Value, buf, p) - return buf[:p] + buf := make([]byte, 31+len(msg.Value)) + buf[0] = 95 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.Length, buf, p) + p = WriteString(msg.Value, buf, p) + return buf[:p] } type IOSScreenChanges struct { - *meta - Timestamp uint64 - Length uint64 - X uint64 - Y uint64 - Width uint64 - Height uint64 + *meta + Timestamp uint64 + Length uint64 + X uint64 + Y uint64 + Width uint64 + Height uint64 } func (msg *IOSScreenChanges) Encode() []byte { - buf := make([]byte, 61) - buf[0] = 96 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.Length, buf, p) - p = WriteUint(msg.X, buf, p) - p = WriteUint(msg.Y, buf, p) - p = WriteUint(msg.Width, buf, p) - p = WriteUint(msg.Height, buf, p) - return buf[:p] + buf := make([]byte, 61) + buf[0] = 96 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.Length, buf, p) + p = WriteUint(msg.X, buf, p) + p = WriteUint(msg.Y, buf, p) + p = WriteUint(msg.Width, buf, p) + p = WriteUint(msg.Height, buf, p) + return buf[:p] } type IOSCrash struct { - *meta - Timestamp uint64 - Length uint64 - Name string - Reason string - Stacktrace string + *meta + Timestamp uint64 + Length uint64 + Name string + Reason string + Stacktrace string } func (msg *IOSCrash) Encode() []byte { - buf := make([]byte, 51+len(msg.Name)+len(msg.Reason)+len(msg.Stacktrace)) - buf[0] = 97 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.Length, buf, p) - p = WriteString(msg.Name, buf, p) - p = WriteString(msg.Reason, buf, p) - p = WriteString(msg.Stacktrace, buf, p) - return buf[:p] + buf := make([]byte, 51+len(msg.Name)+len(msg.Reason)+len(msg.Stacktrace)) + buf[0] = 97 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.Length, buf, p) + p = WriteString(msg.Name, buf, p) + p = WriteString(msg.Reason, buf, p) + p = WriteString(msg.Stacktrace, buf, p) + return buf[:p] } type IOSScreenEnter struct { - *meta - Timestamp uint64 - Length uint64 - Title string - ViewName string + *meta + Timestamp uint64 + Length uint64 + Title string + ViewName string } func (msg *IOSScreenEnter) Encode() []byte { - buf := make([]byte, 41+len(msg.Title)+len(msg.ViewName)) - buf[0] = 98 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.Length, buf, p) - p = WriteString(msg.Title, buf, p) - p = WriteString(msg.ViewName, buf, p) - return buf[:p] + buf := make([]byte, 41+len(msg.Title)+len(msg.ViewName)) + buf[0] = 98 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.Length, buf, p) + p = WriteString(msg.Title, buf, p) + p = WriteString(msg.ViewName, buf, p) + return buf[:p] } type IOSScreenLeave struct { - *meta - Timestamp uint64 - Length uint64 - Title string - ViewName string + *meta + Timestamp uint64 + Length uint64 + Title string + ViewName string } func (msg *IOSScreenLeave) Encode() []byte { - buf := make([]byte, 41+len(msg.Title)+len(msg.ViewName)) - buf[0] = 99 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.Length, buf, p) - p = WriteString(msg.Title, buf, p) - p = WriteString(msg.ViewName, buf, p) - return buf[:p] + buf := make([]byte, 41+len(msg.Title)+len(msg.ViewName)) + buf[0] = 99 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.Length, buf, p) + p = WriteString(msg.Title, buf, p) + p = WriteString(msg.ViewName, buf, p) + return buf[:p] } type IOSClickEvent struct { - *meta - Timestamp uint64 - Length uint64 - Label string - X uint64 - Y uint64 + *meta + Timestamp uint64 + Length uint64 + Label string + X uint64 + Y uint64 } func (msg *IOSClickEvent) Encode() []byte { - buf := make([]byte, 51+len(msg.Label)) - buf[0] = 100 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.Length, buf, p) - p = WriteString(msg.Label, buf, p) - p = WriteUint(msg.X, buf, p) - p = WriteUint(msg.Y, buf, p) - return buf[:p] + buf := make([]byte, 51+len(msg.Label)) + buf[0] = 100 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.Length, buf, p) + p = WriteString(msg.Label, buf, p) + p = WriteUint(msg.X, buf, p) + p = WriteUint(msg.Y, buf, p) + return buf[:p] } type IOSInputEvent struct { - *meta - Timestamp uint64 - Length uint64 - Value string - ValueMasked bool - Label string + *meta + Timestamp uint64 + Length uint64 + Value string + ValueMasked bool + Label string } func (msg *IOSInputEvent) Encode() []byte { - buf := make([]byte, 51+len(msg.Value)+len(msg.Label)) - buf[0] = 101 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.Length, buf, p) - p = WriteString(msg.Value, buf, p) - p = WriteBoolean(msg.ValueMasked, buf, p) - p = WriteString(msg.Label, buf, p) - return buf[:p] + buf := make([]byte, 51+len(msg.Value)+len(msg.Label)) + buf[0] = 101 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.Length, buf, p) + p = WriteString(msg.Value, buf, p) + p = WriteBoolean(msg.ValueMasked, buf, p) + p = WriteString(msg.Label, buf, p) + return buf[:p] } type IOSPerformanceEvent struct { - *meta - Timestamp uint64 - Length uint64 - Name string - Value uint64 + *meta + Timestamp uint64 + Length uint64 + Name string + Value uint64 } func (msg *IOSPerformanceEvent) Encode() []byte { - buf := make([]byte, 41+len(msg.Name)) - buf[0] = 102 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.Length, buf, p) - p = WriteString(msg.Name, buf, p) - p = WriteUint(msg.Value, buf, p) - return buf[:p] + buf := make([]byte, 41+len(msg.Name)) + buf[0] = 102 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.Length, buf, p) + p = WriteString(msg.Name, buf, p) + p = WriteUint(msg.Value, buf, p) + return buf[:p] } type IOSLog struct { - *meta - Timestamp uint64 - Length uint64 - Severity string - Content string + *meta + Timestamp uint64 + Length uint64 + Severity string + Content string } func (msg *IOSLog) Encode() []byte { - buf := make([]byte, 41+len(msg.Severity)+len(msg.Content)) - buf[0] = 103 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.Length, buf, p) - p = WriteString(msg.Severity, buf, p) - p = WriteString(msg.Content, buf, p) - return buf[:p] + buf := make([]byte, 41+len(msg.Severity)+len(msg.Content)) + buf[0] = 103 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.Length, buf, p) + p = WriteString(msg.Severity, buf, p) + p = WriteString(msg.Content, buf, p) + return buf[:p] } type IOSInternalError struct { - *meta - Timestamp uint64 - Length uint64 - Content string + *meta + Timestamp uint64 + Length uint64 + Content string } func (msg *IOSInternalError) Encode() []byte { - buf := make([]byte, 31+len(msg.Content)) - buf[0] = 104 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.Length, buf, p) - p = WriteString(msg.Content, buf, p) - return buf[:p] + buf := make([]byte, 31+len(msg.Content)) + buf[0] = 104 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.Length, buf, p) + p = WriteString(msg.Content, buf, p) + return buf[:p] } type IOSNetworkCall struct { - *meta - Timestamp uint64 - Length uint64 - Duration uint64 - Headers string - Body string - URL string - Success bool - Method string - Status uint64 + *meta + Timestamp uint64 + Length uint64 + Duration uint64 + Headers string + Body string + URL string + Success bool + Method string + Status uint64 } func (msg *IOSNetworkCall) Encode() []byte { - buf := make([]byte, 91+len(msg.Headers)+len(msg.Body)+len(msg.URL)+len(msg.Method)) - buf[0] = 105 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - p = WriteUint(msg.Length, buf, p) - p = WriteUint(msg.Duration, buf, p) - p = WriteString(msg.Headers, buf, p) - p = WriteString(msg.Body, buf, p) - p = WriteString(msg.URL, buf, p) - p = WriteBoolean(msg.Success, buf, p) - p = WriteString(msg.Method, buf, p) - p = WriteUint(msg.Status, buf, p) - return buf[:p] + buf := make([]byte, 91+len(msg.Headers)+len(msg.Body)+len(msg.URL)+len(msg.Method)) + buf[0] = 105 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.Length, buf, p) + p = WriteUint(msg.Duration, buf, p) + p = WriteString(msg.Headers, buf, p) + p = WriteString(msg.Body, buf, p) + p = WriteString(msg.URL, buf, p) + p = WriteBoolean(msg.Success, buf, p) + p = WriteString(msg.Method, buf, p) + p = WriteUint(msg.Status, buf, p) + return buf[:p] } type IOSPerformanceAggregated struct { - *meta - TimestampStart uint64 - TimestampEnd uint64 - MinFPS uint64 - AvgFPS uint64 - MaxFPS uint64 - MinCPU uint64 - AvgCPU uint64 - MaxCPU uint64 - MinMemory uint64 - AvgMemory uint64 - MaxMemory uint64 - MinBattery uint64 - AvgBattery uint64 - MaxBattery uint64 + *meta + TimestampStart uint64 + TimestampEnd uint64 + MinFPS uint64 + AvgFPS uint64 + MaxFPS uint64 + MinCPU uint64 + AvgCPU uint64 + MaxCPU uint64 + MinMemory uint64 + AvgMemory uint64 + MaxMemory uint64 + MinBattery uint64 + AvgBattery uint64 + MaxBattery uint64 } func (msg *IOSPerformanceAggregated) Encode() []byte { - buf := make([]byte, 141) - buf[0] = 110 - p := 1 - p = WriteUint(msg.TimestampStart, buf, p) - p = WriteUint(msg.TimestampEnd, buf, p) - p = WriteUint(msg.MinFPS, buf, p) - p = WriteUint(msg.AvgFPS, buf, p) - p = WriteUint(msg.MaxFPS, buf, p) - p = WriteUint(msg.MinCPU, buf, p) - p = WriteUint(msg.AvgCPU, buf, p) - p = WriteUint(msg.MaxCPU, buf, p) - p = WriteUint(msg.MinMemory, buf, p) - p = WriteUint(msg.AvgMemory, buf, p) - p = WriteUint(msg.MaxMemory, buf, p) - p = WriteUint(msg.MinBattery, buf, p) - p = WriteUint(msg.AvgBattery, buf, p) - p = WriteUint(msg.MaxBattery, buf, p) - return buf[:p] + buf := make([]byte, 141) + buf[0] = 110 + p := 1 + p = WriteUint(msg.TimestampStart, buf, p) + p = WriteUint(msg.TimestampEnd, buf, p) + p = WriteUint(msg.MinFPS, buf, p) + p = WriteUint(msg.AvgFPS, buf, p) + p = WriteUint(msg.MaxFPS, buf, p) + p = WriteUint(msg.MinCPU, buf, p) + p = WriteUint(msg.AvgCPU, buf, p) + p = WriteUint(msg.MaxCPU, buf, p) + p = WriteUint(msg.MinMemory, buf, p) + p = WriteUint(msg.AvgMemory, buf, p) + p = WriteUint(msg.MaxMemory, buf, p) + p = WriteUint(msg.MinBattery, buf, p) + p = WriteUint(msg.AvgBattery, buf, p) + p = WriteUint(msg.MaxBattery, buf, p) + return buf[:p] } type IOSIssueEvent struct { - *meta - Timestamp uint64 - Type string - ContextString string - Context string - Payload string + *meta + Timestamp uint64 + Type string + ContextString string + Context string + Payload string } func (msg *IOSIssueEvent) Encode() []byte { - buf := make([]byte, 51+len(msg.Type)+len(msg.ContextString)+len(msg.Context)+len(msg.Payload)) - buf[0] = 111 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - p = WriteString(msg.Type, buf, p) - p = WriteString(msg.ContextString, buf, p) - p = WriteString(msg.Context, buf, p) - p = WriteString(msg.Payload, buf, p) - return buf[:p] + buf := make([]byte, 51+len(msg.Type)+len(msg.ContextString)+len(msg.Context)+len(msg.Payload)) + buf[0] = 111 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + p = WriteString(msg.Type, buf, p) + p = WriteString(msg.ContextString, buf, p) + p = WriteString(msg.Context, buf, p) + p = WriteString(msg.Payload, buf, p) + return buf[:p] } diff --git a/backend/pkg/messages/performance/performance.go b/backend/pkg/messages/performance/performance.go index 4cfb28045..27e28215e 100644 --- a/backend/pkg/messages/performance/performance.go +++ b/backend/pkg/messages/performance/performance.go @@ -4,7 +4,6 @@ import ( "math" ) - func TimeDiff(t1 uint64, t2 uint64) uint64 { if t1 < t2 { return 0 @@ -30,4 +29,4 @@ func CPURateFromTickRate(tickRate float64) uint64 { func CPURate(ticks int64, dt uint64) uint64 { return CPURateFromTickRate(TickRate(ticks, dt)) -} \ No newline at end of file +} diff --git a/backend/pkg/messages/primitives.go b/backend/pkg/messages/primitives.go index 70952eeab..8687ef413 100644 --- a/backend/pkg/messages/primitives.go +++ b/backend/pkg/messages/primitives.go @@ -1,9 +1,9 @@ package messages import ( + "encoding/json" "errors" "io" - "encoding/json" "log" ) @@ -37,7 +37,7 @@ func ReadData(reader io.Reader) ([]byte, error) { } return p, nil } - + func ReadUint(reader io.Reader) (uint64, error) { var x uint64 var s uint @@ -152,4 +152,4 @@ func WriteJson(v interface{}, buf []byte, p int) int { return WriteString("null", buf, p) } return WriteData(data, buf, p) -} \ No newline at end of file +} diff --git a/backend/pkg/messages/read-message.go b/backend/pkg/messages/read-message.go index 31512c9c8..60f9c17a8 100644 --- a/backend/pkg/messages/read-message.go +++ b/backend/pkg/messages/read-message.go @@ -2,1430 +2,1430 @@ package messages import ( - "fmt" - "io" + "fmt" + "io" ) func ReadMessage(reader io.Reader) (Message, error) { - t, err := ReadUint(reader) - if err != nil { - return nil, err - } - switch t { - - case 80: - msg := &BatchMeta{meta: &meta{TypeID: 80}} - if msg.PageNo, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.FirstIndex, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadInt(reader); err != nil { - return nil, err - } - return msg, nil - - case 0: - msg := &Timestamp{meta: &meta{TypeID: 0}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 1: - msg := &SessionStart{meta: &meta{TypeID: 1}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ProjectID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.TrackerVersion, err = ReadString(reader); err != nil { - return nil, err - } - if msg.RevID, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserUUID, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserAgent, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserOS, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserOSVersion, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserBrowser, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserBrowserVersion, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserDevice, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserDeviceType, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserDeviceMemorySize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.UserDeviceHeapSize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.UserCountry, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserID, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 2: - msg := &SessionDisconnect{meta: &meta{TypeID: 2}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 3: - msg := &SessionEnd{meta: &meta{TypeID: 3}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 4: - msg := &SetPageLocation{meta: &meta{TypeID: 4}} - if msg.URL, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Referrer, err = ReadString(reader); err != nil { - return nil, err - } - if msg.NavigationStart, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 5: - msg := &SetViewportSize{meta: &meta{TypeID: 5}} - if msg.Width, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Height, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 6: - msg := &SetViewportScroll{meta: &meta{TypeID: 6}} - if msg.X, err = ReadInt(reader); err != nil { - return nil, err - } - if msg.Y, err = ReadInt(reader); err != nil { - return nil, err - } - return msg, nil - - case 7: - msg := &CreateDocument{meta: &meta{TypeID: 7}} - - return msg, nil - - case 8: - msg := &CreateElementNode{meta: &meta{TypeID: 8}} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ParentID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.index, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Tag, err = ReadString(reader); err != nil { - return nil, err - } - if msg.SVG, err = ReadBoolean(reader); err != nil { - return nil, err - } - return msg, nil - - case 9: - msg := &CreateTextNode{meta: &meta{TypeID: 9}} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ParentID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Index, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 10: - msg := &MoveNode{meta: &meta{TypeID: 10}} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ParentID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Index, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 11: - msg := &RemoveNode{meta: &meta{TypeID: 11}} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 12: - msg := &SetNodeAttribute{meta: &meta{TypeID: 12}} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 13: - msg := &RemoveNodeAttribute{meta: &meta{TypeID: 13}} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 14: - msg := &SetNodeData{meta: &meta{TypeID: 14}} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Data, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 15: - msg := &SetCSSData{meta: &meta{TypeID: 15}} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Data, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 16: - msg := &SetNodeScroll{meta: &meta{TypeID: 16}} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.X, err = ReadInt(reader); err != nil { - return nil, err - } - if msg.Y, err = ReadInt(reader); err != nil { - return nil, err - } - return msg, nil - - case 17: - msg := &SetInputTarget{meta: &meta{TypeID: 17}} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Label, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 18: - msg := &SetInputValue{meta: &meta{TypeID: 18}} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Mask, err = ReadInt(reader); err != nil { - return nil, err - } - return msg, nil - - case 19: - msg := &SetInputChecked{meta: &meta{TypeID: 19}} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Checked, err = ReadBoolean(reader); err != nil { - return nil, err - } - return msg, nil - - case 20: - msg := &MouseMove{meta: &meta{TypeID: 20}} - if msg.X, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Y, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 21: - msg := &MouseClickDepricated{meta: &meta{TypeID: 21}} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.HesitationTime, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Label, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 22: - msg := &ConsoleLog{meta: &meta{TypeID: 22}} - if msg.Level, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 23: - msg := &PageLoadTiming{meta: &meta{TypeID: 23}} - if msg.RequestStart, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ResponseStart, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ResponseEnd, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.DomContentLoadedEventStart, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.DomContentLoadedEventEnd, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.LoadEventStart, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.LoadEventEnd, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.FirstPaint, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.FirstContentfulPaint, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 24: - msg := &PageRenderTiming{meta: &meta{TypeID: 24}} - if msg.SpeedIndex, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.VisuallyComplete, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.TimeToInteractive, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 25: - msg := &JSException{meta: &meta{TypeID: 25}} - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Message, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Payload, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 26: - msg := &RawErrorEvent{meta: &meta{TypeID: 26}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Source, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Message, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Payload, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 27: - msg := &RawCustomEvent{meta: &meta{TypeID: 27}} - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Payload, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 28: - msg := &UserID{meta: &meta{TypeID: 28}} - if msg.ID, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 29: - msg := &UserAnonymousID{meta: &meta{TypeID: 29}} - if msg.ID, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 30: - msg := &Metadata{meta: &meta{TypeID: 30}} - if msg.Key, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 31: - msg := &PageEvent{meta: &meta{TypeID: 31}} - if msg.MessageID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.URL, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Referrer, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Loaded, err = ReadBoolean(reader); err != nil { - return nil, err - } - if msg.RequestStart, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ResponseStart, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ResponseEnd, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.DomContentLoadedEventStart, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.DomContentLoadedEventEnd, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.LoadEventStart, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.LoadEventEnd, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.FirstPaint, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.FirstContentfulPaint, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.SpeedIndex, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.VisuallyComplete, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.TimeToInteractive, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 32: - msg := &InputEvent{meta: &meta{TypeID: 32}} - if msg.MessageID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - if msg.ValueMasked, err = ReadBoolean(reader); err != nil { - return nil, err - } - if msg.Label, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 33: - msg := &ClickEvent{meta: &meta{TypeID: 33}} - if msg.MessageID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.HesitationTime, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Label, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Selector, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 34: - msg := &ErrorEvent{meta: &meta{TypeID: 34}} - if msg.MessageID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Source, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Message, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Payload, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 35: - msg := &ResourceEvent{meta: &meta{TypeID: 35}} - if msg.MessageID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Duration, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.TTFB, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.HeaderSize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.EncodedBodySize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.DecodedBodySize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.URL, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Type, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Success, err = ReadBoolean(reader); err != nil { - return nil, err - } - if msg.Method, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Status, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 36: - msg := &CustomEvent{meta: &meta{TypeID: 36}} - if msg.MessageID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Payload, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 37: - msg := &CSSInsertRule{meta: &meta{TypeID: 37}} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Rule, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Index, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 38: - msg := &CSSDeleteRule{meta: &meta{TypeID: 38}} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Index, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 39: - msg := &Fetch{meta: &meta{TypeID: 39}} - if msg.Method, err = ReadString(reader); err != nil { - return nil, err - } - if msg.URL, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Request, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Response, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Status, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Duration, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 40: - msg := &Profiler{meta: &meta{TypeID: 40}} - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Duration, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Args, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Result, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 41: - msg := &OTable{meta: &meta{TypeID: 41}} - if msg.Key, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 42: - msg := &StateAction{meta: &meta{TypeID: 42}} - if msg.Type, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 43: - msg := &StateActionEvent{meta: &meta{TypeID: 43}} - if msg.MessageID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Type, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 44: - msg := &Redux{meta: &meta{TypeID: 44}} - if msg.Action, err = ReadString(reader); err != nil { - return nil, err - } - if msg.State, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Duration, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 45: - msg := &Vuex{meta: &meta{TypeID: 45}} - if msg.Mutation, err = ReadString(reader); err != nil { - return nil, err - } - if msg.State, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 46: - msg := &MobX{meta: &meta{TypeID: 46}} - if msg.Type, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Payload, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 47: - msg := &NgRx{meta: &meta{TypeID: 47}} - if msg.Action, err = ReadString(reader); err != nil { - return nil, err - } - if msg.State, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Duration, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 48: - msg := &GraphQL{meta: &meta{TypeID: 48}} - if msg.OperationKind, err = ReadString(reader); err != nil { - return nil, err - } - if msg.OperationName, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Variables, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Response, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 49: - msg := &PerformanceTrack{meta: &meta{TypeID: 49}} - if msg.Frames, err = ReadInt(reader); err != nil { - return nil, err - } - if msg.Ticks, err = ReadInt(reader); err != nil { - return nil, err - } - if msg.TotalJSHeapSize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.UsedJSHeapSize, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 50: - msg := &GraphQLEvent{meta: &meta{TypeID: 50}} - if msg.MessageID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.OperationKind, err = ReadString(reader); err != nil { - return nil, err - } - if msg.OperationName, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Variables, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Response, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 51: - msg := &FetchEvent{meta: &meta{TypeID: 51}} - if msg.MessageID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Method, err = ReadString(reader); err != nil { - return nil, err - } - if msg.URL, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Request, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Response, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Status, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Duration, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 52: - msg := &DOMDrop{meta: &meta{TypeID: 52}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 53: - msg := &ResourceTiming{meta: &meta{TypeID: 53}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Duration, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.TTFB, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.HeaderSize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.EncodedBodySize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.DecodedBodySize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.URL, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Initiator, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 54: - msg := &ConnectionInformation{meta: &meta{TypeID: 54}} - if msg.Downlink, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Type, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 55: - msg := &SetPageVisibility{meta: &meta{TypeID: 55}} - if msg.hidden, err = ReadBoolean(reader); err != nil { - return nil, err - } - return msg, nil - - case 56: - msg := &PerformanceTrackAggr{meta: &meta{TypeID: 56}} - if msg.TimestampStart, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.TimestampEnd, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MinFPS, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.AvgFPS, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MaxFPS, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MinCPU, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.AvgCPU, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MaxCPU, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MinTotalJSHeapSize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.AvgTotalJSHeapSize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MaxTotalJSHeapSize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MinUsedJSHeapSize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.AvgUsedJSHeapSize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MaxUsedJSHeapSize, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 59: - msg := &LongTask{meta: &meta{TypeID: 59}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Duration, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Context, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ContainerType, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ContainerSrc, err = ReadString(reader); err != nil { - return nil, err - } - if msg.ContainerId, err = ReadString(reader); err != nil { - return nil, err - } - if msg.ContainerName, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 60: - msg := &SetNodeAttributeURLBased{meta: &meta{TypeID: 60}} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - if msg.BaseURL, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 61: - msg := &SetCSSDataURLBased{meta: &meta{TypeID: 61}} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Data, err = ReadString(reader); err != nil { - return nil, err - } - if msg.BaseURL, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 62: - msg := &IssueEvent{meta: &meta{TypeID: 62}} - if msg.MessageID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Type, err = ReadString(reader); err != nil { - return nil, err - } - if msg.ContextString, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Context, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Payload, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 63: - msg := &TechnicalInfo{meta: &meta{TypeID: 63}} - if msg.Type, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 64: - msg := &CustomIssue{meta: &meta{TypeID: 64}} - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Payload, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 65: - msg := &PageClose{meta: &meta{TypeID: 65}} - - return msg, nil - - case 66: - msg := &AssetCache{meta: &meta{TypeID: 66}} - if msg.URL, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 67: - msg := &CSSInsertRuleURLBased{meta: &meta{TypeID: 67}} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Rule, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Index, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.BaseURL, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 69: - msg := &MouseClick{meta: &meta{TypeID: 69}} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.HesitationTime, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Label, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Selector, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 70: - msg := &CreateIFrameDocument{meta: &meta{TypeID: 70}} - if msg.FrameID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 107: - msg := &IOSBatchMeta{meta: &meta{TypeID: 107}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.FirstIndex, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 90: - msg := &IOSSessionStart{meta: &meta{TypeID: 90}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ProjectID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.TrackerVersion, err = ReadString(reader); err != nil { - return nil, err - } - if msg.RevID, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserUUID, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserOS, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserOSVersion, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserDevice, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserDeviceType, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserCountry, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 91: - msg := &IOSSessionEnd{meta: &meta{TypeID: 91}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 92: - msg := &IOSMetadata{meta: &meta{TypeID: 92}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Key, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 93: - msg := &IOSCustomEvent{meta: &meta{TypeID: 93}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Payload, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 94: - msg := &IOSUserID{meta: &meta{TypeID: 94}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 95: - msg := &IOSUserAnonymousID{meta: &meta{TypeID: 95}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 96: - msg := &IOSScreenChanges{meta: &meta{TypeID: 96}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.X, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Y, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Width, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Height, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 97: - msg := &IOSCrash{meta: &meta{TypeID: 97}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Reason, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Stacktrace, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 98: - msg := &IOSScreenEnter{meta: &meta{TypeID: 98}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Title, err = ReadString(reader); err != nil { - return nil, err - } - if msg.ViewName, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 99: - msg := &IOSScreenLeave{meta: &meta{TypeID: 99}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Title, err = ReadString(reader); err != nil { - return nil, err - } - if msg.ViewName, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 100: - msg := &IOSClickEvent{meta: &meta{TypeID: 100}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Label, err = ReadString(reader); err != nil { - return nil, err - } - if msg.X, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Y, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 101: - msg := &IOSInputEvent{meta: &meta{TypeID: 101}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - if msg.ValueMasked, err = ReadBoolean(reader); err != nil { - return nil, err - } - if msg.Label, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 102: - msg := &IOSPerformanceEvent{meta: &meta{TypeID: 102}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 103: - msg := &IOSLog{meta: &meta{TypeID: 103}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Severity, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Content, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 104: - msg := &IOSInternalError{meta: &meta{TypeID: 104}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Content, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - case 105: - msg := &IOSNetworkCall{meta: &meta{TypeID: 105}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Duration, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Headers, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Body, err = ReadString(reader); err != nil { - return nil, err - } - if msg.URL, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Success, err = ReadBoolean(reader); err != nil { - return nil, err - } - if msg.Method, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Status, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 110: - msg := &IOSPerformanceAggregated{meta: &meta{TypeID: 110}} - if msg.TimestampStart, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.TimestampEnd, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MinFPS, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.AvgFPS, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MaxFPS, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MinCPU, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.AvgCPU, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MaxCPU, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MinMemory, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.AvgMemory, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MaxMemory, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MinBattery, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.AvgBattery, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MaxBattery, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, nil - - case 111: - msg := &IOSIssueEvent{meta: &meta{TypeID: 111}} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Type, err = ReadString(reader); err != nil { - return nil, err - } - if msg.ContextString, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Context, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Payload, err = ReadString(reader); err != nil { - return nil, err - } - return msg, nil - - } - return nil, fmt.Errorf("Unknown message code: %v", t) + t, err := ReadUint(reader) + if err != nil { + return nil, err + } + switch t { + + case 80: + msg := &BatchMeta{meta: &meta{TypeID: 80}} + if msg.PageNo, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.FirstIndex, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Timestamp, err = ReadInt(reader); err != nil { + return nil, err + } + return msg, nil + + case 0: + msg := &Timestamp{meta: &meta{TypeID: 0}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 1: + msg := &SessionStart{meta: &meta{TypeID: 1}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.ProjectID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.TrackerVersion, err = ReadString(reader); err != nil { + return nil, err + } + if msg.RevID, err = ReadString(reader); err != nil { + return nil, err + } + if msg.UserUUID, err = ReadString(reader); err != nil { + return nil, err + } + if msg.UserAgent, err = ReadString(reader); err != nil { + return nil, err + } + if msg.UserOS, err = ReadString(reader); err != nil { + return nil, err + } + if msg.UserOSVersion, err = ReadString(reader); err != nil { + return nil, err + } + if msg.UserBrowser, err = ReadString(reader); err != nil { + return nil, err + } + if msg.UserBrowserVersion, err = ReadString(reader); err != nil { + return nil, err + } + if msg.UserDevice, err = ReadString(reader); err != nil { + return nil, err + } + if msg.UserDeviceType, err = ReadString(reader); err != nil { + return nil, err + } + if msg.UserDeviceMemorySize, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.UserDeviceHeapSize, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.UserCountry, err = ReadString(reader); err != nil { + return nil, err + } + if msg.UserID, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 2: + msg := &SessionDisconnect{meta: &meta{TypeID: 2}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 3: + msg := &SessionEnd{meta: &meta{TypeID: 3}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 4: + msg := &SetPageLocation{meta: &meta{TypeID: 4}} + if msg.URL, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Referrer, err = ReadString(reader); err != nil { + return nil, err + } + if msg.NavigationStart, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 5: + msg := &SetViewportSize{meta: &meta{TypeID: 5}} + if msg.Width, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Height, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 6: + msg := &SetViewportScroll{meta: &meta{TypeID: 6}} + if msg.X, err = ReadInt(reader); err != nil { + return nil, err + } + if msg.Y, err = ReadInt(reader); err != nil { + return nil, err + } + return msg, nil + + case 7: + msg := &CreateDocument{meta: &meta{TypeID: 7}} + + return msg, nil + + case 8: + msg := &CreateElementNode{meta: &meta{TypeID: 8}} + if msg.ID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.ParentID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.index, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Tag, err = ReadString(reader); err != nil { + return nil, err + } + if msg.SVG, err = ReadBoolean(reader); err != nil { + return nil, err + } + return msg, nil + + case 9: + msg := &CreateTextNode{meta: &meta{TypeID: 9}} + if msg.ID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.ParentID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Index, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 10: + msg := &MoveNode{meta: &meta{TypeID: 10}} + if msg.ID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.ParentID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Index, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 11: + msg := &RemoveNode{meta: &meta{TypeID: 11}} + if msg.ID, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 12: + msg := &SetNodeAttribute{meta: &meta{TypeID: 12}} + if msg.ID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Name, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Value, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 13: + msg := &RemoveNodeAttribute{meta: &meta{TypeID: 13}} + if msg.ID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Name, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 14: + msg := &SetNodeData{meta: &meta{TypeID: 14}} + if msg.ID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Data, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 15: + msg := &SetCSSData{meta: &meta{TypeID: 15}} + if msg.ID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Data, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 16: + msg := &SetNodeScroll{meta: &meta{TypeID: 16}} + if msg.ID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.X, err = ReadInt(reader); err != nil { + return nil, err + } + if msg.Y, err = ReadInt(reader); err != nil { + return nil, err + } + return msg, nil + + case 17: + msg := &SetInputTarget{meta: &meta{TypeID: 17}} + if msg.ID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Label, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 18: + msg := &SetInputValue{meta: &meta{TypeID: 18}} + if msg.ID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Value, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Mask, err = ReadInt(reader); err != nil { + return nil, err + } + return msg, nil + + case 19: + msg := &SetInputChecked{meta: &meta{TypeID: 19}} + if msg.ID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Checked, err = ReadBoolean(reader); err != nil { + return nil, err + } + return msg, nil + + case 20: + msg := &MouseMove{meta: &meta{TypeID: 20}} + if msg.X, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Y, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 21: + msg := &MouseClickDepricated{meta: &meta{TypeID: 21}} + if msg.ID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.HesitationTime, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Label, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 22: + msg := &ConsoleLog{meta: &meta{TypeID: 22}} + if msg.Level, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Value, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 23: + msg := &PageLoadTiming{meta: &meta{TypeID: 23}} + if msg.RequestStart, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.ResponseStart, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.ResponseEnd, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.DomContentLoadedEventStart, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.DomContentLoadedEventEnd, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.LoadEventStart, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.LoadEventEnd, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.FirstPaint, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.FirstContentfulPaint, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 24: + msg := &PageRenderTiming{meta: &meta{TypeID: 24}} + if msg.SpeedIndex, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.VisuallyComplete, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.TimeToInteractive, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 25: + msg := &JSException{meta: &meta{TypeID: 25}} + if msg.Name, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Message, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Payload, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 26: + msg := &RawErrorEvent{meta: &meta{TypeID: 26}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Source, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Name, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Message, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Payload, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 27: + msg := &RawCustomEvent{meta: &meta{TypeID: 27}} + if msg.Name, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Payload, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 28: + msg := &UserID{meta: &meta{TypeID: 28}} + if msg.ID, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 29: + msg := &UserAnonymousID{meta: &meta{TypeID: 29}} + if msg.ID, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 30: + msg := &Metadata{meta: &meta{TypeID: 30}} + if msg.Key, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Value, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 31: + msg := &PageEvent{meta: &meta{TypeID: 31}} + if msg.MessageID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.URL, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Referrer, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Loaded, err = ReadBoolean(reader); err != nil { + return nil, err + } + if msg.RequestStart, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.ResponseStart, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.ResponseEnd, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.DomContentLoadedEventStart, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.DomContentLoadedEventEnd, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.LoadEventStart, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.LoadEventEnd, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.FirstPaint, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.FirstContentfulPaint, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.SpeedIndex, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.VisuallyComplete, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.TimeToInteractive, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 32: + msg := &InputEvent{meta: &meta{TypeID: 32}} + if msg.MessageID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Value, err = ReadString(reader); err != nil { + return nil, err + } + if msg.ValueMasked, err = ReadBoolean(reader); err != nil { + return nil, err + } + if msg.Label, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 33: + msg := &ClickEvent{meta: &meta{TypeID: 33}} + if msg.MessageID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.HesitationTime, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Label, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Selector, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 34: + msg := &ErrorEvent{meta: &meta{TypeID: 34}} + if msg.MessageID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Source, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Name, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Message, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Payload, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 35: + msg := &ResourceEvent{meta: &meta{TypeID: 35}} + if msg.MessageID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Duration, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.TTFB, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.HeaderSize, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.EncodedBodySize, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.DecodedBodySize, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.URL, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Type, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Success, err = ReadBoolean(reader); err != nil { + return nil, err + } + if msg.Method, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Status, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 36: + msg := &CustomEvent{meta: &meta{TypeID: 36}} + if msg.MessageID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Name, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Payload, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 37: + msg := &CSSInsertRule{meta: &meta{TypeID: 37}} + if msg.ID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Rule, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Index, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 38: + msg := &CSSDeleteRule{meta: &meta{TypeID: 38}} + if msg.ID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Index, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 39: + msg := &Fetch{meta: &meta{TypeID: 39}} + if msg.Method, err = ReadString(reader); err != nil { + return nil, err + } + if msg.URL, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Request, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Response, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Status, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Duration, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 40: + msg := &Profiler{meta: &meta{TypeID: 40}} + if msg.Name, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Duration, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Args, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Result, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 41: + msg := &OTable{meta: &meta{TypeID: 41}} + if msg.Key, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Value, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 42: + msg := &StateAction{meta: &meta{TypeID: 42}} + if msg.Type, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 43: + msg := &StateActionEvent{meta: &meta{TypeID: 43}} + if msg.MessageID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Type, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 44: + msg := &Redux{meta: &meta{TypeID: 44}} + if msg.Action, err = ReadString(reader); err != nil { + return nil, err + } + if msg.State, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Duration, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 45: + msg := &Vuex{meta: &meta{TypeID: 45}} + if msg.Mutation, err = ReadString(reader); err != nil { + return nil, err + } + if msg.State, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 46: + msg := &MobX{meta: &meta{TypeID: 46}} + if msg.Type, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Payload, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 47: + msg := &NgRx{meta: &meta{TypeID: 47}} + if msg.Action, err = ReadString(reader); err != nil { + return nil, err + } + if msg.State, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Duration, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 48: + msg := &GraphQL{meta: &meta{TypeID: 48}} + if msg.OperationKind, err = ReadString(reader); err != nil { + return nil, err + } + if msg.OperationName, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Variables, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Response, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 49: + msg := &PerformanceTrack{meta: &meta{TypeID: 49}} + if msg.Frames, err = ReadInt(reader); err != nil { + return nil, err + } + if msg.Ticks, err = ReadInt(reader); err != nil { + return nil, err + } + if msg.TotalJSHeapSize, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.UsedJSHeapSize, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 50: + msg := &GraphQLEvent{meta: &meta{TypeID: 50}} + if msg.MessageID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.OperationKind, err = ReadString(reader); err != nil { + return nil, err + } + if msg.OperationName, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Variables, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Response, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 51: + msg := &FetchEvent{meta: &meta{TypeID: 51}} + if msg.MessageID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Method, err = ReadString(reader); err != nil { + return nil, err + } + if msg.URL, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Request, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Response, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Status, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Duration, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 52: + msg := &DOMDrop{meta: &meta{TypeID: 52}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 53: + msg := &ResourceTiming{meta: &meta{TypeID: 53}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Duration, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.TTFB, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.HeaderSize, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.EncodedBodySize, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.DecodedBodySize, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.URL, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Initiator, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 54: + msg := &ConnectionInformation{meta: &meta{TypeID: 54}} + if msg.Downlink, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Type, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 55: + msg := &SetPageVisibility{meta: &meta{TypeID: 55}} + if msg.hidden, err = ReadBoolean(reader); err != nil { + return nil, err + } + return msg, nil + + case 56: + msg := &PerformanceTrackAggr{meta: &meta{TypeID: 56}} + if msg.TimestampStart, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.TimestampEnd, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.MinFPS, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.AvgFPS, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.MaxFPS, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.MinCPU, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.AvgCPU, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.MaxCPU, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.MinTotalJSHeapSize, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.AvgTotalJSHeapSize, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.MaxTotalJSHeapSize, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.MinUsedJSHeapSize, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.AvgUsedJSHeapSize, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.MaxUsedJSHeapSize, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 59: + msg := &LongTask{meta: &meta{TypeID: 59}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Duration, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Context, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.ContainerType, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.ContainerSrc, err = ReadString(reader); err != nil { + return nil, err + } + if msg.ContainerId, err = ReadString(reader); err != nil { + return nil, err + } + if msg.ContainerName, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 60: + msg := &SetNodeAttributeURLBased{meta: &meta{TypeID: 60}} + if msg.ID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Name, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Value, err = ReadString(reader); err != nil { + return nil, err + } + if msg.BaseURL, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 61: + msg := &SetCSSDataURLBased{meta: &meta{TypeID: 61}} + if msg.ID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Data, err = ReadString(reader); err != nil { + return nil, err + } + if msg.BaseURL, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 62: + msg := &IssueEvent{meta: &meta{TypeID: 62}} + if msg.MessageID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Type, err = ReadString(reader); err != nil { + return nil, err + } + if msg.ContextString, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Context, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Payload, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 63: + msg := &TechnicalInfo{meta: &meta{TypeID: 63}} + if msg.Type, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Value, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 64: + msg := &CustomIssue{meta: &meta{TypeID: 64}} + if msg.Name, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Payload, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 65: + msg := &PageClose{meta: &meta{TypeID: 65}} + + return msg, nil + + case 66: + msg := &AssetCache{meta: &meta{TypeID: 66}} + if msg.URL, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 67: + msg := &CSSInsertRuleURLBased{meta: &meta{TypeID: 67}} + if msg.ID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Rule, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Index, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.BaseURL, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 69: + msg := &MouseClick{meta: &meta{TypeID: 69}} + if msg.ID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.HesitationTime, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Label, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Selector, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 70: + msg := &CreateIFrameDocument{meta: &meta{TypeID: 70}} + if msg.FrameID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.ID, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 107: + msg := &IOSBatchMeta{meta: &meta{TypeID: 107}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Length, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.FirstIndex, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 90: + msg := &IOSSessionStart{meta: &meta{TypeID: 90}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.ProjectID, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.TrackerVersion, err = ReadString(reader); err != nil { + return nil, err + } + if msg.RevID, err = ReadString(reader); err != nil { + return nil, err + } + if msg.UserUUID, err = ReadString(reader); err != nil { + return nil, err + } + if msg.UserOS, err = ReadString(reader); err != nil { + return nil, err + } + if msg.UserOSVersion, err = ReadString(reader); err != nil { + return nil, err + } + if msg.UserDevice, err = ReadString(reader); err != nil { + return nil, err + } + if msg.UserDeviceType, err = ReadString(reader); err != nil { + return nil, err + } + if msg.UserCountry, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 91: + msg := &IOSSessionEnd{meta: &meta{TypeID: 91}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 92: + msg := &IOSMetadata{meta: &meta{TypeID: 92}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Length, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Key, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Value, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 93: + msg := &IOSCustomEvent{meta: &meta{TypeID: 93}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Length, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Name, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Payload, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 94: + msg := &IOSUserID{meta: &meta{TypeID: 94}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Length, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Value, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 95: + msg := &IOSUserAnonymousID{meta: &meta{TypeID: 95}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Length, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Value, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 96: + msg := &IOSScreenChanges{meta: &meta{TypeID: 96}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Length, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.X, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Y, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Width, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Height, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 97: + msg := &IOSCrash{meta: &meta{TypeID: 97}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Length, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Name, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Reason, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Stacktrace, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 98: + msg := &IOSScreenEnter{meta: &meta{TypeID: 98}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Length, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Title, err = ReadString(reader); err != nil { + return nil, err + } + if msg.ViewName, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 99: + msg := &IOSScreenLeave{meta: &meta{TypeID: 99}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Length, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Title, err = ReadString(reader); err != nil { + return nil, err + } + if msg.ViewName, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 100: + msg := &IOSClickEvent{meta: &meta{TypeID: 100}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Length, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Label, err = ReadString(reader); err != nil { + return nil, err + } + if msg.X, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Y, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 101: + msg := &IOSInputEvent{meta: &meta{TypeID: 101}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Length, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Value, err = ReadString(reader); err != nil { + return nil, err + } + if msg.ValueMasked, err = ReadBoolean(reader); err != nil { + return nil, err + } + if msg.Label, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 102: + msg := &IOSPerformanceEvent{meta: &meta{TypeID: 102}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Length, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Name, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Value, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 103: + msg := &IOSLog{meta: &meta{TypeID: 103}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Length, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Severity, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Content, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 104: + msg := &IOSInternalError{meta: &meta{TypeID: 104}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Length, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Content, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + case 105: + msg := &IOSNetworkCall{meta: &meta{TypeID: 105}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Length, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Duration, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Headers, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Body, err = ReadString(reader); err != nil { + return nil, err + } + if msg.URL, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Success, err = ReadBoolean(reader); err != nil { + return nil, err + } + if msg.Method, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Status, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 110: + msg := &IOSPerformanceAggregated{meta: &meta{TypeID: 110}} + if msg.TimestampStart, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.TimestampEnd, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.MinFPS, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.AvgFPS, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.MaxFPS, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.MinCPU, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.AvgCPU, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.MaxCPU, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.MinMemory, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.AvgMemory, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.MaxMemory, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.MinBattery, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.AvgBattery, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.MaxBattery, err = ReadUint(reader); err != nil { + return nil, err + } + return msg, nil + + case 111: + msg := &IOSIssueEvent{meta: &meta{TypeID: 111}} + if msg.Timestamp, err = ReadUint(reader); err != nil { + return nil, err + } + if msg.Type, err = ReadString(reader); err != nil { + return nil, err + } + if msg.ContextString, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Context, err = ReadString(reader); err != nil { + return nil, err + } + if msg.Payload, err = ReadString(reader); err != nil { + return nil, err + } + return msg, nil + + } + return nil, fmt.Errorf("Unknown message code: %v", t) } diff --git a/backend/pkg/redisstream/producer.go b/backend/pkg/redisstream/producer.go index e67200a4f..d5afc63b3 100644 --- a/backend/pkg/redisstream/producer.go +++ b/backend/pkg/redisstream/producer.go @@ -6,25 +6,24 @@ import ( "openreplay/backend/pkg/env" ) - type Producer struct { - redis *redis.Client - maxLenApprox int64 + redis *redis.Client + maxLenApprox int64 } func NewProducer() *Producer { return &Producer{ - redis: getRedisClient(), + redis: getRedisClient(), maxLenApprox: int64(env.Uint64("REDIS_STREAMS_MAX_LEN")), } } func (p *Producer) Produce(topic string, key uint64, value []byte) error { - args := &redis.XAddArgs{ + args := &redis.XAddArgs{ Stream: topic, Values: map[string]interface{}{ "sessionID": key, - "value": value, + "value": value, }, } args.MaxLenApprox = p.maxLenApprox @@ -35,7 +34,7 @@ func (p *Producer) Produce(topic string, key uint64, value []byte) error { } return nil } - + func (p *Producer) Close(_ int) { // noop } diff --git a/backend/pkg/redisstream/redis.go b/backend/pkg/redisstream/redis.go index dea4afe9b..7dba0b537 100644 --- a/backend/pkg/redisstream/redis.go +++ b/backend/pkg/redisstream/redis.go @@ -2,15 +2,13 @@ package redisstream import ( "log" - + "github.com/go-redis/redis" "openreplay/backend/pkg/env" ) - -var redisClient *redis.Client - +var redisClient *redis.Client func getRedisClient() *redis.Client { if redisClient != nil { @@ -23,4 +21,4 @@ func getRedisClient() *redis.Client { log.Fatalln(err) } return redisClient -} \ No newline at end of file +} diff --git a/backend/pkg/storage/s3.go b/backend/pkg/storage/s3.go index 0f55e3851..408dc1864 100644 --- a/backend/pkg/storage/s3.go +++ b/backend/pkg/storage/s3.go @@ -2,8 +2,8 @@ package storage import ( "io" - "strconv" "sort" + "strconv" _s3 "github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/service/s3/s3manager" @@ -12,18 +12,17 @@ import ( ) type S3 struct { - uploader *s3manager.Uploader - svc *_s3.S3 - bucket *string + uploader *s3manager.Uploader + svc *_s3.S3 + bucket *string } - func NewS3(region string, bucket string) *S3 { sess := env.AWSSessionOnRegion(region) return &S3{ uploader: s3manager.NewUploader(sess), - svc: _s3.New(sess), // AWS Docs: "These clients are safe to use concurrently." - bucket: &bucket, + svc: _s3.New(sess), // AWS Docs: "These clients are safe to use concurrently." + bucket: &bucket, } } @@ -35,14 +34,14 @@ func (s3 *S3) Upload(reader io.Reader, key string, contentType string, gzipped b contentEncoding = &gzipStr } _, err := s3.uploader.Upload(&s3manager.UploadInput{ - Body: reader, - Bucket: s3.bucket, - Key: &key, - ContentType: &contentType, - CacheControl: &cacheControl, + Body: reader, + Bucket: s3.bucket, + Key: &key, + ContentType: &contentType, + CacheControl: &cacheControl, ContentEncoding: contentEncoding, - }) - return err + }) + return err } func (s3 *S3) Get(key string) (io.ReadCloser, error) { @@ -67,8 +66,8 @@ func (s3 *S3) Exists(key string) bool { return false } - const MAX_RETURNING_COUNT = 40 + func (s3 *S3) GetFrequentlyUsedKeys(projectID uint64) ([]string, error) { prefix := strconv.FormatUint(projectID, 10) + "/" output, err := s3.svc.ListObjectsV2(&_s3.ListObjectsV2Input{ @@ -82,7 +81,7 @@ func (s3 *S3) GetFrequentlyUsedKeys(projectID uint64) ([]string, error) { list := output.Contents max := len(list) - if (max > MAX_RETURNING_COUNT) { + if max > MAX_RETURNING_COUNT { max = MAX_RETURNING_COUNT sort.Slice(list, func(i, j int) bool { return list[i].LastModified.After(*(list[j].LastModified)) @@ -91,8 +90,8 @@ func (s3 *S3) GetFrequentlyUsedKeys(projectID uint64) ([]string, error) { var keyList []string s := len(prefix) - for _, obj := range list[:max] { - keyList = append(keyList, (*obj.Key)[s:]) - } - return keyList, nil -} \ No newline at end of file + for _, obj := range list[:max] { + keyList = append(keyList, (*obj.Key)[s:]) + } + return keyList, nil +} diff --git a/backend/pkg/url/assets/css.go b/backend/pkg/url/assets/css.go index 3bd486bc7..dda8755d7 100644 --- a/backend/pkg/url/assets/css.go +++ b/backend/pkg/url/assets/css.go @@ -39,7 +39,7 @@ func unquote(str string) (string, string) { } func ExtractURLsFromCSS(css string) []string { - indexes := cssUrlsIndex(css) + indexes := cssUrlsIndex(css) urls := make([]string, len(indexes)) for _, idx := range indexes { diff --git a/backend/pkg/url/method.go b/backend/pkg/url/method.go index e7dd9eb49..31e654fde 100644 --- a/backend/pkg/url/method.go +++ b/backend/pkg/url/method.go @@ -1,12 +1,12 @@ package url -var METHODS = []string{ "GET", "HEAD", "POST" , "PUT" , "DELETE" , "CONNECT" , "OPTIONS" , "TRACE" , "PATCH" } +var METHODS = []string{"GET", "HEAD", "POST", "PUT", "DELETE", "CONNECT", "OPTIONS", "TRACE", "PATCH"} func EnsureMethod(method string) string { for _, m := range METHODS { - if m == method { - return method - } + if m == method { + return method + } } return "" -} \ No newline at end of file +} diff --git a/backend/services/assets/jsexception.go b/backend/services/assets/jsexception.go index ce5852bd5..c0b26e0db 100644 --- a/backend/services/assets/jsexception.go +++ b/backend/services/assets/jsexception.go @@ -1,16 +1,14 @@ -package main +package main import ( "encoding/json" "strings" ) - type frame struct { FileName string `json:"fileName"` } - func extractJSExceptionSources(payload *string) ([]string, error) { var frameList []frame err := json.Unmarshal([]byte(*payload), &frameList) @@ -25,8 +23,8 @@ func extractJSExceptionSources(payload *string) ([]string, error) { fn := strings.Split(f.FileName, "?")[0] if strings.HasPrefix(fn, "http") && !presentedFileName[fn] { fileNamesList = append(fileNamesList, f.FileName) - presentedFileName[fn] = true + presentedFileName[fn] = true } } return fileNamesList, nil -} \ No newline at end of file +} diff --git a/backend/services/assets/main.go b/backend/services/assets/main.go index 664dc5b09..259918395 100644 --- a/backend/services/assets/main.go +++ b/backend/services/assets/main.go @@ -66,6 +66,7 @@ func main() { os.Exit(0) case err := <-cacher.Errors: log.Printf("Error while caching: %v", err) + // TODO: notify user case <-tick: cacher.UpdateTimeouts() default: diff --git a/backend/services/db/heuristics/anr.go b/backend/services/db/heuristics/anr.go index 266f882f9..0475b00be 100644 --- a/backend/services/db/heuristics/anr.go +++ b/backend/services/db/heuristics/anr.go @@ -1,23 +1,22 @@ package heuristics import ( - . "openreplay/backend/pkg/messages" + . "openreplay/backend/pkg/messages" ) - const MIN_TIME_AFTER_LAST_HEARTBEAT = 60 * 1000 type anr struct { readyMessageStore - lastLabel string + lastLabel string lastHeartbeatTimestamp uint64 - lastHeartbeatIndex uint64 + lastHeartbeatIndex uint64 } func (h *anr) buildIf(timestamp uint64) { - if h.lastHeartbeatTimestamp != 0 && h.lastHeartbeatTimestamp + MIN_TIME_AFTER_LAST_HEARTBEAT <= timestamp { + if h.lastHeartbeatTimestamp != 0 && h.lastHeartbeatTimestamp+MIN_TIME_AFTER_LAST_HEARTBEAT <= timestamp { m := &IOSIssueEvent{ - Type: "anr", + Type: "anr", ContextString: h.lastLabel, //Context: "{}", //Payload: fmt.SPrint @@ -49,4 +48,4 @@ func (h *anr) HandleMessage(msg Message) { case *IOSSessionEnd: h.buildIf(m.Timestamp) } -} \ No newline at end of file +} diff --git a/backend/services/db/heuristics/clickrage.go b/backend/services/db/heuristics/clickrage.go index 4dc86ee65..9a1db92d5 100644 --- a/backend/services/db/heuristics/clickrage.go +++ b/backend/services/db/heuristics/clickrage.go @@ -1,26 +1,25 @@ package heuristics import ( - . "openreplay/backend/pkg/messages" + . "openreplay/backend/pkg/messages" ) - const CLICK_TIME_DIFF = 200 const MIN_CLICKS_IN_A_ROW = 3 type clickrage struct { readyMessageStore - lastTimestamp uint64 - lastLabel string + lastTimestamp uint64 + lastLabel string firstInARawTimestamp uint64 - firstInARawSeqIndex uint64 - countsInARow int + firstInARawSeqIndex uint64 + countsInARow int } func (h *clickrage) build() { if h.countsInARow >= MIN_CLICKS_IN_A_ROW { m := &IOSIssueEvent{ - Type: "click_rage", + Type: "click_rage", ContextString: h.lastLabel, //Context: "{}", //Payload: fmt.SPrint @@ -39,7 +38,7 @@ func (h *clickrage) build() { func (h *clickrage) HandleMessage(msg Message) { switch m := msg.(type) { case *IOSClickEvent: - if h.lastTimestamp + CLICK_TIME_DIFF < m.Timestamp && h.lastLabel == m.Label { + if h.lastTimestamp+CLICK_TIME_DIFF < m.Timestamp && h.lastLabel == m.Label { h.lastTimestamp = m.Timestamp h.countsInARow += 1 return @@ -55,4 +54,4 @@ func (h *clickrage) HandleMessage(msg Message) { case *IOSSessionEnd: h.build() } -} \ No newline at end of file +} diff --git a/backend/services/db/heuristics/heuristics.go b/backend/services/db/heuristics/heuristics.go index 7832e0a82..677574951 100644 --- a/backend/services/db/heuristics/heuristics.go +++ b/backend/services/db/heuristics/heuristics.go @@ -1,8 +1,8 @@ package heuristics import ( - . "openreplay/backend/pkg/messages" - . "openreplay/backend/pkg/db/types" + . "openreplay/backend/pkg/db/types" + . "openreplay/backend/pkg/messages" ) type MessageHandler interface { @@ -19,7 +19,6 @@ type Handler interface { type mainHandler map[uint64]*sessHandler - func NewHandler() mainHandler { return make(mainHandler) } @@ -43,8 +42,10 @@ func (m mainHandler) HandleMessage(session *Session, msg Message) { } func (m mainHandler) IterateSessionReadyMessages(sessionID uint64, iter func(msg Message)) { - s, ok := m[ sessionID ] - if !ok { return } + s, ok := m[sessionID] + if !ok { + return + } s.IterateReadyMessages(iter) if s.IsEnded() { delete(m, sessionID) @@ -61,5 +62,3 @@ func (m mainHandler) IterateReadyMessages(iter func(sessionID uint64, msg Messag } } } - - diff --git a/backend/services/db/heuristics/performance.go b/backend/services/db/heuristics/performance.go index 931d831e6..c7494a793 100644 --- a/backend/services/db/heuristics/performance.go +++ b/backend/services/db/heuristics/performance.go @@ -1,31 +1,30 @@ package heuristics import ( - . "openreplay/backend/pkg/messages" + . "openreplay/backend/pkg/messages" ) - const AGGR_TIME = 15 * 60 * 1000 - type valueAggregator struct { - sum float64 + sum float64 count float64 } + func (va *valueAggregator) aggregate() uint64 { if va.count == 0 { return 0 } - return uint64(va.sum/va.count) + return uint64(va.sum / va.count) } type performanceAggregator struct { readyMessageStore - pa *IOSPerformanceAggregated - fps valueAggregator - cpu valueAggregator - memory valueAggregator - battery valueAggregator + pa *IOSPerformanceAggregated + fps valueAggregator + cpu valueAggregator + memory valueAggregator + battery valueAggregator } func (h *performanceAggregator) build(timestamp uint64) { @@ -56,7 +55,7 @@ func (h *performanceAggregator) HandleMessage(msg Message) { if h.pa.TimestampStart == 0 { h.pa.TimestampStart = m.Timestamp } - if h.pa.TimestampStart + AGGR_TIME <= m.Timestamp { + if h.pa.TimestampStart+AGGR_TIME <= m.Timestamp { h.build(m.Timestamp) } switch m.Name { @@ -96,8 +95,8 @@ func (h *performanceAggregator) HandleMessage(msg Message) { if m.Value > h.pa.MaxBattery { h.pa.MaxBattery = m.Value } - } + } case *IOSSessionEnd: h.build(m.Timestamp) } -} \ No newline at end of file +} diff --git a/backend/services/db/heuristics/readyMessageStore.go b/backend/services/db/heuristics/readyMessageStore.go index 9c619e20b..bbe77585d 100644 --- a/backend/services/db/heuristics/readyMessageStore.go +++ b/backend/services/db/heuristics/readyMessageStore.go @@ -1,10 +1,9 @@ package heuristics import ( - . "openreplay/backend/pkg/messages" + . "openreplay/backend/pkg/messages" ) - type readyMessageStore struct { store []Message } @@ -18,4 +17,4 @@ func (s *readyMessageStore) IterateReadyMessages(cb func(msg Message)) { cb(msg) } s.store = nil -} \ No newline at end of file +} diff --git a/backend/services/db/heuristics/session.go b/backend/services/db/heuristics/session.go index d828ca478..3946bf918 100644 --- a/backend/services/db/heuristics/session.go +++ b/backend/services/db/heuristics/session.go @@ -1,18 +1,16 @@ package heuristics import ( - . "openreplay/backend/pkg/messages" - . "openreplay/backend/pkg/db/types" + . "openreplay/backend/pkg/db/types" + . "openreplay/backend/pkg/messages" ) - type sessHandler struct { - session *Session + session *Session handlers []Handler - ended bool + ended bool } - func newSessHandler(session *Session) *sessHandler { return &sessHandler{ session: session, @@ -44,4 +42,4 @@ func (s *sessHandler) IterateReadyMessages(cb func(msg Message)) { func (s *sessHandler) IsEnded() bool { return s.ended -} \ No newline at end of file +} diff --git a/backend/services/db/stats.go b/backend/services/db/stats.go index 81abf1b91..2c3a5da38 100644 --- a/backend/services/db/stats.go +++ b/backend/services/db/stats.go @@ -1,25 +1,23 @@ package main import ( - - . "openreplay/backend/pkg/messages" . "openreplay/backend/pkg/db/types" + . "openreplay/backend/pkg/messages" ) func initStats() { - // noop + // noop } - func insertStats(session *Session, msg Message) error { switch m := msg.(type) { - // Web - case *PerformanceTrackAggr: - return pg.InsertWebStatsPerformance(session.SessionID, m) - case *ResourceEvent: - return pg.InsertWebStatsResourceEvent(session.SessionID, m) - case *LongTask: - return pg.InsertWebStatsLongtask(session.SessionID, m) + // Web + case *PerformanceTrackAggr: + return pg.InsertWebStatsPerformance(session.SessionID, m) + case *ResourceEvent: + return pg.InsertWebStatsResourceEvent(session.SessionID, m) + case *LongTask: + return pg.InsertWebStatsLongtask(session.SessionID, m) // IOS // case *IOSPerformanceAggregated: diff --git a/backend/services/ender/builder/builderMap.go b/backend/services/ender/builder/builderMap.go index 6ab3c3ac7..3f3e4d6e3 100644 --- a/backend/services/ender/builder/builderMap.go +++ b/backend/services/ender/builder/builderMap.go @@ -6,7 +6,6 @@ import ( type builderMap map[uint64]*builder - func NewBuilderMap() builderMap { return make(builderMap) } @@ -28,8 +27,10 @@ func (m builderMap) HandleMessage(sessionID uint64, msg Message, messageID uint6 } func (m builderMap) IterateSessionReadyMessages(sessionID uint64, operatingTs int64, iter func(msg Message)) { - b, ok := m[ sessionID ] - if !ok { return } + b, ok := m[sessionID] + if !ok { + return + } sessionEnded := b.checkTimeouts(operatingTs) b.iterateReadyMessage(iter) if sessionEnded { @@ -48,5 +49,3 @@ func (m builderMap) IterateReadyMessages(operatingTs int64, iter func(sessionID } } } - - diff --git a/backend/services/ender/builder/clikRageDetector.go b/backend/services/ender/builder/clikRageDetector.go index 116d57071..f25efbcd9 100644 --- a/backend/services/ender/builder/clikRageDetector.go +++ b/backend/services/ender/builder/clikRageDetector.go @@ -1,34 +1,32 @@ package builder import ( - "encoding/json" + "encoding/json" . "openreplay/backend/pkg/messages" ) - const CLICK_TIME_DIFF = 300 const MIN_CLICKS_IN_A_ROW = 3 type clickRageDetector struct { - lastTimestamp uint64 - lastLabel string + lastTimestamp uint64 + lastLabel string firstInARawTimestamp uint64 firstInARawMessageId uint64 - countsInARow int + countsInARow int } - func (crd *clickRageDetector) Build() *IssueEvent { var i *IssueEvent if crd.countsInARow >= MIN_CLICKS_IN_A_ROW { - payload, _ := json.Marshal(struct{Count int }{crd.countsInARow,}) + payload, _ := json.Marshal(struct{ Count int }{crd.countsInARow}) i = &IssueEvent{ - Type: "click_rage", + Type: "click_rage", ContextString: crd.lastLabel, - Payload: string(payload), // TODO: json encoder - Timestamp: crd.firstInARawTimestamp, - MessageID: crd.firstInARawMessageId, + Payload: string(payload), // TODO: json encoder + Timestamp: crd.firstInARawTimestamp, + MessageID: crd.firstInARawMessageId, } } crd.lastTimestamp = 0 @@ -39,8 +37,8 @@ func (crd *clickRageDetector) Build() *IssueEvent { return i } -func (crd *clickRageDetector) HandleMouseClick(msg *MouseClick, messageID uint64, timestamp uint64) *IssueEvent { - if crd.lastTimestamp + CLICK_TIME_DIFF > timestamp && crd.lastLabel == msg.Label { +func (crd *clickRageDetector) HandleMouseClick(msg *MouseClick, messageID uint64, timestamp uint64) *IssueEvent { + if crd.lastTimestamp+CLICK_TIME_DIFF > timestamp && crd.lastLabel == msg.Label { crd.lastTimestamp = timestamp crd.countsInARow += 1 return nil @@ -54,4 +52,4 @@ func (crd *clickRageDetector) HandleMouseClick(msg *MouseClick, messageID uint6 crd.countsInARow = 1 } return i -} \ No newline at end of file +} diff --git a/backend/services/ender/builder/cpuIssueFinder.go b/backend/services/ender/builder/cpuIssueFinder.go index be02c280f..1af867ea3 100644 --- a/backend/services/ender/builder/cpuIssueFinder.go +++ b/backend/services/ender/builder/cpuIssueFinder.go @@ -3,20 +3,19 @@ package builder import ( "encoding/json" - "openreplay/backend/pkg/messages/performance" . "openreplay/backend/pkg/messages" + "openreplay/backend/pkg/messages/performance" ) -const CPU_THRESHOLD = 70 // % out of 100 +const CPU_THRESHOLD = 70 // % out of 100 const CPU_MIN_DURATION_TRIGGER = 6 * 1000 - type cpuIssueFinder struct { startTimestamp uint64 startMessageID uint64 - lastTimestamp uint64 - maxRate uint64 - contextString string + lastTimestamp uint64 + maxRate uint64 + contextString string } func (f *cpuIssueFinder) Build() *IssueEvent { @@ -35,16 +34,16 @@ func (f *cpuIssueFinder) Build() *IssueEvent { return nil } - payload, _ := json.Marshal(struct{ + payload, _ := json.Marshal(struct { Duration uint64 - Rate uint64 - }{duration,maxRate}) + Rate uint64 + }{duration, maxRate}) return &IssueEvent{ - Type: "cpu", - Timestamp: timestamp, - MessageID: messageID, + Type: "cpu", + Timestamp: timestamp, + MessageID: messageID, ContextString: f.contextString, - Payload: string(payload), + Payload: string(payload), } } @@ -52,8 +51,6 @@ func (f *cpuIssueFinder) HandleSetPageLocation(msg *SetPageLocation) { f.contextString = msg.URL } - - func (f *cpuIssueFinder) HandlePerformanceTrack(msg *PerformanceTrack, messageID uint64, timestamp uint64) *IssueEvent { dt := performance.TimeDiff(timestamp, f.lastTimestamp) if dt == 0 { @@ -82,5 +79,3 @@ func (f *cpuIssueFinder) HandlePerformanceTrack(msg *PerformanceTrack, messageID return nil } - - diff --git a/backend/services/ender/builder/deadClickDetector.go b/backend/services/ender/builder/deadClickDetector.go index 725b025cb..de977b7bd 100644 --- a/backend/services/ender/builder/deadClickDetector.go +++ b/backend/services/ender/builder/deadClickDetector.go @@ -4,25 +4,23 @@ import ( . "openreplay/backend/pkg/messages" ) - const CLICK_RELATION_TIME = 1400 type deadClickDetector struct { - lastMouseClick *MouseClick - lastTimestamp uint64 - lastMessageID uint64 - inputIDSet map[uint64]bool + lastMouseClick *MouseClick + lastTimestamp uint64 + lastMessageID uint64 + inputIDSet map[uint64]bool } - func (d *deadClickDetector) HandleReaction(timestamp uint64) *IssueEvent { var i *IssueEvent - if d.lastMouseClick != nil && d.lastTimestamp + CLICK_RELATION_TIME < timestamp { + if d.lastMouseClick != nil && d.lastTimestamp+CLICK_RELATION_TIME < timestamp { i = &IssueEvent{ - Type: "dead_click", + Type: "dead_click", ContextString: d.lastMouseClick.Label, - Timestamp: d.lastTimestamp, - MessageID: d.lastMessageID, + Timestamp: d.lastTimestamp, + MessageID: d.lastMessageID, } } d.inputIDSet = nil @@ -53,8 +51,8 @@ func (d *deadClickDetector) HandleMessage(msg Message, messageID uint64, timesta d.lastMouseClick = m d.lastTimestamp = timestamp d.lastMessageID = messageID - case *SetNodeAttribute, - *RemoveNodeAttribute, + case *SetNodeAttribute, + *RemoveNodeAttribute, *CreateElementNode, *CreateTextNode, *MoveNode, @@ -66,5 +64,3 @@ func (d *deadClickDetector) HandleMessage(msg Message, messageID uint64, timesta } return i } - - diff --git a/backend/services/ender/builder/domDropDetector.go b/backend/services/ender/builder/domDropDetector.go index 3366a0163..3643038c1 100644 --- a/backend/services/ender/builder/domDropDetector.go +++ b/backend/services/ender/builder/domDropDetector.go @@ -4,14 +4,13 @@ import ( . "openreplay/backend/pkg/messages" ) - type domDropDetector struct { - removedCount int + removedCount int lastDropTimestamp uint64 } -const DROP_WINDOW = 200 //ms -const CRITICAL_COUNT = 1 // Our login page contains 20. But on crush it removes only roots (1-3 nodes). +const DROP_WINDOW = 200 //ms +const CRITICAL_COUNT = 1 // Our login page contains 20. But on crush it removes only roots (1-3 nodes). func (dd *domDropDetector) HandleNodeCreation() { dd.removedCount = 0 @@ -19,7 +18,7 @@ func (dd *domDropDetector) HandleNodeCreation() { } func (dd *domDropDetector) HandleNodeRemoval(ts uint64) { - if dd.lastDropTimestamp + DROP_WINDOW > ts { + if dd.lastDropTimestamp+DROP_WINDOW > ts { dd.removedCount += 1 } else { dd.removedCount = 1 @@ -27,7 +26,6 @@ func (dd *domDropDetector) HandleNodeRemoval(ts uint64) { dd.lastDropTimestamp = ts } - func (dd *domDropDetector) Build() *DOMDrop { var domDrop *DOMDrop if dd.removedCount >= CRITICAL_COUNT { @@ -39,4 +37,3 @@ func (dd *domDropDetector) Build() *DOMDrop { dd.lastDropTimestamp = 0 return domDrop } - diff --git a/backend/services/ender/builder/inputEventBuilder.go b/backend/services/ender/builder/inputEventBuilder.go index 98c7ebaf6..ce1b710ca 100644 --- a/backend/services/ender/builder/inputEventBuilder.go +++ b/backend/services/ender/builder/inputEventBuilder.go @@ -7,9 +7,9 @@ import ( type inputLabels map[uint64]string type inputEventBuilder struct { - inputEvent *InputEvent - inputLabels inputLabels - inputID uint64 + inputEvent *InputEvent + inputLabels inputLabels + inputID uint64 } func NewInputEventBuilder() *inputEventBuilder { @@ -18,7 +18,6 @@ func NewInputEventBuilder() *inputEventBuilder { return ieBuilder } - func (b *inputEventBuilder) ClearLabels() { b.inputLabels = make(inputLabels) } @@ -57,11 +56,11 @@ func (b *inputEventBuilder) HasInstance() bool { return b.inputEvent != nil } -func (b * inputEventBuilder) GetTimestamp() uint64 { +func (b *inputEventBuilder) GetTimestamp() uint64 { if b.inputEvent == nil { return 0 } - return b.inputEvent.Timestamp; + return b.inputEvent.Timestamp } func (b *inputEventBuilder) Build() *InputEvent { diff --git a/backend/services/ender/builder/memoryIssueFinder.go b/backend/services/ender/builder/memoryIssueFinder.go index a2702e505..0d6d71420 100644 --- a/backend/services/ender/builder/memoryIssueFinder.go +++ b/backend/services/ender/builder/memoryIssueFinder.go @@ -1,21 +1,21 @@ package builder import ( - "math" "encoding/json" - + "math" + . "openreplay/backend/pkg/messages" ) const MIN_COUNT = 3 -const MEM_RATE_THRESHOLD = 300 // % to average +const MEM_RATE_THRESHOLD = 300 // % to average type memoryIssueFinder struct { startMessageID uint64 startTimestamp uint64 rate int count float64 - sum float64 + sum float64 contextString string } @@ -23,13 +23,13 @@ func (f *memoryIssueFinder) Build() *IssueEvent { if f.startTimestamp == 0 { return nil } - payload, _ := json.Marshal(struct{Rate int }{f.rate - 100,}) + payload, _ := json.Marshal(struct{ Rate int }{f.rate - 100}) i := &IssueEvent{ - Type: "memory", - Timestamp: f.startTimestamp, - MessageID: f.startMessageID, + Type: "memory", + Timestamp: f.startTimestamp, + MessageID: f.startMessageID, ContextString: f.contextString, - Payload: string(payload), + Payload: string(payload), } f.startTimestamp = 0 f.startMessageID = 0 @@ -48,8 +48,8 @@ func (f *memoryIssueFinder) HandlePerformanceTrack(msg *PerformanceTrack, messag return nil } - average := f.sum/f.count - rate := int(math.Round(float64(msg.UsedJSHeapSize)/average * 100)) + average := f.sum / f.count + rate := int(math.Round(float64(msg.UsedJSHeapSize) / average * 100)) f.sum += float64(msg.UsedJSHeapSize) f.count++ @@ -68,5 +68,3 @@ func (f *memoryIssueFinder) HandlePerformanceTrack(msg *PerformanceTrack, messag return nil } - - diff --git a/backend/services/ender/builder/pageEventBuilder.go b/backend/services/ender/builder/pageEventBuilder.go index db602a996..2b0665894 100644 --- a/backend/services/ender/builder/pageEventBuilder.go +++ b/backend/services/ender/builder/pageEventBuilder.go @@ -5,8 +5,8 @@ import ( ) type pageEventBuilder struct { - pageEvent *PageEvent - firstTimingHandled bool + pageEvent *PageEvent + firstTimingHandled bool } func (b *pageEventBuilder) buildIfTimingsComplete() *PageEvent { @@ -28,7 +28,7 @@ func (b *pageEventBuilder) HandleSetPageLocation(msg *SetPageLocation, messageID } } -func (b * pageEventBuilder) HandlePageLoadTiming(msg *PageLoadTiming) *PageEvent { +func (b *pageEventBuilder) HandlePageLoadTiming(msg *PageLoadTiming) *PageEvent { if !b.HasInstance() { return nil } @@ -62,7 +62,7 @@ func (b * pageEventBuilder) HandlePageLoadTiming(msg *PageLoadTiming) *PageEvent return b.buildIfTimingsComplete() } -func (b * pageEventBuilder) HandlePageRenderTiming(msg *PageRenderTiming) *PageEvent { +func (b *pageEventBuilder) HandlePageRenderTiming(msg *PageRenderTiming) *PageEvent { if !b.HasInstance() { return nil } @@ -76,16 +76,16 @@ func (b *pageEventBuilder) HasInstance() bool { return b.pageEvent != nil } -func (b * pageEventBuilder) GetTimestamp() uint64 { +func (b *pageEventBuilder) GetTimestamp() uint64 { if b.pageEvent == nil { return 0 } - return b.pageEvent.Timestamp; + return b.pageEvent.Timestamp } -func (b * pageEventBuilder) Build() *PageEvent { +func (b *pageEventBuilder) Build() *PageEvent { pageEvent := b.pageEvent b.pageEvent = nil b.firstTimingHandled = false return pageEvent -} \ No newline at end of file +} diff --git a/backend/services/ender/builder/performanceTrackAggrBuilder.go b/backend/services/ender/builder/performanceTrackAggrBuilder.go index b24090ff9..70b751f55 100644 --- a/backend/services/ender/builder/performanceTrackAggrBuilder.go +++ b/backend/services/ender/builder/performanceTrackAggrBuilder.go @@ -3,22 +3,20 @@ package builder import ( "math" - "openreplay/backend/pkg/messages/performance" . "openreplay/backend/pkg/messages" + "openreplay/backend/pkg/messages/performance" ) - type performanceTrackAggrBuilder struct { - performanceTrackAggr *PerformanceTrackAggr - lastTimestamp uint64 - count float64 - sumFrameRate float64 - sumTickRate float64 - sumTotalJSHeapSize float64 - sumUsedJSHeapSize float64 + performanceTrackAggr *PerformanceTrackAggr + lastTimestamp uint64 + count float64 + sumFrameRate float64 + sumTickRate float64 + sumTotalJSHeapSize float64 + sumUsedJSHeapSize float64 } - func (b *performanceTrackAggrBuilder) start(timestamp uint64) { b.performanceTrackAggr = &PerformanceTrackAggr{ TimestampStart: timestamp, @@ -39,7 +37,7 @@ func (b *performanceTrackAggrBuilder) HandlePerformanceTrack(msg *PerformanceTra } frameRate := performance.FrameRate(msg.Frames, dt) - tickRate := performance.TickRate(msg.Ticks, dt) + tickRate := performance.TickRate(msg.Ticks, dt) fps := uint64(math.Round(frameRate)) cpu := performance.CPURateFromTickRate(tickRate) @@ -84,7 +82,7 @@ func (b *performanceTrackAggrBuilder) GetStartTimestamp() uint64 { if b.performanceTrackAggr == nil { return 0 } - return b.performanceTrackAggr.TimestampStart; + return b.performanceTrackAggr.TimestampStart } func (b *performanceTrackAggrBuilder) Build() *PerformanceTrackAggr { @@ -106,4 +104,3 @@ func (b *performanceTrackAggrBuilder) Build() *PerformanceTrackAggr { b.lastTimestamp = 0 return performanceTrackAggr } - diff --git a/backend/services/http/assets.go b/backend/services/http/assets.go index cc055087a..b6ac61186 100644 --- a/backend/services/http/assets.go +++ b/backend/services/http/assets.go @@ -1,8 +1,8 @@ package main import ( - "openreplay/backend/pkg/url/assets" "openreplay/backend/pkg/messages" + "openreplay/backend/pkg/url/assets" ) func sendAssetForCache(sessionID uint64, baseURL string, relativeURL string) { @@ -33,4 +33,4 @@ func handleCSS(sessionID uint64, baseURL string, css string) string { return rewriter.RewriteCSS(sessionID, baseURL, css) } return assets.ResolveCSS(baseURL, css) -} \ No newline at end of file +} diff --git a/backend/services/http/handlers-depricated.go b/backend/services/http/handlers-depricated.go index 85f0393b7..06ab7d0f9 100644 --- a/backend/services/http/handlers-depricated.go +++ b/backend/services/http/handlers-depricated.go @@ -1 +1 @@ -package main \ No newline at end of file +package main diff --git a/backend/services/http/ios-device.go b/backend/services/http/ios-device.go index bec1f3b36..6a09e5e07 100644 --- a/backend/services/http/ios-device.go +++ b/backend/services/http/ios-device.go @@ -1,138 +1,138 @@ package main import ( - "strings" + "strings" ) func MapIOSDevice(identifier string) string { - switch identifier { - case "iPod5,1": - return "iPod touch (5th generation)" - case "iPod7,1": - return "iPod touch (6th generation)" - case "iPod9,1": - return "iPod touch (7th generation)" - case "iPhone3,1", "iPhone3,2", "iPhone3,3": - return "iPhone 4" - case "iPhone4,1": - return "iPhone 4s" - case "iPhone5,1", "iPhone5,2": - return "iPhone 5" - case "iPhone5,3", "iPhone5,4": - return "iPhone 5c" - case "iPhone6,1", "iPhone6,2": - return "iPhone 5s" - case "iPhone7,2": - return "iPhone 6" - case "iPhone7,1": - return "iPhone 6 Plus" - case "iPhone8,1": - return "iPhone 6s" - case "iPhone8,2": - return "iPhone 6s Plus" - case "iPhone8,4": - return "iPhone SE" - case "iPhone9,1", "iPhone9,3": - return "iPhone 7" - case "iPhone9,2", "iPhone9,4": - return "iPhone 7 Plus" - case "iPhone10,1", "iPhone10,4": - return "iPhone 8" - case "iPhone10,2", "iPhone10,5": - return "iPhone 8 Plus" - case "iPhone10,3", "iPhone10,6": - return "iPhone X" - case "iPhone11,2": - return "iPhone XS" - case "iPhone11,4", "iPhone11,6": - return "iPhone XS Max" - case "iPhone11,8": - return "iPhone XR" - case "iPhone12,1": - return "iPhone 11" - case "iPhone12,3": - return "iPhone 11 Pro" - case "iPhone12,5": - return "iPhone 11 Pro Max" - case "iPhone12,8": - return "iPhone SE (2nd generation)" - case "iPhone13,1": - return "iPhone 12 mini" - case "iPhone13,2": - return "iPhone 12" - case "iPhone13,3": - return "iPhone 12 Pro" - case "iPhone13,4": - return "iPhone 12 Pro Max" - case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4": - return "iPad 2" - case "iPad3,1", "iPad3,2", "iPad3,3": - return "iPad (3rd generation)" - case "iPad3,4", "iPad3,5", "iPad3,6": - return "iPad (4th generation)" - case "iPad6,11", "iPad6,12": - return "iPad (5th generation)" - case "iPad7,5", "iPad7,6": - return "iPad (6th generation)" - case "iPad7,11", "iPad7,12": - return "iPad (7th generation)" - case "iPad11,6", "iPad11,7": - return "iPad (8th generation)" - case "iPad4,1", "iPad4,2", "iPad4,3": - return "iPad Air" - case "iPad5,3", "iPad5,4": - return "iPad Air 2" - case "iPad11,3", "iPad11,4": - return "iPad Air (3rd generation)" - case "iPad13,1", "iPad13,2": - return "iPad Air (4th generation)" - case "iPad2,5", "iPad2,6", "iPad2,7": - return "iPad mini" - case "iPad4,4", "iPad4,5", "iPad4,6": - return "iPad mini 2" - case "iPad4,7", "iPad4,8", "iPad4,9": - return "iPad mini 3" - case "iPad5,1", "iPad5,2": - return "iPad mini 4" - case "iPad11,1", "iPad11,2": - return "iPad mini (5th generation)" - case "iPad6,3", "iPad6,4": - return "iPad Pro (9.7-inch)" - case "iPad7,3", "iPad7,4": - return "iPad Pro (10.5-inch)" - case "iPad8,1", "iPad8,2", "iPad8,3", "iPad8,4": - return "iPad Pro (11-inch) (1st generation)" - case "iPad8,9", "iPad8,10": - return "iPad Pro (11-inch) (2nd generation)" - case "iPad6,7", "iPad6,8": - return "iPad Pro (12.9-inch) (1st generation)" - case "iPad7,1", "iPad7,2": - return "iPad Pro (12.9-inch) (2nd generation)" - case "iPad8,5", "iPad8,6", "iPad8,7", "iPad8,8": - return "iPad Pro (12.9-inch) (3rd generation)" - case "iPad8,11", "iPad8,12": - return "iPad Pro (12.9-inch) (4th generation)" - case "AppleTV5,3": - return "Apple TV" - case "AppleTV6,2": - return "Apple TV 4K" - case "AudioAccessory1,1": - return "HomePod" - case "AudioAccessory5,1": - return "HomePod mini" - case "i386", "x86_64": - return "Simulator" - default: - return identifier - } + switch identifier { + case "iPod5,1": + return "iPod touch (5th generation)" + case "iPod7,1": + return "iPod touch (6th generation)" + case "iPod9,1": + return "iPod touch (7th generation)" + case "iPhone3,1", "iPhone3,2", "iPhone3,3": + return "iPhone 4" + case "iPhone4,1": + return "iPhone 4s" + case "iPhone5,1", "iPhone5,2": + return "iPhone 5" + case "iPhone5,3", "iPhone5,4": + return "iPhone 5c" + case "iPhone6,1", "iPhone6,2": + return "iPhone 5s" + case "iPhone7,2": + return "iPhone 6" + case "iPhone7,1": + return "iPhone 6 Plus" + case "iPhone8,1": + return "iPhone 6s" + case "iPhone8,2": + return "iPhone 6s Plus" + case "iPhone8,4": + return "iPhone SE" + case "iPhone9,1", "iPhone9,3": + return "iPhone 7" + case "iPhone9,2", "iPhone9,4": + return "iPhone 7 Plus" + case "iPhone10,1", "iPhone10,4": + return "iPhone 8" + case "iPhone10,2", "iPhone10,5": + return "iPhone 8 Plus" + case "iPhone10,3", "iPhone10,6": + return "iPhone X" + case "iPhone11,2": + return "iPhone XS" + case "iPhone11,4", "iPhone11,6": + return "iPhone XS Max" + case "iPhone11,8": + return "iPhone XR" + case "iPhone12,1": + return "iPhone 11" + case "iPhone12,3": + return "iPhone 11 Pro" + case "iPhone12,5": + return "iPhone 11 Pro Max" + case "iPhone12,8": + return "iPhone SE (2nd generation)" + case "iPhone13,1": + return "iPhone 12 mini" + case "iPhone13,2": + return "iPhone 12" + case "iPhone13,3": + return "iPhone 12 Pro" + case "iPhone13,4": + return "iPhone 12 Pro Max" + case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4": + return "iPad 2" + case "iPad3,1", "iPad3,2", "iPad3,3": + return "iPad (3rd generation)" + case "iPad3,4", "iPad3,5", "iPad3,6": + return "iPad (4th generation)" + case "iPad6,11", "iPad6,12": + return "iPad (5th generation)" + case "iPad7,5", "iPad7,6": + return "iPad (6th generation)" + case "iPad7,11", "iPad7,12": + return "iPad (7th generation)" + case "iPad11,6", "iPad11,7": + return "iPad (8th generation)" + case "iPad4,1", "iPad4,2", "iPad4,3": + return "iPad Air" + case "iPad5,3", "iPad5,4": + return "iPad Air 2" + case "iPad11,3", "iPad11,4": + return "iPad Air (3rd generation)" + case "iPad13,1", "iPad13,2": + return "iPad Air (4th generation)" + case "iPad2,5", "iPad2,6", "iPad2,7": + return "iPad mini" + case "iPad4,4", "iPad4,5", "iPad4,6": + return "iPad mini 2" + case "iPad4,7", "iPad4,8", "iPad4,9": + return "iPad mini 3" + case "iPad5,1", "iPad5,2": + return "iPad mini 4" + case "iPad11,1", "iPad11,2": + return "iPad mini (5th generation)" + case "iPad6,3", "iPad6,4": + return "iPad Pro (9.7-inch)" + case "iPad7,3", "iPad7,4": + return "iPad Pro (10.5-inch)" + case "iPad8,1", "iPad8,2", "iPad8,3", "iPad8,4": + return "iPad Pro (11-inch) (1st generation)" + case "iPad8,9", "iPad8,10": + return "iPad Pro (11-inch) (2nd generation)" + case "iPad6,7", "iPad6,8": + return "iPad Pro (12.9-inch) (1st generation)" + case "iPad7,1", "iPad7,2": + return "iPad Pro (12.9-inch) (2nd generation)" + case "iPad8,5", "iPad8,6", "iPad8,7", "iPad8,8": + return "iPad Pro (12.9-inch) (3rd generation)" + case "iPad8,11", "iPad8,12": + return "iPad Pro (12.9-inch) (4th generation)" + case "AppleTV5,3": + return "Apple TV" + case "AppleTV6,2": + return "Apple TV 4K" + case "AudioAccessory1,1": + return "HomePod" + case "AudioAccessory5,1": + return "HomePod mini" + case "i386", "x86_64": + return "Simulator" + default: + return identifier + } } func GetIOSDeviceType(identifier string) string { - if strings.Contains(identifier, "iPhone") { - return "mobile" //"phone" - } - if strings.Contains(identifier, "iPad") { - return "tablet" - } - return "other" + if strings.Contains(identifier, "iPhone") { + return "mobile" //"phone" + } + if strings.Contains(identifier, "iPad") { + return "tablet" + } + return "other" } diff --git a/backend/services/http/uuid.go b/backend/services/http/uuid.go index 13f57bff0..87704d740 100644 --- a/backend/services/http/uuid.go +++ b/backend/services/http/uuid.go @@ -12,4 +12,4 @@ func getUUID(u *string) string { } } return uuid.New().String() -} \ No newline at end of file +} diff --git a/backend/services/integrations/clientManager/manager.go b/backend/services/integrations/clientManager/manager.go index 39cd8dd90..a671a6266 100644 --- a/backend/services/integrations/clientManager/manager.go +++ b/backend/services/integrations/clientManager/manager.go @@ -7,38 +7,36 @@ import ( "openreplay/backend/services/integrations/integration" ) - type manager struct { - clientMap integration.ClientMap - Events chan *integration.SessionErrorEvent - Errors chan error - RequestDataUpdates chan postgres.Integration // not pointer because it could change in other thread + clientMap integration.ClientMap + Events chan *integration.SessionErrorEvent + Errors chan error + RequestDataUpdates chan postgres.Integration // not pointer because it could change in other thread } - func NewManager() *manager { - return &manager { - clientMap: make(integration.ClientMap), + return &manager{ + clientMap: make(integration.ClientMap), RequestDataUpdates: make(chan postgres.Integration, 100), - Events: make(chan *integration.SessionErrorEvent, 100), - Errors: make(chan error, 100), + Events: make(chan *integration.SessionErrorEvent, 100), + Errors: make(chan error, 100), } } -func (m* manager) Update(i *postgres.Integration) error { +func (m *manager) Update(i *postgres.Integration) error { key := strconv.Itoa(int(i.ProjectID)) + i.Provider if i.Options == nil { delete(m.clientMap, key) return nil } - c, exists := m.clientMap[ key ] + c, exists := m.clientMap[key] if !exists { c, err := integration.NewClient(i, m.RequestDataUpdates, m.Events, m.Errors) if err != nil { return err } - m.clientMap[ key ] = c + m.clientMap[key] = c return nil } return c.Update(i) diff --git a/backend/services/integrations/integration/cloudwatch.go b/backend/services/integrations/integration/cloudwatch.go index fa2210138..9974f485b 100644 --- a/backend/services/integrations/integration/cloudwatch.go +++ b/backend/services/integrations/integration/cloudwatch.go @@ -2,43 +2,40 @@ package integration import ( "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/cloudwatchlogs" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/cloudwatchlogs" - "strings" - "regexp" "openreplay/backend/pkg/messages" + "regexp" + "strings" ) - var reIsException = regexp.MustCompile(`(?i)exception|error`) type cloudwatch struct { - AwsAccessKeyId string // `json:"aws_access_key_id"` - AwsSecretAccessKey string // `json:"aws_secret_access_key"` - LogGroupName string // `json:"log_group_name"` - Region string // `json:"region"` + AwsAccessKeyId string // `json:"aws_access_key_id"` + AwsSecretAccessKey string // `json:"aws_secret_access_key"` + LogGroupName string // `json:"log_group_name"` + Region string // `json:"region"` } - func (cw *cloudwatch) Request(c *client) error { - startTs := int64(c.getLastMessageTimestamp() + 1) // From next millisecond + startTs := int64(c.getLastMessageTimestamp() + 1) // From next millisecond //endTs := utils.CurrentTimestamp() sess, err := session.NewSession(aws.NewConfig(). - WithRegion(cw.Region). - WithCredentials( - credentials.NewStaticCredentials(cw.AwsAccessKeyId, cw.AwsSecretAccessKey, ""), - ), + WithRegion(cw.Region). + WithCredentials( + credentials.NewStaticCredentials(cw.AwsAccessKeyId, cw.AwsSecretAccessKey, ""), + ), ) if err != nil { return err } svc := cloudwatchlogs.New(sess) - filterOptions := new(cloudwatchlogs.FilterLogEventsInput). - SetStartTime(startTs). // Inclusively both startTime and endTime + SetStartTime(startTs). // Inclusively both startTime and endTime // SetEndTime(endTs). // Default nil? // SetLimit(10000). // Default 10000 SetLogGroupName(cw.LogGroupName). @@ -56,7 +53,7 @@ func (cw *cloudwatch) Request(c *client) error { } if !reIsException.MatchString(*e.Message) { // too weak condition ? continue - } + } token, err := GetToken(*e.Message) if err != nil { c.errChan <- err @@ -72,18 +69,18 @@ func (cw *cloudwatch) Request(c *client) error { //SessionID: sessionID, Token: token, RawErrorEvent: &messages.RawErrorEvent{ - Source: "cloudwatch", - Timestamp: timestamp, // e.IngestionTime ?? - Name: name, - Payload: strings.ReplaceAll(e.String(), "\n", ""), + Source: "cloudwatch", + Timestamp: timestamp, // e.IngestionTime ?? + Name: name, + Payload: strings.ReplaceAll(e.String(), "\n", ""), }, } } if output.NextToken == nil { - break; + break } filterOptions.NextToken = output.NextToken } return nil -} \ No newline at end of file +} diff --git a/backend/services/integrations/integration/elasticsearch.go b/backend/services/integrations/integration/elasticsearch.go index dd6f5d5f9..6b8181073 100644 --- a/backend/services/integrations/integration/elasticsearch.go +++ b/backend/services/integrations/integration/elasticsearch.go @@ -53,14 +53,14 @@ func (es *elasticsearch) Request(c *client) error { "query": map[string]interface{}{ "bool": map[string]interface{}{ "filter": []map[string]interface{}{ - map[string]interface{}{ + { "match": map[string]interface{}{ "message": map[string]interface{}{ "query": "openReplaySessionToken=", // asayer_session_id= }, }, }, - map[string]interface{}{ + { "range": map[string]interface{}{ "utc_time": map[string]interface{}{ "gte": strconv.FormatUint(gteTs, 10), @@ -68,7 +68,7 @@ func (es *elasticsearch) Request(c *client) error { }, }, }, - map[string]interface{}{ + { "term": map[string]interface{}{ "tags": "error", }, diff --git a/backend/services/integrations/integration/rollbar.go b/backend/services/integrations/integration/rollbar.go index 369ee31f9..53a5c6d5b 100644 --- a/backend/services/integrations/integration/rollbar.go +++ b/backend/services/integrations/integration/rollbar.go @@ -1,15 +1,15 @@ package integration import ( - "net/http" "encoding/json" + "errors" "fmt" - "time" - "strings" - "strconv" "io" - "io/ioutil" - "errors" + "io/ioutil" + "net/http" + "strconv" + "strings" + "time" "openreplay/backend/pkg/messages" ) @@ -17,42 +17,42 @@ import ( // Old name: asayerSessionId // QUERY: what can be modified? -const RB_QUERY = - "SELECT item.id, item.title,body.message.openReplaySessionToken,item.level,"+ - " item.counter,item.environment,body.crash_report.raw,body.message.body,timestamp"+ - " FROM item_occurrence"+ - " WHERE body.message.openReplaySessionToken != null"+ - " AND timestamp>= %v"+ - " AND item.level>30"+ - " ORDER BY timestamp"+ +const RB_QUERY = "SELECT item.id, item.title,body.message.openReplaySessionToken,item.level," + + " item.counter,item.environment,body.crash_report.raw,body.message.body,timestamp" + + " FROM item_occurrence" + + " WHERE body.message.openReplaySessionToken != null" + + " AND timestamp>= %v" + + " AND item.level>30" + + " ORDER BY timestamp" + " LIMIT 1000" + // ASC by default // \n\t symbols can spoil the request body, so it wouldn't work (OR probably it happend because of job hashing) /* - - `read` Access Token required - - timstamp in seconds + - `read` Access Token required + - timstamp in seconds */ type rollbar struct { - AccessToken string // `json:"access_token"` + AccessToken string // `json:"access_token"` } type rollbarJobResponce struct { - Err int + Err int Message string - Result struct { + Result struct { Id int } } type rollbarJobStatusResponce struct { - Err int + Err int Result struct { Status string Result struct { - Rows [][] json.Number - Columns[] string + Rows [][]json.Number + Columns []string } } } @@ -65,7 +65,7 @@ type rollbarEvent map[string]string */ func (rb *rollbar) Request(c *client) error { fromTs := c.getLastMessageTimestamp() + 1000 // From next second - c.setLastMessageTimestamp(fromTs) // anti-job-hashing + c.setLastMessageTimestamp(fromTs) // anti-job-hashing fromTsSec := fromTs / 1e3 query := fmt.Sprintf(RB_QUERY, fromTsSec) jsonBody := fmt.Sprintf(`{ @@ -111,7 +111,7 @@ func (rb *rollbar) Request(c *client) error { tick := time.Tick(5 * time.Second) for { - <- tick + <-tick resp, err = http.DefaultClient.Do(req) if err != nil { return err // continue + timeout/maxAttempts @@ -131,14 +131,14 @@ func (rb *rollbar) Request(c *client) error { e := make(rollbarEvent) for i, col := range jobStatus.Result.Result.Columns { //if len(row) <= i { error } - e[ col ] = row[ i ].String() // here I make them all string. That's not good + e[col] = row[i].String() // here I make them all string. That's not good } // sessionID, err := strconv.ParseUint(e[ "body.message.asayerSessionId" ], 10, 64) // if err != nil { // c.errChan <- err // continue // } - if e[ "body.message.openReplaySessionToken" ] == "" { + if e["body.message.openReplaySessionToken"] == "" { c.errChan <- errors.New("Token is empty!") continue } @@ -147,7 +147,7 @@ func (rb *rollbar) Request(c *client) error { c.errChan <- err continue } - timestampSec, err := strconv.ParseUint(e[ "timestamp" ], 10, 64) + timestampSec, err := strconv.ParseUint(e["timestamp"], 10, 64) if err != nil { c.errChan <- err continue @@ -155,22 +155,22 @@ func (rb *rollbar) Request(c *client) error { timestamp := timestampSec * 1000 c.setLastMessageTimestamp(timestamp) c.evChan <- &SessionErrorEvent{ - Token: e[ "body.message.openReplaySessionToken" ], + Token: e["body.message.openReplaySessionToken"], RawErrorEvent: &messages.RawErrorEvent{ - Source: "rollbar", + Source: "rollbar", Timestamp: timestamp, - Name: e[ "item.title" ], - Payload: string(payload), + Name: e["item.title"], + Payload: string(payload), }, } } break } - if jobStatus.Result.Status != "new" && + if jobStatus.Result.Status != "new" && jobStatus.Result.Status != "running" { // error break } } return nil -} \ No newline at end of file +} diff --git a/backend/services/integrations/integration/utils.go b/backend/services/integrations/integration/utils.go index 396a177bd..36a473c02 100644 --- a/backend/services/integrations/integration/utils.go +++ b/backend/services/integrations/integration/utils.go @@ -1,34 +1,37 @@ package integration import ( + "fmt" "regexp" "strconv" "strings" - "fmt" ) var reSessionID = regexp.MustCompile(`(?i)asayer_session_id=([0-9]+)`) -func GetAsayerSessionId(s string) (uint64, error) { + +func GetAsayerSessionId(s string) (uint64, error) { matches := reSessionID.FindStringSubmatch(s) if len(matches) < 2 { return 0, fmt.Errorf("'asayer_session_id' not found in '%v' ", s) } - return strconv.ParseUint(matches[ 1 ], 10, 64) + return strconv.ParseUint(matches[1], 10, 64) } func GetLinkFromAngularBrackets(s string) string { beg := strings.Index(s, "<") + 1 end := strings.Index(s, ">") - if end < 0 { return "" } + if end < 0 { + return "" + } return strings.TrimSpace(s[beg:end]) } - var reToken = regexp.MustCompile(`(?i)openReplaySessionToken=([0-9a-zA-Z\.]+)`) -func GetToken(s string) (string, error) { + +func GetToken(s string) (string, error) { matches := reToken.FindStringSubmatch(s) if len(matches) < 2 { return "", fmt.Errorf("'openReplaySessionToken' not found in '%v' ", s) } - return matches[ 1 ], nil -} \ No newline at end of file + return matches[1], nil +} diff --git a/backend/services/storage/gzip.go b/backend/services/storage/gzip.go index d574ec4ae..f3e96394a 100644 --- a/backend/services/storage/gzip.go +++ b/backend/services/storage/gzip.go @@ -1,19 +1,18 @@ package main import ( - "io" gzip "github.com/klauspost/pgzip" + "io" ) - func gzipFile(file io.ReadSeeker) io.Reader { reader, writer := io.Pipe() - go func() { - gw, _ := gzip.NewWriterLevel(writer, gzip.BestSpeed) - io.Copy(gw, file) + go func() { + gw, _ := gzip.NewWriterLevel(writer, gzip.BestSpeed) + io.Copy(gw, file) - gw.Close() - writer.Close() - }() - return reader -} \ No newline at end of file + gw.Close() + writer.Close() + }() + return reader +} From 55b504cc22bedb92accebc8032f1bab7895d99fc Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Tue, 26 Apr 2022 16:30:48 +0200 Subject: [PATCH 002/260] feat(alerts): changed build script --- api/build_alerts.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/build_alerts.sh b/api/build_alerts.sh index f333c8dc8..1b0b96f7e 100644 --- a/api/build_alerts.sh +++ b/api/build_alerts.sh @@ -27,7 +27,7 @@ function make_submodule() { mkdir -p ./alerts/chalicelib/ cp -R ./chalicelib/__init__.py ./alerts/chalicelib/ mkdir -p ./alerts/chalicelib/core/ - cp -R ./chalicelib/core/{__init__,alerts_processor,alerts_listener,sessions,events,issues,sessions_metas,metadata,projects,users,authorizers,tenants,roles,assist,events_ios,sessions_mobs,errors,dashboard,sourcemaps,sourcemaps_parser,resources,performance_event,alerts,notifications,slack,collaboration_slack,webhook}.py ./alerts/chalicelib/core/ + cp -R ./chalicelib/core/{__init__,alerts_processor,alerts_listener,sessions,events,issues,sessions_metas,metadata,projects,users,authorizers,tenants,roles,assist,events_ios,sessions_mobs,errors,metrics,sourcemaps,sourcemaps_parser,resources,performance_event,alerts,notifications,slack,collaboration_slack,webhook}.py ./alerts/chalicelib/core/ mkdir -p ./alerts/chalicelib/utils/ cp -R ./chalicelib/utils/{__init__,TimeUTC,pg_client,helper,event_filter_definition,dev,SAML2_helper,email_helper,email_handler,smtp,s3,args_transformer,ch_client,metrics_helper}.py ./alerts/chalicelib/utils/ # -- end of generated part From f3b6bda16387edf834b639f56aa47108ac6f0366 Mon Sep 17 00:00:00 2001 From: Rajesh Rajendran Date: Wed, 27 Apr 2022 12:54:40 +0000 Subject: [PATCH 003/260] Vagrant for local contribution (#434) * chore(vagrant): initial vagrantfile * chore(vagrant): adding instructions after installation * chore(vagrant): Adding vagrant user to docker group * chore(vagrant): use local docker daemon for k3s * chore(vagrant): fix comment * chore(vagrant): adding hostname in /etc/hosts * chore(vagrant): fix doc * chore(vagrant): limiting cpu * chore(frontend): initialize dev env * chore(docker): adding dockerignore * chore(dockerfile): using cache for fasten build * chore(dockerignore): update * chore(docker): build optimizations * chore(build): all components build option * chore(build): utilities build fix * chore(scrpt): remove debug message * chore(vagrant): provision using stable branch always Signed-off-by: rjshrjndrn --- api/.dockerignore | 6 ++ api/Dockerfile | 6 +- api/build.sh | 10 ++- api/build_alerts.sh | 3 +- backend/.dockerignore | 6 ++ backend/build.sh | 6 +- frontend/build.sh | 1 + frontend/dev-init.sh | 2 + peers/.dockerignore | 6 ++ peers/build.sh | 4 +- scripts/helmcharts/build_deploy.sh | 22 +++++ scripts/helmcharts/local_deploy.sh | 105 +++++++++++++++++++++++ scripts/vagrant/Vagrantfile | 129 +++++++++++++++++++++++++++++ utilities/.dockerignore | 6 ++ utilities/build.sh | 4 +- 15 files changed, 302 insertions(+), 14 deletions(-) create mode 100644 api/.dockerignore create mode 100644 backend/.dockerignore create mode 100644 frontend/dev-init.sh create mode 100644 peers/.dockerignore create mode 100644 scripts/helmcharts/build_deploy.sh create mode 100644 scripts/helmcharts/local_deploy.sh create mode 100644 scripts/vagrant/Vagrantfile create mode 100644 utilities/.dockerignore diff --git a/api/.dockerignore b/api/.dockerignore new file mode 100644 index 000000000..b6aaccd33 --- /dev/null +++ b/api/.dockerignore @@ -0,0 +1,6 @@ +# ignore .git and .cache folders +.git +.cache +**/build.sh +**/build_*.sh +**/*deploy.sh diff --git a/api/Dockerfile b/api/Dockerfile index 0673ab2b5..f3b5e85f5 100644 --- a/api/Dockerfile +++ b/api/Dockerfile @@ -11,8 +11,8 @@ RUN apt update && apt install -y curl && \ curl -fsSL https://deb.nodesource.com/setup_12.x | bash - && \ apt install -y nodejs && \ apt remove --purge -y curl && \ - rm -rf /var/lib/apt/lists/* && \ - cd sourcemap-reader && \ + rm -rf /var/lib/apt/lists/* +RUN cd sourcemap-reader && \ npm install # Add Tini @@ -23,4 +23,4 @@ ENV ENTERPRISE_BUILD ${envarg} ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini RUN chmod +x /tini ENTRYPOINT ["/tini", "--"] -CMD ./entrypoint.sh \ No newline at end of file +CMD ./entrypoint.sh diff --git a/api/build.sh b/api/build.sh index cec7525f5..8c735ff3c 100644 --- a/api/build.sh +++ b/api/build.sh @@ -12,9 +12,9 @@ envarg="default-foss" check_prereq() { which docker || { echo "Docker not installed, please install docker." - exit=1 + exit 1 } - [[ exit -eq 1 ]] && exit 1 + return } function build_api(){ @@ -32,9 +32,11 @@ function build_api(){ docker push ${DOCKER_REPO:-'local'}/chalice:${git_sha1} docker tag ${DOCKER_REPO:-'local'}/chalice:${git_sha1} ${DOCKER_REPO:-'local'}/chalice:${tag}latest docker push ${DOCKER_REPO:-'local'}/chalice:${tag}latest -} + } + echo "api docker build completed" } check_prereq build_api $1 -IMAGE_TAG=$IMAGE_TAG PUSH_IMAGE=$PUSH_IMAGE DOCKER_REPO=$DOCKER_REPO bash build_alerts.sh $1 \ No newline at end of file +echo buil_complete +IMAGE_TAG=$IMAGE_TAG PUSH_IMAGE=$PUSH_IMAGE DOCKER_REPO=$DOCKER_REPO bash build_alerts.sh $1 diff --git a/api/build_alerts.sh b/api/build_alerts.sh index 1b0b96f7e..2a7d88a1e 100644 --- a/api/build_alerts.sh +++ b/api/build_alerts.sh @@ -64,7 +64,8 @@ function build_api(){ docker tag ${DOCKER_REPO:-'local'}/alerts:${git_sha1} ${DOCKER_REPO:-'local'}/alerts:${tag}latest docker push ${DOCKER_REPO:-'local'}/alerts:${tag}latest } +echo "completed alerts build" } check_prereq -build_api $1 \ No newline at end of file +build_api $1 diff --git a/backend/.dockerignore b/backend/.dockerignore new file mode 100644 index 000000000..b6aaccd33 --- /dev/null +++ b/backend/.dockerignore @@ -0,0 +1,6 @@ +# ignore .git and .cache folders +.git +.cache +**/build.sh +**/build_*.sh +**/*deploy.sh diff --git a/backend/build.sh b/backend/build.sh index c760c1b9b..c3c40dd33 100644 --- a/backend/build.sh +++ b/backend/build.sh @@ -13,9 +13,9 @@ ee="false" check_prereq() { which docker || { echo "Docker not installed, please install docker." - exit=1 + exit 1 } - [[ exit -eq 1 ]] && exit 1 + return } function build_api(){ @@ -30,6 +30,7 @@ function build_api(){ [[ $PUSH_IMAGE -eq 1 ]] && { docker push ${DOCKER_REPO:-'local'}/$image:${git_sha1} } + echo "build completed for http" return } for image in $(ls services); @@ -40,6 +41,7 @@ function build_api(){ } echo "::set-output name=image::${DOCKER_REPO:-'local'}/$image:${git_sha1}" done + echo "backend build completed" } check_prereq diff --git a/frontend/build.sh b/frontend/build.sh index 7b656bc8f..652be2acf 100644 --- a/frontend/build.sh +++ b/frontend/build.sh @@ -20,6 +20,7 @@ check_prereq() { function build(){ # Run docker as the same user, else we'll run in to permission issues. docker run --rm -v /etc/passwd:/etc/passwd -u `id -u`:`id -g` -v $(pwd):/home/${USER} -w /home/${USER} --name node_build node:14-stretch-slim /bin/bash -c "npm install && npm run build:oss" + echo "frotend build completed" } check_prereq diff --git a/frontend/dev-init.sh b/frontend/dev-init.sh new file mode 100644 index 000000000..e32647ff0 --- /dev/null +++ b/frontend/dev-init.sh @@ -0,0 +1,2 @@ +#!/bin/bash +npm install --legacy-peer-deps diff --git a/peers/.dockerignore b/peers/.dockerignore new file mode 100644 index 000000000..b6aaccd33 --- /dev/null +++ b/peers/.dockerignore @@ -0,0 +1,6 @@ +# ignore .git and .cache folders +.git +.cache +**/build.sh +**/build_*.sh +**/*deploy.sh diff --git a/peers/build.sh b/peers/build.sh index c15921ea8..381189927 100644 --- a/peers/build.sh +++ b/peers/build.sh @@ -10,9 +10,8 @@ git_sha1=${IMAGE_TAG:-$(git rev-parse HEAD)} check_prereq() { which docker || { echo "Docker not installed, please install docker." - exit=1 + exit 1 } - [[ exit -eq 1 ]] && exit 1 } function build_api(){ @@ -27,6 +26,7 @@ function build_api(){ docker tag ${DOCKER_REPO:-'local'}/peers:${git_sha1} ${DOCKER_REPO:-'local'}/peers:latest docker push ${DOCKER_REPO:-'local'}/peers:latest } + echo "peer docker build complted" } check_prereq diff --git a/scripts/helmcharts/build_deploy.sh b/scripts/helmcharts/build_deploy.sh new file mode 100644 index 000000000..7a75fad8b --- /dev/null +++ b/scripts/helmcharts/build_deploy.sh @@ -0,0 +1,22 @@ +#!/bin/bash +set -e + +# This script will build and push docker image to registry + +# Usage: IMAGE_TAG=latest DOCKER_REPO=rg.fr-par.scw.cloud/foss bash build_deploy.sh + +echo $DOCKER_REPO +[[ -z DOCKER_REPO ]] && { + echo Set DOCKER_REPO="your docker registry" + exit 1 +} || { + docker login $DOCKER_REPO + cd ../../api + PUSH_IMAGE=1 bash build.sh $@ + cd ../backend + PUSH_IMAGE=1 bash build.sh $@ + cd ../utilities + PUSH_IMAGE=1 bash build.sh $@ + cd ../peers + PUSH_IMAGE=1 bash build.sh $@ +} diff --git a/scripts/helmcharts/local_deploy.sh b/scripts/helmcharts/local_deploy.sh new file mode 100644 index 000000000..c8c82ceb4 --- /dev/null +++ b/scripts/helmcharts/local_deploy.sh @@ -0,0 +1,105 @@ +#!/bin/bash +set -e + +# This script will build and push docker image to registry + +# Usage: IMAGE_TAG=latest DOCKER_REPO=rg.fr-par.scw.cloud/foss bash build_deploy.sh + +export DOCKER_REPO="rg.fr-par.scw.cloud/foss" +export IMAGE_TAG=`grep fromVersion vars.yaml | awk '{print $NF}'|xargs` + + +apps=( + api + assets + db + ender + http + integrations + sink + storage + assist + peers + all +) +help(){ + cat <> /etc/hosts && sudo sed -i "s/.*openreplay.local/${IP_ADDR} openreplay.local/g" /etc/hosts; grep openreplay.local /etc/hosts + + apt-get update + apt-get install -y git curl + curl -fsSL https://get.docker.com | sh - + usermod -aG docker vagrant + + git clone https://github.com/openreplay/openreplay infra + cd infra/scripts/helmcharts + + # changing container runtime for k3s to docker + sudo -u vagrant git checkout -- init.sh + sed -i 's/INSTALL_K3S_EXEC=\\(.*\\)\\\"/INSTALL_K3S_EXEC=\\1 --docker\\\"/g' init.sh + + DOMAIN_NAME=openreplay.local bash init.sh + cp -rf /root/.kube /home/vagrant/ + cp -rf /home/vagrant/infra/scripts/helmcharts/vars.yaml /home/vagrant/openreplay-dev/openreplay/scripts/helmcharts/vars.yaml + chown -R vagrant:vagrant /home/vagrant + + cat <> /etc/hosts && sudo sed -i "s/.*openreplay.local/${IP_ADDR} openreplay.local/g" /etc/hosts; grep openreplay.local /etc/hosts' + + ## Linux (Paste the following command in terminal) + + sudo -- sh -c 'grep -q openreplay.local /etc/hosts || echo $IP_ADDR openreplay.local >> /etc/hosts && sudo sed -i "s/.*openreplay.local/${IP_ADDR} openreplay.local/g" /etc/hosts; grep openreplay.local /etc/hosts' + + ## Windows + + Use the following instructions if you’re running Windows 10 or Windows 8: + + Press the Windows key. + Type Notepad in the search field. + In the search results, right-click Notepad and select Run as administrator. + From Notepad, open the following file: + c:\\Windows\\System32\\Drivers\\etc\\hosts + add the below line in the hosts file + $IP_ADDR openreplay.local + Select File > Save to save your changes. + + To Access Openreplay: + - Open your browser and go to "http://openreplay.local" + + EOF + SHELL +end diff --git a/utilities/.dockerignore b/utilities/.dockerignore new file mode 100644 index 000000000..b6aaccd33 --- /dev/null +++ b/utilities/.dockerignore @@ -0,0 +1,6 @@ +# ignore .git and .cache folders +.git +.cache +**/build.sh +**/build_*.sh +**/*deploy.sh diff --git a/utilities/build.sh b/utilities/build.sh index f7d003ed3..4a290768d 100644 --- a/utilities/build.sh +++ b/utilities/build.sh @@ -10,9 +10,8 @@ git_sha1=${IMAGE_TAG:-$(git rev-parse HEAD)} check_prereq() { which docker || { echo "Docker not installed, please install docker." - exit=1 + exit 1 } - [[ exit -eq 1 ]] && exit 1 } function build_api(){ @@ -26,6 +25,7 @@ function build_api(){ docker tag ${DOCKER_REPO:-'local'}/assist:${git_sha1} ${DOCKER_REPO:-'local'}/assist:latest docker push ${DOCKER_REPO:-'local'}/assist:latest } + echo "build completed for assist" } check_prereq From 94adb69f6b82764bec45751fc88bea700052cfed Mon Sep 17 00:00:00 2001 From: rjshrjndrn Date: Tue, 26 Apr 2022 17:05:02 +0200 Subject: [PATCH 004/260] fix(nginx): proper x-forward-for proxying Signed-off-by: rjshrjndrn --- scripts/helmcharts/vars.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/helmcharts/vars.yaml b/scripts/helmcharts/vars.yaml index 5cc50af13..297017254 100644 --- a/scripts/helmcharts/vars.yaml +++ b/scripts/helmcharts/vars.yaml @@ -55,7 +55,6 @@ ingress-nginx: &ingress-nginx default-ssl-certificate: "app/openreplay-ssl" config: enable-real-ip: true - forwarded-for-header: "proxy_protocol" # Ref: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#max-worker-connections max-worker-connections: 0 # SSL redirection From 51c75657ab9764a3f0b5ee572b020f95574b7e7b Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Thu, 28 Apr 2022 14:07:28 +0200 Subject: [PATCH 005/260] feat(api): EE fixed No of pages count widget --- ee/api/chalicelib/core/metrics.py | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/ee/api/chalicelib/core/metrics.py b/ee/api/chalicelib/core/metrics.py index 65889e28d..31b9c3985 100644 --- a/ee/api/chalicelib/core/metrics.py +++ b/ee/api/chalicelib/core/metrics.py @@ -2465,13 +2465,15 @@ def get_user_activity_avg_visited_pages(project_id, startTimestamp=TimeUTC.now(d def __get_user_activity_avg_visited_pages(ch, project_id, startTimestamp, endTimestamp, **args): - ch_sub_query = __get_basic_constraints(table_name="sessions", data=args) + ch_sub_query = __get_basic_constraints(table_name="pages", data=args) meta_condition = __get_meta_constraint(args) ch_sub_query += meta_condition - ch_sub_query.append("sessions.pages_count>0") - ch_query = f"""SELECT COALESCE(CEIL(avgOrNull(sessions.pages_count)),0) AS value - FROM sessions {"INNER JOIN sessions_metadata USING(session_id)" if len(meta_condition) > 0 else ""} - WHERE {" AND ".join(ch_sub_query)};""" + + ch_query = f"""SELECT COALESCE(CEIL(avgOrNull(count)),0) AS value + FROM (SELECT COUNT(session_id) AS count + FROM pages {"INNER JOIN sessions_metadata USING(session_id)" if len(meta_condition) > 0 else ""} + WHERE {" AND ".join(ch_sub_query)}) AS groupped_data + WHERE count>0;""" params = {"project_id": project_id, "startTimestamp": startTimestamp, "endTimestamp": endTimestamp, **__get_constraint_values(args)} @@ -2482,19 +2484,22 @@ def __get_user_activity_avg_visited_pages(ch, project_id, startTimestamp, endTim def __get_user_activity_avg_visited_pages_chart(ch, project_id, startTimestamp, endTimestamp, density=20, **args): step_size = __get_step_size(endTimestamp=endTimestamp, startTimestamp=startTimestamp, density=density) - ch_sub_query_chart = __get_basic_constraints(table_name="sessions", round_start=True, data=args) + ch_sub_query_chart = __get_basic_constraints(table_name="pages", round_start=True, data=args) meta_condition = __get_meta_constraint(args) ch_sub_query_chart += meta_condition params = {"step_size": step_size, "project_id": project_id, "startTimestamp": startTimestamp, "endTimestamp": endTimestamp} - ch_sub_query_chart.append("sessions.pages_count>0") - ch_query = f"""SELECT toUnixTimestamp(toStartOfInterval(sessions.datetime, INTERVAL %(step_size)s second ))*1000 AS timestamp, - COALESCE(avgOrNull(sessions.pages_count),0) AS value - FROM sessions {"INNER JOIN sessions_metadata USING(session_id)" if len(meta_condition) > 0 else ""} - WHERE {" AND ".join(ch_sub_query_chart)} - GROUP BY timestamp - ORDER BY timestamp;""" + ch_query = f"""SELECT timestamp, COALESCE(avgOrNull(count), 0) AS value + FROM (SELECT toUnixTimestamp(toStartOfInterval(pages.datetime, INTERVAL %(step_size)s second ))*1000 AS timestamp, + session_id, COUNT(pages.session_id) AS count + FROM pages {"INNER JOIN sessions_metadata USING(session_id)" if len(meta_condition) > 0 else ""} + WHERE {" AND ".join(ch_sub_query_chart)} + GROUP BY timestamp,session_id + ORDER BY timestamp) AS groupped_data + WHERE count>0 + GROUP BY timestamp + ORDER BY timestamp;""" rows = ch.execute(query=ch_query, params={**params, **__get_constraint_values(args)}) rows = __complete_missing_steps(rows=rows, start_time=startTimestamp, end_time=endTimestamp, From b8367d87f8aaef8a57dd0c067bdea755d69bc71c Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Thu, 28 Apr 2022 14:59:05 +0200 Subject: [PATCH 006/260] feat(api): EE fixed No of pages count widget --- ee/api/chalicelib/core/metrics.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ee/api/chalicelib/core/metrics.py b/ee/api/chalicelib/core/metrics.py index 31b9c3985..668ce4760 100644 --- a/ee/api/chalicelib/core/metrics.py +++ b/ee/api/chalicelib/core/metrics.py @@ -2472,7 +2472,8 @@ def __get_user_activity_avg_visited_pages(ch, project_id, startTimestamp, endTim ch_query = f"""SELECT COALESCE(CEIL(avgOrNull(count)),0) AS value FROM (SELECT COUNT(session_id) AS count FROM pages {"INNER JOIN sessions_metadata USING(session_id)" if len(meta_condition) > 0 else ""} - WHERE {" AND ".join(ch_sub_query)}) AS groupped_data + WHERE {" AND ".join(ch_sub_query)} + GROUP BY session_id) AS groupped_data WHERE count>0;""" params = {"project_id": project_id, "startTimestamp": startTimestamp, "endTimestamp": endTimestamp, **__get_constraint_values(args)} From d64cd12eb6425f204183de0e444a2d9edea52a5f Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Thu, 28 Apr 2022 17:02:13 +0200 Subject: [PATCH 007/260] fix(backend):pprof launch addr: use port only --- backend/pkg/pprof/pprof.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/pkg/pprof/pprof.go b/backend/pkg/pprof/pprof.go index a05080178..8ea1c1b5f 100644 --- a/backend/pkg/pprof/pprof.go +++ b/backend/pkg/pprof/pprof.go @@ -8,6 +8,6 @@ import ( func StartProfilingServer() { go func() { - log.Println(http.ListenAndServe("localhost:6060", nil)) + log.Println(http.ListenAndServe(":6060", nil)) }() } From 60d0d42d69d148df9222816d661e86fa2d881860 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Thu, 28 Apr 2022 17:02:53 +0200 Subject: [PATCH 008/260] fix(backend): Dockerfile.bundle fix --- backend/Dockerfile.bundle | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/backend/Dockerfile.bundle b/backend/Dockerfile.bundle index efbcb2684..79ef57db5 100644 --- a/backend/Dockerfile.bundle +++ b/backend/Dockerfile.bundle @@ -1,4 +1,4 @@ -FROM golang:1.13-alpine3.10 AS prepare +FROM golang:1.18-alpine3.15 AS prepare RUN apk add --no-cache git openssh openssl-dev pkgconf gcc g++ make libc-dev bash @@ -13,7 +13,7 @@ FROM prepare AS build COPY pkg pkg COPY services services -RUN for name in alerts assets db ender http integrations sink storage;do CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o bin/$name -tags musl openreplay/backend/services/$name; done +RUN for name in assets db ender http integrations sink storage;do CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o bin/$name -tags musl openreplay/backend/services/$name; done FROM alpine @@ -26,8 +26,9 @@ ENV TZ=UTC \ MAXMINDDB_FILE=/root/geoip.mmdb \ UAPARSER_FILE=/root/regexes.yaml \ HTTP_PORT=80 \ - BEACON_SIZE_LIMIT=1000000 \ + BEACON_SIZE_LIMIT=7000000 \ KAFKA_USE_SSL=true \ + KAFKA_MAX_POLL_INTERVAL_MS=400000 \ REDIS_STREAMS_MAX_LEN=3000 \ TOPIC_RAW_WEB=raw \ TOPIC_RAW_IOS=raw-ios \ @@ -42,10 +43,10 @@ ENV TZ=UTC \ AWS_REGION_WEB=eu-central-1 \ AWS_REGION_IOS=eu-west-1 \ AWS_REGION_ASSETS=eu-central-1 \ - CACHE_ASSETS=false \ + CACHE_ASSETS=true \ ASSETS_SIZE_LIMIT=6291456 \ - FS_CLEAN_HRS=12 - + FS_CLEAN_HRS=12 \ + LOG_QUEUE_STATS_INTERVAL_SEC=60 RUN mkdir $FS_DIR #VOLUME [ $FS_DIR ] # Uncomment in case of using Bind mount. From 3132db6205c38fa4fe25c4b5d300adaba9e65615 Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Thu, 28 Apr 2022 17:55:56 +0200 Subject: [PATCH 009/260] fix(backend): fixed possible panic in the defer --- backend/services/storage/main.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/backend/services/storage/main.go b/backend/services/storage/main.go index 9579fbe4f..21054a750 100644 --- a/backend/services/storage/main.go +++ b/backend/services/storage/main.go @@ -16,6 +16,8 @@ import ( "openreplay/backend/pkg/storage" ) +const RetryTimeout = 2 * time.Minute + func main() { log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) @@ -28,17 +30,18 @@ func main() { if retryCount <= 0 { return } + file, err := os.Open(FS_DIR + "/" + key) - defer file.Close() if err != nil { log.Printf("File error: %v; Will retry %v more time(s)\n", err, retryCount) - time.AfterFunc(2*time.Minute, func() { + time.AfterFunc(RetryTimeout, func() { uploadKey(key, retryCount-1) }) - } else { - if err := storage.Upload(gzipFile(file), key, "application/octet-stream", true); err != nil { - log.Fatalf("Storage upload error: %v\n", err) - } + } + defer file.Close() + + if err := storage.Upload(gzipFile(file), key, "application/octet-stream", true); err != nil { + log.Fatalf("Storage upload error: %v\n", err) } } From de3ba9c7f63ad53d5c2637c663a2404372a7b30a Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Thu, 28 Apr 2022 18:02:56 +0200 Subject: [PATCH 010/260] fix(backend): added missed return in error case --- backend/services/storage/main.go | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/services/storage/main.go b/backend/services/storage/main.go index 21054a750..3e391426a 100644 --- a/backend/services/storage/main.go +++ b/backend/services/storage/main.go @@ -37,6 +37,7 @@ func main() { time.AfterFunc(RetryTimeout, func() { uploadKey(key, retryCount-1) }) + return } defer file.Close() From 6d4800feeac9895d447b47be4d86d501ea293e9f Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Thu, 28 Apr 2022 19:14:23 +0200 Subject: [PATCH 011/260] feat(backend/storage):split files into 2 --- backend/services/storage/main.go | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/backend/services/storage/main.go b/backend/services/storage/main.go index 3e391426a..47691ad36 100644 --- a/backend/services/storage/main.go +++ b/backend/services/storage/main.go @@ -6,6 +6,10 @@ import ( "strconv" "time" + "bytes" + "io" + "ioutill" + "os/signal" "syscall" @@ -18,6 +22,8 @@ import ( const RetryTimeout = 2 * time.Minute +const SESSION_FILE_SPLIT_SIZE = 200000 // ~200 kB + func main() { log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) @@ -41,8 +47,27 @@ func main() { } defer file.Close() - if err := storage.Upload(gzipFile(file), key, "application/octet-stream", true); err != nil { - log.Fatalf("Storage upload error: %v\n", err) + fileR2 := new(bytes.Buffer) + fileR1 := io.TeeReader(file, fileR2) + + startBytes := make([]byte, SESSION_FILE_SPLIT_SIZE) + nRead, err := fileR1.Read(startBytes) + if err != nil { + log.Printf("File read error: %f", err) + return + } + startReader = bytes.NewBuffer(startBytes) + if err := storage.Upload(gzipFile(startReader), key+"-s", "application/octet-stream", true); err != nil { + log.Fatalf("Storage: start upload failed. %v\n", err) + } + if nRead == SESSION_FILE_SPLIT_SIZE { + if err := storage.Upload(gzipFile(fileR1), key+"-e", "application/octet-stream", true); err != nil { + log.Fatalf("Storage: end upload failed. %v\n", err) + } + } + + if err := storage.Upload(gzipFile(fileR2), key, "application/octet-stream", true); err != nil { + log.Fatalf("Storage: upload failed. %v\n", err) } } From cb01c3cb289defb2af50a7edbc813384db72a5e2 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Thu, 28 Apr 2022 19:21:45 +0200 Subject: [PATCH 012/260] fix(backend/storage): codefix --- backend/services/storage/gzip.go | 2 +- backend/services/storage/main.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/services/storage/gzip.go b/backend/services/storage/gzip.go index f3e96394a..0e662efaa 100644 --- a/backend/services/storage/gzip.go +++ b/backend/services/storage/gzip.go @@ -5,7 +5,7 @@ import ( "io" ) -func gzipFile(file io.ReadSeeker) io.Reader { +func gzipFile(file io.Reader) io.Reader { reader, writer := io.Pipe() go func() { gw, _ := gzip.NewWriterLevel(writer, gzip.BestSpeed) diff --git a/backend/services/storage/main.go b/backend/services/storage/main.go index 47691ad36..9afc7d819 100644 --- a/backend/services/storage/main.go +++ b/backend/services/storage/main.go @@ -8,7 +8,7 @@ import ( "bytes" "io" - "ioutill" + //"io/ioutil" "os/signal" "syscall" @@ -56,7 +56,7 @@ func main() { log.Printf("File read error: %f", err) return } - startReader = bytes.NewBuffer(startBytes) + startReader := bytes.NewBuffer(startBytes) if err := storage.Upload(gzipFile(startReader), key+"-s", "application/octet-stream", true); err != nil { log.Fatalf("Storage: start upload failed. %v\n", err) } From b096ac73d1a0268a886195c44007da5793eaa950 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Fri, 29 Apr 2022 10:02:56 +0200 Subject: [PATCH 013/260] feat(ui) - dashboard - report --- .../CustomMetricOverviewChart.tsx | 2 +- .../ResponseTime/ResponseTime.tsx | 2 +- .../DashboardView/DashboardView.tsx | 18 +- .../DashboardWidgetGrid.tsx | 9 +- .../WidgetWrapper/WidgetWrapper.tsx | 9 +- frontend/app/components/hocs/withReport.tsx | 142 +++++++++ frontend/app/styles/general.css | 27 +- frontend/app/svg/icons/filetype-pdf.svg | 3 + frontend/app/svg/icons/report.pdf | Bin 0 -> 929040 bytes frontend/app/utils.js | 13 + frontend/package-lock.json | 294 +++++++++++++++++- frontend/package.json | 2 + 12 files changed, 488 insertions(+), 33 deletions(-) create mode 100644 frontend/app/components/hocs/withReport.tsx create mode 100644 frontend/app/svg/icons/filetype-pdf.svg create mode 100644 frontend/app/svg/icons/report.pdf diff --git a/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricOverviewChart/CustomMetricOverviewChart.tsx b/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricOverviewChart/CustomMetricOverviewChart.tsx index 1f65e1c81..b6d0ff995 100644 --- a/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricOverviewChart/CustomMetricOverviewChart.tsx +++ b/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricOverviewChart/CustomMetricOverviewChart.tsx @@ -33,7 +33,7 @@ function CustomMetricOverviewChart(props: Props) { {gradientDef} diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/ResponseTime/ResponseTime.tsx b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/ResponseTime/ResponseTime.tsx index e1af351ee..47e47e12e 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/ResponseTime/ResponseTime.tsx +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/ResponseTime/ResponseTime.tsx @@ -47,7 +47,7 @@ function ResponseTime(props: Props) { /> */} - + @@ -115,6 +118,7 @@ function DashboardView(props: Props) { siteId={siteId} dashboardId={dashboardId} onEditHandler={onAddWidgets} + id="report" /> void; + id?: string; } function DashboardWidgetGrid(props) { const { dashboardId, siteId } = props; const { dashboardStore } = useStore(); const loading = useObserver(() => dashboardStore.isLoading); - const dashbaord: any = dashboardStore.selectedDashboard; - const list: any = useObserver(() => dashbaord?.widgets); + const dashboard: any = dashboardStore.selectedDashboard; + const list: any = useObserver(() => dashboard?.widgets); return useObserver(() => ( @@ -29,13 +30,13 @@ function DashboardWidgetGrid(props) { } > -
+
{list && list.map((item, index) => ( dashbaord.swapWidgetPosition(dragIndex, hoverIndex)} + moveListItem={(dragIndex, hoverIndex) => dashboard.swapWidgetPosition(dragIndex, hoverIndex)} dashboardId={dashboardId} siteId={siteId} isWidget={true} diff --git a/frontend/app/components/Dashboard/components/WidgetWrapper/WidgetWrapper.tsx b/frontend/app/components/Dashboard/components/WidgetWrapper/WidgetWrapper.tsx index b29ab800c..8f2d5b051 100644 --- a/frontend/app/components/Dashboard/components/WidgetWrapper/WidgetWrapper.tsx +++ b/frontend/app/components/Dashboard/components/WidgetWrapper/WidgetWrapper.tsx @@ -86,14 +86,15 @@ function WidgetWrapper(props: Props) { }} ref={dragDropRef} onClick={props.onClick ? props.onClick : () => {}} + id={`widget-${widget.widgetId}`} > {isTemplate && }
-

{widget.name}

+
{widget.name}
{isWidget && ( -
+
{!isPredefined && ( <> @@ -118,11 +119,11 @@ function WidgetWrapper(props: Props) { )}
- + {/* */}
-
+ {/*
*/}
)); } diff --git a/frontend/app/components/hocs/withReport.tsx b/frontend/app/components/hocs/withReport.tsx new file mode 100644 index 000000000..d5f77adc9 --- /dev/null +++ b/frontend/app/components/hocs/withReport.tsx @@ -0,0 +1,142 @@ +import React, { useEffect } from 'react'; +import { convertElementToImage } from 'App/utils'; +import { jsPDF } from "jspdf"; +import { useStore } from 'App/mstore'; +import { observer, useObserver } from 'mobx-react-lite'; +import { connect } from 'react-redux'; +interface Props { + site: any +} +export default function withReport

( + WrappedComponent: React.ComponentType

, +) { + const ComponentWithReport = (props: P) => { + const [rendering, setRendering] = React.useState(false); + const { site } = props; + const { dashboardStore } = useStore(); + const dashboard: any = useObserver(() => dashboardStore.selectedDashboard); + const widgets: any = useObserver(() => dashboard?.widgets); + const period = useObserver(() => dashboardStore.period); + console.log('site', site) + + const addFooters = (doc) => { + const pageCount = doc.internal.getNumberOfPages(); + for(var i = 1; i <= pageCount; i++) { + doc.setPage(i); + doc.setFontSize(10); + doc.setTextColor(136,136,136); + doc.text('Page ' + String(i) + ' of ' + String(pageCount), 196,285,null,null,"right"); + } + } + + const renderReport = async () => { + document.body.scrollIntoView(); + const doc = new jsPDF('p', 'mm', 'a4'); + + doc.addMetadata('Author', 'OpenReplay'); + doc.addMetadata('Title', 'OpenReplay Report'); + doc.addMetadata('Subject', 'OpenReplay Report'); + doc.addMetadata('Keywords', 'OpenReplay Report'); + doc.addMetadata('Creator', 'OpenReplay'); + doc.addMetadata('Producer', 'OpenReplay'); + doc.addMetadata('CreationDate', new Date().toISOString()); + + + const parentElement = document.getElementById('report') as HTMLElement; + const pageHeight = 1200; + const pagesCount = parentElement.offsetHeight / pageHeight; + const pages: Array = []; + for(let i = 0; i < pagesCount; i++) { + const page = document.createElement('div'); + page.classList.add('page'); + page.style.height = `${pageHeight}px`; + page.style.whiteSpace = 'no-wrap !important'; + + const childrens = Array.from(parentElement.children).filter((child) => { + const rect = child.getBoundingClientRect(); + const parentRect = parentElement.getBoundingClientRect(); + const top = rect.top - parentRect.top; + return top >= i * pageHeight && top < (i + 1) * pageHeight; + }); + if (childrens.length > 0) { + pages.push(childrens); + } + } + + const rportLayer = document.getElementById("report-layer"); + + pages.forEach(async (page, index) => { + const pageDiv = document.createElement('div'); + pageDiv.classList.add('grid', 'gap-4', 'grid-cols-4', 'items-start', 'pb-10', 'auto-rows-min', 'printable-report'); + pageDiv.id = `page-${index}`; + pageDiv.style.backgroundColor = '#f6f6f6'; + pageDiv.style.gridAutoRows = 'min-content'; + pageDiv.style.padding = '30px'; + pageDiv.style.height = '490mm'; + + if (index === 0) { + const header = document.getElementById('report-header')?.cloneNode(true) as HTMLElement; + header.classList.add('col-span-4'); + header.style.display = 'block'; + pageDiv.appendChild(header); + } + page.forEach((child) => { + pageDiv.appendChild(child.cloneNode(true)); + }) + rportLayer?.appendChild(pageDiv); + }) + + setTimeout(async () => { + for (let i = 0; i < pages.length; i++) { + const pageDiv = document.getElementById(`page-${i}`) as HTMLElement; + const pageImage = await convertElementToImage(pageDiv); + doc.addImage(pageImage, 'PNG', 0, 0, 210, 0); + if (i === pages.length - 1) { + addFooters(doc); + doc.save('report.pdf'); + rportLayer!.innerHTML = ''; + } else { + doc.addPage(); + } + } + }, 100) + } + + return ( + <> +

+
+
+ +
+
+ Project: {site && site.name} +
+
+
+
{dashboard && dashboard.name}
+
+ {period && (period.range.start.format('MMM Do YY') + ' - ' + period.range.end.format('MMM Do YY'))} +
+
+
+ +
+ + + ) + } + + return connect(state => ({ + site: state.getIn(['site', 'instance']), + }))(ComponentWithReport); +} \ No newline at end of file diff --git a/frontend/app/styles/general.css b/frontend/app/styles/general.css index 7e99468ad..245158049 100644 --- a/frontend/app/styles/general.css +++ b/frontend/app/styles/general.css @@ -260,8 +260,6 @@ p { } } - - .tippy-tooltip.openreplay-theme { background-color: $tealx; color: white; @@ -273,4 +271,29 @@ p { .tippy-tooltip.openreplay-theme .tippy-backdrop { background-color: $tealx; +} + +@media print { + .no-print { + display:none !important; + } +} + +.printable-report * { + white-space: nowrap !important; +} +.recharts-default-legend { + display: flex !important; + align-items: center; + justify-content: center; +} + +.recharts-legend-item { + display: flex !important; + align-items: center !important; + white-space: nowrap !important; +} + +.recharts-legend-item-text { + white-space: nowrap !important; } \ No newline at end of file diff --git a/frontend/app/svg/icons/filetype-pdf.svg b/frontend/app/svg/icons/filetype-pdf.svg new file mode 100644 index 000000000..e1fc9b698 --- /dev/null +++ b/frontend/app/svg/icons/filetype-pdf.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/frontend/app/svg/icons/report.pdf b/frontend/app/svg/icons/report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..33eab9271109318b47ea35bb835b4ea9218715ac GIT binary patch literal 929040 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%0A=5YzhXVYlBXQQz&TF3k*8^|jX{vbik^KbN2Z|+ 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%0AbV`5FW6%C5Sw_zU&Wl9ep5aX8 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

pYYl(w>yGkOF=B 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

    *3<|XPA;(6JRV#<3$?l9!O=lu+C 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𝔑q0$*|3#vU2^y6A8$O%7_TKYW3kE>Xf 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 literal 0 HcmV?d00001 diff --git a/frontend/app/utils.js b/frontend/app/utils.js index 5f7e446fa..f7ae27b5b 100644 --- a/frontend/app/utils.js +++ b/frontend/app/utils.js @@ -1,5 +1,6 @@ import JSBI from 'jsbi'; import chroma from "chroma-js"; +import * as htmlToImage from 'html-to-image'; export function debounce(callback, wait, context = this) { let timeout = null; @@ -246,4 +247,16 @@ export const positionOfTheNumber = (min, max, value, length) => { const interval = (max - min) / length; const position = Math.round((value - min) / interval); return position; +} + +export const convertElementToImage = async (el) => { + const fontEmbedCss = await htmlToImage.getFontEmbedCSS(el); + const image = await htmlToImage.toJpeg(el, { + pixelRatio: 2, + fontEmbedCss, + filter: function (node) { + return node.id !== 'no-print'; + }, + }); + return image; } \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 75fcde026..294de4294 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -15,9 +15,11 @@ "codemirror": "^5.62.3", "copy-to-clipboard": "^3.3.1", "deep-diff": "^1.0.2", + "html-to-image": "^1.9.0", "immutable": "^4.0.0-rc.12", "jsbi": "^4.1.0", "jshint": "^2.11.1", + "jspdf": "^2.5.1", "luxon": "^1.24.1", "mobx": "^6.3.8", "mobx-react-lite": "^3.1.6", @@ -4679,7 +4681,7 @@ "version": "14.18.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.13.tgz", "integrity": "sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==", - "dev": true + "devOptional": true }, "node_modules/@types/node-fetch": { "version": "2.6.1", @@ -4731,7 +4733,7 @@ "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true + "devOptional": true }, "node_modules/@types/q": { "version": "1.5.5", @@ -4745,11 +4747,17 @@ "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", "dev": true }, + "node_modules/@types/raf": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.0.tgz", + "integrity": "sha512-taW5/WYqo36N7V39oYyHP9Ipfd5pNFvGTIQsNGj86xV88YQ7GnI30/yMfKDF7Zgin0m3e+ikX88FvImnK4RjGw==", + "optional": true + }, "node_modules/@types/react": { "version": "18.0.6", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.6.tgz", "integrity": "sha512-bPqwzJRzKtfI0mVYr5R+1o9BOE8UEXefwc1LwcBtfnaAn6OoqMhLa/91VA8aeWfDPJt1kHvYKI8RHcQybZLHHA==", - "dev": true, + "devOptional": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -4769,7 +4777,7 @@ "version": "3.0.11", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==", - "dev": true + "devOptional": true }, "node_modules/@types/resize-observer-browser": { "version": "0.1.7", @@ -4780,7 +4788,7 @@ "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true + "devOptional": true }, "node_modules/@types/source-list-map": { "version": "0.1.2", @@ -5625,7 +5633,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, "bin": { "atob": "bin/atob.js" }, @@ -6139,6 +6146,15 @@ "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=" }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "optional": true, + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -6623,6 +6639,17 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/buffer": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", @@ -6908,6 +6935,25 @@ } ] }, + "node_modules/canvg": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.10.tgz", + "integrity": "sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q==", + "optional": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@types/raf": "^3.4.0", + "core-js": "^3.8.3", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.7", + "rgbcolor": "^1.0.1", + "stackblur-canvas": "^2.0.0", + "svg-pathdata": "^6.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/case-sensitive-paths-webpack-plugin": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", @@ -7834,7 +7880,7 @@ "version": "3.22.2", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.2.tgz", "integrity": "sha512-Z5I2vzDnEIqO2YhELVMFcL1An2CIsFe9Q7byZhs8c/QxummxZlAHw33TUHbIte987LkisOgL0LwQ1P9D6VISnA==", - "dev": true, + "devOptional": true, "hasInstallScript": true, "funding": { "type": "opencollective", @@ -8333,6 +8379,15 @@ "postcss": "^8.0.9" } }, + "node_modules/css-line-break": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", + "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", + "optional": true, + "dependencies": { + "utrie": "^1.0.2" + } + }, "node_modules/css-loader": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", @@ -9385,6 +9440,12 @@ "domelementtype": "1" } }, + "node_modules/dompurify": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.6.tgz", + "integrity": "sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg==", + "optional": true + }, "node_modules/domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", @@ -10858,6 +10919,11 @@ "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", "dev": true }, + "node_modules/fflate": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", + "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==" + }, "node_modules/figgy-pudding": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", @@ -12655,6 +12721,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/html-to-image": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.9.0.tgz", + "integrity": "sha512-9gaDCIYg62Ek07F2pBk76AHgYZ2gxq2YALU7rK3gNCqXuhu6cWzsOQqM7qGbjZiOzxGzrU1deDqZpAod2NEwbA==" + }, "node_modules/html-void-elements": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", @@ -12726,6 +12797,19 @@ "object-assign": "^4.0.1" } }, + "node_modules/html2canvas": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", + "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", + "optional": true, + "dependencies": { + "css-line-break": "^2.1.0", + "text-segmentation": "^1.0.3" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/htmlparser2": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", @@ -14098,6 +14182,23 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jspdf": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.1.tgz", + "integrity": "sha512-hXObxz7ZqoyhxET78+XR34Xu2qFGrJJ2I2bE5w4SM8eFaFEkW2xcGRVUss360fYelwRSid/jT078kbNvmoW0QA==", + "dependencies": { + "@babel/runtime": "^7.14.0", + "atob": "^2.1.2", + "btoa": "^1.2.1", + "fflate": "^0.4.8" + }, + "optionalDependencies": { + "canvg": "^3.0.6", + "core-js": "^3.6.0", + "dompurify": "^2.2.0", + "html2canvas": "^1.0.0-rc.5" + } + }, "node_modules/jsx-ast-utils": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.2.tgz", @@ -19986,6 +20087,15 @@ "node": ">=0.10.0" } }, + "node_modules/rgbcolor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", + "integrity": "sha1-1lBezbMEplldom+ktDMHMGd1lF0=", + "optional": true, + "engines": { + "node": ">= 0.8.15" + } + }, "node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -20986,6 +21096,15 @@ "node": "*" } }, + "node_modules/stackblur-canvas": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.5.0.tgz", + "integrity": "sha512-EeNzTVfj+1In7aSLPKDD03F/ly4RxEuF/EX0YcOG0cKoPXs+SLZxDawQbexQDBzwROs4VKLWTOaZQlZkGBFEIQ==", + "optional": true, + "engines": { + "node": ">=0.1.14" + } + }, "node_modules/stackframe": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz", @@ -21487,6 +21606,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svg-pathdata": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", + "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==", + "optional": true, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/svgo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", @@ -22128,6 +22256,15 @@ "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", "dev": true }, + "node_modules/text-segmentation": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", + "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", + "optional": true, + "dependencies": { + "utrie": "^1.0.2" + } + }, "node_modules/throttle-debounce": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", @@ -23299,6 +23436,15 @@ "node": ">= 0.4.0" } }, + "node_modules/utrie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", + "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", + "optional": true, + "dependencies": { + "base64-arraybuffer": "^1.0.2" + } + }, "node_modules/uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", @@ -29063,7 +29209,7 @@ "version": "14.18.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.13.tgz", "integrity": "sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==", - "dev": true + "devOptional": true }, "@types/node-fetch": { "version": "2.6.1", @@ -29115,7 +29261,7 @@ "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true + "devOptional": true }, "@types/q": { "version": "1.5.5", @@ -29129,11 +29275,17 @@ "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", "dev": true }, + "@types/raf": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.0.tgz", + "integrity": "sha512-taW5/WYqo36N7V39oYyHP9Ipfd5pNFvGTIQsNGj86xV88YQ7GnI30/yMfKDF7Zgin0m3e+ikX88FvImnK4RjGw==", + "optional": true + }, "@types/react": { "version": "18.0.6", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.6.tgz", "integrity": "sha512-bPqwzJRzKtfI0mVYr5R+1o9BOE8UEXefwc1LwcBtfnaAn6OoqMhLa/91VA8aeWfDPJt1kHvYKI8RHcQybZLHHA==", - "dev": true, + "devOptional": true, "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -29144,7 +29296,7 @@ "version": "3.0.11", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==", - "dev": true + "devOptional": true } } }, @@ -29166,7 +29318,7 @@ "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true + "devOptional": true }, "@types/source-list-map": { "version": "0.1.2", @@ -29891,8 +30043,7 @@ "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "autoprefixer": { "version": "7.2.6", @@ -30304,6 +30455,12 @@ "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=" }, + "base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "optional": true + }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -30683,6 +30840,11 @@ "picocolors": "^1.0.0" } }, + "btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==" + }, "buffer": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", @@ -30911,6 +31073,22 @@ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==" }, + "canvg": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.10.tgz", + "integrity": "sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q==", + "optional": true, + "requires": { + "@babel/runtime": "^7.12.5", + "@types/raf": "^3.4.0", + "core-js": "^3.8.3", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.7", + "rgbcolor": "^1.0.1", + "stackblur-canvas": "^2.0.0", + "svg-pathdata": "^6.0.3" + } + }, "case-sensitive-paths-webpack-plugin": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", @@ -31656,7 +31834,7 @@ "version": "3.22.2", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.2.tgz", "integrity": "sha512-Z5I2vzDnEIqO2YhELVMFcL1An2CIsFe9Q7byZhs8c/QxummxZlAHw33TUHbIte987LkisOgL0LwQ1P9D6VISnA==", - "dev": true + "devOptional": true }, "core-js-compat": { "version": "3.22.2", @@ -32073,6 +32251,15 @@ "dev": true, "requires": {} }, + "css-line-break": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", + "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", + "optional": true, + "requires": { + "utrie": "^1.0.2" + } + }, "css-loader": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", @@ -32946,6 +33133,12 @@ "domelementtype": "1" } }, + "dompurify": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.6.tgz", + "integrity": "sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg==", + "optional": true + }, "domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", @@ -34167,6 +34360,11 @@ "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", "dev": true }, + "fflate": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", + "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==" + }, "figgy-pudding": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", @@ -35585,6 +35783,11 @@ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==" }, + "html-to-image": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.9.0.tgz", + "integrity": "sha512-9gaDCIYg62Ek07F2pBk76AHgYZ2gxq2YALU7rK3gNCqXuhu6cWzsOQqM7qGbjZiOzxGzrU1deDqZpAod2NEwbA==" + }, "html-void-elements": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", @@ -35638,6 +35841,16 @@ } } }, + "html2canvas": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", + "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", + "optional": true, + "requires": { + "css-line-break": "^2.1.0", + "text-segmentation": "^1.0.3" + } + }, "htmlparser2": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", @@ -36669,6 +36882,21 @@ "universalify": "^2.0.0" } }, + "jspdf": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.1.tgz", + "integrity": "sha512-hXObxz7ZqoyhxET78+XR34Xu2qFGrJJ2I2bE5w4SM8eFaFEkW2xcGRVUss360fYelwRSid/jT078kbNvmoW0QA==", + "requires": { + "@babel/runtime": "^7.14.0", + "atob": "^2.1.2", + "btoa": "^1.2.1", + "canvg": "^3.0.6", + "core-js": "^3.6.0", + "dompurify": "^2.2.0", + "fflate": "^0.4.8", + "html2canvas": "^1.0.0-rc.5" + } + }, "jsx-ast-utils": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.2.tgz", @@ -41376,6 +41604,12 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, + "rgbcolor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", + "integrity": "sha1-1lBezbMEplldom+ktDMHMGd1lF0=", + "optional": true + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -42227,6 +42461,12 @@ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", "dev": true }, + "stackblur-canvas": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.5.0.tgz", + "integrity": "sha512-EeNzTVfj+1In7aSLPKDD03F/ly4RxEuF/EX0YcOG0cKoPXs+SLZxDawQbexQDBzwROs4VKLWTOaZQlZkGBFEIQ==", + "optional": true + }, "stackframe": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz", @@ -42639,6 +42879,12 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, + "svg-pathdata": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", + "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==", + "optional": true + }, "svgo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", @@ -43125,6 +43371,15 @@ "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", "dev": true }, + "text-segmentation": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", + "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", + "optional": true, + "requires": { + "utrie": "^1.0.2" + } + }, "throttle-debounce": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", @@ -44005,6 +44260,15 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, + "utrie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", + "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", + "optional": true, + "requires": { + "base64-arraybuffer": "^1.0.2" + } + }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index 7f51ba174..6e683ad27 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -22,9 +22,11 @@ "codemirror": "^5.62.3", "copy-to-clipboard": "^3.3.1", "deep-diff": "^1.0.2", + "html-to-image": "^1.9.0", "immutable": "^4.0.0-rc.12", "jsbi": "^4.1.0", "jshint": "^2.11.1", + "jspdf": "^2.5.1", "luxon": "^1.24.1", "mobx": "^6.3.8", "mobx-react-lite": "^3.1.6", From dc69131499bd4187d9a8a31dbadcc2d5733cf24e Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Fri, 29 Apr 2022 11:22:00 +0200 Subject: [PATCH 014/260] Deleted commented (unused) code --- .../pkg/messages/legacy-message-transform.go | 1 - backend/services/http/handlers-depricated.go | 1 - backend/services/http/handlers-ios.go | 26 ++------------ backend/services/http/handlers-web.go | 36 ------------------- 4 files changed, 3 insertions(+), 61 deletions(-) delete mode 100644 backend/services/http/handlers-depricated.go diff --git a/backend/pkg/messages/legacy-message-transform.go b/backend/pkg/messages/legacy-message-transform.go index 031c4444a..c22b73378 100644 --- a/backend/pkg/messages/legacy-message-transform.go +++ b/backend/pkg/messages/legacy-message-transform.go @@ -10,7 +10,6 @@ func transformDepricated(msg Message) Message { ID: m.ID, HesitationTime: m.HesitationTime, Label: m.Label, - // Selector: '', } // case *FetchDepricated: // return &Fetch { diff --git a/backend/services/http/handlers-depricated.go b/backend/services/http/handlers-depricated.go deleted file mode 100644 index 06ab7d0f9..000000000 --- a/backend/services/http/handlers-depricated.go +++ /dev/null @@ -1 +0,0 @@ -package main diff --git a/backend/services/http/handlers-ios.go b/backend/services/http/handlers-ios.go index 8116980e1..a7b6f984a 100644 --- a/backend/services/http/handlers-ios.go +++ b/backend/services/http/handlers-ios.go @@ -23,22 +23,9 @@ func startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) { TrackerVersion string `json:"trackerVersion"` RevID string `json:"revID"` UserUUID *string `json:"userUUID"` - //UserOS string `json"userOS"` //hardcoded 'MacOS' - UserOSVersion string `json:"userOSVersion"` - UserDevice string `json:"userDevice"` - Timestamp uint64 `json:"timestamp"` - // UserDeviceType uint 0:phone 1:pad 2:tv 3:carPlay 5:mac - // “performances”:{ - // “activeProcessorCount”:8, - // “isLowPowerModeEnabled”:0, - // “orientation”:0, - // “systemUptime”:585430, - // “batteryState”:0, - // “thermalState”:0, - // “batteryLevel”:0, - // “processorCount”:8, - // “physicalMemory”:17179869184 - // }, + UserOSVersion string `json:"userOSVersion"` + UserDevice string `json:"userDevice"` + Timestamp uint64 `json:"timestamp"` } type response struct { Token string `json:"token"` @@ -111,14 +98,7 @@ func startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) { })) } - // imagesHashList, err := s3.GetFrequentlyUsedKeys(*(req.EncodedProjectID)) // TODO: reuse index: ~ frequency * size - // if err != nil { - // responseWithError(w, http.StatusInternalServerError, err) - // return - // } - responseWithJSON(w, &response{ - // ImagesHashList: imagesHashList, Token: tokenizer.Compose(*tokenData), UserUUID: userUUID, SessionID: strconv.FormatUint(tokenData.ID, 10), diff --git a/backend/services/http/handlers-web.go b/backend/services/http/handlers-web.go index 7aab5bfbc..e5cf57a60 100644 --- a/backend/services/http/handlers-web.go +++ b/backend/services/http/handlers-web.go @@ -105,10 +105,7 @@ func startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) { })) } - //delayDuration := time.Now().Sub(startTime) responseWithJSON(w, &response{ - //Timestamp: startTime.UnixNano() / 1e6, - //Delay: delayDuration.Nanoseconds() / 1e6, Token: tokenizer.Compose(*tokenData), UserUUID: userUUID, SessionID: strconv.FormatUint(tokenData.ID, 10), @@ -154,35 +151,6 @@ func pushMessagesHandlerWeb(w http.ResponseWriter, r *http.Request) { } } - // switch msg.(type) { - // case *BatchMeta, // TODO: watchout! Meta().Index'es are changed here (though it is still unique for the topic-session pair) - // *SetPageLocation, - // *PageLoadTiming, - // *PageRenderTiming, - // *PerformanceTrack, - // *SetInputTarget, - // *SetInputValue, - // *MouseClick, - // *RawErrorEvent, - // *JSException, - // *ResourceTiming, - // *RawCustomEvent, - // *CustomIssue, - // *Fetch, - // *StateAction, - // *GraphQL, - // *CreateElementNode, - // *CreateTextNode, - // *RemoveNode, - // *CreateDocument, - // *RemoveNodeAttribute, - // *MoveNode, - // *SetCSSData, - // *CSSInsertRule, - // *CSSDeleteRule: - // analyticsMessages = append(analyticsMessages, msg) - //} - return msg }) if err != nil { @@ -190,9 +158,6 @@ func pushMessagesHandlerWeb(w http.ResponseWriter, r *http.Request) { return } producer.Produce(TOPIC_RAW_WEB, sessionData.ID, rewritenBuf) - //producer.Produce(TOPIC_ANALYTICS, sessionData.ID, WriteBatch(analyticsMessages)) - //duration := time.Now().Sub(startTime) - //log.Printf("Sended batch within %v nsec; %v nsek/byte", duration.Nanoseconds(), duration.Nanoseconds()/int64(len(buf))) w.WriteHeader(http.StatusOK) } @@ -201,7 +166,6 @@ func notStartedHandlerWeb(w http.ResponseWriter, r *http.Request) { ProjectKey *string `json:"projectKey"` TrackerVersion string `json:"trackerVersion"` DoNotTrack bool `json:"DoNotTrack"` - // RevID string `json:"revID"` } req := &request{} body := http.MaxBytesReader(w, r.Body, JSON_SIZE_LIMIT) From 89ba052d416948aef6115fbc93b56364d9e4dad2 Mon Sep 17 00:00:00 2001 From: rjshrjndrn Date: Fri, 29 Apr 2022 11:58:07 +0200 Subject: [PATCH 015/260] chore(vagrant): Adding development readme Signed-off-by: rjshrjndrn --- api/development.md | 43 ++++++++++++++++++++++++ backend/development.md | 21 ++++++++++++ frontend/development.md | 23 +++++++++++++ scripts/vagrant/README.md | 69 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 156 insertions(+) create mode 100644 api/development.md create mode 100644 backend/development.md create mode 100644 frontend/development.md create mode 100644 scripts/vagrant/README.md diff --git a/api/development.md b/api/development.md new file mode 100644 index 000000000..116518604 --- /dev/null +++ b/api/development.md @@ -0,0 +1,43 @@ +### Prerequisites + +- [Vagrant](../scripts/vagrant/README.md) +- Python 3.9 +- Pipenv + +### Development environment + +```bash +**FOSS:** +cd openreplay/api +# Make your own copy of .env file and edit it as you want +cp .env.dev .env + +# Create a .venv folder to contain all you dependencies +mkdir .venv + +# Installing dependencies (pipenv will detect the .venv folder and use it as a target) +pipenv install -r requirements.txt [--skip-lock] + +# Create a .venv folder to contain all you dependencies +mkdir .venv + +# Installing dependencies (pipenv will detect the .venv folder and use it as a target) +pipenv install -r requirements.txt [--skip-lock] + +# These commands must bu used everytime you make changes to FOSS. +# To clean the unused files before getting new ones +bash clean.sh +# To copy commun files from FOSS +bash prepare-dev.sh +``` + +### Building and deploying locally + +```bash +cd openreplay-contributions +vagrant ssh +cd openreplay-dev/openreplay/scripts/helmcharts +# For complete list of options +# bash local_deploy.sh help +bash local_deploy.sh api +``` diff --git a/backend/development.md b/backend/development.md new file mode 100644 index 000000000..0e7295c8b --- /dev/null +++ b/backend/development.md @@ -0,0 +1,21 @@ +### Prerequisites + +- [Vagrant](../scripts/vagrant/README.md) + +### Development environment + +```bash +docker build -f Dockerfile.bundle . + +``` + +### Building and deploying locally + +```bash +cd openreplay-contributions +vagrant ssh +cd openreplay-dev/openreplay/scripts/helmcharts +# For complete list of options +# bash local_deploy.sh help +bash local_deploy.sh +``` diff --git a/frontend/development.md b/frontend/development.md new file mode 100644 index 000000000..904c85f46 --- /dev/null +++ b/frontend/development.md @@ -0,0 +1,23 @@ +### Prerequisites + +- [Vagrant](../scripts/vagrant/README.md) +- Node Version 17 +- npm + +### Development environment + +```bash +cd openreplay/frontend +# Change endpoints to local openreplay installation +sed -i 's#PRODUCTION: true#PRODUCTION: false#g' env.js +sed -i "s#API_EDP: .*#API_EDP: 'http://openreplay.local/api',#g" env.js +sed -i "s#ASSETS_HOST: .*#ASSETS_HOST: 'http://openreplay.local/assets',#g" env.js + +# Installing dependencies +npm install + +# Generating assets +npm run gen:css-types +npm run gen:icons +npm run gen:colors +``` diff --git a/scripts/vagrant/README.md b/scripts/vagrant/README.md new file mode 100644 index 000000000..ffe132c73 --- /dev/null +++ b/scripts/vagrant/README.md @@ -0,0 +1,69 @@ + + +### Installation + +- Vagrant: [https://www.vagrantup.com/downloads](https://www.vagrantup.com/downloads) +- VirtualBox: [https://www.virtualbox.org/wiki/Downloads](https://www.virtualbox.org/wiki/Downloads) + +### Configuration + +```bash +mkdir openreplay-contributions +cd openreplay-contributions +git clone https://github.com/openreplay/openreplay -b dev +cp -rf openreplay/scripts/vagrant/ . +vagrant up +``` + +### To access OpenReplay instance + +```bash +Add ip address from about output to your local resolver + +## Mac/Linux + +Copy paste the command from the vagrant output + +## Windows + +Use the following instructions if you’re running Windows 10 or Windows 8: + Press the Windows key. + Type Notepad in the search field. + In the search results, right-click Notepad and select Run as administrator. + From Notepad, open the following file: + c:\Windows\System32\Drivers\etc\hosts + add the below line in the hosts file + openreplay.local + Select File > Save to save your changes. + +**Open browser** +http://openreplay.local +``` + +### To start developing + +- [Frontend](../../frontend/development.md) +- [API](../../api/development.md) +- [Backend](../../backend/development.md) + +### Notes + +It’ll be a good practice to take a snapshot once the initial setup is complete, so that if something is not working as expected, you can always fall back to a stable known version. +```bash +cd openreplay-dev +vagrant snapshot save +# For example +vagrant snapshot save openreplay-160-base +``` + +```bash +# To restore the snapshot +cd openreplay-dev +vagrant snapshot restore openreplay-160-base +``` + + From 878c742c2fbf7cbc720c1a96a74d550114b7269e Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Fri, 29 Apr 2022 12:32:34 +0200 Subject: [PATCH 016/260] feat(ui) - dashboard - report --- frontend/app/components/hocs/withReport.tsx | 47 +- .../app/components/ui/ItemMenu/ItemMenu.js | 8 +- .../ui/Notification/Notification.js | 1 + frontend/app/{date.js => date.ts} | 8 +- frontend/app/utils.js | 5 + frontend/package-lock.json | 1184 +++++++++-------- frontend/package.json | 2 +- 7 files changed, 649 insertions(+), 606 deletions(-) rename frontend/app/{date.js => date.ts} (94%) diff --git a/frontend/app/components/hocs/withReport.tsx b/frontend/app/components/hocs/withReport.tsx index d5f77adc9..4984796d7 100644 --- a/frontend/app/components/hocs/withReport.tsx +++ b/frontend/app/components/hocs/withReport.tsx @@ -4,6 +4,8 @@ import { jsPDF } from "jspdf"; import { useStore } from 'App/mstore'; import { observer, useObserver } from 'mobx-react-lite'; import { connect } from 'react-redux'; +import { fileNameFormat } from 'App/utils'; +import { toast } from 'react-toastify'; interface Props { site: any } @@ -17,21 +19,32 @@ export default function withReport

    ( const dashboard: any = useObserver(() => dashboardStore.selectedDashboard); const widgets: any = useObserver(() => dashboard?.widgets); const period = useObserver(() => dashboardStore.period); - console.log('site', site) const addFooters = (doc) => { const pageCount = doc.internal.getNumberOfPages(); for(var i = 1; i <= pageCount; i++) { doc.setPage(i); - doc.setFontSize(10); + doc.setFontSize(8); doc.setTextColor(136,136,136); - doc.text('Page ' + String(i) + ' of ' + String(pageCount), 196,285,null,null,"right"); + doc.text('Page ' + String(i) + ' of ' + String(pageCount), 200,290,null,null,"right"); + doc.addImage('/logo-open-replay-grey.png', 'png', 10, 288, 20, 0); } } + + const renderPromise = async (): Promise => { + const promise = new Promise((resolve, reject) => { + renderReport(resolve); + }); + toast.promise(promise, { + pending: 'Generating report...', + success: 'Report generated successfully', + }) + } - const renderReport = async () => { + const renderReport = async (cb) => { document.body.scrollIntoView(); const doc = new jsPDF('p', 'mm', 'a4'); + const now = new Date().toISOString(); doc.addMetadata('Author', 'OpenReplay'); doc.addMetadata('Title', 'OpenReplay Report'); @@ -39,7 +52,7 @@ export default function withReport

    ( doc.addMetadata('Keywords', 'OpenReplay Report'); doc.addMetadata('Creator', 'OpenReplay'); doc.addMetadata('Producer', 'OpenReplay'); - doc.addMetadata('CreationDate', new Date().toISOString()); + doc.addMetadata('CreationDate', now); const parentElement = document.getElementById('report') as HTMLElement; @@ -71,8 +84,12 @@ export default function withReport

    ( pageDiv.id = `page-${index}`; pageDiv.style.backgroundColor = '#f6f6f6'; pageDiv.style.gridAutoRows = 'min-content'; - pageDiv.style.padding = '30px'; + pageDiv.style.padding = '50px'; pageDiv.style.height = '490mm'; + + if (index > 0) { + pageDiv.style.paddingTop = '100px'; + } if (index === 0) { const header = document.getElementById('report-header')?.cloneNode(true) as HTMLElement; @@ -93,8 +110,9 @@ export default function withReport

    ( doc.addImage(pageImage, 'PNG', 0, 0, 210, 0); if (i === pages.length - 1) { addFooters(doc); - doc.save('report.pdf'); + doc.save(fileNameFormat(dashboard.name + '_Report_' + Date.now(), '.pdf')); rportLayer!.innerHTML = ''; + cb(); } else { doc.addPage(); } @@ -105,17 +123,18 @@ export default function withReport

    ( return ( <>

    -
    -
    +
    +
    +
    REPORT
    - Project: {site && site.name} + Project: {site && site.name}
    -
    -
    {dashboard && dashboard.name}
    -
    +
    +
    {dashboard && dashboard.name}
    +
    {period && (period.range.start.format('MMM Do YY') + ' - ' + period.range.end.format('MMM Do YY'))}
    @@ -131,7 +150,7 @@ export default function withReport

    ( opacity: '0', }} >

    - + ) } diff --git a/frontend/app/components/ui/ItemMenu/ItemMenu.js b/frontend/app/components/ui/ItemMenu/ItemMenu.js index e97f6999b..450cd7fc7 100644 --- a/frontend/app/components/ui/ItemMenu/ItemMenu.js +++ b/frontend/app/components/ui/ItemMenu/ItemMenu.js @@ -22,17 +22,21 @@ export default class ItemMenu extends React.PureComponent { render() { const { items, label = "" } = this.props; const { displayed } = this.state; + const parentStyles = label ? 'rounded px-2 py-1 hover:bg-gray-light' : ''; return (
    -
    +
    {label && {label}}
    { this.menuBtnRef = ref; } } - className={cn("w-10 h-10 rounded-full flex items-center justify-center hover:bg-gray-light", { 'bg-gray-light' : displayed })} + className={cn("rounded-full flex items-center justify-center hover:bg-gray-light", { 'bg-gray-light' : displayed, "w-10 h-10" : !label })} role="button" > diff --git a/frontend/app/components/ui/Notification/Notification.js b/frontend/app/components/ui/Notification/Notification.js index c2e69d054..fb4ffb742 100644 --- a/frontend/app/components/ui/Notification/Notification.js +++ b/frontend/app/components/ui/Notification/Notification.js @@ -12,6 +12,7 @@ export default ({ transition = Flip, position = 'bottom-right', autoClose = 3000 autoClose={ autoClose } className={ styles.container } toastClassName={ styles.toast } + closeButton={false} { ...props } /> ); diff --git a/frontend/app/date.js b/frontend/app/date.ts similarity index 94% rename from frontend/app/date.js rename to frontend/app/date.ts index 089c48362..8a9501a86 100644 --- a/frontend/app/date.js +++ b/frontend/app/date.ts @@ -61,7 +61,7 @@ export const getDateFromMill = date => * @param {Date} Date to be checked. * @return {Boolean} */ -export const isToday = (date: Date):boolean => date.hasSame(new Date(), 'day'); +export const isToday = (date: DateTime):boolean => date.hasSame(new Date(), 'day'); export function formatDateTimeDefault(timestamp: number): string { @@ -113,4 +113,8 @@ export const formatMs = (ms: number): string => ms < 1000 ? `${ Math.trunc(ms) } export const convertTimestampToUtcTimestamp = (timestamp: number): number => { return DateTime.fromMillis(timestamp).toUTC().toMillis(); -} \ No newline at end of file +} + +export const nowFormatted = (format?: string): string => { + return DateTime.local().toFormat(format || 'LLL dd, yyyy, hh:mm a'); +} diff --git a/frontend/app/utils.js b/frontend/app/utils.js index f7ae27b5b..bdece4058 100644 --- a/frontend/app/utils.js +++ b/frontend/app/utils.js @@ -27,6 +27,11 @@ export function randomInt(a, b) { return Math.round(rand); } +export const fileNameFormat = (str = '', ext = '') => { + const name = str.replace(/[^a-zA-Z0-9]/g, '_'); + return `${name}${ext}`; +}; + export const toUnderscore = s => s.split(/(?=[A-Z])/).join('_').toLowerCase(); export const getUniqueFilter = keys => diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 294de4294..20678c368 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -46,7 +46,7 @@ "react-router-dom": "^4.3.1", "react-svg-map": "^2.2.0", "react-tippy": "^1.4.0", - "react-toastify": "^5.5.0", + "react-toastify": "^8.2.0", "react-virtualized": "^9.22.2", "recharts": "^2.1.9", "redux": "^4.0.5", @@ -113,12 +113,13 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" @@ -2263,10 +2264,32 @@ "node": ">=8" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz", + "integrity": "sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.0.tgz", + "integrity": "sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==", "dev": true, "engines": { "node": ">=6.0.0" @@ -2719,9 +2742,9 @@ } }, "node_modules/@socket.io/component-emitter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz", - "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" }, "node_modules/@storybook/addons": { "version": "6.4.22", @@ -4678,10 +4701,10 @@ "dev": true }, "node_modules/@types/node": { - "version": "14.18.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.13.tgz", - "integrity": "sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==", - "devOptional": true + "version": "14.18.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.16.tgz", + "integrity": "sha512-X3bUMdK/VmvrWdoTkz+VCn6nwKwrKCFTHtqwBIaQJNx4RUIBBUFXM00bqPz/DsDd+Icjmzm6/tyYZzeGVqb6/Q==", + "dev": true }, "node_modules/@types/node-fetch": { "version": "2.6.1", @@ -4733,7 +4756,7 @@ "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "devOptional": true + "dev": true }, "node_modules/@types/q": { "version": "1.5.5", @@ -4754,10 +4777,10 @@ "optional": true }, "node_modules/@types/react": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.6.tgz", - "integrity": "sha512-bPqwzJRzKtfI0mVYr5R+1o9BOE8UEXefwc1LwcBtfnaAn6OoqMhLa/91VA8aeWfDPJt1kHvYKI8RHcQybZLHHA==", - "devOptional": true, + "version": "18.0.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.8.tgz", + "integrity": "sha512-+j2hk9BzCOrrOSJASi5XiOyBbERk9jG5O73Ya4M0env5Ixi6vUNli4qy994AINcEF+1IEHISYFfIT4zwr++LKw==", + "dev": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -4777,7 +4800,7 @@ "version": "3.0.11", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==", - "devOptional": true + "dev": true }, "node_modules/@types/resize-observer-browser": { "version": "0.1.7", @@ -4788,7 +4811,7 @@ "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "devOptional": true + "dev": true }, "node_modules/@types/source-list-map": { "version": "0.1.2", @@ -5707,9 +5730,9 @@ } }, "node_modules/aws-sdk": { - "version": "2.1119.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1119.0.tgz", - "integrity": "sha512-f9xoIWo0/kLVfQ65UCkQ7G+Oxl/mjmdGQNPDcylU8dOjXGfc4cgWxTLThRLCsf9l/4yUjWgo+KtJgY6BWc9UjA==", + "version": "2.1124.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1124.0.tgz", + "integrity": "sha512-LIj2EmvduQmyjpSLoDPe2TvRBrGWhJKlCuC7lungN4f+qYPOfVWg6/c9GdP99W0q5p2IqhDkCmQ/ZZBpO1Z/Fg==", "dev": true, "dependencies": { "buffer": "4.9.2", @@ -6091,11 +6114,6 @@ "babylon": "bin/babylon.js" } }, - "node_modules/backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, "node_modules/bail": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", @@ -6306,24 +6324,27 @@ "dev": true }, "node_modules/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "dev": true, "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/body-parser/node_modules/bytes": { @@ -6350,18 +6371,6 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "dev": true, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/bonjour": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", @@ -6612,9 +6621,9 @@ } }, "node_modules/browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", "funding": [ { "type": "opencollective", @@ -6626,10 +6635,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", "escalade": "^3.1.1", - "node-releases": "^2.0.2", + "node-releases": "^2.0.3", "picocolors": "^1.0.0" }, "bin": { @@ -6921,9 +6930,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001332", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", - "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", + "version": "1.0.30001334", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001334.tgz", + "integrity": "sha512-kbaCEBRRVSoeNs74sCuq92MJyGrMtjWVfhltoHUCW4t4pXFvGjUBrfo47weBRViHkiV3eBYyIsfl956NtHGazw==", "funding": [ { "type": "opencollective", @@ -7379,9 +7388,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/color-string": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", - "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -7662,9 +7671,9 @@ } }, "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "dev": true, "engines": { "node": ">= 0.6" @@ -7877,9 +7886,9 @@ } }, "node_modules/core-js": { - "version": "3.22.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.2.tgz", - "integrity": "sha512-Z5I2vzDnEIqO2YhELVMFcL1An2CIsFe9Q7byZhs8c/QxummxZlAHw33TUHbIte987LkisOgL0LwQ1P9D6VISnA==", + "version": "3.22.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.3.tgz", + "integrity": "sha512-1t+2a/d2lppW1gkLXx3pKPVGbBdxXAkqztvWb1EJ8oF8O2gIGiytzflNiFEehYwVK/t2ryUsGBoOFFvNx95mbg==", "devOptional": true, "hasInstallScript": true, "funding": { @@ -7888,12 +7897,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.22.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.2.tgz", - "integrity": "sha512-Fns9lU06ZJ07pdfmPMu7OnkIKGPKDzXKIiuGlSvHHapwqMUF2QnnsWwtueFZtSyZEilP0o6iUeHQwpn7LxtLUw==", + "version": "3.22.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.3.tgz", + "integrity": "sha512-wliMbvPI2idgFWpFe7UEyHMvu6HWgW8WA+HnDRtgzoSDYvXFMpoGX1H3tPDDXrcfUSyXafCLDd7hOeMQHEZxGw==", "dev": true, "dependencies": { - "browserslist": "^4.20.2", + "browserslist": "^4.20.3", "semver": "7.0.0" }, "funding": { @@ -7911,9 +7920,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.22.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.2.tgz", - "integrity": "sha512-Lb+/XT4WC4PaCWWtZpNPaXmjiNDUe5CJuUtbkMrIM1kb1T/jJoAIp+bkVP/r5lHzMr+ZAAF8XHp7+my6Ol0ysQ==", + "version": "3.22.3", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.3.tgz", + "integrity": "sha512-oN88zz7nmKROMy8GOjs+LN+0LedIvbMdnB5XsTlhcOg1WGARt9l0LFg0zohdoFmCsEZ1h2ZbSQ6azj3M+vhzwQ==", "dev": true, "hasInstallScript": true, "funding": { @@ -9168,12 +9177,12 @@ "dev": true }, "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/deploy-aws-s3-cloudfront": { @@ -9206,10 +9215,14 @@ } }, "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, "node_modules/detab": { "version": "2.0.4", @@ -9364,9 +9377,9 @@ } }, "node_modules/dom-align": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.2.tgz", - "integrity": "sha512-pHuazgqrsTFrGU2WLDdXxCFabkdQDx72ddkraZNih1KsMcN5qsRSTR9O4VJRlwTPCPb5COYg3LOfiMHHcPInHg==" + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.3.tgz", + "integrity": "sha512-Gj9hZN3a07cbR6zviMUBOMPdWxYhbMI+x+WS0NAIu2zFZmbK8ys9R79g+iG9qLnlCwpFoaB+fKy8Pdv470GsPA==" }, "node_modules/dom-converter": { "version": "0.2.0", @@ -9586,9 +9599,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.118", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.118.tgz", - "integrity": "sha512-maZIKjnYDvF7Fs35nvVcyr44UcKNwybr93Oba2n3HkKDFAtk0svERkLN/HyczJDS3Fo4wU9th9fUQd09ZLtj1w==" + "version": "1.4.127", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.127.tgz", + "integrity": "sha512-nhD6S8nKI0O2MueC6blNOEZio+/PWppE/pevnf3LOlQA/fKPCrDp2Ao4wx4LFwmIkJpVdFdn2763YWLy9ENIZg==" }, "node_modules/element-resize-detector": { "version": "1.2.4", @@ -9686,19 +9699,15 @@ } }, "node_modules/engine.io-client": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.1.1.tgz", - "integrity": "sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.1.tgz", + "integrity": "sha512-5cu7xubVxEwoB6O9hJ6Zfu990yBVjXfyMlE1ZvfO5L8if3Kvc9bgDNEapV0C5pMp+5Om1UZFnljxoOuFm6dBKA==", "dependencies": { - "@socket.io/component-emitter": "~3.0.0", + "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", - "engine.io-parser": "~5.0.0", - "has-cors": "1.1.0", - "parseqs": "0.0.6", - "parseuri": "0.0.6", + "engine.io-parser": "~5.0.3", "ws": "~8.2.3", - "xmlhttprequest-ssl": "~2.0.0", - "yeast": "0.1.2" + "xmlhttprequest-ssl": "~2.0.0" } }, "node_modules/engine.io-client/node_modules/ws": { @@ -9902,9 +9911,9 @@ } }, "node_modules/es5-shim": { - "version": "4.6.5", - "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.6.5.tgz", - "integrity": "sha512-vfQ4UAai8szn0sAubCy97xnZ4sJVDD1gt/Grn736hg8D7540wemIb1YPrYZSTqlM2H69EQX1or4HU/tSwRTI3w==", + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.6.6.tgz", + "integrity": "sha512-Ay5QQE78I2WKUoZVZjL0AIuiIjsmXwZGkyCTH9+n6J1anPbb0ymDA27ASa2Lt0rhOpAlEKy2W0d17gJ1XOQ5eQ==", "dev": true, "engines": { "node": ">=0.4.0" @@ -10615,38 +10624,39 @@ } }, "node_modules/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.0.tgz", + "integrity": "sha512-EJEXxiTQJS3lIPrU1AE2vRuT7X7E+0KBbpm5GSoK524yl0K8X+er8zS2P14E64eqsVNoWbMCT7MpmQ+ErAhgRg==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.2", + "body-parser": "1.20.0", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.2", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.7", + "qs": "6.10.3", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -10670,18 +10680,6 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "node_modules/express/node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "dev": true, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/express/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -11011,17 +11009,17 @@ } }, "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "engines": { @@ -11435,9 +11433,9 @@ } }, "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.1.tgz", - "integrity": "sha512-x1wumpHOEf4gDROmKTaB6i4/Q6H3LwmjVO7fIX47vBwlZbtPjU33hgoMuD/Q/y6SU8bnuYSoN6ZQOLshGp0T/g==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", + "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.8.3", @@ -12130,11 +12128,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -12834,19 +12827,19 @@ "dev": true }, "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "dependencies": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/http-parser-js": { @@ -14402,6 +14395,12 @@ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -14907,9 +14906,9 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/minio": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/minio/-/minio-7.0.27.tgz", - "integrity": "sha512-0eFFob4ZzqsK0lsuM2cRddDkdFrfQGKCpD77XbFzFClhQL4w85CXC3UwfIe0rBRmLzFMZ5Y9bph8Dpny/COrQQ==", + "version": "7.0.28", + "resolved": "https://registry.npmjs.org/minio/-/minio-7.0.28.tgz", + "integrity": "sha512-4Oua0R73oCxxmxhh2NiXDJo4Md159I/mdG8ybu6351leMQoB2Sy8S4HmgG6CxuPlEJ0h9M8/WyaI2CARDeeDTQ==", "dev": true, "dependencies": { "async": "^3.1.0", @@ -14931,7 +14930,7 @@ "xml2js": "^0.4.15" }, "engines": { - "node": ">8 <16.8.0" + "node": ">8 <=18" } }, "node_modules/minipass": { @@ -15445,9 +15444,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", - "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", + "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==" }, "node_modules/normalize-package-data": { "version": "2.5.0", @@ -15826,9 +15825,9 @@ "dev": true }, "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "dependencies": { "ee-first": "1.1.1" @@ -16212,16 +16211,6 @@ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, - "node_modules/parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" - }, - "node_modules/parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -18480,13 +18469,13 @@ } }, "node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, "dependencies": { "bytes": "3.1.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -18821,12 +18810,12 @@ } }, "node_modules/react-draggable": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.4.tgz", - "integrity": "sha512-6e0WdcNLwpBx/YIDpoyd2Xb04PB0elrDrulKUgdrIlwuYvxh5Ok9M+F8cljm8kPXXs43PmMzek9RrB1b7mLMqA==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.5.tgz", + "integrity": "sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==", "dependencies": { "clsx": "^1.1.1", - "prop-types": "^15.6.0" + "prop-types": "^15.8.1" }, "peerDependencies": { "react": ">= 16.3.0", @@ -18961,9 +18950,9 @@ } }, "node_modules/react-popper-tooltip/node_modules/react-popper": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.2.5.tgz", - "integrity": "sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", + "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", "dev": true, "dependencies": { "react-fast-compare": "^3.0.1", @@ -18971,7 +18960,8 @@ }, "peerDependencies": { "@popperjs/core": "^2.0.0", - "react": "^16.8.0 || ^17" + "react": "^16.8.0 || ^17 || ^18", + "react-dom": "^16.8.0 || ^17 || ^18" } }, "node_modules/react-redux": { @@ -19124,29 +19114,6 @@ "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/react-smooth/node_modules/dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "dependencies": { - "@babel/runtime": "^7.1.2" - } - }, - "node_modules/react-smooth/node_modules/react-transition-group": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", - "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", - "dependencies": { - "dom-helpers": "^3.4.0", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2", - "react-lifecycles-compat": "^3.0.4" - }, - "peerDependencies": { - "react": ">=15.0.0", - "react-dom": ">=15.0.0" - } - }, "node_modules/react-svg-map": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/react-svg-map/-/react-svg-map-2.2.0.tgz", @@ -19200,33 +19167,38 @@ } }, "node_modules/react-toastify": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-5.5.0.tgz", - "integrity": "sha512-jsVme7jALIFGRyQsri/g4YTsRuaaGI70T6/ikjwZMB4mwTZaCWqj5NqxhGrRStKlJc5npXKKvKeqTiRGQl78LQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-8.2.0.tgz", + "integrity": "sha512-Pg2Ju7NngAamarFvLwqrFomJ57u/Ay6i6zfLurt/qPynWkAkOthu6vxfqYpJCyNhHRhR4hu7+bySSeWWJu6PAg==", "dependencies": { - "@babel/runtime": "^7.4.2", - "classnames": "^2.2.6", - "prop-types": "^15.7.2", - "react-transition-group": "^4" + "clsx": "^1.1.1" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, + "node_modules/react-transition-group": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", + "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", + "dependencies": { + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" }, "peerDependencies": { "react": ">=15.0.0", "react-dom": ">=15.0.0" } }, - "node_modules/react-transition-group": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", - "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "node_modules/react-transition-group/node_modules/dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" + "@babel/runtime": "^7.1.2" } }, "node_modules/react-virtualized": { @@ -20280,24 +20252,24 @@ } }, "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" @@ -20388,6 +20360,15 @@ "ms": "2.0.0" } }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -20421,16 +20402,25 @@ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" @@ -20798,27 +20788,25 @@ } }, "node_modules/socket.io-client": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.4.1.tgz", - "integrity": "sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.0.tgz", + "integrity": "sha512-HW61c1G7OrYGxaI79WRn17+b03iBCdvhBj4iqyXHBoL5M8w2MSO/vChsjA93knG4GYEai1/vbXWJna9dzxXtSg==", "dependencies": { - "@socket.io/component-emitter": "~3.0.0", - "backo2": "~1.0.2", + "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", - "engine.io-client": "~6.1.1", - "parseuri": "0.0.6", - "socket.io-parser": "~4.1.1" + "engine.io-client": "~6.2.1", + "socket.io-parser": "~4.2.0" }, "engines": { "node": ">=10.0.0" } }, "node_modules/socket.io-parser": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.1.2.tgz", - "integrity": "sha512-j3kk71QLJuyQ/hh5F/L2t1goqzdTL0gvDzuhTuNSwihfuFUrcSji0qFZmJJPtG6Rmug153eOPsUizeirf1IIog==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.0.tgz", + "integrity": "sha512-tLfmEwcEwnlQTxFB7jibL/q2+q8dlVQzj4JdRLJ/W/G1+Fu9VSxCx1Lo+n1HvXxKnM//dUuD0xgiA7tQf57Vng==", "dependencies": { - "@socket.io/component-emitter": "~3.0.0", + "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" }, "engines": { @@ -21224,12 +21212,12 @@ } }, "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/store2": { @@ -21935,14 +21923,14 @@ } }, "node_modules/terser": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", - "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.13.0.tgz", + "integrity": "sha512-sgQ99P+fRBM1jAYzN9RTnD/xEWx/7LZgYTCRgmYriSq1wxxqiQPJgXkkLBBuwySDWJ2PP0PnVQyuf4xLUuH4Ng==", "dev": true, "dependencies": { "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", + "source-map": "~0.8.0-beta.0", "source-map-support": "~0.5.20" }, "bin": { @@ -22219,9 +22207,9 @@ "dev": true }, "node_modules/terser/node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -22236,6 +22224,44 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, + "node_modules/terser/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/terser/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/terser/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "node_modules/terser/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -22500,9 +22526,9 @@ } }, "node_modules/ts-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.3.0.tgz", - "integrity": "sha512-MgGly4I6cStsJy27ViE32UoqxPTN9Xly4anxxVyaIWR+9BGxboV4EyJBGfR3RePV7Ksjj3rHmPZJeIt+7o4Vag==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.4.0.tgz", + "integrity": "sha512-6nFY3IZ2//mrPc+ImY3hNWx1vCHyEhl6V+wLmL4CZcm6g1CqX7UKrkc6y0i4FwcfOhxyMPCfaEvh20f4r9GNpw==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -22684,9 +22710,9 @@ } }, "node_modules/typed-css-modules": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/typed-css-modules/-/typed-css-modules-0.7.1.tgz", - "integrity": "sha512-WaWHnLa3HBTCuOCDRDB3wfqoH9ouTxdLGQwzVBxV5x+nbPIr5ZkCrCb4yfU4D1bkzNprrTKTU2ETkYVOLGFmVA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/typed-css-modules/-/typed-css-modules-0.7.2.tgz", + "integrity": "sha512-R3guXrQ8ry/yhlfvNmkVY4J3+FtKaEdwqrvgSvFpVY0ieYQHqhhBW0RwfE4hnG4m29Ef/4IE0tBsk/UKplmJkA==", "dev": true, "dependencies": { "@types/css-modules-loader-core": "^1.1.0", @@ -22932,14 +22958,14 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" }, "funding": { @@ -22947,9 +22973,9 @@ } }, "node_modules/underscore": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", - "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.3.tgz", + "integrity": "sha512-QvjkYpiD+dJJraRA8+dGAU4i7aBbb2s0S3jA45TFOvg2VgqvdCDd/3N6CqA8gluk1W91GLoXg5enMUx560QzuA==", "dev": true }, "node_modules/unfetch": { @@ -23377,14 +23403,14 @@ } }, "node_modules/use-latest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.0.tgz", - "integrity": "sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", "dependencies": { - "use-isomorphic-layout-effect": "^1.0.0" + "use-isomorphic-layout-effect": "^1.1.1" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -25811,11 +25837,6 @@ "node": ">=12" } }, - "node_modules/yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -25841,12 +25862,13 @@ }, "dependencies": { "@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@babel/cli": { @@ -27359,10 +27381,26 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz", + "integrity": "sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.0.tgz", + "integrity": "sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==", "dev": true }, "@jridgewell/sourcemap-codec": { @@ -27695,9 +27733,9 @@ "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==" }, "@socket.io/component-emitter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz", - "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" }, "@storybook/addons": { "version": "6.4.22", @@ -29206,10 +29244,10 @@ "dev": true }, "@types/node": { - "version": "14.18.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.13.tgz", - "integrity": "sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==", - "devOptional": true + "version": "14.18.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.16.tgz", + "integrity": "sha512-X3bUMdK/VmvrWdoTkz+VCn6nwKwrKCFTHtqwBIaQJNx4RUIBBUFXM00bqPz/DsDd+Icjmzm6/tyYZzeGVqb6/Q==", + "dev": true }, "@types/node-fetch": { "version": "2.6.1", @@ -29261,7 +29299,7 @@ "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "devOptional": true + "dev": true }, "@types/q": { "version": "1.5.5", @@ -29282,10 +29320,10 @@ "optional": true }, "@types/react": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.6.tgz", - "integrity": "sha512-bPqwzJRzKtfI0mVYr5R+1o9BOE8UEXefwc1LwcBtfnaAn6OoqMhLa/91VA8aeWfDPJt1kHvYKI8RHcQybZLHHA==", - "devOptional": true, + "version": "18.0.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.8.tgz", + "integrity": "sha512-+j2hk9BzCOrrOSJASi5XiOyBbERk9jG5O73Ya4M0env5Ixi6vUNli4qy994AINcEF+1IEHISYFfIT4zwr++LKw==", + "dev": true, "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -29296,7 +29334,7 @@ "version": "3.0.11", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==", - "devOptional": true + "dev": true } } }, @@ -29318,7 +29356,7 @@ "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "devOptional": true + "dev": true }, "@types/source-list-map": { "version": "0.1.2", @@ -29683,15 +29721,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true, - "requires": {} + "dev": true }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true }, "ansi-align": { "version": "3.0.1", @@ -30095,9 +30131,9 @@ "dev": true }, "aws-sdk": { - "version": "2.1119.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1119.0.tgz", - "integrity": "sha512-f9xoIWo0/kLVfQ65UCkQ7G+Oxl/mjmdGQNPDcylU8dOjXGfc4cgWxTLThRLCsf9l/4yUjWgo+KtJgY6BWc9UjA==", + "version": "2.1124.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1124.0.tgz", + "integrity": "sha512-LIj2EmvduQmyjpSLoDPe2TvRBrGWhJKlCuC7lungN4f+qYPOfVWg6/c9GdP99W0q5p2IqhDkCmQ/ZZBpO1Z/Fg==", "dev": true, "requires": { "buffer": "4.9.2", @@ -30320,8 +30356,7 @@ "version": "0.3.8", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", - "dev": true, - "requires": {} + "dev": true }, "babel-plugin-polyfill-corejs2": { "version": "0.3.1", @@ -30408,11 +30443,6 @@ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, "bail": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", @@ -30571,21 +30601,23 @@ "dev": true }, "body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "dev": true, "requires": { "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "dependencies": { "bytes": { @@ -30608,12 +30640,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true - }, - "qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "dev": true } } }, @@ -30829,14 +30855,14 @@ } }, "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", "escalade": "^3.1.1", - "node-releases": "^2.0.2", + "node-releases": "^2.0.3", "picocolors": "^1.0.0" } }, @@ -31069,9 +31095,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001332", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", - "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==" + "version": "1.0.30001334", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001334.tgz", + "integrity": "sha512-kbaCEBRRVSoeNs74sCuq92MJyGrMtjWVfhltoHUCW4t4pXFvGjUBrfo47weBRViHkiV3eBYyIsfl956NtHGazw==" }, "canvg": { "version": "3.0.10", @@ -31188,8 +31214,7 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", - "dev": true, - "requires": {} + "dev": true }, "class-utils": { "version": "0.3.6", @@ -31427,9 +31452,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "color-string": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", - "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -31658,9 +31683,9 @@ } }, "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "dev": true }, "cookie-signature": { @@ -31831,18 +31856,18 @@ } }, "core-js": { - "version": "3.22.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.2.tgz", - "integrity": "sha512-Z5I2vzDnEIqO2YhELVMFcL1An2CIsFe9Q7byZhs8c/QxummxZlAHw33TUHbIte987LkisOgL0LwQ1P9D6VISnA==", + "version": "3.22.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.3.tgz", + "integrity": "sha512-1t+2a/d2lppW1gkLXx3pKPVGbBdxXAkqztvWb1EJ8oF8O2gIGiytzflNiFEehYwVK/t2ryUsGBoOFFvNx95mbg==", "devOptional": true }, "core-js-compat": { - "version": "3.22.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.2.tgz", - "integrity": "sha512-Fns9lU06ZJ07pdfmPMu7OnkIKGPKDzXKIiuGlSvHHapwqMUF2QnnsWwtueFZtSyZEilP0o6iUeHQwpn7LxtLUw==", + "version": "3.22.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.3.tgz", + "integrity": "sha512-wliMbvPI2idgFWpFe7UEyHMvu6HWgW8WA+HnDRtgzoSDYvXFMpoGX1H3tPDDXrcfUSyXafCLDd7hOeMQHEZxGw==", "dev": true, "requires": { - "browserslist": "^4.20.2", + "browserslist": "^4.20.3", "semver": "7.0.0" }, "dependencies": { @@ -31855,9 +31880,9 @@ } }, "core-js-pure": { - "version": "3.22.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.2.tgz", - "integrity": "sha512-Lb+/XT4WC4PaCWWtZpNPaXmjiNDUe5CJuUtbkMrIM1kb1T/jJoAIp+bkVP/r5lHzMr+ZAAF8XHp7+my6Ol0ysQ==", + "version": "3.22.3", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.3.tgz", + "integrity": "sha512-oN88zz7nmKROMy8GOjs+LN+0LedIvbMdnB5XsTlhcOg1WGARt9l0LFg0zohdoFmCsEZ1h2ZbSQ6azj3M+vhzwQ==", "dev": true }, "core-util-is": { @@ -32248,8 +32273,7 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", - "dev": true, - "requires": {} + "dev": true }, "css-line-break": { "version": "2.1.0", @@ -32569,8 +32593,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true, - "requires": {} + "dev": true }, "csso": { "version": "4.2.0", @@ -32895,9 +32918,9 @@ "dev": true }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true }, "deploy-aws-s3-cloudfront": { @@ -32927,9 +32950,9 @@ } }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, "detab": { @@ -33063,9 +33086,9 @@ } }, "dom-align": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.2.tgz", - "integrity": "sha512-pHuazgqrsTFrGU2WLDdXxCFabkdQDx72ddkraZNih1KsMcN5qsRSTR9O4VJRlwTPCPb5COYg3LOfiMHHcPInHg==" + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.3.tgz", + "integrity": "sha512-Gj9hZN3a07cbR6zviMUBOMPdWxYhbMI+x+WS0NAIu2zFZmbK8ys9R79g+iG9qLnlCwpFoaB+fKy8Pdv470GsPA==" }, "dom-converter": { "version": "0.2.0", @@ -33275,9 +33298,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.118", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.118.tgz", - "integrity": "sha512-maZIKjnYDvF7Fs35nvVcyr44UcKNwybr93Oba2n3HkKDFAtk0svERkLN/HyczJDS3Fo4wU9th9fUQd09ZLtj1w==" + "version": "1.4.127", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.127.tgz", + "integrity": "sha512-nhD6S8nKI0O2MueC6blNOEZio+/PWppE/pevnf3LOlQA/fKPCrDp2Ao4wx4LFwmIkJpVdFdn2763YWLy9ENIZg==" }, "element-resize-detector": { "version": "1.2.4", @@ -33367,26 +33390,21 @@ } }, "engine.io-client": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.1.1.tgz", - "integrity": "sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.1.tgz", + "integrity": "sha512-5cu7xubVxEwoB6O9hJ6Zfu990yBVjXfyMlE1ZvfO5L8if3Kvc9bgDNEapV0C5pMp+5Om1UZFnljxoOuFm6dBKA==", "requires": { - "@socket.io/component-emitter": "~3.0.0", + "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", - "engine.io-parser": "~5.0.0", - "has-cors": "1.1.0", - "parseqs": "0.0.6", - "parseuri": "0.0.6", + "engine.io-parser": "~5.0.3", "ws": "~8.2.3", - "xmlhttprequest-ssl": "~2.0.0", - "yeast": "0.1.2" + "xmlhttprequest-ssl": "~2.0.0" }, "dependencies": { "ws": { "version": "8.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "requires": {} + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==" } } }, @@ -33539,9 +33557,9 @@ } }, "es5-shim": { - "version": "4.6.5", - "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.6.5.tgz", - "integrity": "sha512-vfQ4UAai8szn0sAubCy97xnZ4sJVDD1gt/Grn736hg8D7540wemIb1YPrYZSTqlM2H69EQX1or4HU/tSwRTI3w==", + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.6.6.tgz", + "integrity": "sha512-Ay5QQE78I2WKUoZVZjL0AIuiIjsmXwZGkyCTH9+n6J1anPbb0ymDA27ASa2Lt0rhOpAlEKy2W0d17gJ1XOQ5eQ==", "dev": true }, "es6-error": { @@ -34105,38 +34123,39 @@ } }, "express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.0.tgz", + "integrity": "sha512-EJEXxiTQJS3lIPrU1AE2vRuT7X7E+0KBbpm5GSoK524yl0K8X+er8zS2P14E64eqsVNoWbMCT7MpmQ+ErAhgRg==", "dev": true, "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.2", + "body-parser": "1.20.0", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.2", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.7", + "qs": "6.10.3", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -34157,12 +34176,6 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "dev": true - }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -34438,17 +34451,17 @@ } }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "dependencies": { @@ -34783,9 +34796,9 @@ } }, "fork-ts-checker-webpack-plugin": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.1.tgz", - "integrity": "sha512-x1wumpHOEf4gDROmKTaB6i4/Q6H3LwmjVO7fIX47vBwlZbtPjU33hgoMuD/Q/y6SU8bnuYSoN6ZQOLshGp0T/g==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", + "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", @@ -35303,11 +35316,6 @@ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -35877,15 +35885,15 @@ "dev": true }, "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "requires": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" } }, @@ -37064,6 +37072,12 @@ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -37176,8 +37190,7 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.7.tgz", "integrity": "sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w==", - "dev": true, - "requires": {} + "dev": true }, "md5-file": { "version": "5.0.0", @@ -37467,9 +37480,9 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "minio": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/minio/-/minio-7.0.27.tgz", - "integrity": "sha512-0eFFob4ZzqsK0lsuM2cRddDkdFrfQGKCpD77XbFzFClhQL4w85CXC3UwfIe0rBRmLzFMZ5Y9bph8Dpny/COrQQ==", + "version": "7.0.28", + "resolved": "https://registry.npmjs.org/minio/-/minio-7.0.28.tgz", + "integrity": "sha512-4Oua0R73oCxxmxhh2NiXDJo4Md159I/mdG8ybu6351leMQoB2Sy8S4HmgG6CxuPlEJ0h9M8/WyaI2CARDeeDTQ==", "dev": true, "requires": { "async": "^3.1.0", @@ -37634,8 +37647,7 @@ "mobx-react-lite": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.3.0.tgz", - "integrity": "sha512-U/kMSFtV/bNVgY01FuiGWpRkaQVHozBq5CEBZltFvPt4FcV111hEWkgwqVg9GPPZSEuEdV438PEz8mk8mKpYlA==", - "requires": {} + "integrity": "sha512-U/kMSFtV/bNVgY01FuiGWpRkaQVHozBq5CEBZltFvPt4FcV111hEWkgwqVg9GPPZSEuEdV438PEz8mk8mKpYlA==" }, "moment": { "version": "2.29.3", @@ -37917,9 +37929,9 @@ } }, "node-releases": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", - "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", + "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==" }, "normalize-package-data": { "version": "2.5.0", @@ -38213,9 +38225,9 @@ "dev": true }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "requires": { "ee-first": "1.1.1" @@ -38521,16 +38533,6 @@ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -38920,29 +38922,25 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", - "dev": true, - "requires": {} + "dev": true }, "postcss-discard-duplicates": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "requires": {} + "dev": true }, "postcss-discard-empty": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "requires": {} + "dev": true }, "postcss-discard-overridden": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "requires": {} + "dev": true }, "postcss-flexbugs-fixes": { "version": "4.2.1", @@ -39616,8 +39614,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, - "requires": {} + "dev": true }, "postcss-normalize-display-values": { "version": "5.1.0", @@ -40325,13 +40322,13 @@ "dev": true }, "raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, "requires": { "bytes": "3.1.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -40466,27 +40463,23 @@ "react-circular-progressbar": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/react-circular-progressbar/-/react-circular-progressbar-2.0.4.tgz", - "integrity": "sha512-OfX0ThSxRYEVGaQSt0DlXfyl5w4DbXHsXetyeivmoQrh9xA9bzVPHNf8aAhOIiwiaxX2WYWpLDB3gcpsDJ9oww==", - "requires": {} + "integrity": "sha512-OfX0ThSxRYEVGaQSt0DlXfyl5w4DbXHsXetyeivmoQrh9xA9bzVPHNf8aAhOIiwiaxX2WYWpLDB3gcpsDJ9oww==" }, "react-codemirror2": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/react-codemirror2/-/react-codemirror2-5.1.0.tgz", - "integrity": "sha512-Cksbgbviuf2mJfMyrKmcu7ycK6zX/ukuQO8dvRZdFWqATf5joalhjFc6etnBdGCcPA2LbhIwz+OPnQxLN/j1Fw==", - "requires": {} + "integrity": "sha512-Cksbgbviuf2mJfMyrKmcu7ycK6zX/ukuQO8dvRZdFWqATf5joalhjFc6etnBdGCcPA2LbhIwz+OPnQxLN/j1Fw==" }, "react-colorful": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.5.1.tgz", "integrity": "sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==", - "dev": true, - "requires": {} + "dev": true }, "react-confirm": { "version": "0.1.24", "resolved": "https://registry.npmjs.org/react-confirm/-/react-confirm-0.1.24.tgz", - "integrity": "sha512-96qA+mbZyBRmh/3Y5aDgrYLwLndbaRjkP3GlXQtPEQbIH0P66xGcHJ7ui6y/MN85AZWq/V3drA1fJOiEcVkAVA==", - "requires": {} + "integrity": "sha512-96qA+mbZyBRmh/3Y5aDgrYLwLndbaRjkP3GlXQtPEQbIH0P66xGcHJ7ui6y/MN85AZWq/V3drA1fJOiEcVkAVA==" }, "react-datepicker": { "version": "2.16.0", @@ -40579,8 +40572,7 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz", "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==", - "dev": true, - "requires": {} + "dev": true }, "react-dom": { "version": "16.14.0", @@ -40594,12 +40586,12 @@ } }, "react-draggable": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.4.tgz", - "integrity": "sha512-6e0WdcNLwpBx/YIDpoyd2Xb04PB0elrDrulKUgdrIlwuYvxh5Ok9M+F8cljm8kPXXs43PmMzek9RrB1b7mLMqA==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.5.tgz", + "integrity": "sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==", "requires": { "clsx": "^1.1.1", - "prop-types": "^15.6.0" + "prop-types": "^15.8.1" } }, "react-fast-compare": { @@ -40658,8 +40650,7 @@ "react-lazyload": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/react-lazyload/-/react-lazyload-3.2.0.tgz", - "integrity": "sha512-zJlrG8QyVZz4+xkYZH5v1w3YaP5wEFaYSUWC4CT9UXfK75IfRAIEdnyIUF+dXr3kX2MOtL1lUaZmaQZqrETwgw==", - "requires": {} + "integrity": "sha512-zJlrG8QyVZz4+xkYZH5v1w3YaP5wEFaYSUWC4CT9UXfK75IfRAIEdnyIUF+dXr3kX2MOtL1lUaZmaQZqrETwgw==" }, "react-lifecycles-compat": { "version": "3.0.4", @@ -40669,8 +40660,7 @@ "react-onclickoutside": { "version": "6.12.1", "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.12.1.tgz", - "integrity": "sha512-a5Q7CkWznBRUWPmocCvE8b6lEYw1s6+opp/60dCunhO+G6E4tDTO2Sd2jKE+leEnnrLAE2Wj5DlDHNqj5wPv1Q==", - "requires": {} + "integrity": "sha512-a5Q7CkWznBRUWPmocCvE8b6lEYw1s6+opp/60dCunhO+G6E4tDTO2Sd2jKE+leEnnrLAE2Wj5DlDHNqj5wPv1Q==" }, "react-popper": { "version": "1.3.11", @@ -40698,9 +40688,9 @@ }, "dependencies": { "react-popper": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.2.5.tgz", - "integrity": "sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", + "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", "dev": true, "requires": { "react-fast-compare": "^3.0.1", @@ -40841,27 +40831,6 @@ "fast-equals": "^2.0.0", "raf": "^3.4.0", "react-transition-group": "2.9.0" - }, - "dependencies": { - "dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "requires": { - "@babel/runtime": "^7.1.2" - } - }, - "react-transition-group": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", - "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", - "requires": { - "dom-helpers": "^3.4.0", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2", - "react-lifecycles-compat": "^3.0.4" - } - } } }, "react-svg-map": { @@ -40904,25 +40873,32 @@ } }, "react-toastify": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-5.5.0.tgz", - "integrity": "sha512-jsVme7jALIFGRyQsri/g4YTsRuaaGI70T6/ikjwZMB4mwTZaCWqj5NqxhGrRStKlJc5npXKKvKeqTiRGQl78LQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-8.2.0.tgz", + "integrity": "sha512-Pg2Ju7NngAamarFvLwqrFomJ57u/Ay6i6zfLurt/qPynWkAkOthu6vxfqYpJCyNhHRhR4hu7+bySSeWWJu6PAg==", "requires": { - "@babel/runtime": "^7.4.2", - "classnames": "^2.2.6", - "prop-types": "^15.7.2", - "react-transition-group": "^4" + "clsx": "^1.1.1" } }, "react-transition-group": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", - "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", + "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", "requires": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", + "dom-helpers": "^3.4.0", "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + }, + "dependencies": { + "dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "requires": { + "@babel/runtime": "^7.1.2" + } + } } }, "react-virtualized": { @@ -41110,14 +41086,12 @@ "redux-immutable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/redux-immutable/-/redux-immutable-4.0.0.tgz", - "integrity": "sha1-Ohoy32Y2ZGK2NpHw4dw15HK7yfM=", - "requires": {} + "integrity": "sha1-Ohoy32Y2ZGK2NpHw4dw15HK7yfM=" }, "redux-thunk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz", - "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==", - "requires": {} + "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==" }, "refractor": { "version": "3.6.0", @@ -41758,24 +41732,24 @@ "dev": true }, "send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { "debug": { @@ -41863,6 +41837,12 @@ "ms": "2.0.0" } }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -41892,19 +41872,25 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true } } }, "serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.18.0" } }, "set-blocking": { @@ -42211,24 +42197,22 @@ } }, "socket.io-client": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.4.1.tgz", - "integrity": "sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.0.tgz", + "integrity": "sha512-HW61c1G7OrYGxaI79WRn17+b03iBCdvhBj4iqyXHBoL5M8w2MSO/vChsjA93knG4GYEai1/vbXWJna9dzxXtSg==", "requires": { - "@socket.io/component-emitter": "~3.0.0", - "backo2": "~1.0.2", + "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", - "engine.io-client": "~6.1.1", - "parseuri": "0.0.6", - "socket.io-parser": "~4.1.1" + "engine.io-client": "~6.2.1", + "socket.io-parser": "~4.2.0" } }, "socket.io-parser": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.1.2.tgz", - "integrity": "sha512-j3kk71QLJuyQ/hh5F/L2t1goqzdTL0gvDzuhTuNSwihfuFUrcSji0qFZmJJPtG6Rmug153eOPsUizeirf1IIog==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.0.tgz", + "integrity": "sha512-tLfmEwcEwnlQTxFB7jibL/q2+q8dlVQzj4JdRLJ/W/G1+Fu9VSxCx1Lo+n1HvXxKnM//dUuD0xgiA7tQf57Vng==", "requires": { - "@socket.io/component-emitter": "~3.0.0", + "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" } }, @@ -42564,9 +42548,9 @@ } }, "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true }, "store2": { @@ -43138,21 +43122,21 @@ } }, "terser": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", - "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.13.0.tgz", + "integrity": "sha512-sgQ99P+fRBM1jAYzN9RTnD/xEWx/7LZgYTCRgmYriSq1wxxqiQPJgXkkLBBuwySDWJ2PP0PnVQyuf4xLUuH4Ng==", "dev": true, "requires": { "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", + "source-map": "~0.8.0-beta.0", "source-map-support": "~0.5.20" }, "dependencies": { "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", "dev": true }, "commander": { @@ -43160,6 +43144,41 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true + }, + "source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "requires": { + "whatwg-url": "^7.0.0" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } } } }, @@ -43567,9 +43586,9 @@ "dev": true }, "ts-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.3.0.tgz", - "integrity": "sha512-MgGly4I6cStsJy27ViE32UoqxPTN9Xly4anxxVyaIWR+9BGxboV4EyJBGfR3RePV7Ksjj3rHmPZJeIt+7o4Vag==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.4.0.tgz", + "integrity": "sha512-6nFY3IZ2//mrPc+ImY3hNWx1vCHyEhl6V+wLmL4CZcm6g1CqX7UKrkc6y0i4FwcfOhxyMPCfaEvh20f4r9GNpw==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -43701,9 +43720,9 @@ } }, "typed-css-modules": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/typed-css-modules/-/typed-css-modules-0.7.1.tgz", - "integrity": "sha512-WaWHnLa3HBTCuOCDRDB3wfqoH9ouTxdLGQwzVBxV5x+nbPIr5ZkCrCb4yfU4D1bkzNprrTKTU2ETkYVOLGFmVA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/typed-css-modules/-/typed-css-modules-0.7.2.tgz", + "integrity": "sha512-R3guXrQ8ry/yhlfvNmkVY4J3+FtKaEdwqrvgSvFpVY0ieYQHqhhBW0RwfE4hnG4m29Ef/4IE0tBsk/UKplmJkA==", "dev": true, "requires": { "@types/css-modules-loader-core": "^1.1.0", @@ -43876,21 +43895,21 @@ "optional": true }, "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" } }, "underscore": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", - "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.3.tgz", + "integrity": "sha512-QvjkYpiD+dJJraRA8+dGAU4i7aBbb2s0S3jA45TFOvg2VgqvdCDd/3N6CqA8gluk1W91GLoXg5enMUx560QzuA==", "dev": true }, "unfetch": { @@ -44202,21 +44221,19 @@ "use-composed-ref": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", - "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", - "requires": {} + "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==" }, "use-isomorphic-layout-effect": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", - "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "requires": {} + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==" }, "use-latest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.0.tgz", - "integrity": "sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", "requires": { - "use-isomorphic-layout-effect": "^1.0.0" + "use-isomorphic-layout-effect": "^1.1.1" } }, "util": { @@ -45783,8 +45800,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/webpack-filter-warnings-plugin/-/webpack-filter-warnings-plugin-1.2.1.tgz", "integrity": "sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg==", - "dev": true, - "requires": {} + "dev": true }, "webpack-hot-middleware": { "version": "2.25.1", @@ -46095,8 +46111,7 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true, - "requires": {} + "dev": true }, "xml": { "version": "1.0.1", @@ -46183,11 +46198,6 @@ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 6e683ad27..9111bf8f1 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -53,7 +53,7 @@ "react-router-dom": "^4.3.1", "react-svg-map": "^2.2.0", "react-tippy": "^1.4.0", - "react-toastify": "^5.5.0", + "react-toastify": "^8.2.0", "react-virtualized": "^9.22.2", "recharts": "^2.1.9", "redux": "^4.0.5", From 122705b4c7e4b4d767122d10ea354174fcf71021 Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Fri, 29 Apr 2022 13:19:11 +0200 Subject: [PATCH 017/260] feat(db): EE fixed widget-size for upgrade --- ee/scripts/helm/db/init_dbs/postgresql/1.6.0/1.6.0.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ee/scripts/helm/db/init_dbs/postgresql/1.6.0/1.6.0.sql b/ee/scripts/helm/db/init_dbs/postgresql/1.6.0/1.6.0.sql index d7eeff911..bb0d7b7c0 100644 --- a/ee/scripts/helm/db/init_dbs/postgresql/1.6.0/1.6.0.sql +++ b/ee/scripts/helm/db/init_dbs/postgresql/1.6.0/1.6.0.sql @@ -305,7 +305,7 @@ VALUES ('Captured sessions', 'overview', '{ "position": 0 }', true, true, true, 'missing_resources', 'predefined', 'table'), ('Slowest Resources', 'resources', '{ - "col": 2, + "col": 4, "row": 2, "position": 0 }', true, true, true, 'slowest_resources', 'predefined', 'table'), From a87717ba8ce89185a649d4d7c0b59323b13d1f40 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Fri, 29 Apr 2022 13:37:30 +0200 Subject: [PATCH 018/260] feat(ui) - dashboard - report --- .../components/Client/CustomFields/CustomFields.js | 2 +- .../DashboardEditModal/DashboardEditModal.tsx | 13 +++++++++++++ .../components/DashboardForm/DashboardForm.tsx | 2 +- .../components/DashboardView/DashboardView.tsx | 11 +++++++++-- frontend/app/components/hocs/withReport.tsx | 1 + frontend/app/components/ui/PageTitle/PageTitle.tsx | 14 ++++++++++---- frontend/app/mstore/types/dashboard.ts | 3 +++ 7 files changed, 38 insertions(+), 8 deletions(-) diff --git a/frontend/app/components/Client/CustomFields/CustomFields.js b/frontend/app/components/Client/CustomFields/CustomFields.js index b46994f0b..cd4e06da0 100644 --- a/frontend/app/components/Client/CustomFields/CustomFields.js +++ b/frontend/app/components/Client/CustomFields/CustomFields.js @@ -100,7 +100,7 @@ class CustomFields extends React.Component { title="No data available." size="small" show={ fields.size === 0 } - icon + animatedIcon="empty-state" >
    { fields.filter(i => i.index).map(field => ( diff --git a/frontend/app/components/Dashboard/components/DashboardEditModal/DashboardEditModal.tsx b/frontend/app/components/Dashboard/components/DashboardEditModal/DashboardEditModal.tsx index e6eae9e4e..0f687a166 100644 --- a/frontend/app/components/Dashboard/components/DashboardEditModal/DashboardEditModal.tsx +++ b/frontend/app/components/Dashboard/components/DashboardEditModal/DashboardEditModal.tsx @@ -47,6 +47,19 @@ function DashboardEditModal(props: Props) { value={ dashboard.name } onChange={write} placeholder="Title" + maxLength={100} + /> + + + + + diff --git a/frontend/app/components/Dashboard/components/DashboardForm/DashboardForm.tsx b/frontend/app/components/Dashboard/components/DashboardForm/DashboardForm.tsx index 9255663e9..9e7bd54f6 100644 --- a/frontend/app/components/Dashboard/components/DashboardForm/DashboardForm.tsx +++ b/frontend/app/components/Dashboard/components/DashboardForm/DashboardForm.tsx @@ -21,7 +21,7 @@ function DashboardForm(props: Props) {
    - +
    diff --git a/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx b/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx index 2392a2b75..39ddf88c7 100644 --- a/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx +++ b/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx @@ -86,8 +86,15 @@ function DashboardView(props: Props) { />
    - - + Add Metric + } + /> +
    diff --git a/frontend/app/components/hocs/withReport.tsx b/frontend/app/components/hocs/withReport.tsx index 4984796d7..be95952be 100644 --- a/frontend/app/components/hocs/withReport.tsx +++ b/frontend/app/components/hocs/withReport.tsx @@ -138,6 +138,7 @@ export default function withReport

    ( {period && (period.range.start.format('MMM Do YY') + ' - ' + period.range.end.format('MMM Do YY'))}

    + {dashboard && dashboard.description &&
    {dashboard.description}
    }
    - {title} - +
    +
    +

    + {title} +

    + { actionButton && actionButton} +
    + {subTitle &&

    {subTitle}

    } +
    ); } diff --git a/frontend/app/mstore/types/dashboard.ts b/frontend/app/mstore/types/dashboard.ts index 57b191252..fbed41eb7 100644 --- a/frontend/app/mstore/types/dashboard.ts +++ b/frontend/app/mstore/types/dashboard.ts @@ -6,6 +6,7 @@ import { toast } from 'react-toastify'; export interface IDashboard { dashboardId: any name: string + description: string isPublic: boolean widgets: IWidget[] metrics: any[] @@ -35,6 +36,7 @@ export default class Dashboard implements IDashboard { public static get ID_KEY():string { return "dashboardId" } dashboardId: any = undefined name: string = "New Dashboard" + description: string = "" isPublic: boolean = true widgets: IWidget[] = [] metrics: any[] = [] @@ -46,6 +48,7 @@ export default class Dashboard implements IDashboard { constructor() { makeAutoObservable(this, { name: observable, + description: observable, isPublic: observable, widgets: observable, isValid: observable, From 59f51cde26694b7617a2c5000fcf6f0d8f5742f7 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Fri, 29 Apr 2022 13:56:20 +0200 Subject: [PATCH 019/260] feat(ui) - dashboard - report --- .../components/DashboardView/DashboardView.tsx | 4 +++- .../app/components/ui/ItemMenu/itemMenu.css | 5 +++-- frontend/app/svg/icons/filetype-pdf.svg | 3 --- frontend/app/svg/icons/graph-up-arrow.svg | 2 +- frontend/app/svg/icons/hash.svg | 2 +- frontend/app/svg/icons/pdf-download.svg | 5 +++++ frontend/app/svg/icons/report.pdf | Bin 929040 -> 0 bytes frontend/app/svg/icons/table.svg | 2 +- frontend/app/svg/icons/text-paragraph.svg | 3 +++ 9 files changed, 17 insertions(+), 9 deletions(-) delete mode 100644 frontend/app/svg/icons/filetype-pdf.svg create mode 100644 frontend/app/svg/icons/pdf-download.svg delete mode 100644 frontend/app/svg/icons/report.pdf create mode 100644 frontend/app/svg/icons/text-paragraph.svg diff --git a/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx b/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx index 39ddf88c7..0b096794d 100644 --- a/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx +++ b/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx @@ -113,8 +113,10 @@ function DashboardView(props: Props) { diff --git a/frontend/app/components/ui/ItemMenu/itemMenu.css b/frontend/app/components/ui/ItemMenu/itemMenu.css index eabfb050a..7a87fb77a 100644 --- a/frontend/app/components/ui/ItemMenu/itemMenu.css +++ b/frontend/app/components/ui/ItemMenu/itemMenu.css @@ -28,11 +28,12 @@ display: none; } + white-space: nowrap; z-index: 10; position: absolute; right: 31px; - top: 18px; - width: 150px; + top: 27px; + min-width: 150px; background-color: $white; border-radius: 3px; box-shadow: 0px 1px 3px 0 $gray-light; diff --git a/frontend/app/svg/icons/filetype-pdf.svg b/frontend/app/svg/icons/filetype-pdf.svg deleted file mode 100644 index e1fc9b698..000000000 --- a/frontend/app/svg/icons/filetype-pdf.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/app/svg/icons/graph-up-arrow.svg b/frontend/app/svg/icons/graph-up-arrow.svg index fd582e467..9a54cd2de 100644 --- a/frontend/app/svg/icons/graph-up-arrow.svg +++ b/frontend/app/svg/icons/graph-up-arrow.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/frontend/app/svg/icons/hash.svg b/frontend/app/svg/icons/hash.svg index 4621b1dac..17e32e5db 100644 --- a/frontend/app/svg/icons/hash.svg +++ b/frontend/app/svg/icons/hash.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/frontend/app/svg/icons/pdf-download.svg b/frontend/app/svg/icons/pdf-download.svg new file mode 100644 index 000000000..ef3610238 --- /dev/null +++ b/frontend/app/svg/icons/pdf-download.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/frontend/app/svg/icons/report.pdf b/frontend/app/svg/icons/report.pdf deleted file mode 100644 index 33eab9271109318b47ea35bb835b4ea9218715ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 929040 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%0A=5YzhXVYlBXQQz&TF3k*8^|jX{vbik^KbN2Z|+ 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%0AbV`5FW6%C5Sw_zU&Wl9ep5aX8 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

    pYYl(w>yGkOF=B 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

      *3<|XPA;(6JRV#<3$?l9!O=lu+C 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𝔑q0$*|3#vU2^y6A8$O%7_TKYW3kE>Xf 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 diff --git a/frontend/app/svg/icons/table.svg b/frontend/app/svg/icons/table.svg index 5e70d22c4..db76c22cf 100644 --- a/frontend/app/svg/icons/table.svg +++ b/frontend/app/svg/icons/table.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/frontend/app/svg/icons/text-paragraph.svg b/frontend/app/svg/icons/text-paragraph.svg new file mode 100644 index 000000000..9779beabf --- /dev/null +++ b/frontend/app/svg/icons/text-paragraph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file From 7c2539ec93a866e9a145aed9d11929036ea833bf Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Fri, 29 Apr 2022 14:16:29 +0200 Subject: [PATCH 020/260] feat(ui) - dashboard - report --- .../DashboardOptions/DashboardOptions.tsx | 33 +++++++++++++++++++ .../components/DashboardOptions/index.ts | 1 + .../DashboardView/DashboardView.tsx | 16 ++++----- 3 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 frontend/app/components/Dashboard/components/DashboardOptions/DashboardOptions.tsx create mode 100644 frontend/app/components/Dashboard/components/DashboardOptions/index.ts diff --git a/frontend/app/components/Dashboard/components/DashboardOptions/DashboardOptions.tsx b/frontend/app/components/Dashboard/components/DashboardOptions/DashboardOptions.tsx new file mode 100644 index 000000000..b616d2e50 --- /dev/null +++ b/frontend/app/components/Dashboard/components/DashboardOptions/DashboardOptions.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import { ItemMenu } from 'UI'; +import { connect } from 'react-redux'; + +interface Props { + editHandler: any + deleteHandler: any + renderReport: any + isEnterprise: boolean +} +function DashboardOptions(props: Props) { + const { editHandler, deleteHandler, renderReport, isEnterprise } = props; + const menuItems = [ + { icon: 'pencil', text: 'Rename', onClick: editHandler }, + { icon: 'text-paragraph', text: 'Add Description', onClick: editHandler }, + { icon: 'users', text: 'Visibility & Access', onClick: editHandler }, + { icon: 'trash', text: 'Delete', onClick: deleteHandler }, + ] + if (isEnterprise) { + menuItems.unshift({ icon: 'pdf-download', text: 'Download Report', onClick: renderReport }); + } + + return ( + + ); +} + +export default connect(state => ({ + isEnterprise: state.getIn([ 'user', 'client', 'edition' ]) === 'ee', +}))(DashboardOptions); \ No newline at end of file diff --git a/frontend/app/components/Dashboard/components/DashboardOptions/index.ts b/frontend/app/components/Dashboard/components/DashboardOptions/index.ts new file mode 100644 index 000000000..09297ef57 --- /dev/null +++ b/frontend/app/components/Dashboard/components/DashboardOptions/index.ts @@ -0,0 +1 @@ +export { default } from './DashboardOptions'; \ No newline at end of file diff --git a/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx b/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx index 0b096794d..083e55d1a 100644 --- a/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx +++ b/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx @@ -1,7 +1,7 @@ import React, { useEffect } from 'react'; import { useObserver } from 'mobx-react-lite'; import { useStore } from 'App/mstore'; -import { Button, PageTitle, Loader, NoContent, ItemMenu } from 'UI'; +import { Button, PageTitle, Loader, NoContent } from 'UI'; import { withSiteId } from 'App/routes'; import withModal from 'App/components/Modal/withModal'; import DashboardWidgetGrid from '../DashboardWidgetGrid'; @@ -14,6 +14,7 @@ import DateRange from 'Shared/DateRange'; import AlertFormModal from 'App/components/Alerts/AlertFormModal'; import withPageTitle from 'HOCs/withPageTitle'; import withReport from 'App/components/hocs/withReport'; +import DashboardOptions from '../DashboardOptions'; interface Props { siteId: number; @@ -110,15 +111,10 @@ function DashboardView(props: Props) {
    -
    From 8986f395b1fb3a9b650afcd26ecae7fba04d2886 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Fri, 29 Apr 2022 14:27:23 +0200 Subject: [PATCH 021/260] feat(ui) - dashboard - new libs --- third-party.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/third-party.md b/third-party.md index 4a31946e5..aceb11f08 100644 --- a/third-party.md +++ b/third-party.md @@ -98,6 +98,8 @@ Below is the list of dependencies used in OpenReplay software. Licenses may chan | geoip-lite | Apache2 | JavaScript | | ua-parser-js | MIT | JavaScript | | express | MIT | JavaScript | +| jspdf | MIT | JavaScript | +| html-to-image | MIT | JavaScript | | kafka | Apache2 | Infrastructure | | stern | Apache2 | Infrastructure | | k9s | Apache2 | Infrastructure | From 4f1a476c65380143a1e9d6f3ee2241efd1509a19 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Fri, 29 Apr 2022 16:02:14 +0200 Subject: [PATCH 022/260] Update dashboard.ts --- frontend/app/mstore/types/dashboard.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frontend/app/mstore/types/dashboard.ts b/frontend/app/mstore/types/dashboard.ts index fbed41eb7..b6a8dd330 100644 --- a/frontend/app/mstore/types/dashboard.ts +++ b/frontend/app/mstore/types/dashboard.ts @@ -88,7 +88,8 @@ export default class Dashboard implements IDashboard { isPublic: this.isPublic, // widgets: this.widgets.map(w => w.toJson()) // widgets: this.widgets - metrics: this.metrics + metrics: this.metrics, + description: this.description, } } @@ -188,4 +189,4 @@ export default class Dashboard implements IDashboard { this.metrics.push(metricId) } } -} \ No newline at end of file +} From 27641279b4671342e5c56917cb7ec2ea62c440ba Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Fri, 29 Apr 2022 16:10:03 +0200 Subject: [PATCH 023/260] Update dashboard.ts --- frontend/app/mstore/types/dashboard.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/app/mstore/types/dashboard.ts b/frontend/app/mstore/types/dashboard.ts index b6a8dd330..c4ee376c6 100644 --- a/frontend/app/mstore/types/dashboard.ts +++ b/frontend/app/mstore/types/dashboard.ts @@ -97,6 +97,7 @@ export default class Dashboard implements IDashboard { runInAction(() => { this.dashboardId = json.dashboardId this.name = json.name + this.description = json.description this.isPublic = json.isPublic this.isPinned = json.isPinned this.widgets = json.widgets ? json.widgets.map(w => new Widget().fromJson(w)).sort((a, b) => a.position - b.position) : [] From 10edeb6e2dd1f2bd2898323d372af7c65ee62336 Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Fri, 29 Apr 2022 16:53:28 +0200 Subject: [PATCH 024/260] Refactoring of http handlers --- backend/pkg/messages/batch.go | 39 +--------- .../pkg/messages/legacy-message-transform.go | 13 +--- backend/pkg/queue/messages.go | 3 +- backend/services/http/handlers-web.go | 78 ++++++++++--------- backend/services/http/main.go | 24 ++++-- backend/services/http/model.go | 30 +++++++ 6 files changed, 94 insertions(+), 93 deletions(-) create mode 100644 backend/services/http/model.go diff --git a/backend/pkg/messages/batch.go b/backend/pkg/messages/batch.go index 9241672a3..850f22de9 100644 --- a/backend/pkg/messages/batch.go +++ b/backend/pkg/messages/batch.go @@ -1,17 +1,12 @@ package messages import ( - "bytes" "io" "github.com/pkg/errors" ) -func ReadBatch(b []byte, callback func(Message)) error { - return ReadBatchReader(bytes.NewReader(b), callback) -} - -func ReadBatchReader(reader io.Reader, callback func(Message)) error { +func ReadBatchReader(reader io.Reader, messageHandler func(Message)) error { var index uint64 var timestamp int64 for { @@ -21,7 +16,7 @@ func ReadBatchReader(reader io.Reader, callback func(Message)) error { } else if err != nil { return errors.Wrapf(err, "Batch Message decoding error on message with index %v", index) } - msg = transformDepricated(msg) + msg = transformDeprecated(msg) isBatchMeta := false switch m := msg.(type) { @@ -48,37 +43,11 @@ func ReadBatchReader(reader io.Reader, callback func(Message)) error { } msg.Meta().Index = index msg.Meta().Timestamp = timestamp - callback(msg) + + messageHandler(msg) if !isBatchMeta { // Without that indexes will be unique anyway, though shifted by 1 because BatchMeta is not counted in tracker index++ } } return errors.New("Error of the codeflow. (Should return on EOF)") } - -const AVG_MESSAGE_SIZE = 40 // TODO: calculate OR calculate dynamically -func WriteBatch(mList []Message) []byte { - batch := make([]byte, AVG_MESSAGE_SIZE*len(mList)) - p := 0 - for _, msg := range mList { - msgBytes := msg.Encode() - if len(batch) < p+len(msgBytes) { - newBatch := make([]byte, 2*len(batch)+len(msgBytes)) - copy(newBatch, batch) - batch = newBatch - } - copy(batch[p:], msgBytes) - p += len(msgBytes) - } - return batch[:p] -} - -func RewriteBatch(reader io.Reader, rewrite func(Message) Message) ([]byte, error) { - mList := make([]Message, 0, 10) // 10? - if err := ReadBatchReader(reader, func(m Message) { - mList = append(mList, rewrite(m)) - }); err != nil { - return nil, err - } - return WriteBatch(mList), nil -} diff --git a/backend/pkg/messages/legacy-message-transform.go b/backend/pkg/messages/legacy-message-transform.go index c22b73378..6774d95b1 100644 --- a/backend/pkg/messages/legacy-message-transform.go +++ b/backend/pkg/messages/legacy-message-transform.go @@ -1,6 +1,6 @@ package messages -func transformDepricated(msg Message) Message { +func transformDeprecated(msg Message) Message { switch m := msg.(type) { case *MouseClickDepricated: meta := m.Meta() @@ -11,17 +11,6 @@ func transformDepricated(msg Message) Message { HesitationTime: m.HesitationTime, Label: m.Label, } - // case *FetchDepricated: - // return &Fetch { - // Method: m.Method, - // URL: m.URL, - // Request: m.Request, - // Response: m.Response, - // Status: m.Status, - // Timestamp: m.Timestamp, - // Duration: m.Duration, - // // Headers: '' - // } default: return msg } diff --git a/backend/pkg/queue/messages.go b/backend/pkg/queue/messages.go index 0ab184ee6..9b9ff43a5 100644 --- a/backend/pkg/queue/messages.go +++ b/backend/pkg/queue/messages.go @@ -1,6 +1,7 @@ package queue import ( + "bytes" "log" "openreplay/backend/pkg/messages" @@ -9,7 +10,7 @@ import ( func NewMessageConsumer(group string, topics []string, handler types.DecodedMessageHandler, autoCommit bool) types.Consumer { return NewConsumer(group, topics, func(sessionID uint64, value []byte, meta *types.Meta) { - if err := messages.ReadBatch(value, func(msg messages.Message) { + if err := messages.ReadBatchReader(bytes.NewReader(value), func(msg messages.Message) { handler(sessionID, msg, meta) }); err != nil { log.Printf("Decode error: %v\n", err) diff --git a/backend/services/http/handlers-web.go b/backend/services/http/handlers-web.go index e5cf57a60..0c2fa386c 100644 --- a/backend/services/http/handlers-web.go +++ b/backend/services/http/handlers-web.go @@ -1,6 +1,7 @@ package main import ( + "bytes" "encoding/json" "errors" "log" @@ -15,37 +16,23 @@ import ( ) func startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) { - type request struct { - Token string `json:"token"` - UserUUID *string `json:"userUUID"` - RevID string `json:"revID"` - Timestamp uint64 `json:"timestamp"` - TrackerVersion string `json:"trackerVersion"` - IsSnippet bool `json:"isSnippet"` - DeviceMemory uint64 `json:"deviceMemory"` - JsHeapSizeLimit uint64 `json:"jsHeapSizeLimit"` - ProjectKey *string `json:"projectKey"` - Reset bool `json:"reset"` - UserID string `json:"userID"` - } - type response struct { - Timestamp int64 `json:"timestamp"` - Delay int64 `json:"delay"` - Token string `json:"token"` - UserUUID string `json:"userUUID"` - SessionID string `json:"sessionID"` - BeaconSizeLimit int64 `json:"beaconSizeLimit"` - } - startTime := time.Now() - req := &request{} - body := http.MaxBytesReader(w, r.Body, JSON_SIZE_LIMIT) // what if Body == nil?? // use r.ContentLength to return specific error? + + // Check request body + if r.Body == nil { + responseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) + } + body := http.MaxBytesReader(w, r.Body, JSON_SIZE_LIMIT) defer body.Close() + + // Parse request body + req := &startSessionRequest{} if err := json.NewDecoder(body).Decode(req); err != nil { responseWithError(w, http.StatusBadRequest, err) return } + // Handler's logic if req.ProjectKey == nil { responseWithError(w, http.StatusForbidden, errors.New("ProjectKey value required")) return @@ -82,9 +69,8 @@ func startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) { } // TODO: if EXPIRED => send message for two sessions association expTime := startTime.Add(time.Duration(p.MaxSessionDuration) * time.Millisecond) - tokenData = &token.TokenData{sessionID, expTime.UnixNano() / 1e6} + tokenData = &token.TokenData{ID: sessionID, ExpTime: expTime.UnixNano() / 1e6} - country := geoIP.ExtractISOCodeFromHTTPRequest(r) producer.Produce(TOPIC_RAW_WEB, tokenData.ID, Encode(&SessionStart{ Timestamp: req.Timestamp, ProjectID: uint64(p.ProjectID), @@ -98,14 +84,14 @@ func startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) { UserBrowserVersion: ua.BrowserVersion, UserDevice: ua.Device, UserDeviceType: ua.DeviceType, - UserCountry: country, + UserCountry: geoIP.ExtractISOCodeFromHTTPRequest(r), UserDeviceMemorySize: req.DeviceMemory, UserDeviceHeapSize: req.JsHeapSizeLimit, UserID: req.UserID, })) } - responseWithJSON(w, &response{ + responseWithJSON(w, &startSessionResponse{ Token: tokenizer.Compose(*tokenData), UserUUID: userUUID, SessionID: strconv.FormatUint(tokenData.ID, 10), @@ -114,15 +100,24 @@ func startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) { } func pushMessagesHandlerWeb(w http.ResponseWriter, r *http.Request) { + // Check authorization sessionData, err := tokenizer.ParseFromHTTPRequest(r) if err != nil { responseWithError(w, http.StatusUnauthorized, err) return } + + // Check request body + if r.Body == nil { + responseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) + } body := http.MaxBytesReader(w, r.Body, BEACON_SIZE_LIMIT) defer body.Close() - rewritenBuf, err := RewriteBatch(body, func(msg Message) Message { + var handledMessages bytes.Buffer + + // Process each message in request data + err = ReadBatchReader(body, func(msg Message) { switch m := msg.(type) { case *SetNodeAttributeURLBased: if m.Name == "src" || m.Name == "href" { @@ -150,30 +145,38 @@ func pushMessagesHandlerWeb(w http.ResponseWriter, r *http.Request) { Rule: handleCSS(sessionData.ID, m.BaseURL, m.Rule), } } - - return msg + handledMessages.Write(msg.Encode()) }) if err != nil { responseWithError(w, http.StatusForbidden, err) return } - producer.Produce(TOPIC_RAW_WEB, sessionData.ID, rewritenBuf) + + // Send processed messages to queue as array of bytes + err = producer.Produce(TOPIC_RAW_WEB, sessionData.ID, handledMessages.Bytes()) + if err != nil { + log.Printf("can't send processed messages to queue: %s", err) + } + w.WriteHeader(http.StatusOK) } func notStartedHandlerWeb(w http.ResponseWriter, r *http.Request) { - type request struct { - ProjectKey *string `json:"projectKey"` - TrackerVersion string `json:"trackerVersion"` - DoNotTrack bool `json:"DoNotTrack"` + // Check request body + if r.Body == nil { + responseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) } - req := &request{} body := http.MaxBytesReader(w, r.Body, JSON_SIZE_LIMIT) defer body.Close() + + // Parse request body + req := ¬StartedRequest{} if err := json.NewDecoder(body).Decode(req); err != nil { responseWithError(w, http.StatusBadRequest, err) return } + + // Handler's logic if req.ProjectKey == nil { responseWithError(w, http.StatusForbidden, errors.New("ProjectKey value required")) return @@ -201,5 +204,6 @@ func notStartedHandlerWeb(w http.ResponseWriter, r *http.Request) { if err != nil { log.Printf("Unable to insert Unstarted Session: %v\n", err) } + w.WriteHeader(http.StatusOK) } diff --git a/backend/services/http/main.go b/backend/services/http/main.go index 1f3bc93b3..43dd6865e 100644 --- a/backend/services/http/main.go +++ b/backend/services/http/main.go @@ -4,6 +4,7 @@ import ( "context" "log" "net/http" + "openreplay/backend/pkg/db/postgres" "os" "os/signal" "syscall" @@ -11,7 +12,6 @@ import ( "golang.org/x/net/http2" "openreplay/backend/pkg/db/cache" - "openreplay/backend/pkg/db/postgres" "openreplay/backend/pkg/env" "openreplay/backend/pkg/flakeid" "openreplay/backend/pkg/queue" @@ -47,26 +47,32 @@ func main() { log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) pprof.StartProfilingServer() + // Queue producer = queue.NewProducer() defer producer.Close(15000) + + // Database + pgconn = cache.NewPGCache(postgres.NewConn(env.String("POSTGRES_STRING")), 1000*60*20) + defer pgconn.Close() + + // Envs TOPIC_RAW_WEB = env.String("TOPIC_RAW_WEB") TOPIC_RAW_IOS = env.String("TOPIC_RAW_IOS") TOPIC_CACHE = env.String("TOPIC_CACHE") TOPIC_TRIGGER = env.String("TOPIC_TRIGGER") - //TOPIC_ANALYTICS = env.String("TOPIC_ANALYTICS") + CACHE_ASSESTS = env.Bool("CACHE_ASSETS") + BEACON_SIZE_LIMIT = int64(env.Uint64("BEACON_SIZE_LIMIT")) + HTTP_PORT := env.String("HTTP_PORT") + + // Modules rewriter = assets.NewRewriter(env.String("ASSETS_ORIGIN")) - pgconn = cache.NewPGCache(postgres.NewConn(env.String("POSTGRES_STRING")), 1000*60*20) - defer pgconn.Close() s3 = storage.NewS3(env.String("AWS_REGION"), env.String("S3_BUCKET_IOS_IMAGES")) tokenizer = token.NewTokenizer(env.String("TOKEN_SECRET")) uaParser = uaparser.NewUAParser(env.String("UAPARSER_FILE")) geoIP = geoip.NewGeoIP(env.String("MAXMINDDB_FILE")) flaker = flakeid.NewFlaker(env.WorkerID()) - CACHE_ASSESTS = env.Bool("CACHE_ASSETS") - BEACON_SIZE_LIMIT = int64(env.Uint64("BEACON_SIZE_LIMIT")) - - HTTP_PORT := env.String("HTTP_PORT") + // Server server := &http.Server{ Addr: ":" + HTTP_PORT, Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -140,6 +146,7 @@ func main() { } }), } + http2.ConfigureServer(server, nil) go func() { if err := server.ListenAndServe(); err != nil { @@ -148,6 +155,7 @@ func main() { } }() log.Printf("Server successfully started on port %v\n", HTTP_PORT) + sigchan := make(chan os.Signal, 1) signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM) <-sigchan diff --git a/backend/services/http/model.go b/backend/services/http/model.go new file mode 100644 index 000000000..5a7dd28bc --- /dev/null +++ b/backend/services/http/model.go @@ -0,0 +1,30 @@ +package main + +type startSessionRequest struct { + Token string `json:"token"` + UserUUID *string `json:"userUUID"` + RevID string `json:"revID"` + Timestamp uint64 `json:"timestamp"` + TrackerVersion string `json:"trackerVersion"` + IsSnippet bool `json:"isSnippet"` + DeviceMemory uint64 `json:"deviceMemory"` + JsHeapSizeLimit uint64 `json:"jsHeapSizeLimit"` + ProjectKey *string `json:"projectKey"` + Reset bool `json:"reset"` + UserID string `json:"userID"` +} + +type startSessionResponse struct { + Timestamp int64 `json:"timestamp"` + Delay int64 `json:"delay"` + Token string `json:"token"` + UserUUID string `json:"userUUID"` + SessionID string `json:"sessionID"` + BeaconSizeLimit int64 `json:"beaconSizeLimit"` +} + +type notStartedRequest struct { + ProjectKey *string `json:"projectKey"` + TrackerVersion string `json:"trackerVersion"` + DoNotTrack bool `json:"DoNotTrack"` +} From b0bb5bd922f5acdc8da70c44963c2d2895eea0a1 Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Fri, 29 Apr 2022 17:23:20 +0200 Subject: [PATCH 025/260] Moved configuration to the separate file --- backend/services/http/assets.go | 6 ++-- backend/services/http/config.go | 39 +++++++++++++++++++++++++ backend/services/http/handlers-ios.go | 10 +++---- backend/services/http/handlers-web.go | 12 ++++---- backend/services/http/handlers.go | 4 +-- backend/services/http/main.go | 41 +++++++++------------------ 6 files changed, 68 insertions(+), 44 deletions(-) create mode 100644 backend/services/http/config.go diff --git a/backend/services/http/assets.go b/backend/services/http/assets.go index b6ac61186..bced76ef0 100644 --- a/backend/services/http/assets.go +++ b/backend/services/http/assets.go @@ -7,7 +7,7 @@ import ( func sendAssetForCache(sessionID uint64, baseURL string, relativeURL string) { if fullURL, cacheable := assets.GetFullCachableURL(baseURL, relativeURL); cacheable { - producer.Produce(TOPIC_CACHE, sessionID, messages.Encode(&messages.AssetCache{ + producer.Produce(cfg.TopicCache, sessionID, messages.Encode(&messages.AssetCache{ URL: fullURL, })) } @@ -20,7 +20,7 @@ func sendAssetsForCacheFromCSS(sessionID uint64, baseURL string, css string) { } func handleURL(sessionID uint64, baseURL string, url string) string { - if CACHE_ASSESTS { + if cfg.CacheAssets { sendAssetForCache(sessionID, baseURL, url) return rewriter.RewriteURL(sessionID, baseURL, url) } @@ -28,7 +28,7 @@ func handleURL(sessionID uint64, baseURL string, url string) string { } func handleCSS(sessionID uint64, baseURL string, css string) string { - if CACHE_ASSESTS { + if cfg.CacheAssets { sendAssetsForCacheFromCSS(sessionID, baseURL, css) return rewriter.RewriteCSS(sessionID, baseURL, css) } diff --git a/backend/services/http/config.go b/backend/services/http/config.go new file mode 100644 index 000000000..f03ef8cc4 --- /dev/null +++ b/backend/services/http/config.go @@ -0,0 +1,39 @@ +package main + +import "openreplay/backend/pkg/env" + +type config struct { + HTTPPort string + TopicRawWeb string + TopicRawIOS string + TopicCache string + CacheAssets bool + BeaconSizeLimit int64 + JsonSizeLimit int64 + AssetsOrigin string + AWSRegion string + S3BucketIOSImages string + TokenSecret string + UAParserFile string + MaxMinDBFile string + WorkerID uint16 +} + +func NewConfig() *config { + return &config{ + HTTPPort: env.String("HTTP_PORT"), + TopicRawWeb: env.String("TOPIC_RAW_WEB"), + TopicRawIOS: env.String("TOPIC_RAW_IOS"), + TopicCache: env.String("TOPIC_CACHE"), + CacheAssets: env.Bool("CACHE_ASSETS"), + BeaconSizeLimit: int64(env.Uint64("BEACON_SIZE_LIMIT")), + JsonSizeLimit: 1e3, // 1Kb + AssetsOrigin: env.String("ASSETS_ORIGIN"), + AWSRegion: env.String("AWS_REGION"), + S3BucketIOSImages: env.String("S3_BUCKET_IOS_IMAGES"), + TokenSecret: env.String("TOKEN_SECRET"), + UAParserFile: env.String("UAPARSER_FILE"), + MaxMinDBFile: env.String("MAXMINDDB_FILE"), + WorkerID: env.WorkerID(), + } +} diff --git a/backend/services/http/handlers-ios.go b/backend/services/http/handlers-ios.go index a7b6f984a..6dae4e70c 100644 --- a/backend/services/http/handlers-ios.go +++ b/backend/services/http/handlers-ios.go @@ -36,7 +36,7 @@ func startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) { } startTime := time.Now() req := &request{} - body := http.MaxBytesReader(w, r.Body, JSON_SIZE_LIMIT) + body := http.MaxBytesReader(w, r.Body, cfg.JsonSizeLimit) defer body.Close() if err := json.NewDecoder(body).Decode(req); err != nil { responseWithError(w, http.StatusBadRequest, err) @@ -84,7 +84,7 @@ func startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) { country := geoIP.ExtractISOCodeFromHTTPRequest(r) // The difference with web is mostly here: - producer.Produce(TOPIC_RAW_IOS, tokenData.ID, Encode(&IOSSessionStart{ + producer.Produce(cfg.TopicRawIOS, tokenData.ID, Encode(&IOSSessionStart{ Timestamp: req.Timestamp, ProjectID: uint64(p.ProjectID), TrackerVersion: req.TrackerVersion, @@ -102,7 +102,7 @@ func startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) { Token: tokenizer.Compose(*tokenData), UserUUID: userUUID, SessionID: strconv.FormatUint(tokenData.ID, 10), - BeaconSizeLimit: BEACON_SIZE_LIMIT, + BeaconSizeLimit: cfg.BeaconSizeLimit, }) } @@ -112,7 +112,7 @@ func pushMessagesHandlerIOS(w http.ResponseWriter, r *http.Request) { responseWithError(w, http.StatusUnauthorized, err) return } - pushMessages(w, r, sessionData.ID, TOPIC_RAW_IOS) + pushMessages(w, r, sessionData.ID, cfg.TopicRawIOS) } func pushLateMessagesHandlerIOS(w http.ResponseWriter, r *http.Request) { @@ -122,7 +122,7 @@ func pushLateMessagesHandlerIOS(w http.ResponseWriter, r *http.Request) { return } // Check timestamps here? - pushMessages(w, r, sessionData.ID, TOPIC_RAW_IOS) + pushMessages(w, r, sessionData.ID, cfg.TopicRawIOS) } func imagesUploadHandlerIOS(w http.ResponseWriter, r *http.Request) { diff --git a/backend/services/http/handlers-web.go b/backend/services/http/handlers-web.go index 0c2fa386c..1b212e2ba 100644 --- a/backend/services/http/handlers-web.go +++ b/backend/services/http/handlers-web.go @@ -22,7 +22,7 @@ func startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) { if r.Body == nil { responseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) } - body := http.MaxBytesReader(w, r.Body, JSON_SIZE_LIMIT) + body := http.MaxBytesReader(w, r.Body, cfg.JsonSizeLimit) defer body.Close() // Parse request body @@ -71,7 +71,7 @@ func startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) { expTime := startTime.Add(time.Duration(p.MaxSessionDuration) * time.Millisecond) tokenData = &token.TokenData{ID: sessionID, ExpTime: expTime.UnixNano() / 1e6} - producer.Produce(TOPIC_RAW_WEB, tokenData.ID, Encode(&SessionStart{ + producer.Produce(cfg.TopicRawWeb, tokenData.ID, Encode(&SessionStart{ Timestamp: req.Timestamp, ProjectID: uint64(p.ProjectID), TrackerVersion: req.TrackerVersion, @@ -95,7 +95,7 @@ func startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) { Token: tokenizer.Compose(*tokenData), UserUUID: userUUID, SessionID: strconv.FormatUint(tokenData.ID, 10), - BeaconSizeLimit: BEACON_SIZE_LIMIT, + BeaconSizeLimit: cfg.BeaconSizeLimit, }) } @@ -111,7 +111,7 @@ func pushMessagesHandlerWeb(w http.ResponseWriter, r *http.Request) { if r.Body == nil { responseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) } - body := http.MaxBytesReader(w, r.Body, BEACON_SIZE_LIMIT) + body := http.MaxBytesReader(w, r.Body, cfg.BeaconSizeLimit) defer body.Close() var handledMessages bytes.Buffer @@ -153,7 +153,7 @@ func pushMessagesHandlerWeb(w http.ResponseWriter, r *http.Request) { } // Send processed messages to queue as array of bytes - err = producer.Produce(TOPIC_RAW_WEB, sessionData.ID, handledMessages.Bytes()) + err = producer.Produce(cfg.TopicRawWeb, sessionData.ID, handledMessages.Bytes()) if err != nil { log.Printf("can't send processed messages to queue: %s", err) } @@ -166,7 +166,7 @@ func notStartedHandlerWeb(w http.ResponseWriter, r *http.Request) { if r.Body == nil { responseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) } - body := http.MaxBytesReader(w, r.Body, JSON_SIZE_LIMIT) + body := http.MaxBytesReader(w, r.Body, cfg.JsonSizeLimit) defer body.Close() // Parse request body diff --git a/backend/services/http/handlers.go b/backend/services/http/handlers.go index dd73925af..d2d780f30 100644 --- a/backend/services/http/handlers.go +++ b/backend/services/http/handlers.go @@ -9,10 +9,8 @@ import ( gzip "github.com/klauspost/pgzip" ) -const JSON_SIZE_LIMIT int64 = 1e3 // 1Kb - func pushMessages(w http.ResponseWriter, r *http.Request, sessionID uint64, topicName string) { - body := http.MaxBytesReader(w, r.Body, BEACON_SIZE_LIMIT) + body := http.MaxBytesReader(w, r.Body, cfg.BeaconSizeLimit) defer body.Close() var reader io.ReadCloser var err error diff --git a/backend/services/http/main.go b/backend/services/http/main.go index 43dd6865e..d053c9c2f 100644 --- a/backend/services/http/main.go +++ b/backend/services/http/main.go @@ -25,6 +25,8 @@ import ( "openreplay/backend/pkg/pprof" ) +// Global variables +var cfg *config var rewriter *assets.Rewriter var producer types.Producer var pgconn *cache.PGCache @@ -34,19 +36,13 @@ var geoIP *geoip.GeoIP var tokenizer *token.Tokenizer var s3 *storage.S3 -var TOPIC_RAW_WEB string -var TOPIC_RAW_IOS string -var TOPIC_CACHE string -var TOPIC_TRIGGER string - -//var TOPIC_ANALYTICS string -var CACHE_ASSESTS bool -var BEACON_SIZE_LIMIT int64 - func main() { log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) pprof.StartProfilingServer() + // Configs + cfg = NewConfig() + // Queue producer = queue.NewProducer() defer producer.Close(15000) @@ -55,26 +51,17 @@ func main() { pgconn = cache.NewPGCache(postgres.NewConn(env.String("POSTGRES_STRING")), 1000*60*20) defer pgconn.Close() - // Envs - TOPIC_RAW_WEB = env.String("TOPIC_RAW_WEB") - TOPIC_RAW_IOS = env.String("TOPIC_RAW_IOS") - TOPIC_CACHE = env.String("TOPIC_CACHE") - TOPIC_TRIGGER = env.String("TOPIC_TRIGGER") - CACHE_ASSESTS = env.Bool("CACHE_ASSETS") - BEACON_SIZE_LIMIT = int64(env.Uint64("BEACON_SIZE_LIMIT")) - HTTP_PORT := env.String("HTTP_PORT") - - // Modules - rewriter = assets.NewRewriter(env.String("ASSETS_ORIGIN")) - s3 = storage.NewS3(env.String("AWS_REGION"), env.String("S3_BUCKET_IOS_IMAGES")) - tokenizer = token.NewTokenizer(env.String("TOKEN_SECRET")) - uaParser = uaparser.NewUAParser(env.String("UAPARSER_FILE")) - geoIP = geoip.NewGeoIP(env.String("MAXMINDDB_FILE")) - flaker = flakeid.NewFlaker(env.WorkerID()) + // Init modules + rewriter = assets.NewRewriter(cfg.AssetsOrigin) + s3 = storage.NewS3(cfg.AWSRegion, cfg.S3BucketIOSImages) + tokenizer = token.NewTokenizer(cfg.TokenSecret) + uaParser = uaparser.NewUAParser(cfg.UAParserFile) + geoIP = geoip.NewGeoIP(cfg.MaxMinDBFile) + flaker = flakeid.NewFlaker(cfg.WorkerID) // Server server := &http.Server{ - Addr: ":" + HTTP_PORT, + Addr: ":" + cfg.HTTPPort, Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // TODO: agree with specification @@ -154,7 +141,7 @@ func main() { log.Fatal("Server error") } }() - log.Printf("Server successfully started on port %v\n", HTTP_PORT) + log.Printf("Server successfully started on port %v\n", cfg.HTTPPort) sigchan := make(chan os.Signal, 1) signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM) From 6807dc8ce1a97755766153b30ba5b56ee35f7088 Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Fri, 29 Apr 2022 18:52:29 +0200 Subject: [PATCH 026/260] feat(api): EE optimized get error details --- ee/api/chalicelib/core/errors.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ee/api/chalicelib/core/errors.py b/ee/api/chalicelib/core/errors.py index c7e066f8b..ecf1aeda2 100644 --- a/ee/api/chalicelib/core/errors.py +++ b/ee/api/chalicelib/core/errors.py @@ -272,6 +272,7 @@ def get_details(project_id, error_id, user_id, **data): INNER JOIN events.errors AS ee USING (error_id) INNER JOIN public.sessions USING (session_id) WHERE pe.project_id = %(project_id)s + AND sessions.project_id = %(project_id)s AND error_id = %(error_id)s ORDER BY start_ts DESC LIMIT 1;""", From 867f92dfc7211303e834404d125290eac8cb19da Mon Sep 17 00:00:00 2001 From: Rajesh Rajendran Date: Sat, 30 Apr 2022 16:07:00 +0000 Subject: [PATCH 027/260] Update development.md --- backend/development.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/backend/development.md b/backend/development.md index 0e7295c8b..1339a2456 100644 --- a/backend/development.md +++ b/backend/development.md @@ -2,13 +2,6 @@ - [Vagrant](../scripts/vagrant/README.md) -### Development environment - -```bash -docker build -f Dockerfile.bundle . - -``` - ### Building and deploying locally ```bash From b87e601f27e4758f3e7515b68765529e57a1d822 Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Mon, 2 May 2022 11:06:15 +0200 Subject: [PATCH 028/260] chore(vagrant): Changed development.md chore(vagrant): Added dev setup-scripts for EE --- api/development.md | 13 ---- ee/api/clean.sh | 85 +++++++++++++++++++++ ee/api/development.md | 36 +++++++++ ee/api/{prepare-local.sh => prepare-dev.sh} | 0 4 files changed, 121 insertions(+), 13 deletions(-) create mode 100755 ee/api/clean.sh create mode 100644 ee/api/development.md rename ee/api/{prepare-local.sh => prepare-dev.sh} (100%) diff --git a/api/development.md b/api/development.md index 116518604..15e3c64a7 100644 --- a/api/development.md +++ b/api/development.md @@ -7,7 +7,6 @@ ### Development environment ```bash -**FOSS:** cd openreplay/api # Make your own copy of .env file and edit it as you want cp .env.dev .env @@ -17,18 +16,6 @@ mkdir .venv # Installing dependencies (pipenv will detect the .venv folder and use it as a target) pipenv install -r requirements.txt [--skip-lock] - -# Create a .venv folder to contain all you dependencies -mkdir .venv - -# Installing dependencies (pipenv will detect the .venv folder and use it as a target) -pipenv install -r requirements.txt [--skip-lock] - -# These commands must bu used everytime you make changes to FOSS. -# To clean the unused files before getting new ones -bash clean.sh -# To copy commun files from FOSS -bash prepare-dev.sh ``` ### Building and deploying locally diff --git a/ee/api/clean.sh b/ee/api/clean.sh new file mode 100755 index 000000000..59f723c80 --- /dev/null +++ b/ee/api/clean.sh @@ -0,0 +1,85 @@ +#!/bin/bash + +rm -rf ./chalicelib/core/alerts.py +rm -rf ./chalicelib/core/alerts_processor.py +rm -rf ./chalicelib/core/announcements.py +rm -rf ./chalicelib/core/collaboration_slack.py +rm -rf ./chalicelib/core/errors_favorite_viewed.py +rm -rf ./chalicelib/core/events.py +rm -rf ./chalicelib/core/events_ios.py +rm -rf ./chalicelib/core/dashboards.py +rm -rf ./chalicelib/core/funnels.py +rm -rf ./chalicelib/core/integration_base.py +rm -rf ./chalicelib/core/integration_base_issue.py +rm -rf ./chalicelib/core/integration_github.py +rm -rf ./chalicelib/core/integration_github_issue.py +rm -rf ./chalicelib/core/integration_jira_cloud.py +rm -rf ./chalicelib/core/integration_jira_cloud_issue.py +rm -rf ./chalicelib/core/integrations_manager.py +rm -rf ./chalicelib/core/issues.py +rm -rf ./chalicelib/core/jobs.py +rm -rf ./chalicelib/core/log_tool_bugsnag.py +rm -rf ./chalicelib/core/log_tool_cloudwatch.py +rm -rf ./chalicelib/core/log_tool_datadog.py +rm -rf ./chalicelib/core/log_tool_elasticsearch.py +rm -rf ./chalicelib/core/log_tool_newrelic.py +rm -rf ./chalicelib/core/log_tool_rollbar.py +rm -rf ./chalicelib/core/log_tool_sentry.py +rm -rf ./chalicelib/core/log_tool_stackdriver.py +rm -rf ./chalicelib/core/log_tool_sumologic.py +rm -rf ./chalicelib/core/metadata.py +rm -rf ./chalicelib/core/mobile.py +rm -rf ./chalicelib/core/sessions.py +rm -rf ./chalicelib/core/sessions_assignments.py +rm -rf ./chalicelib/core/sessions_favorite_viewed.py +rm -rf ./chalicelib/core/sessions_metas.py +rm -rf ./chalicelib/core/sessions_mobs.py +rm -rf ./chalicelib/core/significance.py +rm -rf ./chalicelib/core/slack.py +rm -rf ./chalicelib/core/socket_ios.py +rm -rf ./chalicelib/core/sourcemaps.py +rm -rf ./chalicelib/core/sourcemaps_parser.py +rm -rf ./chalicelib/core/weekly_report.py +rm -rf ./chalicelib/saml +rm -rf ./chalicelib/utils/html/ +rm -rf ./chalicelib/utils/__init__.py +rm -rf ./chalicelib/utils/args_transformer.py +rm -rf ./chalicelib/utils/captcha.py +rm -rf ./chalicelib/utils/dev.py +rm -rf ./chalicelib/utils/email_handler.py +rm -rf ./chalicelib/utils/email_helper.py +rm -rf ./chalicelib/utils/event_filter_definition.py +rm -rf ./chalicelib/utils/github_client_v3.py +rm -rf ./chalicelib/utils/helper.py +rm -rf ./chalicelib/utils/jira_client.py +rm -rf ./chalicelib/utils/metrics_helper.py +rm -rf ./chalicelib/utils/pg_client.py +rm -rf ./chalicelib/utils/s3.py +rm -rf ./chalicelib/utils/smtp.py +rm -rf ./chalicelib/utils/strings.py +rm -rf ./chalicelib/utils/TimeUTC.py +rm -rf ./routers/app/__init__.py +rm -rf ./routers/crons/__init__.py +rm -rf ./routers/subs/__init__.py +rm -rf ./routers/__init__.py +rm -rf ./chalicelib/core/assist.py +rm -rf ./auth/auth_apikey.py +rm -rf ./auth/auth_jwt.py +rm -rf ./build.sh +rm -rf ./routers/core.py +rm -rf ./routers/crons/core_crons.py +rm -rf ./routers/subs/dashboard.py +rm -rf ./db_changes.sql +rm -rf ./Dockerfile.bundle +rm -rf ./entrypoint.bundle.sh +rm -rf ./entrypoint.sh +rm -rf ./chalicelib/core/heatmaps.py +rm -rf ./routers/subs/insights.py +rm -rf ./schemas.py +rm -rf ./routers/subs/v1_api.py +rm -rf ./routers/subs/metrics.py +rm -rf ./chalicelib/core/custom_metrics.py +rm -rf ./chalicelib/core/performance_event.py +rm -rf ./chalicelib/core/saved_search.py +rm -rf ./app_alerts.py +rm -rf ./build_alerts.sh diff --git a/ee/api/development.md b/ee/api/development.md new file mode 100644 index 000000000..d980a24d7 --- /dev/null +++ b/ee/api/development.md @@ -0,0 +1,36 @@ +### Prerequisites + +- [Vagrant](../scripts/vagrant/README.md) +- Python 3.9 +- Pipenv + +### Development environment + +```bash +cd openreplay/ee/api +# Make your own copy of .env file and edit it as you want +cp .env.dev .env + +# Create a .venv folder to contain all you dependencies +mkdir .venv + +# Installing dependencies (pipenv will detect the .venv folder and use it as a target) +pipenv install -r requirements.txt [--skip-lock] + +# These commands must bu used everytime you make changes to FOSS. +# To clean the unused files before getting new ones +bash clean.sh +# To copy commun files from FOSS +bash prepare-dev.sh +``` + +### Building and deploying locally + +```bash +cd openreplay-contributions +vagrant ssh +cd openreplay-dev/openreplay/scripts/helmcharts +# For complete list of options +# bash local_deploy.sh help +bash local_deploy.sh api +``` diff --git a/ee/api/prepare-local.sh b/ee/api/prepare-dev.sh similarity index 100% rename from ee/api/prepare-local.sh rename to ee/api/prepare-dev.sh From 66e190221d4f4bbf04d84b19b26f76bb3487d456 Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Mon, 2 May 2022 14:36:02 +0200 Subject: [PATCH 029/260] Removed global objects (moved service initialization into serviceBuilder) --- backend/services/http/assets.go | 24 ++--- backend/services/http/config.go | 11 +- backend/services/http/handlers-ios.go | 38 +++---- backend/services/http/handlers-web.go | 46 ++++---- backend/services/http/handlers.go | 6 +- backend/services/http/main.go | 144 +++++--------------------- backend/services/http/router.go | 68 ++++++++++++ backend/services/http/server.go | 46 ++++++++ backend/services/http/service.go | 36 +++++++ 9 files changed, 243 insertions(+), 176 deletions(-) create mode 100644 backend/services/http/router.go create mode 100644 backend/services/http/server.go create mode 100644 backend/services/http/service.go diff --git a/backend/services/http/assets.go b/backend/services/http/assets.go index bced76ef0..0948984b0 100644 --- a/backend/services/http/assets.go +++ b/backend/services/http/assets.go @@ -5,32 +5,32 @@ import ( "openreplay/backend/pkg/url/assets" ) -func sendAssetForCache(sessionID uint64, baseURL string, relativeURL string) { +func (e *Router) sendAssetForCache(sessionID uint64, baseURL string, relativeURL string) { if fullURL, cacheable := assets.GetFullCachableURL(baseURL, relativeURL); cacheable { - producer.Produce(cfg.TopicCache, sessionID, messages.Encode(&messages.AssetCache{ + e.services.producer.Produce(e.cfg.TopicCache, sessionID, messages.Encode(&messages.AssetCache{ URL: fullURL, })) } } -func sendAssetsForCacheFromCSS(sessionID uint64, baseURL string, css string) { +func (e *Router) sendAssetsForCacheFromCSS(sessionID uint64, baseURL string, css string) { for _, u := range assets.ExtractURLsFromCSS(css) { // TODO: in one shot with rewriting - sendAssetForCache(sessionID, baseURL, u) + e.sendAssetForCache(sessionID, baseURL, u) } } -func handleURL(sessionID uint64, baseURL string, url string) string { - if cfg.CacheAssets { - sendAssetForCache(sessionID, baseURL, url) - return rewriter.RewriteURL(sessionID, baseURL, url) +func (e *Router) handleURL(sessionID uint64, baseURL string, url string) string { + if e.cfg.CacheAssets { + e.sendAssetForCache(sessionID, baseURL, url) + return e.services.rewriter.RewriteURL(sessionID, baseURL, url) } return assets.ResolveURL(baseURL, url) } -func handleCSS(sessionID uint64, baseURL string, css string) string { - if cfg.CacheAssets { - sendAssetsForCacheFromCSS(sessionID, baseURL, css) - return rewriter.RewriteCSS(sessionID, baseURL, css) +func (e *Router) handleCSS(sessionID uint64, baseURL string, css string) string { + if e.cfg.CacheAssets { + e.sendAssetsForCacheFromCSS(sessionID, baseURL, css) + return e.services.rewriter.RewriteCSS(sessionID, baseURL, css) } return assets.ResolveCSS(baseURL, css) } diff --git a/backend/services/http/config.go b/backend/services/http/config.go index f03ef8cc4..4b29afb9d 100644 --- a/backend/services/http/config.go +++ b/backend/services/http/config.go @@ -1,9 +1,14 @@ package main -import "openreplay/backend/pkg/env" +import ( + "openreplay/backend/pkg/env" + "time" +) type config struct { + HTTPHost string HTTPPort string + HTTPTimeout time.Duration TopicRawWeb string TopicRawIOS string TopicCache string @@ -13,6 +18,7 @@ type config struct { AssetsOrigin string AWSRegion string S3BucketIOSImages string + Postgres string TokenSecret string UAParserFile string MaxMinDBFile string @@ -21,7 +27,9 @@ type config struct { func NewConfig() *config { return &config{ + HTTPHost: "", HTTPPort: env.String("HTTP_PORT"), + HTTPTimeout: time.Second * 60, TopicRawWeb: env.String("TOPIC_RAW_WEB"), TopicRawIOS: env.String("TOPIC_RAW_IOS"), TopicCache: env.String("TOPIC_CACHE"), @@ -31,6 +39,7 @@ func NewConfig() *config { AssetsOrigin: env.String("ASSETS_ORIGIN"), AWSRegion: env.String("AWS_REGION"), S3BucketIOSImages: env.String("S3_BUCKET_IOS_IMAGES"), + Postgres: env.String("POSTGRES_STRING"), TokenSecret: env.String("TOKEN_SECRET"), UAParserFile: env.String("UAPARSER_FILE"), MaxMinDBFile: env.String("MAXMINDDB_FILE"), diff --git a/backend/services/http/handlers-ios.go b/backend/services/http/handlers-ios.go index 6dae4e70c..4591a7d72 100644 --- a/backend/services/http/handlers-ios.go +++ b/backend/services/http/handlers-ios.go @@ -16,7 +16,7 @@ import ( const FILES_SIZE_LIMIT int64 = 1e7 // 10Mb -func startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) { +func (e *Router) startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) { type request struct { Token string `json:"token"` ProjectKey *string `json:"projectKey"` @@ -36,7 +36,7 @@ func startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) { } startTime := time.Now() req := &request{} - body := http.MaxBytesReader(w, r.Body, cfg.JsonSizeLimit) + body := http.MaxBytesReader(w, r.Body, e.cfg.JsonSizeLimit) defer body.Close() if err := json.NewDecoder(body).Decode(req); err != nil { responseWithError(w, http.StatusBadRequest, err) @@ -48,7 +48,7 @@ func startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) { return } - p, err := pgconn.GetProjectByKey(*req.ProjectKey) + p, err := e.services.pgconn.GetProjectByKey(*req.ProjectKey) if err != nil { if postgres.IsNoRowsErr(err) { responseWithError(w, http.StatusNotFound, errors.New("Project doesn't exist or is not active")) @@ -58,7 +58,7 @@ func startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) { return } userUUID := getUUID(req.UserUUID) - tokenData, err := tokenizer.Parse(req.Token) + tokenData, err := e.services.tokenizer.Parse(req.Token) if err != nil { // Starting the new one dice := byte(rand.Intn(100)) // [0, 100) @@ -67,12 +67,12 @@ func startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) { return } - ua := uaParser.ParseFromHTTPRequest(r) + ua := e.services.uaParser.ParseFromHTTPRequest(r) if ua == nil { responseWithError(w, http.StatusForbidden, errors.New("browser not recognized")) return } - sessionID, err := flaker.Compose(uint64(startTime.UnixMilli())) + sessionID, err := e.services.flaker.Compose(uint64(startTime.UnixMilli())) if err != nil { responseWithError(w, http.StatusInternalServerError, err) return @@ -81,10 +81,10 @@ func startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) { expTime := startTime.Add(time.Duration(p.MaxSessionDuration) * time.Millisecond) tokenData = &token.TokenData{sessionID, expTime.UnixMilli()} - country := geoIP.ExtractISOCodeFromHTTPRequest(r) + country := e.services.geoIP.ExtractISOCodeFromHTTPRequest(r) // The difference with web is mostly here: - producer.Produce(cfg.TopicRawIOS, tokenData.ID, Encode(&IOSSessionStart{ + e.services.producer.Produce(e.cfg.TopicRawIOS, tokenData.ID, Encode(&IOSSessionStart{ Timestamp: req.Timestamp, ProjectID: uint64(p.ProjectID), TrackerVersion: req.TrackerVersion, @@ -99,36 +99,36 @@ func startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) { } responseWithJSON(w, &response{ - Token: tokenizer.Compose(*tokenData), + Token: e.services.tokenizer.Compose(*tokenData), UserUUID: userUUID, SessionID: strconv.FormatUint(tokenData.ID, 10), - BeaconSizeLimit: cfg.BeaconSizeLimit, + BeaconSizeLimit: e.cfg.BeaconSizeLimit, }) } -func pushMessagesHandlerIOS(w http.ResponseWriter, r *http.Request) { - sessionData, err := tokenizer.ParseFromHTTPRequest(r) +func (e *Router) pushMessagesHandlerIOS(w http.ResponseWriter, r *http.Request) { + sessionData, err := e.services.tokenizer.ParseFromHTTPRequest(r) if err != nil { responseWithError(w, http.StatusUnauthorized, err) return } - pushMessages(w, r, sessionData.ID, cfg.TopicRawIOS) + e.pushMessages(w, r, sessionData.ID, e.cfg.TopicRawIOS) } -func pushLateMessagesHandlerIOS(w http.ResponseWriter, r *http.Request) { - sessionData, err := tokenizer.ParseFromHTTPRequest(r) +func (e *Router) pushLateMessagesHandlerIOS(w http.ResponseWriter, r *http.Request) { + sessionData, err := e.services.tokenizer.ParseFromHTTPRequest(r) if err != nil && err != token.EXPIRED { responseWithError(w, http.StatusUnauthorized, err) return } // Check timestamps here? - pushMessages(w, r, sessionData.ID, cfg.TopicRawIOS) + e.pushMessages(w, r, sessionData.ID, e.cfg.TopicRawIOS) } -func imagesUploadHandlerIOS(w http.ResponseWriter, r *http.Request) { +func (e *Router) imagesUploadHandlerIOS(w http.ResponseWriter, r *http.Request) { log.Printf("recieved imagerequest") - sessionData, err := tokenizer.ParseFromHTTPRequest(r) + sessionData, err := e.services.tokenizer.ParseFromHTTPRequest(r) if err != nil { // Should accept expired token? responseWithError(w, http.StatusUnauthorized, err) return @@ -164,7 +164,7 @@ func imagesUploadHandlerIOS(w http.ResponseWriter, r *http.Request) { key := prefix + fileHeader.Filename log.Printf("Uploading image... %v", key) go func() { //TODO: mime type from header - if err := s3.Upload(file, key, "image/jpeg", false); err != nil { + if err := e.services.s3.Upload(file, key, "image/jpeg", false); err != nil { log.Printf("Upload ios screen error. %v", err) } }() diff --git a/backend/services/http/handlers-web.go b/backend/services/http/handlers-web.go index 1b212e2ba..e9fc135b0 100644 --- a/backend/services/http/handlers-web.go +++ b/backend/services/http/handlers-web.go @@ -15,14 +15,14 @@ import ( "openreplay/backend/pkg/token" ) -func startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) { +func (e *Router) startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) { startTime := time.Now() // Check request body if r.Body == nil { responseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) } - body := http.MaxBytesReader(w, r.Body, cfg.JsonSizeLimit) + body := http.MaxBytesReader(w, r.Body, e.cfg.JsonSizeLimit) defer body.Close() // Parse request body @@ -38,7 +38,7 @@ func startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) { return } - p, err := pgconn.GetProjectByKey(*req.ProjectKey) + p, err := e.services.pgconn.GetProjectByKey(*req.ProjectKey) if err != nil { if postgres.IsNoRowsErr(err) { responseWithError(w, http.StatusNotFound, errors.New("Project doesn't exist or capture limit has been reached")) @@ -49,7 +49,7 @@ func startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) { } userUUID := getUUID(req.UserUUID) - tokenData, err := tokenizer.Parse(req.Token) + tokenData, err := e.services.tokenizer.Parse(req.Token) if err != nil || req.Reset { // Starting the new one dice := byte(rand.Intn(100)) // [0, 100) if dice >= p.SampleRate { @@ -57,12 +57,12 @@ func startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) { return } - ua := uaParser.ParseFromHTTPRequest(r) + ua := e.services.uaParser.ParseFromHTTPRequest(r) if ua == nil { responseWithError(w, http.StatusForbidden, errors.New("browser not recognized")) return } - sessionID, err := flaker.Compose(uint64(startTime.UnixNano() / 1e6)) + sessionID, err := e.services.flaker.Compose(uint64(startTime.UnixNano() / 1e6)) if err != nil { responseWithError(w, http.StatusInternalServerError, err) return @@ -71,7 +71,7 @@ func startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) { expTime := startTime.Add(time.Duration(p.MaxSessionDuration) * time.Millisecond) tokenData = &token.TokenData{ID: sessionID, ExpTime: expTime.UnixNano() / 1e6} - producer.Produce(cfg.TopicRawWeb, tokenData.ID, Encode(&SessionStart{ + e.services.producer.Produce(e.cfg.TopicRawWeb, tokenData.ID, Encode(&SessionStart{ Timestamp: req.Timestamp, ProjectID: uint64(p.ProjectID), TrackerVersion: req.TrackerVersion, @@ -84,7 +84,7 @@ func startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) { UserBrowserVersion: ua.BrowserVersion, UserDevice: ua.Device, UserDeviceType: ua.DeviceType, - UserCountry: geoIP.ExtractISOCodeFromHTTPRequest(r), + UserCountry: e.services.geoIP.ExtractISOCodeFromHTTPRequest(r), UserDeviceMemorySize: req.DeviceMemory, UserDeviceHeapSize: req.JsHeapSizeLimit, UserID: req.UserID, @@ -92,16 +92,16 @@ func startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) { } responseWithJSON(w, &startSessionResponse{ - Token: tokenizer.Compose(*tokenData), + Token: e.services.tokenizer.Compose(*tokenData), UserUUID: userUUID, SessionID: strconv.FormatUint(tokenData.ID, 10), - BeaconSizeLimit: cfg.BeaconSizeLimit, + BeaconSizeLimit: e.cfg.BeaconSizeLimit, }) } -func pushMessagesHandlerWeb(w http.ResponseWriter, r *http.Request) { +func (e *Router) pushMessagesHandlerWeb(w http.ResponseWriter, r *http.Request) { // Check authorization - sessionData, err := tokenizer.ParseFromHTTPRequest(r) + sessionData, err := e.services.tokenizer.ParseFromHTTPRequest(r) if err != nil { responseWithError(w, http.StatusUnauthorized, err) return @@ -111,7 +111,7 @@ func pushMessagesHandlerWeb(w http.ResponseWriter, r *http.Request) { if r.Body == nil { responseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) } - body := http.MaxBytesReader(w, r.Body, cfg.BeaconSizeLimit) + body := http.MaxBytesReader(w, r.Body, e.cfg.BeaconSizeLimit) defer body.Close() var handledMessages bytes.Buffer @@ -124,25 +124,25 @@ func pushMessagesHandlerWeb(w http.ResponseWriter, r *http.Request) { msg = &SetNodeAttribute{ ID: m.ID, Name: m.Name, - Value: handleURL(sessionData.ID, m.BaseURL, m.Value), + Value: e.handleURL(sessionData.ID, m.BaseURL, m.Value), } } else if m.Name == "style" { msg = &SetNodeAttribute{ ID: m.ID, Name: m.Name, - Value: handleCSS(sessionData.ID, m.BaseURL, m.Value), + Value: e.handleCSS(sessionData.ID, m.BaseURL, m.Value), } } case *SetCSSDataURLBased: msg = &SetCSSData{ ID: m.ID, - Data: handleCSS(sessionData.ID, m.BaseURL, m.Data), + Data: e.handleCSS(sessionData.ID, m.BaseURL, m.Data), } case *CSSInsertRuleURLBased: msg = &CSSInsertRule{ ID: m.ID, Index: m.Index, - Rule: handleCSS(sessionData.ID, m.BaseURL, m.Rule), + Rule: e.handleCSS(sessionData.ID, m.BaseURL, m.Rule), } } handledMessages.Write(msg.Encode()) @@ -153,7 +153,7 @@ func pushMessagesHandlerWeb(w http.ResponseWriter, r *http.Request) { } // Send processed messages to queue as array of bytes - err = producer.Produce(cfg.TopicRawWeb, sessionData.ID, handledMessages.Bytes()) + err = e.services.producer.Produce(e.cfg.TopicRawWeb, sessionData.ID, handledMessages.Bytes()) if err != nil { log.Printf("can't send processed messages to queue: %s", err) } @@ -161,12 +161,12 @@ func pushMessagesHandlerWeb(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) } -func notStartedHandlerWeb(w http.ResponseWriter, r *http.Request) { +func (e *Router) notStartedHandlerWeb(w http.ResponseWriter, r *http.Request) { // Check request body if r.Body == nil { responseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) } - body := http.MaxBytesReader(w, r.Body, cfg.JsonSizeLimit) + body := http.MaxBytesReader(w, r.Body, e.cfg.JsonSizeLimit) defer body.Close() // Parse request body @@ -181,13 +181,13 @@ func notStartedHandlerWeb(w http.ResponseWriter, r *http.Request) { responseWithError(w, http.StatusForbidden, errors.New("ProjectKey value required")) return } - ua := uaParser.ParseFromHTTPRequest(r) // TODO?: insert anyway + ua := e.services.uaParser.ParseFromHTTPRequest(r) // TODO?: insert anyway if ua == nil { responseWithError(w, http.StatusForbidden, errors.New("browser not recognized")) return } - country := geoIP.ExtractISOCodeFromHTTPRequest(r) - err := pgconn.InsertUnstartedSession(postgres.UnstartedSession{ + country := e.services.geoIP.ExtractISOCodeFromHTTPRequest(r) + err := e.services.pgconn.InsertUnstartedSession(postgres.UnstartedSession{ ProjectKey: *req.ProjectKey, TrackerVersion: req.TrackerVersion, DoNotTrack: req.DoNotTrack, diff --git a/backend/services/http/handlers.go b/backend/services/http/handlers.go index d2d780f30..8f8979a4c 100644 --- a/backend/services/http/handlers.go +++ b/backend/services/http/handlers.go @@ -9,8 +9,8 @@ import ( gzip "github.com/klauspost/pgzip" ) -func pushMessages(w http.ResponseWriter, r *http.Request, sessionID uint64, topicName string) { - body := http.MaxBytesReader(w, r.Body, cfg.BeaconSizeLimit) +func (e *Router) pushMessages(w http.ResponseWriter, r *http.Request, sessionID uint64, topicName string) { + body := http.MaxBytesReader(w, r.Body, e.cfg.BeaconSizeLimit) defer body.Close() var reader io.ReadCloser var err error @@ -34,6 +34,6 @@ func pushMessages(w http.ResponseWriter, r *http.Request, sessionID uint64, topi responseWithError(w, http.StatusInternalServerError, err) // TODO: send error here only on staging return } - producer.Produce(topicName, sessionID, buf) // What if not able to send? + e.services.producer.Produce(topicName, sessionID, buf) // What if not able to send? w.WriteHeader(http.StatusOK) } diff --git a/backend/services/http/main.go b/backend/services/http/main.go index d053c9c2f..d0e97d137 100644 --- a/backend/services/http/main.go +++ b/backend/services/http/main.go @@ -1,151 +1,59 @@ package main import ( - "context" "log" - "net/http" + "openreplay/backend/pkg/db/cache" "openreplay/backend/pkg/db/postgres" + "openreplay/backend/pkg/pprof" + "openreplay/backend/pkg/queue" "os" "os/signal" "syscall" - - "golang.org/x/net/http2" - - "openreplay/backend/pkg/db/cache" - "openreplay/backend/pkg/env" - "openreplay/backend/pkg/flakeid" - "openreplay/backend/pkg/queue" - "openreplay/backend/pkg/queue/types" - "openreplay/backend/pkg/storage" - "openreplay/backend/pkg/token" - "openreplay/backend/pkg/url/assets" - "openreplay/backend/services/http/geoip" - "openreplay/backend/services/http/uaparser" - - "openreplay/backend/pkg/pprof" ) -// Global variables -var cfg *config -var rewriter *assets.Rewriter -var producer types.Producer -var pgconn *cache.PGCache -var flaker *flakeid.Flaker -var uaParser *uaparser.UAParser -var geoIP *geoip.GeoIP -var tokenizer *token.Tokenizer -var s3 *storage.S3 - func main() { log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) pprof.StartProfilingServer() - // Configs - cfg = NewConfig() + // Load configuration + cfg := NewConfig() - // Queue - producer = queue.NewProducer() + // Connect to queue + producer := queue.NewProducer() defer producer.Close(15000) - // Database - pgconn = cache.NewPGCache(postgres.NewConn(env.String("POSTGRES_STRING")), 1000*60*20) - defer pgconn.Close() + // Connect to database + dbConn := cache.NewPGCache(postgres.NewConn(cfg.Postgres), 1000*60*20) + defer dbConn.Close() - // Init modules - rewriter = assets.NewRewriter(cfg.AssetsOrigin) - s3 = storage.NewS3(cfg.AWSRegion, cfg.S3BucketIOSImages) - tokenizer = token.NewTokenizer(cfg.TokenSecret) - uaParser = uaparser.NewUAParser(cfg.UAParserFile) - geoIP = geoip.NewGeoIP(cfg.MaxMinDBFile) - flaker = flakeid.NewFlaker(cfg.WorkerID) + // Build all services + services := NewServiceBuilder(cfg, producer, dbConn) - // Server - server := &http.Server{ - Addr: ":" + cfg.HTTPPort, - Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - - // TODO: agree with specification - w.Header().Set("Access-Control-Allow-Origin", "*") - w.Header().Set("Access-Control-Allow-Methods", "POST") - w.Header().Set("Access-Control-Allow-Headers", "Content-Type,Authorization") - if r.Method == http.MethodOptions { - w.Header().Set("Cache-Control", "max-age=86400") - w.WriteHeader(http.StatusOK) - return - } - - log.Printf("Request: %v - %v ", r.Method, r.URL.Path) - - switch r.URL.Path { - case "/": - w.WriteHeader(http.StatusOK) - case "/v1/web/not-started": - switch r.Method { - case http.MethodPost: - notStartedHandlerWeb(w, r) - default: - w.WriteHeader(http.StatusMethodNotAllowed) - } - case "/v1/web/start": - switch r.Method { - case http.MethodPost: - startSessionHandlerWeb(w, r) - default: - w.WriteHeader(http.StatusMethodNotAllowed) - } - case "/v1/web/i": - switch r.Method { - case http.MethodPost: - pushMessagesHandlerWeb(w, r) - default: - w.WriteHeader(http.StatusMethodNotAllowed) - } - case "/v1/ios/start": - switch r.Method { - case http.MethodPost: - startSessionHandlerIOS(w, r) - default: - w.WriteHeader(http.StatusMethodNotAllowed) - } - case "/v1/ios/i": - switch r.Method { - case http.MethodPost: - pushMessagesHandlerIOS(w, r) - default: - w.WriteHeader(http.StatusMethodNotAllowed) - } - case "/v1/ios/late": - switch r.Method { - case http.MethodPost: - pushLateMessagesHandlerIOS(w, r) - default: - w.WriteHeader(http.StatusMethodNotAllowed) - } - case "/v1/ios/images": - switch r.Method { - case http.MethodPost: - imagesUploadHandlerIOS(w, r) - default: - w.WriteHeader(http.StatusMethodNotAllowed) - } - default: - w.WriteHeader(http.StatusNotFound) - } - }), + // Init server's routes + router, err := NewRouter(cfg, services) + if err != nil { + log.Fatalf("failed while creating engine: %s", err) } - http2.ConfigureServer(server, nil) + // Init server + server, err := NewServer(router.GetHandler(), cfg.HTTPHost, cfg.HTTPPort, cfg.HTTPTimeout) + if err != nil { + log.Fatalf("failed while creating server: %s", err) + } + + // Run server go func() { - if err := server.ListenAndServe(); err != nil { + if err := server.Start(); err != nil { log.Printf("Server error: %v\n", err) log.Fatal("Server error") } }() log.Printf("Server successfully started on port %v\n", cfg.HTTPPort) + // Wait stop signal to shut down server gracefully sigchan := make(chan os.Signal, 1) signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM) <-sigchan log.Printf("Shutting down the server\n") - server.Shutdown(context.Background()) + server.Stop() } diff --git a/backend/services/http/router.go b/backend/services/http/router.go new file mode 100644 index 000000000..af624e32c --- /dev/null +++ b/backend/services/http/router.go @@ -0,0 +1,68 @@ +package main + +import ( + "github.com/gorilla/mux" + "log" + "net/http" +) + +type Router struct { + router *mux.Router + cfg *config + services *ServiceBuilder +} + +func NewRouter(cfg *config, services *ServiceBuilder) (*Router, error) { + e := &Router{ + cfg: cfg, + services: services, + } + e.init() + return e, nil +} + +func (e *Router) init() { + e.router = mux.NewRouter() + // Root path + e.router.HandleFunc("/", e.root).Methods("POST") + + // Web handlers + e.router.HandleFunc("/v1/web/not-started", e.notStartedHandlerWeb).Methods("POST") + e.router.HandleFunc("/v1/web/start", e.startSessionHandlerWeb).Methods("POST") + e.router.HandleFunc("/v1/web/i", e.pushMessagesHandlerWeb).Methods("POST") + + // iOS handlers + e.router.HandleFunc("/v1/ios/start", e.startSessionHandlerIOS).Methods("POST") + e.router.HandleFunc("/v1/ios/i", e.pushMessagesHandlerIOS).Methods("POST") + e.router.HandleFunc("/v1/ios/late", e.pushLateMessagesHandlerIOS).Methods("POST") + e.router.HandleFunc("/v1/ios/images", e.imagesUploadHandlerIOS).Methods("POST") + + // CORS middleware + e.router.Use(e.corsMiddleware) +} + +func (e *Router) root(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) +} + +func (e *Router) corsMiddleware(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Prepare headers for preflight requests + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Methods", "POST") + w.Header().Set("Access-Control-Allow-Headers", "Content-Type,Authorization") + if r.Method == http.MethodOptions { + w.Header().Set("Cache-Control", "max-age=86400") + w.WriteHeader(http.StatusOK) + return + } + log.Printf("Request: %v - %v ", r.Method, r.URL.Path) + + // Serve request + next.ServeHTTP(w, r) + }) +} + +func (e *Router) GetHandler() http.Handler { + return e.router +} diff --git a/backend/services/http/server.go b/backend/services/http/server.go new file mode 100644 index 000000000..2b6056c20 --- /dev/null +++ b/backend/services/http/server.go @@ -0,0 +1,46 @@ +package main + +import ( + "context" + "errors" + "fmt" + "golang.org/x/net/http2" + "log" + "net/http" + "time" +) + +type Server struct { + server *http.Server +} + +func NewServer(handler http.Handler, host, port string, timeout time.Duration) (*Server, error) { + switch { + case port == "": + return nil, errors.New("empty server port") + case handler == nil: + return nil, errors.New("empty handler") + case timeout < 1: + return nil, fmt.Errorf("invalid timeout %d", timeout) + } + server := &http.Server{ + Addr: fmt.Sprintf("%s:%s", host, port), + Handler: handler, + ReadTimeout: timeout, + WriteTimeout: timeout, + } + if err := http2.ConfigureServer(server, nil); err != nil { + log.Printf("can't configure http2 server: %s", err) + } + return &Server{ + server: server, + }, nil +} + +func (s *Server) Start() error { + return s.server.ListenAndServe() +} + +func (s *Server) Stop() { + s.server.Shutdown(context.Background()) +} diff --git a/backend/services/http/service.go b/backend/services/http/service.go new file mode 100644 index 000000000..d7eda7720 --- /dev/null +++ b/backend/services/http/service.go @@ -0,0 +1,36 @@ +package main + +import ( + "openreplay/backend/pkg/db/cache" + "openreplay/backend/pkg/flakeid" + "openreplay/backend/pkg/queue/types" + "openreplay/backend/pkg/storage" + "openreplay/backend/pkg/token" + "openreplay/backend/pkg/url/assets" + "openreplay/backend/services/http/geoip" + "openreplay/backend/services/http/uaparser" +) + +type ServiceBuilder struct { + pgconn *cache.PGCache + producer types.Producer + rewriter *assets.Rewriter + flaker *flakeid.Flaker + uaParser *uaparser.UAParser + geoIP *geoip.GeoIP + tokenizer *token.Tokenizer + s3 *storage.S3 +} + +func NewServiceBuilder(cfg *config, producer types.Producer, pgconn *cache.PGCache) *ServiceBuilder { + return &ServiceBuilder{ + pgconn: pgconn, + producer: producer, + rewriter: assets.NewRewriter(cfg.AssetsOrigin), + s3: storage.NewS3(cfg.AWSRegion, cfg.S3BucketIOSImages), + tokenizer: token.NewTokenizer(cfg.TokenSecret), + uaParser: uaparser.NewUAParser(cfg.UAParserFile), + geoIP: geoip.NewGeoIP(cfg.MaxMinDBFile), + flaker: flakeid.NewFlaker(cfg.WorkerID), + } +} From f01ef3ea03d0c72cc1ff5398f9703d2d7cab568b Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Mon, 2 May 2022 14:47:13 +0200 Subject: [PATCH 030/260] Made a correct project structure for http service --- backend/{services => cmd}/http/README.md | 0 backend/{services => cmd}/http/main.go | 9 +++++---- backend/{services => internal}/http/assets.go | 2 +- backend/{services => internal}/http/config.go | 2 +- backend/{services => internal}/http/geoip/geoip.go | 0 backend/{services => internal}/http/geoip/http.go | 0 backend/{services => internal}/http/handlers-ios.go | 2 +- backend/{services => internal}/http/handlers-web.go | 2 +- backend/{services => internal}/http/handlers.go | 2 +- backend/{services => internal}/http/ios-device.go | 2 +- backend/{services => internal}/http/model.go | 2 +- backend/{services => internal}/http/response.go | 2 +- backend/{services => internal}/http/router.go | 2 +- backend/{services => internal}/http/server.go | 2 +- backend/{services => internal}/http/service.go | 6 +++--- backend/{services => internal}/http/uaparser/http.go | 0 backend/{services => internal}/http/uaparser/uaparser.go | 0 backend/{services => internal}/http/uuid.go | 2 +- 18 files changed, 19 insertions(+), 18 deletions(-) rename backend/{services => cmd}/http/README.md (100%) rename backend/{services => cmd}/http/main.go (81%) rename backend/{services => internal}/http/assets.go (98%) rename backend/{services => internal}/http/config.go (99%) rename backend/{services => internal}/http/geoip/geoip.go (100%) rename backend/{services => internal}/http/geoip/http.go (100%) rename backend/{services => internal}/http/handlers-ios.go (99%) rename backend/{services => internal}/http/handlers-web.go (99%) rename backend/{services => internal}/http/handlers.go (98%) rename backend/{services => internal}/http/ios-device.go (99%) rename backend/{services => internal}/http/model.go (98%) rename backend/{services => internal}/http/response.go (97%) rename backend/{services => internal}/http/router.go (99%) rename backend/{services => internal}/http/server.go (98%) rename backend/{services => internal}/http/service.go (90%) rename backend/{services => internal}/http/uaparser/http.go (100%) rename backend/{services => internal}/http/uaparser/uaparser.go (100%) rename backend/{services => internal}/http/uuid.go (93%) diff --git a/backend/services/http/README.md b/backend/cmd/http/README.md similarity index 100% rename from backend/services/http/README.md rename to backend/cmd/http/README.md diff --git a/backend/services/http/main.go b/backend/cmd/http/main.go similarity index 81% rename from backend/services/http/main.go rename to backend/cmd/http/main.go index d0e97d137..a7c1a4498 100644 --- a/backend/services/http/main.go +++ b/backend/cmd/http/main.go @@ -2,6 +2,7 @@ package main import ( "log" + "openreplay/backend/internal/http" "openreplay/backend/pkg/db/cache" "openreplay/backend/pkg/db/postgres" "openreplay/backend/pkg/pprof" @@ -16,7 +17,7 @@ func main() { pprof.StartProfilingServer() // Load configuration - cfg := NewConfig() + cfg := http.NewConfig() // Connect to queue producer := queue.NewProducer() @@ -27,16 +28,16 @@ func main() { defer dbConn.Close() // Build all services - services := NewServiceBuilder(cfg, producer, dbConn) + services := http.NewServiceBuilder(cfg, producer, dbConn) // Init server's routes - router, err := NewRouter(cfg, services) + router, err := http.NewRouter(cfg, services) if err != nil { log.Fatalf("failed while creating engine: %s", err) } // Init server - server, err := NewServer(router.GetHandler(), cfg.HTTPHost, cfg.HTTPPort, cfg.HTTPTimeout) + server, err := http.NewServer(router.GetHandler(), cfg.HTTPHost, cfg.HTTPPort, cfg.HTTPTimeout) if err != nil { log.Fatalf("failed while creating server: %s", err) } diff --git a/backend/services/http/assets.go b/backend/internal/http/assets.go similarity index 98% rename from backend/services/http/assets.go rename to backend/internal/http/assets.go index 0948984b0..f77c911f0 100644 --- a/backend/services/http/assets.go +++ b/backend/internal/http/assets.go @@ -1,4 +1,4 @@ -package main +package http import ( "openreplay/backend/pkg/messages" diff --git a/backend/services/http/config.go b/backend/internal/http/config.go similarity index 99% rename from backend/services/http/config.go rename to backend/internal/http/config.go index 4b29afb9d..56ca62067 100644 --- a/backend/services/http/config.go +++ b/backend/internal/http/config.go @@ -1,4 +1,4 @@ -package main +package http import ( "openreplay/backend/pkg/env" diff --git a/backend/services/http/geoip/geoip.go b/backend/internal/http/geoip/geoip.go similarity index 100% rename from backend/services/http/geoip/geoip.go rename to backend/internal/http/geoip/geoip.go diff --git a/backend/services/http/geoip/http.go b/backend/internal/http/geoip/http.go similarity index 100% rename from backend/services/http/geoip/http.go rename to backend/internal/http/geoip/http.go diff --git a/backend/services/http/handlers-ios.go b/backend/internal/http/handlers-ios.go similarity index 99% rename from backend/services/http/handlers-ios.go rename to backend/internal/http/handlers-ios.go index 4591a7d72..e92973f5f 100644 --- a/backend/services/http/handlers-ios.go +++ b/backend/internal/http/handlers-ios.go @@ -1,4 +1,4 @@ -package main +package http import ( "encoding/json" diff --git a/backend/services/http/handlers-web.go b/backend/internal/http/handlers-web.go similarity index 99% rename from backend/services/http/handlers-web.go rename to backend/internal/http/handlers-web.go index e9fc135b0..38ca89fb2 100644 --- a/backend/services/http/handlers-web.go +++ b/backend/internal/http/handlers-web.go @@ -1,4 +1,4 @@ -package main +package http import ( "bytes" diff --git a/backend/services/http/handlers.go b/backend/internal/http/handlers.go similarity index 98% rename from backend/services/http/handlers.go rename to backend/internal/http/handlers.go index 8f8979a4c..1854786fc 100644 --- a/backend/services/http/handlers.go +++ b/backend/internal/http/handlers.go @@ -1,4 +1,4 @@ -package main +package http import ( "io" diff --git a/backend/services/http/ios-device.go b/backend/internal/http/ios-device.go similarity index 99% rename from backend/services/http/ios-device.go rename to backend/internal/http/ios-device.go index 6a09e5e07..b5156d6dc 100644 --- a/backend/services/http/ios-device.go +++ b/backend/internal/http/ios-device.go @@ -1,4 +1,4 @@ -package main +package http import ( "strings" diff --git a/backend/services/http/model.go b/backend/internal/http/model.go similarity index 98% rename from backend/services/http/model.go rename to backend/internal/http/model.go index 5a7dd28bc..969bafe9c 100644 --- a/backend/services/http/model.go +++ b/backend/internal/http/model.go @@ -1,4 +1,4 @@ -package main +package http type startSessionRequest struct { Token string `json:"token"` diff --git a/backend/services/http/response.go b/backend/internal/http/response.go similarity index 97% rename from backend/services/http/response.go rename to backend/internal/http/response.go index 11d9b328d..2a3f14bea 100644 --- a/backend/services/http/response.go +++ b/backend/internal/http/response.go @@ -1,4 +1,4 @@ -package main +package http import ( "encoding/json" diff --git a/backend/services/http/router.go b/backend/internal/http/router.go similarity index 99% rename from backend/services/http/router.go rename to backend/internal/http/router.go index af624e32c..2fe1433a8 100644 --- a/backend/services/http/router.go +++ b/backend/internal/http/router.go @@ -1,4 +1,4 @@ -package main +package http import ( "github.com/gorilla/mux" diff --git a/backend/services/http/server.go b/backend/internal/http/server.go similarity index 98% rename from backend/services/http/server.go rename to backend/internal/http/server.go index 2b6056c20..ea7b08841 100644 --- a/backend/services/http/server.go +++ b/backend/internal/http/server.go @@ -1,4 +1,4 @@ -package main +package http import ( "context" diff --git a/backend/services/http/service.go b/backend/internal/http/service.go similarity index 90% rename from backend/services/http/service.go rename to backend/internal/http/service.go index d7eda7720..2bf46315b 100644 --- a/backend/services/http/service.go +++ b/backend/internal/http/service.go @@ -1,14 +1,14 @@ -package main +package http import ( + "openreplay/backend/internal/http/geoip" + "openreplay/backend/internal/http/uaparser" "openreplay/backend/pkg/db/cache" "openreplay/backend/pkg/flakeid" "openreplay/backend/pkg/queue/types" "openreplay/backend/pkg/storage" "openreplay/backend/pkg/token" "openreplay/backend/pkg/url/assets" - "openreplay/backend/services/http/geoip" - "openreplay/backend/services/http/uaparser" ) type ServiceBuilder struct { diff --git a/backend/services/http/uaparser/http.go b/backend/internal/http/uaparser/http.go similarity index 100% rename from backend/services/http/uaparser/http.go rename to backend/internal/http/uaparser/http.go diff --git a/backend/services/http/uaparser/uaparser.go b/backend/internal/http/uaparser/uaparser.go similarity index 100% rename from backend/services/http/uaparser/uaparser.go rename to backend/internal/http/uaparser/uaparser.go diff --git a/backend/services/http/uuid.go b/backend/internal/http/uuid.go similarity index 93% rename from backend/services/http/uuid.go rename to backend/internal/http/uuid.go index 87704d740..6ce1611a9 100644 --- a/backend/services/http/uuid.go +++ b/backend/internal/http/uuid.go @@ -1,4 +1,4 @@ -package main +package http import ( "github.com/google/uuid" From c347198fc170b1098030243d77ce5d31007c245e Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Mon, 2 May 2022 15:05:45 +0200 Subject: [PATCH 031/260] Moved http handlers to a separate dir --- backend/cmd/http/main.go | 6 +- backend/internal/{http => config}/config.go | 10 +-- backend/internal/http/model.go | 6 +- backend/internal/http/response.go | 6 +- backend/internal/http/service.go | 35 +++++----- backend/internal/{http => router}/assets.go | 8 +-- .../internal/{http => router}/handlers-ios.go | 62 ++++++++--------- .../internal/{http => router}/handlers-web.go | 66 ++++++++++--------- backend/internal/{http => router}/handlers.go | 12 ++-- backend/internal/{http => router}/router.go | 10 +-- backend/internal/{http => uuid}/uuid.go | 4 +- 11 files changed, 117 insertions(+), 108 deletions(-) rename backend/internal/{http => config}/config.go (91%) rename backend/internal/{http => router}/assets.go (82%) rename backend/internal/{http => router}/handlers-ios.go (63%) rename backend/internal/{http => router}/handlers-web.go (65%) rename backend/internal/{http => router}/handlers.go (68%) rename backend/internal/{http => router}/router.go (87%) rename backend/internal/{http => uuid}/uuid.go (76%) diff --git a/backend/cmd/http/main.go b/backend/cmd/http/main.go index a7c1a4498..fd6dbd453 100644 --- a/backend/cmd/http/main.go +++ b/backend/cmd/http/main.go @@ -2,7 +2,9 @@ package main import ( "log" + "openreplay/backend/internal/config" "openreplay/backend/internal/http" + "openreplay/backend/internal/router" "openreplay/backend/pkg/db/cache" "openreplay/backend/pkg/db/postgres" "openreplay/backend/pkg/pprof" @@ -17,7 +19,7 @@ func main() { pprof.StartProfilingServer() // Load configuration - cfg := http.NewConfig() + cfg := config.New() // Connect to queue producer := queue.NewProducer() @@ -31,7 +33,7 @@ func main() { services := http.NewServiceBuilder(cfg, producer, dbConn) // Init server's routes - router, err := http.NewRouter(cfg, services) + router, err := router.NewRouter(cfg, services) if err != nil { log.Fatalf("failed while creating engine: %s", err) } diff --git a/backend/internal/http/config.go b/backend/internal/config/config.go similarity index 91% rename from backend/internal/http/config.go rename to backend/internal/config/config.go index 56ca62067..45f957d1c 100644 --- a/backend/internal/http/config.go +++ b/backend/internal/config/config.go @@ -1,11 +1,11 @@ -package http +package config import ( "openreplay/backend/pkg/env" "time" ) -type config struct { +type Config struct { HTTPHost string HTTPPort string HTTPTimeout time.Duration @@ -25,9 +25,9 @@ type config struct { WorkerID uint16 } -func NewConfig() *config { - return &config{ - HTTPHost: "", +func New() *Config { + return &Config{ + HTTPHost: "", // empty by default HTTPPort: env.String("HTTP_PORT"), HTTPTimeout: time.Second * 60, TopicRawWeb: env.String("TOPIC_RAW_WEB"), diff --git a/backend/internal/http/model.go b/backend/internal/http/model.go index 969bafe9c..3fe4abd3d 100644 --- a/backend/internal/http/model.go +++ b/backend/internal/http/model.go @@ -1,6 +1,6 @@ package http -type startSessionRequest struct { +type StartSessionRequest struct { Token string `json:"token"` UserUUID *string `json:"userUUID"` RevID string `json:"revID"` @@ -14,7 +14,7 @@ type startSessionRequest struct { UserID string `json:"userID"` } -type startSessionResponse struct { +type StartSessionResponse struct { Timestamp int64 `json:"timestamp"` Delay int64 `json:"delay"` Token string `json:"token"` @@ -23,7 +23,7 @@ type startSessionResponse struct { BeaconSizeLimit int64 `json:"beaconSizeLimit"` } -type notStartedRequest struct { +type NotStartedRequest struct { ProjectKey *string `json:"projectKey"` TrackerVersion string `json:"trackerVersion"` DoNotTrack bool `json:"DoNotTrack"` diff --git a/backend/internal/http/response.go b/backend/internal/http/response.go index 2a3f14bea..1b87c33b9 100644 --- a/backend/internal/http/response.go +++ b/backend/internal/http/response.go @@ -6,7 +6,7 @@ import ( "net/http" ) -func responseWithJSON(w http.ResponseWriter, res interface{}) { +func ResponseWithJSON(w http.ResponseWriter, res interface{}) { body, err := json.Marshal(res) if err != nil { log.Println(err) @@ -15,10 +15,10 @@ func responseWithJSON(w http.ResponseWriter, res interface{}) { w.Write(body) } -func responseWithError(w http.ResponseWriter, code int, err error) { +func ResponseWithError(w http.ResponseWriter, code int, err error) { type response struct { Error string `json:"error"` } w.WriteHeader(code) - responseWithJSON(w, &response{err.Error()}) + ResponseWithJSON(w, &response{err.Error()}) } diff --git a/backend/internal/http/service.go b/backend/internal/http/service.go index 2bf46315b..8f553db32 100644 --- a/backend/internal/http/service.go +++ b/backend/internal/http/service.go @@ -1,6 +1,7 @@ package http import ( + "openreplay/backend/internal/config" "openreplay/backend/internal/http/geoip" "openreplay/backend/internal/http/uaparser" "openreplay/backend/pkg/db/cache" @@ -12,25 +13,25 @@ import ( ) type ServiceBuilder struct { - pgconn *cache.PGCache - producer types.Producer - rewriter *assets.Rewriter - flaker *flakeid.Flaker - uaParser *uaparser.UAParser - geoIP *geoip.GeoIP - tokenizer *token.Tokenizer - s3 *storage.S3 + Pgconn *cache.PGCache + Producer types.Producer + Rewriter *assets.Rewriter + Flaker *flakeid.Flaker + UaParser *uaparser.UAParser + GeoIP *geoip.GeoIP + Tokenizer *token.Tokenizer + S3 *storage.S3 } -func NewServiceBuilder(cfg *config, producer types.Producer, pgconn *cache.PGCache) *ServiceBuilder { +func NewServiceBuilder(cfg *config.Config, producer types.Producer, pgconn *cache.PGCache) *ServiceBuilder { return &ServiceBuilder{ - pgconn: pgconn, - producer: producer, - rewriter: assets.NewRewriter(cfg.AssetsOrigin), - s3: storage.NewS3(cfg.AWSRegion, cfg.S3BucketIOSImages), - tokenizer: token.NewTokenizer(cfg.TokenSecret), - uaParser: uaparser.NewUAParser(cfg.UAParserFile), - geoIP: geoip.NewGeoIP(cfg.MaxMinDBFile), - flaker: flakeid.NewFlaker(cfg.WorkerID), + Pgconn: pgconn, + Producer: producer, + Rewriter: assets.NewRewriter(cfg.AssetsOrigin), + S3: storage.NewS3(cfg.AWSRegion, cfg.S3BucketIOSImages), + Tokenizer: token.NewTokenizer(cfg.TokenSecret), + UaParser: uaparser.NewUAParser(cfg.UAParserFile), + GeoIP: geoip.NewGeoIP(cfg.MaxMinDBFile), + Flaker: flakeid.NewFlaker(cfg.WorkerID), } } diff --git a/backend/internal/http/assets.go b/backend/internal/router/assets.go similarity index 82% rename from backend/internal/http/assets.go rename to backend/internal/router/assets.go index f77c911f0..42347f224 100644 --- a/backend/internal/http/assets.go +++ b/backend/internal/router/assets.go @@ -1,4 +1,4 @@ -package http +package router import ( "openreplay/backend/pkg/messages" @@ -7,7 +7,7 @@ import ( func (e *Router) sendAssetForCache(sessionID uint64, baseURL string, relativeURL string) { if fullURL, cacheable := assets.GetFullCachableURL(baseURL, relativeURL); cacheable { - e.services.producer.Produce(e.cfg.TopicCache, sessionID, messages.Encode(&messages.AssetCache{ + e.services.Producer.Produce(e.cfg.TopicCache, sessionID, messages.Encode(&messages.AssetCache{ URL: fullURL, })) } @@ -22,7 +22,7 @@ func (e *Router) sendAssetsForCacheFromCSS(sessionID uint64, baseURL string, css func (e *Router) handleURL(sessionID uint64, baseURL string, url string) string { if e.cfg.CacheAssets { e.sendAssetForCache(sessionID, baseURL, url) - return e.services.rewriter.RewriteURL(sessionID, baseURL, url) + return e.services.Rewriter.RewriteURL(sessionID, baseURL, url) } return assets.ResolveURL(baseURL, url) } @@ -30,7 +30,7 @@ func (e *Router) handleURL(sessionID uint64, baseURL string, url string) string func (e *Router) handleCSS(sessionID uint64, baseURL string, css string) string { if e.cfg.CacheAssets { e.sendAssetsForCacheFromCSS(sessionID, baseURL, css) - return e.services.rewriter.RewriteCSS(sessionID, baseURL, css) + return e.services.Rewriter.RewriteCSS(sessionID, baseURL, css) } return assets.ResolveCSS(baseURL, css) } diff --git a/backend/internal/http/handlers-ios.go b/backend/internal/router/handlers-ios.go similarity index 63% rename from backend/internal/http/handlers-ios.go rename to backend/internal/router/handlers-ios.go index e92973f5f..e1853f555 100644 --- a/backend/internal/http/handlers-ios.go +++ b/backend/internal/router/handlers-ios.go @@ -1,4 +1,4 @@ -package http +package router import ( "encoding/json" @@ -6,6 +6,8 @@ import ( "log" "math/rand" "net/http" + http2 "openreplay/backend/internal/http" + "openreplay/backend/internal/uuid" "strconv" "time" @@ -39,52 +41,52 @@ func (e *Router) startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) body := http.MaxBytesReader(w, r.Body, e.cfg.JsonSizeLimit) defer body.Close() if err := json.NewDecoder(body).Decode(req); err != nil { - responseWithError(w, http.StatusBadRequest, err) + http2.ResponseWithError(w, http.StatusBadRequest, err) return } if req.ProjectKey == nil { - responseWithError(w, http.StatusForbidden, errors.New("ProjectKey value required")) + http2.ResponseWithError(w, http.StatusForbidden, errors.New("ProjectKey value required")) return } - p, err := e.services.pgconn.GetProjectByKey(*req.ProjectKey) + p, err := e.services.Pgconn.GetProjectByKey(*req.ProjectKey) if err != nil { if postgres.IsNoRowsErr(err) { - responseWithError(w, http.StatusNotFound, errors.New("Project doesn't exist or is not active")) + http2.ResponseWithError(w, http.StatusNotFound, errors.New("Project doesn't exist or is not active")) } else { - responseWithError(w, http.StatusInternalServerError, err) // TODO: send error here only on staging + http2.ResponseWithError(w, http.StatusInternalServerError, err) // TODO: send error here only on staging } return } - userUUID := getUUID(req.UserUUID) - tokenData, err := e.services.tokenizer.Parse(req.Token) + userUUID := uuid.GetUUID(req.UserUUID) + tokenData, err := e.services.Tokenizer.Parse(req.Token) if err != nil { // Starting the new one dice := byte(rand.Intn(100)) // [0, 100) if dice >= p.SampleRate { - responseWithError(w, http.StatusForbidden, errors.New("cancel")) + http2.ResponseWithError(w, http.StatusForbidden, errors.New("cancel")) return } - ua := e.services.uaParser.ParseFromHTTPRequest(r) + ua := e.services.UaParser.ParseFromHTTPRequest(r) if ua == nil { - responseWithError(w, http.StatusForbidden, errors.New("browser not recognized")) + http2.ResponseWithError(w, http.StatusForbidden, errors.New("browser not recognized")) return } - sessionID, err := e.services.flaker.Compose(uint64(startTime.UnixMilli())) + sessionID, err := e.services.Flaker.Compose(uint64(startTime.UnixMilli())) if err != nil { - responseWithError(w, http.StatusInternalServerError, err) + http2.ResponseWithError(w, http.StatusInternalServerError, err) return } // TODO: if EXPIRED => send message for two sessions association expTime := startTime.Add(time.Duration(p.MaxSessionDuration) * time.Millisecond) tokenData = &token.TokenData{sessionID, expTime.UnixMilli()} - country := e.services.geoIP.ExtractISOCodeFromHTTPRequest(r) + country := e.services.GeoIP.ExtractISOCodeFromHTTPRequest(r) // The difference with web is mostly here: - e.services.producer.Produce(e.cfg.TopicRawIOS, tokenData.ID, Encode(&IOSSessionStart{ + e.services.Producer.Produce(e.cfg.TopicRawIOS, tokenData.ID, Encode(&IOSSessionStart{ Timestamp: req.Timestamp, ProjectID: uint64(p.ProjectID), TrackerVersion: req.TrackerVersion, @@ -92,14 +94,14 @@ func (e *Router) startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) UserUUID: userUUID, UserOS: "IOS", UserOSVersion: req.UserOSVersion, - UserDevice: MapIOSDevice(req.UserDevice), - UserDeviceType: GetIOSDeviceType(req.UserDevice), + UserDevice: http2.MapIOSDevice(req.UserDevice), + UserDeviceType: http2.GetIOSDeviceType(req.UserDevice), UserCountry: country, })) } - responseWithJSON(w, &response{ - Token: e.services.tokenizer.Compose(*tokenData), + http2.ResponseWithJSON(w, &response{ + Token: e.services.Tokenizer.Compose(*tokenData), UserUUID: userUUID, SessionID: strconv.FormatUint(tokenData.ID, 10), BeaconSizeLimit: e.cfg.BeaconSizeLimit, @@ -107,18 +109,18 @@ func (e *Router) startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) } func (e *Router) pushMessagesHandlerIOS(w http.ResponseWriter, r *http.Request) { - sessionData, err := e.services.tokenizer.ParseFromHTTPRequest(r) + sessionData, err := e.services.Tokenizer.ParseFromHTTPRequest(r) if err != nil { - responseWithError(w, http.StatusUnauthorized, err) + http2.ResponseWithError(w, http.StatusUnauthorized, err) return } e.pushMessages(w, r, sessionData.ID, e.cfg.TopicRawIOS) } func (e *Router) pushLateMessagesHandlerIOS(w http.ResponseWriter, r *http.Request) { - sessionData, err := e.services.tokenizer.ParseFromHTTPRequest(r) + sessionData, err := e.services.Tokenizer.ParseFromHTTPRequest(r) if err != nil && err != token.EXPIRED { - responseWithError(w, http.StatusUnauthorized, err) + http2.ResponseWithError(w, http.StatusUnauthorized, err) return } // Check timestamps here? @@ -128,9 +130,9 @@ func (e *Router) pushLateMessagesHandlerIOS(w http.ResponseWriter, r *http.Reque func (e *Router) imagesUploadHandlerIOS(w http.ResponseWriter, r *http.Request) { log.Printf("recieved imagerequest") - sessionData, err := e.services.tokenizer.ParseFromHTTPRequest(r) + sessionData, err := e.services.Tokenizer.ParseFromHTTPRequest(r) if err != nil { // Should accept expired token? - responseWithError(w, http.StatusUnauthorized, err) + http2.ResponseWithError(w, http.StatusUnauthorized, err) return } @@ -138,18 +140,18 @@ func (e *Router) imagesUploadHandlerIOS(w http.ResponseWriter, r *http.Request) defer r.Body.Close() err = r.ParseMultipartForm(1e6) // ~1Mb if err == http.ErrNotMultipart || err == http.ErrMissingBoundary { - responseWithError(w, http.StatusUnsupportedMediaType, err) + http2.ResponseWithError(w, http.StatusUnsupportedMediaType, err) // } else if err == multipart.ErrMessageTooLarge // if non-files part exceeds 10 MB } else if err != nil { - responseWithError(w, http.StatusInternalServerError, err) // TODO: send error here only on staging + http2.ResponseWithError(w, http.StatusInternalServerError, err) // TODO: send error here only on staging } if r.MultipartForm == nil { - responseWithError(w, http.StatusInternalServerError, errors.New("Multipart not parsed")) + http2.ResponseWithError(w, http.StatusInternalServerError, errors.New("Multipart not parsed")) } if len(r.MultipartForm.Value["projectKey"]) == 0 { - responseWithError(w, http.StatusBadRequest, errors.New("projectKey parameter missing")) // status for missing/wrong parameter? + http2.ResponseWithError(w, http.StatusBadRequest, errors.New("projectKey parameter missing")) // status for missing/wrong parameter? return } @@ -164,7 +166,7 @@ func (e *Router) imagesUploadHandlerIOS(w http.ResponseWriter, r *http.Request) key := prefix + fileHeader.Filename log.Printf("Uploading image... %v", key) go func() { //TODO: mime type from header - if err := e.services.s3.Upload(file, key, "image/jpeg", false); err != nil { + if err := e.services.S3.Upload(file, key, "image/jpeg", false); err != nil { log.Printf("Upload ios screen error. %v", err) } }() diff --git a/backend/internal/http/handlers-web.go b/backend/internal/router/handlers-web.go similarity index 65% rename from backend/internal/http/handlers-web.go rename to backend/internal/router/handlers-web.go index 38ca89fb2..7bf3b6e7f 100644 --- a/backend/internal/http/handlers-web.go +++ b/backend/internal/router/handlers-web.go @@ -1,4 +1,4 @@ -package http +package router import ( "bytes" @@ -7,6 +7,8 @@ import ( "log" "math/rand" "net/http" + http2 "openreplay/backend/internal/http" + "openreplay/backend/internal/uuid" "strconv" "time" @@ -20,58 +22,58 @@ func (e *Router) startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) // Check request body if r.Body == nil { - responseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) + http2.ResponseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) } body := http.MaxBytesReader(w, r.Body, e.cfg.JsonSizeLimit) defer body.Close() // Parse request body - req := &startSessionRequest{} + req := &http2.StartSessionRequest{} if err := json.NewDecoder(body).Decode(req); err != nil { - responseWithError(w, http.StatusBadRequest, err) + http2.ResponseWithError(w, http.StatusBadRequest, err) return } // Handler's logic if req.ProjectKey == nil { - responseWithError(w, http.StatusForbidden, errors.New("ProjectKey value required")) + http2.ResponseWithError(w, http.StatusForbidden, errors.New("ProjectKey value required")) return } - p, err := e.services.pgconn.GetProjectByKey(*req.ProjectKey) + p, err := e.services.Pgconn.GetProjectByKey(*req.ProjectKey) if err != nil { if postgres.IsNoRowsErr(err) { - responseWithError(w, http.StatusNotFound, errors.New("Project doesn't exist or capture limit has been reached")) + http2.ResponseWithError(w, http.StatusNotFound, errors.New("Project doesn't exist or capture limit has been reached")) } else { - responseWithError(w, http.StatusInternalServerError, err) // TODO: send error here only on staging + http2.ResponseWithError(w, http.StatusInternalServerError, err) // TODO: send error here only on staging } return } - userUUID := getUUID(req.UserUUID) - tokenData, err := e.services.tokenizer.Parse(req.Token) + userUUID := uuid.GetUUID(req.UserUUID) + tokenData, err := e.services.Tokenizer.Parse(req.Token) if err != nil || req.Reset { // Starting the new one dice := byte(rand.Intn(100)) // [0, 100) if dice >= p.SampleRate { - responseWithError(w, http.StatusForbidden, errors.New("cancel")) + http2.ResponseWithError(w, http.StatusForbidden, errors.New("cancel")) return } - ua := e.services.uaParser.ParseFromHTTPRequest(r) + ua := e.services.UaParser.ParseFromHTTPRequest(r) if ua == nil { - responseWithError(w, http.StatusForbidden, errors.New("browser not recognized")) + http2.ResponseWithError(w, http.StatusForbidden, errors.New("browser not recognized")) return } - sessionID, err := e.services.flaker.Compose(uint64(startTime.UnixNano() / 1e6)) + sessionID, err := e.services.Flaker.Compose(uint64(startTime.UnixNano() / 1e6)) if err != nil { - responseWithError(w, http.StatusInternalServerError, err) + http2.ResponseWithError(w, http.StatusInternalServerError, err) return } // TODO: if EXPIRED => send message for two sessions association expTime := startTime.Add(time.Duration(p.MaxSessionDuration) * time.Millisecond) tokenData = &token.TokenData{ID: sessionID, ExpTime: expTime.UnixNano() / 1e6} - e.services.producer.Produce(e.cfg.TopicRawWeb, tokenData.ID, Encode(&SessionStart{ + e.services.Producer.Produce(e.cfg.TopicRawWeb, tokenData.ID, Encode(&SessionStart{ Timestamp: req.Timestamp, ProjectID: uint64(p.ProjectID), TrackerVersion: req.TrackerVersion, @@ -84,15 +86,15 @@ func (e *Router) startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) UserBrowserVersion: ua.BrowserVersion, UserDevice: ua.Device, UserDeviceType: ua.DeviceType, - UserCountry: e.services.geoIP.ExtractISOCodeFromHTTPRequest(r), + UserCountry: e.services.GeoIP.ExtractISOCodeFromHTTPRequest(r), UserDeviceMemorySize: req.DeviceMemory, UserDeviceHeapSize: req.JsHeapSizeLimit, UserID: req.UserID, })) } - responseWithJSON(w, &startSessionResponse{ - Token: e.services.tokenizer.Compose(*tokenData), + http2.ResponseWithJSON(w, &http2.StartSessionResponse{ + Token: e.services.Tokenizer.Compose(*tokenData), UserUUID: userUUID, SessionID: strconv.FormatUint(tokenData.ID, 10), BeaconSizeLimit: e.cfg.BeaconSizeLimit, @@ -101,15 +103,15 @@ func (e *Router) startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) func (e *Router) pushMessagesHandlerWeb(w http.ResponseWriter, r *http.Request) { // Check authorization - sessionData, err := e.services.tokenizer.ParseFromHTTPRequest(r) + sessionData, err := e.services.Tokenizer.ParseFromHTTPRequest(r) if err != nil { - responseWithError(w, http.StatusUnauthorized, err) + http2.ResponseWithError(w, http.StatusUnauthorized, err) return } // Check request body if r.Body == nil { - responseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) + http2.ResponseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) } body := http.MaxBytesReader(w, r.Body, e.cfg.BeaconSizeLimit) defer body.Close() @@ -148,12 +150,12 @@ func (e *Router) pushMessagesHandlerWeb(w http.ResponseWriter, r *http.Request) handledMessages.Write(msg.Encode()) }) if err != nil { - responseWithError(w, http.StatusForbidden, err) + http2.ResponseWithError(w, http.StatusForbidden, err) return } // Send processed messages to queue as array of bytes - err = e.services.producer.Produce(e.cfg.TopicRawWeb, sessionData.ID, handledMessages.Bytes()) + err = e.services.Producer.Produce(e.cfg.TopicRawWeb, sessionData.ID, handledMessages.Bytes()) if err != nil { log.Printf("can't send processed messages to queue: %s", err) } @@ -164,30 +166,30 @@ func (e *Router) pushMessagesHandlerWeb(w http.ResponseWriter, r *http.Request) func (e *Router) notStartedHandlerWeb(w http.ResponseWriter, r *http.Request) { // Check request body if r.Body == nil { - responseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) + http2.ResponseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) } body := http.MaxBytesReader(w, r.Body, e.cfg.JsonSizeLimit) defer body.Close() // Parse request body - req := ¬StartedRequest{} + req := &http2.NotStartedRequest{} if err := json.NewDecoder(body).Decode(req); err != nil { - responseWithError(w, http.StatusBadRequest, err) + http2.ResponseWithError(w, http.StatusBadRequest, err) return } // Handler's logic if req.ProjectKey == nil { - responseWithError(w, http.StatusForbidden, errors.New("ProjectKey value required")) + http2.ResponseWithError(w, http.StatusForbidden, errors.New("ProjectKey value required")) return } - ua := e.services.uaParser.ParseFromHTTPRequest(r) // TODO?: insert anyway + ua := e.services.UaParser.ParseFromHTTPRequest(r) // TODO?: insert anyway if ua == nil { - responseWithError(w, http.StatusForbidden, errors.New("browser not recognized")) + http2.ResponseWithError(w, http.StatusForbidden, errors.New("browser not recognized")) return } - country := e.services.geoIP.ExtractISOCodeFromHTTPRequest(r) - err := e.services.pgconn.InsertUnstartedSession(postgres.UnstartedSession{ + country := e.services.GeoIP.ExtractISOCodeFromHTTPRequest(r) + err := e.services.Pgconn.InsertUnstartedSession(postgres.UnstartedSession{ ProjectKey: *req.ProjectKey, TrackerVersion: req.TrackerVersion, DoNotTrack: req.DoNotTrack, diff --git a/backend/internal/http/handlers.go b/backend/internal/router/handlers.go similarity index 68% rename from backend/internal/http/handlers.go rename to backend/internal/router/handlers.go index 1854786fc..81a055145 100644 --- a/backend/internal/http/handlers.go +++ b/backend/internal/router/handlers.go @@ -1,12 +1,12 @@ -package http +package router import ( + gzip "github.com/klauspost/pgzip" "io" "io/ioutil" "log" "net/http" - - gzip "github.com/klauspost/pgzip" + http2 "openreplay/backend/internal/http" ) func (e *Router) pushMessages(w http.ResponseWriter, r *http.Request, sessionID uint64, topicName string) { @@ -20,7 +20,7 @@ func (e *Router) pushMessages(w http.ResponseWriter, r *http.Request, sessionID reader, err = gzip.NewReader(body) if err != nil { - responseWithError(w, http.StatusInternalServerError, err) // TODO: stage-dependent responce + http2.ResponseWithError(w, http.StatusInternalServerError, err) // TODO: stage-dependent responce return } log.Println("Gzip reader init", reader) @@ -31,9 +31,9 @@ func (e *Router) pushMessages(w http.ResponseWriter, r *http.Request, sessionID log.Println("Reader after switch:", reader) buf, err := ioutil.ReadAll(reader) if err != nil { - responseWithError(w, http.StatusInternalServerError, err) // TODO: send error here only on staging + http2.ResponseWithError(w, http.StatusInternalServerError, err) // TODO: send error here only on staging return } - e.services.producer.Produce(topicName, sessionID, buf) // What if not able to send? + e.services.Producer.Produce(topicName, sessionID, buf) // What if not able to send? w.WriteHeader(http.StatusOK) } diff --git a/backend/internal/http/router.go b/backend/internal/router/router.go similarity index 87% rename from backend/internal/http/router.go rename to backend/internal/router/router.go index 2fe1433a8..c49bbf161 100644 --- a/backend/internal/http/router.go +++ b/backend/internal/router/router.go @@ -1,18 +1,20 @@ -package http +package router import ( "github.com/gorilla/mux" "log" "net/http" + "openreplay/backend/internal/config" + http2 "openreplay/backend/internal/http" ) type Router struct { router *mux.Router - cfg *config - services *ServiceBuilder + cfg *config.Config + services *http2.ServiceBuilder } -func NewRouter(cfg *config, services *ServiceBuilder) (*Router, error) { +func NewRouter(cfg *config.Config, services *http2.ServiceBuilder) (*Router, error) { e := &Router{ cfg: cfg, services: services, diff --git a/backend/internal/http/uuid.go b/backend/internal/uuid/uuid.go similarity index 76% rename from backend/internal/http/uuid.go rename to backend/internal/uuid/uuid.go index 6ce1611a9..44dd76827 100644 --- a/backend/internal/http/uuid.go +++ b/backend/internal/uuid/uuid.go @@ -1,10 +1,10 @@ -package http +package uuid import ( "github.com/google/uuid" ) -func getUUID(u *string) string { +func GetUUID(u *string) string { if u != nil { _, err := uuid.Parse(*u) if err == nil { From df722761e55b76e69ca63fa4a224a097e973755c Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Mon, 2 May 2022 15:20:10 +0200 Subject: [PATCH 032/260] Moved server to a separate dir --- backend/cmd/http/main.go | 3 ++- backend/internal/{http => server}/server.go | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) rename backend/internal/{http => server}/server.go (87%) diff --git a/backend/cmd/http/main.go b/backend/cmd/http/main.go index fd6dbd453..49507727c 100644 --- a/backend/cmd/http/main.go +++ b/backend/cmd/http/main.go @@ -5,6 +5,7 @@ import ( "openreplay/backend/internal/config" "openreplay/backend/internal/http" "openreplay/backend/internal/router" + "openreplay/backend/internal/server" "openreplay/backend/pkg/db/cache" "openreplay/backend/pkg/db/postgres" "openreplay/backend/pkg/pprof" @@ -39,7 +40,7 @@ func main() { } // Init server - server, err := http.NewServer(router.GetHandler(), cfg.HTTPHost, cfg.HTTPPort, cfg.HTTPTimeout) + server, err := server.New(router.GetHandler(), cfg.HTTPHost, cfg.HTTPPort, cfg.HTTPTimeout) if err != nil { log.Fatalf("failed while creating server: %s", err) } diff --git a/backend/internal/http/server.go b/backend/internal/server/server.go similarity index 87% rename from backend/internal/http/server.go rename to backend/internal/server/server.go index ea7b08841..2670ba537 100644 --- a/backend/internal/http/server.go +++ b/backend/internal/server/server.go @@ -1,4 +1,4 @@ -package http +package server import ( "context" @@ -14,7 +14,7 @@ type Server struct { server *http.Server } -func NewServer(handler http.Handler, host, port string, timeout time.Duration) (*Server, error) { +func New(handler http.Handler, host, port string, timeout time.Duration) (*Server, error) { switch { case port == "": return nil, errors.New("empty server port") From 69cabaecfe593dc3ab3373f9fb461a1f9d160914 Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Mon, 2 May 2022 15:28:51 +0200 Subject: [PATCH 033/260] Moved the rest of the code to separate dirs --- backend/cmd/http/main.go | 4 +- backend/internal/{http => }/geoip/geoip.go | 0 backend/internal/{http => }/geoip/http.go | 0 backend/internal/{http => ios}/ios-device.go | 2 +- backend/internal/router/handlers-ios.go | 36 +++++++++--------- backend/internal/router/handlers-web.go | 37 +++++++++---------- backend/internal/router/handlers.go | 5 +-- backend/internal/{http => router}/model.go | 2 +- backend/internal/{http => router}/response.go | 2 +- backend/internal/router/router.go | 6 +-- .../{http/service.go => services/services.go} | 12 +++--- backend/internal/{http => }/uaparser/http.go | 0 .../internal/{http => }/uaparser/uaparser.go | 0 13 files changed, 52 insertions(+), 54 deletions(-) rename backend/internal/{http => }/geoip/geoip.go (100%) rename backend/internal/{http => }/geoip/http.go (100%) rename backend/internal/{http => ios}/ios-device.go (99%) rename backend/internal/{http => router}/model.go (98%) rename backend/internal/{http => router}/response.go (96%) rename backend/internal/{http/service.go => services/services.go} (76%) rename backend/internal/{http => }/uaparser/http.go (100%) rename backend/internal/{http => }/uaparser/uaparser.go (100%) diff --git a/backend/cmd/http/main.go b/backend/cmd/http/main.go index 49507727c..41f739277 100644 --- a/backend/cmd/http/main.go +++ b/backend/cmd/http/main.go @@ -3,9 +3,9 @@ package main import ( "log" "openreplay/backend/internal/config" - "openreplay/backend/internal/http" "openreplay/backend/internal/router" "openreplay/backend/internal/server" + "openreplay/backend/internal/services" "openreplay/backend/pkg/db/cache" "openreplay/backend/pkg/db/postgres" "openreplay/backend/pkg/pprof" @@ -31,7 +31,7 @@ func main() { defer dbConn.Close() // Build all services - services := http.NewServiceBuilder(cfg, producer, dbConn) + services := services.New(cfg, producer, dbConn) // Init server's routes router, err := router.NewRouter(cfg, services) diff --git a/backend/internal/http/geoip/geoip.go b/backend/internal/geoip/geoip.go similarity index 100% rename from backend/internal/http/geoip/geoip.go rename to backend/internal/geoip/geoip.go diff --git a/backend/internal/http/geoip/http.go b/backend/internal/geoip/http.go similarity index 100% rename from backend/internal/http/geoip/http.go rename to backend/internal/geoip/http.go diff --git a/backend/internal/http/ios-device.go b/backend/internal/ios/ios-device.go similarity index 99% rename from backend/internal/http/ios-device.go rename to backend/internal/ios/ios-device.go index b5156d6dc..8df33035b 100644 --- a/backend/internal/http/ios-device.go +++ b/backend/internal/ios/ios-device.go @@ -1,4 +1,4 @@ -package http +package ios import ( "strings" diff --git a/backend/internal/router/handlers-ios.go b/backend/internal/router/handlers-ios.go index e1853f555..f0b0d977f 100644 --- a/backend/internal/router/handlers-ios.go +++ b/backend/internal/router/handlers-ios.go @@ -6,7 +6,7 @@ import ( "log" "math/rand" "net/http" - http2 "openreplay/backend/internal/http" + "openreplay/backend/internal/ios" "openreplay/backend/internal/uuid" "strconv" "time" @@ -41,21 +41,21 @@ func (e *Router) startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) body := http.MaxBytesReader(w, r.Body, e.cfg.JsonSizeLimit) defer body.Close() if err := json.NewDecoder(body).Decode(req); err != nil { - http2.ResponseWithError(w, http.StatusBadRequest, err) + ResponseWithError(w, http.StatusBadRequest, err) return } if req.ProjectKey == nil { - http2.ResponseWithError(w, http.StatusForbidden, errors.New("ProjectKey value required")) + ResponseWithError(w, http.StatusForbidden, errors.New("ProjectKey value required")) return } p, err := e.services.Pgconn.GetProjectByKey(*req.ProjectKey) if err != nil { if postgres.IsNoRowsErr(err) { - http2.ResponseWithError(w, http.StatusNotFound, errors.New("Project doesn't exist or is not active")) + ResponseWithError(w, http.StatusNotFound, errors.New("Project doesn't exist or is not active")) } else { - http2.ResponseWithError(w, http.StatusInternalServerError, err) // TODO: send error here only on staging + ResponseWithError(w, http.StatusInternalServerError, err) // TODO: send error here only on staging } return } @@ -65,18 +65,18 @@ func (e *Router) startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) if err != nil { // Starting the new one dice := byte(rand.Intn(100)) // [0, 100) if dice >= p.SampleRate { - http2.ResponseWithError(w, http.StatusForbidden, errors.New("cancel")) + ResponseWithError(w, http.StatusForbidden, errors.New("cancel")) return } ua := e.services.UaParser.ParseFromHTTPRequest(r) if ua == nil { - http2.ResponseWithError(w, http.StatusForbidden, errors.New("browser not recognized")) + ResponseWithError(w, http.StatusForbidden, errors.New("browser not recognized")) return } sessionID, err := e.services.Flaker.Compose(uint64(startTime.UnixMilli())) if err != nil { - http2.ResponseWithError(w, http.StatusInternalServerError, err) + ResponseWithError(w, http.StatusInternalServerError, err) return } // TODO: if EXPIRED => send message for two sessions association @@ -94,13 +94,13 @@ func (e *Router) startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) UserUUID: userUUID, UserOS: "IOS", UserOSVersion: req.UserOSVersion, - UserDevice: http2.MapIOSDevice(req.UserDevice), - UserDeviceType: http2.GetIOSDeviceType(req.UserDevice), + UserDevice: ios.MapIOSDevice(req.UserDevice), + UserDeviceType: ios.GetIOSDeviceType(req.UserDevice), UserCountry: country, })) } - http2.ResponseWithJSON(w, &response{ + ResponseWithJSON(w, &response{ Token: e.services.Tokenizer.Compose(*tokenData), UserUUID: userUUID, SessionID: strconv.FormatUint(tokenData.ID, 10), @@ -111,7 +111,7 @@ func (e *Router) startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) func (e *Router) pushMessagesHandlerIOS(w http.ResponseWriter, r *http.Request) { sessionData, err := e.services.Tokenizer.ParseFromHTTPRequest(r) if err != nil { - http2.ResponseWithError(w, http.StatusUnauthorized, err) + ResponseWithError(w, http.StatusUnauthorized, err) return } e.pushMessages(w, r, sessionData.ID, e.cfg.TopicRawIOS) @@ -120,7 +120,7 @@ func (e *Router) pushMessagesHandlerIOS(w http.ResponseWriter, r *http.Request) func (e *Router) pushLateMessagesHandlerIOS(w http.ResponseWriter, r *http.Request) { sessionData, err := e.services.Tokenizer.ParseFromHTTPRequest(r) if err != nil && err != token.EXPIRED { - http2.ResponseWithError(w, http.StatusUnauthorized, err) + ResponseWithError(w, http.StatusUnauthorized, err) return } // Check timestamps here? @@ -132,7 +132,7 @@ func (e *Router) imagesUploadHandlerIOS(w http.ResponseWriter, r *http.Request) sessionData, err := e.services.Tokenizer.ParseFromHTTPRequest(r) if err != nil { // Should accept expired token? - http2.ResponseWithError(w, http.StatusUnauthorized, err) + ResponseWithError(w, http.StatusUnauthorized, err) return } @@ -140,18 +140,18 @@ func (e *Router) imagesUploadHandlerIOS(w http.ResponseWriter, r *http.Request) defer r.Body.Close() err = r.ParseMultipartForm(1e6) // ~1Mb if err == http.ErrNotMultipart || err == http.ErrMissingBoundary { - http2.ResponseWithError(w, http.StatusUnsupportedMediaType, err) + ResponseWithError(w, http.StatusUnsupportedMediaType, err) // } else if err == multipart.ErrMessageTooLarge // if non-files part exceeds 10 MB } else if err != nil { - http2.ResponseWithError(w, http.StatusInternalServerError, err) // TODO: send error here only on staging + ResponseWithError(w, http.StatusInternalServerError, err) // TODO: send error here only on staging } if r.MultipartForm == nil { - http2.ResponseWithError(w, http.StatusInternalServerError, errors.New("Multipart not parsed")) + ResponseWithError(w, http.StatusInternalServerError, errors.New("Multipart not parsed")) } if len(r.MultipartForm.Value["projectKey"]) == 0 { - http2.ResponseWithError(w, http.StatusBadRequest, errors.New("projectKey parameter missing")) // status for missing/wrong parameter? + ResponseWithError(w, http.StatusBadRequest, errors.New("projectKey parameter missing")) // status for missing/wrong parameter? return } diff --git a/backend/internal/router/handlers-web.go b/backend/internal/router/handlers-web.go index 7bf3b6e7f..b0a3a9b94 100644 --- a/backend/internal/router/handlers-web.go +++ b/backend/internal/router/handlers-web.go @@ -7,7 +7,6 @@ import ( "log" "math/rand" "net/http" - http2 "openreplay/backend/internal/http" "openreplay/backend/internal/uuid" "strconv" "time" @@ -22,30 +21,30 @@ func (e *Router) startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) // Check request body if r.Body == nil { - http2.ResponseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) + ResponseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) } body := http.MaxBytesReader(w, r.Body, e.cfg.JsonSizeLimit) defer body.Close() // Parse request body - req := &http2.StartSessionRequest{} + req := &StartSessionRequest{} if err := json.NewDecoder(body).Decode(req); err != nil { - http2.ResponseWithError(w, http.StatusBadRequest, err) + ResponseWithError(w, http.StatusBadRequest, err) return } // Handler's logic if req.ProjectKey == nil { - http2.ResponseWithError(w, http.StatusForbidden, errors.New("ProjectKey value required")) + ResponseWithError(w, http.StatusForbidden, errors.New("ProjectKey value required")) return } p, err := e.services.Pgconn.GetProjectByKey(*req.ProjectKey) if err != nil { if postgres.IsNoRowsErr(err) { - http2.ResponseWithError(w, http.StatusNotFound, errors.New("Project doesn't exist or capture limit has been reached")) + ResponseWithError(w, http.StatusNotFound, errors.New("Project doesn't exist or capture limit has been reached")) } else { - http2.ResponseWithError(w, http.StatusInternalServerError, err) // TODO: send error here only on staging + ResponseWithError(w, http.StatusInternalServerError, err) // TODO: send error here only on staging } return } @@ -55,18 +54,18 @@ func (e *Router) startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) if err != nil || req.Reset { // Starting the new one dice := byte(rand.Intn(100)) // [0, 100) if dice >= p.SampleRate { - http2.ResponseWithError(w, http.StatusForbidden, errors.New("cancel")) + ResponseWithError(w, http.StatusForbidden, errors.New("cancel")) return } ua := e.services.UaParser.ParseFromHTTPRequest(r) if ua == nil { - http2.ResponseWithError(w, http.StatusForbidden, errors.New("browser not recognized")) + ResponseWithError(w, http.StatusForbidden, errors.New("browser not recognized")) return } sessionID, err := e.services.Flaker.Compose(uint64(startTime.UnixNano() / 1e6)) if err != nil { - http2.ResponseWithError(w, http.StatusInternalServerError, err) + ResponseWithError(w, http.StatusInternalServerError, err) return } // TODO: if EXPIRED => send message for two sessions association @@ -93,7 +92,7 @@ func (e *Router) startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) })) } - http2.ResponseWithJSON(w, &http2.StartSessionResponse{ + ResponseWithJSON(w, &StartSessionResponse{ Token: e.services.Tokenizer.Compose(*tokenData), UserUUID: userUUID, SessionID: strconv.FormatUint(tokenData.ID, 10), @@ -105,13 +104,13 @@ func (e *Router) pushMessagesHandlerWeb(w http.ResponseWriter, r *http.Request) // Check authorization sessionData, err := e.services.Tokenizer.ParseFromHTTPRequest(r) if err != nil { - http2.ResponseWithError(w, http.StatusUnauthorized, err) + ResponseWithError(w, http.StatusUnauthorized, err) return } // Check request body if r.Body == nil { - http2.ResponseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) + ResponseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) } body := http.MaxBytesReader(w, r.Body, e.cfg.BeaconSizeLimit) defer body.Close() @@ -150,7 +149,7 @@ func (e *Router) pushMessagesHandlerWeb(w http.ResponseWriter, r *http.Request) handledMessages.Write(msg.Encode()) }) if err != nil { - http2.ResponseWithError(w, http.StatusForbidden, err) + ResponseWithError(w, http.StatusForbidden, err) return } @@ -166,26 +165,26 @@ func (e *Router) pushMessagesHandlerWeb(w http.ResponseWriter, r *http.Request) func (e *Router) notStartedHandlerWeb(w http.ResponseWriter, r *http.Request) { // Check request body if r.Body == nil { - http2.ResponseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) + ResponseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) } body := http.MaxBytesReader(w, r.Body, e.cfg.JsonSizeLimit) defer body.Close() // Parse request body - req := &http2.NotStartedRequest{} + req := &NotStartedRequest{} if err := json.NewDecoder(body).Decode(req); err != nil { - http2.ResponseWithError(w, http.StatusBadRequest, err) + ResponseWithError(w, http.StatusBadRequest, err) return } // Handler's logic if req.ProjectKey == nil { - http2.ResponseWithError(w, http.StatusForbidden, errors.New("ProjectKey value required")) + ResponseWithError(w, http.StatusForbidden, errors.New("ProjectKey value required")) return } ua := e.services.UaParser.ParseFromHTTPRequest(r) // TODO?: insert anyway if ua == nil { - http2.ResponseWithError(w, http.StatusForbidden, errors.New("browser not recognized")) + ResponseWithError(w, http.StatusForbidden, errors.New("browser not recognized")) return } country := e.services.GeoIP.ExtractISOCodeFromHTTPRequest(r) diff --git a/backend/internal/router/handlers.go b/backend/internal/router/handlers.go index 81a055145..e6e4c1d26 100644 --- a/backend/internal/router/handlers.go +++ b/backend/internal/router/handlers.go @@ -6,7 +6,6 @@ import ( "io/ioutil" "log" "net/http" - http2 "openreplay/backend/internal/http" ) func (e *Router) pushMessages(w http.ResponseWriter, r *http.Request, sessionID uint64, topicName string) { @@ -20,7 +19,7 @@ func (e *Router) pushMessages(w http.ResponseWriter, r *http.Request, sessionID reader, err = gzip.NewReader(body) if err != nil { - http2.ResponseWithError(w, http.StatusInternalServerError, err) // TODO: stage-dependent responce + ResponseWithError(w, http.StatusInternalServerError, err) // TODO: stage-dependent responce return } log.Println("Gzip reader init", reader) @@ -31,7 +30,7 @@ func (e *Router) pushMessages(w http.ResponseWriter, r *http.Request, sessionID log.Println("Reader after switch:", reader) buf, err := ioutil.ReadAll(reader) if err != nil { - http2.ResponseWithError(w, http.StatusInternalServerError, err) // TODO: send error here only on staging + ResponseWithError(w, http.StatusInternalServerError, err) // TODO: send error here only on staging return } e.services.Producer.Produce(topicName, sessionID, buf) // What if not able to send? diff --git a/backend/internal/http/model.go b/backend/internal/router/model.go similarity index 98% rename from backend/internal/http/model.go rename to backend/internal/router/model.go index 3fe4abd3d..339593d98 100644 --- a/backend/internal/http/model.go +++ b/backend/internal/router/model.go @@ -1,4 +1,4 @@ -package http +package router type StartSessionRequest struct { Token string `json:"token"` diff --git a/backend/internal/http/response.go b/backend/internal/router/response.go similarity index 96% rename from backend/internal/http/response.go rename to backend/internal/router/response.go index 1b87c33b9..0b4725419 100644 --- a/backend/internal/http/response.go +++ b/backend/internal/router/response.go @@ -1,4 +1,4 @@ -package http +package router import ( "encoding/json" diff --git a/backend/internal/router/router.go b/backend/internal/router/router.go index c49bbf161..145630351 100644 --- a/backend/internal/router/router.go +++ b/backend/internal/router/router.go @@ -5,16 +5,16 @@ import ( "log" "net/http" "openreplay/backend/internal/config" - http2 "openreplay/backend/internal/http" + http2 "openreplay/backend/internal/services" ) type Router struct { router *mux.Router cfg *config.Config - services *http2.ServiceBuilder + services *http2.ServicesBuilder } -func NewRouter(cfg *config.Config, services *http2.ServiceBuilder) (*Router, error) { +func NewRouter(cfg *config.Config, services *http2.ServicesBuilder) (*Router, error) { e := &Router{ cfg: cfg, services: services, diff --git a/backend/internal/http/service.go b/backend/internal/services/services.go similarity index 76% rename from backend/internal/http/service.go rename to backend/internal/services/services.go index 8f553db32..62569630e 100644 --- a/backend/internal/http/service.go +++ b/backend/internal/services/services.go @@ -1,9 +1,9 @@ -package http +package services import ( "openreplay/backend/internal/config" - "openreplay/backend/internal/http/geoip" - "openreplay/backend/internal/http/uaparser" + "openreplay/backend/internal/geoip" + "openreplay/backend/internal/uaparser" "openreplay/backend/pkg/db/cache" "openreplay/backend/pkg/flakeid" "openreplay/backend/pkg/queue/types" @@ -12,7 +12,7 @@ import ( "openreplay/backend/pkg/url/assets" ) -type ServiceBuilder struct { +type ServicesBuilder struct { Pgconn *cache.PGCache Producer types.Producer Rewriter *assets.Rewriter @@ -23,8 +23,8 @@ type ServiceBuilder struct { S3 *storage.S3 } -func NewServiceBuilder(cfg *config.Config, producer types.Producer, pgconn *cache.PGCache) *ServiceBuilder { - return &ServiceBuilder{ +func New(cfg *config.Config, producer types.Producer, pgconn *cache.PGCache) *ServicesBuilder { + return &ServicesBuilder{ Pgconn: pgconn, Producer: producer, Rewriter: assets.NewRewriter(cfg.AssetsOrigin), diff --git a/backend/internal/http/uaparser/http.go b/backend/internal/uaparser/http.go similarity index 100% rename from backend/internal/http/uaparser/http.go rename to backend/internal/uaparser/http.go diff --git a/backend/internal/http/uaparser/uaparser.go b/backend/internal/uaparser/uaparser.go similarity index 100% rename from backend/internal/http/uaparser/uaparser.go rename to backend/internal/uaparser/uaparser.go From a1b656dc6ad6c4cb75d5b2e6eb4aae4f56a19cd8 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Mon, 2 May 2022 16:07:00 +0200 Subject: [PATCH 034/260] feat(ui) - session settings - ui and state --- .../app/components/BugFinder/BugFinder.js | 2 - .../BugFinder/SessionsMenu/SessionsMenu.js | 10 ++- .../app/components/shared/Select/Select.tsx | 63 ++++++++++++++ .../app/components/shared/Select/index.ts | 1 + .../SessionSettings/SessionSettings.tsx | 40 +++++++++ .../components/CaptureRate.tsx | 43 ++++++++++ .../components/DefaultPlaying.tsx | 25 ++++++ .../components/DefaultTimezone.tsx | 42 ++++++++++ .../components/ListingVisibility.tsx | 57 +++++++++++++ .../shared/SessionSettings/index.ts | 1 + .../ui/ToggleButton/ToggleButton.tsx | 84 +++++++++++++++++++ frontend/app/components/ui/Toggler/Toggler.js | 22 +++-- .../app/components/ui/Toggler/toggler.css | 19 ++++- frontend/app/components/ui/index.js | 1 + frontend/app/mstore/index.tsx | 3 + frontend/app/mstore/settingsStore.ts | 15 ++++ frontend/app/mstore/types/sessionSettings.ts | 26 ++++++ frontend/app/svg/icons/percent.svg | 3 + 18 files changed, 442 insertions(+), 15 deletions(-) create mode 100644 frontend/app/components/shared/Select/Select.tsx create mode 100644 frontend/app/components/shared/Select/index.ts create mode 100644 frontend/app/components/shared/SessionSettings/SessionSettings.tsx create mode 100644 frontend/app/components/shared/SessionSettings/components/CaptureRate.tsx create mode 100644 frontend/app/components/shared/SessionSettings/components/DefaultPlaying.tsx create mode 100644 frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx create mode 100644 frontend/app/components/shared/SessionSettings/components/ListingVisibility.tsx create mode 100644 frontend/app/components/shared/SessionSettings/index.ts create mode 100644 frontend/app/components/ui/ToggleButton/ToggleButton.tsx create mode 100644 frontend/app/mstore/settingsStore.ts create mode 100644 frontend/app/mstore/types/sessionSettings.ts create mode 100644 frontend/app/svg/icons/percent.svg diff --git a/frontend/app/components/BugFinder/BugFinder.js b/frontend/app/components/BugFinder/BugFinder.js index 3ce09d23b..6e4f589a6 100644 --- a/frontend/app/components/BugFinder/BugFinder.js +++ b/frontend/app/components/BugFinder/BugFinder.js @@ -20,7 +20,6 @@ import { LAST_7_DAYS } from 'Types/app/period'; import { resetFunnel } from 'Duck/funnels'; import { resetFunnelFilters } from 'Duck/funnelFilters' import NoSessionsMessage from 'Shared/NoSessionsMessage'; -// import TrackerUpdateMessage from 'Shared/TrackerUpdateMessage'; import SessionSearch from 'Shared/SessionSearch'; import MainSearchBar from 'Shared/MainSearchBar'; import { clearSearch, fetchSessions } from 'Duck/search'; @@ -130,7 +129,6 @@ export default class BugFinder extends React.PureComponent { />
    - {/* */}
    diff --git a/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js b/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js index fa0594316..978eb0003 100644 --- a/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js +++ b/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js @@ -1,4 +1,4 @@ -import React from 'react' +import React, { useEffect } from 'react' import { connect } from 'react-redux'; import cn from 'classnames'; import { SideMenuitem, SavedSearchList, Progress, Popup } from 'UI' @@ -7,17 +7,23 @@ import { fetchWatchdogStatus } from 'Duck/watchdogs'; import { clearEvents } from 'Duck/filters'; import { issues_types } from 'Types/session/issue' import { fetchList as fetchSessionList } from 'Duck/sessions'; +import { useModal } from 'App/components/Modal'; +import SessionSettings from 'Shared/SessionSettings/SessionSettings' function SessionsMenu(props) { const { activeTab, keyMap, wdTypeCount, toggleRehydratePanel } = props; + const { hideModal, showModal } = useModal(); const onMenuItemClick = (filter) => { props.onMenuItemClick(filter) } - const capturingAll = props.captureRate && props.captureRate.get('captureAll'); + useEffect(() => { + showModal(, {}); + }, []) + return (
    diff --git a/frontend/app/components/shared/Select/Select.tsx b/frontend/app/components/shared/Select/Select.tsx new file mode 100644 index 000000000..c4523cf25 --- /dev/null +++ b/frontend/app/components/shared/Select/Select.tsx @@ -0,0 +1,63 @@ +import React from 'react'; +import Select from 'react-select'; + +interface Props { + options: any[]; + isSearchable?: boolean; + defaultValue?: any; + plain?: boolean; + [x:string]: any; +} +export default function({ plain = false, options, isSearchable = false, defaultValue, ...rest }: Props) { + const customStyles = { + option: (provided, state) => ({ + ...provided, + whiteSpace: 'nowrap', + }), + menu: (provided, state) => ({ + ...provided, + top: 31, + }), + control: (provided) => { + const obj = { + ...provided, + border: 'solid thin #ddd' + } + if (plain) { + obj['border'] = '1px solid transparent' + } + return obj; + }, + valueContainer: (provided) => ({ + ...provided, + paddingRight: '0px', + }), + singleValue: (provided, state) => { + const opacity = state.isDisabled ? 0.5 : 1; + const transition = 'opacity 300ms'; + + return { ...provided, opacity, transition }; + } + } + return ( + setCaptureRate(value)} + disabled={captureAll} + min={0} + minValue={0} + /> + +
    + of the sessions + +
    + + ); +} + +export default CaptureRate; \ No newline at end of file diff --git a/frontend/app/components/shared/SessionSettings/components/DefaultPlaying.tsx b/frontend/app/components/shared/SessionSettings/components/DefaultPlaying.tsx new file mode 100644 index 000000000..cb80c30b2 --- /dev/null +++ b/frontend/app/components/shared/SessionSettings/components/DefaultPlaying.tsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { Toggler } from 'UI'; +import { useStore } from 'App/mstore'; +import { useObserver } from 'mobx-react-lite'; + +function DefaultPlaying(props) { + const { settingsStore } = useStore(); + const sessionSettings = useObserver(() => settingsStore.sessionSettings) + + return useObserver(() => ( + <> +

    Default Playing Options

    +
    Always start playing the session from the first issue.
    +
    + sessionSettings.updateKey('skipToIssue', !sessionSettings.skipToIssue)} + /> +
    + + )); +} + +export default DefaultPlaying; \ No newline at end of file diff --git a/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx b/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx new file mode 100644 index 000000000..c2f585a3d --- /dev/null +++ b/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx @@ -0,0 +1,42 @@ +import React, { useEffect } from 'react'; +import { Toggler, Button } from 'UI'; +import Select from 'Shared/Select'; +import { useStore } from 'App/mstore'; +import { useObserver } from 'mobx-react-lite'; + +const timezoneOptions = [ + { label: 'UTC', value: 'UTC' }, + { label: 'EST', value: 'EST' }, +] + +function DefaultTimezone(props) { + const [changed, setChanged] = React.useState(false); + const { settingsStore } = useStore(); + const sessionSettings = useObserver(() => settingsStore.sessionSettings) + + return ( + <> +

    Default Timezone

    +
    Session Time
    +
    + +
    +
    + +
    +
    + +
    + ); +} + +ToggleButton.defaultProps = { + icons: { + checked: , + unchecked: + } +}; + +ToggleButton.propTypes = { + disabled: PropTypes.bool, + defaultChecked: PropTypes.bool, + className: PropTypes.string, + onChange: PropTypes.func, + icons: PropTypes.oneOfType([ + PropTypes.bool, + PropTypes.shape({ + checked: PropTypes.node, + unchecked: PropTypes.node + }) + ]) +}; + +export default ToggleButton; \ No newline at end of file diff --git a/frontend/app/components/ui/Toggler/Toggler.js b/frontend/app/components/ui/Toggler/Toggler.js index ef6097936..1cf3ba78a 100644 --- a/frontend/app/components/ui/Toggler/Toggler.js +++ b/frontend/app/components/ui/Toggler/Toggler.js @@ -3,18 +3,22 @@ import styles from './toggler.css'; export default ({ onChange, name, - className, + className = '', checked, + label = '', }) => (
    -
    ); diff --git a/frontend/app/components/ui/Toggler/toggler.css b/frontend/app/components/ui/Toggler/toggler.css index 171272d67..cf9cf0838 100644 --- a/frontend/app/components/ui/Toggler/toggler.css +++ b/frontend/app/components/ui/Toggler/toggler.css @@ -6,6 +6,16 @@ height: 16px; } +.label { + display: flex; + align-items: center; + cursor: pointer; + + & span { + padding-left: 10px; + color: $gray-medium; + } +} .switch input { display:none; } @@ -29,18 +39,23 @@ width: 20px; left: 0; bottom: -2px; - background-color: white; + /* background-color: white; */ transition: .4s; border-radius: 50%; border: solid 1px rgba(0, 0, 0, 0.2); + + background: #394EFF; + box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px rgba(0, 0, 0, 0.14), 0px 1px 3px rgba(0, 0, 0, 0.12); } .slider.checked { - background-color: $teal !important; + /* background-color: $teal !important; */ + background-color: #b2bcff !important; } .slider.checked:before { border: solid 1px $teal; + transform: translateX(15px); } .slider.checked:before { diff --git a/frontend/app/components/ui/index.js b/frontend/app/components/ui/index.js index e6a4253e0..193d24384 100644 --- a/frontend/app/components/ui/index.js +++ b/frontend/app/components/ui/index.js @@ -58,5 +58,6 @@ export { default as HelpText } from './HelpText'; export { default as SideMenuHeader } from './SideMenuHeader'; export { default as PageTitle } from './PageTitle'; export { default as Pagination } from './Pagination'; +export { default as Toggler } from './Toggler'; export { Input, Modal, Form, Message, Card } from 'semantic-ui-react'; diff --git a/frontend/app/mstore/index.tsx b/frontend/app/mstore/index.tsx index 88f5472c2..39c1d84a4 100644 --- a/frontend/app/mstore/index.tsx +++ b/frontend/app/mstore/index.tsx @@ -3,14 +3,17 @@ import DashboardStore, { IDashboardSotre } from './dashboardStore'; import MetricStore, { IMetricStore } from './metricStore'; import APIClient from 'App/api_client'; import { dashboardService, metricService } from 'App/services'; +import SettingsStore from './settingsStore'; export class RootStore { dashboardStore: IDashboardSotre; metricStore: IMetricStore; + settingsStore: SettingsStore; constructor() { this.dashboardStore = new DashboardStore(); this.metricStore = new MetricStore(); + this.settingsStore = new SettingsStore(); } initClient() { diff --git a/frontend/app/mstore/settingsStore.ts b/frontend/app/mstore/settingsStore.ts new file mode 100644 index 000000000..82a33a5cb --- /dev/null +++ b/frontend/app/mstore/settingsStore.ts @@ -0,0 +1,15 @@ +import { makeAutoObservable, runInAction, observable, action, reaction } from "mobx" +import SessionSettings from "./types/sessionSettings" + +export default class SettingsStore { + sessionSettings: SessionSettings = new SessionSettings() + constructor() { + makeAutoObservable(this, { + sessionSettings: observable, + }) + } + + updateCaptureRate(value: number) { + this.sessionSettings.updateKey('captureRate', value); + } +} \ No newline at end of file diff --git a/frontend/app/mstore/types/sessionSettings.ts b/frontend/app/mstore/types/sessionSettings.ts new file mode 100644 index 000000000..37317cacd --- /dev/null +++ b/frontend/app/mstore/types/sessionSettings.ts @@ -0,0 +1,26 @@ +import { makeAutoObservable, runInAction, observable, action, reaction } from "mobx" + +export default class SessionSettings { + skipToIssue: boolean = false + timezone: string = "EST" + durationFilter: any = { + count: 0, + countType: 'min', + operator: '>' + } + captureRate: number = 0 + captureAll: boolean = false + + constructor() { + makeAutoObservable(this, { + updateKey: action + }) + } + + updateKey(key: string, value: any) { + console.log(`SessionSettings.updateKey(${key}, ${value})`) + runInAction(() => { + this[key] = value + }) + } +} diff --git a/frontend/app/svg/icons/percent.svg b/frontend/app/svg/icons/percent.svg new file mode 100644 index 000000000..6904d8218 --- /dev/null +++ b/frontend/app/svg/icons/percent.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file From e421511db87b3bcd82cccc2cec510e4dd10e78f1 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Mon, 2 May 2022 16:07:12 +0200 Subject: [PATCH 035/260] feat(ui) - session settings - libs --- frontend/package-lock.json | 614 +++++++++++++++++++++++++++---------- frontend/package.json | 1 + 2 files changed, 456 insertions(+), 159 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 75fcde026..77de8a018 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -42,6 +42,7 @@ "react-redux": "^5.1.2", "react-router": "^4.3.1", "react-router-dom": "^4.3.1", + "react-select": "^5.3.1", "react-svg-map": "^2.2.0", "react-tippy": "^1.4.0", "react-toastify": "^5.5.0", @@ -114,7 +115,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.0" }, @@ -165,7 +165,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, "dependencies": { "@babel/highlight": "^7.16.7" }, @@ -177,7 +176,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -186,7 +184,6 @@ "version": "7.17.9", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", - "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", @@ -216,7 +213,6 @@ "version": "7.17.9", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", - "dev": true, "dependencies": { "@babel/types": "^7.17.0", "jsesc": "^2.5.1", @@ -230,7 +226,6 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -264,7 +259,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", - "dev": true, "dependencies": { "@babel/compat-data": "^7.17.7", "@babel/helper-validator-option": "^7.16.7", @@ -338,7 +332,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, "dependencies": { "@babel/types": "^7.16.7" }, @@ -362,7 +355,6 @@ "version": "7.17.9", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", - "dev": true, "dependencies": { "@babel/template": "^7.16.7", "@babel/types": "^7.17.0" @@ -375,7 +367,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, "dependencies": { "@babel/types": "^7.16.7" }, @@ -399,7 +390,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, "dependencies": { "@babel/types": "^7.16.7" }, @@ -411,7 +401,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", @@ -442,7 +431,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -481,7 +469,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "dev": true, "dependencies": { "@babel/types": "^7.17.0" }, @@ -505,7 +492,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, "dependencies": { "@babel/types": "^7.16.7" }, @@ -517,7 +503,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -526,7 +511,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -550,7 +534,6 @@ "version": "7.17.9", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", - "dev": true, "dependencies": { "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.9", @@ -564,7 +547,6 @@ "version": "7.17.9", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -578,7 +560,6 @@ "version": "7.17.9", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -1038,7 +1019,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1975,7 +1955,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", "@babel/parser": "^7.16.7", @@ -1989,7 +1968,6 @@ "version": "7.17.9", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.17.9", @@ -2010,7 +1988,6 @@ "version": "7.17.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -2054,6 +2031,99 @@ "node": ">=10.0.0" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.9.2", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.9.2.tgz", + "integrity": "sha512-Pr/7HGH6H6yKgnVFNEj2MVlreu3ADqftqjqwUvDy/OJzKFgxKeTQ+eeUf20FOTuHVkDON2iNa25rAXVYtWJCjw==", + "dependencies": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/runtime": "^7.13.10", + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.5", + "@emotion/serialize": "^1.0.2", + "babel-plugin-macros": "^2.6.1", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.0.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/@emotion/memoize": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", + "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" + }, + "node_modules/@emotion/babel-plugin/node_modules/@emotion/serialize": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.3.tgz", + "integrity": "sha512-2mSSvgLfyV3q+iVh3YWgNlUc2a9ZlDU7DjuP5MjK3AXRR0dYigCrP99aeFtaB2L/hjfEZdSThn5dsZ0ufqbvsA==", + "dependencies": { + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.4", + "@emotion/unitless": "^0.7.5", + "@emotion/utils": "^1.0.0", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/@emotion/utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", + "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" + }, + "node_modules/@emotion/babel-plugin/node_modules/babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/csstype": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", + "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@emotion/cache": { "version": "10.0.29", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz", @@ -2097,8 +2167,7 @@ "node_modules/@emotion/hash": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", - "dev": true + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, "node_modules/@emotion/is-prop-valid": { "version": "0.8.8", @@ -2112,8 +2181,72 @@ "node_modules/@emotion/memoize": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", - "dev": true + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, + "node_modules/@emotion/react": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.9.0.tgz", + "integrity": "sha512-lBVSF5d0ceKtfKCDQJveNAtkC7ayxpVlgOohLgXqRwqWr9bOf4TZAFFyIcNngnV6xK6X4x2ZeXq7vliHkoVkxQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@emotion/babel-plugin": "^11.7.1", + "@emotion/cache": "^11.7.1", + "@emotion/serialize": "^1.0.3", + "@emotion/utils": "^1.1.0", + "@emotion/weak-memoize": "^0.2.5", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/react/node_modules/@emotion/cache": { + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", + "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", + "dependencies": { + "@emotion/memoize": "^0.7.4", + "@emotion/sheet": "^1.1.0", + "@emotion/utils": "^1.0.0", + "@emotion/weak-memoize": "^0.2.5", + "stylis": "4.0.13" + } + }, + "node_modules/@emotion/react/node_modules/@emotion/serialize": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.3.tgz", + "integrity": "sha512-2mSSvgLfyV3q+iVh3YWgNlUc2a9ZlDU7DjuP5MjK3AXRR0dYigCrP99aeFtaB2L/hjfEZdSThn5dsZ0ufqbvsA==", + "dependencies": { + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.4", + "@emotion/unitless": "^0.7.5", + "@emotion/utils": "^1.0.0", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/react/node_modules/@emotion/sheet": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", + "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" + }, + "node_modules/@emotion/react/node_modules/@emotion/utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", + "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" + }, + "node_modules/@emotion/react/node_modules/csstype": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", + "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" }, "node_modules/@emotion/serialize": { "version": "0.11.16", @@ -2173,8 +2306,7 @@ "node_modules/@emotion/unitless": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", - "dev": true + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, "node_modules/@emotion/utils": { "version": "0.11.3", @@ -2185,8 +2317,7 @@ "node_modules/@emotion/weak-memoize": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", - "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==", - "dev": true + "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "node_modules/@fullhuman/postcss-purgecss": { "version": "2.3.0", @@ -2265,7 +2396,6 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -2273,14 +2403,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.11", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", - "dev": true + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" }, "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" @@ -4679,7 +4807,7 @@ "version": "14.18.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.13.tgz", "integrity": "sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==", - "dev": true + "devOptional": true }, "node_modules/@types/node-fetch": { "version": "2.6.1", @@ -4712,8 +4840,7 @@ "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "node_modules/@types/parse5": { "version": "5.0.3", @@ -4730,8 +4857,7 @@ "node_modules/@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/q": { "version": "1.5.5", @@ -4749,7 +4875,6 @@ "version": "18.0.6", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.6.tgz", "integrity": "sha512-bPqwzJRzKtfI0mVYr5R+1o9BOE8UEXefwc1LwcBtfnaAn6OoqMhLa/91VA8aeWfDPJt1kHvYKI8RHcQybZLHHA==", - "dev": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -4765,11 +4890,18 @@ "@types/react": "*" } }, + "node_modules/@types/react-transition-group": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz", + "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/react/node_modules/csstype": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==", - "dev": true + "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" }, "node_modules/@types/resize-observer-browser": { "version": "0.1.7", @@ -4779,8 +4911,7 @@ "node_modules/@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "node_modules/@types/source-list-map": { "version": "0.1.2", @@ -6846,7 +6977,6 @@ "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" } @@ -7610,7 +7740,6 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.1" } @@ -9721,7 +9850,6 @@ "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" } @@ -11052,8 +11180,7 @@ "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" }, "node_modules/find-up": { "version": "5.0.0", @@ -11747,7 +11874,6 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -11915,7 +12041,6 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, "engines": { "node": ">=4" } @@ -13020,7 +13145,6 @@ "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" @@ -13036,7 +13160,6 @@ "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" } @@ -13331,8 +13454,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "node_modules/is-bigint": { "version": "1.0.4", @@ -14014,7 +14136,6 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, "bin": { "jsesc": "bin/jsesc" }, @@ -14059,8 +14180,7 @@ "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 + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -14078,7 +14198,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true, "bin": { "json5": "lib/cli.js" }, @@ -14227,8 +14346,7 @@ "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 + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/loader-runner": { "version": "2.4.0", @@ -14554,6 +14672,11 @@ "node": ">= 4.0.0" } }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, "node_modules/memoizerific": { "version": "1.11.3", "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", @@ -16039,7 +16162,6 @@ "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" }, @@ -16082,7 +16204,6 @@ "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", @@ -16233,7 +16354,6 @@ "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" } @@ -18996,6 +19116,46 @@ "isarray": "0.0.1" } }, + "node_modules/react-select": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.3.1.tgz", + "integrity": "sha512-Y195MmhDoDAj/8gTDyYZU1Raf7tmZd81wxM6RkFko4pqJ4Xv0/ilqUMtSn+GYkwmSlTWeMlzh+e+t7PJgtuXPw==", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^5.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-select/node_modules/@emotion/cache": { + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", + "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", + "dependencies": { + "@emotion/memoize": "^0.7.4", + "@emotion/sheet": "^1.1.0", + "@emotion/utils": "^1.0.0", + "@emotion/weak-memoize": "^0.2.5", + "stylis": "4.0.13" + } + }, + "node_modules/react-select/node_modules/@emotion/sheet": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", + "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" + }, + "node_modules/react-select/node_modules/@emotion/utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", + "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" + }, "node_modules/react-sizeme": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/react-sizeme/-/react-sizeme-3.0.2.tgz", @@ -20055,8 +20215,7 @@ "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/safe-regex": { "version": "1.1.0", @@ -20164,7 +20323,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -21456,6 +21614,11 @@ "postcss": "^8.2.15" } }, + "node_modules/stylis": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", + "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" + }, "node_modules/sugarss": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", @@ -22228,7 +22391,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, "engines": { "node": ">=4" } @@ -25615,7 +25777,6 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, "engines": { "node": ">= 6" } @@ -25698,7 +25859,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.0" } @@ -25733,7 +25893,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, "requires": { "@babel/highlight": "^7.16.7" } @@ -25741,14 +25900,12 @@ "@babel/compat-data": { "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", - "dev": true + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==" }, "@babel/core": { "version": "7.17.9", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", - "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", @@ -25771,7 +25928,6 @@ "version": "7.17.9", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", - "dev": true, "requires": { "@babel/types": "^7.17.0", "jsesc": "^2.5.1", @@ -25781,8 +25937,7 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -25809,7 +25964,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", - "dev": true, "requires": { "@babel/compat-data": "^7.17.7", "@babel/helper-validator-option": "^7.16.7", @@ -25862,7 +26016,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -25880,7 +26033,6 @@ "version": "7.17.9", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", - "dev": true, "requires": { "@babel/template": "^7.16.7", "@babel/types": "^7.17.0" @@ -25890,7 +26042,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -25908,7 +26059,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -25917,7 +26067,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", @@ -25941,8 +26090,7 @@ "@babel/helper-plugin-utils": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "dev": true + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" }, "@babel/helper-remap-async-to-generator": { "version": "7.16.8", @@ -25972,7 +26120,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "dev": true, "requires": { "@babel/types": "^7.17.0" } @@ -25990,7 +26137,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -25998,14 +26144,12 @@ "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/helper-validator-option": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" }, "@babel/helper-wrap-function": { "version": "7.16.8", @@ -26023,7 +26167,6 @@ "version": "7.17.9", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", - "dev": true, "requires": { "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.9", @@ -26034,7 +26177,6 @@ "version": "7.17.9", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -26044,8 +26186,7 @@ "@babel/parser": { "version": "7.17.9", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", - "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", - "dev": true + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.16.7", @@ -26343,7 +26484,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -26971,7 +27111,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/parser": "^7.16.7", @@ -26982,7 +27121,6 @@ "version": "7.17.9", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.17.9", @@ -27000,7 +27138,6 @@ "version": "7.17.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -27035,6 +27172,86 @@ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, + "@emotion/babel-plugin": { + "version": "11.9.2", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.9.2.tgz", + "integrity": "sha512-Pr/7HGH6H6yKgnVFNEj2MVlreu3ADqftqjqwUvDy/OJzKFgxKeTQ+eeUf20FOTuHVkDON2iNa25rAXVYtWJCjw==", + "requires": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/runtime": "^7.13.10", + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.5", + "@emotion/serialize": "^1.0.2", + "babel-plugin-macros": "^2.6.1", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.0.13" + }, + "dependencies": { + "@emotion/memoize": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", + "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" + }, + "@emotion/serialize": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.3.tgz", + "integrity": "sha512-2mSSvgLfyV3q+iVh3YWgNlUc2a9ZlDU7DjuP5MjK3AXRR0dYigCrP99aeFtaB2L/hjfEZdSThn5dsZ0ufqbvsA==", + "requires": { + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.4", + "@emotion/unitless": "^0.7.5", + "@emotion/utils": "^1.0.0", + "csstype": "^3.0.2" + } + }, + "@emotion/utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", + "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" + }, + "babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "requires": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + } + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "csstype": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", + "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, "@emotion/cache": { "version": "10.0.29", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz", @@ -27075,8 +27292,7 @@ "@emotion/hash": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", - "dev": true + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, "@emotion/is-prop-valid": { "version": "0.8.8", @@ -27090,8 +27306,62 @@ "@emotion/memoize": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", - "dev": true + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, + "@emotion/react": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.9.0.tgz", + "integrity": "sha512-lBVSF5d0ceKtfKCDQJveNAtkC7ayxpVlgOohLgXqRwqWr9bOf4TZAFFyIcNngnV6xK6X4x2ZeXq7vliHkoVkxQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@emotion/babel-plugin": "^11.7.1", + "@emotion/cache": "^11.7.1", + "@emotion/serialize": "^1.0.3", + "@emotion/utils": "^1.1.0", + "@emotion/weak-memoize": "^0.2.5", + "hoist-non-react-statics": "^3.3.1" + }, + "dependencies": { + "@emotion/cache": { + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", + "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", + "requires": { + "@emotion/memoize": "^0.7.4", + "@emotion/sheet": "^1.1.0", + "@emotion/utils": "^1.0.0", + "@emotion/weak-memoize": "^0.2.5", + "stylis": "4.0.13" + } + }, + "@emotion/serialize": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.3.tgz", + "integrity": "sha512-2mSSvgLfyV3q+iVh3YWgNlUc2a9ZlDU7DjuP5MjK3AXRR0dYigCrP99aeFtaB2L/hjfEZdSThn5dsZ0ufqbvsA==", + "requires": { + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.4", + "@emotion/unitless": "^0.7.5", + "@emotion/utils": "^1.0.0", + "csstype": "^3.0.2" + } + }, + "@emotion/sheet": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", + "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" + }, + "@emotion/utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", + "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" + }, + "csstype": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", + "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" + } + } }, "@emotion/serialize": { "version": "0.11.16", @@ -27143,8 +27413,7 @@ "@emotion/unitless": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", - "dev": true + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, "@emotion/utils": { "version": "0.11.3", @@ -27155,8 +27424,7 @@ "@emotion/weak-memoize": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", - "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==", - "dev": true + "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "@fullhuman/postcss-purgecss": { "version": "2.3.0", @@ -27216,20 +27484,17 @@ "@jridgewell/resolve-uri": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", - "dev": true + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==" }, "@jridgewell/sourcemap-codec": { "version": "1.4.11", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", - "dev": true + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" }, "@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, "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -29063,7 +29328,7 @@ "version": "14.18.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.13.tgz", "integrity": "sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==", - "dev": true + "devOptional": true }, "@types/node-fetch": { "version": "2.6.1", @@ -29096,8 +29361,7 @@ "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "@types/parse5": { "version": "5.0.3", @@ -29114,8 +29378,7 @@ "@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "@types/q": { "version": "1.5.5", @@ -29133,7 +29396,6 @@ "version": "18.0.6", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.6.tgz", "integrity": "sha512-bPqwzJRzKtfI0mVYr5R+1o9BOE8UEXefwc1LwcBtfnaAn6OoqMhLa/91VA8aeWfDPJt1kHvYKI8RHcQybZLHHA==", - "dev": true, "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -29143,8 +29405,7 @@ "csstype": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==", - "dev": true + "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" } } }, @@ -29157,6 +29418,14 @@ "@types/react": "*" } }, + "@types/react-transition-group": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz", + "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==", + "requires": { + "@types/react": "*" + } + }, "@types/resize-observer-browser": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz", @@ -29165,8 +29434,7 @@ "@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "@types/source-list-map": { "version": "0.1.2", @@ -30870,8 +31138,7 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camel-case": { "version": "3.0.0", @@ -31474,7 +31741,6 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, "requires": { "safe-buffer": "~5.1.1" } @@ -33243,7 +33509,6 @@ "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, "requires": { "is-arrayish": "^0.2.1" } @@ -34330,8 +34595,7 @@ "find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" }, "find-up": { "version": "5.0.0", @@ -34868,8 +35132,7 @@ "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-caller-file": { "version": "2.0.5", @@ -34993,8 +35256,7 @@ "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globalthis": { "version": "1.0.2", @@ -35896,7 +36158,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -35905,8 +36166,7 @@ "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 + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" } } }, @@ -36135,8 +36395,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-bigint": { "version": "1.0.4", @@ -36602,8 +36861,7 @@ "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, "jshint": { "version": "2.13.4", @@ -36638,8 +36896,7 @@ "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 + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-schema-traverse": { "version": "0.4.1", @@ -36656,8 +36913,7 @@ "json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" }, "jsonfile": { "version": "6.1.0", @@ -36774,8 +37030,7 @@ "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 + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "loader-runner": { "version": "2.4.0", @@ -37029,6 +37284,11 @@ "fs-monkey": "1.0.3" } }, + "memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, "memoizerific": { "version": "1.11.3", "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", @@ -38237,7 +38497,6 @@ "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, "requires": { "callsites": "^3.0.0" } @@ -38273,7 +38532,6 @@ "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, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -38401,8 +38659,7 @@ "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 + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "pbkdf2": { "version": "3.1.2", @@ -40593,6 +40850,44 @@ } } }, + "react-select": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.3.1.tgz", + "integrity": "sha512-Y195MmhDoDAj/8gTDyYZU1Raf7tmZd81wxM6RkFko4pqJ4Xv0/ilqUMtSn+GYkwmSlTWeMlzh+e+t7PJgtuXPw==", + "requires": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^5.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0" + }, + "dependencies": { + "@emotion/cache": { + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", + "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", + "requires": { + "@emotion/memoize": "^0.7.4", + "@emotion/sheet": "^1.1.0", + "@emotion/utils": "^1.0.0", + "@emotion/weak-memoize": "^0.2.5", + "stylis": "4.0.13" + } + }, + "@emotion/sheet": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", + "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" + }, + "@emotion/utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", + "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" + } + } + }, "react-sizeme": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/react-sizeme/-/react-sizeme-3.0.2.tgz", @@ -41424,8 +41719,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", @@ -41520,8 +41814,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "send": { "version": "0.17.2", @@ -42617,6 +42910,11 @@ "postcss-selector-parser": "^6.0.4" } }, + "stylis": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", + "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" + }, "sugarss": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", @@ -43203,8 +43501,7 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, "to-object-path": { "version": "0.3.0", @@ -45881,8 +46178,7 @@ "yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, "yargs": { "version": "17.4.1", diff --git a/frontend/package.json b/frontend/package.json index 7f51ba174..3a240eedc 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -49,6 +49,7 @@ "react-redux": "^5.1.2", "react-router": "^4.3.1", "react-router-dom": "^4.3.1", + "react-select": "^5.3.1", "react-svg-map": "^2.2.0", "react-tippy": "^1.4.0", "react-toastify": "^5.5.0", From 02c39199d211ab16e20435592edc80d4b827a674 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Mon, 2 May 2022 16:26:05 +0200 Subject: [PATCH 036/260] feat(ui) - session settings - changed state --- .../SessionSettings/components/CaptureRate.tsx | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/frontend/app/components/shared/SessionSettings/components/CaptureRate.tsx b/frontend/app/components/shared/SessionSettings/components/CaptureRate.tsx index 6436bd652..9576de72a 100644 --- a/frontend/app/components/shared/SessionSettings/components/CaptureRate.tsx +++ b/frontend/app/components/shared/SessionSettings/components/CaptureRate.tsx @@ -4,10 +4,12 @@ import { useStore } from 'App/mstore'; import { useObserver } from 'mobx-react-lite'; function CaptureRate(props) { + const [changed, setChanged] = React.useState(false); const { settingsStore } = useStore(); const sessionSettings = useObserver(() => settingsStore.sessionSettings) const [captureRate, setCaptureRate] = React.useState(sessionSettings.captureRate); const [captureAll, setCaptureAll] = React.useState(captureRate === 100); + return ( <>

    Capture Rate

    @@ -16,7 +18,10 @@ function CaptureRate(props) { setCaptureAll(!captureAll)} + onChange={() => { + setCaptureAll(!captureAll) + setChanged(true) + }} label="Capture 100% of the sessions" />
    @@ -26,7 +31,10 @@ function CaptureRate(props) { type="number" value={captureRate} style={{ height: '38px', width: '100px'}} - onChange={(e, { value }) => setCaptureRate(value)} + onChange={(e, { value }) => { + setCaptureRate(value) + setChanged(true); + }} disabled={captureAll} min={0} minValue={0} @@ -34,7 +42,7 @@ function CaptureRate(props) {
    of the sessions - +
    ); From 87f76f484ded61404c07ebb690225c880e531939 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Mon, 2 May 2022 16:31:19 +0200 Subject: [PATCH 037/260] feat(ui) - session settings - changed state --- .../Dashboard/components/DashboardModal/DashboardModal.tsx | 2 +- frontend/app/components/Modal/ModalOverlay.tsx | 2 +- .../app/components/Session_/Player/Controls/DraggableCircle.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/app/components/Dashboard/components/DashboardModal/DashboardModal.tsx b/frontend/app/components/Dashboard/components/DashboardModal/DashboardModal.tsx index 575cb7de8..d19556857 100644 --- a/frontend/app/components/Dashboard/components/DashboardModal/DashboardModal.tsx +++ b/frontend/app/components/Dashboard/components/DashboardModal/DashboardModal.tsx @@ -38,7 +38,7 @@ function DashboardModal(props) { return useObserver(() => (
    diff --git a/frontend/app/components/Modal/ModalOverlay.tsx b/frontend/app/components/Modal/ModalOverlay.tsx index 4dad0ec61..ef46024e1 100644 --- a/frontend/app/components/Modal/ModalOverlay.tsx +++ b/frontend/app/components/Modal/ModalOverlay.tsx @@ -6,7 +6,7 @@ function ModalOverlay({ children }) { let modal = useModal(); return ( -
    +
    modal.hideModal()} className={stl.overlay} diff --git a/frontend/app/components/Session_/Player/Controls/DraggableCircle.tsx b/frontend/app/components/Session_/Player/Controls/DraggableCircle.tsx index f4ebd6abf..385707879 100644 --- a/frontend/app/components/Session_/Player/Controls/DraggableCircle.tsx +++ b/frontend/app/components/Session_/Player/Controls/DraggableCircle.tsx @@ -19,7 +19,7 @@ function getStyles( // because IE will ignore our custom "empty image" drag preview. opacity: isDragging ? 0 : 1, height: isDragging ? 0 : '', - zIndex: '99', + zIndex: 99, cursor: 'move' } } From 5ec46ad7530bee862d939d628d3661cd34b1eb16 Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Mon, 2 May 2022 17:36:33 +0200 Subject: [PATCH 038/260] Moved assets cache logic --- backend/internal/assetscache/assets.go | 83 +++++++++++++++++++++++++ backend/internal/config/config.go | 2 + backend/internal/router/assets.go | 36 ----------- backend/internal/router/handlers-ios.go | 32 +++------- backend/internal/router/handlers-web.go | 32 +--------- backend/internal/router/handlers.go | 4 +- backend/internal/router/model.go | 19 ++++++ backend/internal/services/services.go | 14 +++-- 8 files changed, 126 insertions(+), 96 deletions(-) create mode 100644 backend/internal/assetscache/assets.go delete mode 100644 backend/internal/router/assets.go diff --git a/backend/internal/assetscache/assets.go b/backend/internal/assetscache/assets.go new file mode 100644 index 000000000..1ef70b56c --- /dev/null +++ b/backend/internal/assetscache/assets.go @@ -0,0 +1,83 @@ +package assetscache + +import ( + "openreplay/backend/internal/config" + "openreplay/backend/pkg/messages" + "openreplay/backend/pkg/queue/types" + "openreplay/backend/pkg/url/assets" +) + +type AssetsCache struct { + cfg *config.Config + rewriter *assets.Rewriter + producer types.Producer +} + +func New(cfg *config.Config, rewriter *assets.Rewriter, producer types.Producer) *AssetsCache { + return &AssetsCache{ + cfg: cfg, + rewriter: rewriter, + producer: producer, + } +} + +func (e *AssetsCache) ParseAssets(sessID uint64, msg messages.Message) messages.Message { + switch m := msg.(type) { + case *messages.SetNodeAttributeURLBased: + if m.Name == "src" || m.Name == "href" { + return &messages.SetNodeAttribute{ + ID: m.ID, + Name: m.Name, + Value: e.handleURL(sessID, m.BaseURL, m.Value), + } + } else if m.Name == "style" { + return &messages.SetNodeAttribute{ + ID: m.ID, + Name: m.Name, + Value: e.handleCSS(sessID, m.BaseURL, m.Value), + } + } + case *messages.SetCSSDataURLBased: + return &messages.SetCSSData{ + ID: m.ID, + Data: e.handleCSS(sessID, m.BaseURL, m.Data), + } + case *messages.CSSInsertRuleURLBased: + return &messages.CSSInsertRule{ + ID: m.ID, + Index: m.Index, + Rule: e.handleCSS(sessID, m.BaseURL, m.Rule), + } + } + return msg +} + +func (e *AssetsCache) sendAssetForCache(sessionID uint64, baseURL string, relativeURL string) { + if fullURL, cacheable := assets.GetFullCachableURL(baseURL, relativeURL); cacheable { + e.producer.Produce(e.cfg.TopicCache, sessionID, messages.Encode(&messages.AssetCache{ + URL: fullURL, + })) + } +} + +func (e *AssetsCache) sendAssetsForCacheFromCSS(sessionID uint64, baseURL string, css string) { + for _, u := range assets.ExtractURLsFromCSS(css) { // TODO: in one shot with rewriting + e.sendAssetForCache(sessionID, baseURL, u) + } +} + +func (e *AssetsCache) handleURL(sessionID uint64, baseURL string, url string) string { + if e.cfg.CacheAssets { + e.sendAssetForCache(sessionID, baseURL, url) + return e.rewriter.RewriteURL(sessionID, baseURL, url) + } + return assets.ResolveURL(baseURL, url) +} + +func (e *AssetsCache) handleCSS(sessionID uint64, baseURL string, css string) string { + if e.cfg.CacheAssets { + e.sendAssetsForCacheFromCSS(sessionID, baseURL, css) + return e.rewriter.RewriteCSS(sessionID, baseURL, css) + } + return assets.ResolveCSS(baseURL, css) +} diff --git a/backend/internal/config/config.go b/backend/internal/config/config.go index 45f957d1c..5b55ba346 100644 --- a/backend/internal/config/config.go +++ b/backend/internal/config/config.go @@ -15,6 +15,7 @@ type Config struct { CacheAssets bool BeaconSizeLimit int64 JsonSizeLimit int64 + FileSizeLimit int64 AssetsOrigin string AWSRegion string S3BucketIOSImages string @@ -36,6 +37,7 @@ func New() *Config { CacheAssets: env.Bool("CACHE_ASSETS"), BeaconSizeLimit: int64(env.Uint64("BEACON_SIZE_LIMIT")), JsonSizeLimit: 1e3, // 1Kb + FileSizeLimit: 1e7, // 10Mb AssetsOrigin: env.String("ASSETS_ORIGIN"), AWSRegion: env.String("AWS_REGION"), S3BucketIOSImages: env.String("S3_BUCKET_IOS_IMAGES"), diff --git a/backend/internal/router/assets.go b/backend/internal/router/assets.go deleted file mode 100644 index 42347f224..000000000 --- a/backend/internal/router/assets.go +++ /dev/null @@ -1,36 +0,0 @@ -package router - -import ( - "openreplay/backend/pkg/messages" - "openreplay/backend/pkg/url/assets" -) - -func (e *Router) sendAssetForCache(sessionID uint64, baseURL string, relativeURL string) { - if fullURL, cacheable := assets.GetFullCachableURL(baseURL, relativeURL); cacheable { - e.services.Producer.Produce(e.cfg.TopicCache, sessionID, messages.Encode(&messages.AssetCache{ - URL: fullURL, - })) - } -} - -func (e *Router) sendAssetsForCacheFromCSS(sessionID uint64, baseURL string, css string) { - for _, u := range assets.ExtractURLsFromCSS(css) { // TODO: in one shot with rewriting - e.sendAssetForCache(sessionID, baseURL, u) - } -} - -func (e *Router) handleURL(sessionID uint64, baseURL string, url string) string { - if e.cfg.CacheAssets { - e.sendAssetForCache(sessionID, baseURL, url) - return e.services.Rewriter.RewriteURL(sessionID, baseURL, url) - } - return assets.ResolveURL(baseURL, url) -} - -func (e *Router) handleCSS(sessionID uint64, baseURL string, css string) string { - if e.cfg.CacheAssets { - e.sendAssetsForCacheFromCSS(sessionID, baseURL, css) - return e.services.Rewriter.RewriteCSS(sessionID, baseURL, css) - } - return assets.ResolveCSS(baseURL, css) -} diff --git a/backend/internal/router/handlers-ios.go b/backend/internal/router/handlers-ios.go index f0b0d977f..426de7c05 100644 --- a/backend/internal/router/handlers-ios.go +++ b/backend/internal/router/handlers-ios.go @@ -16,30 +16,13 @@ import ( "openreplay/backend/pkg/token" ) -const FILES_SIZE_LIMIT int64 = 1e7 // 10Mb - func (e *Router) startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) { - type request struct { - Token string `json:"token"` - ProjectKey *string `json:"projectKey"` - TrackerVersion string `json:"trackerVersion"` - RevID string `json:"revID"` - UserUUID *string `json:"userUUID"` - UserOSVersion string `json:"userOSVersion"` - UserDevice string `json:"userDevice"` - Timestamp uint64 `json:"timestamp"` - } - type response struct { - Token string `json:"token"` - ImagesHashList []string `json:"imagesHashList"` - UserUUID string `json:"userUUID"` - BeaconSizeLimit int64 `json:"beaconSizeLimit"` - SessionID string `json:"sessionID"` - } startTime := time.Now() - req := &request{} + req := &StartIOSSessionRequest{} + body := http.MaxBytesReader(w, r.Body, e.cfg.JsonSizeLimit) defer body.Close() + if err := json.NewDecoder(body).Decode(req); err != nil { ResponseWithError(w, http.StatusBadRequest, err) return @@ -50,7 +33,7 @@ func (e *Router) startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) return } - p, err := e.services.Pgconn.GetProjectByKey(*req.ProjectKey) + p, err := e.services.Database.GetProjectByKey(*req.ProjectKey) if err != nil { if postgres.IsNoRowsErr(err) { ResponseWithError(w, http.StatusNotFound, errors.New("Project doesn't exist or is not active")) @@ -100,7 +83,7 @@ func (e *Router) startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) })) } - ResponseWithJSON(w, &response{ + ResponseWithJSON(w, &StartIOSSessionResponse{ Token: e.services.Tokenizer.Compose(*tokenData), UserUUID: userUUID, SessionID: strconv.FormatUint(tokenData.ID, 10), @@ -136,8 +119,9 @@ func (e *Router) imagesUploadHandlerIOS(w http.ResponseWriter, r *http.Request) return } - r.Body = http.MaxBytesReader(w, r.Body, FILES_SIZE_LIMIT) + r.Body = http.MaxBytesReader(w, r.Body, e.cfg.FileSizeLimit) defer r.Body.Close() + err = r.ParseMultipartForm(1e6) // ~1Mb if err == http.ErrNotMultipart || err == http.ErrMissingBoundary { ResponseWithError(w, http.StatusUnsupportedMediaType, err) @@ -166,7 +150,7 @@ func (e *Router) imagesUploadHandlerIOS(w http.ResponseWriter, r *http.Request) key := prefix + fileHeader.Filename log.Printf("Uploading image... %v", key) go func() { //TODO: mime type from header - if err := e.services.S3.Upload(file, key, "image/jpeg", false); err != nil { + if err := e.services.Storage.Upload(file, key, "image/jpeg", false); err != nil { log.Printf("Upload ios screen error. %v", err) } }() diff --git a/backend/internal/router/handlers-web.go b/backend/internal/router/handlers-web.go index b0a3a9b94..d11a9b8ea 100644 --- a/backend/internal/router/handlers-web.go +++ b/backend/internal/router/handlers-web.go @@ -39,7 +39,7 @@ func (e *Router) startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) return } - p, err := e.services.Pgconn.GetProjectByKey(*req.ProjectKey) + p, err := e.services.Database.GetProjectByKey(*req.ProjectKey) if err != nil { if postgres.IsNoRowsErr(err) { ResponseWithError(w, http.StatusNotFound, errors.New("Project doesn't exist or capture limit has been reached")) @@ -119,33 +119,7 @@ func (e *Router) pushMessagesHandlerWeb(w http.ResponseWriter, r *http.Request) // Process each message in request data err = ReadBatchReader(body, func(msg Message) { - switch m := msg.(type) { - case *SetNodeAttributeURLBased: - if m.Name == "src" || m.Name == "href" { - msg = &SetNodeAttribute{ - ID: m.ID, - Name: m.Name, - Value: e.handleURL(sessionData.ID, m.BaseURL, m.Value), - } - } else if m.Name == "style" { - msg = &SetNodeAttribute{ - ID: m.ID, - Name: m.Name, - Value: e.handleCSS(sessionData.ID, m.BaseURL, m.Value), - } - } - case *SetCSSDataURLBased: - msg = &SetCSSData{ - ID: m.ID, - Data: e.handleCSS(sessionData.ID, m.BaseURL, m.Data), - } - case *CSSInsertRuleURLBased: - msg = &CSSInsertRule{ - ID: m.ID, - Index: m.Index, - Rule: e.handleCSS(sessionData.ID, m.BaseURL, m.Rule), - } - } + msg = e.services.Assets.ParseAssets(sessionData.ID, msg) handledMessages.Write(msg.Encode()) }) if err != nil { @@ -188,7 +162,7 @@ func (e *Router) notStartedHandlerWeb(w http.ResponseWriter, r *http.Request) { return } country := e.services.GeoIP.ExtractISOCodeFromHTTPRequest(r) - err := e.services.Pgconn.InsertUnstartedSession(postgres.UnstartedSession{ + err := e.services.Database.InsertUnstartedSession(postgres.UnstartedSession{ ProjectKey: *req.ProjectKey, TrackerVersion: req.TrackerVersion, DoNotTrack: req.DoNotTrack, diff --git a/backend/internal/router/handlers.go b/backend/internal/router/handlers.go index e6e4c1d26..34a7a990d 100644 --- a/backend/internal/router/handlers.go +++ b/backend/internal/router/handlers.go @@ -11,15 +11,17 @@ import ( func (e *Router) pushMessages(w http.ResponseWriter, r *http.Request, sessionID uint64, topicName string) { body := http.MaxBytesReader(w, r.Body, e.cfg.BeaconSizeLimit) defer body.Close() + var reader io.ReadCloser var err error + switch r.Header.Get("Content-Encoding") { case "gzip": log.Println("Gzip", reader) reader, err = gzip.NewReader(body) if err != nil { - ResponseWithError(w, http.StatusInternalServerError, err) // TODO: stage-dependent responce + ResponseWithError(w, http.StatusInternalServerError, err) // TODO: stage-dependent response return } log.Println("Gzip reader init", reader) diff --git a/backend/internal/router/model.go b/backend/internal/router/model.go index 339593d98..b39c49688 100644 --- a/backend/internal/router/model.go +++ b/backend/internal/router/model.go @@ -28,3 +28,22 @@ type NotStartedRequest struct { TrackerVersion string `json:"trackerVersion"` DoNotTrack bool `json:"DoNotTrack"` } + +type StartIOSSessionRequest struct { + Token string `json:"token"` + ProjectKey *string `json:"projectKey"` + TrackerVersion string `json:"trackerVersion"` + RevID string `json:"revID"` + UserUUID *string `json:"userUUID"` + UserOSVersion string `json:"userOSVersion"` + UserDevice string `json:"userDevice"` + Timestamp uint64 `json:"timestamp"` +} + +type StartIOSSessionResponse struct { + Token string `json:"token"` + ImagesHashList []string `json:"imagesHashList"` + UserUUID string `json:"userUUID"` + BeaconSizeLimit int64 `json:"beaconSizeLimit"` + SessionID string `json:"sessionID"` +} diff --git a/backend/internal/services/services.go b/backend/internal/services/services.go index 62569630e..5b84e1dfb 100644 --- a/backend/internal/services/services.go +++ b/backend/internal/services/services.go @@ -1,6 +1,7 @@ package services import ( + "openreplay/backend/internal/assetscache" "openreplay/backend/internal/config" "openreplay/backend/internal/geoip" "openreplay/backend/internal/uaparser" @@ -13,22 +14,23 @@ import ( ) type ServicesBuilder struct { - Pgconn *cache.PGCache + Database *cache.PGCache Producer types.Producer - Rewriter *assets.Rewriter + Assets *assetscache.AssetsCache Flaker *flakeid.Flaker UaParser *uaparser.UAParser GeoIP *geoip.GeoIP Tokenizer *token.Tokenizer - S3 *storage.S3 + Storage *storage.S3 } func New(cfg *config.Config, producer types.Producer, pgconn *cache.PGCache) *ServicesBuilder { + rewriter := assets.NewRewriter(cfg.AssetsOrigin) return &ServicesBuilder{ - Pgconn: pgconn, + Database: pgconn, Producer: producer, - Rewriter: assets.NewRewriter(cfg.AssetsOrigin), - S3: storage.NewS3(cfg.AWSRegion, cfg.S3BucketIOSImages), + Assets: assetscache.New(cfg, rewriter, producer), + Storage: storage.NewS3(cfg.AWSRegion, cfg.S3BucketIOSImages), Tokenizer: token.NewTokenizer(cfg.TokenSecret), UaParser: uaparser.NewUAParser(cfg.UAParserFile), GeoIP: geoip.NewGeoIP(cfg.MaxMinDBFile), From d02ecba354ce294f230e1f35c8ff1d32b01e91c7 Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Mon, 2 May 2022 17:38:53 +0200 Subject: [PATCH 039/260] Added missed return statements --- backend/internal/router/handlers-ios.go | 11 +++++++++++ backend/internal/router/handlers-web.go | 3 +++ 2 files changed, 14 insertions(+) diff --git a/backend/internal/router/handlers-ios.go b/backend/internal/router/handlers-ios.go index 426de7c05..50f92a6ad 100644 --- a/backend/internal/router/handlers-ios.go +++ b/backend/internal/router/handlers-ios.go @@ -20,6 +20,10 @@ func (e *Router) startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) startTime := time.Now() req := &StartIOSSessionRequest{} + if r.Body == nil { + ResponseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) + return + } body := http.MaxBytesReader(w, r.Body, e.cfg.JsonSizeLimit) defer body.Close() @@ -119,19 +123,26 @@ func (e *Router) imagesUploadHandlerIOS(w http.ResponseWriter, r *http.Request) return } + if r.Body == nil { + ResponseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) + return + } r.Body = http.MaxBytesReader(w, r.Body, e.cfg.FileSizeLimit) defer r.Body.Close() err = r.ParseMultipartForm(1e6) // ~1Mb if err == http.ErrNotMultipart || err == http.ErrMissingBoundary { ResponseWithError(w, http.StatusUnsupportedMediaType, err) + return // } else if err == multipart.ErrMessageTooLarge // if non-files part exceeds 10 MB } else if err != nil { ResponseWithError(w, http.StatusInternalServerError, err) // TODO: send error here only on staging + return } if r.MultipartForm == nil { ResponseWithError(w, http.StatusInternalServerError, errors.New("Multipart not parsed")) + return } if len(r.MultipartForm.Value["projectKey"]) == 0 { diff --git a/backend/internal/router/handlers-web.go b/backend/internal/router/handlers-web.go index d11a9b8ea..fc7c6421d 100644 --- a/backend/internal/router/handlers-web.go +++ b/backend/internal/router/handlers-web.go @@ -22,6 +22,7 @@ func (e *Router) startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) // Check request body if r.Body == nil { ResponseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) + return } body := http.MaxBytesReader(w, r.Body, e.cfg.JsonSizeLimit) defer body.Close() @@ -111,6 +112,7 @@ func (e *Router) pushMessagesHandlerWeb(w http.ResponseWriter, r *http.Request) // Check request body if r.Body == nil { ResponseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) + return } body := http.MaxBytesReader(w, r.Body, e.cfg.BeaconSizeLimit) defer body.Close() @@ -140,6 +142,7 @@ func (e *Router) notStartedHandlerWeb(w http.ResponseWriter, r *http.Request) { // Check request body if r.Body == nil { ResponseWithError(w, http.StatusBadRequest, errors.New("request body is empty")) + return } body := http.MaxBytesReader(w, r.Body, e.cfg.JsonSizeLimit) defer body.Close() From 18d18164b3fc6f3a26e6b767796d3a3fcfe07bd3 Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Tue, 3 May 2022 10:42:24 +0200 Subject: [PATCH 040/260] Added temporary hack for http service building --- backend/build.sh | 23 +++++++++--- backend/cmd/Dockerfile | 60 ++++++++++++++++++++++++++++++++ backend/services/http/build_hack | 0 3 files changed, 79 insertions(+), 4 deletions(-) mode change 100644 => 100755 backend/build.sh create mode 100644 backend/cmd/Dockerfile create mode 100644 backend/services/http/build_hack diff --git a/backend/build.sh b/backend/build.sh old mode 100644 new mode 100755 index c3c40dd33..8c1714d55 --- a/backend/build.sh +++ b/backend/build.sh @@ -33,12 +33,27 @@ function build_api(){ echo "build completed for http" return } + cwd=$PWD for image in $(ls services); do - docker build -t ${DOCKER_REPO:-'local'}/$image:${git_sha1} --build-arg SERVICE_NAME=$image . - [[ $PUSH_IMAGE -eq 1 ]] && { - docker push ${DOCKER_REPO:-'local'}/$image:${git_sha1} - } + case "$image" in + http) + echo build http + echo "$PWD" + cd cmd + docker build -t ${DOCKER_REPO:-'local'}/$image:${git_sha1} --build-arg SERVICE_NAME=$image -f ../backend . + [[ $PUSH_IMAGE -eq 1 ]] && { + docker push ${DOCKER_REPO:-'local'}/$image:${git_sha1} + } + cd ../ + ;; + *) + docker build -t ${DOCKER_REPO:-'local'}/$image:${git_sha1} --build-arg SERVICE_NAME=$image . + [[ $PUSH_IMAGE -eq 1 ]] && { + docker push ${DOCKER_REPO:-'local'}/$image:${git_sha1} + } + ;; + esac echo "::set-output name=image::${DOCKER_REPO:-'local'}/$image:${git_sha1}" done echo "backend build completed" diff --git a/backend/cmd/Dockerfile b/backend/cmd/Dockerfile new file mode 100644 index 000000000..e2f611afa --- /dev/null +++ b/backend/cmd/Dockerfile @@ -0,0 +1,60 @@ +FROM golang:1.18-alpine3.15 AS prepare + +RUN apk add --no-cache git openssh openssl-dev pkgconf gcc g++ make libc-dev bash + +WORKDIR /root + +COPY go.mod . +COPY go.sum . +RUN go mod download + + +FROM prepare AS build +COPY pkg pkg +COPY services services +COPY internal internal +COPY cmd cmd + +ARG SERVICE_NAME +RUN CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o service -tags musl openreplay/backend/cmd/$SERVICE_NAME + +FROM alpine +RUN apk add --no-cache ca-certificates + +ENV TZ=UTC \ + FS_ULIMIT=1000 \ + FS_DIR=/mnt/efs \ + MAXMINDDB_FILE=/root/geoip.mmdb \ + UAPARSER_FILE=/root/regexes.yaml \ + HTTP_PORT=80 \ + BEACON_SIZE_LIMIT=7000000 \ + KAFKA_USE_SSL=true \ + KAFKA_MAX_POLL_INTERVAL_MS=400000 \ + REDIS_STREAMS_MAX_LEN=3000 \ + TOPIC_RAW_WEB=raw \ + TOPIC_RAW_IOS=raw-ios \ + TOPIC_CACHE=cache \ + TOPIC_ANALYTICS=analytics \ + TOPIC_TRIGGER=trigger \ + GROUP_SINK=sink \ + GROUP_STORAGE=storage \ + GROUP_DB=db \ + GROUP_ENDER=ender \ + GROUP_CACHE=cache \ + AWS_REGION_WEB=eu-central-1 \ + AWS_REGION_IOS=eu-west-1 \ + AWS_REGION_ASSETS=eu-central-1 \ + CACHE_ASSETS=true \ + ASSETS_SIZE_LIMIT=6291456 \ + FS_CLEAN_HRS=72 \ + LOG_QUEUE_STATS_INTERVAL_SEC=60 + + +ARG SERVICE_NAME +RUN if [ "$SERVICE_NAME" = "http" ]; then \ + wget https://raw.githubusercontent.com/ua-parser/uap-core/master/regexes.yaml -O "$UAPARSER_FILE" &&\ + wget https://static.openreplay.com/geoip/GeoLite2-Country.mmdb -O "$MAXMINDDB_FILE"; fi + + +COPY --from=build /root/service /root/service +ENTRYPOINT /root/service diff --git a/backend/services/http/build_hack b/backend/services/http/build_hack new file mode 100644 index 000000000..e69de29bb From 18e932e5e97e6029728a27c727ea2682788e97e7 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Tue, 3 May 2022 12:26:42 +0200 Subject: [PATCH 041/260] feat(ui) - session settings - capture rate api update --- .../BugFinder/SessionsMenu/SessionsMenu.js | 15 +- .../components/Client/Sites/NewSiteForm.js | 1 - frontend/app/components/Modal/Modal.js | 4 +- .../app/components/Modal/ModalOverlay.css | 21 +++ .../app/components/Modal/ModalOverlay.tsx | 5 +- frontend/app/components/Modal/index.tsx | 4 +- .../Session_/Player/Controls/Controls.js | 4 +- .../app/components/shared/Select/Select.tsx | 7 +- .../shared/SessionItem/SessionItem.js | 3 - .../shared/SessionItem/SessionItem.tsx | 164 ++++++++++++++++++ .../SessionMetaList/SessionMetaList.tsx | 2 +- .../shared/SessionItem/sessionItem.css | 23 +-- .../components/CaptureRate.tsx | 32 +++- .../components/DefaultTimezone.tsx | 17 +- .../components/ListingVisibility.tsx | 19 +- frontend/app/constants/index.js | 1 + frontend/app/constants/storageKeys.ts | 3 + frontend/app/duck/search.js | 23 +++ frontend/app/mstore/index.tsx | 3 +- frontend/app/mstore/settingsStore.ts | 31 +++- frontend/app/mstore/types/sessionSettings.ts | 28 ++- .../StatedScreen/Screen/Cursor.ts | 1 - frontend/app/player/Player.ts | 2 +- frontend/app/services/SessionService.ts | 23 +++ frontend/app/services/index.ts | 4 +- 25 files changed, 366 insertions(+), 74 deletions(-) create mode 100644 frontend/app/components/shared/SessionItem/SessionItem.tsx create mode 100644 frontend/app/constants/storageKeys.ts create mode 100644 frontend/app/services/SessionService.ts diff --git a/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js b/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js index 978eb0003..36dd5f83f 100644 --- a/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js +++ b/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js @@ -20,9 +20,9 @@ function SessionsMenu(props) { const capturingAll = props.captureRate && props.captureRate.get('captureAll'); - useEffect(() => { - showModal(, {}); - }, []) + // useEffect(() => { + // showModal(, {}); + // }, []) return (
    @@ -30,8 +30,8 @@ function SessionsMenu(props) {
    Sessions
    - {capturingAll && Manage} - { !capturingAll && ( + showModal(, { right: true })}>Manage + {/* { !capturingAll && ( - )} + )} */}
    + {/*
    showModal(, {})}> + Capture, Listing, and Timezone Settings +
    */}
    + {component} , document.querySelector("#modal-root"), diff --git a/frontend/app/components/Modal/ModalOverlay.css b/frontend/app/components/Modal/ModalOverlay.css index e3e33562a..806b59137 100644 --- a/frontend/app/components/Modal/ModalOverlay.css +++ b/frontend/app/components/Modal/ModalOverlay.css @@ -7,13 +7,26 @@ /* transition: all 0.3s ease-in-out; */ animation: fade 1s forwards; } + .slide { position: absolute; + /* left: -100%; */ + /* -webkit-animation: slide 0.5s forwards; + animation: slide 0.5s forwards; */ +} + +.slideLeft { left: -100%; -webkit-animation: slide 0.5s forwards; animation: slide 0.5s forwards; } +.slideRight { + right: -100%; + -webkit-animation: slideRight 0.5s forwards; + animation: slideRight 0.5s forwards; +} + @keyframes fade { 0% { opacity: 0; @@ -29,4 +42,12 @@ @keyframes slide { 100% { left: 0; } +} + +@-webkit-keyframes slideRight { + 100% { right: 0; } +} + +@keyframes slideRight { + 100% { right: 0%; } } \ No newline at end of file diff --git a/frontend/app/components/Modal/ModalOverlay.tsx b/frontend/app/components/Modal/ModalOverlay.tsx index ef46024e1..270840a65 100644 --- a/frontend/app/components/Modal/ModalOverlay.tsx +++ b/frontend/app/components/Modal/ModalOverlay.tsx @@ -1,8 +1,9 @@ import React from 'react'; import { useModal } from 'App/components/Modal'; import stl from './ModalOverlay.css' +import cn from 'classnames'; -function ModalOverlay({ children }) { +function ModalOverlay({ children, left = false, right = false }) { let modal = useModal(); return ( @@ -12,7 +13,7 @@ function ModalOverlay({ children }) { className={stl.overlay} style={{ background: "rgba(0,0,0,0.5)" }} /> -
    {children}
    +
    {children}
    ); } diff --git a/frontend/app/components/Modal/index.tsx b/frontend/app/components/Modal/index.tsx index a653ed24f..339a79fbd 100644 --- a/frontend/app/components/Modal/index.tsx +++ b/frontend/app/components/Modal/index.tsx @@ -4,7 +4,9 @@ import Modal from './Modal'; const ModalContext = createContext({ component: null, - props: {}, + props: { + right: false, + }, showModal: (component: any, props: any) => {}, hideModal: () => {} }); diff --git a/frontend/app/components/Session_/Player/Controls/Controls.js b/frontend/app/components/Session_/Player/Controls/Controls.js index ab1baba3e..abbf40803 100644 --- a/frontend/app/components/Session_/Player/Controls/Controls.js +++ b/frontend/app/components/Session_/Player/Controls/Controls.js @@ -276,13 +276,13 @@ export default class Controls extends React.Component { label="Back" icon="replay-10" /> - + /> */}
    )} diff --git a/frontend/app/components/shared/Select/Select.tsx b/frontend/app/components/shared/Select/Select.tsx index c4523cf25..85418f5fc 100644 --- a/frontend/app/components/shared/Select/Select.tsx +++ b/frontend/app/components/shared/Select/Select.tsx @@ -4,11 +4,11 @@ import Select from 'react-select'; interface Props { options: any[]; isSearchable?: boolean; - defaultValue?: any; + defaultValue?: string; plain?: boolean; [x:string]: any; } -export default function({ plain = false, options, isSearchable = false, defaultValue, ...rest }: Props) { +export default function({ plain = false, options, isSearchable = false, defaultValue = '', ...rest }: Props) { const customStyles = { option: (provided, state) => ({ ...provided, @@ -39,11 +39,12 @@ export default function({ plain = false, options, isSearchable = false, defaultV return { ...provided, opacity, transition }; } } + const defaultSelected = defaultValue ? options.find(x => x.value === defaultValue) : options[0]; return ( { - sessionSettings.updateKey('timezone', value); + defaultValue={timezone} + className="w-full" + onChange={({ value }) => { + setTimezone(value); setChanged(true); }} />
    diff --git a/frontend/app/components/shared/SessionSettings/components/ListingVisibility.tsx b/frontend/app/components/shared/SessionSettings/components/ListingVisibility.tsx index 1779a2e01..d9f137daa 100644 --- a/frontend/app/components/shared/SessionSettings/components/ListingVisibility.tsx +++ b/frontend/app/components/shared/SessionSettings/components/ListingVisibility.tsx @@ -14,9 +14,9 @@ const periodOptions = [ ] function ListingVisibility(props) { + const [changed, setChanged] = React.useState(false); const { settingsStore } = useStore(); const sessionSettings = useObserver(() => settingsStore.sessionSettings) - const [changed, setChanged] = React.useState(false); const [durationSettings, setDurationSettings] = React.useState(sessionSettings.durationFilter); return ( @@ -24,28 +24,41 @@ function ListingVisibility(props) {

    Listing Visibility

    Do not show sessions duration with.
    -
    +
    { + setDurationSettings({ ...durationSettings, count: value }); + setChanged(true); + }} />
    +
    + )); +} + +export default UserSearch; \ No newline at end of file diff --git a/frontend/app/components/Client/Users/components/UserSearch/index.ts b/frontend/app/components/Client/Users/components/UserSearch/index.ts new file mode 100644 index 000000000..3810a4030 --- /dev/null +++ b/frontend/app/components/Client/Users/components/UserSearch/index.ts @@ -0,0 +1 @@ +export { default } from './UserSearch'; \ No newline at end of file diff --git a/frontend/app/mstore/index.tsx b/frontend/app/mstore/index.tsx index f72972121..dc6560c93 100644 --- a/frontend/app/mstore/index.tsx +++ b/frontend/app/mstore/index.tsx @@ -1,19 +1,22 @@ import React from 'react'; import DashboardStore, { IDashboardSotre } from './dashboardStore'; import MetricStore, { IMetricStore } from './metricStore'; +import UserStore from './userStore'; import APIClient from 'App/api_client'; -import { dashboardService, metricService, sessionService } from 'App/services'; +import { dashboardService, metricService, sessionService, userService } from 'App/services'; import SettingsStore from './settingsStore'; export class RootStore { dashboardStore: IDashboardSotre; metricStore: IMetricStore; settingsStore: SettingsStore; + userStore: UserStore; constructor() { this.dashboardStore = new DashboardStore(); this.metricStore = new MetricStore(); this.settingsStore = new SettingsStore(); + this.userStore = new UserStore(); } initClient() { @@ -21,6 +24,7 @@ export class RootStore { dashboardService.initClient(client) metricService.initClient(client) sessionService.initClient(client) + userService.initClient(client) } } diff --git a/frontend/app/mstore/types/user.ts b/frontend/app/mstore/types/user.ts new file mode 100644 index 000000000..88b168624 --- /dev/null +++ b/frontend/app/mstore/types/user.ts @@ -0,0 +1,70 @@ +import { runInAction, makeAutoObservable, observable } from 'mobx' +import { DateTime } from 'luxon'; +export interface IUser { + userId: string + email: string + createdAt: string + isAdmin: boolean + isSuperAdmin: boolean + isJoined: boolean + isExpiredInvite: boolean + roleId: string + roleName: string + invitationLink: string + + fromJson(json: any): IUser + toJson(): any +} + +export default class User { + userId: string = ''; + email: string = ''; + createdAt: string = ''; + isAdmin: boolean = false; + isSuperAdmin: boolean = false; + isJoined: boolean = false; + isExpiredInvite: boolean = false; + roleId: string = ''; + roleName: string = ''; + invitationLink: string = ''; + + constructor() { + makeAutoObservable(this, { + userId: observable, + email: observable, + createdAt: observable, + isAdmin: observable, + isSuperAdmin: observable, + isJoined: observable, + isExpiredInvite: observable, + roleId: observable, + roleName: observable, + invitationLink: observable, + }) + } + + fromJson(json: any) { + runInAction(() => { + this.userId = json.id; + this.email = json.email; + this.createdAt = json.createdAt && DateTime.fromISO(json.createdAt || 0) + this.isAdmin = json.admin + this.isSuperAdmin = json.superAdmin + this.isJoined = json.joined + this.isExpiredInvite = json.expiredInvitation + this.roleId = json.roleId + this.roleName = json.roleName + this.invitationLink = json.invitationLink + }) + return this; + } + + toJson() { + return { + email: this.email, + isAdmin: this.isAdmin, + isSuperAdmin: this.isSuperAdmin, + roleId: this.roleId, + } + } +} \ No newline at end of file diff --git a/frontend/app/mstore/userStore.ts b/frontend/app/mstore/userStore.ts new file mode 100644 index 000000000..a0c004f82 --- /dev/null +++ b/frontend/app/mstore/userStore.ts @@ -0,0 +1,98 @@ +import { makeAutoObservable, observable, action } from "mobx" +import User, { IUser } from "./types/user"; +import { userService } from "App/services"; + +export default class UserStore { + list: IUser[] = []; + instance: IUser|null = null; + loading: boolean = false; + page: number = 1; + pageSize: number = 5; + searchQuery: string = ""; + + constructor() { + makeAutoObservable(this, { + instance: observable, + updateUser: action, + updateKey: action, + }) + } + + updateKey(key: string, value: any) { + this[key] = value + } + + updateUser(user: any) { + Object.assign(this.instance, user); + } + + fetchUser(userId: string): Promise { + this.loading = true; + return new Promise((resolve, reject) => { + userService.one(userId) + .then(response => { + this.instance = new User().fromJson(response.data); + resolve(response); + }).catch(error => { + this.loading = false; + reject(error); + }).finally(() => { + this.loading = false; + }); + }); + } + + fetchUsers(): Promise { + this.loading = true; + return new Promise((resolve, reject) => { + userService.all() + .then(response => { + console.log('list', response); + this.list = response.map(user => new User().fromJson(user)); + resolve(response); + }).catch(error => { + this.loading = false; + reject(error); + }).finally(() => { + this.loading = false; + }); + }); + } + + saveUser(user: IUser): Promise { + this.loading = true; + const wasCreating = !user.userId; + return new Promise((resolve, reject) => { + userService.save(user) + .then(response => { + if (wasCreating) { + this.list.push(new User().fromJson(response.data)); + } else { + this.updateUser(response.data); + } + resolve(response); + }).catch(error => { + this.loading = false; + reject(error); + }).finally(() => { + this.loading = false; + }); + }); + } + + deleteUser(userId: string): Promise { + this.loading = true; + return new Promise((resolve, reject) => { + userService.delete(userId) + .then(response => { + this.instance = null; + resolve(response); + }).catch(error => { + this.loading = false; + reject(error); + }).finally(() => { + this.loading = false; + }); + }); + } +} \ No newline at end of file diff --git a/frontend/app/services/UserService.ts b/frontend/app/services/UserService.ts new file mode 100644 index 000000000..3cdead002 --- /dev/null +++ b/frontend/app/services/UserService.ts @@ -0,0 +1,45 @@ +import APIClient from 'App/api_client'; +import { IUser } from 'App/mstore/types/user' + +export default class UserService { + private client: APIClient; + + constructor(client?: APIClient) { + this.client = client ? client : new APIClient(); + } + + initClient(client?: APIClient) { + this.client = client || new APIClient(); + } + + all() { + return this.client.get('/client/members') + .then(response => response.json()) + .then(response => response.data || []); + } + + one(userId: string) { + return this.client.get('/users/' + userId) + .then(response => response.json()) + .then(response => response.data || {}); + } + + save(user: IUser) { + const data = user.toJson(); + if (user.userId) { + return this.client.put('/users/' + user.userId, data) + .then(response => response.json()) + .then(response => response.data || {}); + } else { + return this.client.post('/users', data) + .then(response => response.json()) + .then(response => response.data || {}); + } + } + + delete(userId: string) { + return this.client.delete('/users/' + userId) + .then(response => response.json()) + .then(response => response.data || {}); + } +} \ No newline at end of file diff --git a/frontend/app/services/index.ts b/frontend/app/services/index.ts index e721e0f10..3cb64a7ad 100644 --- a/frontend/app/services/index.ts +++ b/frontend/app/services/index.ts @@ -1,7 +1,9 @@ import DashboardService, { IDashboardService } from "./DashboardService"; import MetricService, { IMetricService } from "./MetricService"; import SessionSerivce from "./SessionService"; +import UserService from "./UserService"; export const dashboardService: IDashboardService = new DashboardService(); export const metricService: IMetricService = new MetricService(); -export const sessionService: SessionSerivce = new SessionSerivce(); \ No newline at end of file +export const sessionService: SessionSerivce = new SessionSerivce(); +export const userService: UserService = new UserService(); \ No newline at end of file From 424b071eafb18d0eb14a00f62c59ab4ac4426cc2 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Wed, 4 May 2022 13:14:20 +0200 Subject: [PATCH 051/260] change(ui) - users list - search and pagination --- .../Users/components/UserList/UserList.tsx | 67 +++++++++++-------- .../components/UserListItem/UserListItem.tsx | 2 +- frontend/app/mstore/userStore.ts | 7 +- 3 files changed, 46 insertions(+), 30 deletions(-) diff --git a/frontend/app/components/Client/Users/components/UserList/UserList.tsx b/frontend/app/components/Client/Users/components/UserList/UserList.tsx index c9c557b22..448e7c95e 100644 --- a/frontend/app/components/Client/Users/components/UserList/UserList.tsx +++ b/frontend/app/components/Client/Users/components/UserList/UserList.tsx @@ -2,12 +2,24 @@ import { useStore } from 'App/mstore'; import { useObserver } from 'mobx-react-lite'; import React, { useEffect } from 'react'; import UserListItem from '../UserListItem'; -import { sliceListPerPage } from 'App/utils'; -import { Pagination } from 'UI'; +import { sliceListPerPage, getRE } from 'App/utils'; +import { Pagination, NoContent, Loader } from 'UI'; function UserList(props) { const { userStore } = useStore(); - const list = useObserver(() => userStore.list); + const loading = useObserver(() => userStore.loading); + const users = useObserver(() => userStore.list); + const searchQuery = useObserver(() => userStore.searchQuery); + + const filterList = (list) => { + const filterRE = getRE(searchQuery, 'i'); + let _list = list.filter(w => { + return filterRE.test(w.email) || filterRE.test(w.roleName); + }); + return _list + } + + const list: any = searchQuery !== '' ? filterList(users) : users; const length = list.length; useEffect(() => { @@ -15,32 +27,33 @@ function UserList(props) { }, []); return useObserver(() => ( -
    -
    -
    -
    Name
    -
    Role
    -
    + + +
    +
    +
    Name
    +
    Role
    +
    +
    + + {sliceListPerPage(list, userStore.page - 1, userStore.pageSize).map((user: any) => ( +
    + +
    + ))}
    - {sliceListPerPage(list, userStore.page - 1, userStore.pageSize).map((user: any) => ( -
    - -
    - ))} -
    - -
    - userStore.updateKey('page', page)} - limit={userStore.pageSize} - debounceRequest={100} - /> -
    - -
    +
    + userStore.updateKey('page', page)} + limit={userStore.pageSize} + debounceRequest={100} + /> +
    + + )); } diff --git a/frontend/app/components/Client/Users/components/UserListItem/UserListItem.tsx b/frontend/app/components/Client/Users/components/UserListItem/UserListItem.tsx index ad991da9a..8d402ed47 100644 --- a/frontend/app/components/Client/Users/components/UserListItem/UserListItem.tsx +++ b/frontend/app/components/Client/Users/components/UserListItem/UserListItem.tsx @@ -6,7 +6,7 @@ interface Props { function UserListItem(props: Props) { const { user } = props; return ( -
    +
    {user.email}
    diff --git a/frontend/app/mstore/userStore.ts b/frontend/app/mstore/userStore.ts index a0c004f82..170055412 100644 --- a/frontend/app/mstore/userStore.ts +++ b/frontend/app/mstore/userStore.ts @@ -7,7 +7,7 @@ export default class UserStore { instance: IUser|null = null; loading: boolean = false; page: number = 1; - pageSize: number = 5; + pageSize: number = 10; searchQuery: string = ""; constructor() { @@ -20,6 +20,10 @@ export default class UserStore { updateKey(key: string, value: any) { this[key] = value + + if (key === 'searchQuery') { + this.page = 1 + } } updateUser(user: any) { @@ -47,7 +51,6 @@ export default class UserStore { return new Promise((resolve, reject) => { userService.all() .then(response => { - console.log('list', response); this.list = response.map(user => new User().fromJson(user)); resolve(response); }).catch(error => { From 9cdb1e8ab753a4fea695bd13e4348f88c32b027f Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Wed, 4 May 2022 14:21:15 +0200 Subject: [PATCH 052/260] Removed global pg connection --- backend/services/db/main.go | 17 +++++----- backend/services/db/messages.go | 57 +++++++++++++++++++-------------- backend/services/db/stats.go | 17 ++++++---- 3 files changed, 53 insertions(+), 38 deletions(-) diff --git a/backend/services/db/main.go b/backend/services/db/main.go index 2ad6e4aa8..50e160342 100644 --- a/backend/services/db/main.go +++ b/backend/services/db/main.go @@ -18,16 +18,17 @@ import ( "openreplay/backend/services/db/heuristics" ) -var pg *cache.PGCache - func main() { log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) - initStats() - pg = cache.NewPGCache(postgres.NewConn(env.String("POSTGRES_STRING")), 1000*60*20) + // Init database + pg := cache.NewPGCache(postgres.NewConn(env.String("POSTGRES_STRING")), 1000*60*20) defer pg.Close() + // Init modules heurFinder := heuristics.NewHandler() + mi := NewMessageInserter(pg) + si := NewStatsInserter(pg) statsLogger := logger.NewQueueStats(env.Int("LOG_QUEUE_STATS_INTERVAL_SEC")) @@ -40,7 +41,7 @@ func main() { func(sessionID uint64, msg messages.Message, meta *types.Meta) { statsLogger.HandleAndLog(sessionID, meta) - if err := insertMessage(sessionID, msg); err != nil { + if err := mi.insertMessage(sessionID, msg); err != nil { if !postgres.IsPkeyViolation(err) { log.Printf("Message Insertion Error %v, SessionID: %v, Message: %v", err, sessionID, msg) } @@ -54,7 +55,7 @@ func main() { return } - err = insertStats(session, msg) + err = si.insertStats(session, msg) if err != nil { log.Printf("Stats Insertion Error %v; Session: %v, Message: %v", err, session, msg) } @@ -62,14 +63,14 @@ func main() { heurFinder.HandleMessage(session, msg) heurFinder.IterateSessionReadyMessages(sessionID, func(msg messages.Message) { // TODO: DRY code (carefully with the return statement logic) - if err := insertMessage(sessionID, msg); err != nil { + if err := mi.insertMessage(sessionID, msg); err != nil { if !postgres.IsPkeyViolation(err) { log.Printf("Message Insertion Error %v; Session: %v, Message %v", err, session, msg) } return } - if err := insertStats(session, msg); err != nil { + if err := si.insertStats(session, msg); err != nil { log.Printf("Stats Insertion Error %v; Session: %v, Message %v", err, session, msg) } }) diff --git a/backend/services/db/messages.go b/backend/services/db/messages.go index d3e4ae1ed..2adca61c8 100644 --- a/backend/services/db/messages.go +++ b/backend/services/db/messages.go @@ -1,68 +1,77 @@ package main import ( + "openreplay/backend/pkg/db/cache" . "openreplay/backend/pkg/messages" ) -func insertMessage(sessionID uint64, msg Message) error { +type MessageInserter struct { + pg *cache.PGCache +} + +func NewMessageInserter(pg *cache.PGCache) *MessageInserter { + return &MessageInserter{pg: pg} +} + +func (mi *MessageInserter) insertMessage(sessionID uint64, msg Message) error { switch m := msg.(type) { // Common case *Metadata: - return pg.InsertMetadata(sessionID, m) + return mi.pg.InsertMetadata(sessionID, m) case *IssueEvent: - return pg.InsertIssueEvent(sessionID, m) + return mi.pg.InsertIssueEvent(sessionID, m) //TODO: message adapter (transformer) (at the level of pkg/message) for types: // case *IOSMetadata, *IOSIssueEvent and others // Web case *SessionStart: - return pg.InsertWebSessionStart(sessionID, m) + return mi.pg.InsertWebSessionStart(sessionID, m) case *SessionEnd: - return pg.InsertWebSessionEnd(sessionID, m) + return mi.pg.InsertWebSessionEnd(sessionID, m) case *UserID: - return pg.InsertWebUserID(sessionID, m) + return mi.pg.InsertWebUserID(sessionID, m) case *UserAnonymousID: - return pg.InsertWebUserAnonymousID(sessionID, m) + return mi.pg.InsertWebUserAnonymousID(sessionID, m) case *CustomEvent: - return pg.InsertWebCustomEvent(sessionID, m) + return mi.pg.InsertWebCustomEvent(sessionID, m) case *ClickEvent: - return pg.InsertWebClickEvent(sessionID, m) + return mi.pg.InsertWebClickEvent(sessionID, m) case *InputEvent: - return pg.InsertWebInputEvent(sessionID, m) + return mi.pg.InsertWebInputEvent(sessionID, m) // Unique Web messages // case *ResourceEvent: // return pg.InsertWebResourceEvent(sessionID, m) case *PageEvent: - return pg.InsertWebPageEvent(sessionID, m) + return mi.pg.InsertWebPageEvent(sessionID, m) case *ErrorEvent: - return pg.InsertWebErrorEvent(sessionID, m) + return mi.pg.InsertWebErrorEvent(sessionID, m) case *FetchEvent: - return pg.InsertWebFetchEvent(sessionID, m) + return mi.pg.InsertWebFetchEvent(sessionID, m) case *GraphQLEvent: - return pg.InsertWebGraphQLEvent(sessionID, m) + return mi.pg.InsertWebGraphQLEvent(sessionID, m) // IOS case *IOSSessionStart: - return pg.InsertIOSSessionStart(sessionID, m) + return mi.pg.InsertIOSSessionStart(sessionID, m) case *IOSSessionEnd: - return pg.InsertIOSSessionEnd(sessionID, m) + return mi.pg.InsertIOSSessionEnd(sessionID, m) case *IOSUserID: - return pg.InsertIOSUserID(sessionID, m) + return mi.pg.InsertIOSUserID(sessionID, m) case *IOSUserAnonymousID: - return pg.InsertIOSUserAnonymousID(sessionID, m) + return mi.pg.InsertIOSUserAnonymousID(sessionID, m) case *IOSCustomEvent: - return pg.InsertIOSCustomEvent(sessionID, m) + return mi.pg.InsertIOSCustomEvent(sessionID, m) case *IOSClickEvent: - return pg.InsertIOSClickEvent(sessionID, m) + return mi.pg.InsertIOSClickEvent(sessionID, m) case *IOSInputEvent: - return pg.InsertIOSInputEvent(sessionID, m) + return mi.pg.InsertIOSInputEvent(sessionID, m) // Unique IOS messages case *IOSNetworkCall: - return pg.InsertIOSNetworkCall(sessionID, m) + return mi.pg.InsertIOSNetworkCall(sessionID, m) case *IOSScreenEnter: - return pg.InsertIOSScreenEnter(sessionID, m) + return mi.pg.InsertIOSScreenEnter(sessionID, m) case *IOSCrash: - return pg.InsertIOSCrash(sessionID, m) + return mi.pg.InsertIOSCrash(sessionID, m) } return nil // "Not implemented" } diff --git a/backend/services/db/stats.go b/backend/services/db/stats.go index 2c3a5da38..7069b8656 100644 --- a/backend/services/db/stats.go +++ b/backend/services/db/stats.go @@ -1,23 +1,28 @@ package main import ( + "openreplay/backend/pkg/db/cache" . "openreplay/backend/pkg/db/types" . "openreplay/backend/pkg/messages" ) -func initStats() { - // noop +type StatsInserter struct { + pg *cache.PGCache } -func insertStats(session *Session, msg Message) error { +func NewStatsInserter(pg *cache.PGCache) *StatsInserter { + return &StatsInserter{pg: pg} +} + +func (si *StatsInserter) insertStats(session *Session, msg Message) error { switch m := msg.(type) { // Web case *PerformanceTrackAggr: - return pg.InsertWebStatsPerformance(session.SessionID, m) + return si.pg.InsertWebStatsPerformance(session.SessionID, m) case *ResourceEvent: - return pg.InsertWebStatsResourceEvent(session.SessionID, m) + return si.pg.InsertWebStatsResourceEvent(session.SessionID, m) case *LongTask: - return pg.InsertWebStatsLongtask(session.SessionID, m) + return si.pg.InsertWebStatsLongtask(session.SessionID, m) // IOS // case *IOSPerformanceAggregated: From 74672d4321cbaa67abc52cacd1bf9a11f27e52e0 Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Wed, 4 May 2022 14:36:42 +0200 Subject: [PATCH 053/260] Removed unused code --- backend/services/db/heuristics/anr.go | 2 -- backend/services/db/heuristics/clickrage.go | 2 -- backend/services/db/main.go | 3 --- backend/services/db/messages.go | 8 +++----- backend/services/db/stats.go | 10 ---------- 5 files changed, 3 insertions(+), 22 deletions(-) diff --git a/backend/services/db/heuristics/anr.go b/backend/services/db/heuristics/anr.go index 0475b00be..7cec8fc97 100644 --- a/backend/services/db/heuristics/anr.go +++ b/backend/services/db/heuristics/anr.go @@ -18,8 +18,6 @@ func (h *anr) buildIf(timestamp uint64) { m := &IOSIssueEvent{ Type: "anr", ContextString: h.lastLabel, - //Context: "{}", - //Payload: fmt.SPrint } m.Timestamp = h.lastHeartbeatTimestamp m.Index = h.lastHeartbeatIndex // Associated Index/ MessageID ? diff --git a/backend/services/db/heuristics/clickrage.go b/backend/services/db/heuristics/clickrage.go index 9a1db92d5..4d19bf92e 100644 --- a/backend/services/db/heuristics/clickrage.go +++ b/backend/services/db/heuristics/clickrage.go @@ -21,8 +21,6 @@ func (h *clickrage) build() { m := &IOSIssueEvent{ Type: "click_rage", ContextString: h.lastLabel, - //Context: "{}", - //Payload: fmt.SPrint } m.Timestamp = h.firstInARawTimestamp m.Index = h.firstInARawSeqIndex // Associated Index/ MessageID ? diff --git a/backend/services/db/main.go b/backend/services/db/main.go index 50e160342..600913120 100644 --- a/backend/services/db/main.go +++ b/backend/services/db/main.go @@ -92,9 +92,6 @@ func main() { os.Exit(0) case <-tick: pg.CommitBatches() - if err := commitStats(); err != nil { - log.Printf("Error on stats commit: %v", err) - } // TODO?: separate stats & regular messages if err := consumer.Commit(); err != nil { log.Printf("Error on consumer commit: %v", err) diff --git a/backend/services/db/messages.go b/backend/services/db/messages.go index 2adca61c8..1a583ae6a 100644 --- a/backend/services/db/messages.go +++ b/backend/services/db/messages.go @@ -20,8 +20,7 @@ func (mi *MessageInserter) insertMessage(sessionID uint64, msg Message) error { return mi.pg.InsertMetadata(sessionID, m) case *IssueEvent: return mi.pg.InsertIssueEvent(sessionID, m) - //TODO: message adapter (transformer) (at the level of pkg/message) for types: - // case *IOSMetadata, *IOSIssueEvent and others + //TODO: message adapter (transformer) (at the level of pkg/message) for types: *IOSMetadata, *IOSIssueEvent and others // Web case *SessionStart: @@ -38,9 +37,8 @@ func (mi *MessageInserter) insertMessage(sessionID uint64, msg Message) error { return mi.pg.InsertWebClickEvent(sessionID, m) case *InputEvent: return mi.pg.InsertWebInputEvent(sessionID, m) - // Unique Web messages - // case *ResourceEvent: - // return pg.InsertWebResourceEvent(sessionID, m) + + // Unique Web messages case *PageEvent: return mi.pg.InsertWebPageEvent(sessionID, m) case *ErrorEvent: diff --git a/backend/services/db/stats.go b/backend/services/db/stats.go index 7069b8656..a2c2024fb 100644 --- a/backend/services/db/stats.go +++ b/backend/services/db/stats.go @@ -23,16 +23,6 @@ func (si *StatsInserter) insertStats(session *Session, msg Message) error { return si.pg.InsertWebStatsResourceEvent(session.SessionID, m) case *LongTask: return si.pg.InsertWebStatsLongtask(session.SessionID, m) - - // IOS - // case *IOSPerformanceAggregated: - // return pg.InsertIOSPerformanceAggregated(session, m) - // case *IOSNetworkCall: - // return pg.InsertIOSNetworkCall(session, m) } return nil } - -func commitStats() error { - return nil -} From 5b7c479f4dfc5f5b2517d31baab86a2d06c15c10 Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Wed, 4 May 2022 16:17:57 +0200 Subject: [PATCH 054/260] Refactoring in stats logger --- backend/pkg/log/queue.go | 42 +++++++++-------- backend/services/db/main.go | 82 ++++++++++++++++++---------------- backend/services/ender/main.go | 2 +- 3 files changed, 68 insertions(+), 58 deletions(-) diff --git a/backend/pkg/log/queue.go b/backend/pkg/log/queue.go index 62e47cbbe..ced815bd2 100644 --- a/backend/pkg/log/queue.go +++ b/backend/pkg/log/queue.go @@ -5,7 +5,6 @@ import ( "log" "time" - "openreplay/backend/pkg/messages" "openreplay/backend/pkg/queue/types" //"openreplay/backend/pkg/env" ) @@ -18,6 +17,19 @@ type partitionStats struct { count int } +// Update partition statistic +func (prt *partitionStats) update(m *types.Meta) { + if prt.maxts < m.Timestamp { + prt.maxts = m.Timestamp + } + if prt.mints > m.Timestamp || prt.mints == 0 { + prt.mints = m.Timestamp + } + prt.lastts = m.Timestamp + prt.lastID = m.ID + prt.count += 1 +} + type queueStats struct { prts map[int32]*partitionStats tick <-chan time.Time @@ -30,43 +42,35 @@ func NewQueueStats(sec int) *queueStats { } } -func (qs *queueStats) HandleAndLog(sessionID uint64, m *types.Meta) { +// Collect writes new data to partition statistic +func (qs *queueStats) Collect(sessionID uint64, m *types.Meta) { prti := int32(sessionID % 16) // TODO use GetKeyPartition from kafka/key.go prt, ok := qs.prts[prti] if !ok { qs.prts[prti] = &partitionStats{} prt = qs.prts[prti] } - - if prt.maxts < m.Timestamp { - prt.maxts = m.Timestamp - } - if prt.mints > m.Timestamp || prt.mints == 0 { - prt.mints = m.Timestamp - } - prt.lastts = m.Timestamp - prt.lastID = m.ID - prt.count += 1 + prt.update(m) select { case <-qs.tick: - qs.LogThenReset() + qs.log() + qs.reset() default: } } -func (qs *queueStats) LogThenReset() { +// Print to console collected statistics +func (qs *queueStats) log() { s := "Queue Statistics: " for i, p := range qs.prts { s = fmt.Sprintf("%v | %v:: lastTS %v, lastID %v, count %v, maxTS %v, minTS %v", s, i, p.lastts, p.lastID, p.count, p.maxts, p.mints) } log.Println(s) - // reset - qs.prts = make(map[int32]*partitionStats) } -// TODO: list of message id to log (mb filter function with callback in messages/utils.go or something) -func LogMessage(s string, sessionID uint64, msg messages.Message, m *types.Meta) { - log.Printf("%v | SessionID: %v, Queue info: %v, Message: %v", s, sessionID, m, msg) +// Clear all queue partitions +func (qs *queueStats) reset() { + qs.prts = make(map[int32]*partitionStats) } diff --git a/backend/services/db/main.go b/backend/services/db/main.go index 600913120..619e6816e 100644 --- a/backend/services/db/main.go +++ b/backend/services/db/main.go @@ -29,52 +29,58 @@ func main() { heurFinder := heuristics.NewHandler() mi := NewMessageInserter(pg) si := NewStatsInserter(pg) - statsLogger := logger.NewQueueStats(env.Int("LOG_QUEUE_STATS_INTERVAL_SEC")) + // Handler logic + handler := func(sessionID uint64, msg messages.Message, meta *types.Meta) { + statsLogger.Collect(sessionID, meta) + + // Just insert message into db without additional checks + if err := mi.insertMessage(sessionID, msg); err != nil { + if !postgres.IsPkeyViolation(err) { + log.Printf("Message Insertion Error %v, SessionID: %v, Message: %v", err, sessionID, msg) + } + return + } + + // Try to get session from db + session, err := pg.GetSession(sessionID) + if err != nil { + // Might happen due to the assets-related message TODO: log only if session is necessary for this kind of message + log.Printf("Error on session retrieving from cache: %v, SessionID: %v, Message: %v", err, sessionID, msg) + return + } + + // Insert statistics + err = si.insertStats(session, msg) + if err != nil { + log.Printf("Stats Insertion Error %v; Session: %v, Message: %v", err, session, msg) + } + + heurFinder.HandleMessage(session, msg) + heurFinder.IterateSessionReadyMessages(sessionID, func(msg messages.Message) { + // TODO: DRY code (carefully with the return statement logic) + if err := mi.insertMessage(sessionID, msg); err != nil { + if !postgres.IsPkeyViolation(err) { + log.Printf("Message Insertion Error %v; Session: %v, Message %v", err, session, msg) + } + return + } + + if err := si.insertStats(session, msg); err != nil { + log.Printf("Stats Insertion Error %v; Session: %v, Message %v", err, session, msg) + } + }) + } + + // Init consumer consumer := queue.NewMessageConsumer( env.String("GROUP_DB"), []string{ env.String("TOPIC_RAW_IOS"), env.String("TOPIC_TRIGGER"), }, - func(sessionID uint64, msg messages.Message, meta *types.Meta) { - statsLogger.HandleAndLog(sessionID, meta) - - if err := mi.insertMessage(sessionID, msg); err != nil { - if !postgres.IsPkeyViolation(err) { - log.Printf("Message Insertion Error %v, SessionID: %v, Message: %v", err, sessionID, msg) - } - return - } - - session, err := pg.GetSession(sessionID) - if err != nil { - // Might happen due to the assets-related message TODO: log only if session is necessary for this kind of message - log.Printf("Error on session retrieving from cache: %v, SessionID: %v, Message: %v", err, sessionID, msg) - return - } - - err = si.insertStats(session, msg) - if err != nil { - log.Printf("Stats Insertion Error %v; Session: %v, Message: %v", err, session, msg) - } - - heurFinder.HandleMessage(session, msg) - heurFinder.IterateSessionReadyMessages(sessionID, func(msg messages.Message) { - // TODO: DRY code (carefully with the return statement logic) - if err := mi.insertMessage(sessionID, msg); err != nil { - if !postgres.IsPkeyViolation(err) { - log.Printf("Message Insertion Error %v; Session: %v, Message %v", err, session, msg) - } - return - } - - if err := si.insertStats(session, msg); err != nil { - log.Printf("Stats Insertion Error %v; Session: %v, Message %v", err, session, msg) - } - }) - }, + handler, false, ) diff --git a/backend/services/ender/main.go b/backend/services/ender/main.go index f2430f3a0..4170a178e 100644 --- a/backend/services/ender/main.go +++ b/backend/services/ender/main.go @@ -35,7 +35,7 @@ func main() { env.String("TOPIC_RAW_IOS"), }, func(sessionID uint64, msg messages.Message, meta *types.Meta) { - statsLogger.HandleAndLog(sessionID, meta) + statsLogger.Collect(sessionID, meta) builderMap.HandleMessage(sessionID, msg, msg.Meta().Index) }, false, From c97fe55cda5af3cdd5ee9ccb5f2ddf99f94abb45 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Wed, 4 May 2022 16:41:29 +0200 Subject: [PATCH 055/260] change(ui) - users list - form --- .../app/components/Client/Users/UsersView.tsx | 11 +- .../Users/components/UserForm/UserForm.tsx | 129 ++++++++++++++++++ .../Client/Users/components/UserForm/index.ts | 1 + .../Users/components/UserList/UserList.tsx | 14 +- .../components/UserListItem/UserListItem.tsx | 14 +- frontend/app/mstore/index.tsx | 3 + frontend/app/mstore/roleStore.ts | 31 +++++ frontend/app/mstore/types/role.ts | 42 ++++++ frontend/app/mstore/types/user.ts | 21 ++- frontend/app/mstore/userStore.ts | 12 ++ frontend/app/services/UserService.ts | 6 + frontend/app/styles/main.css | 11 +- 12 files changed, 275 insertions(+), 20 deletions(-) create mode 100644 frontend/app/components/Client/Users/components/UserForm/UserForm.tsx create mode 100644 frontend/app/components/Client/Users/components/UserForm/index.ts create mode 100644 frontend/app/mstore/roleStore.ts create mode 100644 frontend/app/mstore/types/role.ts diff --git a/frontend/app/components/Client/Users/UsersView.tsx b/frontend/app/components/Client/Users/UsersView.tsx index cb57a9ec6..5b207a468 100644 --- a/frontend/app/components/Client/Users/UsersView.tsx +++ b/frontend/app/components/Client/Users/UsersView.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useEffect } from 'react'; import UserList from './components/UserList'; import { PageTitle } from 'UI'; import { useStore } from 'App/mstore'; @@ -6,8 +6,15 @@ import { useObserver } from 'mobx-react-lite'; import UserSearch from './components/UserSearch'; function UsersView(props) { - const { userStore } = useStore(); + const { userStore, roleStore } = useStore(); const userCount = useObserver(() => userStore.list.length); + const roles = useObserver(() => roleStore.list); + + useEffect(() => { + if (roles.length === 0) { + roleStore.fetchRoles(); + } + }, []); return (
    diff --git a/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx b/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx new file mode 100644 index 000000000..b47a38d50 --- /dev/null +++ b/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx @@ -0,0 +1,129 @@ +import React from 'react'; +import { Input, CopyButton, Button, Select } from 'UI' +import cn from 'classnames'; +import { useStore } from 'App/mstore'; +import { useObserver } from 'mobx-react-lite'; +import { useModal } from 'App/components/Modal'; + +interface Props { + isSmtp?: boolean; + isEnterprise?: boolean; +} +function UserForm(props: Props) { + const { isSmtp = false, isEnterprise = false } = props; + const isSaving = false; + const { hideModal } = useModal(); + const { userStore, roleStore } = useStore(); + const user: any = useObserver(() => userStore.instance); + const roles = useObserver(() => roleStore.list.map(r => ({ label: r.name, value: r.roleId }))); + console.log('roles', roles) + + const onChangeCheckbox = (e: any) => { + user.updateKey('isAdmin', !user.isAdmin); + } + + const onSave = () => { + } + + const write = ({ target: { name, value } }) => { + user.updateKey(name, value); + } + return useObserver(() => ( +
    +
    +

    {`${user.exists() ? 'Update' : 'Invite'} User`}

    +
    +
    +
    + + +
    + +
    + + +
    + { !isSmtp && +
    + SMTP is not configured (see here how to set it up). You can still add new users, but you’d have to manually copy then send them the invitation link. +
    + } +
    + +
    + + { !isEnterprise && ( +
    + +
    @@ -94,6 +93,7 @@ function UserForm(props: Props) { defaultValue={ user.roleId } onChange={({ value }) => user.updateKey('roleId', value)} className="block" + isDisabled={user.isSuperAdmin} />
    )} diff --git a/frontend/app/mstore/types/role.ts b/frontend/app/mstore/types/role.ts index e8204ef22..5d8da871a 100644 --- a/frontend/app/mstore/types/role.ts +++ b/frontend/app/mstore/types/role.ts @@ -4,8 +4,9 @@ export interface IRole { roleId: string; name: string; description: string; + isProtected: boolean; - fromJson(json: any): IRole; + fromJson(json: any); toJson(): any; } @@ -13,6 +14,7 @@ export default class Role implements IRole { roleId: string = ''; name: string = ''; description: string = ''; + isProtected: boolean = false; constructor() { @@ -28,6 +30,7 @@ export default class Role implements IRole { this.roleId = json.roleId; this.name = json.name; this.description = json.description; + this.isProtected = json.protected; }) return this; } diff --git a/frontend/app/mstore/types/user.ts b/frontend/app/mstore/types/user.ts index c8b9dcdd6..609ee3b7f 100644 --- a/frontend/app/mstore/types/user.ts +++ b/frontend/app/mstore/types/user.ts @@ -77,7 +77,7 @@ export default class User implements IUser { name: this.name, email: this.email, admin: this.isAdmin, - isSuperAdmin: this.isSuperAdmin, + superAdmin: this.isSuperAdmin, roleId: this.roleId, } } From 6314fcbbefd67f4d5934d9c7a38248858e79c44d Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Wed, 4 May 2022 20:33:52 +0200 Subject: [PATCH 059/260] feat(backend): 2 files back compatible format --- backend/services/storage/main.go | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/backend/services/storage/main.go b/backend/services/storage/main.go index 9afc7d819..ae4d9a1da 100644 --- a/backend/services/storage/main.go +++ b/backend/services/storage/main.go @@ -8,7 +8,6 @@ import ( "bytes" "io" - //"io/ioutil" "os/signal" "syscall" @@ -47,28 +46,21 @@ func main() { } defer file.Close() - fileR2 := new(bytes.Buffer) - fileR1 := io.TeeReader(file, fileR2) - startBytes := make([]byte, SESSION_FILE_SPLIT_SIZE) - nRead, err := fileR1.Read(startBytes) + nRead, err := file.Read(startBytes) if err != nil { log.Printf("File read error: %f", err) return } startReader := bytes.NewBuffer(startBytes) - if err := storage.Upload(gzipFile(startReader), key+"-s", "application/octet-stream", true); err != nil { + if err := storage.Upload(gzipFile(startReader), key, "application/octet-stream", true); err != nil { log.Fatalf("Storage: start upload failed. %v\n", err) } if nRead == SESSION_FILE_SPLIT_SIZE { - if err := storage.Upload(gzipFile(fileR1), key+"-e", "application/octet-stream", true); err != nil { + if err := storage.Upload(gzipFile(file), key + "e", "application/octet-stream", true); err != nil { log.Fatalf("Storage: end upload failed. %v\n", err) } } - - if err := storage.Upload(gzipFile(fileR2), key, "application/octet-stream", true); err != nil { - log.Fatalf("Storage: upload failed. %v\n", err) - } } consumer := queue.NewMessageConsumer( From 167d1e117e96c285f68611d4866246061b759f03 Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Thu, 5 May 2022 09:45:38 +0200 Subject: [PATCH 060/260] Made correct project layout --- backend/{services => cmd}/db/main.go | 20 +++++++++++-------- .../db => internal/datasaver}/messages.go | 4 ++-- .../db => internal/datasaver}/stats.go | 4 ++-- .../db => internal}/heuristics/anr.go | 0 .../db => internal}/heuristics/clickrage.go | 0 .../db => internal}/heuristics/heuristics.go | 0 .../db => internal}/heuristics/performance.go | 0 .../heuristics/readyMessageStore.go | 0 .../db => internal}/heuristics/session.go | 0 backend/services/db/build_hack | 0 10 files changed, 16 insertions(+), 12 deletions(-) rename backend/{services => cmd}/db/main.go (85%) rename backend/{services/db => internal/datasaver}/messages.go (96%) rename backend/{services/db => internal/datasaver}/stats.go (87%) rename backend/{services/db => internal}/heuristics/anr.go (100%) rename backend/{services/db => internal}/heuristics/clickrage.go (100%) rename backend/{services/db => internal}/heuristics/heuristics.go (100%) rename backend/{services/db => internal}/heuristics/performance.go (100%) rename backend/{services/db => internal}/heuristics/readyMessageStore.go (100%) rename backend/{services/db => internal}/heuristics/session.go (100%) create mode 100644 backend/services/db/build_hack diff --git a/backend/services/db/main.go b/backend/cmd/db/main.go similarity index 85% rename from backend/services/db/main.go rename to backend/cmd/db/main.go index 619e6816e..675c9f975 100644 --- a/backend/services/db/main.go +++ b/backend/cmd/db/main.go @@ -2,6 +2,8 @@ package main import ( "log" + "openreplay/backend/internal/datasaver" + "openreplay/backend/internal/heuristics" "time" "os" @@ -15,7 +17,6 @@ import ( "openreplay/backend/pkg/messages" "openreplay/backend/pkg/queue" "openreplay/backend/pkg/queue/types" - "openreplay/backend/services/db/heuristics" ) func main() { @@ -27,8 +28,8 @@ func main() { // Init modules heurFinder := heuristics.NewHandler() - mi := NewMessageInserter(pg) - si := NewStatsInserter(pg) + mi := datasaver.NewMessageInserter(pg) + si := datasaver.NewStatsInserter(pg) statsLogger := logger.NewQueueStats(env.Int("LOG_QUEUE_STATS_INTERVAL_SEC")) // Handler logic @@ -36,14 +37,14 @@ func main() { statsLogger.Collect(sessionID, meta) // Just insert message into db without additional checks - if err := mi.insertMessage(sessionID, msg); err != nil { + if err := mi.InsertMessage(sessionID, msg); err != nil { if !postgres.IsPkeyViolation(err) { log.Printf("Message Insertion Error %v, SessionID: %v, Message: %v", err, sessionID, msg) } return } - // Try to get session from db + // Try to get session from db for the following handlers session, err := pg.GetSession(sessionID) if err != nil { // Might happen due to the assets-related message TODO: log only if session is necessary for this kind of message @@ -52,22 +53,25 @@ func main() { } // Insert statistics - err = si.insertStats(session, msg) + err = si.InsertStats(session, msg) if err != nil { log.Printf("Stats Insertion Error %v; Session: %v, Message: %v", err, session, msg) } + // Insert heuristics heurFinder.HandleMessage(session, msg) + + // TODO: ??? heurFinder.IterateSessionReadyMessages(sessionID, func(msg messages.Message) { // TODO: DRY code (carefully with the return statement logic) - if err := mi.insertMessage(sessionID, msg); err != nil { + if err := mi.InsertMessage(sessionID, msg); err != nil { if !postgres.IsPkeyViolation(err) { log.Printf("Message Insertion Error %v; Session: %v, Message %v", err, session, msg) } return } - if err := si.insertStats(session, msg); err != nil { + if err := si.InsertStats(session, msg); err != nil { log.Printf("Stats Insertion Error %v; Session: %v, Message %v", err, session, msg) } }) diff --git a/backend/services/db/messages.go b/backend/internal/datasaver/messages.go similarity index 96% rename from backend/services/db/messages.go rename to backend/internal/datasaver/messages.go index 1a583ae6a..34a7b8dd4 100644 --- a/backend/services/db/messages.go +++ b/backend/internal/datasaver/messages.go @@ -1,4 +1,4 @@ -package main +package datasaver import ( "openreplay/backend/pkg/db/cache" @@ -13,7 +13,7 @@ func NewMessageInserter(pg *cache.PGCache) *MessageInserter { return &MessageInserter{pg: pg} } -func (mi *MessageInserter) insertMessage(sessionID uint64, msg Message) error { +func (mi *MessageInserter) InsertMessage(sessionID uint64, msg Message) error { switch m := msg.(type) { // Common case *Metadata: diff --git a/backend/services/db/stats.go b/backend/internal/datasaver/stats.go similarity index 87% rename from backend/services/db/stats.go rename to backend/internal/datasaver/stats.go index a2c2024fb..250c01775 100644 --- a/backend/services/db/stats.go +++ b/backend/internal/datasaver/stats.go @@ -1,4 +1,4 @@ -package main +package datasaver import ( "openreplay/backend/pkg/db/cache" @@ -14,7 +14,7 @@ func NewStatsInserter(pg *cache.PGCache) *StatsInserter { return &StatsInserter{pg: pg} } -func (si *StatsInserter) insertStats(session *Session, msg Message) error { +func (si *StatsInserter) InsertStats(session *Session, msg Message) error { switch m := msg.(type) { // Web case *PerformanceTrackAggr: diff --git a/backend/services/db/heuristics/anr.go b/backend/internal/heuristics/anr.go similarity index 100% rename from backend/services/db/heuristics/anr.go rename to backend/internal/heuristics/anr.go diff --git a/backend/services/db/heuristics/clickrage.go b/backend/internal/heuristics/clickrage.go similarity index 100% rename from backend/services/db/heuristics/clickrage.go rename to backend/internal/heuristics/clickrage.go diff --git a/backend/services/db/heuristics/heuristics.go b/backend/internal/heuristics/heuristics.go similarity index 100% rename from backend/services/db/heuristics/heuristics.go rename to backend/internal/heuristics/heuristics.go diff --git a/backend/services/db/heuristics/performance.go b/backend/internal/heuristics/performance.go similarity index 100% rename from backend/services/db/heuristics/performance.go rename to backend/internal/heuristics/performance.go diff --git a/backend/services/db/heuristics/readyMessageStore.go b/backend/internal/heuristics/readyMessageStore.go similarity index 100% rename from backend/services/db/heuristics/readyMessageStore.go rename to backend/internal/heuristics/readyMessageStore.go diff --git a/backend/services/db/heuristics/session.go b/backend/internal/heuristics/session.go similarity index 100% rename from backend/services/db/heuristics/session.go rename to backend/internal/heuristics/session.go diff --git a/backend/services/db/build_hack b/backend/services/db/build_hack new file mode 100644 index 000000000..e69de29bb From 918f7e9d86a879a05808aa8e551709ef1f856c9b Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Thu, 5 May 2022 10:09:16 +0200 Subject: [PATCH 061/260] change(ui) - user delete --- frontend/app/components/Client/Sites/Sites.js | 15 ++++--- .../Users/components/UserForm/UserForm.tsx | 39 ++++++++++++++----- .../Users/components/UserList/UserList.tsx | 1 - frontend/app/mstore/userStore.ts | 8 ++-- frontend/app/services/UserService.ts | 2 +- 5 files changed, 44 insertions(+), 21 deletions(-) diff --git a/frontend/app/components/Client/Sites/Sites.js b/frontend/app/components/Client/Sites/Sites.js index 8d53b8eab..19f2b8563 100644 --- a/frontend/app/components/Client/Sites/Sites.js +++ b/frontend/app/components/Client/Sites/Sites.js @@ -168,10 +168,13 @@ class Sites extends React.PureComponent {
    +
    +
    Name
    +
    { sites.map(_site => ( //
    -
    +
    {_site.projectKey}
    */}
    -
    + {/* + */} -
    {/* */}
    diff --git a/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx b/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx index 19f44235c..c34828ec6 100644 --- a/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx +++ b/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx @@ -1,11 +1,11 @@ import React from 'react'; -import { Input, CopyButton, Button } from 'UI' +import { Input, CopyButton, Button, Icon } from 'UI' import cn from 'classnames'; import { useStore } from 'App/mstore'; import { useObserver } from 'mobx-react-lite'; import { useModal } from 'App/components/Modal'; import Select from 'Shared/Select'; - +import { confirm } from 'UI/Confirmation'; interface Props { isSmtp?: boolean; isEnterprise?: boolean; @@ -31,6 +31,18 @@ function UserForm(props: Props) { const write = ({ target: { name, value } }) => { user.updateKey(name, value); } + + const deleteHandler = async () => { + if (await confirm({ + header: 'Confirm', + confirmButton: 'Yes, delete', + confirmation: `Are you sure you want to permanently delete this user?` + })) { + userStore.deleteUser(user.userId).then(() => { + hideModal(); + }); + } + } return useObserver(() => (
    @@ -118,14 +130,23 @@ function UserForm(props: Props) { { 'Cancel' }
    - { !user.isJoined && user.invitationLink && - - } +
    + +
    + + { !user.isJoined && user.invitationLink && + + }
    )); } diff --git a/frontend/app/components/Client/Users/components/UserList/UserList.tsx b/frontend/app/components/Client/Users/components/UserList/UserList.tsx index e0e2e37ff..215d7bf94 100644 --- a/frontend/app/components/Client/Users/components/UserList/UserList.tsx +++ b/frontend/app/components/Client/Users/components/UserList/UserList.tsx @@ -27,7 +27,6 @@ function UserList(props) { useEffect(() => { userStore.fetchUsers(); - editHandler(null); }, []); const editHandler = (user) => { diff --git a/frontend/app/mstore/userStore.ts b/frontend/app/mstore/userStore.ts index 640c8910b..af8c93a5f 100644 --- a/frontend/app/mstore/userStore.ts +++ b/frontend/app/mstore/userStore.ts @@ -104,17 +104,17 @@ export default class UserStore { } deleteUser(userId: string): Promise { - this.loading = true; + this.saving = true; return new Promise((resolve, reject) => { userService.delete(userId) .then(response => { - this.instance = null; + this.list = this.list.filter(user => user.userId !== userId); resolve(response); }).catch(error => { - this.loading = false; + this.saving = false; reject(error); }).finally(() => { - this.loading = false; + this.saving = false; }); }); } diff --git a/frontend/app/services/UserService.ts b/frontend/app/services/UserService.ts index 4715f2e13..db86fdd7a 100644 --- a/frontend/app/services/UserService.ts +++ b/frontend/app/services/UserService.ts @@ -38,7 +38,7 @@ export default class UserService { } delete(userId: string) { - return this.client.delete('/users/' + userId) + return this.client.delete('/client/members/' + userId) .then(response => response.json()) .then(response => response.data || {}); } From c0503941167c06cb8c1331840857167326a25c68 Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Thu, 5 May 2022 10:23:36 +0200 Subject: [PATCH 062/260] Moved service configs to config module --- backend/cmd/db/main.go | 40 +++++++++++++------------- backend/internal/config/db/config.go | 28 ++++++++++++++++++ backend/internal/datasaver/messages.go | 11 +------ backend/internal/datasaver/saver.go | 11 +++++++ backend/internal/datasaver/stats.go | 11 +------ 5 files changed, 61 insertions(+), 40 deletions(-) create mode 100644 backend/internal/config/db/config.go create mode 100644 backend/internal/datasaver/saver.go diff --git a/backend/cmd/db/main.go b/backend/cmd/db/main.go index 675c9f975..962057213 100644 --- a/backend/cmd/db/main.go +++ b/backend/cmd/db/main.go @@ -2,6 +2,7 @@ package main import ( "log" + "openreplay/backend/internal/config/db" "openreplay/backend/internal/datasaver" "openreplay/backend/internal/heuristics" "time" @@ -12,7 +13,6 @@ import ( "openreplay/backend/pkg/db/cache" "openreplay/backend/pkg/db/postgres" - "openreplay/backend/pkg/env" logger "openreplay/backend/pkg/log" "openreplay/backend/pkg/messages" "openreplay/backend/pkg/queue" @@ -22,22 +22,23 @@ import ( func main() { log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) + cfg := db.New() + // Init database - pg := cache.NewPGCache(postgres.NewConn(env.String("POSTGRES_STRING")), 1000*60*20) + pg := cache.NewPGCache(postgres.NewConn(cfg.Postgres), cfg.ProjectExpirationTimeoutMs) defer pg.Close() // Init modules heurFinder := heuristics.NewHandler() - mi := datasaver.NewMessageInserter(pg) - si := datasaver.NewStatsInserter(pg) - statsLogger := logger.NewQueueStats(env.Int("LOG_QUEUE_STATS_INTERVAL_SEC")) + saver := datasaver.New(pg) + statsLogger := logger.NewQueueStats(cfg.LoggerTimeout) // Handler logic handler := func(sessionID uint64, msg messages.Message, meta *types.Meta) { statsLogger.Collect(sessionID, meta) - // Just insert message into db without additional checks - if err := mi.InsertMessage(sessionID, msg); err != nil { + // Just save session data into db without additional checks + if err := saver.InsertMessage(sessionID, msg); err != nil { if !postgres.IsPkeyViolation(err) { log.Printf("Message Insertion Error %v, SessionID: %v, Message: %v", err, sessionID, msg) } @@ -52,26 +53,26 @@ func main() { return } - // Insert statistics - err = si.InsertStats(session, msg) + // Save statistics to db + err = saver.InsertStats(session, msg) if err != nil { log.Printf("Stats Insertion Error %v; Session: %v, Message: %v", err, session, msg) } - // Insert heuristics + // Handle heuristics and save to temporary queue in memory heurFinder.HandleMessage(session, msg) - // TODO: ??? + // Process saved heuristics messages as usual messages above in the code heurFinder.IterateSessionReadyMessages(sessionID, func(msg messages.Message) { // TODO: DRY code (carefully with the return statement logic) - if err := mi.InsertMessage(sessionID, msg); err != nil { + if err := saver.InsertMessage(sessionID, msg); err != nil { if !postgres.IsPkeyViolation(err) { log.Printf("Message Insertion Error %v; Session: %v, Message %v", err, session, msg) } return } - if err := si.InsertStats(session, msg); err != nil { + if err := saver.InsertStats(session, msg); err != nil { log.Printf("Stats Insertion Error %v; Session: %v, Message %v", err, session, msg) } }) @@ -79,21 +80,21 @@ func main() { // Init consumer consumer := queue.NewMessageConsumer( - env.String("GROUP_DB"), + cfg.GroupDB, []string{ - env.String("TOPIC_RAW_IOS"), - env.String("TOPIC_TRIGGER"), + cfg.TopicRawIOS, + cfg.TopicTrigger, }, handler, false, ) + log.Printf("Db service started\n") + sigchan := make(chan os.Signal, 1) signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM) - tick := time.Tick(15 * time.Second) - - log.Printf("Db service started\n") + tick := time.Tick(cfg.CommitBatchTimeout) for { select { case sig := <-sigchan: @@ -113,5 +114,4 @@ func main() { } } } - } diff --git a/backend/internal/config/db/config.go b/backend/internal/config/db/config.go new file mode 100644 index 000000000..fb35a199c --- /dev/null +++ b/backend/internal/config/db/config.go @@ -0,0 +1,28 @@ +package db + +import ( + "openreplay/backend/pkg/env" + "time" +) + +type Config struct { + Postgres string + ProjectExpirationTimeoutMs int64 + LoggerTimeout int + GroupDB string + TopicRawIOS string + TopicTrigger string + CommitBatchTimeout time.Duration +} + +func New() *Config { + return &Config{ + Postgres: env.String("POSTGRES_STRING"), + ProjectExpirationTimeoutMs: 1000 * 60 * 20, + LoggerTimeout: env.Int("LOG_QUEUE_STATS_INTERVAL_SEC"), + GroupDB: env.String("GROUP_DB"), + TopicRawIOS: env.String("TOPIC_RAW_IOS"), + TopicTrigger: env.String("TOPIC_TRIGGER"), + CommitBatchTimeout: 15 * time.Second, + } +} diff --git a/backend/internal/datasaver/messages.go b/backend/internal/datasaver/messages.go index 34a7b8dd4..1e774888d 100644 --- a/backend/internal/datasaver/messages.go +++ b/backend/internal/datasaver/messages.go @@ -1,19 +1,10 @@ package datasaver import ( - "openreplay/backend/pkg/db/cache" . "openreplay/backend/pkg/messages" ) -type MessageInserter struct { - pg *cache.PGCache -} - -func NewMessageInserter(pg *cache.PGCache) *MessageInserter { - return &MessageInserter{pg: pg} -} - -func (mi *MessageInserter) InsertMessage(sessionID uint64, msg Message) error { +func (mi *Saver) InsertMessage(sessionID uint64, msg Message) error { switch m := msg.(type) { // Common case *Metadata: diff --git a/backend/internal/datasaver/saver.go b/backend/internal/datasaver/saver.go new file mode 100644 index 000000000..4cd742718 --- /dev/null +++ b/backend/internal/datasaver/saver.go @@ -0,0 +1,11 @@ +package datasaver + +import "openreplay/backend/pkg/db/cache" + +type Saver struct { + pg *cache.PGCache +} + +func New(pg *cache.PGCache) *Saver { + return &Saver{pg: pg} +} diff --git a/backend/internal/datasaver/stats.go b/backend/internal/datasaver/stats.go index 250c01775..a57d91824 100644 --- a/backend/internal/datasaver/stats.go +++ b/backend/internal/datasaver/stats.go @@ -1,20 +1,11 @@ package datasaver import ( - "openreplay/backend/pkg/db/cache" . "openreplay/backend/pkg/db/types" . "openreplay/backend/pkg/messages" ) -type StatsInserter struct { - pg *cache.PGCache -} - -func NewStatsInserter(pg *cache.PGCache) *StatsInserter { - return &StatsInserter{pg: pg} -} - -func (si *StatsInserter) InsertStats(session *Session, msg Message) error { +func (si *Saver) InsertStats(session *Session, msg Message) error { switch m := msg.(type) { // Web case *PerformanceTrackAggr: From 74756b240917bfb4a7faef391c621f87f049542d Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Thu, 5 May 2022 10:46:48 +0200 Subject: [PATCH 063/260] Refactoring of the db service --- backend/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/build.sh b/backend/build.sh index 8e3bea86a..b4de3c2de 100755 --- a/backend/build.sh +++ b/backend/build.sh @@ -23,7 +23,7 @@ function build_service() { image="$1" echo "BUILDING $image" case "$image" in - http) + http | db) echo build http docker build -t ${DOCKER_REPO:-'local'}/$image:${git_sha1} --build-arg SERVICE_NAME=$image -f ./cmd/Dockerfile . [[ $PUSH_IMAGE -eq 1 ]] && { From 88306e1a6aad8b0aa6e627b413ba99020940cba4 Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Thu, 5 May 2022 12:04:23 +0200 Subject: [PATCH 064/260] fix (backend): removed unused import in storage module --- backend/services/storage/main.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/services/storage/main.go b/backend/services/storage/main.go index ae4d9a1da..95c5c6d17 100644 --- a/backend/services/storage/main.go +++ b/backend/services/storage/main.go @@ -7,7 +7,6 @@ import ( "time" "bytes" - "io" "os/signal" "syscall" @@ -57,7 +56,7 @@ func main() { log.Fatalf("Storage: start upload failed. %v\n", err) } if nRead == SESSION_FILE_SPLIT_SIZE { - if err := storage.Upload(gzipFile(file), key + "e", "application/octet-stream", true); err != nil { + if err := storage.Upload(gzipFile(file), key+"e", "application/octet-stream", true); err != nil { log.Fatalf("Storage: end upload failed. %v\n", err) } } From b6d57b45abda237147c37216d8a6607a201de0ae Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Thu, 5 May 2022 12:49:44 +0200 Subject: [PATCH 065/260] chore(github-workflow): backend --- .github/workflows/workers-ee.yaml | 8 +++++++- .github/workflows/workers.yaml | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/workers-ee.yaml b/.github/workflows/workers-ee.yaml index a61d75160..18fca8872 100644 --- a/.github/workflows/workers-ee.yaml +++ b/.github/workflows/workers-ee.yaml @@ -47,7 +47,13 @@ jobs: # # Getting the images to build # - git diff --name-only HEAD HEAD~1 | grep backend/services | cut -d '/' -f3 | uniq > backend/images_to_build.txt + { + git diff --name-only HEAD HEAD~1 | grep -E "backend/cmd|backend/services" | grep -vE ^ee/ | cut -d '/' -f3 + + git diff --name-only HEAD HEAD~1 | grep -E "backend/pkg|backend/internal" | grep -vE ^ee/ | cut -d '/' -f3 | uniq | while read -r pkg_name ; do + grep -rl "pkg/$pkg_name" backend/services backend/cmd | cut -d '/' -f3 + done + } | uniq > backend/images_to_build.txt [[ $(cat backend/images_to_build.txt) != "" ]] || (echo "Nothing to build here"; exit 0) # # Pushing image to registry diff --git a/.github/workflows/workers.yaml b/.github/workflows/workers.yaml index 7ce78ad6f..e6a91647d 100644 --- a/.github/workflows/workers.yaml +++ b/.github/workflows/workers.yaml @@ -51,8 +51,8 @@ jobs: { git diff --name-only HEAD HEAD~1 | grep -E "backend/cmd|backend/services" | grep -vE ^ee/ | cut -d '/' -f3 - git diff --name-only HEAD HEAD~1 | grep backend/pkg | grep -vE ^ee/ | cut -d '/' -f3 | uniq | while read -r pkg_name ; do - grep -rl "pkg/$pkg_name" backend/services | cut -d '/' -f3 + git diff --name-only HEAD HEAD~1 | grep -E "backend/pkg|backend/internal" | grep -vE ^ee/ | cut -d '/' -f3 | uniq | while read -r pkg_name ; do + grep -rl "pkg/$pkg_name" backend/services backend/cmd | cut -d '/' -f3 done } | uniq > backend/images_to_build.txt From dfce25709a588033c304cb14c2cc09dd7693cb3c Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Thu, 5 May 2022 13:11:20 +0200 Subject: [PATCH 066/260] change(ui) - user limit check and other fixes --- frontend/app/components/Client/Sites/Sites.js | 9 ++-- .../app/components/Client/Users/UsersView.tsx | 18 +++++--- .../Users/components/UserForm/UserForm.tsx | 10 ++--- .../Users/components/UserList/UserList.tsx | 12 +++-- .../components/UserListItem/UserListItem.tsx | 44 +++++++++++++++---- .../app/components/shared/Select/Select.tsx | 2 +- frontend/app/mstore/types/user.ts | 5 +++ frontend/app/mstore/userStore.ts | 41 +++++++++++++++++ frontend/app/services/UserService.ts | 6 +++ 9 files changed, 121 insertions(+), 26 deletions(-) diff --git a/frontend/app/components/Client/Sites/Sites.js b/frontend/app/components/Client/Sites/Sites.js index 19f2b8563..cb9c4df3b 100644 --- a/frontend/app/components/Client/Sites/Sites.js +++ b/frontend/app/components/Client/Sites/Sites.js @@ -168,8 +168,11 @@ class Sites extends React.PureComponent {
    -
    -
    Name
    +
    +
    Name
    +
    Key
    +
    +
    { sites.map(_site => ( @@ -191,7 +194,7 @@ class Sites extends React.PureComponent {
    - {_site.projectKey} + {_site.projectKey}
    {/*
    { _site.host }
    diff --git a/frontend/app/components/Client/Users/UsersView.tsx b/frontend/app/components/Client/Users/UsersView.tsx index 7d4029b5f..9825db446 100644 --- a/frontend/app/components/Client/Users/UsersView.tsx +++ b/frontend/app/components/Client/Users/UsersView.tsx @@ -8,23 +8,26 @@ import { useModal } from 'App/components/Modal'; import UserForm from './components/UserForm'; import { connect } from 'react-redux'; +const PERMISSION_WARNING = 'You don’t have the permissions to perform this action.'; +const LIMIT_WARNING = 'You have reached users limit.'; interface Props { account: any; isEnterprise: boolean; + limits: any; } function UsersView(props: Props) { - const { account, isEnterprise } = props; + const { account, limits, isEnterprise } = props; const { userStore, roleStore } = useStore(); const userCount = useObserver(() => userStore.list.length); const roles = useObserver(() => roleStore.list); const { showModal } = useModal(); + const reachedLimit = (limits.remaining + userStore.modifiedCount) <= 0; const isAdmin = account.admin || account.superAdmin; - // const canAddUsers = isAdmin && userCount !== 0; // TODO fetch limits and disable button if limit reached const editHandler = (user = null) => { userStore.initUser(user).then(() => { - showModal(, { right: true }); + showModal(, {}); }); } @@ -34,6 +37,8 @@ function UsersView(props: Props) { } }, []); + console.log('remaining', limits, reachedLimit) + return (
    @@ -45,7 +50,7 @@ function UsersView(props: Props) {
    } - // disabled={ canAddUsers } - // content={ `${ !canAddUsers ? (!isAdmin ? PERMISSION_WARNING : LIMIT_WARNING) : 'Add team member' }` } + content={ `${ !isAdmin ? PERMISSION_WARNING : (reachedLimit ? LIMIT_WARNING : 'Add team member') }` } size="tiny" inverted position="top left" @@ -74,4 +78,6 @@ function UsersView(props: Props) { export default connect(state => ({ account: state.getIn([ 'user', 'account' ]), isEnterprise: state.getIn([ 'user', 'client', 'edition' ]) === 'ee', + limits: state.getIn([ 'user', 'account', 'limits', 'teamMember' ]), + // remaining: this.props.account.limits.teamMember.remaining }))(UsersView); \ No newline at end of file diff --git a/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx b/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx index c34828ec6..25f35097c 100644 --- a/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx +++ b/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx @@ -12,9 +12,9 @@ interface Props { } function UserForm(props: Props) { const { isSmtp = false, isEnterprise = false } = props; - const isSaving = false; const { hideModal } = useModal(); const { userStore, roleStore } = useStore(); + const isSaving = useObserver(() => userStore.saving); const user: any = useObserver(() => userStore.instance); const roles = useObserver(() => roleStore.list.filter(r => r.isProtected ? user.isSuperAdmin : true).map(r => ({ label: r.name, value: r.roleId }))); @@ -98,7 +98,7 @@ function UserForm(props: Props) {
    { const newUser = new User().fromJson(response); if (wasCreating) { + this.modifiedCount -= 1; this.list.push(new User().fromJson(newUser)); toast.success('User created successfully'); } else { @@ -108,6 +111,7 @@ export default class UserStore { return new Promise((resolve, reject) => { userService.delete(userId) .then(response => { + this.modifiedCount += 1; this.list = this.list.filter(user => user.userId !== userId); resolve(response); }).catch(error => { @@ -118,4 +122,41 @@ export default class UserStore { }); }); } + + copyInviteCode(userId: string): void { + const content = this.list.find(u => u.userId === userId)?.invitationLink; + if (content) { + copy(content); + toast.success('Invite code copied successfully'); + } else { + toast.error('Invite code not found'); + } + } + + generateInviteCode(userId: string): Promise { + this.saving = true; + const promise = new Promise((resolve, reject) => { + userService.generateInviteCode(userId) + .then(response => { + const index = this.list.findIndex(u => u.userId === userId); + if (index > -1) { + this.list[index].updateKey('isExpiredInvite', false); + this.list[index].updateKey('invitationLink', response.invitationLink); + } + resolve(response); + }).catch(error => { + this.saving = false; + reject(error); + }).finally(() => { + this.saving = false; + }); + }); + + toast.promise(promise, { + pending: 'Generating an invite code...', + success: 'Invite code generated successfully', + }) + + return promise; + } } \ No newline at end of file diff --git a/frontend/app/services/UserService.ts b/frontend/app/services/UserService.ts index db86fdd7a..615368db6 100644 --- a/frontend/app/services/UserService.ts +++ b/frontend/app/services/UserService.ts @@ -37,6 +37,12 @@ export default class UserService { } } + generateInviteCode(userId: any): Promise { + return this.client.get(`/client/members/${userId}/reset`) + .then(response => response.json()) + .then(response => response.data || {}); + } + delete(userId: string) { return this.client.delete('/client/members/' + userId) .then(response => response.json()) From 55b64128f182102358de04bc4e44cb3be7d872c0 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Thu, 5 May 2022 13:16:06 +0200 Subject: [PATCH 067/260] change(ui) - sites checking for exists --- frontend/app/components/Client/Sites/Sites.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/app/components/Client/Sites/Sites.js b/frontend/app/components/Client/Sites/Sites.js index cb9c4df3b..027b09cf3 100644 --- a/frontend/app/components/Client/Sites/Sites.js +++ b/frontend/app/components/Client/Sites/Sites.js @@ -85,7 +85,7 @@ class Sites extends React.PureComponent { getModalTitle() { switch (this.state.modalContent) { case NEW_SITE_FORM: - return 'New Project'; + return this.props.site.exists() ? 'Update Project' : 'New Project'; case GDPR_FORM: return 'Project Settings'; default: From c3bb5aeb07141adf9dfad777d30b044abec3018f Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Thu, 5 May 2022 13:27:06 +0200 Subject: [PATCH 068/260] change(ui) - sites search --- .../Client/Sites/SiteSearch/SiteSearch.tsx | 34 +++++++++++++++++++ .../Client/Sites/SiteSearch/index.ts | 1 + frontend/app/components/Client/Sites/Sites.js | 20 +++++++---- 3 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 frontend/app/components/Client/Sites/SiteSearch/SiteSearch.tsx create mode 100644 frontend/app/components/Client/Sites/SiteSearch/index.ts diff --git a/frontend/app/components/Client/Sites/SiteSearch/SiteSearch.tsx b/frontend/app/components/Client/Sites/SiteSearch/SiteSearch.tsx new file mode 100644 index 000000000..1a4c2b881 --- /dev/null +++ b/frontend/app/components/Client/Sites/SiteSearch/SiteSearch.tsx @@ -0,0 +1,34 @@ +import React, { useEffect } from 'react'; +import { Icon } from 'UI'; +import { debounce } from 'App/utils'; + +let debounceUpdate: any = () => {} +interface Props { + onChange: (value: string) => void; +} +function SiteSearch(props: Props) { + const { onChange } = props; + + useEffect(() => { + debounceUpdate = debounce((value) => onChange(value), 500); + }, []) + + const write = ({ target: { name, value } }) => { + debounceUpdate(value); + } + + return ( +
    + + +
    + ); +} + +export default SiteSearch; \ No newline at end of file diff --git a/frontend/app/components/Client/Sites/SiteSearch/index.ts b/frontend/app/components/Client/Sites/SiteSearch/index.ts new file mode 100644 index 000000000..54376cf15 --- /dev/null +++ b/frontend/app/components/Client/Sites/SiteSearch/index.ts @@ -0,0 +1 @@ +export { default } from './SiteSearch'; \ No newline at end of file diff --git a/frontend/app/components/Client/Sites/Sites.js b/frontend/app/components/Client/Sites/Sites.js index 027b09cf3..ba3c72e6e 100644 --- a/frontend/app/components/Client/Sites/Sites.js +++ b/frontend/app/components/Client/Sites/Sites.js @@ -10,6 +10,7 @@ import GDPRForm from './GDPRForm'; import TrackingCodeModal from 'Shared/TrackingCodeModal'; import BlockedIps from './BlockedIps'; import { confirm } from 'UI/Confirmation'; +import SiteSearch from './SiteSearch'; const STATUS_MESSAGE_MAP = { [ RED ]: ' There seems to be an issue (please verify your installation)', @@ -43,6 +44,7 @@ class Sites extends React.PureComponent { showTrackingCode: false, modalContent: NONE, detailContent: NONE, + searchQuery: '', }; toggleBlockedIp = () => { @@ -119,6 +121,7 @@ class Sites extends React.PureComponent { const isAdmin = user.admin || user.superAdmin; const canAddSites = isAdmin && account.limits.projects && account.limits.projects.remaining !== 0; const canDeleteSites = sites.size > 1 && isAdmin; + const filteredSites = sites.filter(site => site.name.toLowerCase().includes(this.state.searchQuery.toLowerCase())); return ( @@ -159,12 +162,15 @@ class Sites extends React.PureComponent { position="top left" /> - +
    + + this.setState({ searchQuery: value })} /> +
    @@ -175,7 +181,7 @@ class Sites extends React.PureComponent {
    { - sites.map(_site => ( + filteredSites.map(_site => ( //
    From c4b371507d909a018fad2fef9c88e4188dfc2435 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Thu, 5 May 2022 14:31:53 +0200 Subject: [PATCH 069/260] change(ui) - project delete moved to modal --- .../components/Client/Sites/NewSiteForm.js | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/frontend/app/components/Client/Sites/NewSiteForm.js b/frontend/app/components/Client/Sites/NewSiteForm.js index e58e95d4e..e7cd88f12 100644 --- a/frontend/app/components/Client/Sites/NewSiteForm.js +++ b/frontend/app/components/Client/Sites/NewSiteForm.js @@ -1,10 +1,11 @@ import { connect } from 'react-redux'; -import { Input, Button, Label } from 'UI'; -import { save, edit, update , fetchList } from 'Duck/site'; +import { Input, Button, Icon } from 'UI'; +import { save, edit, update , fetchList, remove } from 'Duck/site'; import { pushNewSite } from 'Duck/user'; import { setSiteId } from 'Duck/site'; import { withRouter } from 'react-router-dom'; import styles from './siteForm.css'; +import { confirm } from 'UI/Confirmation'; @connect(state => ({ site: state.getIn([ 'site', 'instance' ]), @@ -13,6 +14,7 @@ import styles from './siteForm.css'; loading: state.getIn([ 'site', 'save', 'loading' ]), }), { save, + remove, edit, update, pushNewSite, @@ -52,6 +54,17 @@ export default class NewSiteForm extends React.PureComponent { } } + remove = async (site) => { + if (await confirm({ + header: 'Projects', + confirmation: `Are you sure you want to delete this Project? We won't be able to record anymore sessions.` + })) { + this.props.remove(site.id).then(() => { + this.props.onClose(null) + }); + } + }; + edit = ({ target: { name, value } }) => { this.setState({ existsError: false }); this.props.edit({ [ name ]: value }); @@ -72,7 +85,7 @@ export default class NewSiteForm extends React.PureComponent { className={ styles.input } />
    -
    +
    + +
    { this.state.existsError &&
    { "Site exists already. Please choose another one." } From 59fe8245dd569668794b971b2c9864b05bd84889 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Thu, 5 May 2022 14:41:10 +0200 Subject: [PATCH 070/260] change(ui) - user list tooltip --- .../app/components/Client/Users/UsersView.tsx | 2 -- .../components/UserListItem/UserListItem.tsx | 34 ++++++++++++++----- frontend/app/mstore/types/user.ts | 1 - 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/frontend/app/components/Client/Users/UsersView.tsx b/frontend/app/components/Client/Users/UsersView.tsx index 9825db446..693c47229 100644 --- a/frontend/app/components/Client/Users/UsersView.tsx +++ b/frontend/app/components/Client/Users/UsersView.tsx @@ -37,8 +37,6 @@ function UsersView(props: Props) { } }, []); - console.log('remaining', limits, reachedLimit) - return (
    diff --git a/frontend/app/components/Client/Users/components/UserListItem/UserListItem.tsx b/frontend/app/components/Client/Users/components/UserListItem/UserListItem.tsx index 10f2f2fe0..bb6d6b2f6 100644 --- a/frontend/app/components/Client/Users/components/UserListItem/UserListItem.tsx +++ b/frontend/app/components/Client/Users/components/UserListItem/UserListItem.tsx @@ -1,6 +1,8 @@ +//@ts-nocheck import React from 'react'; -import { Icon, CopyButton } from 'UI'; +import { Icon } from 'UI'; import { checkForRecent } from 'App/date'; +import { Tooltip } from 'react-tippy'; interface Props { user: any; @@ -30,18 +32,32 @@ function UserListItem(props: Props) {
    {user.createdAt && checkForRecent(user.createdAt, 'LLL dd, yyyy, hh:mm a')}
    - {/* invisible */} -
    + +
    {!user.isJoined && user.invitationLink ? ( - + + + ) :
    } {!user.isJoined && user.isExpiredInvite && ( - + + + )}
    - +
    ); } @@ -77,5 +77,4 @@ export default connect(state => ({ account: state.getIn([ 'user', 'account' ]), isEnterprise: state.getIn([ 'user', 'client', 'edition' ]) === 'ee', limits: state.getIn([ 'user', 'account', 'limits', 'teamMember' ]), - // remaining: this.props.account.limits.teamMember.remaining }))(UsersView); \ No newline at end of file diff --git a/frontend/app/components/Client/Users/components/UserList/UserList.tsx b/frontend/app/components/Client/Users/components/UserList/UserList.tsx index 917b10776..b01fca57b 100644 --- a/frontend/app/components/Client/Users/components/UserList/UserList.tsx +++ b/frontend/app/components/Client/Users/components/UserList/UserList.tsx @@ -7,7 +7,11 @@ import { Pagination, NoContent, Loader } from 'UI'; import { useModal } from 'App/components/Modal'; import UserForm from '../UserForm'; -function UserList(props) { +interface Props { + isEnterprise?: boolean; +} +function UserList(props: Props) { + const { isEnterprise = false } = props; const { userStore } = useStore(); const loading = useObserver(() => userStore.loading); const users = useObserver(() => userStore.list); @@ -53,6 +57,7 @@ function UserList(props) { editHandler={() => editHandler(user)} generateInvite={() => userStore.generateInviteCode(user.userId)} copyInviteCode={() => userStore.copyInviteCode(user.userId)} + // isEnterprise={isEnterprise} />
    ))} diff --git a/frontend/app/components/Client/Users/components/UserListItem/UserListItem.tsx b/frontend/app/components/Client/Users/components/UserListItem/UserListItem.tsx index bb6d6b2f6..51ea43422 100644 --- a/frontend/app/components/Client/Users/components/UserListItem/UserListItem.tsx +++ b/frontend/app/components/Client/Users/components/UserListItem/UserListItem.tsx @@ -4,11 +4,21 @@ import { Icon } from 'UI'; import { checkForRecent } from 'App/date'; import { Tooltip } from 'react-tippy'; + +const AdminPrivilegeLabel = ({ user }) => { + return ( + <> + {user.isAdmin && Admin} + {user.isSuperAdmin && Owner} + + ) +} interface Props { user: any; editHandler?: any; generateInvite?: any; copyInviteCode?: any; + isEnterprise?: boolean; } function UserListItem(props: Props) { const { @@ -16,18 +26,21 @@ function UserListItem(props: Props) { editHandler = () => {}, generateInvite = () => {}, copyInviteCode = () => {}, + isEnterprise = false, } = props; return (
    - {user.name} - {user.isAdmin && Admin} - {user.isSuperAdmin && Owner} + {user.name} + {isEnterprise && }
    - - {user.roleName} - + {!isEnterprise && } + {isEnterprise && ( + + {user.roleName} + + )}
    {user.createdAt && checkForRecent(user.createdAt, 'LLL dd, yyyy, hh:mm a')} From f4212d6eaaf497623816b446c4515d33e5e54c8c Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Thu, 5 May 2022 17:37:05 +0200 Subject: [PATCH 075/260] Split ender into 2 services (ender and heuristics) --- backend/cmd/ender/main.go | 7 ++- backend/cmd/heuristics/main.go | 68 ++++++++++++++++++++++++++ backend/internal/builder/builder.go | 33 +++++++------ backend/internal/builder/builderMap.go | 12 ----- backend/internal/ender/builder.go | 56 +++++++++++++++++++++ backend/internal/ender/builderMap.go | 36 ++++++++++++++ backend/pkg/intervals/intervals.go | 12 ++--- 7 files changed, 186 insertions(+), 38 deletions(-) create mode 100644 backend/cmd/heuristics/main.go create mode 100644 backend/internal/ender/builder.go create mode 100644 backend/internal/ender/builderMap.go diff --git a/backend/cmd/ender/main.go b/backend/cmd/ender/main.go index b54a8dc15..dbe2fa212 100644 --- a/backend/cmd/ender/main.go +++ b/backend/cmd/ender/main.go @@ -2,8 +2,8 @@ package main import ( "log" - "openreplay/backend/internal/builder" "openreplay/backend/internal/config/ender" + builder "openreplay/backend/internal/ender" "time" "os" @@ -49,16 +49,15 @@ func main() { case sig := <-sigchan: log.Printf("Caught signal %v: terminating\n", sig) producer.Close(cfg.ProducerTimeout) - consumer.Commit() + consumer.CommitBack(intervals.EVENTS_BACK_COMMIT_GAP) consumer.Close() os.Exit(0) case <-tick: builderMap.IterateReadyMessages(time.Now().UnixMilli(), func(sessionID uint64, readyMsg messages.Message) { producer.Produce(cfg.TopicTrigger, sessionID, messages.Encode(readyMsg)) }) - // TODO: why exactly do we need Flush here and not in any other place? producer.Flush(cfg.ProducerTimeout) - consumer.Commit() + consumer.CommitBack(intervals.EVENTS_BACK_COMMIT_GAP) default: if err := consumer.ConsumeNext(); err != nil { log.Fatalf("Error on consuming: %v", err) diff --git a/backend/cmd/heuristics/main.go b/backend/cmd/heuristics/main.go new file mode 100644 index 000000000..b33511bd1 --- /dev/null +++ b/backend/cmd/heuristics/main.go @@ -0,0 +1,68 @@ +package main + +import ( + "log" + "openreplay/backend/internal/builder" + "openreplay/backend/internal/config/ender" + "openreplay/backend/pkg/intervals" + logger "openreplay/backend/pkg/log" + "openreplay/backend/pkg/messages" + "openreplay/backend/pkg/queue" + "openreplay/backend/pkg/queue/types" + "os" + "os/signal" + "syscall" + "time" +) + +func main() { + log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) + + cfg := ender.New() + + builderMap := builder.NewBuilderMap() + statsLogger := logger.NewQueueStats(cfg.LoggerTimeout) + producer := queue.NewProducer() + consumer := queue.NewMessageConsumer( + cfg.GroupEvents, + []string{ + cfg.TopicRawWeb, + cfg.TopicRawIOS, + }, + func(sessionID uint64, msg messages.Message, meta *types.Meta) { + statsLogger.Collect(sessionID, meta) + builderMap.HandleMessage(sessionID, msg, msg.Meta().Index) + }, + false, + ) + + tick := time.Tick(intervals.EVENTS_COMMIT_INTERVAL * time.Millisecond) + + sigchan := make(chan os.Signal, 1) + signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM) + + log.Printf("Ender service started\n") + for { + select { + case sig := <-sigchan: + log.Printf("Caught signal %v: terminating\n", sig) + producer.Close(cfg.ProducerTimeout) + consumer.Commit() + consumer.Close() + os.Exit(0) + case <-tick: + builderMap.IterateReadyMessages(time.Now().UnixMilli(), func(sessionID uint64, readyMsg messages.Message) { + producer.Produce(cfg.TopicTrigger, sessionID, messages.Encode(readyMsg)) + }) + producer.Flush(cfg.ProducerTimeout) + consumer.Commit() + default: + if err := consumer.ConsumeNext(); err != nil { + log.Fatalf("Error on consuming: %v", err) + } + } + } + + // Config + +} diff --git a/backend/internal/builder/builder.go b/backend/internal/builder/builder.go index 1a89f67b6..bd9f26b19 100644 --- a/backend/internal/builder/builder.go +++ b/backend/internal/builder/builder.go @@ -44,9 +44,9 @@ type builder struct { readyMsgs []Message timestamp uint64 lastProcessedTimestamp int64 - peBuilder *pageEventBuilder + peBuilder *pageEventBuilder // TODO: DB ptaBuilder *performanceTrackAggrBuilder - ieBuilder *inputEventBuilder + ieBuilder *inputEventBuilder // TODO: DB ciFinder *cpuIssueFinder miFinder *memoryIssueFinder ddDetector *domDropDetector @@ -117,6 +117,7 @@ func (b *builder) handleMessage(message Message, messageID uint64) { b.lastProcessedTimestamp = time.Now().UnixMilli() // Might happen before the first timestamp. + // TODO: to DB switch msg := message.(type) { case *SessionStart, *Metadata, @@ -137,7 +138,7 @@ func (b *builder) handleMessage(message Message, messageID uint64) { return } switch msg := message.(type) { - case *SetPageLocation: + case *SetPageLocation: // TODO: DB if msg.NavigationStart == 0 { b.appendReadyMessage(&PageEvent{ URL: msg.URL, @@ -154,11 +155,11 @@ func (b *builder) handleMessage(message Message, messageID uint64) { b.miFinder.HandleSetPageLocation(msg) b.ciFinder.HandleSetPageLocation(msg) } - case *PageLoadTiming: + case *PageLoadTiming: // TODO: DB if rm := b.peBuilder.HandlePageLoadTiming(msg); rm != nil { b.appendReadyMessage(rm) } - case *PageRenderTiming: + case *PageRenderTiming: // TODO: DB if rm := b.peBuilder.HandlePageRenderTiming(msg); rm != nil { b.appendReadyMessage(rm) } @@ -172,20 +173,20 @@ func (b *builder) handleMessage(message Message, messageID uint64) { if rm := b.miFinder.HandlePerformanceTrack(msg, messageID, b.timestamp); rm != nil { b.appendReadyMessage(rm) } - case *SetInputTarget: + case *SetInputTarget: // TODO: DB if rm := b.ieBuilder.HandleSetInputTarget(msg); rm != nil { b.appendReadyMessage(rm) } - case *SetInputValue: + case *SetInputValue: // TODO: DB if rm := b.ieBuilder.HandleSetInputValue(msg, messageID, b.timestamp); rm != nil { b.appendReadyMessage(rm) } - case *MouseClick: + case *MouseClick: // TODO: DB b.buildInputEvent() if rm := b.crDetector.HandleMouseClick(msg, messageID, b.timestamp); rm != nil { b.appendReadyMessage(rm) } - if msg.Label != "" { + if msg.Label != "" { // TODO: DB b.appendReadyMessage(&ClickEvent{ MessageID: messageID, Label: msg.Label, @@ -195,7 +196,7 @@ func (b *builder) handleMessage(message Message, messageID uint64) { }) } case *JSException: - b.appendReadyMessage(&ErrorEvent{ + b.appendReadyMessage(&ErrorEvent{ // TODO: DB MessageID: messageID, Timestamp: b.timestamp, Source: "js_exception", @@ -206,7 +207,7 @@ func (b *builder) handleMessage(message Message, messageID uint64) { case *ResourceTiming: tp := getResourceType(msg.Initiator, msg.URL) success := msg.Duration != 0 - b.appendReadyMessage(&ResourceEvent{ + b.appendReadyMessage(&ResourceEvent{ // TODO: DB MessageID: messageID, Timestamp: msg.Timestamp, Duration: msg.Duration, @@ -231,14 +232,14 @@ func (b *builder) handleMessage(message Message, messageID uint64) { }) } case *RawCustomEvent: - b.appendReadyMessage(&CustomEvent{ + b.appendReadyMessage(&CustomEvent{ // TODO: DB MessageID: messageID, Timestamp: b.timestamp, Name: msg.Name, Payload: msg.Payload, }) case *CustomIssue: - b.appendReadyMessage(&IssueEvent{ + b.appendReadyMessage(&IssueEvent{ // TODO: DB Type: "custom", Timestamp: b.timestamp, MessageID: messageID, @@ -246,7 +247,7 @@ func (b *builder) handleMessage(message Message, messageID uint64) { Payload: msg.Payload, }) case *Fetch: - b.appendReadyMessage(&FetchEvent{ + b.appendReadyMessage(&FetchEvent{ // TODO: DB MessageID: messageID, Timestamp: msg.Timestamp, Method: msg.Method, @@ -265,7 +266,7 @@ func (b *builder) handleMessage(message Message, messageID uint64) { }) } case *GraphQL: - b.appendReadyMessage(&GraphQLEvent{ + b.appendReadyMessage(&GraphQLEvent{ // TODO: DB MessageID: messageID, Timestamp: b.timestamp, OperationKind: msg.OperationKind, @@ -274,7 +275,7 @@ func (b *builder) handleMessage(message Message, messageID uint64) { Response: msg.Response, }) case *StateAction: - b.appendReadyMessage(&StateActionEvent{ + b.appendReadyMessage(&StateActionEvent{ // TODO: DB MessageID: messageID, Timestamp: b.timestamp, Type: msg.Type, diff --git a/backend/internal/builder/builderMap.go b/backend/internal/builder/builderMap.go index 3f3e4d6e3..b7885da92 100644 --- a/backend/internal/builder/builderMap.go +++ b/backend/internal/builder/builderMap.go @@ -26,18 +26,6 @@ func (m builderMap) HandleMessage(sessionID uint64, msg Message, messageID uint6 b.handleMessage(msg, messageID) } -func (m builderMap) IterateSessionReadyMessages(sessionID uint64, operatingTs int64, iter func(msg Message)) { - b, ok := m[sessionID] - if !ok { - return - } - sessionEnded := b.checkTimeouts(operatingTs) - b.iterateReadyMessage(iter) - if sessionEnded { - delete(m, sessionID) - } -} - func (m builderMap) IterateReadyMessages(operatingTs int64, iter func(sessionID uint64, msg Message)) { for sessionID, b := range m { sessionEnded := b.checkTimeouts(operatingTs) diff --git a/backend/internal/ender/builder.go b/backend/internal/ender/builder.go new file mode 100644 index 000000000..0389f74d1 --- /dev/null +++ b/backend/internal/ender/builder.go @@ -0,0 +1,56 @@ +package builder + +import ( + "log" + "openreplay/backend/pkg/intervals" + . "openreplay/backend/pkg/messages" +) + +type builder struct { + readyMsgs []Message + timestamp uint64 + sid uint64 +} + +func NewBuilder() *builder { + return &builder{} +} + +func (b *builder) appendReadyMessage(msg Message) { // interface is never nil even if it holds nil value + b.readyMsgs = append(b.readyMsgs, msg) +} + +func (b *builder) buildSessionEnd() { + if b.timestamp == 0 { + return + } + sessionEnd := &SessionEnd{ + Timestamp: b.timestamp, + } + b.appendReadyMessage(sessionEnd) +} + +func (b *builder) handleMessage(message Message, messageID uint64) { + timestamp := GetTimestamp(message) + if b.timestamp < timestamp { + b.timestamp = timestamp + } + + if b.timestamp == 0 { + log.Printf("Empty timestamp, sessionID: %d, messageID: %d", b.sid, messageID) + return + } +} + +func (b *builder) checkTimeouts(ts int64) bool { + if b.timestamp == 0 { + return false // There was no timestamp events yet + } + + lastTsGap := ts - int64(b.timestamp) + if lastTsGap > intervals.EVENTS_SESSION_END_TIMEOUT { + b.buildSessionEnd() + return true + } + return false +} diff --git a/backend/internal/ender/builderMap.go b/backend/internal/ender/builderMap.go new file mode 100644 index 000000000..6eba1f9ad --- /dev/null +++ b/backend/internal/ender/builderMap.go @@ -0,0 +1,36 @@ +package builder + +import ( + . "openreplay/backend/pkg/messages" +) + +type builderMap map[uint64]*builder + +func NewBuilderMap() builderMap { + return make(builderMap) +} + +func (m builderMap) GetBuilder(sessionID uint64) *builder { + b := m[sessionID] + if b == nil { + b = NewBuilder() + m[sessionID] = b + b.sid = sessionID + + } + return b +} + +func (m builderMap) HandleMessage(sessionID uint64, msg Message, messageID uint64) { + b := m.GetBuilder(sessionID) + b.handleMessage(msg, messageID) +} + +func (m builderMap) IterateReadyMessages(operatingTs int64, iter func(sessionID uint64, msg Message)) { + for sessionID, b := range m { + sessionEnded := b.checkTimeouts(operatingTs) + if sessionEnded { + delete(m, sessionID) + } + } +} diff --git a/backend/pkg/intervals/intervals.go b/backend/pkg/intervals/intervals.go index c4dfbc835..2ce13ed5e 100644 --- a/backend/pkg/intervals/intervals.go +++ b/backend/pkg/intervals/intervals.go @@ -1,11 +1,11 @@ package intervals -const EVENTS_COMMIT_INTERVAL = 30 * 1000 -const HEARTBEAT_INTERVAL = 2 * 60 * 1000 -const INTEGRATIONS_REQUEST_INTERVAL = 1 * 60 * 1000 -const EVENTS_PAGE_EVENT_TIMEOUT = 2 * 60 * 1000 -const EVENTS_INPUT_EVENT_TIMEOUT = 2 * 60 * 1000 +const EVENTS_COMMIT_INTERVAL = 30 * 1000 // как часто комитим сообщения в кафке (ender) +const HEARTBEAT_INTERVAL = 2 * 60 * 1000 // максимальный таймаут от трекера в рамках сессии +const INTEGRATIONS_REQUEST_INTERVAL = 1 * 60 * 1000 // интеграции +const EVENTS_PAGE_EVENT_TIMEOUT = 2 * 60 * 1000 // таймаут пейдж ивента +const EVENTS_INPUT_EVENT_TIMEOUT = 2 * 60 * 1000 // const EVENTS_PERFORMANCE_AGGREGATION_TIMEOUT = 2 * 60 * 1000 const EVENTS_SESSION_END_TIMEOUT = HEARTBEAT_INTERVAL + 30*1000 const EVENTS_SESSION_END_TIMEOUT_WITH_INTEGRATIONS = HEARTBEAT_INTERVAL + 3*60*1000 -const EVENTS_BACK_COMMIT_GAP = EVENTS_SESSION_END_TIMEOUT_WITH_INTEGRATIONS + 1*60*1000 +const EVENTS_BACK_COMMIT_GAP = EVENTS_SESSION_END_TIMEOUT_WITH_INTEGRATIONS + 1*60*1000 // для бэк коммита From 2d96705930ab32e1b8cb29b01e40452a4d3584e9 Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Fri, 6 May 2022 00:07:07 +0200 Subject: [PATCH 076/260] readme(tracker): build-readme for js packages --- tracker/README.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 tracker/README.md diff --git a/tracker/README.md b/tracker/README.md new file mode 100644 index 000000000..f283ee3a8 --- /dev/null +++ b/tracker/README.md @@ -0,0 +1,31 @@ +## Local build + + +In order to build locally any of the javascript packages located under this directory, go to the corresponding folder first: + +```sh +cd tracker # or any tracker-* plugin + +``` +Then run +```sh +yarn +yarn build +``` +OR + +```sh +npm i +npm run build +``` + +You can then use it as a local javascript package by executing the folowing line under your local project location: + +```sh +yarn add file:../path/to/openreplay/monorepo/tracker/tracker +```` +OR +```sh +npm install --save ../path/to/openreplay/monorepo/tracker/tracker +``` + From a99f684b83b704967e1d34b1ab1f5a09b736264d Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Fri, 6 May 2022 00:10:08 +0200 Subject: [PATCH 077/260] feat(frontend-player): sequential (pre)load for multifile sessions --- .../MessageDistributor/MessageDistributor.ts | 251 +++++++++--------- .../messages/MFileReader.ts | 65 ++--- .../MessageDistributor/messages/urlResolve.ts | 1 - .../MessageDistributor/network/loadFiles.ts | 49 ++++ 4 files changed, 203 insertions(+), 163 deletions(-) create mode 100644 frontend/app/player/MessageDistributor/network/loadFiles.ts diff --git a/frontend/app/player/MessageDistributor/MessageDistributor.ts b/frontend/app/player/MessageDistributor/MessageDistributor.ts index 68ae14c72..653b05f54 100644 --- a/frontend/app/player/MessageDistributor/MessageDistributor.ts +++ b/frontend/app/player/MessageDistributor/MessageDistributor.ts @@ -8,11 +8,11 @@ import Profile from 'Types/session/profile'; import ReduxAction from 'Types/session/reduxAction'; import { update } from '../store'; -import { +import { init as initListsDepr, append as listAppend, - setStartTime as setListsStartTime - } from '../lists'; + setStartTime as setListsStartTime +} from '../lists'; import StatedScreen from './StatedScreen/StatedScreen'; @@ -26,6 +26,7 @@ import ActivityManager from './managers/ActivityManager'; import AssistManager from './managers/AssistManager'; import MFileReader from './messages/MFileReader'; +import loadFiles from './network/loadFiles'; import { INITIAL_STATE as SUPER_INITIAL_STATE, State as SuperState } from './StatedScreen/StatedScreen'; import { INITIAL_STATE as ASSIST_INITIAL_STATE, State as AssistState } from './managers/AssistManager'; @@ -33,7 +34,7 @@ import { INITIAL_STATE as ASSIST_INITIAL_STATE, State as AssistState } from './m import type { PerformanceChartPoint } from './managers/PerformanceTrackManager'; import type { SkipInterval } from './managers/ActivityManager'; -const LIST_NAMES = [ "redux", "mobx", "vuex", "ngrx", "graphql", "exceptions", "profiles", "longtasks" ] as const; +const LIST_NAMES = ["redux", "mobx", "vuex", "ngrx", "graphql", "exceptions", "profiles", "longtasks"] as const; const LISTS_INITIAL_STATE = {}; LIST_NAMES.forEach(name => { LISTS_INITIAL_STATE[`${name}ListNow`] = []; @@ -65,15 +66,15 @@ type ListsObject = { } function initLists(): ListsObject { - const lists: Partial = {} ; + const lists: Partial = {}; for (var i = 0; i < LIST_NAMES.length; i++) { - lists[ LIST_NAMES[i] ] = new ListWalker(); + lists[LIST_NAMES[i]] = new ListWalker(); } return lists as ListsObject; } -import type { +import type { Message, SetPageLocation, ConnectionInformation, @@ -110,7 +111,7 @@ export default class MessageDistributor extends StatedScreen { private navigationStartOffset: number = 0; private lastMessageTime: number = 0; - constructor(private readonly session: any /*Session*/, jwt: string, config, live: boolean) { + constructor(private readonly session: any /*Session*/, jwt: string, config, live: boolean) { super(); this.pagesManager = new PagesManager(this, this.session.isMobile) this.mouseManager = new MouseManager(this); @@ -128,7 +129,7 @@ export default class MessageDistributor extends StatedScreen { /* == REFACTOR_ME == */ const eventList = this.session.events.toJSON(); initListsDepr({ - event: eventList, + event: eventList, stack: this.session.stackEvents.toJSON(), resource: this.session.resources.toJSON(), }); @@ -146,96 +147,83 @@ export default class MessageDistributor extends StatedScreen { } } - - // subscribeOnMessages(sockUrl) { - // this.setMessagesLoading(true); - // const socket = new WebSocket(sockUrl); - // socket.binaryType = 'arraybuffer'; - // socket.onerror = (e) => { - // // TODO: reconnect - // update({ error: true }); - // } - // socket.onmessage = (socketMessage) => { - // const data = new Uint8Array(socketMessage.data); - // const msgs = []; - // messageGenerator // parseBuffer(msgs, data); - // // TODO: count indexes. Now will not work due to wrong indexes - // //msgs.forEach(this.distributeMessage); - // this.setMessagesLoading(false); - // this.setDisconnected(false); - // } - // this._socket = socket; - // } - + private waitingForFiles: boolean = false private loadMessages(): void { - const fileUrl: string = this.session.mobsUrl; - this.setMessagesLoading(true); - window.fetch(fileUrl) - .then(r => r.arrayBuffer()) - .then(b => { - const r = new MFileReader(new Uint8Array(b), this.sessionStart); - const msgs: Array = []; + this.setMessagesLoading(true) + this.waitingForFiles = true - while (r.hasNext()) { - const next = r.next(); - if (next != null) { - this.distributeMessage(next[0], next[1]); - msgs.push(next[0]); + const r = new MFileReader(new Uint8Array(), this.sessionStart) + const msgs: Array = [] + loadFiles(this.session.mobsUrl, + b => { + r.append(b) + let next: ReturnType + while (next = r.next()) { + const [msg, index] = next + this.distributeMessage(msg, index) + this.lastMessageTime = Math.max(msg.time, this.lastMessageTime) + + msgs.push(msg) } - } - // @ts-ignore Hack for upet (TODO: fix ordering in one mutation (removes first)) - const headChildrenIds = msgs.filter(m => m.parentID === 1).map(m => m.id); - //const createNodeTypes = ["create_text_node", "create_element_node"]; - this.pagesManager.sort((m1, m2) =>{ - if (m1.time === m2.time) { - if (m1.tp === "remove_node" && m2.tp !== "remove_node") { - if (headChildrenIds.includes(m1.id)) { - return -1; - } - } else if (m2.tp === "remove_node" && m1.tp !== "remove_node") { - if (headChildrenIds.includes(m2.id)) { - return 1; - } - } else if (m2.tp === "remove_node" && m1.tp === "remove_node") { - const m1FromHead = headChildrenIds.includes(m1.id); - const m2FromHead = headChildrenIds.includes(m2.id); - if (m1FromHead && !m2FromHead) { - return -1; - } else if (m2FromHead && !m1FromHead) { - return 1; + logger.info("Messages count: ", msgs.length, msgs) + + // @ts-ignore Hack for upet (TODO: fix ordering in one mutation in tracker(removes first)) + const headChildrenIds = msgs.filter(m => m.parentID === 1).map(m => m.id); + this.pagesManager.sort((m1, m2) => { + if (m1.time === m2.time) { + if (m1.tp === "remove_node" && m2.tp !== "remove_node") { + if (headChildrenIds.includes(m1.id)) { + return -1; + } + } else if (m2.tp === "remove_node" && m1.tp !== "remove_node") { + if (headChildrenIds.includes(m2.id)) { + return 1; + } + } else if (m2.tp === "remove_node" && m1.tp === "remove_node") { + const m1FromHead = headChildrenIds.includes(m1.id); + const m2FromHead = headChildrenIds.includes(m2.id); + if (m1FromHead && !m2FromHead) { + return -1; + } else if (m2FromHead && !m1FromHead) { + return 1; + } } } - } - return 0; - }) - + return 0; + }) - logger.info("Messages count: ", msgs.length, msgs); - - const stateToUpdate: {[key:string]: any} = { - performanceChartData: this.performanceTrackManager.chartData, - performanceAvaliability: this.performanceTrackManager.avaliability, - }; - this.activirtManager?.end(); - stateToUpdate.skipIntervals = this.activirtManager?.list || []; - LIST_NAMES.forEach(key => { - stateToUpdate[ `${ key }List` ] = this.lists[ key ].list; - }); - update(stateToUpdate); - - this.windowNodeCounter.reset(); - - this.setMessagesLoading(false); + const stateToUpdate: {[key:string]: any} = { + performanceChartData: this.performanceTrackManager.chartData, + performanceAvaliability: this.performanceTrackManager.avaliability, + } + LIST_NAMES.forEach(key => { + stateToUpdate[ `${ key }List` ] = this.lists[ key ].list + }) + update(stateToUpdate) + this.setMessagesLoading(false) + } + ) + .then(() => { + this.windowNodeCounter.reset() + if (this.activirtManager) { + this.activirtManager.end() + update({ + skipIntervals: this.activirtManager.list + }) + } + this.waitingForFiles = false + this.setMessagesLoading(false) + }) + .catch(e => { + logger.error(e) + this.waitingForFiles = false + this.setMessagesLoading(false) + update({ error: true }) }) - .catch((e) => { - logger.error(e); - this.setMessagesLoading(false); - update({ error: true }); - }); } - move(t: number, index?: number):void { + move(t: number, index?: number): void { const stateToUpdate: Partial = {}; /* == REFACTOR_ME == */ const lastLoadedLocationMsg = this.loadedLocationManager.moveToLast(t, index); @@ -248,7 +236,7 @@ export default class MessageDistributor extends StatedScreen { if (llEvent.domContentLoadedTime != null) { stateToUpdate.domContentLoadedTime = { time: llEvent.domContentLoadedTime + this.navigationStartOffset, //TODO: predefined list of load event for the network tab (merge events & SetPageLocation: add navigationStart to db) - value: llEvent.domContentLoadedTime, + value: llEvent.domContentLoadedTime, } } if (llEvent.loadTime != null) { @@ -277,9 +265,9 @@ export default class MessageDistributor extends StatedScreen { } LIST_NAMES.forEach(key => { - const lastMsg = this.lists[ key ].moveToLast(t, key === 'exceptions' ? undefined : index); + const lastMsg = this.lists[key].moveToLast(t, key === 'exceptions' ? undefined : index); if (lastMsg != null) { - stateToUpdate[`${key}ListNow`] = this.lists[ key ].listNow; + stateToUpdate[`${key}ListNow`] = this.lists[key].listNow; } }); @@ -298,21 +286,25 @@ export default class MessageDistributor extends StatedScreen { this.window.scrollTo(lastScroll.x, lastScroll.y); } // Moving mouse and setting :hover classes on ready view - this.mouseManager.move(t); + this.mouseManager.move(t); const lastClick = this.clickManager.moveToLast(t); if (!!lastClick && t - lastClick.time < 600) { // happend during last 600ms this.cursor.click(); } // After all changes - redraw the marker //this.marker.redraw(); - }) + }) + + if (this.waitingForFiles && this.lastMessageTime <= t) { + this.setMessagesLoading(true) + } } _decodeMessage(msg, keys: Array) { const decoded = {}; try { keys.forEach(key => { - decoded[ key ] = this.decoder.decode(msg[ key ]); + decoded[key] = this.decoder.decode(msg[key]); }); } catch (e) { logger.error("Error on message decoding: ", e, msg); @@ -323,15 +315,13 @@ export default class MessageDistributor extends StatedScreen { /* Binded */ distributeMessage = (msg: Message, index: number): void => { - this.lastMessageTime = msg.time; - - if ([ + if ([ "mouse_move", "mouse_click", "create_element_node", // not a user activity, though visual change "set_input_value", "set_input_checked", - "set_viewport_size", + "set_viewport_size", "set_viewport_scroll", ].includes(msg.tp)) { this.activirtManager?.updateAcctivity(msg.time); @@ -343,13 +333,13 @@ export default class MessageDistributor extends StatedScreen { /* Lists: */ case "console_log": if (msg.level === 'debug') break; - listAppend("log", Log({ + listAppend("log", Log({ level: msg.level, value: msg.value, - time, + time, index, })); - break; + break; case "fetch": listAppend("fetch", Resource({ method: msg.method, @@ -362,118 +352,117 @@ export default class MessageDistributor extends StatedScreen { time: msg.timestamp - this.sessionStart, //~ index, })); - break; + break; /* */ case "set_page_location": this.locationManager.add(msg); if (msg.navigationStart > 0) { this.loadedLocationManager.add(msg); } - break; + break; case "set_viewport_size": this.resizeManager.add(msg); - break; + break; case "mouse_move": this.mouseManager.add(msg); - break; + break; case "mouse_click": this.clickManager.add(msg); - break; + break; case "set_viewport_scroll": this.scrollManager.add(msg); - break; + break; case "performance_track": this.performanceTrackManager.add(msg); - break; + break; case "set_page_visibility": this.performanceTrackManager.handleVisibility(msg) - break; + break; case "connection_information": this.connectionInfoManger.add(msg); - break; + break; case "o_table": this.decoder.set(msg.key, msg.value); - break; + break; case "redux": decoded = this._decodeMessage(msg, ["state", "action"]); logger.log(decoded) if (decoded != null) { this.lists.redux.add(decoded); } - break; + break; case "ng_rx": decoded = this._decodeMessage(msg, ["state", "action"]); logger.log(decoded) if (decoded != null) { this.lists.ngrx.add(decoded); - } - break; + } + break; case "vuex": decoded = this._decodeMessage(msg, ["state", "mutation"]); logger.log(decoded) if (decoded != null) { this.lists.vuex.add(decoded); - } - break; + } + break; case "mob_x": decoded = this._decodeMessage(msg, ["payload"]); logger.log(decoded) if (decoded != null) { this.lists.mobx.add(decoded); - } - break; + } + break; case "graph_ql": // @ts-ignore some hack? TODO: remove msg.duration = 0; this.lists.graphql.add(msg); - break; + break; case "profiler": this.lists.profiles.add(msg); - break; + break; case "long_task": this.lists.longtasks.add({ ...msg, time: msg.timestamp - this.sessionStart, }); - break; + break; default: - switch (msg.tp){ + switch (msg.tp) { case "create_document": this.windowNodeCounter.reset(); this.performanceTrackManager.setCurrentNodesCount(this.windowNodeCounter.count); - break; + break; case "create_text_node": case "create_element_node": this.windowNodeCounter.addNode(msg.id, msg.parentID); this.performanceTrackManager.setCurrentNodesCount(this.windowNodeCounter.count); - break; + break; case "move_node": this.windowNodeCounter.moveNode(msg.id, msg.parentID); this.performanceTrackManager.setCurrentNodesCount(this.windowNodeCounter.count); - break; + break; case "remove_node": this.windowNodeCounter.removeNode(msg.id); this.performanceTrackManager.setCurrentNodesCount(this.windowNodeCounter.count); - break; + break; } this.pagesManager.add(msg); - break; + break; } } - getLastMessageTime():number { + getLastMessageTime(): number { return this.lastMessageTime; } - getFirstMessageTime():number { + getFirstMessageTime(): number { return 0; //this.pagesManager.minTime; } // TODO: clean managers? clean() { super.clean(); - //if (this._socket) this._socket.close(); update(INITIAL_STATE); this.assistManager.clear(); } diff --git a/frontend/app/player/MessageDistributor/messages/MFileReader.ts b/frontend/app/player/MessageDistributor/messages/MFileReader.ts index 0204259e5..a4df3e2f8 100644 --- a/frontend/app/player/MessageDistributor/messages/MFileReader.ts +++ b/frontend/app/player/MessageDistributor/messages/MFileReader.ts @@ -7,62 +7,65 @@ import RawMessageReader from './RawMessageReader'; // needSkipMessage() and next() methods here use buf and p protected properties, // which should be probably somehow incapsulated export default class MFileReader extends RawMessageReader { - private pLastMessageID: number = 0; - private currentTime: number = 0; - public error: boolean = false; + private pLastMessageID: number = 0 + private currentTime: number = 0 + public error: boolean = false constructor(data: Uint8Array, private readonly startTime: number) { - super(data); + super(data) } private needSkipMessage(): boolean { - if (this.p === 0) return false; + if (this.p === 0) return false for (let i = 7; i >= 0; i--) { if (this.buf[ this.p + i ] !== this.buf[ this.pLastMessageID + i ]) { - return this.buf[ this.p + i ] - this.buf[ this.pLastMessageID + i ] < 0; + return this.buf[ this.p + i ] - this.buf[ this.pLastMessageID + i ] < 0 } } - return true; + return true } private readRawMessage(): RawMessage | null { - this.skip(8); + this.skip(8) try { - return super.readMessage(); + const msg = super.readMessage() + if (!msg) { + this.skip(-8) + } + return msg } catch (e) { - this.error = true; - logger.error("Read message error:", e); - return null; + this.error = true + logger.error("Read message error:", e) + return null } } - hasNext():boolean { - return !this.error && this.hasNextByte(); - } - next(): [ Message, number] | null { - if (!this.hasNext()) { - return null; + if (this.error || !this.hasNextByte()) { + return null } while (this.needSkipMessage()) { - this.readRawMessage(); + if (!this.readRawMessage()) { + return null + } } - this.pLastMessageID = this.p; - const rMsg = this.readRawMessage(); + this.pLastMessageID = this.p + + const rMsg = this.readRawMessage() if (!rMsg) { - return null; + return null } if (rMsg.tp === "timestamp") { - this.currentTime = rMsg.timestamp - this.startTime; - } else { - const msg = Object.assign(rMsg, { - time: this.currentTime, - _index: this.pLastMessageID, - }) - return [msg, this.pLastMessageID]; - } - return null; + this.currentTime = rMsg.timestamp - this.startTime + return this.next() + } + + const msg = Object.assign(rMsg, { + time: this.currentTime, + _index: this.pLastMessageID, + }) + return [msg, this.pLastMessageID] } } \ No newline at end of file diff --git a/frontend/app/player/MessageDistributor/messages/urlResolve.ts b/frontend/app/player/MessageDistributor/messages/urlResolve.ts index b80ff4f9a..44298ec08 100644 --- a/frontend/app/player/MessageDistributor/messages/urlResolve.ts +++ b/frontend/app/player/MessageDistributor/messages/urlResolve.ts @@ -6,7 +6,6 @@ export function resolveURL(baseURL: string, relURL: string): string { } -var match = /bar/.exec("foobar"); const re1 = /url\(("[^"]*"|'[^']*'|[^)]*)\)/g const re2 = /@import "(.*?)"/g function cssUrlsIndex(css: string): Array<[number, number]> { diff --git a/frontend/app/player/MessageDistributor/network/loadFiles.ts b/frontend/app/player/MessageDistributor/network/loadFiles.ts new file mode 100644 index 000000000..5deecf472 --- /dev/null +++ b/frontend/app/player/MessageDistributor/network/loadFiles.ts @@ -0,0 +1,49 @@ +const NO_NTH_FILE = "nnf" + +export default function load( + urls: string[], + onData: (Uint8Array) => void, +): Promise { + const firstFileURL = urls.shift() + if (!firstFileURL) { + return Promise.reject("No urls provided") + } + return window.fetch(firstFileURL) + .then(r => { + if (r.status >= 400) { + throw new Error(`no start file. status code ${ r.status }`) + } + return r.arrayBuffer() + }) + .then(b => new Uint8Array(b)) + .then(onData) + .then(() => + urls.reduce((p, url) => + p.then(() => + window.fetch(url) + .then(r => { + return new Promise((res, rej) => { + if (r.status == 404) { + rej(NO_NTH_FILE) + return + } + if (r.status >= 400) { + rej(`Bad endfile status code ${r.status}`) + return + } + res(r.arrayBuffer()) + }) + }) + .then(b => new Uint8Array(b)) + .then(onData) + ), + Promise.resolve(), + ) + ) + .catch(e => { + if (e === NO_NTH_FILE) { + return + } + throw e + }) +} From f12931491a6941abf2cb7bc87b16f7563de4ae1e Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Fri, 6 May 2022 12:06:55 +0200 Subject: [PATCH 078/260] feat(ui) - audit - base views --- .../Audit/AuditDetailModal/AuditDetailModal.tsx | 11 +++++++++++ .../Client/Audit/AuditDetailModal/index.ts | 1 + .../Client/Audit/AuditList/AuditList.tsx | 14 ++++++++++++++ .../app/components/Client/Audit/AuditList/index.ts | 1 + .../Client/Audit/AuditListItem/AuditListItem.tsx | 14 ++++++++++++++ .../components/Client/Audit/AuditListItem/index.ts | 1 + .../Client/Audit/AuditView/AuditView.tsx | 11 +++++++++++ .../app/components/Client/Audit/AuditView/index.ts | 1 + 8 files changed, 54 insertions(+) create mode 100644 frontend/app/components/Client/Audit/AuditDetailModal/AuditDetailModal.tsx create mode 100644 frontend/app/components/Client/Audit/AuditDetailModal/index.ts create mode 100644 frontend/app/components/Client/Audit/AuditList/AuditList.tsx create mode 100644 frontend/app/components/Client/Audit/AuditList/index.ts create mode 100644 frontend/app/components/Client/Audit/AuditListItem/AuditListItem.tsx create mode 100644 frontend/app/components/Client/Audit/AuditListItem/index.ts create mode 100644 frontend/app/components/Client/Audit/AuditView/AuditView.tsx create mode 100644 frontend/app/components/Client/Audit/AuditView/index.ts diff --git a/frontend/app/components/Client/Audit/AuditDetailModal/AuditDetailModal.tsx b/frontend/app/components/Client/Audit/AuditDetailModal/AuditDetailModal.tsx new file mode 100644 index 000000000..03a5eee0d --- /dev/null +++ b/frontend/app/components/Client/Audit/AuditDetailModal/AuditDetailModal.tsx @@ -0,0 +1,11 @@ +import React from 'react'; + +function AuditDetailModal(props) { + return ( +
    + +
    + ); +} + +export default AuditDetailModal; \ No newline at end of file diff --git a/frontend/app/components/Client/Audit/AuditDetailModal/index.ts b/frontend/app/components/Client/Audit/AuditDetailModal/index.ts new file mode 100644 index 000000000..fcf6bb2b4 --- /dev/null +++ b/frontend/app/components/Client/Audit/AuditDetailModal/index.ts @@ -0,0 +1 @@ +export { default } from './AuditDetailModal'; \ No newline at end of file diff --git a/frontend/app/components/Client/Audit/AuditList/AuditList.tsx b/frontend/app/components/Client/Audit/AuditList/AuditList.tsx new file mode 100644 index 000000000..fc135f102 --- /dev/null +++ b/frontend/app/components/Client/Audit/AuditList/AuditList.tsx @@ -0,0 +1,14 @@ +import React from 'react'; + +interface Props { + +} +function AuditList(props: Props) { + return ( +
    + List +
    + ); +} + +export default AuditList; \ No newline at end of file diff --git a/frontend/app/components/Client/Audit/AuditList/index.ts b/frontend/app/components/Client/Audit/AuditList/index.ts new file mode 100644 index 000000000..2e6bc3739 --- /dev/null +++ b/frontend/app/components/Client/Audit/AuditList/index.ts @@ -0,0 +1 @@ +export { default } from './AuditList' \ No newline at end of file diff --git a/frontend/app/components/Client/Audit/AuditListItem/AuditListItem.tsx b/frontend/app/components/Client/Audit/AuditListItem/AuditListItem.tsx new file mode 100644 index 000000000..b587f08e7 --- /dev/null +++ b/frontend/app/components/Client/Audit/AuditListItem/AuditListItem.tsx @@ -0,0 +1,14 @@ +import React from 'react'; + +interface Props { + +} +function AuditListItem(props: Props) { + return ( +
    + +
    + ); +} + +export default AuditListItem; \ No newline at end of file diff --git a/frontend/app/components/Client/Audit/AuditListItem/index.ts b/frontend/app/components/Client/Audit/AuditListItem/index.ts new file mode 100644 index 000000000..821ee9639 --- /dev/null +++ b/frontend/app/components/Client/Audit/AuditListItem/index.ts @@ -0,0 +1 @@ +export { default } from './AuditListItem'; \ No newline at end of file diff --git a/frontend/app/components/Client/Audit/AuditView/AuditView.tsx b/frontend/app/components/Client/Audit/AuditView/AuditView.tsx new file mode 100644 index 000000000..02554fe1d --- /dev/null +++ b/frontend/app/components/Client/Audit/AuditView/AuditView.tsx @@ -0,0 +1,11 @@ +import React from 'react'; + +function AuditView(props) { + return ( +
    + View +
    + ); +} + +export default AuditView; \ No newline at end of file diff --git a/frontend/app/components/Client/Audit/AuditView/index.ts b/frontend/app/components/Client/Audit/AuditView/index.ts new file mode 100644 index 000000000..ba32b1be0 --- /dev/null +++ b/frontend/app/components/Client/Audit/AuditView/index.ts @@ -0,0 +1 @@ +export { default } from './AuditView' \ No newline at end of file From 2b3728d8dabd2fc0244f4eb661e6162e455f54a7 Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Fri, 6 May 2022 12:16:24 +0200 Subject: [PATCH 079/260] Finished refactoring for session ender service --- backend/cmd/ender/main.go | 30 +++++++++---- backend/internal/ender/builder.go | 56 ----------------------- backend/internal/ender/builderMap.go | 36 --------------- backend/internal/sessionender/ender.go | 62 ++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 101 deletions(-) delete mode 100644 backend/internal/ender/builder.go delete mode 100644 backend/internal/ender/builderMap.go create mode 100644 backend/internal/sessionender/ender.go diff --git a/backend/cmd/ender/main.go b/backend/cmd/ender/main.go index dbe2fa212..5d82b67db 100644 --- a/backend/cmd/ender/main.go +++ b/backend/cmd/ender/main.go @@ -3,7 +3,7 @@ package main import ( "log" "openreplay/backend/internal/config/ender" - builder "openreplay/backend/internal/ender" + "openreplay/backend/internal/sessionender" "time" "os" @@ -20,10 +20,12 @@ import ( func main() { log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) + // Load service configuration cfg := ender.New() - builderMap := builder.NewBuilderMap() + // Init all modules statsLogger := logger.NewQueueStats(cfg.LoggerTimeout) + sessions := sessionender.New(intervals.EVENTS_SESSION_END_TIMEOUT) producer := queue.NewProducer() consumer := queue.NewMessageConsumer( cfg.GroupEvents, @@ -33,31 +35,41 @@ func main() { }, func(sessionID uint64, msg messages.Message, meta *types.Meta) { statsLogger.Collect(sessionID, meta) - builderMap.HandleMessage(sessionID, msg, msg.Meta().Index) + sessions.UpdateSession(sessionID, messages.GetTimestamp(msg)) }, false, ) - tick := time.Tick(intervals.EVENTS_COMMIT_INTERVAL * time.Millisecond) + log.Printf("Ender service started\n") sigchan := make(chan os.Signal, 1) signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM) - log.Printf("Ender service started\n") + tick := time.Tick(intervals.EVENTS_COMMIT_INTERVAL * time.Millisecond) for { select { case sig := <-sigchan: log.Printf("Caught signal %v: terminating\n", sig) producer.Close(cfg.ProducerTimeout) - consumer.CommitBack(intervals.EVENTS_BACK_COMMIT_GAP) + if err := consumer.CommitBack(intervals.EVENTS_BACK_COMMIT_GAP); err != nil { + log.Printf("can't commit messages with offset: %s", err) + } consumer.Close() os.Exit(0) case <-tick: - builderMap.IterateReadyMessages(time.Now().UnixMilli(), func(sessionID uint64, readyMsg messages.Message) { - producer.Produce(cfg.TopicTrigger, sessionID, messages.Encode(readyMsg)) + // Find ended sessions and send notification to other services + sessions.HandleEndedSessions(func(sessionID uint64, timestamp int64) bool { + msg := &messages.SessionEnd{Timestamp: uint64(timestamp)} + if err := producer.Produce(cfg.TopicTrigger, sessionID, messages.Encode(msg)); err != nil { + log.Printf("can't send message to queue: %s", err) + return false + } + return true }) producer.Flush(cfg.ProducerTimeout) - consumer.CommitBack(intervals.EVENTS_BACK_COMMIT_GAP) + if err := consumer.CommitBack(intervals.EVENTS_BACK_COMMIT_GAP); err != nil { + log.Printf("can't commit messages with offset: %s", err) + } default: if err := consumer.ConsumeNext(); err != nil { log.Fatalf("Error on consuming: %v", err) diff --git a/backend/internal/ender/builder.go b/backend/internal/ender/builder.go deleted file mode 100644 index 0389f74d1..000000000 --- a/backend/internal/ender/builder.go +++ /dev/null @@ -1,56 +0,0 @@ -package builder - -import ( - "log" - "openreplay/backend/pkg/intervals" - . "openreplay/backend/pkg/messages" -) - -type builder struct { - readyMsgs []Message - timestamp uint64 - sid uint64 -} - -func NewBuilder() *builder { - return &builder{} -} - -func (b *builder) appendReadyMessage(msg Message) { // interface is never nil even if it holds nil value - b.readyMsgs = append(b.readyMsgs, msg) -} - -func (b *builder) buildSessionEnd() { - if b.timestamp == 0 { - return - } - sessionEnd := &SessionEnd{ - Timestamp: b.timestamp, - } - b.appendReadyMessage(sessionEnd) -} - -func (b *builder) handleMessage(message Message, messageID uint64) { - timestamp := GetTimestamp(message) - if b.timestamp < timestamp { - b.timestamp = timestamp - } - - if b.timestamp == 0 { - log.Printf("Empty timestamp, sessionID: %d, messageID: %d", b.sid, messageID) - return - } -} - -func (b *builder) checkTimeouts(ts int64) bool { - if b.timestamp == 0 { - return false // There was no timestamp events yet - } - - lastTsGap := ts - int64(b.timestamp) - if lastTsGap > intervals.EVENTS_SESSION_END_TIMEOUT { - b.buildSessionEnd() - return true - } - return false -} diff --git a/backend/internal/ender/builderMap.go b/backend/internal/ender/builderMap.go deleted file mode 100644 index 6eba1f9ad..000000000 --- a/backend/internal/ender/builderMap.go +++ /dev/null @@ -1,36 +0,0 @@ -package builder - -import ( - . "openreplay/backend/pkg/messages" -) - -type builderMap map[uint64]*builder - -func NewBuilderMap() builderMap { - return make(builderMap) -} - -func (m builderMap) GetBuilder(sessionID uint64) *builder { - b := m[sessionID] - if b == nil { - b = NewBuilder() - m[sessionID] = b - b.sid = sessionID - - } - return b -} - -func (m builderMap) HandleMessage(sessionID uint64, msg Message, messageID uint64) { - b := m.GetBuilder(sessionID) - b.handleMessage(msg, messageID) -} - -func (m builderMap) IterateReadyMessages(operatingTs int64, iter func(sessionID uint64, msg Message)) { - for sessionID, b := range m { - sessionEnded := b.checkTimeouts(operatingTs) - if sessionEnded { - delete(m, sessionID) - } - } -} diff --git a/backend/internal/sessionender/ender.go b/backend/internal/sessionender/ender.go new file mode 100644 index 000000000..54bd399ac --- /dev/null +++ b/backend/internal/sessionender/ender.go @@ -0,0 +1,62 @@ +package sessionender + +import ( + "log" + "time" +) + +// EndedSessionHandler handler for ended sessions +type EndedSessionHandler func(sessionID uint64, timestamp int64) bool + +// session holds information about user's session live status +type session struct { + lastTimestamp int64 + isEnded bool +} + +// SessionEnder updates timestamp of last message for each session +type SessionEnder struct { + timeout int64 + sessions map[uint64]*session // map[sessionID]session +} + +func New(timeout int64) *SessionEnder { + return &SessionEnder{ + timeout: timeout, + sessions: make(map[uint64]*session), + } +} + +// UpdateSession save timestamp for new sessions and update for existing sessions +func (se *SessionEnder) UpdateSession(sessionID, timestamp uint64) { + currTS := int64(timestamp) + if currTS == 0 { + log.Printf("got empty timestamp for sessionID: %d", sessionID) + return + } + sess, ok := se.sessions[sessionID] + if !ok { + se.sessions[sessionID] = &session{ + lastTimestamp: currTS, + isEnded: false, + } + return + } + if currTS > sess.lastTimestamp { + sess.lastTimestamp = currTS + sess.isEnded = false + } +} + +// HandleEndedSessions runs handler for each ended session and delete information about session in successful case +func (se *SessionEnder) HandleEndedSessions(handler EndedSessionHandler) { + deadLine := time.Now().UnixMilli() - se.timeout + for sessID, sess := range se.sessions { + if sess.isEnded || sess.lastTimestamp < deadLine { + sess.isEnded = true + if handler(sessID, sess.lastTimestamp) { + delete(se.sessions, sessID) + } + } + } +} From 967034a89cedeb05473ed67e70c0e8e16c7e4b44 Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Fri, 6 May 2022 16:12:06 +0200 Subject: [PATCH 080/260] Create first version of heuristics service with the same logic as old ender --- backend/build.sh | 2 +- backend/cmd/heuristics/main.go | 7 ++----- backend/services/heuristics/build_hack | 0 3 files changed, 3 insertions(+), 6 deletions(-) create mode 100644 backend/services/heuristics/build_hack diff --git a/backend/build.sh b/backend/build.sh index b78d71fd8..70a29c5af 100755 --- a/backend/build.sh +++ b/backend/build.sh @@ -23,7 +23,7 @@ function build_service() { image="$1" echo "BUILDING $image" case "$image" in - http | db | ender) + http | db | ender | heuristics) echo build http docker build -t ${DOCKER_REPO:-'local'}/$image:${git_sha1} --build-arg SERVICE_NAME=$image -f ./cmd/Dockerfile . [[ $PUSH_IMAGE -eq 1 ]] && { diff --git a/backend/cmd/heuristics/main.go b/backend/cmd/heuristics/main.go index b33511bd1..2778685d3 100644 --- a/backend/cmd/heuristics/main.go +++ b/backend/cmd/heuristics/main.go @@ -36,12 +36,12 @@ func main() { false, ) - tick := time.Tick(intervals.EVENTS_COMMIT_INTERVAL * time.Millisecond) + log.Printf("Ender service started\n") sigchan := make(chan os.Signal, 1) signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM) - log.Printf("Ender service started\n") + tick := time.Tick(intervals.EVENTS_COMMIT_INTERVAL * time.Millisecond) for { select { case sig := <-sigchan: @@ -62,7 +62,4 @@ func main() { } } } - - // Config - } diff --git a/backend/services/heuristics/build_hack b/backend/services/heuristics/build_hack new file mode 100644 index 000000000..e69de29bb From 8c432b8ba379dc2018e9252d36bb8e28d0a1eb61 Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Fri, 6 May 2022 16:39:29 +0200 Subject: [PATCH 081/260] Removed from heuristics extra logic --- backend/internal/builder/builder.go | 185 +----------------- .../inputEventBuilder.go | 0 .../pageEventBuilder.go | 0 3 files changed, 1 insertion(+), 184 deletions(-) rename backend/internal/{builder => heuristics}/inputEventBuilder.go (100%) rename backend/internal/{builder => heuristics}/pageEventBuilder.go (100%) diff --git a/backend/internal/builder/builder.go b/backend/internal/builder/builder.go index bd9f26b19..b3dc909b7 100644 --- a/backend/internal/builder/builder.go +++ b/backend/internal/builder/builder.go @@ -44,9 +44,7 @@ type builder struct { readyMsgs []Message timestamp uint64 lastProcessedTimestamp int64 - peBuilder *pageEventBuilder // TODO: DB ptaBuilder *performanceTrackAggrBuilder - ieBuilder *inputEventBuilder // TODO: DB ciFinder *cpuIssueFinder miFinder *memoryIssueFinder ddDetector *domDropDetector @@ -59,9 +57,7 @@ type builder struct { func NewBuilder() *builder { return &builder{ - peBuilder: &pageEventBuilder{}, ptaBuilder: &performanceTrackAggrBuilder{}, - ieBuilder: NewInputEventBuilder(), ciFinder: &cpuIssueFinder{}, miFinder: &memoryIssueFinder{}, ddDetector: &domDropDetector{}, @@ -82,87 +78,24 @@ func (b *builder) iterateReadyMessage(iter func(msg Message)) { b.readyMsgs = nil } -func (b *builder) buildSessionEnd() { - if b.timestamp == 0 { - return - } - sessionEnd := &SessionEnd{ - Timestamp: b.timestamp, // + delay? - } - b.appendReadyMessage(sessionEnd) -} - -func (b *builder) buildPageEvent() { - if msg := b.peBuilder.Build(); msg != nil { - b.appendReadyMessage(msg) - } -} func (b *builder) buildPerformanceTrackAggr() { if msg := b.ptaBuilder.Build(); msg != nil { b.appendReadyMessage(msg) } } -func (b *builder) buildInputEvent() { - if msg := b.ieBuilder.Build(); msg != nil { - b.appendReadyMessage(msg) - } -} func (b *builder) handleMessage(message Message, messageID uint64) { timestamp := GetTimestamp(message) - if b.timestamp < timestamp { // unnecessary? TODO: test and remove + if b.timestamp < timestamp { b.timestamp = timestamp } b.lastProcessedTimestamp = time.Now().UnixMilli() - // Might happen before the first timestamp. - // TODO: to DB - switch msg := message.(type) { - case *SessionStart, - *Metadata, - *UserID, - *UserAnonymousID: - b.appendReadyMessage(msg) - case *RawErrorEvent: - b.appendReadyMessage(&ErrorEvent{ - MessageID: messageID, - Timestamp: msg.Timestamp, - Source: msg.Source, - Name: msg.Name, - Message: msg.Message, - Payload: msg.Payload, - }) - } if b.timestamp == 0 { return } switch msg := message.(type) { - case *SetPageLocation: // TODO: DB - if msg.NavigationStart == 0 { - b.appendReadyMessage(&PageEvent{ - URL: msg.URL, - Referrer: msg.Referrer, - Loaded: false, - MessageID: messageID, - Timestamp: b.timestamp, - }) - } else { - b.buildPageEvent() - b.buildInputEvent() - b.ieBuilder.ClearLabels() - b.peBuilder.HandleSetPageLocation(msg, messageID, b.timestamp) - b.miFinder.HandleSetPageLocation(msg) - b.ciFinder.HandleSetPageLocation(msg) - } - case *PageLoadTiming: // TODO: DB - if rm := b.peBuilder.HandlePageLoadTiming(msg); rm != nil { - b.appendReadyMessage(rm) - } - case *PageRenderTiming: // TODO: DB - if rm := b.peBuilder.HandlePageRenderTiming(msg); rm != nil { - b.appendReadyMessage(rm) - } case *PerformanceTrack: if rm := b.ptaBuilder.HandlePerformanceTrack(msg, b.timestamp); rm != nil { b.appendReadyMessage(rm) @@ -173,113 +106,6 @@ func (b *builder) handleMessage(message Message, messageID uint64) { if rm := b.miFinder.HandlePerformanceTrack(msg, messageID, b.timestamp); rm != nil { b.appendReadyMessage(rm) } - case *SetInputTarget: // TODO: DB - if rm := b.ieBuilder.HandleSetInputTarget(msg); rm != nil { - b.appendReadyMessage(rm) - } - case *SetInputValue: // TODO: DB - if rm := b.ieBuilder.HandleSetInputValue(msg, messageID, b.timestamp); rm != nil { - b.appendReadyMessage(rm) - } - case *MouseClick: // TODO: DB - b.buildInputEvent() - if rm := b.crDetector.HandleMouseClick(msg, messageID, b.timestamp); rm != nil { - b.appendReadyMessage(rm) - } - if msg.Label != "" { // TODO: DB - b.appendReadyMessage(&ClickEvent{ - MessageID: messageID, - Label: msg.Label, - HesitationTime: msg.HesitationTime, - Timestamp: b.timestamp, - Selector: msg.Selector, - }) - } - case *JSException: - b.appendReadyMessage(&ErrorEvent{ // TODO: DB - MessageID: messageID, - Timestamp: b.timestamp, - Source: "js_exception", - Name: msg.Name, - Message: msg.Message, - Payload: msg.Payload, - }) - case *ResourceTiming: - tp := getResourceType(msg.Initiator, msg.URL) - success := msg.Duration != 0 - b.appendReadyMessage(&ResourceEvent{ // TODO: DB - MessageID: messageID, - Timestamp: msg.Timestamp, - Duration: msg.Duration, - TTFB: msg.TTFB, - HeaderSize: msg.HeaderSize, - EncodedBodySize: msg.EncodedBodySize, - DecodedBodySize: msg.DecodedBodySize, - URL: msg.URL, - Type: tp, - Success: success, - }) - if !success { - issueType := "missing_resource" - if tp == "fetch" { - issueType = "bad_request" - } - b.appendReadyMessage(&IssueEvent{ - Type: issueType, - MessageID: messageID, - Timestamp: msg.Timestamp, - ContextString: msg.URL, - }) - } - case *RawCustomEvent: - b.appendReadyMessage(&CustomEvent{ // TODO: DB - MessageID: messageID, - Timestamp: b.timestamp, - Name: msg.Name, - Payload: msg.Payload, - }) - case *CustomIssue: - b.appendReadyMessage(&IssueEvent{ // TODO: DB - Type: "custom", - Timestamp: b.timestamp, - MessageID: messageID, - ContextString: msg.Name, - Payload: msg.Payload, - }) - case *Fetch: - b.appendReadyMessage(&FetchEvent{ // TODO: DB - MessageID: messageID, - Timestamp: msg.Timestamp, - Method: msg.Method, - URL: msg.URL, - Request: msg.Request, - Response: msg.Response, - Status: msg.Status, - Duration: msg.Duration, - }) - if msg.Status >= 400 { - b.appendReadyMessage(&IssueEvent{ - Type: "bad_request", - MessageID: messageID, - Timestamp: msg.Timestamp, - ContextString: msg.URL, - }) - } - case *GraphQL: - b.appendReadyMessage(&GraphQLEvent{ // TODO: DB - MessageID: messageID, - Timestamp: b.timestamp, - OperationKind: msg.OperationKind, - OperationName: msg.OperationName, - Variables: msg.Variables, - Response: msg.Response, - }) - case *StateAction: - b.appendReadyMessage(&StateActionEvent{ // TODO: DB - MessageID: messageID, - Timestamp: b.timestamp, - Type: msg.Type, - }) case *CreateElementNode, *CreateTextNode: b.ddDetector.HandleNodeCreation() @@ -300,19 +126,11 @@ func (b *builder) checkTimeouts(ts int64) bool { return false // There was no timestamp events yet } - if b.peBuilder.HasInstance() && int64(b.peBuilder.GetTimestamp())+intervals.EVENTS_PAGE_EVENT_TIMEOUT < ts { - b.buildPageEvent() - } - if b.ieBuilder.HasInstance() && int64(b.ieBuilder.GetTimestamp())+intervals.EVENTS_INPUT_EVENT_TIMEOUT < ts { - b.buildInputEvent() - } if b.ptaBuilder.HasInstance() && int64(b.ptaBuilder.GetStartTimestamp())+intervals.EVENTS_PERFORMANCE_AGGREGATION_TIMEOUT < ts { b.buildPerformanceTrackAggr() } lastTsGap := ts - int64(b.timestamp) - //b.lastProcessedTimestamp - //log.Printf("checking timeouts for sess %v: %v now, %v sesstime; gap %v",b.sid, ts, b.timestamp, lastTsGap) if lastTsGap > intervals.EVENTS_SESSION_END_TIMEOUT { if rm := b.ddDetector.Build(); rm != nil { b.appendReadyMessage(rm) @@ -329,7 +147,6 @@ func (b *builder) checkTimeouts(ts int64) bool { if rm := b.dcDetector.HandleReaction(b.timestamp); rm != nil { b.appendReadyMessage(rm) } - b.buildSessionEnd() return true } return false diff --git a/backend/internal/builder/inputEventBuilder.go b/backend/internal/heuristics/inputEventBuilder.go similarity index 100% rename from backend/internal/builder/inputEventBuilder.go rename to backend/internal/heuristics/inputEventBuilder.go diff --git a/backend/internal/builder/pageEventBuilder.go b/backend/internal/heuristics/pageEventBuilder.go similarity index 100% rename from backend/internal/builder/pageEventBuilder.go rename to backend/internal/heuristics/pageEventBuilder.go From 7feaa376e6d83139e7d16b92d23aca3e66df7516 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Fri, 6 May 2022 17:31:35 +0200 Subject: [PATCH 082/260] feat(ui) - audit - list and search --- frontend/app/api_client.js | 3 +- .../AuditDetailModal/AuditDetailModal.tsx | 7 ++- .../Client/Audit/AuditList/AuditList.tsx | 58 +++++++++++++++++-- .../Audit/AuditListItem/AuditListItem.tsx | 11 +++- .../AuditSearchField/AuditSearchField.tsx | 33 +++++++++++ .../Client/Audit/AuditSearchField/index.ts | 1 + .../Client/Audit/AuditView/AuditView.tsx | 19 +++++- frontend/app/components/Client/Client.js | 2 + .../Client/ManageUsers/ManageUsers.js | 2 +- .../Client/PreferencesMenu/PreferencesMenu.js | 13 ++++- frontend/app/mstore/auditStore.ts | 43 ++++++++++++++ frontend/app/mstore/index.tsx | 5 +- frontend/app/mstore/types/audit.ts | 36 ++++++++++++ frontend/app/mstore/types/user.ts | 2 +- frontend/app/routes.js | 3 +- frontend/app/services/AuditService.ts | 25 ++++++++ frontend/app/services/index.ts | 4 +- frontend/app/svg/icons/list-ul.svg | 3 + frontend/app/utils.js | 6 ++ 19 files changed, 255 insertions(+), 21 deletions(-) create mode 100644 frontend/app/components/Client/Audit/AuditSearchField/AuditSearchField.tsx create mode 100644 frontend/app/components/Client/Audit/AuditSearchField/index.ts create mode 100644 frontend/app/mstore/auditStore.ts create mode 100644 frontend/app/mstore/types/audit.ts create mode 100644 frontend/app/services/AuditService.ts create mode 100644 frontend/app/svg/icons/list-ul.svg diff --git a/frontend/app/api_client.js b/frontend/app/api_client.js index 98a1f4dfd..a5fae45e7 100644 --- a/frontend/app/api_client.js +++ b/frontend/app/api_client.js @@ -24,7 +24,8 @@ const siteIdRequiredPaths = [ '/heatmaps', '/custom_metrics', '/dashboards', - '/metrics' + '/metrics', + '/trails', // '/custom_metrics/sessions', ]; diff --git a/frontend/app/components/Client/Audit/AuditDetailModal/AuditDetailModal.tsx b/frontend/app/components/Client/Audit/AuditDetailModal/AuditDetailModal.tsx index 03a5eee0d..b7c257e3e 100644 --- a/frontend/app/components/Client/Audit/AuditDetailModal/AuditDetailModal.tsx +++ b/frontend/app/components/Client/Audit/AuditDetailModal/AuditDetailModal.tsx @@ -2,8 +2,11 @@ import React from 'react'; function AuditDetailModal(props) { return ( -
    - +
    +

    Audit Details

    +
    + +
    ); } diff --git a/frontend/app/components/Client/Audit/AuditList/AuditList.tsx b/frontend/app/components/Client/Audit/AuditList/AuditList.tsx index fc135f102..2b4249155 100644 --- a/frontend/app/components/Client/Audit/AuditList/AuditList.tsx +++ b/frontend/app/components/Client/Audit/AuditList/AuditList.tsx @@ -1,14 +1,60 @@ -import React from 'react'; +import { useModal } from 'App/components/Modal'; +import { useStore } from 'App/mstore'; +import { useObserver } from 'mobx-react-lite'; +import React, { useEffect } from 'react'; +import { Loader, Pagination, NoContent } from 'UI'; +import AuditDetailModal from '../AuditDetailModal'; +import AuditListItem from '../AuditListItem'; interface Props { } function AuditList(props: Props) { - return ( -
    - List -
    - ); + const { auditStore } = useStore(); + const loading = useObserver(() => auditStore.isLoading); + const list = useObserver(() => auditStore.list); + const searchQuery = useObserver(() => auditStore.searchQuery); + const page = useObserver(() => auditStore.page); + const { showModal } = useModal(); + + useEffect(() => { + auditStore.fetchAudits({ + page: auditStore.page, + limit: auditStore.pageSize, + query: auditStore.searchQuery, + }); + }, [page, searchQuery]); + + return useObserver(() => ( + + +
    +
    Name
    +
    Status
    +
    Time
    +
    + + {list.map((item, index) => ( +
    + showModal(, { right: true })} + /> +
    + ))} + +
    + auditStore.updateKey('page', page)} + limit={auditStore.pageSize} + debounceRequest={200} + /> +
    +
    +
    + )); } export default AuditList; \ No newline at end of file diff --git a/frontend/app/components/Client/Audit/AuditListItem/AuditListItem.tsx b/frontend/app/components/Client/Audit/AuditListItem/AuditListItem.tsx index b587f08e7..492d5c140 100644 --- a/frontend/app/components/Client/Audit/AuditListItem/AuditListItem.tsx +++ b/frontend/app/components/Client/Audit/AuditListItem/AuditListItem.tsx @@ -1,12 +1,17 @@ import React from 'react'; +import { checkForRecent } from 'App/date'; interface Props { - + audit: any; + onShowDetails: () => void; } function AuditListItem(props: Props) { + const { audit, onShowDetails } = props; return ( -
    - +
    +
    asd
    +
    {audit.action}
    +
    {audit.createdAt && checkForRecent(audit.createdAt, 'LLL dd, yyyy, hh:mm a')}
    ); } diff --git a/frontend/app/components/Client/Audit/AuditSearchField/AuditSearchField.tsx b/frontend/app/components/Client/Audit/AuditSearchField/AuditSearchField.tsx new file mode 100644 index 000000000..8c0d32d5b --- /dev/null +++ b/frontend/app/components/Client/Audit/AuditSearchField/AuditSearchField.tsx @@ -0,0 +1,33 @@ +import React, { useEffect } from 'react'; +import { Icon } from 'UI'; +import { debounce } from 'App/utils'; + +let debounceUpdate: any = () => {} +interface Props { + onChange: (value: string) => void; +} +function AuditSearchField(props: Props) { + const { onChange } = props; + + useEffect(() => { + debounceUpdate = debounce((value) => onChange(value), 500); + }, []) + + const write = ({ target: { name, value } }) => { + debounceUpdate(value); + } + + return ( +
    + + +
    + ); +} + +export default AuditSearchField; \ No newline at end of file diff --git a/frontend/app/components/Client/Audit/AuditSearchField/index.ts b/frontend/app/components/Client/Audit/AuditSearchField/index.ts new file mode 100644 index 000000000..646947095 --- /dev/null +++ b/frontend/app/components/Client/Audit/AuditSearchField/index.ts @@ -0,0 +1 @@ +export { default } from './AuditSearchField'; \ No newline at end of file diff --git a/frontend/app/components/Client/Audit/AuditView/AuditView.tsx b/frontend/app/components/Client/Audit/AuditView/AuditView.tsx index 02554fe1d..ec9904567 100644 --- a/frontend/app/components/Client/Audit/AuditView/AuditView.tsx +++ b/frontend/app/components/Client/Audit/AuditView/AuditView.tsx @@ -1,11 +1,24 @@ import React from 'react'; +import { PageTitle } from 'UI'; +import AuditList from '../AuditList'; +import AuditSearchField from '../AuditSearchField'; +import { useStore } from 'App/mstore'; +import { useObserver } from 'mobx-react-lite'; function AuditView(props) { - return ( + const { auditStore } = useStore(); + return useObserver(() => (
    - View +
    + +
    + auditStore.updateKey('searchQuery', value) }/> +
    +
    + +
    - ); + )); } export default AuditView; \ No newline at end of file diff --git a/frontend/app/components/Client/Client.js b/frontend/app/components/Client/Client.js index 518148a5c..c58056b5f 100644 --- a/frontend/app/components/Client/Client.js +++ b/frontend/app/components/Client/Client.js @@ -8,6 +8,7 @@ import ProfileSettings from './ProfileSettings'; import Integrations from './Integrations'; import ManageUsers from './ManageUsers'; import UserView from './Users/UsersView'; +import AuditView from './Audit/AuditView'; import Sites from './Sites'; import CustomFields from './CustomFields'; import Webhooks from './Webhooks'; @@ -43,6 +44,7 @@ export default class Client extends React.PureComponent { + ) diff --git a/frontend/app/components/Client/ManageUsers/ManageUsers.js b/frontend/app/components/Client/ManageUsers/ManageUsers.js index 9071ee46b..1504a0631 100644 --- a/frontend/app/components/Client/ManageUsers/ManageUsers.js +++ b/frontend/app/components/Client/ManageUsers/ManageUsers.js @@ -236,7 +236,7 @@ class ManageUsers extends React.PureComponent { title="No users are available." size="small" show={ members.size === 0 } - icon + animatedIcon="empty-state" >
    { diff --git a/frontend/app/components/Client/PreferencesMenu/PreferencesMenu.js b/frontend/app/components/Client/PreferencesMenu/PreferencesMenu.js index 0c57c1ab7..682d1519a 100644 --- a/frontend/app/components/Client/PreferencesMenu/PreferencesMenu.js +++ b/frontend/app/components/Client/PreferencesMenu/PreferencesMenu.js @@ -78,6 +78,17 @@ function PreferencesMenu({ activeTab, appearance, history, isEnterprise }) { />
    )} + + { isEnterprise && ( +
    + setTab(CLIENT_TABS.AUDIT) } + /> +
    + )}
    setTab(CLIENT_TABS.NOTIFICATIONS) } /> -
    +
    ) } diff --git a/frontend/app/mstore/auditStore.ts b/frontend/app/mstore/auditStore.ts new file mode 100644 index 000000000..11b0ba9f4 --- /dev/null +++ b/frontend/app/mstore/auditStore.ts @@ -0,0 +1,43 @@ +import { makeAutoObservable, runInAction, observable, action, reaction } from "mobx" +import { auditService } from "App/services" +import Audit from './types/audit' + +export default class AuditStore { + list: any[] = []; + total: number = 0; + page: number = 1; + pageSize: number = 20; + searchQuery: string = ''; + isLoading: boolean = false; + + constructor() { + makeAutoObservable(this, { + searchQuery: observable, + updateKey: action, + fetchAudits: action, + }) + } + + updateKey(key: string, value: any) { + console.log(key, value) + this[key] = value; + } + + fetchAudits = (data: any): Promise => { + this.isLoading = true; + return new Promise((resolve, reject) => { + auditService.all(data).then(response => { + console.log('response', response); + runInAction(() => { + this.list = response.sessions.map(item => Audit.fromJson(item)) + this.total = response.count + }) + resolve() + }).catch(error => { + reject(error) + }).finally(() => { + this.isLoading = false; + }) + }) + } +} \ No newline at end of file diff --git a/frontend/app/mstore/index.tsx b/frontend/app/mstore/index.tsx index 251b70f9e..2a1897b42 100644 --- a/frontend/app/mstore/index.tsx +++ b/frontend/app/mstore/index.tsx @@ -4,8 +4,9 @@ import MetricStore, { IMetricStore } from './metricStore'; import UserStore from './userStore'; import RoleStore from './roleStore'; import APIClient from 'App/api_client'; -import { dashboardService, metricService, sessionService, userService } from 'App/services'; +import { dashboardService, metricService, sessionService, userService, auditService } from 'App/services'; import SettingsStore from './settingsStore'; +import AuditStore from './auditStore'; export class RootStore { dashboardStore: IDashboardSotre; @@ -13,6 +14,7 @@ export class RootStore { settingsStore: SettingsStore; userStore: UserStore; roleStore: RoleStore; + auditStore: AuditStore; constructor() { this.dashboardStore = new DashboardStore(); @@ -20,6 +22,7 @@ export class RootStore { this.settingsStore = new SettingsStore(); this.userStore = new UserStore(); this.roleStore = new RoleStore(); + this.auditStore = new AuditStore(); } initClient() { diff --git a/frontend/app/mstore/types/audit.ts b/frontend/app/mstore/types/audit.ts new file mode 100644 index 000000000..b9c30343f --- /dev/null +++ b/frontend/app/mstore/types/audit.ts @@ -0,0 +1,36 @@ +import { DateTime } from 'luxon'; +import { unserscoreToSpaceAndCapitalize } from 'App/utils'; + +export default class Audit { + id: string = ''; + userName: string = ''; + action: string = ''; + createdAt: any = null; + endPoint: string = ''; + parameters: any = {}; + method: string = ''; + status: string = ''; + + constructor() { + } + + static fromJson(json: any): Audit { + const audit = new Audit(); + audit.id = json.rn; + audit.userName = json.userName; + audit.action = unserscoreToSpaceAndCapitalize(json.action); + audit.createdAt = json.createdAt && DateTime.fromMillis(json.createdAt || 0); + audit.endPoint = json.endPoint; + audit.parameters = json.parameters; + audit.method = json.method; + audit.status = json.status; + return audit; + } + + toJson(): any { + return { + id: this.id, + userName: this.userName + }; + } +} \ No newline at end of file diff --git a/frontend/app/mstore/types/user.ts b/frontend/app/mstore/types/user.ts index c69b31067..53ae5dbf0 100644 --- a/frontend/app/mstore/types/user.ts +++ b/frontend/app/mstore/types/user.ts @@ -60,7 +60,7 @@ export default class User implements IUser { this.userId = json.userId || json.id; // TODO api returning id this.name = json.name; this.email = json.email; - this.createdAt = json.createdAt && DateTime.fromISO(json.createdAt || 0) + this.createdAt = json.createdAt && DateTime.fromMillis(json.createdAt || 0) this.isAdmin = json.admin this.isSuperAdmin = json.superAdmin this.isJoined = json.joined diff --git a/frontend/app/routes.js b/frontend/app/routes.js index 7a6c5379e..4492a4b63 100644 --- a/frontend/app/routes.js +++ b/frontend/app/routes.js @@ -61,10 +61,11 @@ export const CLIENT_TABS = { PROFILE: 'account', MANAGE_USERS: 'team', MANAGE_ROLES: 'roles', - SITES: 'projects', + SITES: 'projects', CUSTOM_FIELDS: 'metadata', WEBHOOKS: 'webhooks', NOTIFICATIONS: 'notifications', + AUDIT: 'audit', }; export const CLIENT_DEFAULT_TAB = CLIENT_TABS.PROFILE; const routerClientTabString = `:activeTab(${ Object.values(CLIENT_TABS).join('|') })`; diff --git a/frontend/app/services/AuditService.ts b/frontend/app/services/AuditService.ts new file mode 100644 index 000000000..0a93d6bb6 --- /dev/null +++ b/frontend/app/services/AuditService.ts @@ -0,0 +1,25 @@ +import APIClient from 'App/api_client'; + +export default class AuditService { + private client: APIClient; + + constructor(client?: APIClient) { + this.client = client ? client : new APIClient(); + } + + initClient(client?: APIClient) { + this.client = client || new APIClient(); + } + + all(data: any): Promise { + return this.client.post('/trails', data) + .then(response => response.json()) + .then(response => response.data[0] || []); + } + + one(id: string): Promise { + return this.client.get('/trails/' + id) + .then(response => response.json()) + .then(response => response.data || {}); + } +} \ No newline at end of file diff --git a/frontend/app/services/index.ts b/frontend/app/services/index.ts index 3cb64a7ad..5b4d59651 100644 --- a/frontend/app/services/index.ts +++ b/frontend/app/services/index.ts @@ -2,8 +2,10 @@ import DashboardService, { IDashboardService } from "./DashboardService"; import MetricService, { IMetricService } from "./MetricService"; import SessionSerivce from "./SessionService"; import UserService from "./UserService"; +import AuditService from './AuditService'; export const dashboardService: IDashboardService = new DashboardService(); export const metricService: IMetricService = new MetricService(); export const sessionService: SessionSerivce = new SessionSerivce(); -export const userService: UserService = new UserService(); \ No newline at end of file +export const userService: UserService = new UserService(); +export const auditService: AuditService = new AuditService(); \ No newline at end of file diff --git a/frontend/app/svg/icons/list-ul.svg b/frontend/app/svg/icons/list-ul.svg new file mode 100644 index 000000000..a07021b20 --- /dev/null +++ b/frontend/app/svg/icons/list-ul.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/frontend/app/utils.js b/frontend/app/utils.js index bdece4058..571c18561 100644 --- a/frontend/app/utils.js +++ b/frontend/app/utils.js @@ -264,4 +264,10 @@ export const convertElementToImage = async (el) => { }, }); return image; +} + +export const unserscoreToSpaceAndCapitalize = (str) => { + return str.replace(/_/g, ' ').replace(/\w\S*/g, (txt) => { + return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); + }); } \ No newline at end of file From b97c32ad5604e44274777316696d1aa979d3e1eb Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Fri, 6 May 2022 18:54:25 +0200 Subject: [PATCH 083/260] feat(ui) - audit - filters --- .../Client/Audit/AuditList/AuditList.tsx | 4 ++- .../Audit/AuditListItem/AuditListItem.tsx | 2 +- .../Client/Audit/AuditView/AuditView.tsx | 23 ++++++++++++++ .../app/components/shared/Select/Select.tsx | 31 ++++++++++++++++--- .../SelectDateRange/SelectDateRange.tsx | 22 +++++++++++++ .../shared/SelectDateRange/index.ts | 1 + frontend/app/dateRange.js | 7 +++++ frontend/app/mstore/auditStore.ts | 9 ++++-- frontend/app/mstore/types/audit.ts | 6 ++-- frontend/app/services/AuditService.ts | 2 +- frontend/app/svg/icons/text-paragraph.svg | 2 +- 11 files changed, 96 insertions(+), 13 deletions(-) create mode 100644 frontend/app/components/shared/SelectDateRange/SelectDateRange.tsx create mode 100644 frontend/app/components/shared/SelectDateRange/index.ts diff --git a/frontend/app/components/Client/Audit/AuditList/AuditList.tsx b/frontend/app/components/Client/Audit/AuditList/AuditList.tsx index 2b4249155..549b25b6d 100644 --- a/frontend/app/components/Client/Audit/AuditList/AuditList.tsx +++ b/frontend/app/components/Client/Audit/AuditList/AuditList.tsx @@ -15,6 +15,7 @@ function AuditList(props: Props) { const list = useObserver(() => auditStore.list); const searchQuery = useObserver(() => auditStore.searchQuery); const page = useObserver(() => auditStore.page); + const order = useObserver(() => auditStore.order); const { showModal } = useModal(); useEffect(() => { @@ -22,8 +23,9 @@ function AuditList(props: Props) { page: auditStore.page, limit: auditStore.pageSize, query: auditStore.searchQuery, + order: auditStore.order, }); - }, [page, searchQuery]); + }, [page, searchQuery, order]); return useObserver(() => ( diff --git a/frontend/app/components/Client/Audit/AuditListItem/AuditListItem.tsx b/frontend/app/components/Client/Audit/AuditListItem/AuditListItem.tsx index 492d5c140..7d584bb06 100644 --- a/frontend/app/components/Client/Audit/AuditListItem/AuditListItem.tsx +++ b/frontend/app/components/Client/Audit/AuditListItem/AuditListItem.tsx @@ -9,7 +9,7 @@ function AuditListItem(props: Props) { const { audit, onShowDetails } = props; return (
    -
    asd
    +
    {audit.username}
    {audit.action}
    {audit.createdAt && checkForRecent(audit.createdAt, 'LLL dd, yyyy, hh:mm a')}
    diff --git a/frontend/app/components/Client/Audit/AuditView/AuditView.tsx b/frontend/app/components/Client/Audit/AuditView/AuditView.tsx index ec9904567..1e53f24b5 100644 --- a/frontend/app/components/Client/Audit/AuditView/AuditView.tsx +++ b/frontend/app/components/Client/Audit/AuditView/AuditView.tsx @@ -4,14 +4,37 @@ import AuditList from '../AuditList'; import AuditSearchField from '../AuditSearchField'; import { useStore } from 'App/mstore'; import { useObserver } from 'mobx-react-lite'; +import Select from 'Shared/Select'; +import SelectDateRange from 'Shared/SelectDateRange'; function AuditView(props) { const { auditStore } = useStore(); + const order = useObserver(() => auditStore.order); + return useObserver(() => (
    +
    + {/* */} +
    +
    + +
    + ); +} + +export default SelectDateRange; \ No newline at end of file diff --git a/frontend/app/components/shared/SelectDateRange/index.ts b/frontend/app/components/shared/SelectDateRange/index.ts new file mode 100644 index 000000000..9b59aa99b --- /dev/null +++ b/frontend/app/components/shared/SelectDateRange/index.ts @@ -0,0 +1 @@ +export { default } from './SelectDateRange'; \ No newline at end of file diff --git a/frontend/app/dateRange.js b/frontend/app/dateRange.js index b50ec2fb9..4a2ea923d 100644 --- a/frontend/app/dateRange.js +++ b/frontend/app/dateRange.js @@ -23,6 +23,13 @@ Object.keys(DATE_RANGE_LABELS).forEach((key) => { DATE_RANGE_VALUES[ key ] = key export { DATE_RANGE_VALUES }; export const dateRangeValues = Object.keys(DATE_RANGE_VALUES); +export const DATE_RANGE_OPTIONS = Object.keys(DATE_RANGE_LABELS).map((key) => { + return { + label: DATE_RANGE_LABELS[ key ], + value: key, + }; +}); + export function getDateRangeFromTs(start, end) { return moment.range( moment(start), diff --git a/frontend/app/mstore/auditStore.ts b/frontend/app/mstore/auditStore.ts index 11b0ba9f4..b3df0aa6d 100644 --- a/frontend/app/mstore/auditStore.ts +++ b/frontend/app/mstore/auditStore.ts @@ -1,6 +1,7 @@ import { makeAutoObservable, runInAction, observable, action, reaction } from "mobx" import { auditService } from "App/services" import Audit from './types/audit' +import Period, { LAST_7_DAYS } from 'Types/app/period'; export default class AuditStore { list: any[] = []; @@ -9,6 +10,8 @@ export default class AuditStore { pageSize: number = 20; searchQuery: string = ''; isLoading: boolean = false; + order: string = 'desc'; + period: Period = Period({ rangeName: LAST_7_DAYS }) constructor() { makeAutoObservable(this, { @@ -18,8 +21,11 @@ export default class AuditStore { }) } + setDateRange(data: any) { + this.period = new Period(data); + } + updateKey(key: string, value: any) { - console.log(key, value) this[key] = value; } @@ -27,7 +33,6 @@ export default class AuditStore { this.isLoading = true; return new Promise((resolve, reject) => { auditService.all(data).then(response => { - console.log('response', response); runInAction(() => { this.list = response.sessions.map(item => Audit.fromJson(item)) this.total = response.count diff --git a/frontend/app/mstore/types/audit.ts b/frontend/app/mstore/types/audit.ts index b9c30343f..104ff447e 100644 --- a/frontend/app/mstore/types/audit.ts +++ b/frontend/app/mstore/types/audit.ts @@ -3,7 +3,7 @@ import { unserscoreToSpaceAndCapitalize } from 'App/utils'; export default class Audit { id: string = ''; - userName: string = ''; + username: string = ''; action: string = ''; createdAt: any = null; endPoint: string = ''; @@ -17,7 +17,7 @@ export default class Audit { static fromJson(json: any): Audit { const audit = new Audit(); audit.id = json.rn; - audit.userName = json.userName; + audit.username = json.username; audit.action = unserscoreToSpaceAndCapitalize(json.action); audit.createdAt = json.createdAt && DateTime.fromMillis(json.createdAt || 0); audit.endPoint = json.endPoint; @@ -30,7 +30,7 @@ export default class Audit { toJson(): any { return { id: this.id, - userName: this.userName + username: this.username }; } } \ No newline at end of file diff --git a/frontend/app/services/AuditService.ts b/frontend/app/services/AuditService.ts index 0a93d6bb6..39b7521ed 100644 --- a/frontend/app/services/AuditService.ts +++ b/frontend/app/services/AuditService.ts @@ -14,7 +14,7 @@ export default class AuditService { all(data: any): Promise { return this.client.post('/trails', data) .then(response => response.json()) - .then(response => response.data[0] || []); + .then(response => response.data || []); } one(id: string): Promise { diff --git a/frontend/app/svg/icons/text-paragraph.svg b/frontend/app/svg/icons/text-paragraph.svg index 9779beabf..f06f83174 100644 --- a/frontend/app/svg/icons/text-paragraph.svg +++ b/frontend/app/svg/icons/text-paragraph.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file From 432c0da4e2ea3c0fe0ab5c202d74c85cb809567f Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Sat, 7 May 2022 15:04:17 +0200 Subject: [PATCH 084/260] chore(backend-heuristics): Remove redundant lines --- backend/internal/builder/builder.go | 57 +++++------------------------ 1 file changed, 9 insertions(+), 48 deletions(-) diff --git a/backend/internal/builder/builder.go b/backend/internal/builder/builder.go index b3dc909b7..6b8ece5d5 100644 --- a/backend/internal/builder/builder.go +++ b/backend/internal/builder/builder.go @@ -9,37 +9,6 @@ import ( . "openreplay/backend/pkg/messages" ) -func getURLExtention(URL string) string { - u, err := url.Parse(URL) - if err != nil { - return "" - } - i := strings.LastIndex(u.Path, ".") - return u.Path[i+1:] -} - -func getResourceType(initiator string, URL string) string { - switch initiator { - case "xmlhttprequest", "fetch": - return "fetch" - case "img": - return "img" - default: - switch getURLExtention(URL) { - case "css": - return "stylesheet" - case "js": - return "script" - case "png", "gif", "jpg", "jpeg", "svg": - return "img" - case "mp4", "mkv", "ogg", "webm", "avi", "mp3": - return "media" - default: - return "other" - } - } -} - type builder struct { readyMsgs []Message timestamp uint64 @@ -50,20 +19,16 @@ type builder struct { ddDetector *domDropDetector crDetector *clickRageDetector dcDetector *deadClickDetector - integrationsWaiting bool - - sid uint64 } func NewBuilder() *builder { return &builder{ - ptaBuilder: &performanceTrackAggrBuilder{}, - ciFinder: &cpuIssueFinder{}, - miFinder: &memoryIssueFinder{}, - ddDetector: &domDropDetector{}, - crDetector: &clickRageDetector{}, - dcDetector: &deadClickDetector{}, - integrationsWaiting: true, + ptaBuilder: &performanceTrackAggrBuilder{}, + ciFinder: &cpuIssueFinder{}, + miFinder: &memoryIssueFinder{}, + ddDetector: &domDropDetector{}, + crDetector: &clickRageDetector{}, + dcDetector: &deadClickDetector{}, } } @@ -78,12 +43,6 @@ func (b *builder) iterateReadyMessage(iter func(msg Message)) { b.readyMsgs = nil } -func (b *builder) buildPerformanceTrackAggr() { - if msg := b.ptaBuilder.Build(); msg != nil { - b.appendReadyMessage(msg) - } -} - func (b *builder) handleMessage(message Message, messageID uint64) { timestamp := GetTimestamp(message) if b.timestamp < timestamp { @@ -127,7 +86,9 @@ func (b *builder) checkTimeouts(ts int64) bool { } if b.ptaBuilder.HasInstance() && int64(b.ptaBuilder.GetStartTimestamp())+intervals.EVENTS_PERFORMANCE_AGGREGATION_TIMEOUT < ts { - b.buildPerformanceTrackAggr() + if msg := b.ptaBuilder.Build(); msg != nil { + b.appendReadyMessage(msg) + } } lastTsGap := ts - int64(b.timestamp) From 62b36bd70a577853952afcba5eabea3dbd7ff1e2 Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Sat, 7 May 2022 21:29:40 +0200 Subject: [PATCH 085/260] refactor(backend-heuristics): bring all sub-bilders to common interface --- backend/internal/builder/builder.go | 104 ++++------- backend/internal/builder/builderMap.go | 2 - backend/internal/builder/clikRageDetector.go | 55 +++--- backend/internal/builder/cpuIssueFinder.go | 58 +++--- backend/internal/builder/deadClickDetector.go | 63 ++++--- backend/internal/builder/domDropDetector.go | 41 +++-- backend/internal/builder/memoryIssueFinder.go | 48 ++--- .../builder/performanceTrackAggrBuilder.go | 167 +++++++++--------- backend/pkg/intervals/intervals.go | 1 - 9 files changed, 269 insertions(+), 270 deletions(-) diff --git a/backend/internal/builder/builder.go b/backend/internal/builder/builder.go index 6b8ece5d5..7e062e6b2 100644 --- a/backend/internal/builder/builder.go +++ b/backend/internal/builder/builder.go @@ -1,41 +1,34 @@ package builder import ( - "net/url" - "strings" - "time" - "openreplay/backend/pkg/intervals" . "openreplay/backend/pkg/messages" ) +type messageProcessor interface { + Handle(message Message, messageID uint64, timestamp uint64) Message + Build() Message +} + type builder struct { - readyMsgs []Message - timestamp uint64 - lastProcessedTimestamp int64 - ptaBuilder *performanceTrackAggrBuilder - ciFinder *cpuIssueFinder - miFinder *memoryIssueFinder - ddDetector *domDropDetector - crDetector *clickRageDetector - dcDetector *deadClickDetector + readyMsgs []Message + timestamp uint64 + processors []messageProcessor } func NewBuilder() *builder { return &builder{ - ptaBuilder: &performanceTrackAggrBuilder{}, - ciFinder: &cpuIssueFinder{}, - miFinder: &memoryIssueFinder{}, - ddDetector: &domDropDetector{}, - crDetector: &clickRageDetector{}, - dcDetector: &deadClickDetector{}, + processors: []messageProcessor{ + &performanceTrackAggrBuilder{}, + &cpuIssueFinder{}, + &memoryIssueFinder{}, + // &domDropDetector{}, + &clickRageDetector{}, + &deadClickDetector{}, + }, } } -func (b *builder) appendReadyMessage(msg Message) { // interface is never nil even if it holds nil value - b.readyMsgs = append(b.readyMsgs, msg) -} - func (b *builder) iterateReadyMessage(iter func(msg Message)) { for _, readyMsg := range b.readyMsgs { iter(readyMsg) @@ -48,65 +41,38 @@ func (b *builder) handleMessage(message Message, messageID uint64) { if b.timestamp < timestamp { b.timestamp = timestamp } - - b.lastProcessedTimestamp = time.Now().UnixMilli() - if b.timestamp == 0 { + // in case of SessionStart. TODO: make timestamp system transparent return } - switch msg := message.(type) { - case *PerformanceTrack: - if rm := b.ptaBuilder.HandlePerformanceTrack(msg, b.timestamp); rm != nil { - b.appendReadyMessage(rm) + + for _, p := range b.processors { + /* If nil is not returned explicitely by Handle, but as the typed nil + ("var i *IssueEvent; return i;") + The `rm != nil` will be true. + TODO: enforce nil to be nil(?) or add `isNil() bool` to the Message types + because this part is expected to be etendable by user with custom messageProcessor's. + Use of reflrction will be probably bad on millions of messages? + */ + if rm := p.Handle(message, messageID, b.timestamp); rm != nil { + b.readyMsgs = append(b.readyMsgs, rm) } - if rm := b.ciFinder.HandlePerformanceTrack(msg, messageID, b.timestamp); rm != nil { - b.appendReadyMessage(rm) - } - if rm := b.miFinder.HandlePerformanceTrack(msg, messageID, b.timestamp); rm != nil { - b.appendReadyMessage(rm) - } - case *CreateElementNode, - *CreateTextNode: - b.ddDetector.HandleNodeCreation() - case *RemoveNode: - b.ddDetector.HandleNodeRemoval(b.timestamp) - case *CreateDocument: - if rm := b.ddDetector.Build(); rm != nil { - b.appendReadyMessage(rm) - } - } - if rm := b.dcDetector.HandleMessage(message, messageID, b.timestamp); rm != nil { - b.appendReadyMessage(rm) } } func (b *builder) checkTimeouts(ts int64) bool { if b.timestamp == 0 { - return false // There was no timestamp events yet - } - - if b.ptaBuilder.HasInstance() && int64(b.ptaBuilder.GetStartTimestamp())+intervals.EVENTS_PERFORMANCE_AGGREGATION_TIMEOUT < ts { - if msg := b.ptaBuilder.Build(); msg != nil { - b.appendReadyMessage(msg) - } + return false // SessionStart happened only } lastTsGap := ts - int64(b.timestamp) + // Maybe listen for `trigger` and react on SessionEnd instead (less reliable) if lastTsGap > intervals.EVENTS_SESSION_END_TIMEOUT { - if rm := b.ddDetector.Build(); rm != nil { - b.appendReadyMessage(rm) - } - if rm := b.ciFinder.Build(); rm != nil { - b.appendReadyMessage(rm) - } - if rm := b.miFinder.Build(); rm != nil { - b.appendReadyMessage(rm) - } - if rm := b.crDetector.Build(); rm != nil { - b.appendReadyMessage(rm) - } - if rm := b.dcDetector.HandleReaction(b.timestamp); rm != nil { - b.appendReadyMessage(rm) + for _, p := range b.processors { + // TODO: same as above + if rm := p.Build(); rm != nil { + b.readyMsgs = append(b.readyMsgs, rm) + } } return true } diff --git a/backend/internal/builder/builderMap.go b/backend/internal/builder/builderMap.go index b7885da92..6caf18e4f 100644 --- a/backend/internal/builder/builderMap.go +++ b/backend/internal/builder/builderMap.go @@ -15,8 +15,6 @@ func (m builderMap) GetBuilder(sessionID uint64) *builder { if b == nil { b = NewBuilder() m[sessionID] = b - b.sid = sessionID - } return b } diff --git a/backend/internal/builder/clikRageDetector.go b/backend/internal/builder/clikRageDetector.go index f25efbcd9..1140027b3 100644 --- a/backend/internal/builder/clikRageDetector.go +++ b/backend/internal/builder/clikRageDetector.go @@ -6,7 +6,7 @@ import ( . "openreplay/backend/pkg/messages" ) -const CLICK_TIME_DIFF = 300 +const MAX_TIME_DIFF = 300 const MIN_CLICKS_IN_A_ROW = 3 type clickRageDetector struct { @@ -17,39 +17,50 @@ type clickRageDetector struct { countsInARow int } -func (crd *clickRageDetector) Build() *IssueEvent { - var i *IssueEvent - if crd.countsInARow >= MIN_CLICKS_IN_A_ROW { - payload, _ := json.Marshal(struct{ Count int }{crd.countsInARow}) - i = &IssueEvent{ - Type: "click_rage", - ContextString: crd.lastLabel, - Payload: string(payload), // TODO: json encoder - Timestamp: crd.firstInARawTimestamp, - MessageID: crd.firstInARawMessageId, - } - } +func (crd *clickRageDetector) reset() { crd.lastTimestamp = 0 crd.lastLabel = "" crd.firstInARawTimestamp = 0 crd.firstInARawMessageId = 0 crd.countsInARow = 0 - return i } -func (crd *clickRageDetector) HandleMouseClick(msg *MouseClick, messageID uint64, timestamp uint64) *IssueEvent { - if crd.lastTimestamp+CLICK_TIME_DIFF > timestamp && crd.lastLabel == msg.Label { - crd.lastTimestamp = timestamp - crd.countsInARow += 1 - return nil +func (crd *clickRageDetector) Build() Message { + if crd.countsInARow >= MIN_CLICKS_IN_A_ROW { + payload, _ := json.Marshal(struct{ Count int }{crd.countsInARow}) + i := &IssueEvent{ + Type: "click_rage", + ContextString: crd.lastLabel, + Payload: string(payload), // TODO: json message field type + Timestamp: crd.firstInARawTimestamp, + MessageID: crd.firstInARawMessageId, + } + crd.reset() + return i } - i := crd.Build() - if msg.Label != "" { + crd.reset() + return nil +} + +func (crd *clickRageDetector) Handle(message Message, messageID uint64, timestamp uint64) Message { + switch msg := message.(type) { + case *MouseClick: + // TODO: check if we it is ok to capture clickrages without the connected CleckEvent in db. + if msg.Label == "" { + return crd.Build() + } + if crd.lastLabel == msg.Label && timestamp-crd.lastTimestamp < MAX_TIME_DIFF { + crd.lastTimestamp = timestamp + crd.countsInARow += 1 + return nil + } + i := crd.Build() crd.lastTimestamp = timestamp crd.lastLabel = msg.Label crd.firstInARawTimestamp = timestamp crd.firstInARawMessageId = messageID crd.countsInARow = 1 + return i } - return i + return nil } diff --git a/backend/internal/builder/cpuIssueFinder.go b/backend/internal/builder/cpuIssueFinder.go index 1af867ea3..feb694a86 100644 --- a/backend/internal/builder/cpuIssueFinder.go +++ b/backend/internal/builder/cpuIssueFinder.go @@ -18,7 +18,7 @@ type cpuIssueFinder struct { contextString string } -func (f *cpuIssueFinder) Build() *IssueEvent { +func (f *cpuIssueFinder) Build() Message { if f.startTimestamp == 0 { return nil } @@ -47,35 +47,35 @@ func (f *cpuIssueFinder) Build() *IssueEvent { } } -func (f *cpuIssueFinder) HandleSetPageLocation(msg *SetPageLocation) { - f.contextString = msg.URL -} - -func (f *cpuIssueFinder) HandlePerformanceTrack(msg *PerformanceTrack, messageID uint64, timestamp uint64) *IssueEvent { - dt := performance.TimeDiff(timestamp, f.lastTimestamp) - if dt == 0 { - return nil // TODO: handle error - } - - f.lastTimestamp = timestamp - - if msg.Frames == -1 || msg.Ticks == -1 { - return f.Build() - } - - cpuRate := performance.CPURate(msg.Ticks, dt) - - if cpuRate >= CPU_THRESHOLD { - if f.startTimestamp == 0 { - f.startTimestamp = timestamp - f.startMessageID = messageID +func (f *cpuIssueFinder) Handle(message Message, messageID uint64, timestamp uint64) Message { + switch msg := message.(type) { + case *PerformanceTrack: + dt := performance.TimeDiff(timestamp, f.lastTimestamp) + if dt == 0 { + return nil // TODO: handle error } - if f.maxRate < cpuRate { - f.maxRate = cpuRate - } - } else { - return f.Build() - } + f.lastTimestamp = timestamp + + if msg.Frames == -1 || msg.Ticks == -1 { + return f.Build() + } + + cpuRate := performance.CPURate(msg.Ticks, dt) + + if cpuRate >= CPU_THRESHOLD { + if f.startTimestamp == 0 { + f.startTimestamp = timestamp + f.startMessageID = messageID + } + if f.maxRate < cpuRate { + f.maxRate = cpuRate + } + } else { + return f.Build() + } + case *SetPageLocation: + f.contextString = msg.URL + } return nil } diff --git a/backend/internal/builder/deadClickDetector.go b/backend/internal/builder/deadClickDetector.go index de977b7bd..f83c0bedd 100644 --- a/backend/internal/builder/deadClickDetector.go +++ b/backend/internal/builder/deadClickDetector.go @@ -7,50 +7,61 @@ import ( const CLICK_RELATION_TIME = 1400 type deadClickDetector struct { - lastMouseClick *MouseClick - lastTimestamp uint64 - lastMessageID uint64 - inputIDSet map[uint64]bool + lastTimestamp uint64 + lastMouseClick *MouseClick + lastClickTimestamp uint64 + lastMessageID uint64 + inputIDSet map[uint64]bool } -func (d *deadClickDetector) HandleReaction(timestamp uint64) *IssueEvent { - var i *IssueEvent - if d.lastMouseClick != nil && d.lastTimestamp+CLICK_RELATION_TIME < timestamp { - i = &IssueEvent{ - Type: "dead_click", - ContextString: d.lastMouseClick.Label, - Timestamp: d.lastTimestamp, - MessageID: d.lastMessageID, - } - } +func (d *deadClickDetector) reset() { d.inputIDSet = nil d.lastMouseClick = nil - d.lastTimestamp = 0 + d.lastClickTimestamp = 0 d.lastMessageID = 0 +} + +func (d *deadClickDetector) handleReaction(timestamp uint64) Message { + if d.lastMouseClick == nil || d.lastClickTimestamp+CLICK_RELATION_TIME > timestamp { // riaction is instant + d.reset() + return nil + } + i := &IssueEvent{ + Type: "dead_click", + ContextString: d.lastMouseClick.Label, + Timestamp: d.lastClickTimestamp, + MessageID: d.lastMessageID, + } + d.reset() return i } -func (d *deadClickDetector) HandleMessage(msg Message, messageID uint64, timestamp uint64) *IssueEvent { - var i *IssueEvent - switch m := msg.(type) { +func (d *deadClickDetector) Build() Message { + return d.handleReaction(d.lastTimestamp) +} + +func (d *deadClickDetector) Handle(message Message, messageID uint64, timestamp uint64) Message { + d.lastTimestamp = timestamp + switch msg := message.(type) { case *SetInputTarget: if d.inputIDSet == nil { d.inputIDSet = make(map[uint64]bool) } - d.inputIDSet[m.ID] = true + d.inputIDSet[msg.ID] = true case *CreateDocument: d.inputIDSet = nil case *MouseClick: - if m.Label == "" { + if msg.Label == "" { return nil } - i = d.HandleReaction(timestamp) - if d.inputIDSet[m.ID] { // ignore if input + i := d.handleReaction(timestamp) + if d.inputIDSet[msg.ID] { // ignore if input return i } - d.lastMouseClick = m - d.lastTimestamp = timestamp + d.lastMouseClick = msg + d.lastClickTimestamp = timestamp d.lastMessageID = messageID + return i case *SetNodeAttribute, *RemoveNodeAttribute, *CreateElementNode, @@ -60,7 +71,7 @@ func (d *deadClickDetector) HandleMessage(msg Message, messageID uint64, timesta *SetCSSData, *CSSInsertRule, *CSSDeleteRule: - i = d.HandleReaction(timestamp) + return d.handleReaction(timestamp) } - return i + return nil } diff --git a/backend/internal/builder/domDropDetector.go b/backend/internal/builder/domDropDetector.go index 3643038c1..473937a9d 100644 --- a/backend/internal/builder/domDropDetector.go +++ b/backend/internal/builder/domDropDetector.go @@ -4,36 +4,45 @@ import ( . "openreplay/backend/pkg/messages" ) +const DROP_WINDOW = 200 //ms +const CRITICAL_COUNT = 1 // Our login page contains 20. But on crush it removes only roots (1-3 nodes). +// TODO: smart detection (making whole DOM tree would eat all memory) + type domDropDetector struct { removedCount int lastDropTimestamp uint64 } -const DROP_WINDOW = 200 //ms -const CRITICAL_COUNT = 1 // Our login page contains 20. But on crush it removes only roots (1-3 nodes). - -func (dd *domDropDetector) HandleNodeCreation() { +func (dd *domDropDetector) reset() { dd.removedCount = 0 dd.lastDropTimestamp = 0 } -func (dd *domDropDetector) HandleNodeRemoval(ts uint64) { - if dd.lastDropTimestamp+DROP_WINDOW > ts { - dd.removedCount += 1 - } else { - dd.removedCount = 1 +func (dd *domDropDetector) Handle(message Message, _ uint64, timestamp uint64) Message { + switch message.(type) { + case *CreateElementNode, + *CreateTextNode: + dd.removedCount = 0 + dd.lastDropTimestamp = 0 + case *RemoveNode: + if dd.lastDropTimestamp+DROP_WINDOW > timestamp { + dd.removedCount += 1 + } else { + dd.removedCount = 1 + } + dd.lastDropTimestamp = timestamp } - dd.lastDropTimestamp = ts + return nil } -func (dd *domDropDetector) Build() *DOMDrop { - var domDrop *DOMDrop +func (dd *domDropDetector) Build() Message { if dd.removedCount >= CRITICAL_COUNT { - domDrop = &DOMDrop{ + domDrop := &DOMDrop{ Timestamp: dd.lastDropTimestamp, } + dd.reset() + return domDrop } - dd.removedCount = 0 - dd.lastDropTimestamp = 0 - return domDrop + dd.reset() + return nil } diff --git a/backend/internal/builder/memoryIssueFinder.go b/backend/internal/builder/memoryIssueFinder.go index 0d6d71420..2f04343bc 100644 --- a/backend/internal/builder/memoryIssueFinder.go +++ b/backend/internal/builder/memoryIssueFinder.go @@ -19,7 +19,7 @@ type memoryIssueFinder struct { contextString string } -func (f *memoryIssueFinder) Build() *IssueEvent { +func (f *memoryIssueFinder) Build() Message { if f.startTimestamp == 0 { return nil } @@ -37,34 +37,34 @@ func (f *memoryIssueFinder) Build() *IssueEvent { return i } -func (f *memoryIssueFinder) HandleSetPageLocation(msg *SetPageLocation) { - f.contextString = msg.URL -} +func (f *memoryIssueFinder) Handle(message Message, messageID uint64, timestamp uint64) Message { + switch msg := message.(type) { + case *PerformanceTrack: + if f.count < MIN_COUNT { + f.sum += float64(msg.UsedJSHeapSize) + f.count++ + return nil + } + + average := f.sum / f.count + rate := int(math.Round(float64(msg.UsedJSHeapSize) / average * 100)) -func (f *memoryIssueFinder) HandlePerformanceTrack(msg *PerformanceTrack, messageID uint64, timestamp uint64) *IssueEvent { - if f.count < MIN_COUNT { f.sum += float64(msg.UsedJSHeapSize) f.count++ - return nil - } - average := f.sum / f.count - rate := int(math.Round(float64(msg.UsedJSHeapSize) / average * 100)) - - f.sum += float64(msg.UsedJSHeapSize) - f.count++ - - if rate >= MEM_RATE_THRESHOLD { - if f.startTimestamp == 0 { - f.startTimestamp = timestamp - f.startMessageID = messageID + if rate >= MEM_RATE_THRESHOLD { + if f.startTimestamp == 0 { + f.startTimestamp = timestamp + f.startMessageID = messageID + } + if f.rate < rate { + f.rate = rate + } + } else { + return f.Build() } - if f.rate < rate { - f.rate = rate - } - } else { - return f.Build() + case *SetPageLocation: + f.contextString = msg.URL } - return nil } diff --git a/backend/internal/builder/performanceTrackAggrBuilder.go b/backend/internal/builder/performanceTrackAggrBuilder.go index 70b751f55..4396e8a05 100644 --- a/backend/internal/builder/performanceTrackAggrBuilder.go +++ b/backend/internal/builder/performanceTrackAggrBuilder.go @@ -7,100 +7,105 @@ import ( "openreplay/backend/pkg/messages/performance" ) +const AGGREGATION_WINDOW = 2 * 60 * 1000 + type performanceTrackAggrBuilder struct { - performanceTrackAggr *PerformanceTrackAggr - lastTimestamp uint64 - count float64 - sumFrameRate float64 - sumTickRate float64 - sumTotalJSHeapSize float64 - sumUsedJSHeapSize float64 + *PerformanceTrackAggr + lastTimestamp uint64 + count float64 + sumFrameRate float64 + sumTickRate float64 + sumTotalJSHeapSize float64 + sumUsedJSHeapSize float64 } func (b *performanceTrackAggrBuilder) start(timestamp uint64) { - b.performanceTrackAggr = &PerformanceTrackAggr{ + b.PerformanceTrackAggr = &PerformanceTrackAggr{ TimestampStart: timestamp, } b.lastTimestamp = timestamp } -func (b *performanceTrackAggrBuilder) HandlePerformanceTrack(msg *PerformanceTrack, timestamp uint64) *PerformanceTrackAggr { - if msg.Frames == -1 || msg.Ticks == -1 || !b.HasInstance() { - performanceTrackAggr := b.Build() - b.start(timestamp) - return performanceTrackAggr - } - - dt := performance.TimeDiff(timestamp, b.lastTimestamp) - if dt == 0 { - return nil // TODO: handle error - } - - frameRate := performance.FrameRate(msg.Frames, dt) - tickRate := performance.TickRate(msg.Ticks, dt) - - fps := uint64(math.Round(frameRate)) - cpu := performance.CPURateFromTickRate(tickRate) - if fps < b.performanceTrackAggr.MinFPS || b.performanceTrackAggr.MinFPS == 0 { - b.performanceTrackAggr.MinFPS = fps - } - if fps > b.performanceTrackAggr.MaxFPS { - b.performanceTrackAggr.MaxFPS = fps - } - if cpu < b.performanceTrackAggr.MinCPU || b.performanceTrackAggr.MinCPU == 0 { - b.performanceTrackAggr.MinCPU = cpu - } - if cpu > b.performanceTrackAggr.MaxCPU { - b.performanceTrackAggr.MaxCPU = cpu - } - if msg.TotalJSHeapSize < b.performanceTrackAggr.MinTotalJSHeapSize || b.performanceTrackAggr.MinTotalJSHeapSize == 0 { - b.performanceTrackAggr.MinTotalJSHeapSize = msg.TotalJSHeapSize - } - if msg.TotalJSHeapSize > b.performanceTrackAggr.MaxTotalJSHeapSize { - b.performanceTrackAggr.MaxTotalJSHeapSize = msg.TotalJSHeapSize - } - if msg.UsedJSHeapSize < b.performanceTrackAggr.MinUsedJSHeapSize || b.performanceTrackAggr.MinUsedJSHeapSize == 0 { - b.performanceTrackAggr.MinUsedJSHeapSize = msg.UsedJSHeapSize - } - if msg.UsedJSHeapSize > b.performanceTrackAggr.MaxUsedJSHeapSize { - b.performanceTrackAggr.MaxUsedJSHeapSize = msg.UsedJSHeapSize - } - b.sumFrameRate += frameRate - b.sumTickRate += tickRate - b.sumTotalJSHeapSize += float64(msg.TotalJSHeapSize) - b.sumUsedJSHeapSize += float64(msg.UsedJSHeapSize) - b.count += 1 - b.lastTimestamp = timestamp - return nil -} - -func (b *performanceTrackAggrBuilder) HasInstance() bool { - return b.performanceTrackAggr != nil -} - -func (b *performanceTrackAggrBuilder) GetStartTimestamp() uint64 { - if b.performanceTrackAggr == nil { - return 0 - } - return b.performanceTrackAggr.TimestampStart -} - -func (b *performanceTrackAggrBuilder) Build() *PerformanceTrackAggr { - var performanceTrackAggr *PerformanceTrackAggr - if b.HasInstance() && b.GetStartTimestamp() != b.lastTimestamp && b.count != 0 { - performanceTrackAggr = b.performanceTrackAggr - performanceTrackAggr.TimestampEnd = b.lastTimestamp - performanceTrackAggr.AvgFPS = uint64(math.Round(b.sumFrameRate / b.count)) - performanceTrackAggr.AvgCPU = 100 - uint64(math.Round(b.sumTickRate*100/b.count)) - performanceTrackAggr.AvgTotalJSHeapSize = uint64(math.Round(b.sumTotalJSHeapSize / b.count)) - performanceTrackAggr.AvgUsedJSHeapSize = uint64(math.Round(b.sumUsedJSHeapSize / b.count)) - } - b.performanceTrackAggr = nil +func (b *performanceTrackAggrBuilder) reset() { + b.PerformanceTrackAggr = nil b.count = 0 b.sumFrameRate = 0 b.sumTickRate = 0 b.sumTotalJSHeapSize = 0 b.sumUsedJSHeapSize = 0 b.lastTimestamp = 0 - return performanceTrackAggr +} + +func (b *performanceTrackAggrBuilder) Handle(message Message, _ uint64, timestamp uint64) Message { + switch msg := message.(type) { + case *PerformanceTrack: + if b.PerformanceTrackAggr == nil || msg.Frames == -1 || msg.Ticks == -1 { + pta := b.Build() + b.start(timestamp) + return pta + } + + dt := performance.TimeDiff(timestamp, b.lastTimestamp) + if dt == 0 { + return nil // shouldn't happen + } + + frameRate := performance.FrameRate(msg.Frames, dt) + tickRate := performance.TickRate(msg.Ticks, dt) + + fps := uint64(math.Round(frameRate)) + cpu := performance.CPURateFromTickRate(tickRate) + if fps < b.MinFPS || b.MinFPS == 0 { + b.MinFPS = fps + } + if fps > b.MaxFPS { + b.MaxFPS = fps + } + if cpu < b.MinCPU || b.MinCPU == 0 { + b.MinCPU = cpu + } + if cpu > b.MaxCPU { + b.MaxCPU = cpu + } + if msg.TotalJSHeapSize < b.MinTotalJSHeapSize || b.MinTotalJSHeapSize == 0 { + b.MinTotalJSHeapSize = msg.TotalJSHeapSize + } + if msg.TotalJSHeapSize > b.MaxTotalJSHeapSize { + b.MaxTotalJSHeapSize = msg.TotalJSHeapSize + } + if msg.UsedJSHeapSize < b.MinUsedJSHeapSize || b.MinUsedJSHeapSize == 0 { + b.MinUsedJSHeapSize = msg.UsedJSHeapSize + } + if msg.UsedJSHeapSize > b.MaxUsedJSHeapSize { + b.MaxUsedJSHeapSize = msg.UsedJSHeapSize + } + b.sumFrameRate += frameRate + b.sumTickRate += tickRate + b.sumTotalJSHeapSize += float64(msg.TotalJSHeapSize) + b.sumUsedJSHeapSize += float64(msg.UsedJSHeapSize) + b.count += 1 + b.lastTimestamp = timestamp + } + if b.PerformanceTrackAggr != nil && + timestamp-b.PerformanceTrackAggr.TimestampStart >= AGGREGATION_WINDOW { + return b.Build() + } + return nil +} + +func (b *performanceTrackAggrBuilder) Build() Message { + if b.PerformanceTrackAggr == nil { + return nil + } + if b.count != 0 && b.PerformanceTrackAggr.TimestampStart < b.lastTimestamp { // the last one shouldn't happen + b.PerformanceTrackAggr.TimestampEnd = b.lastTimestamp + b.PerformanceTrackAggr.AvgFPS = uint64(math.Round(b.sumFrameRate / b.count)) + b.PerformanceTrackAggr.AvgCPU = 100 - uint64(math.Round(b.sumTickRate*100/b.count)) + b.PerformanceTrackAggr.AvgTotalJSHeapSize = uint64(math.Round(b.sumTotalJSHeapSize / b.count)) + b.PerformanceTrackAggr.AvgUsedJSHeapSize = uint64(math.Round(b.sumUsedJSHeapSize / b.count)) + b.reset() + return b.PerformanceTrackAggr + } + b.reset() + return nil } diff --git a/backend/pkg/intervals/intervals.go b/backend/pkg/intervals/intervals.go index 2ce13ed5e..649ceca1a 100644 --- a/backend/pkg/intervals/intervals.go +++ b/backend/pkg/intervals/intervals.go @@ -5,7 +5,6 @@ const HEARTBEAT_INTERVAL = 2 * 60 * 1000 // максимальный const INTEGRATIONS_REQUEST_INTERVAL = 1 * 60 * 1000 // интеграции const EVENTS_PAGE_EVENT_TIMEOUT = 2 * 60 * 1000 // таймаут пейдж ивента const EVENTS_INPUT_EVENT_TIMEOUT = 2 * 60 * 1000 // -const EVENTS_PERFORMANCE_AGGREGATION_TIMEOUT = 2 * 60 * 1000 const EVENTS_SESSION_END_TIMEOUT = HEARTBEAT_INTERVAL + 30*1000 const EVENTS_SESSION_END_TIMEOUT_WITH_INTEGRATIONS = HEARTBEAT_INTERVAL + 3*60*1000 const EVENTS_BACK_COMMIT_GAP = EVENTS_SESSION_END_TIMEOUT_WITH_INTEGRATIONS + 1*60*1000 // для бэк коммита From 6ab6d342c035a65cde98fbe73b5509db03e8a344 Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Sat, 7 May 2022 22:16:15 +0200 Subject: [PATCH 086/260] chore(backend-heuristics/db): remove redundant --- backend/cmd/db/main.go | 2 +- backend/internal/heuristics/heuristics.go | 40 +++---------------- .../internal/heuristics/inputEventBuilder.go | 2 +- .../internal/heuristics/pageEventBuilder.go | 2 +- backend/internal/heuristics/session.go | 10 +++-- 5 files changed, 15 insertions(+), 41 deletions(-) diff --git a/backend/cmd/db/main.go b/backend/cmd/db/main.go index 962057213..f6cd481a7 100644 --- a/backend/cmd/db/main.go +++ b/backend/cmd/db/main.go @@ -60,7 +60,7 @@ func main() { } // Handle heuristics and save to temporary queue in memory - heurFinder.HandleMessage(session, msg) + heurFinder.HandleMessage(sessionID, msg) // Process saved heuristics messages as usual messages above in the code heurFinder.IterateSessionReadyMessages(sessionID, func(msg messages.Message) { diff --git a/backend/internal/heuristics/heuristics.go b/backend/internal/heuristics/heuristics.go index 677574951..c55ad33b3 100644 --- a/backend/internal/heuristics/heuristics.go +++ b/backend/internal/heuristics/heuristics.go @@ -1,43 +1,26 @@ package heuristics import ( - . "openreplay/backend/pkg/db/types" . "openreplay/backend/pkg/messages" ) -type MessageHandler interface { - HandleMessage(Message) -} -type ReadyMessagesIterator interface { - IterateReadyMessages(func(Message)) -} - -type Handler interface { - MessageHandler - ReadyMessagesIterator -} - type mainHandler map[uint64]*sessHandler func NewHandler() mainHandler { return make(mainHandler) } -func (m mainHandler) getSessHandler(session *Session) *sessHandler { - if session == nil { - //AAAA - return nil - } - s := m[session.SessionID] +func (m mainHandler) getSessHandler(sessionID uint64) *sessHandler { + s := m[sessionID] if s == nil { - s = newSessHandler(session) - m[session.SessionID] = s + s = newSessHandler() + m[sessionID] = s } return s } -func (m mainHandler) HandleMessage(session *Session, msg Message) { - s := m.getSessHandler(session) +func (m mainHandler) HandleMessage(sessionID uint64, msg Message) { + s := m.getSessHandler(sessionID) s.HandleMessage(msg) } @@ -51,14 +34,3 @@ func (m mainHandler) IterateSessionReadyMessages(sessionID uint64, iter func(msg delete(m, sessionID) } } - -func (m mainHandler) IterateReadyMessages(iter func(sessionID uint64, msg Message)) { - for sessionID, s := range m { - s.IterateReadyMessages(func(msg Message) { - iter(sessionID, msg) - }) - if s.IsEnded() { - delete(m, sessionID) - } - } -} diff --git a/backend/internal/heuristics/inputEventBuilder.go b/backend/internal/heuristics/inputEventBuilder.go index ce1b710ca..624e15e47 100644 --- a/backend/internal/heuristics/inputEventBuilder.go +++ b/backend/internal/heuristics/inputEventBuilder.go @@ -1,4 +1,4 @@ -package builder +package heuristics import ( . "openreplay/backend/pkg/messages" diff --git a/backend/internal/heuristics/pageEventBuilder.go b/backend/internal/heuristics/pageEventBuilder.go index 2b0665894..96a1b287e 100644 --- a/backend/internal/heuristics/pageEventBuilder.go +++ b/backend/internal/heuristics/pageEventBuilder.go @@ -1,4 +1,4 @@ -package builder +package heuristics import ( . "openreplay/backend/pkg/messages" diff --git a/backend/internal/heuristics/session.go b/backend/internal/heuristics/session.go index 3946bf918..a49db948b 100644 --- a/backend/internal/heuristics/session.go +++ b/backend/internal/heuristics/session.go @@ -1,19 +1,21 @@ package heuristics import ( - . "openreplay/backend/pkg/db/types" . "openreplay/backend/pkg/messages" ) +type Handler interface { + HandleMessage(Message) + IterateReadyMessages(func(Message)) +} + type sessHandler struct { - session *Session handlers []Handler ended bool } -func newSessHandler(session *Session) *sessHandler { +func newSessHandler() *sessHandler { return &sessHandler{ - session: session, handlers: []Handler{ new(clickrage), new(performanceAggregator), From e4d45e88f92f5999ede567e34903af2c5929b508 Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Sat, 7 May 2022 22:59:23 +0200 Subject: [PATCH 087/260] chore(backend): name entrypoint container --- backend/cmd/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/cmd/Dockerfile b/backend/cmd/Dockerfile index e2f611afa..f36bfc99e 100644 --- a/backend/cmd/Dockerfile +++ b/backend/cmd/Dockerfile @@ -18,7 +18,7 @@ COPY cmd cmd ARG SERVICE_NAME RUN CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o service -tags musl openreplay/backend/cmd/$SERVICE_NAME -FROM alpine +FROM alpine AS entrypoint RUN apk add --no-cache ca-certificates ENV TZ=UTC \ From 71d50e5a44f7c43c67c1d972e1aab370cdc95db0 Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Sat, 7 May 2022 23:19:49 +0200 Subject: [PATCH 088/260] refactor(backend-messages):predefined TypeID() on message type --- backend/pkg/messages/filters.go | 4 +- .../pkg/messages/legacy-message-transform.go | 3 - backend/pkg/messages/message.go | 16 + backend/pkg/messages/messages.go | 544 ++++++++++++++---- backend/pkg/messages/read-message.go | 176 +++--- backend/services/sink/main.go | 7 +- 6 files changed, 547 insertions(+), 203 deletions(-) create mode 100644 backend/pkg/messages/message.go diff --git a/backend/pkg/messages/filters.go b/backend/pkg/messages/filters.go index 44b2c7959..a74d49eec 100644 --- a/backend/pkg/messages/filters.go +++ b/backend/pkg/messages/filters.go @@ -1,10 +1,10 @@ // Auto-generated, do not edit package messages -func IsReplayerType(id uint64) bool { +func IsReplayerType(id int) bool { return 0 == id || 2 == id || 4 == id || 5 == id || 6 == id || 7 == id || 8 == id || 9 == id || 10 == id || 11 == id || 12 == id || 13 == id || 14 == id || 15 == id || 16 == id || 18 == id || 19 == id || 20 == id || 22 == id || 37 == id || 38 == id || 39 == id || 40 == id || 41 == id || 44 == id || 45 == id || 46 == id || 47 == id || 48 == id || 49 == id || 54 == id || 55 == id || 59 == id || 69 == id || 70 == id || 90 == id || 93 == id || 96 == id || 100 == id || 102 == id || 103 == id || 105 == id } -func IsIOSType(id uint64) bool { +func IsIOSType(id int) bool { return 107 == id || 90 == id || 91 == id || 92 == id || 93 == id || 94 == id || 95 == id || 96 == id || 97 == id || 98 == id || 99 == id || 100 == id || 101 == id || 102 == id || 103 == id || 104 == id || 105 == id || 110 == id || 111 == id } diff --git a/backend/pkg/messages/legacy-message-transform.go b/backend/pkg/messages/legacy-message-transform.go index 6774d95b1..3a42cdab0 100644 --- a/backend/pkg/messages/legacy-message-transform.go +++ b/backend/pkg/messages/legacy-message-transform.go @@ -3,10 +3,7 @@ package messages func transformDeprecated(msg Message) Message { switch m := msg.(type) { case *MouseClickDepricated: - meta := m.Meta() - meta.TypeID = 33 return &MouseClick{ - meta: meta, ID: m.ID, HesitationTime: m.HesitationTime, Label: m.Label, diff --git a/backend/pkg/messages/message.go b/backend/pkg/messages/message.go new file mode 100644 index 000000000..d701d474f --- /dev/null +++ b/backend/pkg/messages/message.go @@ -0,0 +1,16 @@ +package messages + +type message struct { + Timestamp int64 + Index uint64 +} + +func (m *message) Meta() *message { + return m +} + +type Message interface { + Encode() []byte + TypeID() int + Meta() *message +} diff --git a/backend/pkg/messages/messages.go b/backend/pkg/messages/messages.go index e9aec5788..82a0f4f97 100644 --- a/backend/pkg/messages/messages.go +++ b/backend/pkg/messages/messages.go @@ -1,24 +1,8 @@ // Auto-generated, do not edit package messages -type Message interface { - Encode() []byte - Meta() *meta -} - -type meta struct { - Timestamp int64 - Index uint64 - TypeID uint64 -} - -// Might also implement Encode() here (?) -func (m *meta) Meta() *meta { - return m -} - type BatchMeta struct { - *meta + message PageNo uint64 FirstIndex uint64 Timestamp int64 @@ -34,8 +18,12 @@ func (msg *BatchMeta) Encode() []byte { return buf[:p] } +func (msg *BatchMeta) TypeID() int { + return 80 +} + type Timestamp struct { - *meta + message Timestamp uint64 } @@ -47,8 +35,12 @@ func (msg *Timestamp) Encode() []byte { return buf[:p] } +func (msg *Timestamp) TypeID() int { + return 0 +} + type SessionStart struct { - *meta + message Timestamp uint64 ProjectID uint64 TrackerVersion string @@ -90,8 +82,12 @@ func (msg *SessionStart) Encode() []byte { return buf[:p] } +func (msg *SessionStart) TypeID() int { + return 1 +} + type SessionDisconnect struct { - *meta + message Timestamp uint64 } @@ -103,8 +99,12 @@ func (msg *SessionDisconnect) Encode() []byte { return buf[:p] } +func (msg *SessionDisconnect) TypeID() int { + return 2 +} + type SessionEnd struct { - *meta + message Timestamp uint64 } @@ -116,8 +116,12 @@ func (msg *SessionEnd) Encode() []byte { return buf[:p] } +func (msg *SessionEnd) TypeID() int { + return 3 +} + type SetPageLocation struct { - *meta + message URL string Referrer string NavigationStart uint64 @@ -133,8 +137,12 @@ func (msg *SetPageLocation) Encode() []byte { return buf[:p] } +func (msg *SetPageLocation) TypeID() int { + return 4 +} + type SetViewportSize struct { - *meta + message Width uint64 Height uint64 } @@ -148,8 +156,12 @@ func (msg *SetViewportSize) Encode() []byte { return buf[:p] } +func (msg *SetViewportSize) TypeID() int { + return 5 +} + type SetViewportScroll struct { - *meta + message X int64 Y int64 } @@ -163,8 +175,12 @@ func (msg *SetViewportScroll) Encode() []byte { return buf[:p] } +func (msg *SetViewportScroll) TypeID() int { + return 6 +} + type CreateDocument struct { - *meta + message } func (msg *CreateDocument) Encode() []byte { @@ -175,8 +191,12 @@ func (msg *CreateDocument) Encode() []byte { return buf[:p] } +func (msg *CreateDocument) TypeID() int { + return 7 +} + type CreateElementNode struct { - *meta + message ID uint64 ParentID uint64 index uint64 @@ -196,8 +216,12 @@ func (msg *CreateElementNode) Encode() []byte { return buf[:p] } +func (msg *CreateElementNode) TypeID() int { + return 8 +} + type CreateTextNode struct { - *meta + message ID uint64 ParentID uint64 Index uint64 @@ -213,8 +237,12 @@ func (msg *CreateTextNode) Encode() []byte { return buf[:p] } +func (msg *CreateTextNode) TypeID() int { + return 9 +} + type MoveNode struct { - *meta + message ID uint64 ParentID uint64 Index uint64 @@ -230,8 +258,12 @@ func (msg *MoveNode) Encode() []byte { return buf[:p] } +func (msg *MoveNode) TypeID() int { + return 10 +} + type RemoveNode struct { - *meta + message ID uint64 } @@ -243,8 +275,12 @@ func (msg *RemoveNode) Encode() []byte { return buf[:p] } +func (msg *RemoveNode) TypeID() int { + return 11 +} + type SetNodeAttribute struct { - *meta + message ID uint64 Name string Value string @@ -260,8 +296,12 @@ func (msg *SetNodeAttribute) Encode() []byte { return buf[:p] } +func (msg *SetNodeAttribute) TypeID() int { + return 12 +} + type RemoveNodeAttribute struct { - *meta + message ID uint64 Name string } @@ -275,8 +315,12 @@ func (msg *RemoveNodeAttribute) Encode() []byte { return buf[:p] } +func (msg *RemoveNodeAttribute) TypeID() int { + return 13 +} + type SetNodeData struct { - *meta + message ID uint64 Data string } @@ -290,8 +334,12 @@ func (msg *SetNodeData) Encode() []byte { return buf[:p] } +func (msg *SetNodeData) TypeID() int { + return 14 +} + type SetCSSData struct { - *meta + message ID uint64 Data string } @@ -305,8 +353,12 @@ func (msg *SetCSSData) Encode() []byte { return buf[:p] } +func (msg *SetCSSData) TypeID() int { + return 15 +} + type SetNodeScroll struct { - *meta + message ID uint64 X int64 Y int64 @@ -322,8 +374,12 @@ func (msg *SetNodeScroll) Encode() []byte { return buf[:p] } +func (msg *SetNodeScroll) TypeID() int { + return 16 +} + type SetInputTarget struct { - *meta + message ID uint64 Label string } @@ -337,8 +393,12 @@ func (msg *SetInputTarget) Encode() []byte { return buf[:p] } +func (msg *SetInputTarget) TypeID() int { + return 17 +} + type SetInputValue struct { - *meta + message ID uint64 Value string Mask int64 @@ -354,8 +414,12 @@ func (msg *SetInputValue) Encode() []byte { return buf[:p] } +func (msg *SetInputValue) TypeID() int { + return 18 +} + type SetInputChecked struct { - *meta + message ID uint64 Checked bool } @@ -369,8 +433,12 @@ func (msg *SetInputChecked) Encode() []byte { return buf[:p] } +func (msg *SetInputChecked) TypeID() int { + return 19 +} + type MouseMove struct { - *meta + message X uint64 Y uint64 } @@ -384,8 +452,12 @@ func (msg *MouseMove) Encode() []byte { return buf[:p] } +func (msg *MouseMove) TypeID() int { + return 20 +} + type MouseClickDepricated struct { - *meta + message ID uint64 HesitationTime uint64 Label string @@ -401,8 +473,12 @@ func (msg *MouseClickDepricated) Encode() []byte { return buf[:p] } +func (msg *MouseClickDepricated) TypeID() int { + return 21 +} + type ConsoleLog struct { - *meta + message Level string Value string } @@ -416,8 +492,12 @@ func (msg *ConsoleLog) Encode() []byte { return buf[:p] } +func (msg *ConsoleLog) TypeID() int { + return 22 +} + type PageLoadTiming struct { - *meta + message RequestStart uint64 ResponseStart uint64 ResponseEnd uint64 @@ -445,8 +525,12 @@ func (msg *PageLoadTiming) Encode() []byte { return buf[:p] } +func (msg *PageLoadTiming) TypeID() int { + return 23 +} + type PageRenderTiming struct { - *meta + message SpeedIndex uint64 VisuallyComplete uint64 TimeToInteractive uint64 @@ -462,8 +546,12 @@ func (msg *PageRenderTiming) Encode() []byte { return buf[:p] } +func (msg *PageRenderTiming) TypeID() int { + return 24 +} + type JSException struct { - *meta + message Name string Message string Payload string @@ -479,8 +567,12 @@ func (msg *JSException) Encode() []byte { return buf[:p] } +func (msg *JSException) TypeID() int { + return 25 +} + type RawErrorEvent struct { - *meta + message Timestamp uint64 Source string Name string @@ -500,8 +592,12 @@ func (msg *RawErrorEvent) Encode() []byte { return buf[:p] } +func (msg *RawErrorEvent) TypeID() int { + return 26 +} + type RawCustomEvent struct { - *meta + message Name string Payload string } @@ -515,8 +611,12 @@ func (msg *RawCustomEvent) Encode() []byte { return buf[:p] } +func (msg *RawCustomEvent) TypeID() int { + return 27 +} + type UserID struct { - *meta + message ID string } @@ -528,8 +628,12 @@ func (msg *UserID) Encode() []byte { return buf[:p] } +func (msg *UserID) TypeID() int { + return 28 +} + type UserAnonymousID struct { - *meta + message ID string } @@ -541,8 +645,12 @@ func (msg *UserAnonymousID) Encode() []byte { return buf[:p] } +func (msg *UserAnonymousID) TypeID() int { + return 29 +} + type Metadata struct { - *meta + message Key string Value string } @@ -556,8 +664,12 @@ func (msg *Metadata) Encode() []byte { return buf[:p] } +func (msg *Metadata) TypeID() int { + return 30 +} + type PageEvent struct { - *meta + message MessageID uint64 Timestamp uint64 URL string @@ -601,8 +713,12 @@ func (msg *PageEvent) Encode() []byte { return buf[:p] } +func (msg *PageEvent) TypeID() int { + return 31 +} + type InputEvent struct { - *meta + message MessageID uint64 Timestamp uint64 Value string @@ -622,8 +738,12 @@ func (msg *InputEvent) Encode() []byte { return buf[:p] } +func (msg *InputEvent) TypeID() int { + return 32 +} + type ClickEvent struct { - *meta + message MessageID uint64 Timestamp uint64 HesitationTime uint64 @@ -643,8 +763,12 @@ func (msg *ClickEvent) Encode() []byte { return buf[:p] } +func (msg *ClickEvent) TypeID() int { + return 33 +} + type ErrorEvent struct { - *meta + message MessageID uint64 Timestamp uint64 Source string @@ -666,8 +790,12 @@ func (msg *ErrorEvent) Encode() []byte { return buf[:p] } +func (msg *ErrorEvent) TypeID() int { + return 34 +} + type ResourceEvent struct { - *meta + message MessageID uint64 Timestamp uint64 Duration uint64 @@ -701,8 +829,12 @@ func (msg *ResourceEvent) Encode() []byte { return buf[:p] } +func (msg *ResourceEvent) TypeID() int { + return 35 +} + type CustomEvent struct { - *meta + message MessageID uint64 Timestamp uint64 Name string @@ -720,8 +852,12 @@ func (msg *CustomEvent) Encode() []byte { return buf[:p] } +func (msg *CustomEvent) TypeID() int { + return 36 +} + type CSSInsertRule struct { - *meta + message ID uint64 Rule string Index uint64 @@ -737,8 +873,12 @@ func (msg *CSSInsertRule) Encode() []byte { return buf[:p] } +func (msg *CSSInsertRule) TypeID() int { + return 37 +} + type CSSDeleteRule struct { - *meta + message ID uint64 Index uint64 } @@ -752,8 +892,12 @@ func (msg *CSSDeleteRule) Encode() []byte { return buf[:p] } +func (msg *CSSDeleteRule) TypeID() int { + return 38 +} + type Fetch struct { - *meta + message Method string URL string Request string @@ -777,8 +921,12 @@ func (msg *Fetch) Encode() []byte { return buf[:p] } +func (msg *Fetch) TypeID() int { + return 39 +} + type Profiler struct { - *meta + message Name string Duration uint64 Args string @@ -796,8 +944,12 @@ func (msg *Profiler) Encode() []byte { return buf[:p] } +func (msg *Profiler) TypeID() int { + return 40 +} + type OTable struct { - *meta + message Key string Value string } @@ -811,8 +963,12 @@ func (msg *OTable) Encode() []byte { return buf[:p] } +func (msg *OTable) TypeID() int { + return 41 +} + type StateAction struct { - *meta + message Type string } @@ -824,8 +980,12 @@ func (msg *StateAction) Encode() []byte { return buf[:p] } +func (msg *StateAction) TypeID() int { + return 42 +} + type StateActionEvent struct { - *meta + message MessageID uint64 Timestamp uint64 Type string @@ -841,8 +1001,12 @@ func (msg *StateActionEvent) Encode() []byte { return buf[:p] } +func (msg *StateActionEvent) TypeID() int { + return 43 +} + type Redux struct { - *meta + message Action string State string Duration uint64 @@ -858,8 +1022,12 @@ func (msg *Redux) Encode() []byte { return buf[:p] } +func (msg *Redux) TypeID() int { + return 44 +} + type Vuex struct { - *meta + message Mutation string State string } @@ -873,8 +1041,12 @@ func (msg *Vuex) Encode() []byte { return buf[:p] } +func (msg *Vuex) TypeID() int { + return 45 +} + type MobX struct { - *meta + message Type string Payload string } @@ -888,8 +1060,12 @@ func (msg *MobX) Encode() []byte { return buf[:p] } +func (msg *MobX) TypeID() int { + return 46 +} + type NgRx struct { - *meta + message Action string State string Duration uint64 @@ -905,8 +1081,12 @@ func (msg *NgRx) Encode() []byte { return buf[:p] } +func (msg *NgRx) TypeID() int { + return 47 +} + type GraphQL struct { - *meta + message OperationKind string OperationName string Variables string @@ -924,8 +1104,12 @@ func (msg *GraphQL) Encode() []byte { return buf[:p] } +func (msg *GraphQL) TypeID() int { + return 48 +} + type PerformanceTrack struct { - *meta + message Frames int64 Ticks int64 TotalJSHeapSize uint64 @@ -943,8 +1127,12 @@ func (msg *PerformanceTrack) Encode() []byte { return buf[:p] } +func (msg *PerformanceTrack) TypeID() int { + return 49 +} + type GraphQLEvent struct { - *meta + message MessageID uint64 Timestamp uint64 OperationKind string @@ -966,8 +1154,12 @@ func (msg *GraphQLEvent) Encode() []byte { return buf[:p] } +func (msg *GraphQLEvent) TypeID() int { + return 50 +} + type FetchEvent struct { - *meta + message MessageID uint64 Timestamp uint64 Method string @@ -993,8 +1185,12 @@ func (msg *FetchEvent) Encode() []byte { return buf[:p] } +func (msg *FetchEvent) TypeID() int { + return 51 +} + type DOMDrop struct { - *meta + message Timestamp uint64 } @@ -1006,8 +1202,12 @@ func (msg *DOMDrop) Encode() []byte { return buf[:p] } +func (msg *DOMDrop) TypeID() int { + return 52 +} + type ResourceTiming struct { - *meta + message Timestamp uint64 Duration uint64 TTFB uint64 @@ -1033,8 +1233,12 @@ func (msg *ResourceTiming) Encode() []byte { return buf[:p] } +func (msg *ResourceTiming) TypeID() int { + return 53 +} + type ConnectionInformation struct { - *meta + message Downlink uint64 Type string } @@ -1048,8 +1252,12 @@ func (msg *ConnectionInformation) Encode() []byte { return buf[:p] } +func (msg *ConnectionInformation) TypeID() int { + return 54 +} + type SetPageVisibility struct { - *meta + message hidden bool } @@ -1061,8 +1269,12 @@ func (msg *SetPageVisibility) Encode() []byte { return buf[:p] } +func (msg *SetPageVisibility) TypeID() int { + return 55 +} + type PerformanceTrackAggr struct { - *meta + message TimestampStart uint64 TimestampEnd uint64 MinFPS uint64 @@ -1100,8 +1312,12 @@ func (msg *PerformanceTrackAggr) Encode() []byte { return buf[:p] } +func (msg *PerformanceTrackAggr) TypeID() int { + return 56 +} + type LongTask struct { - *meta + message Timestamp uint64 Duration uint64 Context uint64 @@ -1125,8 +1341,12 @@ func (msg *LongTask) Encode() []byte { return buf[:p] } +func (msg *LongTask) TypeID() int { + return 59 +} + type SetNodeAttributeURLBased struct { - *meta + message ID uint64 Name string Value string @@ -1144,8 +1364,12 @@ func (msg *SetNodeAttributeURLBased) Encode() []byte { return buf[:p] } +func (msg *SetNodeAttributeURLBased) TypeID() int { + return 60 +} + type SetCSSDataURLBased struct { - *meta + message ID uint64 Data string BaseURL string @@ -1161,8 +1385,12 @@ func (msg *SetCSSDataURLBased) Encode() []byte { return buf[:p] } +func (msg *SetCSSDataURLBased) TypeID() int { + return 61 +} + type IssueEvent struct { - *meta + message MessageID uint64 Timestamp uint64 Type string @@ -1184,8 +1412,12 @@ func (msg *IssueEvent) Encode() []byte { return buf[:p] } +func (msg *IssueEvent) TypeID() int { + return 62 +} + type TechnicalInfo struct { - *meta + message Type string Value string } @@ -1199,8 +1431,12 @@ func (msg *TechnicalInfo) Encode() []byte { return buf[:p] } +func (msg *TechnicalInfo) TypeID() int { + return 63 +} + type CustomIssue struct { - *meta + message Name string Payload string } @@ -1214,8 +1450,12 @@ func (msg *CustomIssue) Encode() []byte { return buf[:p] } +func (msg *CustomIssue) TypeID() int { + return 64 +} + type PageClose struct { - *meta + message } func (msg *PageClose) Encode() []byte { @@ -1226,8 +1466,12 @@ func (msg *PageClose) Encode() []byte { return buf[:p] } +func (msg *PageClose) TypeID() int { + return 65 +} + type AssetCache struct { - *meta + message URL string } @@ -1239,8 +1483,12 @@ func (msg *AssetCache) Encode() []byte { return buf[:p] } +func (msg *AssetCache) TypeID() int { + return 66 +} + type CSSInsertRuleURLBased struct { - *meta + message ID uint64 Rule string Index uint64 @@ -1258,8 +1506,12 @@ func (msg *CSSInsertRuleURLBased) Encode() []byte { return buf[:p] } +func (msg *CSSInsertRuleURLBased) TypeID() int { + return 67 +} + type MouseClick struct { - *meta + message ID uint64 HesitationTime uint64 Label string @@ -1277,8 +1529,12 @@ func (msg *MouseClick) Encode() []byte { return buf[:p] } +func (msg *MouseClick) TypeID() int { + return 69 +} + type CreateIFrameDocument struct { - *meta + message FrameID uint64 ID uint64 } @@ -1292,8 +1548,12 @@ func (msg *CreateIFrameDocument) Encode() []byte { return buf[:p] } +func (msg *CreateIFrameDocument) TypeID() int { + return 70 +} + type IOSBatchMeta struct { - *meta + message Timestamp uint64 Length uint64 FirstIndex uint64 @@ -1309,8 +1569,12 @@ func (msg *IOSBatchMeta) Encode() []byte { return buf[:p] } +func (msg *IOSBatchMeta) TypeID() int { + return 107 +} + type IOSSessionStart struct { - *meta + message Timestamp uint64 ProjectID uint64 TrackerVersion string @@ -1340,8 +1604,12 @@ func (msg *IOSSessionStart) Encode() []byte { return buf[:p] } +func (msg *IOSSessionStart) TypeID() int { + return 90 +} + type IOSSessionEnd struct { - *meta + message Timestamp uint64 } @@ -1353,8 +1621,12 @@ func (msg *IOSSessionEnd) Encode() []byte { return buf[:p] } +func (msg *IOSSessionEnd) TypeID() int { + return 91 +} + type IOSMetadata struct { - *meta + message Timestamp uint64 Length uint64 Key string @@ -1372,8 +1644,12 @@ func (msg *IOSMetadata) Encode() []byte { return buf[:p] } +func (msg *IOSMetadata) TypeID() int { + return 92 +} + type IOSCustomEvent struct { - *meta + message Timestamp uint64 Length uint64 Name string @@ -1391,8 +1667,12 @@ func (msg *IOSCustomEvent) Encode() []byte { return buf[:p] } +func (msg *IOSCustomEvent) TypeID() int { + return 93 +} + type IOSUserID struct { - *meta + message Timestamp uint64 Length uint64 Value string @@ -1408,8 +1688,12 @@ func (msg *IOSUserID) Encode() []byte { return buf[:p] } +func (msg *IOSUserID) TypeID() int { + return 94 +} + type IOSUserAnonymousID struct { - *meta + message Timestamp uint64 Length uint64 Value string @@ -1425,8 +1709,12 @@ func (msg *IOSUserAnonymousID) Encode() []byte { return buf[:p] } +func (msg *IOSUserAnonymousID) TypeID() int { + return 95 +} + type IOSScreenChanges struct { - *meta + message Timestamp uint64 Length uint64 X uint64 @@ -1448,8 +1736,12 @@ func (msg *IOSScreenChanges) Encode() []byte { return buf[:p] } +func (msg *IOSScreenChanges) TypeID() int { + return 96 +} + type IOSCrash struct { - *meta + message Timestamp uint64 Length uint64 Name string @@ -1469,8 +1761,12 @@ func (msg *IOSCrash) Encode() []byte { return buf[:p] } +func (msg *IOSCrash) TypeID() int { + return 97 +} + type IOSScreenEnter struct { - *meta + message Timestamp uint64 Length uint64 Title string @@ -1488,8 +1784,12 @@ func (msg *IOSScreenEnter) Encode() []byte { return buf[:p] } +func (msg *IOSScreenEnter) TypeID() int { + return 98 +} + type IOSScreenLeave struct { - *meta + message Timestamp uint64 Length uint64 Title string @@ -1507,8 +1807,12 @@ func (msg *IOSScreenLeave) Encode() []byte { return buf[:p] } +func (msg *IOSScreenLeave) TypeID() int { + return 99 +} + type IOSClickEvent struct { - *meta + message Timestamp uint64 Length uint64 Label string @@ -1528,8 +1832,12 @@ func (msg *IOSClickEvent) Encode() []byte { return buf[:p] } +func (msg *IOSClickEvent) TypeID() int { + return 100 +} + type IOSInputEvent struct { - *meta + message Timestamp uint64 Length uint64 Value string @@ -1549,8 +1857,12 @@ func (msg *IOSInputEvent) Encode() []byte { return buf[:p] } +func (msg *IOSInputEvent) TypeID() int { + return 101 +} + type IOSPerformanceEvent struct { - *meta + message Timestamp uint64 Length uint64 Name string @@ -1568,8 +1880,12 @@ func (msg *IOSPerformanceEvent) Encode() []byte { return buf[:p] } +func (msg *IOSPerformanceEvent) TypeID() int { + return 102 +} + type IOSLog struct { - *meta + message Timestamp uint64 Length uint64 Severity string @@ -1587,8 +1903,12 @@ func (msg *IOSLog) Encode() []byte { return buf[:p] } +func (msg *IOSLog) TypeID() int { + return 103 +} + type IOSInternalError struct { - *meta + message Timestamp uint64 Length uint64 Content string @@ -1604,8 +1924,12 @@ func (msg *IOSInternalError) Encode() []byte { return buf[:p] } +func (msg *IOSInternalError) TypeID() int { + return 104 +} + type IOSNetworkCall struct { - *meta + message Timestamp uint64 Length uint64 Duration uint64 @@ -1633,8 +1957,12 @@ func (msg *IOSNetworkCall) Encode() []byte { return buf[:p] } +func (msg *IOSNetworkCall) TypeID() int { + return 105 +} + type IOSPerformanceAggregated struct { - *meta + message TimestampStart uint64 TimestampEnd uint64 MinFPS uint64 @@ -1672,8 +2000,12 @@ func (msg *IOSPerformanceAggregated) Encode() []byte { return buf[:p] } +func (msg *IOSPerformanceAggregated) TypeID() int { + return 110 +} + type IOSIssueEvent struct { - *meta + message Timestamp uint64 Type string ContextString string @@ -1692,3 +2024,7 @@ func (msg *IOSIssueEvent) Encode() []byte { p = WriteString(msg.Payload, buf, p) return buf[:p] } + +func (msg *IOSIssueEvent) TypeID() int { + return 111 +} diff --git a/backend/pkg/messages/read-message.go b/backend/pkg/messages/read-message.go index 60f9c17a8..59c8e739c 100644 --- a/backend/pkg/messages/read-message.go +++ b/backend/pkg/messages/read-message.go @@ -14,7 +14,7 @@ func ReadMessage(reader io.Reader) (Message, error) { switch t { case 80: - msg := &BatchMeta{meta: &meta{TypeID: 80}} + msg := &BatchMeta{} if msg.PageNo, err = ReadUint(reader); err != nil { return nil, err } @@ -27,14 +27,14 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 0: - msg := &Timestamp{meta: &meta{TypeID: 0}} + msg := &Timestamp{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } return msg, nil case 1: - msg := &SessionStart{meta: &meta{TypeID: 1}} + msg := &SessionStart{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } @@ -86,21 +86,21 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 2: - msg := &SessionDisconnect{meta: &meta{TypeID: 2}} + msg := &SessionDisconnect{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } return msg, nil case 3: - msg := &SessionEnd{meta: &meta{TypeID: 3}} + msg := &SessionEnd{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } return msg, nil case 4: - msg := &SetPageLocation{meta: &meta{TypeID: 4}} + msg := &SetPageLocation{} if msg.URL, err = ReadString(reader); err != nil { return nil, err } @@ -113,7 +113,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 5: - msg := &SetViewportSize{meta: &meta{TypeID: 5}} + msg := &SetViewportSize{} if msg.Width, err = ReadUint(reader); err != nil { return nil, err } @@ -123,7 +123,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 6: - msg := &SetViewportScroll{meta: &meta{TypeID: 6}} + msg := &SetViewportScroll{} if msg.X, err = ReadInt(reader); err != nil { return nil, err } @@ -133,12 +133,12 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 7: - msg := &CreateDocument{meta: &meta{TypeID: 7}} + msg := &CreateDocument{} return msg, nil case 8: - msg := &CreateElementNode{meta: &meta{TypeID: 8}} + msg := &CreateElementNode{} if msg.ID, err = ReadUint(reader); err != nil { return nil, err } @@ -157,7 +157,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 9: - msg := &CreateTextNode{meta: &meta{TypeID: 9}} + msg := &CreateTextNode{} if msg.ID, err = ReadUint(reader); err != nil { return nil, err } @@ -170,7 +170,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 10: - msg := &MoveNode{meta: &meta{TypeID: 10}} + msg := &MoveNode{} if msg.ID, err = ReadUint(reader); err != nil { return nil, err } @@ -183,14 +183,14 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 11: - msg := &RemoveNode{meta: &meta{TypeID: 11}} + msg := &RemoveNode{} if msg.ID, err = ReadUint(reader); err != nil { return nil, err } return msg, nil case 12: - msg := &SetNodeAttribute{meta: &meta{TypeID: 12}} + msg := &SetNodeAttribute{} if msg.ID, err = ReadUint(reader); err != nil { return nil, err } @@ -203,7 +203,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 13: - msg := &RemoveNodeAttribute{meta: &meta{TypeID: 13}} + msg := &RemoveNodeAttribute{} if msg.ID, err = ReadUint(reader); err != nil { return nil, err } @@ -213,7 +213,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 14: - msg := &SetNodeData{meta: &meta{TypeID: 14}} + msg := &SetNodeData{} if msg.ID, err = ReadUint(reader); err != nil { return nil, err } @@ -223,7 +223,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 15: - msg := &SetCSSData{meta: &meta{TypeID: 15}} + msg := &SetCSSData{} if msg.ID, err = ReadUint(reader); err != nil { return nil, err } @@ -233,7 +233,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 16: - msg := &SetNodeScroll{meta: &meta{TypeID: 16}} + msg := &SetNodeScroll{} if msg.ID, err = ReadUint(reader); err != nil { return nil, err } @@ -246,7 +246,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 17: - msg := &SetInputTarget{meta: &meta{TypeID: 17}} + msg := &SetInputTarget{} if msg.ID, err = ReadUint(reader); err != nil { return nil, err } @@ -256,7 +256,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 18: - msg := &SetInputValue{meta: &meta{TypeID: 18}} + msg := &SetInputValue{} if msg.ID, err = ReadUint(reader); err != nil { return nil, err } @@ -269,7 +269,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 19: - msg := &SetInputChecked{meta: &meta{TypeID: 19}} + msg := &SetInputChecked{} if msg.ID, err = ReadUint(reader); err != nil { return nil, err } @@ -279,7 +279,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 20: - msg := &MouseMove{meta: &meta{TypeID: 20}} + msg := &MouseMove{} if msg.X, err = ReadUint(reader); err != nil { return nil, err } @@ -289,7 +289,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 21: - msg := &MouseClickDepricated{meta: &meta{TypeID: 21}} + msg := &MouseClickDepricated{} if msg.ID, err = ReadUint(reader); err != nil { return nil, err } @@ -302,7 +302,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 22: - msg := &ConsoleLog{meta: &meta{TypeID: 22}} + msg := &ConsoleLog{} if msg.Level, err = ReadString(reader); err != nil { return nil, err } @@ -312,7 +312,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 23: - msg := &PageLoadTiming{meta: &meta{TypeID: 23}} + msg := &PageLoadTiming{} if msg.RequestStart, err = ReadUint(reader); err != nil { return nil, err } @@ -343,7 +343,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 24: - msg := &PageRenderTiming{meta: &meta{TypeID: 24}} + msg := &PageRenderTiming{} if msg.SpeedIndex, err = ReadUint(reader); err != nil { return nil, err } @@ -356,7 +356,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 25: - msg := &JSException{meta: &meta{TypeID: 25}} + msg := &JSException{} if msg.Name, err = ReadString(reader); err != nil { return nil, err } @@ -369,7 +369,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 26: - msg := &RawErrorEvent{meta: &meta{TypeID: 26}} + msg := &RawErrorEvent{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } @@ -388,7 +388,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 27: - msg := &RawCustomEvent{meta: &meta{TypeID: 27}} + msg := &RawCustomEvent{} if msg.Name, err = ReadString(reader); err != nil { return nil, err } @@ -398,21 +398,21 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 28: - msg := &UserID{meta: &meta{TypeID: 28}} + msg := &UserID{} if msg.ID, err = ReadString(reader); err != nil { return nil, err } return msg, nil case 29: - msg := &UserAnonymousID{meta: &meta{TypeID: 29}} + msg := &UserAnonymousID{} if msg.ID, err = ReadString(reader); err != nil { return nil, err } return msg, nil case 30: - msg := &Metadata{meta: &meta{TypeID: 30}} + msg := &Metadata{} if msg.Key, err = ReadString(reader); err != nil { return nil, err } @@ -422,7 +422,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 31: - msg := &PageEvent{meta: &meta{TypeID: 31}} + msg := &PageEvent{} if msg.MessageID, err = ReadUint(reader); err != nil { return nil, err } @@ -477,7 +477,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 32: - msg := &InputEvent{meta: &meta{TypeID: 32}} + msg := &InputEvent{} if msg.MessageID, err = ReadUint(reader); err != nil { return nil, err } @@ -496,7 +496,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 33: - msg := &ClickEvent{meta: &meta{TypeID: 33}} + msg := &ClickEvent{} if msg.MessageID, err = ReadUint(reader); err != nil { return nil, err } @@ -515,7 +515,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 34: - msg := &ErrorEvent{meta: &meta{TypeID: 34}} + msg := &ErrorEvent{} if msg.MessageID, err = ReadUint(reader); err != nil { return nil, err } @@ -537,7 +537,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 35: - msg := &ResourceEvent{meta: &meta{TypeID: 35}} + msg := &ResourceEvent{} if msg.MessageID, err = ReadUint(reader); err != nil { return nil, err } @@ -577,7 +577,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 36: - msg := &CustomEvent{meta: &meta{TypeID: 36}} + msg := &CustomEvent{} if msg.MessageID, err = ReadUint(reader); err != nil { return nil, err } @@ -593,7 +593,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 37: - msg := &CSSInsertRule{meta: &meta{TypeID: 37}} + msg := &CSSInsertRule{} if msg.ID, err = ReadUint(reader); err != nil { return nil, err } @@ -606,7 +606,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 38: - msg := &CSSDeleteRule{meta: &meta{TypeID: 38}} + msg := &CSSDeleteRule{} if msg.ID, err = ReadUint(reader); err != nil { return nil, err } @@ -616,7 +616,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 39: - msg := &Fetch{meta: &meta{TypeID: 39}} + msg := &Fetch{} if msg.Method, err = ReadString(reader); err != nil { return nil, err } @@ -641,7 +641,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 40: - msg := &Profiler{meta: &meta{TypeID: 40}} + msg := &Profiler{} if msg.Name, err = ReadString(reader); err != nil { return nil, err } @@ -657,7 +657,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 41: - msg := &OTable{meta: &meta{TypeID: 41}} + msg := &OTable{} if msg.Key, err = ReadString(reader); err != nil { return nil, err } @@ -667,14 +667,14 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 42: - msg := &StateAction{meta: &meta{TypeID: 42}} + msg := &StateAction{} if msg.Type, err = ReadString(reader); err != nil { return nil, err } return msg, nil case 43: - msg := &StateActionEvent{meta: &meta{TypeID: 43}} + msg := &StateActionEvent{} if msg.MessageID, err = ReadUint(reader); err != nil { return nil, err } @@ -687,7 +687,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 44: - msg := &Redux{meta: &meta{TypeID: 44}} + msg := &Redux{} if msg.Action, err = ReadString(reader); err != nil { return nil, err } @@ -700,7 +700,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 45: - msg := &Vuex{meta: &meta{TypeID: 45}} + msg := &Vuex{} if msg.Mutation, err = ReadString(reader); err != nil { return nil, err } @@ -710,7 +710,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 46: - msg := &MobX{meta: &meta{TypeID: 46}} + msg := &MobX{} if msg.Type, err = ReadString(reader); err != nil { return nil, err } @@ -720,7 +720,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 47: - msg := &NgRx{meta: &meta{TypeID: 47}} + msg := &NgRx{} if msg.Action, err = ReadString(reader); err != nil { return nil, err } @@ -733,7 +733,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 48: - msg := &GraphQL{meta: &meta{TypeID: 48}} + msg := &GraphQL{} if msg.OperationKind, err = ReadString(reader); err != nil { return nil, err } @@ -749,7 +749,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 49: - msg := &PerformanceTrack{meta: &meta{TypeID: 49}} + msg := &PerformanceTrack{} if msg.Frames, err = ReadInt(reader); err != nil { return nil, err } @@ -765,7 +765,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 50: - msg := &GraphQLEvent{meta: &meta{TypeID: 50}} + msg := &GraphQLEvent{} if msg.MessageID, err = ReadUint(reader); err != nil { return nil, err } @@ -787,7 +787,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 51: - msg := &FetchEvent{meta: &meta{TypeID: 51}} + msg := &FetchEvent{} if msg.MessageID, err = ReadUint(reader); err != nil { return nil, err } @@ -815,14 +815,14 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 52: - msg := &DOMDrop{meta: &meta{TypeID: 52}} + msg := &DOMDrop{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } return msg, nil case 53: - msg := &ResourceTiming{meta: &meta{TypeID: 53}} + msg := &ResourceTiming{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } @@ -850,7 +850,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 54: - msg := &ConnectionInformation{meta: &meta{TypeID: 54}} + msg := &ConnectionInformation{} if msg.Downlink, err = ReadUint(reader); err != nil { return nil, err } @@ -860,14 +860,14 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 55: - msg := &SetPageVisibility{meta: &meta{TypeID: 55}} + msg := &SetPageVisibility{} if msg.hidden, err = ReadBoolean(reader); err != nil { return nil, err } return msg, nil case 56: - msg := &PerformanceTrackAggr{meta: &meta{TypeID: 56}} + msg := &PerformanceTrackAggr{} if msg.TimestampStart, err = ReadUint(reader); err != nil { return nil, err } @@ -913,7 +913,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 59: - msg := &LongTask{meta: &meta{TypeID: 59}} + msg := &LongTask{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } @@ -938,7 +938,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 60: - msg := &SetNodeAttributeURLBased{meta: &meta{TypeID: 60}} + msg := &SetNodeAttributeURLBased{} if msg.ID, err = ReadUint(reader); err != nil { return nil, err } @@ -954,7 +954,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 61: - msg := &SetCSSDataURLBased{meta: &meta{TypeID: 61}} + msg := &SetCSSDataURLBased{} if msg.ID, err = ReadUint(reader); err != nil { return nil, err } @@ -967,7 +967,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 62: - msg := &IssueEvent{meta: &meta{TypeID: 62}} + msg := &IssueEvent{} if msg.MessageID, err = ReadUint(reader); err != nil { return nil, err } @@ -989,7 +989,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 63: - msg := &TechnicalInfo{meta: &meta{TypeID: 63}} + msg := &TechnicalInfo{} if msg.Type, err = ReadString(reader); err != nil { return nil, err } @@ -999,7 +999,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 64: - msg := &CustomIssue{meta: &meta{TypeID: 64}} + msg := &CustomIssue{} if msg.Name, err = ReadString(reader); err != nil { return nil, err } @@ -1009,19 +1009,19 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 65: - msg := &PageClose{meta: &meta{TypeID: 65}} + msg := &PageClose{} return msg, nil case 66: - msg := &AssetCache{meta: &meta{TypeID: 66}} + msg := &AssetCache{} if msg.URL, err = ReadString(reader); err != nil { return nil, err } return msg, nil case 67: - msg := &CSSInsertRuleURLBased{meta: &meta{TypeID: 67}} + msg := &CSSInsertRuleURLBased{} if msg.ID, err = ReadUint(reader); err != nil { return nil, err } @@ -1037,7 +1037,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 69: - msg := &MouseClick{meta: &meta{TypeID: 69}} + msg := &MouseClick{} if msg.ID, err = ReadUint(reader); err != nil { return nil, err } @@ -1053,7 +1053,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 70: - msg := &CreateIFrameDocument{meta: &meta{TypeID: 70}} + msg := &CreateIFrameDocument{} if msg.FrameID, err = ReadUint(reader); err != nil { return nil, err } @@ -1063,7 +1063,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 107: - msg := &IOSBatchMeta{meta: &meta{TypeID: 107}} + msg := &IOSBatchMeta{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } @@ -1076,7 +1076,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 90: - msg := &IOSSessionStart{meta: &meta{TypeID: 90}} + msg := &IOSSessionStart{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } @@ -1110,14 +1110,14 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 91: - msg := &IOSSessionEnd{meta: &meta{TypeID: 91}} + msg := &IOSSessionEnd{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } return msg, nil case 92: - msg := &IOSMetadata{meta: &meta{TypeID: 92}} + msg := &IOSMetadata{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } @@ -1133,7 +1133,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 93: - msg := &IOSCustomEvent{meta: &meta{TypeID: 93}} + msg := &IOSCustomEvent{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } @@ -1149,7 +1149,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 94: - msg := &IOSUserID{meta: &meta{TypeID: 94}} + msg := &IOSUserID{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } @@ -1162,7 +1162,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 95: - msg := &IOSUserAnonymousID{meta: &meta{TypeID: 95}} + msg := &IOSUserAnonymousID{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } @@ -1175,7 +1175,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 96: - msg := &IOSScreenChanges{meta: &meta{TypeID: 96}} + msg := &IOSScreenChanges{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } @@ -1197,7 +1197,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 97: - msg := &IOSCrash{meta: &meta{TypeID: 97}} + msg := &IOSCrash{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } @@ -1216,7 +1216,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 98: - msg := &IOSScreenEnter{meta: &meta{TypeID: 98}} + msg := &IOSScreenEnter{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } @@ -1232,7 +1232,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 99: - msg := &IOSScreenLeave{meta: &meta{TypeID: 99}} + msg := &IOSScreenLeave{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } @@ -1248,7 +1248,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 100: - msg := &IOSClickEvent{meta: &meta{TypeID: 100}} + msg := &IOSClickEvent{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } @@ -1267,7 +1267,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 101: - msg := &IOSInputEvent{meta: &meta{TypeID: 101}} + msg := &IOSInputEvent{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } @@ -1286,7 +1286,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 102: - msg := &IOSPerformanceEvent{meta: &meta{TypeID: 102}} + msg := &IOSPerformanceEvent{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } @@ -1302,7 +1302,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 103: - msg := &IOSLog{meta: &meta{TypeID: 103}} + msg := &IOSLog{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } @@ -1318,7 +1318,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 104: - msg := &IOSInternalError{meta: &meta{TypeID: 104}} + msg := &IOSInternalError{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } @@ -1331,7 +1331,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 105: - msg := &IOSNetworkCall{meta: &meta{TypeID: 105}} + msg := &IOSNetworkCall{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } @@ -1362,7 +1362,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 110: - msg := &IOSPerformanceAggregated{meta: &meta{TypeID: 110}} + msg := &IOSPerformanceAggregated{} if msg.TimestampStart, err = ReadUint(reader); err != nil { return nil, err } @@ -1408,7 +1408,7 @@ func ReadMessage(reader io.Reader) (Message, error) { return msg, nil case 111: - msg := &IOSIssueEvent{meta: &meta{TypeID: 111}} + msg := &IOSIssueEvent{} if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } diff --git a/backend/services/sink/main.go b/backend/services/sink/main.go index a649bb6ef..1a23919c6 100644 --- a/backend/services/sink/main.go +++ b/backend/services/sink/main.go @@ -34,12 +34,7 @@ func main() { env.String("TOPIC_RAW_IOS"), }, func(sessionID uint64, message Message, _ *types.Meta) { - //typeID, err := GetMessageTypeID(value) - // if err != nil { - // log.Printf("Message type decoding error: %v", err) - // return - // } - typeID := message.Meta().TypeID + typeID := message.TypeID() if !IsReplayerType(typeID) { return } From 324ee0890e8cc9e796691ecb6197a5954ad1beae Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Sat, 7 May 2022 23:21:30 +0200 Subject: [PATCH 089/260] chore(backend): enforce amd64 build (for build on amr mac) --- backend/build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/build.sh b/backend/build.sh index b4de3c2de..84af1a919 100755 --- a/backend/build.sh +++ b/backend/build.sh @@ -25,13 +25,13 @@ function build_service() { case "$image" in http | db) echo build http - docker build -t ${DOCKER_REPO:-'local'}/$image:${git_sha1} --build-arg SERVICE_NAME=$image -f ./cmd/Dockerfile . + docker build -t ${DOCKER_REPO:-'local'}/$image:${git_sha1} --platform linux/amd64 --build-arg SERVICE_NAME=$image -f ./cmd/Dockerfile . [[ $PUSH_IMAGE -eq 1 ]] && { docker push ${DOCKER_REPO:-'local'}/$image:${git_sha1} } ;; *) - docker build -t ${DOCKER_REPO:-'local'}/$image:${git_sha1} --build-arg SERVICE_NAME=$image . + docker build -t ${DOCKER_REPO:-'local'}/$image:${git_sha1} --platform linux/amd64 --build-arg SERVICE_NAME=$image . [[ $PUSH_IMAGE -eq 1 ]] && { docker push ${DOCKER_REPO:-'local'}/$image:${git_sha1} } From ae4c6e5cad212bf4b107d25005f30191d5e915ee Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Sat, 7 May 2022 23:52:48 +0200 Subject: [PATCH 090/260] refactor(backend-sink): go go standarts --- backend/{services => cmd}/sink/main.go | 18 ++++++++------- backend/internal/config/sink/config.go | 23 +++++++++++++++++++ .../oswriter/oswriter.go} | 2 +- backend/services/sink/build_hack | 0 4 files changed, 34 insertions(+), 9 deletions(-) rename backend/{services => cmd}/sink/main.go (82%) create mode 100644 backend/internal/config/sink/config.go rename backend/{services/sink/writer.go => internal/oswriter/oswriter.go} (99%) create mode 100644 backend/services/sink/build_hack diff --git a/backend/services/sink/main.go b/backend/cmd/sink/main.go similarity index 82% rename from backend/services/sink/main.go rename to backend/cmd/sink/main.go index 1a23919c6..fcab40321 100644 --- a/backend/services/sink/main.go +++ b/backend/cmd/sink/main.go @@ -9,7 +9,8 @@ import ( "os/signal" "syscall" - "openreplay/backend/pkg/env" + "openreplay/backend/internal/config/sink" + "openreplay/backend/internal/oswriter" . "openreplay/backend/pkg/messages" "openreplay/backend/pkg/queue" "openreplay/backend/pkg/queue/types" @@ -18,20 +19,21 @@ import ( func main() { log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) - FS_DIR := env.String("FS_DIR") - if _, err := os.Stat(FS_DIR); os.IsNotExist(err) { - log.Fatalf("%v doesn't exist. %v", FS_DIR, err) + cfg := sink.New() + + if _, err := os.Stat(cfg.FsDir); os.IsNotExist(err) { + log.Fatalf("%v doesn't exist. %v", cfg.FsDir, err) } - writer := NewWriter(env.Uint16("FS_ULIMIT"), FS_DIR) + writer := oswriter.NewWriter(cfg.FsUlimit, cfg.FsDir) count := 0 consumer := queue.NewMessageConsumer( - env.String("GROUP_SINK"), + cfg.GroupSink, []string{ - env.String("TOPIC_RAW_WEB"), - env.String("TOPIC_RAW_IOS"), + cfg.TopicRawIOS, + cfg.TopicRawWeb, }, func(sessionID uint64, message Message, _ *types.Meta) { typeID := message.TypeID() diff --git a/backend/internal/config/sink/config.go b/backend/internal/config/sink/config.go new file mode 100644 index 000000000..4837e86e3 --- /dev/null +++ b/backend/internal/config/sink/config.go @@ -0,0 +1,23 @@ +package sink + +import ( + "openreplay/backend/pkg/env" +) + +type Config struct { + FsDir string + FsUlimit uint16 + GroupSink string + TopicRawWeb string + TopicRawIOS string +} + +func New() *Config { + return &Config{ + FsDir: env.String("FS_DIR"), + FsUlimit: env.Uint16("FS_ULIMIT"), + GroupSink: env.String("GROUP_SINK"), + TopicRawWeb: env.String("TOPIC_RAW_WEB"), + TopicRawIOS: env.String("TOPIC_RAW_IOS"), + } +} diff --git a/backend/services/sink/writer.go b/backend/internal/oswriter/oswriter.go similarity index 99% rename from backend/services/sink/writer.go rename to backend/internal/oswriter/oswriter.go index 6fcfdddbc..839e61eba 100644 --- a/backend/services/sink/writer.go +++ b/backend/internal/oswriter/oswriter.go @@ -1,4 +1,4 @@ -package main +package oswriter import ( "math" diff --git a/backend/services/sink/build_hack b/backend/services/sink/build_hack new file mode 100644 index 000000000..e69de29bb From ca9d76624b505ecb31b43890512e21cf3ff33a08 Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Mon, 9 May 2022 16:51:10 +0200 Subject: [PATCH 091/260] feat(backend/heuristics): message handlers refactoring --- backend/cmd/heuristics/main.go | 30 ++++++++- backend/internal/builder/builder.go | 19 ++---- backend/internal/builder/builderMap.go | 31 ++++++---- .../internal/handlers/custom/customHandler.go | 16 +++++ .../ios/appNotResponding.go} | 51 ++++++++++------ .../ios/clickRage.go} | 61 +++++++++++-------- .../ios/performanceAggregator.go} | 59 ++++++++++-------- backend/internal/handlers/messageProcessor.go | 11 ++++ .../readyMessageStore.go | 8 +-- .../web/clickRage.go} | 12 ++-- .../web/cpuIssue.go} | 10 +-- .../web/deadClick.go} | 14 +++-- .../web/domDrop.go} | 4 +- .../web/memoryIssue.go} | 10 +-- .../web/performanceAggregator.go} | 12 ++-- backend/internal/heuristics/session.go | 6 +- 16 files changed, 223 insertions(+), 131 deletions(-) create mode 100644 backend/internal/handlers/custom/customHandler.go rename backend/internal/{heuristics/anr.go => handlers/ios/appNotResponding.go} (66%) rename backend/internal/{heuristics/clickrage.go => handlers/ios/clickRage.go} (60%) rename backend/internal/{heuristics/performance.go => handlers/ios/performanceAggregator.go} (78%) create mode 100644 backend/internal/handlers/messageProcessor.go rename backend/internal/{heuristics => handlers}/readyMessageStore.go (51%) rename backend/internal/{builder/clikRageDetector.go => handlers/web/clickRage.go} (85%) rename backend/internal/{builder/cpuIssueFinder.go => handlers/web/cpuIssue.go} (86%) rename backend/internal/{builder/deadClickDetector.go => handlers/web/deadClick.go} (82%) rename backend/internal/{builder/domDropDetector.go => handlers/web/domDrop.go} (94%) rename backend/internal/{builder/memoryIssueFinder.go => handlers/web/memoryIssue.go} (83%) rename backend/internal/{builder/performanceTrackAggrBuilder.go => handlers/web/performanceAggregator.go} (89%) diff --git a/backend/cmd/heuristics/main.go b/backend/cmd/heuristics/main.go index 2778685d3..f5e3b675f 100644 --- a/backend/cmd/heuristics/main.go +++ b/backend/cmd/heuristics/main.go @@ -4,6 +4,10 @@ import ( "log" "openreplay/backend/internal/builder" "openreplay/backend/internal/config/ender" + "openreplay/backend/internal/handlers" + "openreplay/backend/internal/handlers/custom" + "openreplay/backend/internal/handlers/ios" + "openreplay/backend/internal/handlers/web" "openreplay/backend/pkg/intervals" logger "openreplay/backend/pkg/log" "openreplay/backend/pkg/messages" @@ -18,10 +22,32 @@ import ( func main() { log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) + // Load service configuration cfg := ender.New() - builderMap := builder.NewBuilderMap() + // Declare message handlers we want to apply for each incoming message + msgHandlers := []handlers.MessageProcessor{ + // web handlers + &web.ClickRageDetector{}, + &web.CpuIssueDetector{}, + &web.DeadClickDetector{}, + &web.MemoryIssueDetector{}, + &web.PerformanceAggregator{}, + // iOS handlers + &ios.AppNotResponding{}, + &ios.ClickRageDetector{}, + &ios.PerformanceAggregator{}, + // Other handlers (you can add your custom handlers here) + &custom.CustomHandler{}, + } + + // Create handler's aggregator + builderMap := builder.NewBuilderMap(msgHandlers...) + + // Init logger statsLogger := logger.NewQueueStats(cfg.LoggerTimeout) + + // Init producer and consumer for data bus producer := queue.NewProducer() consumer := queue.NewMessageConsumer( cfg.GroupEvents, @@ -36,7 +62,7 @@ func main() { false, ) - log.Printf("Ender service started\n") + log.Printf("Heuristics service started\n") sigchan := make(chan os.Signal, 1) signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM) diff --git a/backend/internal/builder/builder.go b/backend/internal/builder/builder.go index 7e062e6b2..c35457d62 100644 --- a/backend/internal/builder/builder.go +++ b/backend/internal/builder/builder.go @@ -1,31 +1,20 @@ package builder import ( + "openreplay/backend/internal/handlers" "openreplay/backend/pkg/intervals" . "openreplay/backend/pkg/messages" ) -type messageProcessor interface { - Handle(message Message, messageID uint64, timestamp uint64) Message - Build() Message -} - type builder struct { readyMsgs []Message timestamp uint64 - processors []messageProcessor + processors []handlers.MessageProcessor } -func NewBuilder() *builder { +func NewBuilder(handlers ...handlers.MessageProcessor) *builder { return &builder{ - processors: []messageProcessor{ - &performanceTrackAggrBuilder{}, - &cpuIssueFinder{}, - &memoryIssueFinder{}, - // &domDropDetector{}, - &clickRageDetector{}, - &deadClickDetector{}, - }, + processors: handlers, } } diff --git a/backend/internal/builder/builderMap.go b/backend/internal/builder/builderMap.go index 6caf18e4f..5bc01e78d 100644 --- a/backend/internal/builder/builderMap.go +++ b/backend/internal/builder/builderMap.go @@ -1,37 +1,44 @@ package builder import ( + "openreplay/backend/internal/handlers" . "openreplay/backend/pkg/messages" ) -type builderMap map[uint64]*builder - -func NewBuilderMap() builderMap { - return make(builderMap) +type builderMap struct { + handlers []handlers.MessageProcessor + sessions map[uint64]*builder } -func (m builderMap) GetBuilder(sessionID uint64) *builder { - b := m[sessionID] +func NewBuilderMap(handlers ...handlers.MessageProcessor) *builderMap { + return &builderMap{ + handlers: handlers, + sessions: make(map[uint64]*builder), + } +} + +func (m *builderMap) GetBuilder(sessionID uint64) *builder { + b := m.sessions[sessionID] if b == nil { - b = NewBuilder() - m[sessionID] = b + b = NewBuilder(m.handlers...) + m.sessions[sessionID] = b } return b } -func (m builderMap) HandleMessage(sessionID uint64, msg Message, messageID uint64) { +func (m *builderMap) HandleMessage(sessionID uint64, msg Message, messageID uint64) { b := m.GetBuilder(sessionID) b.handleMessage(msg, messageID) } -func (m builderMap) IterateReadyMessages(operatingTs int64, iter func(sessionID uint64, msg Message)) { - for sessionID, b := range m { +func (m *builderMap) IterateReadyMessages(operatingTs int64, iter func(sessionID uint64, msg Message)) { + for sessionID, b := range m.sessions { sessionEnded := b.checkTimeouts(operatingTs) b.iterateReadyMessage(func(msg Message) { iter(sessionID, msg) }) if sessionEnded { - delete(m, sessionID) + delete(m.sessions, sessionID) } } } diff --git a/backend/internal/handlers/custom/customHandler.go b/backend/internal/handlers/custom/customHandler.go new file mode 100644 index 000000000..9b191189e --- /dev/null +++ b/backend/internal/handlers/custom/customHandler.go @@ -0,0 +1,16 @@ +package custom + +import . "openreplay/backend/pkg/messages" + +type CustomHandler struct { + lastTimestamp uint64 +} + +func (h *CustomHandler) Handle(message Message, messageID uint64, timestamp uint64) Message { + h.lastTimestamp = timestamp + return nil +} + +func (h *CustomHandler) Build() Message { + return nil +} diff --git a/backend/internal/heuristics/anr.go b/backend/internal/handlers/ios/appNotResponding.go similarity index 66% rename from backend/internal/heuristics/anr.go rename to backend/internal/handlers/ios/appNotResponding.go index 7cec8fc97..1241648db 100644 --- a/backend/internal/heuristics/anr.go +++ b/backend/internal/handlers/ios/appNotResponding.go @@ -1,34 +1,23 @@ -package heuristics +package ios import ( + "openreplay/backend/internal/handlers" . "openreplay/backend/pkg/messages" ) +// app is not responding detector + const MIN_TIME_AFTER_LAST_HEARTBEAT = 60 * 1000 -type anr struct { - readyMessageStore +type AppNotResponding struct { + handlers.ReadyMessageStore lastLabel string lastHeartbeatTimestamp uint64 lastHeartbeatIndex uint64 } -func (h *anr) buildIf(timestamp uint64) { - if h.lastHeartbeatTimestamp != 0 && h.lastHeartbeatTimestamp+MIN_TIME_AFTER_LAST_HEARTBEAT <= timestamp { - m := &IOSIssueEvent{ - Type: "anr", - ContextString: h.lastLabel, - } - m.Timestamp = h.lastHeartbeatTimestamp - m.Index = h.lastHeartbeatIndex // Associated Index/ MessageID ? - h.append(m) - h.lastHeartbeatTimestamp = 0 - h.lastHeartbeatIndex = 0 - } -} - -func (h *anr) HandleMessage(msg Message) { - switch m := msg.(type) { +func (h *AppNotResponding) Handle(message Message, messageID uint64, timestamp uint64) Message { + switch m := message.(type) { case *IOSClickEvent: h.buildIf(m.Timestamp) h.lastLabel = m.Label @@ -46,4 +35,28 @@ func (h *anr) HandleMessage(msg Message) { case *IOSSessionEnd: h.buildIf(m.Timestamp) } + return nil +} + +func (h *AppNotResponding) Build() Message { + //TODO implement me + panic("implement me") +} + +func (h *AppNotResponding) buildIf(timestamp uint64) { + if h.lastHeartbeatTimestamp != 0 && h.lastHeartbeatTimestamp+MIN_TIME_AFTER_LAST_HEARTBEAT <= timestamp { + m := &IOSIssueEvent{ + Type: "anr", + ContextString: h.lastLabel, + } + m.Timestamp = h.lastHeartbeatTimestamp + m.Index = h.lastHeartbeatIndex // Associated Index/ MessageID ? + h.Append(m) + h.lastHeartbeatTimestamp = 0 + h.lastHeartbeatIndex = 0 + } +} + +func (h *AppNotResponding) HandleMessage(msg Message) { + // TODO: delete it } diff --git a/backend/internal/heuristics/clickrage.go b/backend/internal/handlers/ios/clickRage.go similarity index 60% rename from backend/internal/heuristics/clickrage.go rename to backend/internal/handlers/ios/clickRage.go index 4d19bf92e..2707c04d5 100644 --- a/backend/internal/heuristics/clickrage.go +++ b/backend/internal/handlers/ios/clickRage.go @@ -1,14 +1,17 @@ -package heuristics +package ios import ( + "openreplay/backend/internal/handlers" + "openreplay/backend/internal/handlers/web" . "openreplay/backend/pkg/messages" ) const CLICK_TIME_DIFF = 200 -const MIN_CLICKS_IN_A_ROW = 3 -type clickrage struct { - readyMessageStore +//const MIN_CLICKS_IN_A_ROW = 3 + +type ClickRageDetector struct { + handlers.ReadyMessageStore lastTimestamp uint64 lastLabel string firstInARawTimestamp uint64 @@ -16,30 +19,13 @@ type clickrage struct { countsInARow int } -func (h *clickrage) build() { - if h.countsInARow >= MIN_CLICKS_IN_A_ROW { - m := &IOSIssueEvent{ - Type: "click_rage", - ContextString: h.lastLabel, - } - m.Timestamp = h.firstInARawTimestamp - m.Index = h.firstInARawSeqIndex // Associated Index/ MessageID ? - h.append(m) - } - h.lastTimestamp = 0 - h.lastLabel = "" - h.firstInARawTimestamp = 0 - h.firstInARawSeqIndex = 0 - h.countsInARow = 0 -} - -func (h *clickrage) HandleMessage(msg Message) { - switch m := msg.(type) { +func (h *ClickRageDetector) Handle(message Message, messageID uint64, timestamp uint64) Message { + switch m := message.(type) { case *IOSClickEvent: if h.lastTimestamp+CLICK_TIME_DIFF < m.Timestamp && h.lastLabel == m.Label { h.lastTimestamp = m.Timestamp h.countsInARow += 1 - return + return nil } h.build() if m.Label != "" { @@ -52,4 +38,31 @@ func (h *clickrage) HandleMessage(msg Message) { case *IOSSessionEnd: h.build() } + return nil +} + +func (h *ClickRageDetector) Build() Message { + //TODO implement me + panic("implement me") +} + +func (h *ClickRageDetector) build() { + if h.countsInARow >= web.MIN_CLICKS_IN_A_ROW { + m := &IOSIssueEvent{ + Type: "click_rage", + ContextString: h.lastLabel, + } + m.Timestamp = h.firstInARawTimestamp + m.Index = h.firstInARawSeqIndex // Associated Index/ MessageID ? + h.Append(m) + } + h.lastTimestamp = 0 + h.lastLabel = "" + h.firstInARawTimestamp = 0 + h.firstInARawSeqIndex = 0 + h.countsInARow = 0 +} + +func (h *ClickRageDetector) HandleMessage(msg Message) { + // TODO: delete it } diff --git a/backend/internal/heuristics/performance.go b/backend/internal/handlers/ios/performanceAggregator.go similarity index 78% rename from backend/internal/heuristics/performance.go rename to backend/internal/handlers/ios/performanceAggregator.go index c7494a793..1525127b8 100644 --- a/backend/internal/heuristics/performance.go +++ b/backend/internal/handlers/ios/performanceAggregator.go @@ -1,6 +1,7 @@ -package heuristics +package ios import ( + "openreplay/backend/internal/handlers" . "openreplay/backend/pkg/messages" ) @@ -18,8 +19,8 @@ func (va *valueAggregator) aggregate() uint64 { return uint64(va.sum / va.count) } -type performanceAggregator struct { - readyMessageStore +type PerformanceAggregator struct { + handlers.ReadyMessageStore pa *IOSPerformanceAggregated fps valueAggregator cpu valueAggregator @@ -27,30 +28,11 @@ type performanceAggregator struct { battery valueAggregator } -func (h *performanceAggregator) build(timestamp uint64) { - if h.pa == nil { - return - } - h.pa.TimestampEnd = timestamp - h.pa.AvgFPS = h.fps.aggregate() - h.pa.AvgCPU = h.cpu.aggregate() - h.pa.AvgMemory = h.memory.aggregate() - h.pa.AvgBattery = h.battery.aggregate() - - h.append(h.pa) - - h.pa = &IOSPerformanceAggregated{} - for _, agg := range []valueAggregator{h.fps, h.cpu, h.memory, h.battery} { - agg.sum = 0 - agg.count = 0 - } -} - -func (h *performanceAggregator) HandleMessage(msg Message) { +func (h *PerformanceAggregator) Handle(message Message, messageID uint64, timestamp uint64) Message { if h.pa == nil { h.pa = &IOSPerformanceAggregated{} // TODO: struct type in messages } - switch m := msg.(type) { // TODO: All Timestampe messages + switch m := message.(type) { // TODO: All Timestampe messages case *IOSPerformanceEvent: if h.pa.TimestampStart == 0 { h.pa.TimestampStart = m.Timestamp @@ -99,4 +81,33 @@ func (h *performanceAggregator) HandleMessage(msg Message) { case *IOSSessionEnd: h.build(m.Timestamp) } + return nil +} + +func (h *PerformanceAggregator) Build() Message { + //TODO implement me + panic("implement me") +} + +func (h *PerformanceAggregator) build(timestamp uint64) { + if h.pa == nil { + return + } + h.pa.TimestampEnd = timestamp + h.pa.AvgFPS = h.fps.aggregate() + h.pa.AvgCPU = h.cpu.aggregate() + h.pa.AvgMemory = h.memory.aggregate() + h.pa.AvgBattery = h.battery.aggregate() + + h.Append(h.pa) + + h.pa = &IOSPerformanceAggregated{} + for _, agg := range []valueAggregator{h.fps, h.cpu, h.memory, h.battery} { + agg.sum = 0 + agg.count = 0 + } +} + +func (h *PerformanceAggregator) HandleMessage(msg Message) { + // TODO: delete it } diff --git a/backend/internal/handlers/messageProcessor.go b/backend/internal/handlers/messageProcessor.go new file mode 100644 index 000000000..c4235c18b --- /dev/null +++ b/backend/internal/handlers/messageProcessor.go @@ -0,0 +1,11 @@ +package handlers + +import . "openreplay/backend/pkg/messages" + +// Heuristic interface - common interface for user's realisations +// U can create your own message handler and easily connect to heuristics service + +type MessageProcessor interface { + Handle(message Message, messageID uint64, timestamp uint64) Message + Build() Message +} diff --git a/backend/internal/heuristics/readyMessageStore.go b/backend/internal/handlers/readyMessageStore.go similarity index 51% rename from backend/internal/heuristics/readyMessageStore.go rename to backend/internal/handlers/readyMessageStore.go index bbe77585d..c0c386571 100644 --- a/backend/internal/heuristics/readyMessageStore.go +++ b/backend/internal/handlers/readyMessageStore.go @@ -1,18 +1,18 @@ -package heuristics +package handlers import ( . "openreplay/backend/pkg/messages" ) -type readyMessageStore struct { +type ReadyMessageStore struct { store []Message } -func (s *readyMessageStore) append(msg Message) { +func (s *ReadyMessageStore) Append(msg Message) { s.store = append(s.store, msg) } -func (s *readyMessageStore) IterateReadyMessages(cb func(msg Message)) { +func (s *ReadyMessageStore) IterateReadyMessages(cb func(msg Message)) { for _, msg := range s.store { cb(msg) } diff --git a/backend/internal/builder/clikRageDetector.go b/backend/internal/handlers/web/clickRage.go similarity index 85% rename from backend/internal/builder/clikRageDetector.go rename to backend/internal/handlers/web/clickRage.go index 1140027b3..db22a9667 100644 --- a/backend/internal/builder/clikRageDetector.go +++ b/backend/internal/handlers/web/clickRage.go @@ -1,4 +1,4 @@ -package builder +package web import ( "encoding/json" @@ -6,10 +6,12 @@ import ( . "openreplay/backend/pkg/messages" ) +// TODO: Description of click rage detector + const MAX_TIME_DIFF = 300 const MIN_CLICKS_IN_A_ROW = 3 -type clickRageDetector struct { +type ClickRageDetector struct { lastTimestamp uint64 lastLabel string firstInARawTimestamp uint64 @@ -17,7 +19,7 @@ type clickRageDetector struct { countsInARow int } -func (crd *clickRageDetector) reset() { +func (crd *ClickRageDetector) reset() { crd.lastTimestamp = 0 crd.lastLabel = "" crd.firstInARawTimestamp = 0 @@ -25,7 +27,7 @@ func (crd *clickRageDetector) reset() { crd.countsInARow = 0 } -func (crd *clickRageDetector) Build() Message { +func (crd *ClickRageDetector) Build() Message { if crd.countsInARow >= MIN_CLICKS_IN_A_ROW { payload, _ := json.Marshal(struct{ Count int }{crd.countsInARow}) i := &IssueEvent{ @@ -42,7 +44,7 @@ func (crd *clickRageDetector) Build() Message { return nil } -func (crd *clickRageDetector) Handle(message Message, messageID uint64, timestamp uint64) Message { +func (crd *ClickRageDetector) Handle(message Message, messageID uint64, timestamp uint64) Message { switch msg := message.(type) { case *MouseClick: // TODO: check if we it is ok to capture clickrages without the connected CleckEvent in db. diff --git a/backend/internal/builder/cpuIssueFinder.go b/backend/internal/handlers/web/cpuIssue.go similarity index 86% rename from backend/internal/builder/cpuIssueFinder.go rename to backend/internal/handlers/web/cpuIssue.go index feb694a86..5cc12be68 100644 --- a/backend/internal/builder/cpuIssueFinder.go +++ b/backend/internal/handlers/web/cpuIssue.go @@ -1,4 +1,4 @@ -package builder +package web import ( "encoding/json" @@ -7,10 +7,12 @@ import ( "openreplay/backend/pkg/messages/performance" ) +// TODO: Description of cpu issue detector + const CPU_THRESHOLD = 70 // % out of 100 const CPU_MIN_DURATION_TRIGGER = 6 * 1000 -type cpuIssueFinder struct { +type CpuIssueDetector struct { startTimestamp uint64 startMessageID uint64 lastTimestamp uint64 @@ -18,7 +20,7 @@ type cpuIssueFinder struct { contextString string } -func (f *cpuIssueFinder) Build() Message { +func (f *CpuIssueDetector) Build() Message { if f.startTimestamp == 0 { return nil } @@ -47,7 +49,7 @@ func (f *cpuIssueFinder) Build() Message { } } -func (f *cpuIssueFinder) Handle(message Message, messageID uint64, timestamp uint64) Message { +func (f *CpuIssueDetector) Handle(message Message, messageID uint64, timestamp uint64) Message { switch msg := message.(type) { case *PerformanceTrack: dt := performance.TimeDiff(timestamp, f.lastTimestamp) diff --git a/backend/internal/builder/deadClickDetector.go b/backend/internal/handlers/web/deadClick.go similarity index 82% rename from backend/internal/builder/deadClickDetector.go rename to backend/internal/handlers/web/deadClick.go index f83c0bedd..a04da9be9 100644 --- a/backend/internal/builder/deadClickDetector.go +++ b/backend/internal/handlers/web/deadClick.go @@ -1,12 +1,14 @@ -package builder +package web import ( . "openreplay/backend/pkg/messages" ) +// TODO: Description of dead click detector + const CLICK_RELATION_TIME = 1400 -type deadClickDetector struct { +type DeadClickDetector struct { lastTimestamp uint64 lastMouseClick *MouseClick lastClickTimestamp uint64 @@ -14,14 +16,14 @@ type deadClickDetector struct { inputIDSet map[uint64]bool } -func (d *deadClickDetector) reset() { +func (d *DeadClickDetector) reset() { d.inputIDSet = nil d.lastMouseClick = nil d.lastClickTimestamp = 0 d.lastMessageID = 0 } -func (d *deadClickDetector) handleReaction(timestamp uint64) Message { +func (d *DeadClickDetector) handleReaction(timestamp uint64) Message { if d.lastMouseClick == nil || d.lastClickTimestamp+CLICK_RELATION_TIME > timestamp { // riaction is instant d.reset() return nil @@ -36,11 +38,11 @@ func (d *deadClickDetector) handleReaction(timestamp uint64) Message { return i } -func (d *deadClickDetector) Build() Message { +func (d *DeadClickDetector) Build() Message { return d.handleReaction(d.lastTimestamp) } -func (d *deadClickDetector) Handle(message Message, messageID uint64, timestamp uint64) Message { +func (d *DeadClickDetector) Handle(message Message, messageID uint64, timestamp uint64) Message { d.lastTimestamp = timestamp switch msg := message.(type) { case *SetInputTarget: diff --git a/backend/internal/builder/domDropDetector.go b/backend/internal/handlers/web/domDrop.go similarity index 94% rename from backend/internal/builder/domDropDetector.go rename to backend/internal/handlers/web/domDrop.go index 473937a9d..c89fab2c4 100644 --- a/backend/internal/builder/domDropDetector.go +++ b/backend/internal/handlers/web/domDrop.go @@ -1,9 +1,11 @@ -package builder +package web import ( . "openreplay/backend/pkg/messages" ) +// TODO: Description of dom drop detector + const DROP_WINDOW = 200 //ms const CRITICAL_COUNT = 1 // Our login page contains 20. But on crush it removes only roots (1-3 nodes). // TODO: smart detection (making whole DOM tree would eat all memory) diff --git a/backend/internal/builder/memoryIssueFinder.go b/backend/internal/handlers/web/memoryIssue.go similarity index 83% rename from backend/internal/builder/memoryIssueFinder.go rename to backend/internal/handlers/web/memoryIssue.go index 2f04343bc..ac8ca8a14 100644 --- a/backend/internal/builder/memoryIssueFinder.go +++ b/backend/internal/handlers/web/memoryIssue.go @@ -1,4 +1,4 @@ -package builder +package web import ( "encoding/json" @@ -7,10 +7,12 @@ import ( . "openreplay/backend/pkg/messages" ) +// TODO: Description of memory issue detector + const MIN_COUNT = 3 const MEM_RATE_THRESHOLD = 300 // % to average -type memoryIssueFinder struct { +type MemoryIssueDetector struct { startMessageID uint64 startTimestamp uint64 rate int @@ -19,7 +21,7 @@ type memoryIssueFinder struct { contextString string } -func (f *memoryIssueFinder) Build() Message { +func (f *MemoryIssueDetector) Build() Message { if f.startTimestamp == 0 { return nil } @@ -37,7 +39,7 @@ func (f *memoryIssueFinder) Build() Message { return i } -func (f *memoryIssueFinder) Handle(message Message, messageID uint64, timestamp uint64) Message { +func (f *MemoryIssueDetector) Handle(message Message, messageID uint64, timestamp uint64) Message { switch msg := message.(type) { case *PerformanceTrack: if f.count < MIN_COUNT { diff --git a/backend/internal/builder/performanceTrackAggrBuilder.go b/backend/internal/handlers/web/performanceAggregator.go similarity index 89% rename from backend/internal/builder/performanceTrackAggrBuilder.go rename to backend/internal/handlers/web/performanceAggregator.go index 4396e8a05..a7bf79f9f 100644 --- a/backend/internal/builder/performanceTrackAggrBuilder.go +++ b/backend/internal/handlers/web/performanceAggregator.go @@ -1,4 +1,4 @@ -package builder +package web import ( "math" @@ -9,7 +9,7 @@ import ( const AGGREGATION_WINDOW = 2 * 60 * 1000 -type performanceTrackAggrBuilder struct { +type PerformanceAggregator struct { *PerformanceTrackAggr lastTimestamp uint64 count float64 @@ -19,14 +19,14 @@ type performanceTrackAggrBuilder struct { sumUsedJSHeapSize float64 } -func (b *performanceTrackAggrBuilder) start(timestamp uint64) { +func (b *PerformanceAggregator) start(timestamp uint64) { b.PerformanceTrackAggr = &PerformanceTrackAggr{ TimestampStart: timestamp, } b.lastTimestamp = timestamp } -func (b *performanceTrackAggrBuilder) reset() { +func (b *PerformanceAggregator) reset() { b.PerformanceTrackAggr = nil b.count = 0 b.sumFrameRate = 0 @@ -36,7 +36,7 @@ func (b *performanceTrackAggrBuilder) reset() { b.lastTimestamp = 0 } -func (b *performanceTrackAggrBuilder) Handle(message Message, _ uint64, timestamp uint64) Message { +func (b *PerformanceAggregator) Handle(message Message, _ uint64, timestamp uint64) Message { switch msg := message.(type) { case *PerformanceTrack: if b.PerformanceTrackAggr == nil || msg.Frames == -1 || msg.Ticks == -1 { @@ -93,7 +93,7 @@ func (b *performanceTrackAggrBuilder) Handle(message Message, _ uint64, timestam return nil } -func (b *performanceTrackAggrBuilder) Build() Message { +func (b *PerformanceAggregator) Build() Message { if b.PerformanceTrackAggr == nil { return nil } diff --git a/backend/internal/heuristics/session.go b/backend/internal/heuristics/session.go index a49db948b..3c7951750 100644 --- a/backend/internal/heuristics/session.go +++ b/backend/internal/heuristics/session.go @@ -16,11 +16,7 @@ type sessHandler struct { func newSessHandler() *sessHandler { return &sessHandler{ - handlers: []Handler{ - new(clickrage), - new(performanceAggregator), - new(anr), - }, + handlers: []Handler{}, } } From 5b627c17ecfde97e831927a860d2a70f5cf89314 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Mon, 9 May 2022 19:02:07 +0200 Subject: [PATCH 092/260] feat(ui) - audit - daterange with new component --- .../AuditDetailModal/AuditDetailModal.tsx | 43 ++++++++++++- .../Client/Audit/AuditList/AuditList.tsx | 9 ++- .../AuditSearchField/AuditSearchField.tsx | 2 +- .../Client/Audit/AuditView/AuditView.tsx | 40 ++++++++---- .../app/components/shared/Select/Select.tsx | 5 +- .../SelectDateRange/SelectDateRange.tsx | 63 ++++++++++++++++--- frontend/app/mstore/auditStore.ts | 38 ++++++++++- frontend/app/mstore/types/audit.ts | 8 ++- frontend/app/svg/icons/grid-3x3.svg | 3 + frontend/app/types/app/period.js | 4 ++ frontend/app/utils.js | 53 ++++++++++++++++ 11 files changed, 240 insertions(+), 28 deletions(-) create mode 100644 frontend/app/svg/icons/grid-3x3.svg diff --git a/frontend/app/components/Client/Audit/AuditDetailModal/AuditDetailModal.tsx b/frontend/app/components/Client/Audit/AuditDetailModal/AuditDetailModal.tsx index b7c257e3e..934604dbb 100644 --- a/frontend/app/components/Client/Audit/AuditDetailModal/AuditDetailModal.tsx +++ b/frontend/app/components/Client/Audit/AuditDetailModal/AuditDetailModal.tsx @@ -1,11 +1,50 @@ import React from 'react'; +import { JSONTree } from 'UI'; +import { checkForRecent } from 'App/date'; + +interface Props { + audit: any; +} +function AuditDetailModal(props: Props) { + const { audit } = props; + // const jsonResponse = typeof audit.payload === 'string' ? JSON.parse(audit.payload) : audit.payload; + // console.log('jsonResponse', jsonResponse) -function AuditDetailModal(props) { return ( -
    +

    Audit Details

    +
    { 'URL'}
    +
    { audit.endPoint }
    +
    +
    +
    Username
    +
    {audit.username}
    +
    +
    +
    Created At
    +
    {audit.createdAt && checkForRecent(audit.createdAt, 'LLL dd, yyyy, hh:mm a')}
    +
    +
    + +
    +
    +
    Action
    +
    {audit.action}
    +
    +
    +
    Method
    +
    {audit.method}
    +
    +
    + + { audit.payload && ( +
    +
    Payload
    + +
    + )}
    ); diff --git a/frontend/app/components/Client/Audit/AuditList/AuditList.tsx b/frontend/app/components/Client/Audit/AuditList/AuditList.tsx index 549b25b6d..5ab4c0d3a 100644 --- a/frontend/app/components/Client/Audit/AuditList/AuditList.tsx +++ b/frontend/app/components/Client/Audit/AuditList/AuditList.tsx @@ -16,16 +16,21 @@ function AuditList(props: Props) { const searchQuery = useObserver(() => auditStore.searchQuery); const page = useObserver(() => auditStore.page); const order = useObserver(() => auditStore.order); + const period = useObserver(() => auditStore.period); const { showModal } = useModal(); + console.log('AuditList', period.toTimestamps()); useEffect(() => { + const { startTimestamp, endTimestamp } = period.toTimestamps(); auditStore.fetchAudits({ page: auditStore.page, limit: auditStore.pageSize, query: auditStore.searchQuery, order: auditStore.order, + startDate: startTimestamp, + endDate: endTimestamp, }); - }, [page, searchQuery, order]); + }, [page, searchQuery, order, period]); return useObserver(() => ( @@ -40,7 +45,7 @@ function AuditList(props: Props) {
    showModal(, { right: true })} + onShowDetails={() => showModal(, { right: true })} />
    ))} diff --git a/frontend/app/components/Client/Audit/AuditSearchField/AuditSearchField.tsx b/frontend/app/components/Client/Audit/AuditSearchField/AuditSearchField.tsx index 8c0d32d5b..5574da847 100644 --- a/frontend/app/components/Client/Audit/AuditSearchField/AuditSearchField.tsx +++ b/frontend/app/components/Client/Audit/AuditSearchField/AuditSearchField.tsx @@ -18,7 +18,7 @@ function AuditSearchField(props: Props) { } return ( -
    +
    auditStore.order); + const total = useObserver(() => auditStore.total); + + const exportToCsv = () => { + auditStore.exportToCsv(); + } + + const onChange = (data) => { + auditStore.setDateRange(data); + } return useObserver(() => (
    - -
    -
    - {/* */} + + Audit Trail + {total}
    -
    + } /> +
    +
    + +
    +
    onChange(value)} + components={{ SingleValue: ({ children, ...props} : any) => { + return ( + + {period.rangeName === CUSTOM_RANGE ? period.rangeFormatted() : children} + + ) + } }} + period={period} /> + { + isCustom && + setIsCustom(false)} + > +
    + setIsCustom(false) } + selectedDateRange={ period.range } + /> +
    +
    + }
    ); } -export default SelectDateRange; \ No newline at end of file +export default SelectDateRange; + + \ No newline at end of file diff --git a/frontend/app/mstore/auditStore.ts b/frontend/app/mstore/auditStore.ts index b3df0aa6d..de7bd4433 100644 --- a/frontend/app/mstore/auditStore.ts +++ b/frontend/app/mstore/auditStore.ts @@ -2,6 +2,8 @@ import { makeAutoObservable, runInAction, observable, action, reaction } from "m import { auditService } from "App/services" import Audit from './types/audit' import Period, { LAST_7_DAYS } from 'Types/app/period'; +import { toast } from 'react-toastify'; +import { exportCSVFile } from 'App/utils'; export default class AuditStore { list: any[] = []; @@ -11,18 +13,20 @@ export default class AuditStore { searchQuery: string = ''; isLoading: boolean = false; order: string = 'desc'; - period: Period = Period({ rangeName: LAST_7_DAYS }) + period: Period|null = Period({ rangeName: LAST_7_DAYS }) constructor() { makeAutoObservable(this, { searchQuery: observable, + period: observable, updateKey: action, fetchAudits: action, + setDateRange: action, }) } setDateRange(data: any) { - this.period = new Period(data); + this['period'] = data; } updateKey(key: string, value: any) { @@ -45,4 +49,34 @@ export default class AuditStore { }) }) } + + fetchAllAudits = async (data: any): Promise => { + return new Promise((resolve, reject) => { + auditService.all(data).then((data) => { + const headers = [ + { label: 'User', key: 'username' }, + { label: 'Email', key: 'email' }, + { label: 'UserID', key: 'userId' }, + { label: 'Method', key: 'method' }, + { label: 'Action', key: 'action' }, + { label: 'Endpoint', key: 'endpoint' }, + // { label: 'Status', key: 'status' }, + { label: 'Created At', key: 'createdAt' }, + ] + // console.log('data', data) + exportCSVFile(headers, data.sessions, `audit-${new Date().toLocaleDateString()}.csv`); + resolve(data) + }).catch(error => { + reject(error) + }) + }) + } + + exportToCsv = async (): Promise => { + const promise = this.fetchAllAudits({ limit: this.total }) + toast.promise(promise, { + pending: 'Exporting...', + success: 'Export successful', + }) + } } \ No newline at end of file diff --git a/frontend/app/mstore/types/audit.ts b/frontend/app/mstore/types/audit.ts index 104ff447e..dd8f7c095 100644 --- a/frontend/app/mstore/types/audit.ts +++ b/frontend/app/mstore/types/audit.ts @@ -4,12 +4,14 @@ import { unserscoreToSpaceAndCapitalize } from 'App/utils'; export default class Audit { id: string = ''; username: string = ''; + email: string = ''; action: string = ''; createdAt: any = null; endPoint: string = ''; parameters: any = {}; method: string = ''; status: string = ''; + payload: any = {} constructor() { } @@ -20,10 +22,12 @@ export default class Audit { audit.username = json.username; audit.action = unserscoreToSpaceAndCapitalize(json.action); audit.createdAt = json.createdAt && DateTime.fromMillis(json.createdAt || 0); - audit.endPoint = json.endPoint; + audit.endPoint = json.endpoint; audit.parameters = json.parameters; audit.method = json.method; - audit.status = json.status; + audit.status = json.status + audit.email = json.email + audit.payload = typeof json.payload === 'string' ? JSON.parse(json.payload) : json.payload return audit; } diff --git a/frontend/app/svg/icons/grid-3x3.svg b/frontend/app/svg/icons/grid-3x3.svg new file mode 100644 index 000000000..c40d98c96 --- /dev/null +++ b/frontend/app/svg/icons/grid-3x3.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/frontend/app/types/app/period.js b/frontend/app/types/app/period.js index deebf9cad..b4f8798c5 100644 --- a/frontend/app/types/app/period.js +++ b/frontend/app/types/app/period.js @@ -103,6 +103,10 @@ export default Record({ endTimestamp: this.end, }; }, + rangeFormatted(format = 'MMM Do YY, hh:mm A') { + console.log('period', this) + return this.range.start.format(format) + ' - ' + this.range.end.format(format); + }, toTimestampstwo() { return { startTimestamp: this.start / 1000, diff --git a/frontend/app/utils.js b/frontend/app/utils.js index 571c18561..be25b585e 100644 --- a/frontend/app/utils.js +++ b/frontend/app/utils.js @@ -270,4 +270,57 @@ export const unserscoreToSpaceAndCapitalize = (str) => { return str.replace(/_/g, ' ').replace(/\w\S*/g, (txt) => { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); }); +} + +export const convertToCSV = (headers, objArray) => { + var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray; + var str = ''; + const headersMap = headers.reduce((acc, curr) => { + acc[curr.key] = curr; + return acc; + }, {}); + console.log('headersMap', headersMap) + + // csv header line + // comma seprated header line from array + str += headers.map(h => h.label).join(',') + '\r\n'; + + for (var i = 0; i < array.length; i++) { + var line = ''; + for (var index in headersMap) { + if (line !== '') line += ','; + line += array[i][index]; + } + str += line + '\r\n'; + } + + + return str; +} + +export const exportCSVFile = (headers, items, fileTitle) => { + // if (headers) { + // items.unshift(headers); + // } + + var jsonObject = JSON.stringify(items); + var csv = convertToCSV(headers, jsonObject); + var exportedFilenmae = fileTitle + '.csv' || 'export.csv'; + + var blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }); + if (navigator.msSaveBlob) { // IE 10+ + navigator.msSaveBlob(blob, exportedFilenmae); + } else { + var link = document.createElement("a"); + if (link.download !== undefined) { // feature detection + // Browsers that support HTML5 download attribute + var url = URL.createObjectURL(blob); + link.setAttribute("href", url); + link.setAttribute("download", exportedFilenmae); + link.style.visibility = 'hidden'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + } } \ No newline at end of file From eae31eac373940562ca4c5c954ba02087440d094 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Mon, 9 May 2022 19:34:59 +0200 Subject: [PATCH 093/260] feat(ui) - audit - date --- frontend/app/mstore/auditStore.ts | 10 +++++++--- frontend/app/utils.js | 10 +--------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/frontend/app/mstore/auditStore.ts b/frontend/app/mstore/auditStore.ts index de7bd4433..efc34d65d 100644 --- a/frontend/app/mstore/auditStore.ts +++ b/frontend/app/mstore/auditStore.ts @@ -4,6 +4,8 @@ import Audit from './types/audit' import Period, { LAST_7_DAYS } from 'Types/app/period'; import { toast } from 'react-toastify'; import { exportCSVFile } from 'App/utils'; +import { formatDateTimeDefault } from 'App/date'; +import { DateTime, Duration } from 'luxon'; // TODO export default class AuditStore { list: any[] = []; @@ -60,11 +62,13 @@ export default class AuditStore { { label: 'Method', key: 'method' }, { label: 'Action', key: 'action' }, { label: 'Endpoint', key: 'endpoint' }, - // { label: 'Status', key: 'status' }, { label: 'Created At', key: 'createdAt' }, ] - // console.log('data', data) - exportCSVFile(headers, data.sessions, `audit-${new Date().toLocaleDateString()}.csv`); + data = data.sessions.map(item => ({ + ...item, + createdAt: DateTime.fromMillis(item.createdAt).toFormat('LLL dd yyyy hh:mm a') + })) + exportCSVFile(headers, data, `audit-${new Date().toLocaleDateString()}`); resolve(data) }).catch(error => { reject(error) diff --git a/frontend/app/utils.js b/frontend/app/utils.js index be25b585e..029e24599 100644 --- a/frontend/app/utils.js +++ b/frontend/app/utils.js @@ -279,10 +279,7 @@ export const convertToCSV = (headers, objArray) => { acc[curr.key] = curr; return acc; }, {}); - console.log('headersMap', headersMap) - // csv header line - // comma seprated header line from array str += headers.map(h => h.label).join(',') + '\r\n'; for (var i = 0; i < array.length; i++) { @@ -299,10 +296,6 @@ export const convertToCSV = (headers, objArray) => { } export const exportCSVFile = (headers, items, fileTitle) => { - // if (headers) { - // items.unshift(headers); - // } - var jsonObject = JSON.stringify(items); var csv = convertToCSV(headers, jsonObject); var exportedFilenmae = fileTitle + '.csv' || 'export.csv'; @@ -312,8 +305,7 @@ export const exportCSVFile = (headers, items, fileTitle) => { navigator.msSaveBlob(blob, exportedFilenmae); } else { var link = document.createElement("a"); - if (link.download !== undefined) { // feature detection - // Browsers that support HTML5 download attribute + if (link.download !== undefined) { var url = URL.createObjectURL(blob); link.setAttribute("href", url); link.setAttribute("download", exportedFilenmae); From 47007eb9d776db1b1fa0a9d635ead42d9ba7560a Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Tue, 10 May 2022 14:11:41 +0200 Subject: [PATCH 094/260] feat(backend/db): prepared db service for refactoring --- backend/cmd/db/main.go | 31 +- backend/cmd/heuristics/main.go | 1 + backend/internal/builder/builder.go | 8 + backend/internal/builder/builderMap.go | 11 + backend/internal/config/db/config.go | 2 + .../custom}/inputEventBuilder.go | 19 +- .../internal/handlers/custom/mainHandler.go | 288 ++++++++++++++++++ .../custom}/pageEventBuilder.go | 22 +- backend/internal/heuristics/heuristics.go | 36 --- backend/internal/heuristics/session.go | 43 --- 10 files changed, 368 insertions(+), 93 deletions(-) rename backend/internal/{heuristics => handlers/custom}/inputEventBuilder.go (80%) create mode 100644 backend/internal/handlers/custom/mainHandler.go rename backend/internal/{heuristics => handlers/custom}/pageEventBuilder.go (83%) delete mode 100644 backend/internal/heuristics/heuristics.go delete mode 100644 backend/internal/heuristics/session.go diff --git a/backend/cmd/db/main.go b/backend/cmd/db/main.go index f6cd481a7..564fcbab5 100644 --- a/backend/cmd/db/main.go +++ b/backend/cmd/db/main.go @@ -2,9 +2,12 @@ package main import ( "log" + "openreplay/backend/internal/builder" "openreplay/backend/internal/config/db" "openreplay/backend/internal/datasaver" - "openreplay/backend/internal/heuristics" + "openreplay/backend/internal/handlers" + "openreplay/backend/internal/handlers/custom" + "openreplay/backend/pkg/intervals" "time" "os" @@ -28,8 +31,17 @@ func main() { pg := cache.NewPGCache(postgres.NewConn(cfg.Postgres), cfg.ProjectExpirationTimeoutMs) defer pg.Close() + // Declare message handlers we want to apply for each incoming message + msgHandlers := []handlers.MessageProcessor{ + custom.NewMainHandler(), + custom.NewInputEventBuilder(), + custom.NewPageEventBuilder(), + } + + // Create handler's aggregator + builderMap := builder.NewBuilderMap(msgHandlers...) + // Init modules - heurFinder := heuristics.NewHandler() saver := datasaver.New(pg) statsLogger := logger.NewQueueStats(cfg.LoggerTimeout) @@ -42,6 +54,7 @@ func main() { if !postgres.IsPkeyViolation(err) { log.Printf("Message Insertion Error %v, SessionID: %v, Message: %v", err, sessionID, msg) } + // TODO: can we lose data here because of db error? return } @@ -60,10 +73,10 @@ func main() { } // Handle heuristics and save to temporary queue in memory - heurFinder.HandleMessage(sessionID, msg) + builderMap.HandleMessage(sessionID, msg, msg.Meta().Index) // Process saved heuristics messages as usual messages above in the code - heurFinder.IterateSessionReadyMessages(sessionID, func(msg messages.Message) { + builderMap.IterateSessionReadyMessages(sessionID, func(msg messages.Message) { // TODO: DRY code (carefully with the return statement logic) if err := saver.InsertMessage(sessionID, msg); err != nil { if !postgres.IsPkeyViolation(err) { @@ -82,8 +95,9 @@ func main() { consumer := queue.NewMessageConsumer( cfg.GroupDB, []string{ + cfg.TopicRawWeb, // TODO: is it necessary or not? cfg.TopicRawIOS, - cfg.TopicTrigger, + cfg.TopicTrigger, // to receive SessionEnd events }, handler, false, @@ -94,19 +108,22 @@ func main() { sigchan := make(chan os.Signal, 1) signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM) - tick := time.Tick(cfg.CommitBatchTimeout) + commitTick := time.Tick(cfg.CommitBatchTimeout) + checkTick := time.Tick(intervals.EVENTS_COMMIT_INTERVAL * time.Millisecond) for { select { case sig := <-sigchan: log.Printf("Caught signal %v: terminating\n", sig) consumer.Close() os.Exit(0) - case <-tick: + case <-commitTick: pg.CommitBatches() // TODO?: separate stats & regular messages if err := consumer.Commit(); err != nil { log.Printf("Error on consumer commit: %v", err) } + case <-checkTick: + // checkTimeout default: err := consumer.ConsumeNext() if err != nil { diff --git a/backend/cmd/heuristics/main.go b/backend/cmd/heuristics/main.go index f5e3b675f..ddfd29095 100644 --- a/backend/cmd/heuristics/main.go +++ b/backend/cmd/heuristics/main.go @@ -54,6 +54,7 @@ func main() { []string{ cfg.TopicRawWeb, cfg.TopicRawIOS, + cfg.TopicTrigger, // to receive SessionEnd events }, func(sessionID uint64, msg messages.Message, meta *types.Meta) { statsLogger.Collect(sessionID, meta) diff --git a/backend/internal/builder/builder.go b/backend/internal/builder/builder.go index c35457d62..a00ad194a 100644 --- a/backend/internal/builder/builder.go +++ b/backend/internal/builder/builder.go @@ -10,6 +10,7 @@ type builder struct { readyMsgs []Message timestamp uint64 processors []handlers.MessageProcessor + ended bool } func NewBuilder(handlers ...handlers.MessageProcessor) *builder { @@ -35,6 +36,13 @@ func (b *builder) handleMessage(message Message, messageID uint64) { return } + if _, isEnd := message.(*IOSSessionEnd); isEnd { + b.ended = true + } + if _, isEnd := message.(*SessionEnd); isEnd { + b.ended = true + } + for _, p := range b.processors { /* If nil is not returned explicitely by Handle, but as the typed nil ("var i *IssueEvent; return i;") diff --git a/backend/internal/builder/builderMap.go b/backend/internal/builder/builderMap.go index 5bc01e78d..6b2c22bec 100644 --- a/backend/internal/builder/builderMap.go +++ b/backend/internal/builder/builderMap.go @@ -42,3 +42,14 @@ func (m *builderMap) IterateReadyMessages(operatingTs int64, iter func(sessionID } } } + +func (m *builderMap) IterateSessionReadyMessages(sessionID uint64, iter func(msg Message)) { + session, ok := m.sessions[sessionID] + if !ok { + return + } + session.iterateReadyMessage(iter) + if session.ended { + delete(m.sessions, sessionID) + } +} diff --git a/backend/internal/config/db/config.go b/backend/internal/config/db/config.go index fb35a199c..e074399dc 100644 --- a/backend/internal/config/db/config.go +++ b/backend/internal/config/db/config.go @@ -10,6 +10,7 @@ type Config struct { ProjectExpirationTimeoutMs int64 LoggerTimeout int GroupDB string + TopicRawWeb string TopicRawIOS string TopicTrigger string CommitBatchTimeout time.Duration @@ -21,6 +22,7 @@ func New() *Config { ProjectExpirationTimeoutMs: 1000 * 60 * 20, LoggerTimeout: env.Int("LOG_QUEUE_STATS_INTERVAL_SEC"), GroupDB: env.String("GROUP_DB"), + TopicRawWeb: env.String("TOPIC_RAW_WEB"), TopicRawIOS: env.String("TOPIC_RAW_IOS"), TopicTrigger: env.String("TOPIC_TRIGGER"), CommitBatchTimeout: 15 * time.Second, diff --git a/backend/internal/heuristics/inputEventBuilder.go b/backend/internal/handlers/custom/inputEventBuilder.go similarity index 80% rename from backend/internal/heuristics/inputEventBuilder.go rename to backend/internal/handlers/custom/inputEventBuilder.go index 624e15e47..770e714af 100644 --- a/backend/internal/heuristics/inputEventBuilder.go +++ b/backend/internal/handlers/custom/inputEventBuilder.go @@ -1,4 +1,4 @@ -package heuristics +package custom import ( . "openreplay/backend/pkg/messages" @@ -12,6 +12,17 @@ type inputEventBuilder struct { inputID uint64 } +func (b *inputEventBuilder) Handle(message Message, messageID uint64, timestamp uint64) Message { + //TODO implement me + panic("implement me") +} + +func (b *inputEventBuilder) Build() Message { + // b.build() + //TODO implement me + panic("implement me") +} + func NewInputEventBuilder() *inputEventBuilder { ieBuilder := &inputEventBuilder{} ieBuilder.ClearLabels() @@ -25,7 +36,7 @@ func (b *inputEventBuilder) ClearLabels() { func (b *inputEventBuilder) HandleSetInputTarget(msg *SetInputTarget) *InputEvent { var inputEvent *InputEvent if b.inputID != msg.ID { - inputEvent = b.Build() + inputEvent = b.build() b.inputID = msg.ID } b.inputLabels[msg.ID] = msg.Label @@ -35,7 +46,7 @@ func (b *inputEventBuilder) HandleSetInputTarget(msg *SetInputTarget) *InputEven func (b *inputEventBuilder) HandleSetInputValue(msg *SetInputValue, messageID uint64, timestamp uint64) *InputEvent { var inputEvent *InputEvent if b.inputID != msg.ID { - inputEvent = b.Build() + inputEvent = b.build() b.inputID = msg.ID } if b.inputEvent == nil { @@ -63,7 +74,7 @@ func (b *inputEventBuilder) GetTimestamp() uint64 { return b.inputEvent.Timestamp } -func (b *inputEventBuilder) Build() *InputEvent { +func (b *inputEventBuilder) build() *InputEvent { if b.inputEvent == nil { return nil } diff --git a/backend/internal/handlers/custom/mainHandler.go b/backend/internal/handlers/custom/mainHandler.go new file mode 100644 index 000000000..7e653c250 --- /dev/null +++ b/backend/internal/handlers/custom/mainHandler.go @@ -0,0 +1,288 @@ +package custom + +import ( + "net/url" + "openreplay/backend/pkg/intervals" + "strings" + "time" + + . "openreplay/backend/pkg/messages" +) + +func getURLExtention(URL string) string { + u, err := url.Parse(URL) + if err != nil { + return "" + } + i := strings.LastIndex(u.Path, ".") + return u.Path[i+1:] +} + +func getResourceType(initiator string, URL string) string { + switch initiator { + case "xmlhttprequest", "fetch": + return "fetch" + case "img": + return "img" + default: + switch getURLExtention(URL) { + case "css": + return "stylesheet" + case "js": + return "script" + case "png", "gif", "jpg", "jpeg", "svg": + return "img" + case "mp4", "mkv", "ogg", "webm", "avi", "mp3": + return "media" + default: + return "other" + } + } +} + +type builder struct { + readyMsgs []Message + timestamp uint64 + lastProcessedTimestamp int64 + peBuilder *pageEventBuilder + ieBuilder *inputEventBuilder + integrationsWaiting bool + sid uint64 +} + +func (b *builder) Build() Message { + //TODO implement me + panic("implement me") +} + +func NewMainHandler() *builder { + return &builder{ + peBuilder: &pageEventBuilder{}, + ieBuilder: NewInputEventBuilder(), + integrationsWaiting: true, + } +} + +func (b *builder) appendReadyMessage(msg Message) { // interface is never nil even if it holds nil value + b.readyMsgs = append(b.readyMsgs, msg) +} + +func (b *builder) iterateReadyMessage(iter func(msg Message)) { + for _, readyMsg := range b.readyMsgs { + iter(readyMsg) + } + b.readyMsgs = nil +} + +func (b *builder) buildPageEvent() { + if msg := b.peBuilder.Build(); msg != nil { + b.appendReadyMessage(msg) + } +} + +func (b *builder) buildInputEvent() { + if msg := b.ieBuilder.Build(); msg != nil { + b.appendReadyMessage(msg) + } +} + +func (b *builder) Handle(message Message, messageID uint64, timestamp uint64) Message { + b.timestamp = timestamp + b.lastProcessedTimestamp = time.Now().UnixMilli() + + // Might happen before the first timestamp. + switch msg := message.(type) { + case *SessionStart, + *Metadata, + *UserID, + *UserAnonymousID: + b.appendReadyMessage(msg) + case *RawErrorEvent: + b.appendReadyMessage(&ErrorEvent{ + MessageID: messageID, + Timestamp: msg.Timestamp, + Source: msg.Source, + Name: msg.Name, + Message: msg.Message, + Payload: msg.Payload, + }) + } + if b.timestamp == 0 { + return nil + } + switch msg := message.(type) { + case *SetPageLocation: + if msg.NavigationStart == 0 { + b.appendReadyMessage(&PageEvent{ + URL: msg.URL, + Referrer: msg.Referrer, + Loaded: false, + MessageID: messageID, + Timestamp: b.timestamp, + }) + } else { + b.buildPageEvent() + b.buildInputEvent() + b.ieBuilder.ClearLabels() + b.peBuilder.HandleSetPageLocation(msg, messageID, b.timestamp) + // TODO: what to do with this code? + //b.miFinder.HandleSetPageLocation(msg) + //b.ciFinder.HandleSetPageLocation(msg) + } + case *PageLoadTiming: + if rm := b.peBuilder.HandlePageLoadTiming(msg); rm != nil { + b.appendReadyMessage(rm) + } + case *PageRenderTiming: + if rm := b.peBuilder.HandlePageRenderTiming(msg); rm != nil { + b.appendReadyMessage(rm) + } + case *PerformanceTrack: + // TODO: what to do with this code? + //if rm := b.ptaBuilder.HandlePerformanceTrack(msg, b.timestamp); rm != nil { + // b.appendReadyMessage(rm) + //} + //if rm := b.ciFinder.HandlePerformanceTrack(msg, messageID, b.timestamp); rm != nil { + // b.appendReadyMessage(rm) + //} + //if rm := b.miFinder.HandlePerformanceTrack(msg, messageID, b.timestamp); rm != nil { + // b.appendReadyMessage(rm) + //} + case *SetInputTarget: + if rm := b.ieBuilder.HandleSetInputTarget(msg); rm != nil { + b.appendReadyMessage(rm) + } + case *SetInputValue: + if rm := b.ieBuilder.HandleSetInputValue(msg, messageID, b.timestamp); rm != nil { + b.appendReadyMessage(rm) + } + case *MouseClick: + b.buildInputEvent() + // TODO: what to do with this code? + //if rm := b.crDetector.HandleMouseClick(msg, messageID, b.timestamp); rm != nil { + // b.appendReadyMessage(rm) + //} + if msg.Label != "" { + b.appendReadyMessage(&ClickEvent{ + MessageID: messageID, + Label: msg.Label, + HesitationTime: msg.HesitationTime, + Timestamp: b.timestamp, + Selector: msg.Selector, + }) + } + case *JSException: + b.appendReadyMessage(&ErrorEvent{ + MessageID: messageID, + Timestamp: b.timestamp, + Source: "js_exception", + Name: msg.Name, + Message: msg.Message, + Payload: msg.Payload, + }) + case *ResourceTiming: + tp := getResourceType(msg.Initiator, msg.URL) + success := msg.Duration != 0 + b.appendReadyMessage(&ResourceEvent{ + MessageID: messageID, + Timestamp: msg.Timestamp, + Duration: msg.Duration, + TTFB: msg.TTFB, + HeaderSize: msg.HeaderSize, + EncodedBodySize: msg.EncodedBodySize, + DecodedBodySize: msg.DecodedBodySize, + URL: msg.URL, + Type: tp, + Success: success, + }) + if !success { + issueType := "missing_resource" + if tp == "fetch" { + issueType = "bad_request" + } + b.appendReadyMessage(&IssueEvent{ + Type: issueType, + MessageID: messageID, + Timestamp: msg.Timestamp, + ContextString: msg.URL, + }) + } + case *RawCustomEvent: + b.appendReadyMessage(&CustomEvent{ + MessageID: messageID, + Timestamp: b.timestamp, + Name: msg.Name, + Payload: msg.Payload, + }) + case *CustomIssue: + b.appendReadyMessage(&IssueEvent{ + Type: "custom", + Timestamp: b.timestamp, + MessageID: messageID, + ContextString: msg.Name, + Payload: msg.Payload, + }) + case *Fetch: + b.appendReadyMessage(&FetchEvent{ + MessageID: messageID, + Timestamp: msg.Timestamp, + Method: msg.Method, + URL: msg.URL, + Request: msg.Request, + Response: msg.Response, + Status: msg.Status, + Duration: msg.Duration, + }) + if msg.Status >= 400 { + b.appendReadyMessage(&IssueEvent{ + Type: "bad_request", + MessageID: messageID, + Timestamp: msg.Timestamp, + ContextString: msg.URL, + }) + } + case *GraphQL: + b.appendReadyMessage(&GraphQLEvent{ + MessageID: messageID, + Timestamp: b.timestamp, + OperationKind: msg.OperationKind, + OperationName: msg.OperationName, + Variables: msg.Variables, + Response: msg.Response, + }) + case *StateAction: + b.appendReadyMessage(&StateActionEvent{ + MessageID: messageID, + Timestamp: b.timestamp, + Type: msg.Type, + }) + // TODO: what to do with this code? + //case *CreateElementNode, *CreateTextNode: + // b.ddDetector.HandleNodeCreation() + //case *RemoveNode: + // b.ddDetector.HandleNodeRemoval(b.timestamp) + //case *CreateDocument: + // if rm := b.ddDetector.Build(); rm != nil { + // b.appendReadyMessage(rm) + // } + } + // TODO: what to do with this code? + //if rm := b.dcDetector.HandleMessage(message, messageID, b.timestamp); rm != nil { + // b.appendReadyMessage(rm) + //} + return nil +} + +func (b *builder) checkTimeouts(ts int64) bool { + if b.timestamp == 0 { + return false // There was no timestamp events yet + } + + if b.peBuilder.HasInstance() && int64(b.peBuilder.GetTimestamp())+intervals.EVENTS_PAGE_EVENT_TIMEOUT < ts { + b.buildPageEvent() + } + if b.ieBuilder.HasInstance() && int64(b.ieBuilder.GetTimestamp())+intervals.EVENTS_INPUT_EVENT_TIMEOUT < ts { + b.buildInputEvent() + } + return false +} diff --git a/backend/internal/heuristics/pageEventBuilder.go b/backend/internal/handlers/custom/pageEventBuilder.go similarity index 83% rename from backend/internal/heuristics/pageEventBuilder.go rename to backend/internal/handlers/custom/pageEventBuilder.go index 96a1b287e..765fd31a2 100644 --- a/backend/internal/heuristics/pageEventBuilder.go +++ b/backend/internal/handlers/custom/pageEventBuilder.go @@ -1,4 +1,4 @@ -package heuristics +package custom import ( . "openreplay/backend/pkg/messages" @@ -9,9 +9,25 @@ type pageEventBuilder struct { firstTimingHandled bool } +func (b *pageEventBuilder) Handle(message Message, messageID uint64, timestamp uint64) Message { + //TODO implement me + panic("implement me") +} + +func (b *pageEventBuilder) Build() Message { + // b.build() + //TODO implement me + panic("implement me") +} + +func NewPageEventBuilder() *pageEventBuilder { + ieBuilder := &pageEventBuilder{} + return ieBuilder +} + func (b *pageEventBuilder) buildIfTimingsComplete() *PageEvent { if b.firstTimingHandled { - return b.Build() + return b.build() } b.firstTimingHandled = true return nil @@ -83,7 +99,7 @@ func (b *pageEventBuilder) GetTimestamp() uint64 { return b.pageEvent.Timestamp } -func (b *pageEventBuilder) Build() *PageEvent { +func (b *pageEventBuilder) build() *PageEvent { pageEvent := b.pageEvent b.pageEvent = nil b.firstTimingHandled = false diff --git a/backend/internal/heuristics/heuristics.go b/backend/internal/heuristics/heuristics.go deleted file mode 100644 index c55ad33b3..000000000 --- a/backend/internal/heuristics/heuristics.go +++ /dev/null @@ -1,36 +0,0 @@ -package heuristics - -import ( - . "openreplay/backend/pkg/messages" -) - -type mainHandler map[uint64]*sessHandler - -func NewHandler() mainHandler { - return make(mainHandler) -} - -func (m mainHandler) getSessHandler(sessionID uint64) *sessHandler { - s := m[sessionID] - if s == nil { - s = newSessHandler() - m[sessionID] = s - } - return s -} - -func (m mainHandler) HandleMessage(sessionID uint64, msg Message) { - s := m.getSessHandler(sessionID) - s.HandleMessage(msg) -} - -func (m mainHandler) IterateSessionReadyMessages(sessionID uint64, iter func(msg Message)) { - s, ok := m[sessionID] - if !ok { - return - } - s.IterateReadyMessages(iter) - if s.IsEnded() { - delete(m, sessionID) - } -} diff --git a/backend/internal/heuristics/session.go b/backend/internal/heuristics/session.go deleted file mode 100644 index 3c7951750..000000000 --- a/backend/internal/heuristics/session.go +++ /dev/null @@ -1,43 +0,0 @@ -package heuristics - -import ( - . "openreplay/backend/pkg/messages" -) - -type Handler interface { - HandleMessage(Message) - IterateReadyMessages(func(Message)) -} - -type sessHandler struct { - handlers []Handler - ended bool -} - -func newSessHandler() *sessHandler { - return &sessHandler{ - handlers: []Handler{}, - } -} - -func (s *sessHandler) HandleMessage(msg Message) { - for _, h := range s.handlers { - h.HandleMessage(msg) - } - if _, isEnd := msg.(*IOSSessionEnd); isEnd { - s.ended = true - } - if _, isEnd := msg.(*SessionEnd); isEnd { - s.ended = true - } -} - -func (s *sessHandler) IterateReadyMessages(cb func(msg Message)) { - for _, h := range s.handlers { - h.IterateReadyMessages(cb) - } -} - -func (s *sessHandler) IsEnded() bool { - return s.ended -} From 26e23d594f31079e8c991768407ee67c88240aca Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Tue, 10 May 2022 15:40:55 +0200 Subject: [PATCH 095/260] feat(backend/handlers): refactored web and ios message handlers --- .../internal/handlers/ios/appNotResponding.go | 40 +++++++++++-------- backend/internal/handlers/ios/clickRage.go | 34 ++++++++-------- .../handlers/ios/performanceAggregator.go | 32 +++++++++------ backend/internal/handlers/web/clickRage.go | 27 ++++++++----- backend/internal/handlers/web/cpuIssue.go | 14 ++++++- backend/internal/handlers/web/deadClick.go | 38 ++++++++++++------ backend/internal/handlers/web/domDrop.go | 11 +++-- backend/internal/handlers/web/memoryIssue.go | 27 +++++++++---- .../handlers/web/performanceAggregator.go | 6 +++ backend/pkg/messages/messages.go | 2 +- 10 files changed, 148 insertions(+), 83 deletions(-) diff --git a/backend/internal/handlers/ios/appNotResponding.go b/backend/internal/handlers/ios/appNotResponding.go index 1241648db..097361c00 100644 --- a/backend/internal/handlers/ios/appNotResponding.go +++ b/backend/internal/handlers/ios/appNotResponding.go @@ -3,9 +3,17 @@ package ios import ( "openreplay/backend/internal/handlers" . "openreplay/backend/pkg/messages" + "time" ) -// app is not responding detector +/* + Handler name: AppNotResponding + Input events: IOSClickEvent, + IOSInputEvent, + IOSPerformanceEvent, + IOSSessionEnd + Output event: IOSIssueEvent +*/ const MIN_TIME_AFTER_LAST_HEARTBEAT = 60 * 1000 @@ -17,46 +25,44 @@ type AppNotResponding struct { } func (h *AppNotResponding) Handle(message Message, messageID uint64, timestamp uint64) Message { + var event Message = nil switch m := message.(type) { case *IOSClickEvent: - h.buildIf(m.Timestamp) + event = h.build(m.Timestamp) h.lastLabel = m.Label h.lastHeartbeatTimestamp = m.Timestamp h.lastHeartbeatIndex = m.Index case *IOSInputEvent: - h.buildIf(m.Timestamp) + event = h.build(m.Timestamp) h.lastLabel = m.Label h.lastHeartbeatTimestamp = m.Timestamp h.lastHeartbeatIndex = m.Index case *IOSPerformanceEvent: - h.buildIf(m.Timestamp) + event = h.build(m.Timestamp) h.lastHeartbeatTimestamp = m.Timestamp h.lastHeartbeatIndex = m.Index case *IOSSessionEnd: - h.buildIf(m.Timestamp) + event = h.build(m.Timestamp) } - return nil + return event } func (h *AppNotResponding) Build() Message { - //TODO implement me - panic("implement me") + return h.build(uint64(time.Now().Unix())) } -func (h *AppNotResponding) buildIf(timestamp uint64) { +func (h *AppNotResponding) build(timestamp uint64) Message { if h.lastHeartbeatTimestamp != 0 && h.lastHeartbeatTimestamp+MIN_TIME_AFTER_LAST_HEARTBEAT <= timestamp { - m := &IOSIssueEvent{ + event := &IOSIssueEvent{ Type: "anr", ContextString: h.lastLabel, + Timestamp: h.lastHeartbeatTimestamp, } - m.Timestamp = h.lastHeartbeatTimestamp - m.Index = h.lastHeartbeatIndex // Associated Index/ MessageID ? - h.Append(m) + event.Index = h.lastHeartbeatIndex // Associated Index/ MessageID ? + // Reset h.lastHeartbeatTimestamp = 0 h.lastHeartbeatIndex = 0 + return event } -} - -func (h *AppNotResponding) HandleMessage(msg Message) { - // TODO: delete it + return nil } diff --git a/backend/internal/handlers/ios/clickRage.go b/backend/internal/handlers/ios/clickRage.go index 2707c04d5..6562e05c1 100644 --- a/backend/internal/handlers/ios/clickRage.go +++ b/backend/internal/handlers/ios/clickRage.go @@ -6,9 +6,14 @@ import ( . "openreplay/backend/pkg/messages" ) -const CLICK_TIME_DIFF = 200 +/* + Handler name: ClickRage + Input events: IOSClickEvent, + IOSSessionEnd + Output event: IOSIssueEvent +*/ -//const MIN_CLICKS_IN_A_ROW = 3 +const CLICK_TIME_DIFF = 200 type ClickRageDetector struct { handlers.ReadyMessageStore @@ -20,6 +25,7 @@ type ClickRageDetector struct { } func (h *ClickRageDetector) Handle(message Message, messageID uint64, timestamp uint64) Message { + var event Message = nil switch m := message.(type) { case *IOSClickEvent: if h.lastTimestamp+CLICK_TIME_DIFF < m.Timestamp && h.lastLabel == m.Label { @@ -27,7 +33,7 @@ func (h *ClickRageDetector) Handle(message Message, messageID uint64, timestamp h.countsInARow += 1 return nil } - h.build() + event = h.Build() if m.Label != "" { h.lastTimestamp = m.Timestamp h.lastLabel = m.Label @@ -36,33 +42,25 @@ func (h *ClickRageDetector) Handle(message Message, messageID uint64, timestamp h.countsInARow = 1 } case *IOSSessionEnd: - h.build() + event = h.Build() } - return nil + return event } func (h *ClickRageDetector) Build() Message { - //TODO implement me - panic("implement me") -} - -func (h *ClickRageDetector) build() { if h.countsInARow >= web.MIN_CLICKS_IN_A_ROW { - m := &IOSIssueEvent{ + event := &IOSIssueEvent{ Type: "click_rage", ContextString: h.lastLabel, } - m.Timestamp = h.firstInARawTimestamp - m.Index = h.firstInARawSeqIndex // Associated Index/ MessageID ? - h.Append(m) + event.Timestamp = h.firstInARawTimestamp + event.Index = h.firstInARawSeqIndex // Associated Index/ MessageID ? + return event } h.lastTimestamp = 0 h.lastLabel = "" h.firstInARawTimestamp = 0 h.firstInARawSeqIndex = 0 h.countsInARow = 0 -} - -func (h *ClickRageDetector) HandleMessage(msg Message) { - // TODO: delete it + return nil } diff --git a/backend/internal/handlers/ios/performanceAggregator.go b/backend/internal/handlers/ios/performanceAggregator.go index 1525127b8..b4bc812c7 100644 --- a/backend/internal/handlers/ios/performanceAggregator.go +++ b/backend/internal/handlers/ios/performanceAggregator.go @@ -3,8 +3,16 @@ package ios import ( "openreplay/backend/internal/handlers" . "openreplay/backend/pkg/messages" + "time" ) +/* + Handler name: PerformanceAggregator + Input events: IOSPerformanceEvent, + IOSSessionEnd + Output event: IssueEvent +*/ + const AGGR_TIME = 15 * 60 * 1000 type valueAggregator struct { @@ -32,13 +40,14 @@ func (h *PerformanceAggregator) Handle(message Message, messageID uint64, timest if h.pa == nil { h.pa = &IOSPerformanceAggregated{} // TODO: struct type in messages } - switch m := message.(type) { // TODO: All Timestampe messages + var event Message = nil + switch m := message.(type) { // TODO: All Timestamp messages case *IOSPerformanceEvent: if h.pa.TimestampStart == 0 { h.pa.TimestampStart = m.Timestamp } if h.pa.TimestampStart+AGGR_TIME <= m.Timestamp { - h.build(m.Timestamp) + event = h.build(m.Timestamp) } switch m.Name { case "fps": @@ -79,35 +88,32 @@ func (h *PerformanceAggregator) Handle(message Message, messageID uint64, timest } } case *IOSSessionEnd: - h.build(m.Timestamp) + event = h.build(m.Timestamp) } - return nil + return event } func (h *PerformanceAggregator) Build() Message { - //TODO implement me - panic("implement me") + return h.build(uint64(time.Now().Unix())) } -func (h *PerformanceAggregator) build(timestamp uint64) { +func (h *PerformanceAggregator) build(timestamp uint64) Message { if h.pa == nil { - return + return nil } + h.pa.TimestampEnd = timestamp h.pa.AvgFPS = h.fps.aggregate() h.pa.AvgCPU = h.cpu.aggregate() h.pa.AvgMemory = h.memory.aggregate() h.pa.AvgBattery = h.battery.aggregate() - h.Append(h.pa) + event := h.pa h.pa = &IOSPerformanceAggregated{} for _, agg := range []valueAggregator{h.fps, h.cpu, h.memory, h.battery} { agg.sum = 0 agg.count = 0 } -} - -func (h *PerformanceAggregator) HandleMessage(msg Message) { - // TODO: delete it + return event } diff --git a/backend/internal/handlers/web/clickRage.go b/backend/internal/handlers/web/clickRage.go index db22a9667..e22eb6454 100644 --- a/backend/internal/handlers/web/clickRage.go +++ b/backend/internal/handlers/web/clickRage.go @@ -2,11 +2,16 @@ package web import ( "encoding/json" + "log" . "openreplay/backend/pkg/messages" ) -// TODO: Description of click rage detector +/* + Handler name: ClickRage + Input event: MouseClick + Output event: IssueEvent +*/ const MAX_TIME_DIFF = 300 const MIN_CLICKS_IN_A_ROW = 3 @@ -28,26 +33,28 @@ func (crd *ClickRageDetector) reset() { } func (crd *ClickRageDetector) Build() Message { + defer crd.reset() if crd.countsInARow >= MIN_CLICKS_IN_A_ROW { - payload, _ := json.Marshal(struct{ Count int }{crd.countsInARow}) - i := &IssueEvent{ + payload, err := json.Marshal(struct{ Count int }{crd.countsInARow}) + if err != nil { + log.Printf("can't marshal ClickRage payload to json: %s", err) + } + event := &IssueEvent{ Type: "click_rage", ContextString: crd.lastLabel, - Payload: string(payload), // TODO: json message field type + Payload: string(payload), Timestamp: crd.firstInARawTimestamp, MessageID: crd.firstInARawMessageId, } - crd.reset() - return i + return event } - crd.reset() return nil } func (crd *ClickRageDetector) Handle(message Message, messageID uint64, timestamp uint64) Message { switch msg := message.(type) { case *MouseClick: - // TODO: check if we it is ok to capture clickrages without the connected CleckEvent in db. + // TODO: check if we it is ok to capture clickRage event without the connected ClickEvent in db. if msg.Label == "" { return crd.Build() } @@ -56,13 +63,13 @@ func (crd *ClickRageDetector) Handle(message Message, messageID uint64, timestam crd.countsInARow += 1 return nil } - i := crd.Build() + event := crd.Build() crd.lastTimestamp = timestamp crd.lastLabel = msg.Label crd.firstInARawTimestamp = timestamp crd.firstInARawMessageId = messageID crd.countsInARow = 1 - return i + return event } return nil } diff --git a/backend/internal/handlers/web/cpuIssue.go b/backend/internal/handlers/web/cpuIssue.go index 5cc12be68..56f483e8b 100644 --- a/backend/internal/handlers/web/cpuIssue.go +++ b/backend/internal/handlers/web/cpuIssue.go @@ -2,12 +2,18 @@ package web import ( "encoding/json" + "log" . "openreplay/backend/pkg/messages" "openreplay/backend/pkg/messages/performance" ) -// TODO: Description of cpu issue detector +/* + Handler name: CpuIssue + Input events: PerformanceTrack, + SetPageLocation + Output event: IssueEvent +*/ const CPU_THRESHOLD = 70 // % out of 100 const CPU_MIN_DURATION_TRIGGER = 6 * 1000 @@ -36,10 +42,14 @@ func (f *CpuIssueDetector) Build() Message { return nil } - payload, _ := json.Marshal(struct { + payload, err := json.Marshal(struct { Duration uint64 Rate uint64 }{duration, maxRate}) + if err != nil { + log.Printf("can't marshal CpuIssue payload to json: %s", err) + } + return &IssueEvent{ Type: "cpu", Timestamp: timestamp, diff --git a/backend/internal/handlers/web/deadClick.go b/backend/internal/handlers/web/deadClick.go index a04da9be9..6377b074e 100644 --- a/backend/internal/handlers/web/deadClick.go +++ b/backend/internal/handlers/web/deadClick.go @@ -4,7 +4,22 @@ import ( . "openreplay/backend/pkg/messages" ) -// TODO: Description of dead click detector +/* + Handler name: DeadClick + Input events: SetInputTarget, + CreateDocument, + MouseClick, + SetNodeAttribute, + RemoveNodeAttribute, + CreateElementNode, + CreateTextNode, + MoveNode, + RemoveNode, + SetCSSData, + CSSInsertRule, + CSSDeleteRule + Output event: IssueEvent +*/ const CLICK_RELATION_TIME = 1400 @@ -23,23 +38,22 @@ func (d *DeadClickDetector) reset() { d.lastMessageID = 0 } -func (d *DeadClickDetector) handleReaction(timestamp uint64) Message { - if d.lastMouseClick == nil || d.lastClickTimestamp+CLICK_RELATION_TIME > timestamp { // riaction is instant - d.reset() +func (d *DeadClickDetector) build(timestamp uint64) Message { + defer d.reset() + if d.lastMouseClick == nil || d.lastClickTimestamp+CLICK_RELATION_TIME > timestamp { // reaction is instant return nil } - i := &IssueEvent{ + event := &IssueEvent{ Type: "dead_click", ContextString: d.lastMouseClick.Label, Timestamp: d.lastClickTimestamp, MessageID: d.lastMessageID, } - d.reset() - return i + return event } func (d *DeadClickDetector) Build() Message { - return d.handleReaction(d.lastTimestamp) + return d.build(d.lastTimestamp) } func (d *DeadClickDetector) Handle(message Message, messageID uint64, timestamp uint64) Message { @@ -56,14 +70,14 @@ func (d *DeadClickDetector) Handle(message Message, messageID uint64, timestamp if msg.Label == "" { return nil } - i := d.handleReaction(timestamp) + event := d.build(timestamp) if d.inputIDSet[msg.ID] { // ignore if input - return i + return event } d.lastMouseClick = msg d.lastClickTimestamp = timestamp d.lastMessageID = messageID - return i + return event case *SetNodeAttribute, *RemoveNodeAttribute, *CreateElementNode, @@ -73,7 +87,7 @@ func (d *DeadClickDetector) Handle(message Message, messageID uint64, timestamp *SetCSSData, *CSSInsertRule, *CSSDeleteRule: - return d.handleReaction(timestamp) + return d.build(timestamp) } return nil } diff --git a/backend/internal/handlers/web/domDrop.go b/backend/internal/handlers/web/domDrop.go index c89fab2c4..4a3ec2065 100644 --- a/backend/internal/handlers/web/domDrop.go +++ b/backend/internal/handlers/web/domDrop.go @@ -4,7 +4,13 @@ import ( . "openreplay/backend/pkg/messages" ) -// TODO: Description of dom drop detector +/* + Handler name: DomDrop + Input events: CreateElementNode, + CreateTextNode, + RemoveNode + Output event: DOMDrop +*/ const DROP_WINDOW = 200 //ms const CRITICAL_COUNT = 1 // Our login page contains 20. But on crush it removes only roots (1-3 nodes). @@ -38,13 +44,12 @@ func (dd *domDropDetector) Handle(message Message, _ uint64, timestamp uint64) M } func (dd *domDropDetector) Build() Message { + defer dd.reset() if dd.removedCount >= CRITICAL_COUNT { domDrop := &DOMDrop{ Timestamp: dd.lastDropTimestamp, } - dd.reset() return domDrop } - dd.reset() return nil } diff --git a/backend/internal/handlers/web/memoryIssue.go b/backend/internal/handlers/web/memoryIssue.go index ac8ca8a14..487c396a9 100644 --- a/backend/internal/handlers/web/memoryIssue.go +++ b/backend/internal/handlers/web/memoryIssue.go @@ -2,12 +2,18 @@ package web import ( "encoding/json" + "log" "math" . "openreplay/backend/pkg/messages" ) -// TODO: Description of memory issue detector +/* + Handler name: MemoryIssue + Input events: PerformanceTrack, + SetPageLocation + Output event: IssueEvent +*/ const MIN_COUNT = 3 const MEM_RATE_THRESHOLD = 300 // % to average @@ -21,22 +27,29 @@ type MemoryIssueDetector struct { contextString string } +func (f *MemoryIssueDetector) reset() { + f.startTimestamp = 0 + f.startMessageID = 0 + f.rate = 0 +} + func (f *MemoryIssueDetector) Build() Message { if f.startTimestamp == 0 { return nil } - payload, _ := json.Marshal(struct{ Rate int }{f.rate - 100}) - i := &IssueEvent{ + payload, err := json.Marshal(struct{ Rate int }{f.rate - 100}) + if err != nil { + log.Printf("can't marshal MemoryIssue payload to json: %s", err) + } + event := &IssueEvent{ Type: "memory", Timestamp: f.startTimestamp, MessageID: f.startMessageID, ContextString: f.contextString, Payload: string(payload), } - f.startTimestamp = 0 - f.startMessageID = 0 - f.rate = 0 - return i + f.reset() + return event } func (f *MemoryIssueDetector) Handle(message Message, messageID uint64, timestamp uint64) Message { diff --git a/backend/internal/handlers/web/performanceAggregator.go b/backend/internal/handlers/web/performanceAggregator.go index a7bf79f9f..928cedeb9 100644 --- a/backend/internal/handlers/web/performanceAggregator.go +++ b/backend/internal/handlers/web/performanceAggregator.go @@ -7,6 +7,12 @@ import ( "openreplay/backend/pkg/messages/performance" ) +/* + Handler name: PerformanceAggregator + Input event: PerformanceTrack + Output event: PerformanceTrackAggr +*/ + const AGGREGATION_WINDOW = 2 * 60 * 1000 type PerformanceAggregator struct { diff --git a/backend/pkg/messages/messages.go b/backend/pkg/messages/messages.go index e9aec5788..418c47342 100644 --- a/backend/pkg/messages/messages.go +++ b/backend/pkg/messages/messages.go @@ -1168,7 +1168,7 @@ type IssueEvent struct { Type string ContextString string Context string - Payload string + Payload string // TODO: check, maybe it's better to use empty interface here } func (msg *IssueEvent) Encode() []byte { From ea2d13dac6a93b6e57454ad379237f641afecf90 Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Wed, 11 May 2022 16:27:01 +0200 Subject: [PATCH 096/260] chore(backend-sink): sink in cmd --- backend/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/build.sh b/backend/build.sh index 84af1a919..a4d95341a 100755 --- a/backend/build.sh +++ b/backend/build.sh @@ -23,7 +23,7 @@ function build_service() { image="$1" echo "BUILDING $image" case "$image" in - http | db) + http | db | sink) echo build http docker build -t ${DOCKER_REPO:-'local'}/$image:${git_sha1} --platform linux/amd64 --build-arg SERVICE_NAME=$image -f ./cmd/Dockerfile . [[ $PUSH_IMAGE -eq 1 ]] && { From a241830e719dced02f29d0cef6ca0ed22a8bcf53 Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Wed, 11 May 2022 16:32:27 +0200 Subject: [PATCH 097/260] refactor(backend-sink/http): move URLrewriter to sink --- backend/cmd/http/main.go | 7 ++++--- backend/cmd/sink/main.go | 11 ++++++++++- backend/internal/assetscache/assets.go | 6 +++--- backend/internal/config/config.go | 6 ------ backend/internal/config/sink/config.go | 26 +++++++++++++++---------- backend/internal/router/handlers-web.go | 15 +++++--------- backend/internal/services/services.go | 5 ----- 7 files changed, 38 insertions(+), 38 deletions(-) diff --git a/backend/cmd/http/main.go b/backend/cmd/http/main.go index 541baab62..3fdd8d34a 100644 --- a/backend/cmd/http/main.go +++ b/backend/cmd/http/main.go @@ -2,6 +2,10 @@ package main import ( "log" + "os" + "os/signal" + "syscall" + "openreplay/backend/internal/config" "openreplay/backend/internal/router" "openreplay/backend/internal/server" @@ -10,9 +14,6 @@ import ( "openreplay/backend/pkg/db/postgres" "openreplay/backend/pkg/pprof" "openreplay/backend/pkg/queue" - "os" - "os/signal" - "syscall" ) func main() { diff --git a/backend/cmd/sink/main.go b/backend/cmd/sink/main.go index fcab40321..25969146c 100644 --- a/backend/cmd/sink/main.go +++ b/backend/cmd/sink/main.go @@ -9,11 +9,13 @@ import ( "os/signal" "syscall" + "openreplay/backend/internal/assetscache" "openreplay/backend/internal/config/sink" "openreplay/backend/internal/oswriter" . "openreplay/backend/pkg/messages" "openreplay/backend/pkg/queue" "openreplay/backend/pkg/queue/types" + "openreplay/backend/pkg/url/assets" ) func main() { @@ -27,6 +29,11 @@ func main() { writer := oswriter.NewWriter(cfg.FsUlimit, cfg.FsDir) + producer := queue.NewProducer() + defer producer.Close(15000) + rewriter := assets.NewRewriter(cfg.AssetsOrigin) + assetMessageHandler := assetscache.New(cfg, rewriter, producer) + count := 0 consumer := queue.NewMessageConsumer( @@ -36,12 +43,14 @@ func main() { cfg.TopicRawWeb, }, func(sessionID uint64, message Message, _ *types.Meta) { + count++ + typeID := message.TypeID() if !IsReplayerType(typeID) { return } - count++ + message = assetMessageHandler.ParseAssets(sessionID, message) value := message.Encode() var data []byte diff --git a/backend/internal/assetscache/assets.go b/backend/internal/assetscache/assets.go index 1ef70b56c..cf76bed8c 100644 --- a/backend/internal/assetscache/assets.go +++ b/backend/internal/assetscache/assets.go @@ -1,19 +1,19 @@ package assetscache import ( - "openreplay/backend/internal/config" + "openreplay/backend/internal/config/sink" "openreplay/backend/pkg/messages" "openreplay/backend/pkg/queue/types" "openreplay/backend/pkg/url/assets" ) type AssetsCache struct { - cfg *config.Config + cfg *sink.Config rewriter *assets.Rewriter producer types.Producer } -func New(cfg *config.Config, rewriter *assets.Rewriter, producer types.Producer) *AssetsCache { +func New(cfg *sink.Config, rewriter *assets.Rewriter, producer types.Producer) *AssetsCache { return &AssetsCache{ cfg: cfg, rewriter: rewriter, diff --git a/backend/internal/config/config.go b/backend/internal/config/config.go index 5b55ba346..b98f910c2 100644 --- a/backend/internal/config/config.go +++ b/backend/internal/config/config.go @@ -11,12 +11,9 @@ type Config struct { HTTPTimeout time.Duration TopicRawWeb string TopicRawIOS string - TopicCache string - CacheAssets bool BeaconSizeLimit int64 JsonSizeLimit int64 FileSizeLimit int64 - AssetsOrigin string AWSRegion string S3BucketIOSImages string Postgres string @@ -33,12 +30,9 @@ func New() *Config { HTTPTimeout: time.Second * 60, TopicRawWeb: env.String("TOPIC_RAW_WEB"), TopicRawIOS: env.String("TOPIC_RAW_IOS"), - TopicCache: env.String("TOPIC_CACHE"), - CacheAssets: env.Bool("CACHE_ASSETS"), BeaconSizeLimit: int64(env.Uint64("BEACON_SIZE_LIMIT")), JsonSizeLimit: 1e3, // 1Kb FileSizeLimit: 1e7, // 10Mb - AssetsOrigin: env.String("ASSETS_ORIGIN"), AWSRegion: env.String("AWS_REGION"), S3BucketIOSImages: env.String("S3_BUCKET_IOS_IMAGES"), Postgres: env.String("POSTGRES_STRING"), diff --git a/backend/internal/config/sink/config.go b/backend/internal/config/sink/config.go index 4837e86e3..be939df95 100644 --- a/backend/internal/config/sink/config.go +++ b/backend/internal/config/sink/config.go @@ -5,19 +5,25 @@ import ( ) type Config struct { - FsDir string - FsUlimit uint16 - GroupSink string - TopicRawWeb string - TopicRawIOS string + FsDir string + FsUlimit uint16 + GroupSink string + TopicRawWeb string + TopicRawIOS string + TopicCache string + CacheAssets bool + AssetsOrigin string } func New() *Config { return &Config{ - FsDir: env.String("FS_DIR"), - FsUlimit: env.Uint16("FS_ULIMIT"), - GroupSink: env.String("GROUP_SINK"), - TopicRawWeb: env.String("TOPIC_RAW_WEB"), - TopicRawIOS: env.String("TOPIC_RAW_IOS"), + FsDir: env.String("FS_DIR"), + FsUlimit: env.Uint16("FS_ULIMIT"), + GroupSink: env.String("GROUP_SINK"), + TopicRawWeb: env.String("TOPIC_RAW_WEB"), + TopicRawIOS: env.String("TOPIC_RAW_IOS"), + TopicCache: env.String("TOPIC_CACHE"), + CacheAssets: env.Bool("CACHE_ASSETS"), + AssetsOrigin: env.String("ASSETS_ORIGIN"), } } diff --git a/backend/internal/router/handlers-web.go b/backend/internal/router/handlers-web.go index fc7c6421d..798348bdf 100644 --- a/backend/internal/router/handlers-web.go +++ b/backend/internal/router/handlers-web.go @@ -1,9 +1,9 @@ package router import ( - "bytes" "encoding/json" "errors" + "io/ioutil" "log" "math/rand" "net/http" @@ -117,20 +117,15 @@ func (e *Router) pushMessagesHandlerWeb(w http.ResponseWriter, r *http.Request) body := http.MaxBytesReader(w, r.Body, e.cfg.BeaconSizeLimit) defer body.Close() - var handledMessages bytes.Buffer - - // Process each message in request data - err = ReadBatchReader(body, func(msg Message) { - msg = e.services.Assets.ParseAssets(sessionData.ID, msg) - handledMessages.Write(msg.Encode()) - }) + bytes, err := ioutil.ReadAll(body) if err != nil { - ResponseWithError(w, http.StatusForbidden, err) + ResponseWithError(w, http.StatusInternalServerError, err) // TODO: Split environments; send error here only on staging return } // Send processed messages to queue as array of bytes - err = e.services.Producer.Produce(e.cfg.TopicRawWeb, sessionData.ID, handledMessages.Bytes()) + // TODO: check bytes for nonsense crap + err = e.services.Producer.Produce(e.cfg.TopicRawWeb, sessionData.ID, bytes) if err != nil { log.Printf("can't send processed messages to queue: %s", err) } diff --git a/backend/internal/services/services.go b/backend/internal/services/services.go index 5b84e1dfb..c9915c78e 100644 --- a/backend/internal/services/services.go +++ b/backend/internal/services/services.go @@ -1,7 +1,6 @@ package services import ( - "openreplay/backend/internal/assetscache" "openreplay/backend/internal/config" "openreplay/backend/internal/geoip" "openreplay/backend/internal/uaparser" @@ -10,13 +9,11 @@ import ( "openreplay/backend/pkg/queue/types" "openreplay/backend/pkg/storage" "openreplay/backend/pkg/token" - "openreplay/backend/pkg/url/assets" ) type ServicesBuilder struct { Database *cache.PGCache Producer types.Producer - Assets *assetscache.AssetsCache Flaker *flakeid.Flaker UaParser *uaparser.UAParser GeoIP *geoip.GeoIP @@ -25,11 +22,9 @@ type ServicesBuilder struct { } func New(cfg *config.Config, producer types.Producer, pgconn *cache.PGCache) *ServicesBuilder { - rewriter := assets.NewRewriter(cfg.AssetsOrigin) return &ServicesBuilder{ Database: pgconn, Producer: producer, - Assets: assetscache.New(cfg, rewriter, producer), Storage: storage.NewS3(cfg.AWSRegion, cfg.S3BucketIOSImages), Tokenizer: token.NewTokenizer(cfg.TokenSecret), UaParser: uaparser.NewUAParser(cfg.UAParserFile), From 645652058791f3913a6ba907236ed40b2b3d5624 Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Wed, 11 May 2022 16:36:31 +0200 Subject: [PATCH 098/260] style(backend-http): use UnixMilli --- backend/internal/router/handlers-web.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/internal/router/handlers-web.go b/backend/internal/router/handlers-web.go index fc7c6421d..b73a6d534 100644 --- a/backend/internal/router/handlers-web.go +++ b/backend/internal/router/handlers-web.go @@ -64,14 +64,14 @@ func (e *Router) startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) ResponseWithError(w, http.StatusForbidden, errors.New("browser not recognized")) return } - sessionID, err := e.services.Flaker.Compose(uint64(startTime.UnixNano() / 1e6)) + sessionID, err := e.services.Flaker.Compose(uint64(startTime.UnixMilli())) if err != nil { ResponseWithError(w, http.StatusInternalServerError, err) return } // TODO: if EXPIRED => send message for two sessions association expTime := startTime.Add(time.Duration(p.MaxSessionDuration) * time.Millisecond) - tokenData = &token.TokenData{ID: sessionID, ExpTime: expTime.UnixNano() / 1e6} + tokenData = &token.TokenData{ID: sessionID, ExpTime: expTime.UnixMilli()} e.services.Producer.Produce(e.cfg.TopicRawWeb, tokenData.ID, Encode(&SessionStart{ Timestamp: req.Timestamp, From ebc0185806462bac384dfa28ac0ae19b50336907 Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Wed, 11 May 2022 16:37:49 +0200 Subject: [PATCH 099/260] style(backend-http): split core and local imports --- backend/cmd/http/main.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/backend/cmd/http/main.go b/backend/cmd/http/main.go index 541baab62..3fdd8d34a 100644 --- a/backend/cmd/http/main.go +++ b/backend/cmd/http/main.go @@ -2,6 +2,10 @@ package main import ( "log" + "os" + "os/signal" + "syscall" + "openreplay/backend/internal/config" "openreplay/backend/internal/router" "openreplay/backend/internal/server" @@ -10,9 +14,6 @@ import ( "openreplay/backend/pkg/db/postgres" "openreplay/backend/pkg/pprof" "openreplay/backend/pkg/queue" - "os" - "os/signal" - "syscall" ) func main() { From c77966a78997ea78a9c114e81a11e07d2576d10c Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Wed, 11 May 2022 16:45:31 +0200 Subject: [PATCH 100/260] feat(backend/handlers): removed unix timestamp from header builders --- backend/cmd/db/main.go | 17 ++++--- backend/cmd/heuristics/main.go | 2 +- backend/internal/builder/builder.go | 44 +++++-------------- backend/internal/builder/builderMap.go | 12 +++-- .../internal/handlers/custom/mainHandler.go | 31 ------------- .../internal/handlers/ios/appNotResponding.go | 5 ++- .../handlers/ios/performanceAggregator.go | 15 ++++--- 7 files changed, 39 insertions(+), 87 deletions(-) diff --git a/backend/cmd/db/main.go b/backend/cmd/db/main.go index 564fcbab5..8236586c2 100644 --- a/backend/cmd/db/main.go +++ b/backend/cmd/db/main.go @@ -7,7 +7,6 @@ import ( "openreplay/backend/internal/datasaver" "openreplay/backend/internal/handlers" "openreplay/backend/internal/handlers/custom" - "openreplay/backend/pkg/intervals" "time" "os" @@ -33,9 +32,9 @@ func main() { // Declare message handlers we want to apply for each incoming message msgHandlers := []handlers.MessageProcessor{ - custom.NewMainHandler(), - custom.NewInputEventBuilder(), - custom.NewPageEventBuilder(), + custom.NewMainHandler(), // TODO: separate to several handler + //custom.NewInputEventBuilder(), + //custom.NewPageEventBuilder(), } // Create handler's aggregator @@ -54,7 +53,6 @@ func main() { if !postgres.IsPkeyViolation(err) { log.Printf("Message Insertion Error %v, SessionID: %v, Message: %v", err, sessionID, msg) } - // TODO: can we lose data here because of db error? return } @@ -95,7 +93,7 @@ func main() { consumer := queue.NewMessageConsumer( cfg.GroupDB, []string{ - cfg.TopicRawWeb, // TODO: is it necessary or not? + cfg.TopicRawWeb, cfg.TopicRawIOS, cfg.TopicTrigger, // to receive SessionEnd events }, @@ -109,7 +107,6 @@ func main() { signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM) commitTick := time.Tick(cfg.CommitBatchTimeout) - checkTick := time.Tick(intervals.EVENTS_COMMIT_INTERVAL * time.Millisecond) for { select { case sig := <-sigchan: @@ -118,12 +115,14 @@ func main() { os.Exit(0) case <-commitTick: pg.CommitBatches() + // TODO: ee commit stats !!! + //if err := commitStats(); err != nil { + // log.Printf("Error on stats commit: %v", err) + //} // TODO?: separate stats & regular messages if err := consumer.Commit(); err != nil { log.Printf("Error on consumer commit: %v", err) } - case <-checkTick: - // checkTimeout default: err := consumer.ConsumeNext() if err != nil { diff --git a/backend/cmd/heuristics/main.go b/backend/cmd/heuristics/main.go index ddfd29095..9c77cb4ba 100644 --- a/backend/cmd/heuristics/main.go +++ b/backend/cmd/heuristics/main.go @@ -78,7 +78,7 @@ func main() { consumer.Close() os.Exit(0) case <-tick: - builderMap.IterateReadyMessages(time.Now().UnixMilli(), func(sessionID uint64, readyMsg messages.Message) { + builderMap.IterateReadyMessages(func(sessionID uint64, readyMsg messages.Message) { producer.Produce(cfg.TopicTrigger, sessionID, messages.Encode(readyMsg)) }) producer.Flush(cfg.ProducerTimeout) diff --git a/backend/internal/builder/builder.go b/backend/internal/builder/builder.go index a00ad194a..4916764cd 100644 --- a/backend/internal/builder/builder.go +++ b/backend/internal/builder/builder.go @@ -2,7 +2,6 @@ package builder import ( "openreplay/backend/internal/handlers" - "openreplay/backend/pkg/intervals" . "openreplay/backend/pkg/messages" ) @@ -26,6 +25,15 @@ func (b *builder) iterateReadyMessage(iter func(msg Message)) { b.readyMsgs = nil } +func (b *builder) checkSessionEnd(message Message) { + if _, isEnd := message.(*IOSSessionEnd); isEnd { + b.ended = true + } + if _, isEnd := message.(*SessionEnd); isEnd { + b.ended = true + } +} + func (b *builder) handleMessage(message Message, messageID uint64) { timestamp := GetTimestamp(message) if b.timestamp < timestamp { @@ -36,42 +44,10 @@ func (b *builder) handleMessage(message Message, messageID uint64) { return } - if _, isEnd := message.(*IOSSessionEnd); isEnd { - b.ended = true - } - if _, isEnd := message.(*SessionEnd); isEnd { - b.ended = true - } - + b.checkSessionEnd(message) for _, p := range b.processors { - /* If nil is not returned explicitely by Handle, but as the typed nil - ("var i *IssueEvent; return i;") - The `rm != nil` will be true. - TODO: enforce nil to be nil(?) or add `isNil() bool` to the Message types - because this part is expected to be etendable by user with custom messageProcessor's. - Use of reflrction will be probably bad on millions of messages? - */ if rm := p.Handle(message, messageID, b.timestamp); rm != nil { b.readyMsgs = append(b.readyMsgs, rm) } } } - -func (b *builder) checkTimeouts(ts int64) bool { - if b.timestamp == 0 { - return false // SessionStart happened only - } - - lastTsGap := ts - int64(b.timestamp) - // Maybe listen for `trigger` and react on SessionEnd instead (less reliable) - if lastTsGap > intervals.EVENTS_SESSION_END_TIMEOUT { - for _, p := range b.processors { - // TODO: same as above - if rm := p.Build(); rm != nil { - b.readyMsgs = append(b.readyMsgs, rm) - } - } - return true - } - return false -} diff --git a/backend/internal/builder/builderMap.go b/backend/internal/builder/builderMap.go index 6b2c22bec..b393bcd28 100644 --- a/backend/internal/builder/builderMap.go +++ b/backend/internal/builder/builderMap.go @@ -31,13 +31,19 @@ func (m *builderMap) HandleMessage(sessionID uint64, msg Message, messageID uint b.handleMessage(msg, messageID) } -func (m *builderMap) IterateReadyMessages(operatingTs int64, iter func(sessionID uint64, msg Message)) { +func (m *builderMap) IterateReadyMessages(iter func(sessionID uint64, msg Message)) { for sessionID, b := range m.sessions { - sessionEnded := b.checkTimeouts(operatingTs) + if b.ended { + for _, p := range b.processors { + if rm := p.Build(); rm != nil { + b.readyMsgs = append(b.readyMsgs, rm) + } + } + } b.iterateReadyMessage(func(msg Message) { iter(sessionID, msg) }) - if sessionEnded { + if b.ended { delete(m.sessions, sessionID) } } diff --git a/backend/internal/handlers/custom/mainHandler.go b/backend/internal/handlers/custom/mainHandler.go index 7e653c250..52a6278c0 100644 --- a/backend/internal/handlers/custom/mainHandler.go +++ b/backend/internal/handlers/custom/mainHandler.go @@ -125,9 +125,6 @@ func (b *builder) Handle(message Message, messageID uint64, timestamp uint64) Me b.buildInputEvent() b.ieBuilder.ClearLabels() b.peBuilder.HandleSetPageLocation(msg, messageID, b.timestamp) - // TODO: what to do with this code? - //b.miFinder.HandleSetPageLocation(msg) - //b.ciFinder.HandleSetPageLocation(msg) } case *PageLoadTiming: if rm := b.peBuilder.HandlePageLoadTiming(msg); rm != nil { @@ -137,17 +134,6 @@ func (b *builder) Handle(message Message, messageID uint64, timestamp uint64) Me if rm := b.peBuilder.HandlePageRenderTiming(msg); rm != nil { b.appendReadyMessage(rm) } - case *PerformanceTrack: - // TODO: what to do with this code? - //if rm := b.ptaBuilder.HandlePerformanceTrack(msg, b.timestamp); rm != nil { - // b.appendReadyMessage(rm) - //} - //if rm := b.ciFinder.HandlePerformanceTrack(msg, messageID, b.timestamp); rm != nil { - // b.appendReadyMessage(rm) - //} - //if rm := b.miFinder.HandlePerformanceTrack(msg, messageID, b.timestamp); rm != nil { - // b.appendReadyMessage(rm) - //} case *SetInputTarget: if rm := b.ieBuilder.HandleSetInputTarget(msg); rm != nil { b.appendReadyMessage(rm) @@ -158,10 +144,6 @@ func (b *builder) Handle(message Message, messageID uint64, timestamp uint64) Me } case *MouseClick: b.buildInputEvent() - // TODO: what to do with this code? - //if rm := b.crDetector.HandleMouseClick(msg, messageID, b.timestamp); rm != nil { - // b.appendReadyMessage(rm) - //} if msg.Label != "" { b.appendReadyMessage(&ClickEvent{ MessageID: messageID, @@ -256,20 +238,7 @@ func (b *builder) Handle(message Message, messageID uint64, timestamp uint64) Me Timestamp: b.timestamp, Type: msg.Type, }) - // TODO: what to do with this code? - //case *CreateElementNode, *CreateTextNode: - // b.ddDetector.HandleNodeCreation() - //case *RemoveNode: - // b.ddDetector.HandleNodeRemoval(b.timestamp) - //case *CreateDocument: - // if rm := b.ddDetector.Build(); rm != nil { - // b.appendReadyMessage(rm) - // } } - // TODO: what to do with this code? - //if rm := b.dcDetector.HandleMessage(message, messageID, b.timestamp); rm != nil { - // b.appendReadyMessage(rm) - //} return nil } diff --git a/backend/internal/handlers/ios/appNotResponding.go b/backend/internal/handlers/ios/appNotResponding.go index 097361c00..b5f6cd2f0 100644 --- a/backend/internal/handlers/ios/appNotResponding.go +++ b/backend/internal/handlers/ios/appNotResponding.go @@ -3,7 +3,6 @@ package ios import ( "openreplay/backend/internal/handlers" . "openreplay/backend/pkg/messages" - "time" ) /* @@ -22,9 +21,11 @@ type AppNotResponding struct { lastLabel string lastHeartbeatTimestamp uint64 lastHeartbeatIndex uint64 + lastTimestamp uint64 } func (h *AppNotResponding) Handle(message Message, messageID uint64, timestamp uint64) Message { + h.lastTimestamp = timestamp var event Message = nil switch m := message.(type) { case *IOSClickEvent: @@ -48,7 +49,7 @@ func (h *AppNotResponding) Handle(message Message, messageID uint64, timestamp u } func (h *AppNotResponding) Build() Message { - return h.build(uint64(time.Now().Unix())) + return h.build(h.lastTimestamp) } func (h *AppNotResponding) build(timestamp uint64) Message { diff --git a/backend/internal/handlers/ios/performanceAggregator.go b/backend/internal/handlers/ios/performanceAggregator.go index b4bc812c7..2a9401748 100644 --- a/backend/internal/handlers/ios/performanceAggregator.go +++ b/backend/internal/handlers/ios/performanceAggregator.go @@ -3,7 +3,6 @@ package ios import ( "openreplay/backend/internal/handlers" . "openreplay/backend/pkg/messages" - "time" ) /* @@ -29,14 +28,16 @@ func (va *valueAggregator) aggregate() uint64 { type PerformanceAggregator struct { handlers.ReadyMessageStore - pa *IOSPerformanceAggregated - fps valueAggregator - cpu valueAggregator - memory valueAggregator - battery valueAggregator + pa *IOSPerformanceAggregated + fps valueAggregator + cpu valueAggregator + memory valueAggregator + battery valueAggregator + lastTimestamp uint64 } func (h *PerformanceAggregator) Handle(message Message, messageID uint64, timestamp uint64) Message { + h.lastTimestamp = timestamp if h.pa == nil { h.pa = &IOSPerformanceAggregated{} // TODO: struct type in messages } @@ -94,7 +95,7 @@ func (h *PerformanceAggregator) Handle(message Message, messageID uint64, timest } func (h *PerformanceAggregator) Build() Message { - return h.build(uint64(time.Now().Unix())) + return h.build(h.lastTimestamp) } func (h *PerformanceAggregator) build(timestamp uint64) Message { From 396f1a16af569b4c7dbf0e63b08bdbf7ccaabf44 Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Wed, 11 May 2022 17:36:35 +0200 Subject: [PATCH 101/260] refactor(backend-sink): producer close timeout value to config --- backend/cmd/sink/main.go | 2 +- backend/internal/config/sink/config.go | 34 ++++++++++++++------------ 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/backend/cmd/sink/main.go b/backend/cmd/sink/main.go index 25969146c..269b8fab0 100644 --- a/backend/cmd/sink/main.go +++ b/backend/cmd/sink/main.go @@ -30,7 +30,7 @@ func main() { writer := oswriter.NewWriter(cfg.FsUlimit, cfg.FsDir) producer := queue.NewProducer() - defer producer.Close(15000) + defer producer.Close(cfg.ProducerCloseTimeout) rewriter := assets.NewRewriter(cfg.AssetsOrigin) assetMessageHandler := assetscache.New(cfg, rewriter, producer) diff --git a/backend/internal/config/sink/config.go b/backend/internal/config/sink/config.go index be939df95..a78bfba63 100644 --- a/backend/internal/config/sink/config.go +++ b/backend/internal/config/sink/config.go @@ -5,25 +5,27 @@ import ( ) type Config struct { - FsDir string - FsUlimit uint16 - GroupSink string - TopicRawWeb string - TopicRawIOS string - TopicCache string - CacheAssets bool - AssetsOrigin string + FsDir string + FsUlimit uint16 + GroupSink string + TopicRawWeb string + TopicRawIOS string + TopicCache string + CacheAssets bool + AssetsOrigin string + ProducerCloseTimeout int } func New() *Config { return &Config{ - FsDir: env.String("FS_DIR"), - FsUlimit: env.Uint16("FS_ULIMIT"), - GroupSink: env.String("GROUP_SINK"), - TopicRawWeb: env.String("TOPIC_RAW_WEB"), - TopicRawIOS: env.String("TOPIC_RAW_IOS"), - TopicCache: env.String("TOPIC_CACHE"), - CacheAssets: env.Bool("CACHE_ASSETS"), - AssetsOrigin: env.String("ASSETS_ORIGIN"), + FsDir: env.String("FS_DIR"), + FsUlimit: env.Uint16("FS_ULIMIT"), + GroupSink: env.String("GROUP_SINK"), + TopicRawWeb: env.String("TOPIC_RAW_WEB"), + TopicRawIOS: env.String("TOPIC_RAW_IOS"), + TopicCache: env.String("TOPIC_CACHE"), + CacheAssets: env.Bool("CACHE_ASSETS"), + AssetsOrigin: env.String("ASSETS_ORIGIN"), + ProducerCloseTimeout: 15000, } } From 17d477fc43e20de15fd78810594f19139a556e9c Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Wed, 11 May 2022 18:27:18 +0200 Subject: [PATCH 102/260] fix+style(tracker):3.5.11 fix build & files structure --- tracker/tracker/package.json | 2 +- tracker/tracker/scripts/compile.js | 20 +++++++++---------- .../{messages/index.ts => common/messages.ts} | 4 ++-- .../src/{messages => common}/tsconfig.json | 0 tracker/tracker/src/common/types.ts | 10 ++++++++++ .../types.ts => common/webworker.ts} | 0 tracker/tracker/src/main/app/index.ts | 6 +++--- .../src/main/app/observer/iframe_observer.ts | 2 +- .../tracker/src/main/app/observer/observer.ts | 2 +- .../main/app/observer/shadow_root_observer.ts | 2 +- .../src/main/app/observer/top_observer.ts | 2 +- tracker/tracker/src/main/app/session.ts | 2 +- tracker/tracker/src/main/index.ts | 4 ++-- .../tracker/src/main/modules/connection.ts | 2 +- tracker/tracker/src/main/modules/console.ts | 2 +- tracker/tracker/src/main/modules/cssrules.ts | 2 +- tracker/tracker/src/main/modules/exception.ts | 4 ++-- tracker/tracker/src/main/modules/img.ts | 2 +- tracker/tracker/src/main/modules/input.ts | 2 +- tracker/tracker/src/main/modules/longtasks.ts | 2 +- tracker/tracker/src/main/modules/mouse.ts | 2 +- .../tracker/src/main/modules/performance.ts | 2 +- tracker/tracker/src/main/modules/scroll.ts | 2 +- tracker/tracker/src/main/modules/timing.ts | 4 ++-- tracker/tracker/src/main/modules/viewport.ts | 2 +- tracker/tracker/src/main/tsconfig.json | 2 +- tracker/tracker/src/messages/message.ts | 5 ----- tracker/tracker/src/webworker/BatchWriter.ts | 10 +++++----- .../PrimitiveWriter.ts} | 2 +- tracker/tracker/src/webworker/index.ts | 7 ++++--- tracker/tracker/src/webworker/tsconfig.json | 2 +- .../tracker/src/webworker/url-rewriter.ts.dd | 9 --------- 32 files changed, 59 insertions(+), 62 deletions(-) rename tracker/tracker/src/{messages/index.ts => common/messages.ts} (99%) rename tracker/tracker/src/{messages => common}/tsconfig.json (100%) create mode 100644 tracker/tracker/src/common/types.ts rename tracker/tracker/src/{webworker/types.ts => common/webworker.ts} (100%) delete mode 100644 tracker/tracker/src/messages/message.ts rename tracker/tracker/src/{messages/writer.ts => webworker/PrimitiveWriter.ts} (99%) delete mode 100644 tracker/tracker/src/webworker/url-rewriter.ts.dd diff --git a/tracker/tracker/package.json b/tracker/tracker/package.json index 555efe07d..22d39de12 100644 --- a/tracker/tracker/package.json +++ b/tracker/tracker/package.json @@ -1,7 +1,7 @@ { "name": "@openreplay/tracker", "description": "The OpenReplay tracker main package", - "version": "3.5.10", + "version": "3.5.11", "keywords": [ "logging", "replay" diff --git a/tracker/tracker/scripts/compile.js b/tracker/tracker/scripts/compile.js index ab0091dd5..563254016 100644 --- a/tracker/tracker/scripts/compile.js +++ b/tracker/tracker/scripts/compile.js @@ -15,31 +15,31 @@ async function main() { to: webworker.replace(/'/g, "\\'"), }); await fs.rename('build/main', 'lib'); - await fs.rename('build/messages', 'lib/messages'); + await fs.rename('build/common', 'lib/common'); await replaceInFiles({ files: 'lib/*', - from: /\.\.\/messages/g, - to: './messages', + from: /\.\.\/common/g, + to: './common', }); await replaceInFiles({ files: 'lib/**/*', - from: /\.\.\/\.\.\/messages/g, - to: '../messages', + from: /\.\.\/\.\.\/common/g, + to: '../common', }); await fs.rename('build/cjs/main', 'cjs'); - await fs.rename('build/cjs/messages', 'cjs/messages'); + await fs.rename('build/cjs/common', 'cjs/common'); await fs.writeFile('cjs/package.json', `{ "type": "commonjs" }`); await replaceInFiles({ files: 'cjs/*', - from: /\.\.\/messages/g, - to: './messages', + from: /\.\.\/common/g, + to: './common', }); await replaceInFiles({ files: 'cjs/**/*', - from: /\.\.\/\.\.\/messages/g, - to: '../messages', + from: /\.\.\/\.\.\/common/g, + to: '../common', }); } main() diff --git a/tracker/tracker/src/messages/index.ts b/tracker/tracker/src/common/messages.ts similarity index 99% rename from tracker/tracker/src/messages/index.ts rename to tracker/tracker/src/common/messages.ts index f3267bee0..140bcaac6 100644 --- a/tracker/tracker/src/messages/index.ts +++ b/tracker/tracker/src/common/messages.ts @@ -1,6 +1,6 @@ // Auto-generated, do not edit -import Message from "./message.js"; -import Writer from "./writer.js"; +import type { Writer, Message }from "./types.js"; +export default Message function bindNew( Class: C & { new(...args: A): T } diff --git a/tracker/tracker/src/messages/tsconfig.json b/tracker/tracker/src/common/tsconfig.json similarity index 100% rename from tracker/tracker/src/messages/tsconfig.json rename to tracker/tracker/src/common/tsconfig.json diff --git a/tracker/tracker/src/common/types.ts b/tracker/tracker/src/common/types.ts new file mode 100644 index 000000000..6717eb8bc --- /dev/null +++ b/tracker/tracker/src/common/types.ts @@ -0,0 +1,10 @@ +export interface Writer { + uint(n: number): boolean + int(n: number): boolean + string(s: string): boolean + boolean(b: boolean): boolean +} + +export interface Message { + encode(w: Writer): boolean; +} diff --git a/tracker/tracker/src/webworker/types.ts b/tracker/tracker/src/common/webworker.ts similarity index 100% rename from tracker/tracker/src/webworker/types.ts rename to tracker/tracker/src/common/webworker.ts diff --git a/tracker/tracker/src/main/app/index.ts b/tracker/tracker/src/main/app/index.ts index ace8ecf6e..2874a8867 100644 --- a/tracker/tracker/src/main/app/index.ts +++ b/tracker/tracker/src/main/app/index.ts @@ -1,6 +1,6 @@ +import type Message from "../../common/messages.js"; +import { Timestamp, Metadata } from "../../common/messages.js"; import { timestamp, deprecationWarn } from "../utils.js"; -import { Timestamp, Metadata } from "../../messages/index.js"; -import Message from "../../messages/message.js"; import Nodes from "./nodes.js"; import Observer from "./observer/top_observer.js"; import Sanitizer from "./sanitizer.js"; @@ -13,7 +13,7 @@ import { deviceMemory, jsHeapSizeLimit } from "../modules/performance.js"; import type { Options as ObserverOptions } from "./observer/top_observer.js"; import type { Options as SanitizerOptions } from "./sanitizer.js"; import type { Options as LoggerOptions } from "./logger.js" -import type { Options as WebworkerOptions, WorkerMessageData } from "../../webworker/types.js"; +import type { Options as WebworkerOptions, WorkerMessageData } from "../../common/webworker.js"; // TODO: Unify and clearly describe options logic diff --git a/tracker/tracker/src/main/app/observer/iframe_observer.ts b/tracker/tracker/src/main/app/observer/iframe_observer.ts index be0a7182c..1f50e588a 100644 --- a/tracker/tracker/src/main/app/observer/iframe_observer.ts +++ b/tracker/tracker/src/main/app/observer/iframe_observer.ts @@ -1,5 +1,5 @@ import Observer from "./observer.js"; -import { CreateIFrameDocument } from "../../../messages/index.js"; +import { CreateIFrameDocument } from "../../../common/messages.js"; export default class IFrameObserver extends Observer { observe(iframe: HTMLIFrameElement) { diff --git a/tracker/tracker/src/main/app/observer/observer.ts b/tracker/tracker/src/main/app/observer/observer.ts index 06823e07c..dcbba6365 100644 --- a/tracker/tracker/src/main/app/observer/observer.ts +++ b/tracker/tracker/src/main/app/observer/observer.ts @@ -8,7 +8,7 @@ import { CreateElementNode, MoveNode, RemoveNode, -} from "../../../messages/index.js"; +} from "../../../common/messages.js"; import App from "../index.js"; import { isInstance, inDocument } from "../context.js"; diff --git a/tracker/tracker/src/main/app/observer/shadow_root_observer.ts b/tracker/tracker/src/main/app/observer/shadow_root_observer.ts index 244348ea1..ea37bb30f 100644 --- a/tracker/tracker/src/main/app/observer/shadow_root_observer.ts +++ b/tracker/tracker/src/main/app/observer/shadow_root_observer.ts @@ -1,5 +1,5 @@ import Observer from "./observer.js"; -import { CreateIFrameDocument } from "../../../messages/index.js"; +import { CreateIFrameDocument } from "../../../common/messages.js"; export default class ShadowRootObserver extends Observer { observe(el: Element) { diff --git a/tracker/tracker/src/main/app/observer/top_observer.ts b/tracker/tracker/src/main/app/observer/top_observer.ts index 14bed9768..cab84b162 100644 --- a/tracker/tracker/src/main/app/observer/top_observer.ts +++ b/tracker/tracker/src/main/app/observer/top_observer.ts @@ -4,7 +4,7 @@ import type { Window } from "../context.js"; import IFrameObserver from "./iframe_observer.js"; import ShadowRootObserver from "./shadow_root_observer.js"; -import { CreateDocument } from "../../../messages/index.js"; +import { CreateDocument } from "../../../common/messages.js"; import App from "../index.js"; import { IN_BROWSER, hasOpenreplayAttribute } from '../../utils.js' diff --git a/tracker/tracker/src/main/app/session.ts b/tracker/tracker/src/main/app/session.ts index 169241aa7..602ef8280 100644 --- a/tracker/tracker/src/main/app/session.ts +++ b/tracker/tracker/src/main/app/session.ts @@ -1,5 +1,5 @@ import App, { StartOptions } from "./index.js"; -import { UserID, UserAnonymousID, Metadata } from "../../messages/index.js"; +import { UserID, UserAnonymousID, Metadata } from "../../common/messages.js"; enum ActivityState { diff --git a/tracker/tracker/src/main/index.ts b/tracker/tracker/src/main/index.ts index a55df1d1c..e1b25b43b 100644 --- a/tracker/tracker/src/main/index.ts +++ b/tracker/tracker/src/main/index.ts @@ -1,8 +1,8 @@ import App, { DEFAULT_INGEST_POINT } from "./app/index.js"; export { default as App } from './app/index.js'; -import { UserID, UserAnonymousID, Metadata, RawCustomEvent, CustomIssue } from "../messages/index.js"; -import * as _Messages from "../messages/index.js"; +import { UserID, UserAnonymousID, Metadata, RawCustomEvent, CustomIssue } from "../common/messages.js"; +import * as _Messages from "../common/messages.js"; export const Messages = _Messages; import Connection from "./modules/connection.js"; diff --git a/tracker/tracker/src/main/modules/connection.ts b/tracker/tracker/src/main/modules/connection.ts index a2767790c..72ef972f7 100644 --- a/tracker/tracker/src/main/modules/connection.ts +++ b/tracker/tracker/src/main/modules/connection.ts @@ -1,5 +1,5 @@ import App from "../app/index.js"; -import { ConnectionInformation } from "../../messages/index.js"; +import { ConnectionInformation } from "../../common/messages.js"; export default function(app: App): void { const connection: diff --git a/tracker/tracker/src/main/modules/console.ts b/tracker/tracker/src/main/modules/console.ts index 98db6c144..b6e95d14f 100644 --- a/tracker/tracker/src/main/modules/console.ts +++ b/tracker/tracker/src/main/modules/console.ts @@ -1,6 +1,6 @@ import App from "../app/index.js"; import { IN_BROWSER } from "../utils.js"; -import { ConsoleLog } from "../../messages/index.js"; +import { ConsoleLog } from "../../common/messages.js"; const printError: (e: Error) => string = IN_BROWSER && 'InstallTrigger' in window // detect Firefox diff --git a/tracker/tracker/src/main/modules/cssrules.ts b/tracker/tracker/src/main/modules/cssrules.ts index 18aa3f154..8c75a5366 100644 --- a/tracker/tracker/src/main/modules/cssrules.ts +++ b/tracker/tracker/src/main/modules/cssrules.ts @@ -1,5 +1,5 @@ import App from "../app/index.js"; -import { CSSInsertRuleURLBased, CSSDeleteRule, TechnicalInfo } from "../../messages/index.js"; +import { CSSInsertRuleURLBased, CSSDeleteRule, TechnicalInfo } from "../../common/messages.js"; export default function(app: App | null) { if (app === null) { diff --git a/tracker/tracker/src/main/modules/exception.ts b/tracker/tracker/src/main/modules/exception.ts index 848df03be..be02ca291 100644 --- a/tracker/tracker/src/main/modules/exception.ts +++ b/tracker/tracker/src/main/modules/exception.ts @@ -1,6 +1,6 @@ +import type Message from "../../common/messages.js"; import App from "../app/index.js"; -import { JSException } from "../../messages/index.js"; -import Message from "../../messages/message.js"; +import { JSException } from "../../common/messages.js"; import ErrorStackParser from 'error-stack-parser'; export interface Options { diff --git a/tracker/tracker/src/main/modules/img.ts b/tracker/tracker/src/main/modules/img.ts index 8c0f911a8..da260c414 100644 --- a/tracker/tracker/src/main/modules/img.ts +++ b/tracker/tracker/src/main/modules/img.ts @@ -1,6 +1,6 @@ import { timestamp, isURL } from "../utils.js"; import App from "../app/index.js"; -import { ResourceTiming, SetNodeAttributeURLBased, SetNodeAttribute } from "../../messages/index.js"; +import { ResourceTiming, SetNodeAttributeURLBased, SetNodeAttribute } from "../../common/messages.js"; const PLACEHOLDER_SRC = "https://static.openreplay.com/tracker/placeholder.jpeg"; diff --git a/tracker/tracker/src/main/modules/input.ts b/tracker/tracker/src/main/modules/input.ts index 0cad3c58b..546204730 100644 --- a/tracker/tracker/src/main/modules/input.ts +++ b/tracker/tracker/src/main/modules/input.ts @@ -5,7 +5,7 @@ import { hasOpenreplayAttribute, } from "../utils.js"; import App from "../app/index.js"; -import { SetInputTarget, SetInputValue, SetInputChecked } from "../../messages/index.js"; +import { SetInputTarget, SetInputValue, SetInputChecked } from "../../common/messages.js"; // TODO: take into consideration "contenteditable" attribute type TextEditableElement = HTMLInputElement | HTMLTextAreaElement diff --git a/tracker/tracker/src/main/modules/longtasks.ts b/tracker/tracker/src/main/modules/longtasks.ts index 0f3a7e82a..589c73de2 100644 --- a/tracker/tracker/src/main/modules/longtasks.ts +++ b/tracker/tracker/src/main/modules/longtasks.ts @@ -1,5 +1,5 @@ import App from "../app/index.js"; -import { LongTask } from "../../messages/index.js"; +import { LongTask } from "../../common/messages.js"; // https://w3c.github.io/performance-timeline/#the-performanceentry-interface interface TaskAttributionTiming extends PerformanceEntry { diff --git a/tracker/tracker/src/main/modules/mouse.ts b/tracker/tracker/src/main/modules/mouse.ts index b72e5dbb9..956108963 100644 --- a/tracker/tracker/src/main/modules/mouse.ts +++ b/tracker/tracker/src/main/modules/mouse.ts @@ -4,7 +4,7 @@ import { getLabelAttribute, } from "../utils.js"; import App from "../app/index.js"; -import { MouseMove, MouseClick } from "../../messages/index.js"; +import { MouseMove, MouseClick } from "../../common/messages.js"; import { getInputLabel } from "./input.js"; function _getSelector(target: Element): string { diff --git a/tracker/tracker/src/main/modules/performance.ts b/tracker/tracker/src/main/modules/performance.ts index 8eb7701eb..c7d911c9f 100644 --- a/tracker/tracker/src/main/modules/performance.ts +++ b/tracker/tracker/src/main/modules/performance.ts @@ -1,6 +1,6 @@ import App from "../app/index.js"; import { IN_BROWSER } from "../utils.js"; -import { PerformanceTrack } from "../../messages/index.js"; +import { PerformanceTrack } from "../../common/messages.js"; type Perf = { diff --git a/tracker/tracker/src/main/modules/scroll.ts b/tracker/tracker/src/main/modules/scroll.ts index f9c80e6d9..9d19ccc24 100644 --- a/tracker/tracker/src/main/modules/scroll.ts +++ b/tracker/tracker/src/main/modules/scroll.ts @@ -1,5 +1,5 @@ import App from "../app/index.js"; -import { SetViewportScroll, SetNodeScroll } from "../../messages/index.js"; +import { SetViewportScroll, SetNodeScroll } from "../../common/messages.js"; export default function (app: App): void { let documentScroll = false; diff --git a/tracker/tracker/src/main/modules/timing.ts b/tracker/tracker/src/main/modules/timing.ts index 033741838..01fbd1d0a 100644 --- a/tracker/tracker/src/main/modules/timing.ts +++ b/tracker/tracker/src/main/modules/timing.ts @@ -1,7 +1,7 @@ +import type Message from "../../common/messages.js"; import { isURL } from "../utils.js"; import App from "../app/index.js"; -import { ResourceTiming, PageLoadTiming, PageRenderTiming } from "../../messages/index.js"; -import type Message from "../../messages/message.js"; +import { ResourceTiming, PageLoadTiming, PageRenderTiming } from "../../common/messages.js"; // Inspired by https://github.com/WPO-Foundation/RUM-SpeedIndex/blob/master/src/rum-speedindex.js diff --git a/tracker/tracker/src/main/modules/viewport.ts b/tracker/tracker/src/main/modules/viewport.ts index 626eadd12..1d70a3ebf 100644 --- a/tracker/tracker/src/main/modules/viewport.ts +++ b/tracker/tracker/src/main/modules/viewport.ts @@ -3,7 +3,7 @@ import { SetPageLocation, SetViewportSize, SetPageVisibility, -} from "../../messages/index.js"; +} from "../../common/messages.js"; export default function (app: App): void { let url: string, width: number, height: number; diff --git a/tracker/tracker/src/main/tsconfig.json b/tracker/tracker/src/main/tsconfig.json index f6ac938a6..14a932c39 100644 --- a/tracker/tracker/src/main/tsconfig.json +++ b/tracker/tracker/src/main/tsconfig.json @@ -5,7 +5,7 @@ "lib": ["es6", "dom"], }, "references": [ - { "path": "../messages" } + { "path": "../common" } ], "exclude": ["app/observer"] } diff --git a/tracker/tracker/src/messages/message.ts b/tracker/tracker/src/messages/message.ts deleted file mode 100644 index aeb8619de..000000000 --- a/tracker/tracker/src/messages/message.ts +++ /dev/null @@ -1,5 +0,0 @@ -import Writer from "./writer.js"; - -export default interface Message { - encode(w: Writer): boolean; -} diff --git a/tracker/tracker/src/webworker/BatchWriter.ts b/tracker/tracker/src/webworker/BatchWriter.ts index 5f220bbec..7ddf97dbe 100644 --- a/tracker/tracker/src/webworker/BatchWriter.ts +++ b/tracker/tracker/src/webworker/BatchWriter.ts @@ -1,14 +1,14 @@ -import Writer from "../messages/writer.js"; -import Message from "../messages/message.js"; +import type Message from "../common/messages.js"; +import PrimitiveWriter from "./PrimitiveWriter.js"; import { BatchMeta, Timestamp, -} from "../messages/index.js"; +} from "../common/messages.js"; export default class BatchWriter { private nextIndex = 0 private beaconSize = 2 * 1e5 // Default 200kB - private writer = new Writer(this.beaconSize) + private writer = new PrimitiveWriter(this.beaconSize) private isEmpty = true constructor( @@ -50,7 +50,7 @@ export default class BatchWriter { } // MBTODO: tempWriter for one message? this.beaconSize = Math.min(this.beaconSize*2, this.beaconSizeLimit) - this.writer = new Writer(this.beaconSize) + this.writer = new PrimitiveWriter(this.beaconSize) this.prepareBatchMeta() } } diff --git a/tracker/tracker/src/messages/writer.ts b/tracker/tracker/src/webworker/PrimitiveWriter.ts similarity index 99% rename from tracker/tracker/src/messages/writer.ts rename to tracker/tracker/src/webworker/PrimitiveWriter.ts index 6947420bc..587291bea 100644 --- a/tracker/tracker/src/messages/writer.ts +++ b/tracker/tracker/src/webworker/PrimitiveWriter.ts @@ -59,7 +59,7 @@ const textEncoder: { encode(str: string): Uint8Array } = }, }; -export default class Writer { +export default class PrimitiveWriter { private offset: number = 0; private checkpointOffset: number = 0; private readonly data: Uint8Array; diff --git a/tracker/tracker/src/webworker/index.ts b/tracker/tracker/src/webworker/index.ts index b9640e9e2..3e9341a2d 100644 --- a/tracker/tracker/src/webworker/index.ts +++ b/tracker/tracker/src/webworker/index.ts @@ -1,13 +1,14 @@ -import Message from "../messages/message.js"; +import type Message from "../common/messages.js"; +import type { WorkerMessageData } from "../common/webworker.js"; + import { classes, SetPageVisibility, MouseMove, -} from "../messages/index.js"; +} from "../common/messages.js"; import QueueSender from "./QueueSender.js"; import BatchWriter from "./BatchWriter.js"; -import type { WorkerMessageData } from "./types.js"; const AUTO_SEND_INTERVAL = 10 * 1000 diff --git a/tracker/tracker/src/webworker/tsconfig.json b/tracker/tracker/src/webworker/tsconfig.json index 9e72f437e..6794ea55c 100644 --- a/tracker/tracker/src/webworker/tsconfig.json +++ b/tracker/tracker/src/webworker/tsconfig.json @@ -4,6 +4,6 @@ "lib": ["es6", "webworker"] }, "references": [ - { "path": "../messages" } + { "path": "../common" } ] } diff --git a/tracker/tracker/src/webworker/url-rewriter.ts.dd b/tracker/tracker/src/webworker/url-rewriter.ts.dd deleted file mode 100644 index 956448df2..000000000 --- a/tracker/tracker/src/webworker/url-rewriter.ts.dd +++ /dev/null @@ -1,9 +0,0 @@ - - - - -function getFullURL(baseURL: string, relativeURL: string) { - if (isRelative(relativeURL)) { - - } -} \ No newline at end of file From e65fa58ab56e3198e46e298090f396c36ec111d0 Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Wed, 11 May 2022 18:51:55 +0200 Subject: [PATCH 103/260] refactor(backend-internal): dry builder --- backend/internal/builder/builder.go | 4 +-- backend/internal/builder/builderMap.go | 45 +++++++++++++++----------- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/backend/internal/builder/builder.go b/backend/internal/builder/builder.go index 4916764cd..ff3d91e1b 100644 --- a/backend/internal/builder/builder.go +++ b/backend/internal/builder/builder.go @@ -18,7 +18,7 @@ func NewBuilder(handlers ...handlers.MessageProcessor) *builder { } } -func (b *builder) iterateReadyMessage(iter func(msg Message)) { +func (b *builder) iterateReadyMessages(iter func(msg Message)) { for _, readyMsg := range b.readyMsgs { iter(readyMsg) } @@ -44,10 +44,10 @@ func (b *builder) handleMessage(message Message, messageID uint64) { return } - b.checkSessionEnd(message) for _, p := range b.processors { if rm := p.Handle(message, messageID, b.timestamp); rm != nil { b.readyMsgs = append(b.readyMsgs, rm) } } + b.checkSessionEnd(message) } diff --git a/backend/internal/builder/builderMap.go b/backend/internal/builder/builderMap.go index b393bcd28..f6d81b995 100644 --- a/backend/internal/builder/builderMap.go +++ b/backend/internal/builder/builderMap.go @@ -20,7 +20,7 @@ func NewBuilderMap(handlers ...handlers.MessageProcessor) *builderMap { func (m *builderMap) GetBuilder(sessionID uint64) *builder { b := m.sessions[sessionID] if b == nil { - b = NewBuilder(m.handlers...) + b = NewBuilder(m.handlers...) // Should create new instances m.sessions[sessionID] = b } return b @@ -31,21 +31,29 @@ func (m *builderMap) HandleMessage(sessionID uint64, msg Message, messageID uint b.handleMessage(msg, messageID) } -func (m *builderMap) IterateReadyMessages(iter func(sessionID uint64, msg Message)) { - for sessionID, b := range m.sessions { - if b.ended { - for _, p := range b.processors { - if rm := p.Build(); rm != nil { - b.readyMsgs = append(b.readyMsgs, rm) - } +func (m *builderMap) iterateSessionReadyMessages(sessionID uint64, b *builder, iter func(msg Message)) { + if b.ended { + for _, p := range b.processors { + if rm := p.Build(); rm != nil { + b.readyMsgs = append(b.readyMsgs, rm) } } - b.iterateReadyMessage(func(msg Message) { - iter(sessionID, msg) - }) - if b.ended { - delete(m.sessions, sessionID) - } + } + b.iterateReadyMessage(iter) + if b.ended { + delete(m.sessions, sessionID) + } +} + +func (m *builderMap) IterateReadyMessages(iter func(sessionID uint64, msg Message)) { + for sessionID, session := range m.sessions { + m.iterateSessionReadyMessages( + sessionID, + session, + func(msg Message) { + iter(sessionID, msg) + }, + ) } } @@ -54,8 +62,9 @@ func (m *builderMap) IterateSessionReadyMessages(sessionID uint64, iter func(msg if !ok { return } - session.iterateReadyMessage(iter) - if session.ended { - delete(m.sessions, sessionID) - } + m.iterateSessionReadyMessages( + sessionID, + session, + inter, + ) } From a6f8857b8912747491236f2e7440673678f0f2ec Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Wed, 11 May 2022 19:04:14 +0200 Subject: [PATCH 104/260] refactor-fix(backend-heuristics/db): create handlers for each session separately --- backend/cmd/db/main.go | 14 ++++++----- backend/cmd/heuristics/main.go | 32 ++++++++++++++------------ backend/internal/builder/builderMap.go | 12 +++++----- 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/backend/cmd/db/main.go b/backend/cmd/db/main.go index 8236586c2..d3ba45017 100644 --- a/backend/cmd/db/main.go +++ b/backend/cmd/db/main.go @@ -30,15 +30,17 @@ func main() { pg := cache.NewPGCache(postgres.NewConn(cfg.Postgres), cfg.ProjectExpirationTimeoutMs) defer pg.Close() - // Declare message handlers we want to apply for each incoming message - msgHandlers := []handlers.MessageProcessor{ - custom.NewMainHandler(), // TODO: separate to several handler - //custom.NewInputEventBuilder(), - //custom.NewPageEventBuilder(), + // HandlersFabric returns the list of message handlers we want to be applied to each incoming message. + handlersFabric := func() { + return []handlers.MessageProcessor{ + custom.NewMainHandler(), // TODO: separate to several handler + //custom.NewInputEventBuilder(), + //custom.NewPageEventBuilder(), + } } // Create handler's aggregator - builderMap := builder.NewBuilderMap(msgHandlers...) + builderMap := builder.NewBuilderMap(handlersFabric) // Init modules saver := datasaver.New(pg) diff --git a/backend/cmd/heuristics/main.go b/backend/cmd/heuristics/main.go index 9c77cb4ba..5543f85e1 100644 --- a/backend/cmd/heuristics/main.go +++ b/backend/cmd/heuristics/main.go @@ -25,24 +25,26 @@ func main() { // Load service configuration cfg := ender.New() - // Declare message handlers we want to apply for each incoming message - msgHandlers := []handlers.MessageProcessor{ - // web handlers - &web.ClickRageDetector{}, - &web.CpuIssueDetector{}, - &web.DeadClickDetector{}, - &web.MemoryIssueDetector{}, - &web.PerformanceAggregator{}, - // iOS handlers - &ios.AppNotResponding{}, - &ios.ClickRageDetector{}, - &ios.PerformanceAggregator{}, - // Other handlers (you can add your custom handlers here) - &custom.CustomHandler{}, + // HandlersFabric returns the list of message handlers we want to be applied to each incoming message. + handlersFabric := func() { + return []handlers.MessageProcessor{ + // web handlers + &web.ClickRageDetector{}, + &web.CpuIssueDetector{}, + &web.DeadClickDetector{}, + &web.MemoryIssueDetector{}, + &web.PerformanceAggregator{}, + // iOS handlers + &ios.AppNotResponding{}, + &ios.ClickRageDetector{}, + &ios.PerformanceAggregator{}, + // Other handlers (you can add your custom handlers here) + &custom.CustomHandler{}, + } } // Create handler's aggregator - builderMap := builder.NewBuilderMap(msgHandlers...) + builderMap := builder.NewBuilderMap(handlersFabric) // Init logger statsLogger := logger.NewQueueStats(cfg.LoggerTimeout) diff --git a/backend/internal/builder/builderMap.go b/backend/internal/builder/builderMap.go index f6d81b995..ed47abdce 100644 --- a/backend/internal/builder/builderMap.go +++ b/backend/internal/builder/builderMap.go @@ -6,21 +6,21 @@ import ( ) type builderMap struct { - handlers []handlers.MessageProcessor - sessions map[uint64]*builder + handlersFabric func() []handlers.MessageProcessor + sessions map[uint64]*builder } -func NewBuilderMap(handlers ...handlers.MessageProcessor) *builderMap { +func NewBuilderMap(handlersFabric func() []handlers.MessageProcessor) *builderMap { return &builderMap{ - handlers: handlers, - sessions: make(map[uint64]*builder), + handlersFabric: handlersFabric, + sessions: make(map[uint64]*builder), } } func (m *builderMap) GetBuilder(sessionID uint64) *builder { b := m.sessions[sessionID] if b == nil { - b = NewBuilder(m.handlers...) // Should create new instances + b = NewBuilder(m.handlersFabric()) // Should create new instances m.sessions[sessionID] = b } return b From 85b87e17dfbf91eab8e3ebe239fd3e668f224cf1 Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Wed, 11 May 2022 21:14:23 +0200 Subject: [PATCH 105/260] refactor(backend/internals): builder: message order & timestamps check --- backend/internal/builder/builder.go | 30 ++++++++++++++++++-------- backend/internal/builder/builderMap.go | 6 +++++- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/backend/internal/builder/builder.go b/backend/internal/builder/builder.go index ff3d91e1b..38a64ab54 100644 --- a/backend/internal/builder/builder.go +++ b/backend/internal/builder/builder.go @@ -6,10 +6,12 @@ import ( ) type builder struct { - readyMsgs []Message - timestamp uint64 - processors []handlers.MessageProcessor - ended bool + readyMsgs []Message + timestamp uint64 + lastMessageID uint64 + lastSystemTimestamp int64 + processors []handlers.MessageProcessor + ended bool } func NewBuilder(handlers ...handlers.MessageProcessor) *builder { @@ -35,15 +37,25 @@ func (b *builder) checkSessionEnd(message Message) { } func (b *builder) handleMessage(message Message, messageID uint64) { - timestamp := GetTimestamp(message) - if b.timestamp < timestamp { - b.timestamp = timestamp + if messageID < b.lastMessageID { + // May happen in case of duplicated messages in kafka (if `idempotence: false`) + return } - if b.timestamp == 0 { - // in case of SessionStart. TODO: make timestamp system transparent + timestamp := GetTimestamp(message) + if timestamp == 0 { + // May happen in case of messages that are single-in-batch, + // e.g. SessionStart or RawErrorEvent (emitted by `integrations`). + + // TODO: make timestamp system transparent; + return + } + if timestamp < b.timestamp { + // Shouldn't happen after messageID check which is done above. TODO: log this case. return } + b.timestamp = timestamp + b.lastSystemTimestamp = time.Now().UnixMilli() for _, p := range b.processors { if rm := p.Handle(message, messageID, b.timestamp); rm != nil { b.readyMsgs = append(b.readyMsgs, rm) diff --git a/backend/internal/builder/builderMap.go b/backend/internal/builder/builderMap.go index ed47abdce..fcd52b0cc 100644 --- a/backend/internal/builder/builderMap.go +++ b/backend/internal/builder/builderMap.go @@ -1,10 +1,14 @@ package builder import ( + "time" + "openreplay/backend/internal/handlers" . "openreplay/backend/pkg/messages" ) +const FORCE_DELETE_TIMEOUT = 4 * time.Hour + type builderMap struct { handlersFabric func() []handlers.MessageProcessor sessions map[uint64]*builder @@ -32,7 +36,7 @@ func (m *builderMap) HandleMessage(sessionID uint64, msg Message, messageID uint } func (m *builderMap) iterateSessionReadyMessages(sessionID uint64, b *builder, iter func(msg Message)) { - if b.ended { + if b.ended || b.lastSystemTimestamp+FORCE_DELETE_TIMEOUT < time.Now().UnixMilli() { for _, p := range b.processors { if rm := p.Build(); rm != nil { b.readyMsgs = append(b.readyMsgs, rm) From 6d2bfc0e77d6379f07445fc1efa94820722b31d6 Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Wed, 11 May 2022 21:25:41 +0200 Subject: [PATCH 106/260] fix(backend/internals): builder codefix --- backend/internal/builder/builder.go | 16 +++++++++------- backend/internal/builder/builderMap.go | 8 ++++---- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/backend/internal/builder/builder.go b/backend/internal/builder/builder.go index 38a64ab54..dd7bb675a 100644 --- a/backend/internal/builder/builder.go +++ b/backend/internal/builder/builder.go @@ -1,17 +1,19 @@ package builder import ( + "time" + "openreplay/backend/internal/handlers" . "openreplay/backend/pkg/messages" ) type builder struct { - readyMsgs []Message - timestamp uint64 - lastMessageID uint64 - lastSystemTimestamp int64 - processors []handlers.MessageProcessor - ended bool + readyMsgs []Message + timestamp uint64 + lastMessageID uint64 + lastSystemTime time.Time + processors []handlers.MessageProcessor + ended bool } func NewBuilder(handlers ...handlers.MessageProcessor) *builder { @@ -55,7 +57,7 @@ func (b *builder) handleMessage(message Message, messageID uint64) { } b.timestamp = timestamp - b.lastSystemTimestamp = time.Now().UnixMilli() + b.lastSystemTime = time.Now() for _, p := range b.processors { if rm := p.Handle(message, messageID, b.timestamp); rm != nil { b.readyMsgs = append(b.readyMsgs, rm) diff --git a/backend/internal/builder/builderMap.go b/backend/internal/builder/builderMap.go index fcd52b0cc..af2ecf0d5 100644 --- a/backend/internal/builder/builderMap.go +++ b/backend/internal/builder/builderMap.go @@ -24,7 +24,7 @@ func NewBuilderMap(handlersFabric func() []handlers.MessageProcessor) *builderMa func (m *builderMap) GetBuilder(sessionID uint64) *builder { b := m.sessions[sessionID] if b == nil { - b = NewBuilder(m.handlersFabric()) // Should create new instances + b = NewBuilder(m.handlersFabric()...) // Should create new instances m.sessions[sessionID] = b } return b @@ -36,14 +36,14 @@ func (m *builderMap) HandleMessage(sessionID uint64, msg Message, messageID uint } func (m *builderMap) iterateSessionReadyMessages(sessionID uint64, b *builder, iter func(msg Message)) { - if b.ended || b.lastSystemTimestamp+FORCE_DELETE_TIMEOUT < time.Now().UnixMilli() { + if b.ended || b.lastSystemTime.Add(FORCE_DELETE_TIMEOUT).Before(time.Now()) { for _, p := range b.processors { if rm := p.Build(); rm != nil { b.readyMsgs = append(b.readyMsgs, rm) } } } - b.iterateReadyMessage(iter) + b.iterateReadyMessages(iter) if b.ended { delete(m.sessions, sessionID) } @@ -69,6 +69,6 @@ func (m *builderMap) IterateSessionReadyMessages(sessionID uint64, iter func(msg m.iterateSessionReadyMessages( sessionID, session, - inter, + iter, ) } From 88bec7ab6065ade07f3e4ecf1941df27ae5f8c9f Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Wed, 11 May 2022 21:27:18 +0200 Subject: [PATCH 107/260] refactor(): separate ieBuilder, peBuilder & networkIssueDeterctor from EventMapper --- backend/cmd/db/main.go | 6 +- backend/cmd/heuristics/main.go | 1 + .../internal/handlers/custom/eventMapper.go | 135 +++++++++ .../handlers/custom/inputEventBuilder.go | 95 +++---- .../internal/handlers/custom/mainHandler.go | 257 ------------------ .../handlers/custom/pageEventBuilder.go | 159 ++++++----- .../handlers/ios/performanceAggregator.go | 10 +- backend/internal/handlers/web/networkIssue.go | 47 ++++ backend/pkg/intervals/intervals.go | 2 - 9 files changed, 309 insertions(+), 403 deletions(-) create mode 100644 backend/internal/handlers/custom/eventMapper.go delete mode 100644 backend/internal/handlers/custom/mainHandler.go create mode 100644 backend/internal/handlers/web/networkIssue.go diff --git a/backend/cmd/db/main.go b/backend/cmd/db/main.go index d3ba45017..d3d786242 100644 --- a/backend/cmd/db/main.go +++ b/backend/cmd/db/main.go @@ -33,9 +33,9 @@ func main() { // HandlersFabric returns the list of message handlers we want to be applied to each incoming message. handlersFabric := func() { return []handlers.MessageProcessor{ - custom.NewMainHandler(), // TODO: separate to several handler - //custom.NewInputEventBuilder(), - //custom.NewPageEventBuilder(), + custom.EventMapper{}, + custom.NewInputEventBuilder(), + custom.NewPageEventBuilder(), } } diff --git a/backend/cmd/heuristics/main.go b/backend/cmd/heuristics/main.go index 5543f85e1..6712c927c 100644 --- a/backend/cmd/heuristics/main.go +++ b/backend/cmd/heuristics/main.go @@ -33,6 +33,7 @@ func main() { &web.CpuIssueDetector{}, &web.DeadClickDetector{}, &web.MemoryIssueDetector{}, + &web.NetworkIssueDetector{}, &web.PerformanceAggregator{}, // iOS handlers &ios.AppNotResponding{}, diff --git a/backend/internal/handlers/custom/eventMapper.go b/backend/internal/handlers/custom/eventMapper.go new file mode 100644 index 000000000..5d118ff7d --- /dev/null +++ b/backend/internal/handlers/custom/eventMapper.go @@ -0,0 +1,135 @@ +package custom + +import ( + "net/url" + "strings" + + . "openreplay/backend/pkg/messages" +) + +func getURLExtention(URL string) string { + u, err := url.Parse(URL) + if err != nil { + return "" + } + i := strings.LastIndex(u.Path, ".") + return u.Path[i+1:] +} + +func getResourceType(initiator string, URL string) string { + switch initiator { + case "xmlhttprequest", "fetch": + return "fetch" + case "img": + return "img" + default: + switch getURLExtention(URL) { + case "css": + return "stylesheet" + case "js": + return "script" + case "png", "gif", "jpg", "jpeg", "svg": + return "img" + case "mp4", "mkv", "ogg", "webm", "avi", "mp3": + return "media" + default: + return "other" + } + } +} + +type EventMapper struct{} + +func (b *EventMapper) Build() Message { + return nil +} + +func (b *EventMapper) Handle(message Message, messageID uint64, timestamp uint64) Message { + switch msg := message.(type) { + case *RawErrorEvent: + // !!! This won't be handled because the Meta() timestamp emitted by `integrations` will be 0 + // TODO: move to db directly + return &ErrorEvent{ + MessageID: messageID, + Timestamp: msg.Timestamp, + Source: msg.Source, + Name: msg.Name, + Message: msg.Message, + Payload: msg.Payload, + } + case *MouseClick: + if msg.Label != "" { + return &ClickEvent{ + MessageID: messageID, + Label: msg.Label, + HesitationTime: msg.HesitationTime, + Timestamp: timestamp, + Selector: msg.Selector, + } + } + case *JSException: + return &ErrorEvent{ + MessageID: messageID, + Timestamp: timestamp, + Source: "js_exception", + Name: msg.Name, + Message: msg.Message, + Payload: msg.Payload, + } + case *ResourceTiming: + return &ResourceEvent{ + MessageID: messageID, + Timestamp: msg.Timestamp, + Duration: msg.Duration, + TTFB: msg.TTFB, + HeaderSize: msg.HeaderSize, + EncodedBodySize: msg.EncodedBodySize, + DecodedBodySize: msg.DecodedBodySize, + URL: msg.URL, + Type: getResourceType(msg.Initiator, msg.URL), + Success: msg.Duration != 0, + } + case *RawCustomEvent: + return &CustomEvent{ + MessageID: messageID, + Timestamp: timestamp, + Name: msg.Name, + Payload: msg.Payload, + } + case *CustomIssue: + return &IssueEvent{ + Type: "custom", + Timestamp: timestamp, + MessageID: messageID, + ContextString: msg.Name, + Payload: msg.Payload, + } + case *Fetch: + return &FetchEvent{ + MessageID: messageID, + Timestamp: msg.Timestamp, + Method: msg.Method, + URL: msg.URL, + Request: msg.Request, + Response: msg.Response, + Status: msg.Status, + Duration: msg.Duration, + } + case *GraphQL: + return &GraphQLEvent{ + MessageID: messageID, + Timestamp: timestamp, + OperationKind: msg.OperationKind, + OperationName: msg.OperationName, + Variables: msg.Variables, + Response: msg.Response, + } + case *StateAction: + return &StateActionEvent{ + MessageID: messageID, + Timestamp: timestamp, + Type: msg.Type, + } + } + return nil +} diff --git a/backend/internal/handlers/custom/inputEventBuilder.go b/backend/internal/handlers/custom/inputEventBuilder.go index 770e714af..e07470f37 100644 --- a/backend/internal/handlers/custom/inputEventBuilder.go +++ b/backend/internal/handlers/custom/inputEventBuilder.go @@ -4,6 +4,8 @@ import ( . "openreplay/backend/pkg/messages" ) +const INPUT_EVENT_TIMEOUT = 1 * 60 * 1000 + type inputLabels map[uint64]string type inputEventBuilder struct { @@ -12,78 +14,63 @@ type inputEventBuilder struct { inputID uint64 } -func (b *inputEventBuilder) Handle(message Message, messageID uint64, timestamp uint64) Message { - //TODO implement me - panic("implement me") -} - -func (b *inputEventBuilder) Build() Message { - // b.build() - //TODO implement me - panic("implement me") -} - func NewInputEventBuilder() *inputEventBuilder { ieBuilder := &inputEventBuilder{} - ieBuilder.ClearLabels() + ieBuilder.clearLabels() return ieBuilder } -func (b *inputEventBuilder) ClearLabels() { +func (b *inputEventBuilder) clearLabels() { b.inputLabels = make(inputLabels) } -func (b *inputEventBuilder) HandleSetInputTarget(msg *SetInputTarget) *InputEvent { - var inputEvent *InputEvent - if b.inputID != msg.ID { - inputEvent = b.build() - b.inputID = msg.ID - } - b.inputLabels[msg.ID] = msg.Label - return inputEvent -} - -func (b *inputEventBuilder) HandleSetInputValue(msg *SetInputValue, messageID uint64, timestamp uint64) *InputEvent { - var inputEvent *InputEvent - if b.inputID != msg.ID { - inputEvent = b.build() - b.inputID = msg.ID - } - if b.inputEvent == nil { - b.inputEvent = &InputEvent{ - MessageID: messageID, - Timestamp: timestamp, - Value: msg.Value, - ValueMasked: msg.Mask > 0, +func (b *inputEventBuilder) Handle(message Message, messageID uint64, timestamp uint64) Message { + var inputEvent Message = nil + switch msg := message.(type) { + case *SetInputTarget: + if b.inputID != msg.ID { + inputEvent = b.Build() + b.inputID = msg.ID } - } else { - b.inputEvent.Value = msg.Value - b.inputEvent.ValueMasked = msg.Mask > 0 + b.inputLabels[msg.ID] = msg.Label + return inputEvent + case *SetInputValue: + if b.inputID != msg.ID { + inputEvent = b.Build() + b.inputID = msg.ID + } + if b.inputEvent == nil { + b.inputEvent = &InputEvent{ + MessageID: messageID, + Timestamp: timestamp, + Value: msg.Value, + ValueMasked: msg.Mask > 0, + } + } else { + b.inputEvent.Value = msg.Value + b.inputEvent.ValueMasked = msg.Mask > 0 + } + return inputEvent + case *CreateDocument: + inputEvent = b.Build() + b.clearLabels() + return inputEvent + case *MouseClick: + return b.Build() } - return inputEvent -} -func (b *inputEventBuilder) HasInstance() bool { - return b.inputEvent != nil -} - -func (b *inputEventBuilder) GetTimestamp() uint64 { - if b.inputEvent == nil { - return 0 + if b.inputEvent != nil && b.inputEvent.Timestamp+INPUT_EVENT_TIMEOUT < timestamp { + return b.Build() } - return b.inputEvent.Timestamp + return nil } -func (b *inputEventBuilder) build() *InputEvent { +func (b *inputEventBuilder) Build() Message { if b.inputEvent == nil { return nil } inputEvent := b.inputEvent - label, exists := b.inputLabels[b.inputID] - if !exists { - return nil - } - inputEvent.Label = label + inputEvent.Label = b.inputLabels[b.inputID] // might be empty string b.inputEvent = nil return inputEvent diff --git a/backend/internal/handlers/custom/mainHandler.go b/backend/internal/handlers/custom/mainHandler.go deleted file mode 100644 index 52a6278c0..000000000 --- a/backend/internal/handlers/custom/mainHandler.go +++ /dev/null @@ -1,257 +0,0 @@ -package custom - -import ( - "net/url" - "openreplay/backend/pkg/intervals" - "strings" - "time" - - . "openreplay/backend/pkg/messages" -) - -func getURLExtention(URL string) string { - u, err := url.Parse(URL) - if err != nil { - return "" - } - i := strings.LastIndex(u.Path, ".") - return u.Path[i+1:] -} - -func getResourceType(initiator string, URL string) string { - switch initiator { - case "xmlhttprequest", "fetch": - return "fetch" - case "img": - return "img" - default: - switch getURLExtention(URL) { - case "css": - return "stylesheet" - case "js": - return "script" - case "png", "gif", "jpg", "jpeg", "svg": - return "img" - case "mp4", "mkv", "ogg", "webm", "avi", "mp3": - return "media" - default: - return "other" - } - } -} - -type builder struct { - readyMsgs []Message - timestamp uint64 - lastProcessedTimestamp int64 - peBuilder *pageEventBuilder - ieBuilder *inputEventBuilder - integrationsWaiting bool - sid uint64 -} - -func (b *builder) Build() Message { - //TODO implement me - panic("implement me") -} - -func NewMainHandler() *builder { - return &builder{ - peBuilder: &pageEventBuilder{}, - ieBuilder: NewInputEventBuilder(), - integrationsWaiting: true, - } -} - -func (b *builder) appendReadyMessage(msg Message) { // interface is never nil even if it holds nil value - b.readyMsgs = append(b.readyMsgs, msg) -} - -func (b *builder) iterateReadyMessage(iter func(msg Message)) { - for _, readyMsg := range b.readyMsgs { - iter(readyMsg) - } - b.readyMsgs = nil -} - -func (b *builder) buildPageEvent() { - if msg := b.peBuilder.Build(); msg != nil { - b.appendReadyMessage(msg) - } -} - -func (b *builder) buildInputEvent() { - if msg := b.ieBuilder.Build(); msg != nil { - b.appendReadyMessage(msg) - } -} - -func (b *builder) Handle(message Message, messageID uint64, timestamp uint64) Message { - b.timestamp = timestamp - b.lastProcessedTimestamp = time.Now().UnixMilli() - - // Might happen before the first timestamp. - switch msg := message.(type) { - case *SessionStart, - *Metadata, - *UserID, - *UserAnonymousID: - b.appendReadyMessage(msg) - case *RawErrorEvent: - b.appendReadyMessage(&ErrorEvent{ - MessageID: messageID, - Timestamp: msg.Timestamp, - Source: msg.Source, - Name: msg.Name, - Message: msg.Message, - Payload: msg.Payload, - }) - } - if b.timestamp == 0 { - return nil - } - switch msg := message.(type) { - case *SetPageLocation: - if msg.NavigationStart == 0 { - b.appendReadyMessage(&PageEvent{ - URL: msg.URL, - Referrer: msg.Referrer, - Loaded: false, - MessageID: messageID, - Timestamp: b.timestamp, - }) - } else { - b.buildPageEvent() - b.buildInputEvent() - b.ieBuilder.ClearLabels() - b.peBuilder.HandleSetPageLocation(msg, messageID, b.timestamp) - } - case *PageLoadTiming: - if rm := b.peBuilder.HandlePageLoadTiming(msg); rm != nil { - b.appendReadyMessage(rm) - } - case *PageRenderTiming: - if rm := b.peBuilder.HandlePageRenderTiming(msg); rm != nil { - b.appendReadyMessage(rm) - } - case *SetInputTarget: - if rm := b.ieBuilder.HandleSetInputTarget(msg); rm != nil { - b.appendReadyMessage(rm) - } - case *SetInputValue: - if rm := b.ieBuilder.HandleSetInputValue(msg, messageID, b.timestamp); rm != nil { - b.appendReadyMessage(rm) - } - case *MouseClick: - b.buildInputEvent() - if msg.Label != "" { - b.appendReadyMessage(&ClickEvent{ - MessageID: messageID, - Label: msg.Label, - HesitationTime: msg.HesitationTime, - Timestamp: b.timestamp, - Selector: msg.Selector, - }) - } - case *JSException: - b.appendReadyMessage(&ErrorEvent{ - MessageID: messageID, - Timestamp: b.timestamp, - Source: "js_exception", - Name: msg.Name, - Message: msg.Message, - Payload: msg.Payload, - }) - case *ResourceTiming: - tp := getResourceType(msg.Initiator, msg.URL) - success := msg.Duration != 0 - b.appendReadyMessage(&ResourceEvent{ - MessageID: messageID, - Timestamp: msg.Timestamp, - Duration: msg.Duration, - TTFB: msg.TTFB, - HeaderSize: msg.HeaderSize, - EncodedBodySize: msg.EncodedBodySize, - DecodedBodySize: msg.DecodedBodySize, - URL: msg.URL, - Type: tp, - Success: success, - }) - if !success { - issueType := "missing_resource" - if tp == "fetch" { - issueType = "bad_request" - } - b.appendReadyMessage(&IssueEvent{ - Type: issueType, - MessageID: messageID, - Timestamp: msg.Timestamp, - ContextString: msg.URL, - }) - } - case *RawCustomEvent: - b.appendReadyMessage(&CustomEvent{ - MessageID: messageID, - Timestamp: b.timestamp, - Name: msg.Name, - Payload: msg.Payload, - }) - case *CustomIssue: - b.appendReadyMessage(&IssueEvent{ - Type: "custom", - Timestamp: b.timestamp, - MessageID: messageID, - ContextString: msg.Name, - Payload: msg.Payload, - }) - case *Fetch: - b.appendReadyMessage(&FetchEvent{ - MessageID: messageID, - Timestamp: msg.Timestamp, - Method: msg.Method, - URL: msg.URL, - Request: msg.Request, - Response: msg.Response, - Status: msg.Status, - Duration: msg.Duration, - }) - if msg.Status >= 400 { - b.appendReadyMessage(&IssueEvent{ - Type: "bad_request", - MessageID: messageID, - Timestamp: msg.Timestamp, - ContextString: msg.URL, - }) - } - case *GraphQL: - b.appendReadyMessage(&GraphQLEvent{ - MessageID: messageID, - Timestamp: b.timestamp, - OperationKind: msg.OperationKind, - OperationName: msg.OperationName, - Variables: msg.Variables, - Response: msg.Response, - }) - case *StateAction: - b.appendReadyMessage(&StateActionEvent{ - MessageID: messageID, - Timestamp: b.timestamp, - Type: msg.Type, - }) - } - return nil -} - -func (b *builder) checkTimeouts(ts int64) bool { - if b.timestamp == 0 { - return false // There was no timestamp events yet - } - - if b.peBuilder.HasInstance() && int64(b.peBuilder.GetTimestamp())+intervals.EVENTS_PAGE_EVENT_TIMEOUT < ts { - b.buildPageEvent() - } - if b.ieBuilder.HasInstance() && int64(b.ieBuilder.GetTimestamp())+intervals.EVENTS_INPUT_EVENT_TIMEOUT < ts { - b.buildInputEvent() - } - return false -} diff --git a/backend/internal/handlers/custom/pageEventBuilder.go b/backend/internal/handlers/custom/pageEventBuilder.go index 765fd31a2..d95768983 100644 --- a/backend/internal/handlers/custom/pageEventBuilder.go +++ b/backend/internal/handlers/custom/pageEventBuilder.go @@ -4,104 +4,103 @@ import ( . "openreplay/backend/pkg/messages" ) +const PAGE_EVENT_TIMEOUT = 1 * 60 * 1000 + type pageEventBuilder struct { pageEvent *PageEvent firstTimingHandled bool } -func (b *pageEventBuilder) Handle(message Message, messageID uint64, timestamp uint64) Message { - //TODO implement me - panic("implement me") -} - -func (b *pageEventBuilder) Build() Message { - // b.build() - //TODO implement me - panic("implement me") -} - func NewPageEventBuilder() *pageEventBuilder { ieBuilder := &pageEventBuilder{} return ieBuilder } -func (b *pageEventBuilder) buildIfTimingsComplete() *PageEvent { - if b.firstTimingHandled { - return b.build() +func (b *pageEventBuilder) Handle(message Message, messageID uint64, timestamp uint64) Message { + switch msg := message.(type) { + case *SetPageLocation: + if msg.NavigationStart == 0 { // routing without new page loading + return &PageEvent{ + URL: msg.URL, + Referrer: msg.Referrer, + Loaded: false, + MessageID: messageID, + Timestamp: timestamp, + } + } else { + pageEvent := b.Build() + b.pageEvent = &PageEvent{ + URL: msg.URL, + Referrer: msg.Referrer, + Loaded: true, + MessageID: messageID, + Timestamp: timestamp, + } + return pageEvent + } + case *PageLoadTiming: + if b.pageEvent == nil { + break + } + if msg.RequestStart <= 30000 { + b.pageEvent.RequestStart = msg.RequestStart + } + if msg.ResponseStart <= 30000 { + b.pageEvent.ResponseStart = msg.ResponseStart + } + if msg.ResponseEnd <= 30000 { + b.pageEvent.ResponseEnd = msg.ResponseEnd + } + if msg.DomContentLoadedEventStart <= 30000 { + b.pageEvent.DomContentLoadedEventStart = msg.DomContentLoadedEventStart + } + if msg.DomContentLoadedEventEnd <= 30000 { + b.pageEvent.DomContentLoadedEventEnd = msg.DomContentLoadedEventEnd + } + if msg.LoadEventStart <= 30000 { + b.pageEvent.LoadEventStart = msg.LoadEventStart + } + if msg.LoadEventEnd <= 30000 { + b.pageEvent.LoadEventEnd = msg.LoadEventEnd + } + if msg.FirstPaint <= 30000 { + b.pageEvent.FirstPaint = msg.FirstPaint + } + if msg.FirstContentfulPaint <= 30000 { + b.pageEvent.FirstContentfulPaint = msg.FirstContentfulPaint + } + return b.buildIfTimingsComplete() + case *PageRenderTiming: + if b.pageEvent == nil { + break + } + b.pageEvent.SpeedIndex = msg.SpeedIndex + b.pageEvent.VisuallyComplete = msg.VisuallyComplete + b.pageEvent.TimeToInteractive = msg.TimeToInteractive + return b.buildIfTimingsComplete() + + } + + if b.pageEvent != nil && b.pageEvent.Timestamp+PAGE_EVENT_TIMEOUT < timestamp { + return b.Build() } - b.firstTimingHandled = true return nil } -// Only for Loaded: true -func (b *pageEventBuilder) HandleSetPageLocation(msg *SetPageLocation, messageID uint64, timestamp uint64) { - b.pageEvent = &PageEvent{ - URL: msg.URL, - Referrer: msg.Referrer, - Loaded: true, - MessageID: messageID, - Timestamp: timestamp, - } -} - -func (b *pageEventBuilder) HandlePageLoadTiming(msg *PageLoadTiming) *PageEvent { - if !b.HasInstance() { - return nil - } - if msg.RequestStart <= 30000 { - b.pageEvent.RequestStart = msg.RequestStart - } - if msg.ResponseStart <= 30000 { - b.pageEvent.ResponseStart = msg.ResponseStart - } - if msg.ResponseEnd <= 30000 { - b.pageEvent.ResponseEnd = msg.ResponseEnd - } - if msg.DomContentLoadedEventStart <= 30000 { - b.pageEvent.DomContentLoadedEventStart = msg.DomContentLoadedEventStart - } - if msg.DomContentLoadedEventEnd <= 30000 { - b.pageEvent.DomContentLoadedEventEnd = msg.DomContentLoadedEventEnd - } - if msg.LoadEventStart <= 30000 { - b.pageEvent.LoadEventStart = msg.LoadEventStart - } - if msg.LoadEventEnd <= 30000 { - b.pageEvent.LoadEventEnd = msg.LoadEventEnd - } - if msg.FirstPaint <= 30000 { - b.pageEvent.FirstPaint = msg.FirstPaint - } - if msg.FirstContentfulPaint <= 30000 { - b.pageEvent.FirstContentfulPaint = msg.FirstContentfulPaint - } - return b.buildIfTimingsComplete() -} - -func (b *pageEventBuilder) HandlePageRenderTiming(msg *PageRenderTiming) *PageEvent { - if !b.HasInstance() { - return nil - } - b.pageEvent.SpeedIndex = msg.SpeedIndex - b.pageEvent.VisuallyComplete = msg.VisuallyComplete - b.pageEvent.TimeToInteractive = msg.TimeToInteractive - return b.buildIfTimingsComplete() -} - -func (b *pageEventBuilder) HasInstance() bool { - return b.pageEvent != nil -} - -func (b *pageEventBuilder) GetTimestamp() uint64 { +func (b *pageEventBuilder) Build() Message { if b.pageEvent == nil { - return 0 + return nil } - return b.pageEvent.Timestamp -} - -func (b *pageEventBuilder) build() *PageEvent { pageEvent := b.pageEvent b.pageEvent = nil b.firstTimingHandled = false return pageEvent } + +func (b *pageEventBuilder) buildIfTimingsComplete() Message { + if b.firstTimingHandled { + return b.Build() + } + b.firstTimingHandled = true + return nil +} diff --git a/backend/internal/handlers/ios/performanceAggregator.go b/backend/internal/handlers/ios/performanceAggregator.go index 2a9401748..df87298bd 100644 --- a/backend/internal/handlers/ios/performanceAggregator.go +++ b/backend/internal/handlers/ios/performanceAggregator.go @@ -48,7 +48,7 @@ func (h *PerformanceAggregator) Handle(message Message, messageID uint64, timest h.pa.TimestampStart = m.Timestamp } if h.pa.TimestampStart+AGGR_TIME <= m.Timestamp { - event = h.build(m.Timestamp) + event = h.Build() } switch m.Name { case "fps": @@ -89,21 +89,17 @@ func (h *PerformanceAggregator) Handle(message Message, messageID uint64, timest } } case *IOSSessionEnd: - event = h.build(m.Timestamp) + event = h.Build() } return event } func (h *PerformanceAggregator) Build() Message { - return h.build(h.lastTimestamp) -} - -func (h *PerformanceAggregator) build(timestamp uint64) Message { if h.pa == nil { return nil } - h.pa.TimestampEnd = timestamp + h.pa.TimestampEnd = h.lastTimestamp h.pa.AvgFPS = h.fps.aggregate() h.pa.AvgCPU = h.cpu.aggregate() h.pa.AvgMemory = h.memory.aggregate() diff --git a/backend/internal/handlers/web/networkIssue.go b/backend/internal/handlers/web/networkIssue.go new file mode 100644 index 000000000..ed51351e5 --- /dev/null +++ b/backend/internal/handlers/web/networkIssue.go @@ -0,0 +1,47 @@ +package web + +import ( + . "openreplay/backend/pkg/messages" +) + +/* + Handler name: NetworkIssue + Input events: ResourceTiming, + Fetch + Output event: IssueEvent +*/ + +type NetworkIssueDetector struct{} + +func (f *NetworkIssueDetector) Build() Message { + return nil +} + +func (f *NetworkIssueDetector) Handle(message Message, messageID uint64, timestamp uint64) Message { + switch msg := message.(type) { + case *ResourceTiming: + success := msg.Duration != 0 // The only available way here + if !success { + issueType := "missing_resource" + if msg.Initiator == "fetch" || msg.Initiator == "xmlhttprequest" { + issueType = "bad_request" + } + return &IssueEvent{ + Type: issueType, + MessageID: messageID, + Timestamp: msg.Timestamp, + ContextString: msg.URL, + } + } + case *Fetch: + if msg.Status >= 400 { + return &IssueEvent{ + Type: "bad_request", + MessageID: messageID, + Timestamp: msg.Timestamp, + ContextString: msg.URL, + } + } + } + return nil +} diff --git a/backend/pkg/intervals/intervals.go b/backend/pkg/intervals/intervals.go index 649ceca1a..226d79d35 100644 --- a/backend/pkg/intervals/intervals.go +++ b/backend/pkg/intervals/intervals.go @@ -3,8 +3,6 @@ package intervals const EVENTS_COMMIT_INTERVAL = 30 * 1000 // как часто комитим сообщения в кафке (ender) const HEARTBEAT_INTERVAL = 2 * 60 * 1000 // максимальный таймаут от трекера в рамках сессии const INTEGRATIONS_REQUEST_INTERVAL = 1 * 60 * 1000 // интеграции -const EVENTS_PAGE_EVENT_TIMEOUT = 2 * 60 * 1000 // таймаут пейдж ивента -const EVENTS_INPUT_EVENT_TIMEOUT = 2 * 60 * 1000 // const EVENTS_SESSION_END_TIMEOUT = HEARTBEAT_INTERVAL + 30*1000 const EVENTS_SESSION_END_TIMEOUT_WITH_INTEGRATIONS = HEARTBEAT_INTERVAL + 3*60*1000 const EVENTS_BACK_COMMIT_GAP = EVENTS_SESSION_END_TIMEOUT_WITH_INTEGRATIONS + 1*60*1000 // для бэк коммита From 883f7eab8a642ff78a43dde2b1d16b30acbbf017 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Wed, 11 May 2022 23:53:19 +0200 Subject: [PATCH 108/260] fix(tracker-assist):3.5.9: enforce peerjs@1.3.2 --- tracker/tracker-assist/package-lock.json | 62 +++++++++------------ tracker/tracker-assist/package.json | 4 +- tracker/tracker-assist/src/Assist.ts | 1 + tracker/tracker-assist/src/RemoteControl.ts | 2 +- 4 files changed, 30 insertions(+), 39 deletions(-) diff --git a/tracker/tracker-assist/package-lock.json b/tracker/tracker-assist/package-lock.json index f0fd5eb9f..3c159da6d 100644 --- a/tracker/tracker-assist/package-lock.json +++ b/tracker/tracker-assist/package-lock.json @@ -1,16 +1,16 @@ { "name": "@openreplay/tracker-assist", - "version": "3.5.7", + "version": "3.5.8", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@openreplay/tracker-assist", - "version": "3.5.7", + "version": "3.5.8", "license": "MIT", "dependencies": { "csstype": "^3.0.10", - "peerjs": "^1.3.2", + "peerjs": "1.3.2", "socket.io-client": "^4.4.1" }, "devDependencies": { @@ -25,7 +25,7 @@ }, "../tracker": { "name": "@openreplay/tracker", - "version": "3.5.4", + "version": "3.5.11", "dev": true, "license": "MIT", "dependencies": { @@ -644,15 +644,19 @@ } }, "../tracker/node_modules/ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "../tracker/node_modules/ansi-escapes": { @@ -1791,12 +1795,6 @@ "node": ">=6" } }, - "../tracker/node_modules/json5/node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, "../tracker/node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -1853,9 +1851,9 @@ } }, "../tracker/node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "../tracker/node_modules/mkdirp": { @@ -2376,9 +2374,9 @@ } }, "../tracker/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "engines": { "node": ">=6" @@ -4444,9 +4442,9 @@ "requires": {} }, "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -5337,14 +5335,6 @@ "dev": true, "requires": { "minimist": "^1.2.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } } }, "levn": { @@ -5391,9 +5381,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "mkdirp": { @@ -5793,9 +5783,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true } } diff --git a/tracker/tracker-assist/package.json b/tracker/tracker-assist/package.json index 19149b62a..437a86499 100644 --- a/tracker/tracker-assist/package.json +++ b/tracker/tracker-assist/package.json @@ -1,7 +1,7 @@ { "name": "@openreplay/tracker-assist", "description": "Tracker plugin for screen assistance through the WebRTC", - "version": "3.5.8", + "version": "3.5.9", "keywords": [ "WebRTC", "assistance", @@ -25,7 +25,7 @@ }, "dependencies": { "csstype": "^3.0.10", - "peerjs": "^1.3.2", + "peerjs": "1.3.2", "socket.io-client": "^4.4.1" }, "peerDependencies": { diff --git a/tracker/tracker-assist/src/Assist.ts b/tracker/tracker-assist/src/Assist.ts index 24f04e7e0..ab64ab9b2 100644 --- a/tracker/tracker-assist/src/Assist.ts +++ b/tracker/tracker-assist/src/Assist.ts @@ -11,6 +11,7 @@ import AnnotationCanvas from './AnnotationCanvas.js'; import ConfirmWindow, { callConfirmDefault, controlConfirmDefault } from './ConfirmWindow.js'; import type { Options as ConfirmOptions } from './ConfirmWindow.js'; +// TODO: fully specified strict check (everywhere) //@ts-ignore peerjs hack for webpack5 (?!) TODO: ES/node modules; Peer = Peer.default || Peer; diff --git a/tracker/tracker-assist/src/RemoteControl.ts b/tracker/tracker-assist/src/RemoteControl.ts index a32f81035..02137d99f 100644 --- a/tracker/tracker-assist/src/RemoteControl.ts +++ b/tracker/tracker-assist/src/RemoteControl.ts @@ -20,7 +20,7 @@ export default class RemoteControl { reconnect(ids: string[]) { const storedID = sessionStorage.getItem(this.options.session_control_peer_key) - if (storedID !== null && ids.includes(storedID)) { + if (storedID !== null && ids.indexOf(storedID) !== -1) { this.grantControl(storedID) } else { sessionStorage.removeItem(this.options.session_control_peer_key) From ae6af1449c8d30864155859ff3e8f14b1c3f5b9a Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Thu, 12 May 2022 09:59:09 +0200 Subject: [PATCH 109/260] feat(backend-db/heuristics): fixed errors in main files --- backend/cmd/db/main.go | 4 ++-- backend/cmd/heuristics/main.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/cmd/db/main.go b/backend/cmd/db/main.go index d3d786242..20d6ce55b 100644 --- a/backend/cmd/db/main.go +++ b/backend/cmd/db/main.go @@ -31,9 +31,9 @@ func main() { defer pg.Close() // HandlersFabric returns the list of message handlers we want to be applied to each incoming message. - handlersFabric := func() { + handlersFabric := func() []handlers.MessageProcessor { return []handlers.MessageProcessor{ - custom.EventMapper{}, + &custom.EventMapper{}, custom.NewInputEventBuilder(), custom.NewPageEventBuilder(), } diff --git a/backend/cmd/heuristics/main.go b/backend/cmd/heuristics/main.go index 6712c927c..6edf01a92 100644 --- a/backend/cmd/heuristics/main.go +++ b/backend/cmd/heuristics/main.go @@ -26,7 +26,7 @@ func main() { cfg := ender.New() // HandlersFabric returns the list of message handlers we want to be applied to each incoming message. - handlersFabric := func() { + handlersFabric := func() []handlers.MessageProcessor { return []handlers.MessageProcessor{ // web handlers &web.ClickRageDetector{}, From 34947d8ef7c8ba1efd030ab89f70a452b8eb8e88 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Fri, 13 May 2022 11:19:23 +0200 Subject: [PATCH 110/260] change(ui) - validation based on ee --- .../components/Client/Users/components/UserForm/UserForm.tsx | 4 ++-- frontend/app/mstore/types/user.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx b/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx index 25f35097c..a56e62c83 100644 --- a/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx +++ b/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx @@ -94,7 +94,7 @@ function UserForm(props: Props) {
    - { !isEnterprise && ( + { isEnterprise && (
    this.setState({ddOpen: true})} onChange={ this.onInputChange } onBlur={ this.onBlur } - onFocus={ () => this.setState({ddOpen: true})} value={ query } autoFocus={ true } type="text" @@ -163,6 +162,7 @@ class AutoComplete extends React.PureComponent { this.hiddenInput.value = text; pasted = true; // to use only the hidden input } } + autocomplete="do-not-autofill-bad-chrome" />
    {/* */} @@ -175,10 +175,10 @@ class AutoComplete extends React.PureComponent { { headerText && headerText } { options.map(item => ( - this.onItemClick(e, item) } + onClick={ (e) => this.onItemClick(e, item) } /> // this.onItemClick(e, item) } /> )) diff --git a/frontend/app/components/shared/Filters/FilterAutoComplete/FilterAutoComplete.tsx b/frontend/app/components/shared/Filters/FilterAutoComplete/FilterAutoComplete.tsx index a97f3573c..fb0eb4a6b 100644 --- a/frontend/app/components/shared/Filters/FilterAutoComplete/FilterAutoComplete.tsx +++ b/frontend/app/components/shared/Filters/FilterAutoComplete/FilterAutoComplete.tsx @@ -5,7 +5,7 @@ import { debounce } from 'App/utils'; import stl from './FilterAutoComplete.css'; import cn from 'classnames'; -const hiddenStyle = { +const hiddenStyle = { whiteSpace: 'pre-wrap', opacity: 0, position: 'fixed', left: '-3000px' }; @@ -43,8 +43,8 @@ function FilterAutoComplete(props: Props) { const [loading, setLoading] = useState(false) const [options, setOptions] = useState([]); const [query, setQuery] = useState(value); - - const requestValues = (q) => { + + const requestValues = (q) => { setLoading(true); return new APIClient()[method?.toLocaleLowerCase()](endpoint, { ...params, q }) @@ -90,7 +90,7 @@ function FilterAutoComplete(props: Props) { e.preventDefault(); if (query !== item.value) { - setQuery(item.value); + setQuery(item.value); } props.onSelect(e, item); @@ -107,6 +107,7 @@ function FilterAutoComplete(props: Props) { autoFocus={ true } type="text" placeholder={ placeholder } + autoComplete="do-not-autofill-bad-chrome" // onPaste={(e) => { // const text = e.clipboardData.getData('Text'); // // this.hiddenInput.value = text; @@ -139,11 +140,11 @@ function FilterAutoComplete(props: Props) { > { icon && } { item.value } -
    +
    )) }
    - )} + )}
    )} @@ -151,4 +152,4 @@ function FilterAutoComplete(props: Props) { ); } -export default FilterAutoComplete; \ No newline at end of file +export default FilterAutoComplete; From 64ebd07e577aab243c3f72d8b7567d375469c878 Mon Sep 17 00:00:00 2001 From: sylenien Date: Thu, 12 May 2022 16:33:28 +0200 Subject: [PATCH 115/260] added toggler disabled colors, visibility default values, no items warning text to search field --- .../shared/EventFilter/FilterModal/FilterModal.js | 2 +- .../SessionSettings/components/ListingVisibility.tsx | 9 +++++---- frontend/app/components/ui/Toggler/toggler.css | 3 +-- frontend/app/svg/icons/binoculars.svg | 3 +++ 4 files changed, 10 insertions(+), 7 deletions(-) create mode 100644 frontend/app/svg/icons/binoculars.svg diff --git a/frontend/app/components/shared/EventFilter/FilterModal/FilterModal.js b/frontend/app/components/shared/EventFilter/FilterModal/FilterModal.js index cbe8c9546..2b8219894 100644 --- a/frontend/app/components/shared/EventFilter/FilterModal/FilterModal.js +++ b/frontend/app/components/shared/EventFilter/FilterModal/FilterModal.js @@ -119,7 +119,7 @@ export default class FilterModal extends React.PureComponent { return (!displayed ? null : -
    +
    { filteredList.map(category => ( diff --git a/frontend/app/components/shared/SessionSettings/components/ListingVisibility.tsx b/frontend/app/components/shared/SessionSettings/components/ListingVisibility.tsx index d9f137daa..c358f9389 100644 --- a/frontend/app/components/shared/SessionSettings/components/ListingVisibility.tsx +++ b/frontend/app/components/shared/SessionSettings/components/ListingVisibility.tsx @@ -18,7 +18,7 @@ function ListingVisibility(props) { const { settingsStore } = useStore(); const sessionSettings = useObserver(() => settingsStore.sessionSettings) const [durationSettings, setDurationSettings] = React.useState(sessionSettings.durationFilter); - + return ( <>

    Listing Visibility

    @@ -27,7 +27,7 @@ function ListingVisibility(props) {
    { setDurationSettings({ ...durationSettings, countType: value }); @@ -67,4 +68,4 @@ function ListingVisibility(props) { ); } -export default ListingVisibility; \ No newline at end of file +export default ListingVisibility; diff --git a/frontend/app/components/ui/Toggler/toggler.css b/frontend/app/components/ui/Toggler/toggler.css index cf9cf0838..6d5fae271 100644 --- a/frontend/app/components/ui/Toggler/toggler.css +++ b/frontend/app/components/ui/Toggler/toggler.css @@ -39,12 +39,10 @@ width: 20px; left: 0; bottom: -2px; - /* background-color: white; */ transition: .4s; border-radius: 50%; border: solid 1px rgba(0, 0, 0, 0.2); - background: #394EFF; box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px rgba(0, 0, 0, 0.14), 0px 1px 3px rgba(0, 0, 0, 0.12); } @@ -55,6 +53,7 @@ .slider.checked:before { border: solid 1px $teal; + background-color: $teal !important; transform: translateX(15px); } diff --git a/frontend/app/svg/icons/binoculars.svg b/frontend/app/svg/icons/binoculars.svg new file mode 100644 index 000000000..47bca444f --- /dev/null +++ b/frontend/app/svg/icons/binoculars.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file From 0d00cf0349fa8edd179bac80a95f00a70db963d5 Mon Sep 17 00:00:00 2001 From: sylenien Date: Thu, 12 May 2022 16:34:11 +0200 Subject: [PATCH 116/260] more search field fixes --- .../Filters/FilterModal/FilterModal.tsx | 17 +++++--- .../LiveFilterModal/LiveFilterModal.tsx | 39 +++++++++++++++++-- .../components/DefaultTimezone.tsx | 13 +++++-- 3 files changed, 57 insertions(+), 12 deletions(-) diff --git a/frontend/app/components/shared/Filters/FilterModal/FilterModal.tsx b/frontend/app/components/shared/Filters/FilterModal/FilterModal.tsx index 04688de6b..a11695d5c 100644 --- a/frontend/app/components/shared/Filters/FilterModal/FilterModal.tsx +++ b/frontend/app/components/shared/Filters/FilterModal/FilterModal.tsx @@ -15,7 +15,7 @@ interface Props { searchQuery?: string, } function FilterModal(props: Props) { - const { + const { filters, metaOptions, onFilterClick = () => null, @@ -32,13 +32,20 @@ function FilterModal(props: Props) { _filter.value = [filter.value]; onFilterClick(_filter); } - + + const isResultEmpty = !filterSearchList || Object.keys(filterSearchList).length === 0 return (
    + { showSearchList && (
    - { filterSearchList && Object.keys(filterSearchList).map((key, index) => { + {isResultEmpty && !fetchingFilterSearchList ? ( +
    + +
    No Suggestions Found
    +
    + ) : Object.keys(filterSearchList).map((key, index) => { const filter = filterSearchList[key]; const option = filtersMap[key]; return option ? ( @@ -65,7 +72,7 @@ function FilterModal(props: Props) {
    )} - + { !hasSearchQuery && (
    {filters && Object.keys(filters).map((key) => ( @@ -92,4 +99,4 @@ export default connect(state => ({ filterSearchList: state.getIn([ 'search', 'filterSearchList' ]), metaOptions: state.getIn([ 'customFields', 'list' ]), fetchingFilterSearchList: state.getIn([ 'search', 'fetchFilterSearch', 'loading' ]), -}))(FilterModal); \ No newline at end of file +}))(FilterModal); diff --git a/frontend/app/components/shared/Filters/LiveFilterModal/LiveFilterModal.tsx b/frontend/app/components/shared/Filters/LiveFilterModal/LiveFilterModal.tsx index c75d0f4ca..b00897add 100644 --- a/frontend/app/components/shared/Filters/LiveFilterModal/LiveFilterModal.tsx +++ b/frontend/app/components/shared/Filters/LiveFilterModal/LiveFilterModal.tsx @@ -15,7 +15,7 @@ interface Props { searchQuery?: string, } function LiveFilterModal(props: Props) { - const { + const { filters, metaOptions, onFilterClick = () => null, @@ -32,7 +32,9 @@ function LiveFilterModal(props: Props) { _filter.value = [filter.value]; onFilterClick(_filter); } - + + const isResultEmpty = !filterSearchList || Object.keys(filterSearchList).filter(i => filtersMap[i].isLive).length === 0 + return (
    { showSearchList && ( @@ -62,10 +64,39 @@ function LiveFilterModal(props: Props) {
    ); })} + {isResultEmpty && !fetchingFilterSearchList ? ( +
    + +
    No Suggestions Found
    +
    + ) : Object.keys(filterSearchList).filter(i => filtersMap[i].isLive).map((key, index) => { + const filter = filterSearchList[key]; + const option = filtersMap[key]; + return ( +
    +
    {option.label}
    +
    + {filter.map((f, i) => ( +
    onFilterSearchClick({ type: key, value: f.value })} + > + +
    {f.value}
    +
    + ))} +
    +
    + ); + })}
    )} - + { !hasSearchQuery && (
    {filters && Object.keys(filters).map((key) => ( @@ -92,4 +123,4 @@ export default connect(state => ({ filterSearchList: state.getIn([ 'search', 'filterSearchList' ]), metaOptions: state.getIn([ 'customFields', 'list' ]), fetchingFilterSearchList: state.getIn([ 'search', 'fetchFilterSearch', 'loading' ]), -}))(LiveFilterModal); \ No newline at end of file +}))(LiveFilterModal); diff --git a/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx b/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx index efb91fed9..8e6edee88 100644 --- a/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx +++ b/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx @@ -6,8 +6,15 @@ import { useObserver } from 'mobx-react-lite'; const str = new Date().toString().match(/([A-Z]+[\+-][0-9]+)/) const d = str && str[1] || 'UTC'; + +const localMachineFormat = new Date().toString().match(/([A-Z]+[\+-][0-9]+)/) +const middlePoint = localMachineFormat && localMachineFormat[1].length - 2 +const readableLocalTimezone = localMachineFormat && middlePoint ? + `${localMachineFormat[1].substring(0, 3)} ${localMachineFormat[1].substring(3, middlePoint)}:${localMachineFormat[1].substring(middlePoint)}` + : null + const timezoneOptions = [ - { label: d, value: 'local' }, + { label: readableLocalTimezone, value: 'local' }, { label: 'UTC', value: 'UTC' }, ] @@ -38,9 +45,9 @@ function DefaultTimezone(props) { }}>Update
    -
    This change will impact the timestamp on session card and player.
    +
    This change will impact the timestamp on session card and player.
    ); } -export default DefaultTimezone; \ No newline at end of file +export default DefaultTimezone; From be13ff5f7a6768b3b748cd9a12137451ca4e3c5a Mon Sep 17 00:00:00 2001 From: sylenien Date: Fri, 13 May 2022 13:32:01 +0200 Subject: [PATCH 117/260] fix(ui): fixed sessionitem and timezone dropdown connection to mobx --- .../shared/SessionItem/SessionItem.js | 162 ----------------- .../shared/SessionItem/SessionItem.tsx | 163 ++++++++++-------- .../shared/SessionItem/{index.js => index.ts} | 0 .../shared/SessionItem/sessionItem.css | 20 ++- .../components/DefaultTimezone.tsx | 47 +++-- frontend/app/date.ts | 20 ++- 6 files changed, 155 insertions(+), 257 deletions(-) delete mode 100644 frontend/app/components/shared/SessionItem/SessionItem.js rename frontend/app/components/shared/SessionItem/{index.js => index.ts} (100%) diff --git a/frontend/app/components/shared/SessionItem/SessionItem.js b/frontend/app/components/shared/SessionItem/SessionItem.js deleted file mode 100644 index 6222327f3..000000000 --- a/frontend/app/components/shared/SessionItem/SessionItem.js +++ /dev/null @@ -1,162 +0,0 @@ -import { connect } from 'react-redux'; -import cn from 'classnames'; -import { - Link, - Icon, - CountryFlag, - Avatar, - TextEllipsis, - Label, -} from 'UI'; -import { toggleFavorite, setSessionPath } from 'Duck/sessions'; -import { session as sessionRoute, liveSession as liveSessionRoute, withSiteId } from 'App/routes'; -import { durationFormatted, formatTimeOrDate } from 'App/date'; -import stl from './sessionItem.css'; -import Counter from './Counter' -import { withRouter } from 'react-router-dom'; -import SessionMetaList from './SessionMetaList'; -import PlayLink from './PlayLink'; -import ErrorBars from './ErrorBars'; -import { assist as assistRoute, liveSession, sessions as sessionsRoute, isRoute } from "App/routes"; -import { capitalize } from 'App/utils'; - -const ASSIST_ROUTE = assistRoute(); -const ASSIST_LIVE_SESSION = liveSession() -const SESSIONS_ROUTE = sessionsRoute(); - -@connect(state => ({ - timezone: state.getIn(['sessions', 'timezone']), - siteId: state.getIn([ 'site', 'siteId' ]), -}), { toggleFavorite, setSessionPath }) -@withRouter -export default class SessionItem extends React.PureComponent { - // eslint-disable-next-line complexity - render() { - const { - session: { - sessionId, - userBrowser, - userOs, - userId, - userAnonymousId, - userDisplayName, - userCountry, - startedAt, - duration, - eventsCount, - errorsCount, - pagesCount, - viewed, - favorite, - userDeviceType, - userUuid, - userNumericHash, - live, - metadata, - userSessionsCount, - issueTypes, - active, - }, - timezone, - onUserClick = () => null, - hasUserFilter = false, - disableUser = false, - metaList = [], - showActive = false, - lastPlayedSessionId, - } = this.props; - const formattedDuration = durationFormatted(duration); - const hasUserId = userId || userAnonymousId; - const isSessions = isRoute(SESSIONS_ROUTE, this.props.location.pathname); - const isAssist = isRoute(ASSIST_ROUTE, this.props.location.pathname) || isRoute(ASSIST_LIVE_SESSION, this.props.location.pathname); - const isLastPlayed = lastPlayedSessionId === sessionId; - - const _metaList = Object.keys(metadata).filter(i => metaList.includes(i)).map(key => { - const value = metadata[key]; - return { label: key, value }; - }); - - return ( -
    -
    -
    -
    -
    -
    -
    (!disableUser && !hasUserFilter) && onUserClick(userId, userAnonymousId)} - > - -
    -
    -
    -
    -
    {formatTimeOrDate(startedAt, timezone) }
    -
    - {!isAssist && ( - <> -
    - { eventsCount } - { eventsCount === 0 || eventsCount > 1 ? 'Events' : 'Event' } -
    -
    ·
    - - )} -
    { live ? : formattedDuration }
    -
    -
    -
    - -
    - - - -
    ·
    - - - -
    ·
    - - - -
    -
    - { isSessions && ( -
    - -
    - )} -
    - -
    - { isAssist && showActive && ( - - )} -
    - { isSessions && ( -
    - { isLastPlayed && ( - - )} -
    - )} - -
    -
    -
    - { _metaList.length > 0 && ( - - )} -
    - ); - } -} \ No newline at end of file diff --git a/frontend/app/components/shared/SessionItem/SessionItem.tsx b/frontend/app/components/shared/SessionItem/SessionItem.tsx index dc51bfc17..f00f58c82 100644 --- a/frontend/app/components/shared/SessionItem/SessionItem.tsx +++ b/frontend/app/components/shared/SessionItem/SessionItem.tsx @@ -1,90 +1,112 @@ -import React from 'react'; -import { connect } from 'react-redux'; +import React from 'react' import cn from 'classnames'; -import { - Link, - Icon, +import { CountryFlag, Avatar, TextEllipsis, Label, } from 'UI'; -import { toggleFavorite, setSessionPath } from 'Duck/sessions'; -import { session as sessionRoute, liveSession as liveSessionRoute, withSiteId } from 'App/routes'; +import { useStore } from 'App/mstore'; +import { observer } from 'mobx-react-lite'; import { durationFormatted, formatTimeOrDate } from 'App/date'; import stl from './sessionItem.css'; import Counter from './Counter' -import { withRouter } from 'react-router-dom'; +import { withRouter, RouteComponentProps } from 'react-router-dom'; import SessionMetaList from './SessionMetaList'; +import PlayLink from './PlayLink'; import ErrorBars from './ErrorBars'; import { assist as assistRoute, liveSession, sessions as sessionsRoute, isRoute } from "App/routes"; import { capitalize } from 'App/utils'; -import { SKIP_TO_ISSUE, TIMEZONE, DURATION_FILTER } from 'App/constants/storageKeys' const ASSIST_ROUTE = assistRoute(); const ASSIST_LIVE_SESSION = liveSession() const SESSIONS_ROUTE = sessionsRoute(); -// @connect(state => ({ -// timezone: state.getIn(['sessions', 'timezone']), -// siteId: state.getIn([ 'site', 'siteId' ]), -// }), { toggleFavorite, setSessionPath }) -// @withRouter -function SessionItem(props) { - // render() { - const { - session: { - sessionId, - userBrowser, - userOs, - userId, - userAnonymousId, - userDisplayName, - userCountry, - startedAt, - duration, - eventsCount, - errorsCount, - pagesCount, - viewed, - favorite, - userDeviceType, - userUuid, - userNumericHash, - live, - metadata, - userSessionsCount, - issueTypes, - active, - }, - timezone, - onUserClick = () => null, - hasUserFilter = false, - disableUser = false, - metaList = [], - showActive = false, - lastPlayedSessionId, - } = props; - const formattedDuration = durationFormatted(duration); - const hasUserId = userId || userAnonymousId; - const isSessions = isRoute(SESSIONS_ROUTE, props.location.pathname); - const isAssist = isRoute(ASSIST_ROUTE, props.location.pathname) || isRoute(ASSIST_LIVE_SESSION, props.location.pathname); - const isLastPlayed = lastPlayedSessionId === sessionId; +interface Props { + session: { + sessionId: string; + userBrowser: string; + userOs: string; + userId: string; + userAnonymousId: string; + userDisplayName: string; + userCountry: string; + startedAt: number; + duration: string; + eventsCount: number; + errorsCount: number; + pagesCount: number; + viewed: boolean; + favorite: boolean; + userDeviceType: string; + userUuid: string; + userNumericHash: number; + live: boolean + metadata: Record; + userSessionsCount: number + issueTypes: []; + active: boolean; + onUserClick: (userId: string, userAnonymousId: string) => null; + hasUserFilter: boolean; + disableUser: boolean; + metaList: Array; + showActive: boolean; + lastPlayedSessionId: string; + }, +} - const _metaList = Object.keys(metadata).filter(i => metaList.includes(i)).map(key => { - const value = metadata[key]; - return { label: key, value }; - }); +function SessionItem(props: RouteComponentProps) { + const { settingsStore } = useStore(); + const { timezone } = settingsStore.sessionSettings; - return ( -
    + const { + session: { + sessionId, + userBrowser, + userOs, + userId, + userAnonymousId, + userDisplayName, + userCountry, + startedAt, + duration, + eventsCount, + viewed, + userDeviceType, + userNumericHash, + live, + metadata, + issueTypes, + active, + }, + onUserClick = () => null, + hasUserFilter = false, + disableUser = false, + metaList = [], + showActive = false, + lastPlayedSessionId, + } = props; + + const formattedDuration = durationFormatted(duration); + const hasUserId = userId || userAnonymousId; + const isSessions = isRoute(SESSIONS_ROUTE, props.location.pathname); + const isAssist = isRoute(ASSIST_ROUTE, props.location.pathname) || isRoute(ASSIST_LIVE_SESSION, props.location.pathname); + const isLastPlayed = lastPlayedSessionId === sessionId; + + const _metaList = Object.keys(metadata).filter(i => metaList.includes(i)).map(key => { + const value = metadata[key]; + return { label: key, value }; + }); + + return ( +
    (!disableUser && !hasUserFilter) && onUserClick(userId, userAnonymousId)} > @@ -111,7 +133,7 @@ function SessionItem(props) {
    - +
    ·
    @@ -145,9 +167,11 @@ function SessionItem(props) { )}
    )} - - - +
    @@ -155,10 +179,7 @@ function SessionItem(props) { )}
    - ); - } + ) +} -export default connect(state => ({ - timezone: localStorage.getItem(TIMEZONE) || '', - siteId: state.getIn([ 'site', 'siteId' ]), -}), { toggleFavorite, setSessionPath })(withRouter(SessionItem)); \ No newline at end of file +export default withRouter(observer(SessionItem)) diff --git a/frontend/app/components/shared/SessionItem/index.js b/frontend/app/components/shared/SessionItem/index.ts similarity index 100% rename from frontend/app/components/shared/SessionItem/index.js rename to frontend/app/components/shared/SessionItem/index.ts diff --git a/frontend/app/components/shared/SessionItem/sessionItem.css b/frontend/app/components/shared/SessionItem/sessionItem.css index cb7b87c3a..897ee327f 100644 --- a/frontend/app/components/shared/SessionItem/sessionItem.css +++ b/frontend/app/components/shared/SessionItem/sessionItem.css @@ -1,11 +1,9 @@ -@import 'mixins.css'; - .sessionItem { background-color: #fff; - @mixin defaultHover; user-select: none; border-radius: 3px; border: solid thin #EEEEEE; + transition: all 0.4s; & .favorite { opacity: 0; @@ -15,6 +13,10 @@ } &:hover { + background-color: $active-blue; + border: solid thin $active-blue-border; + transition: all 0.2s; + & .playLink { transition: all 0.4s; opacity: 1; @@ -103,7 +105,11 @@ letter-spacing: 1px; } -.userName:hover { - text-decoration: underline; - text-decoration-color: $teal; -} \ No newline at end of file +.userName { + text-decoration: none; + + &:hover { + text-decoration: underline; + text-decoration-color: $teal; + } +} diff --git a/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx b/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx index 8e6edee88..1f1299025 100644 --- a/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx +++ b/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx @@ -5,24 +5,49 @@ import { useStore } from 'App/mstore'; import { useObserver } from 'mobx-react-lite'; const str = new Date().toString().match(/([A-Z]+[\+-][0-9]+)/) -const d = str && str[1] || 'UTC'; -const localMachineFormat = new Date().toString().match(/([A-Z]+[\+-][0-9]+)/) -const middlePoint = localMachineFormat && localMachineFormat[1].length - 2 -const readableLocalTimezone = localMachineFormat && middlePoint ? - `${localMachineFormat[1].substring(0, 3)} ${localMachineFormat[1].substring(3, middlePoint)}:${localMachineFormat[1].substring(middlePoint)}` - : null +interface TimezonesDropdownValue { + label: string; + value: string; +} +type TimezonesDropdown = TimezonesDropdownValue[] -const timezoneOptions = [ - { label: readableLocalTimezone, value: 'local' }, - { label: 'UTC', value: 'UTC' }, -] +const generateGMTZones = (): TimezonesDropdown => { + const timezones: TimezonesDropdown = [] + + const positiveNumbers = [...Array(12).keys()]; + const negativeNumbers = [...Array(12).keys()].reverse(); + negativeNumbers.pop(); // remove trailing zero since we have on in positive numbers array + + const combinedArray = [...negativeNumbers, ...positiveNumbers]; + + for (let i = 0; i < 23; i++) { + let symbol = i < 11 ? '-' : '+'; + let isUTC = i === 11 + let prefix = isUTC ? 'UTC / GMT' : 'GMT'; + let value = String(combinedArray[i]).padStart(2, '0'); + + let tz = `${prefix} ${symbol}${String(combinedArray[i]).padStart(2, '0')}:00` + + let dropdownValue = `UTC${symbol}${value}` + timezones.push({ label: tz, value: isUTC ? 'UTC' : dropdownValue }) + } + + timezones.splice(17, 0, { label: 'GMT +05:30', value: 'GMT +05:30' }) + return timezones +} + +const timezoneOptions: TimezonesDropdown = [...generateGMTZones()] function DefaultTimezone(props) { const [changed, setChanged] = React.useState(false); const { settingsStore } = useStore(); const [timezone, setTimezone] = React.useState(settingsStore.sessionSettings.timezone); - const sessionSettings = useObserver(() => settingsStore.sessionSettings) + const sessionSettings = useObserver(() => settingsStore.sessionSettings); + + useEffect(() => { + if (!timezone) setTimezone('local'); + }, []); return ( <> diff --git a/frontend/app/date.ts b/frontend/app/date.ts index 8a9501a86..e32704db1 100644 --- a/frontend/app/date.ts +++ b/frontend/app/date.ts @@ -20,7 +20,7 @@ export const durationFormatted = (duration: Duration):string => { export function durationFromMsFormatted(ms: number): string { return durationFormatted(Duration.fromMillis(ms || 0)); -} +} export const durationFormattedFull = (duration: Duration): string => { if (duration.as('minutes') < 1) { // show in seconds @@ -35,7 +35,7 @@ export const durationFormattedFull = (duration: Duration): string => { } else if (duration.as('months') < 1) { // show in days and hours let d = duration.toFormat('d'); duration = d + (d > 1 ? ' days' : ' day'); - } else { + } else { let d = Math.trunc(duration.as('months')); duration = d + (d > 1 ? ' months' : ' month');; } @@ -49,7 +49,7 @@ export const msToSec = (ms:number): number => Math.round(ms / 1000); export const diffFromNowString = (ts:number): string => durationFormattedFull(DateTime.fromMillis(Date.now()).diff(DateTime.fromMillis(ts))); -export const diffFromNowShortString = (ts: number): string => +export const diffFromNowShortString = (ts: number): string => durationFormatted(DateTime.fromMillis(Date.now()).diff(DateTime.fromMillis(ts))); export const getDateFromMill = date => @@ -69,11 +69,19 @@ export function formatDateTimeDefault(timestamp: number): string { return isToday(date) ? 'Today' : date.toFormat('LLL dd, yyyy') + ', ' + date.toFormat('hh:mm a') } +/** + * Formats timestamps into readable date + * @param {Number} timestamp + * @param {String} timezone fixed offset like UTC+6 + * @returns {String} formatted date (or time if its today) + */ export function formatTimeOrDate(timestamp: number, timezone: string): string { var date = DateTime.fromMillis(timestamp) - if (timezone === 'UTC') - date = date.toUTC(); - + if (timezone) { + if (timezone === 'UTC') date = date.toUTC(); + date = date.setZone(timezone) + } + return isToday(date) ? date.toFormat('hh:mm a') : date.toFormat('LLL dd, yyyy, hh:mm a'); } From 19178807f8cc341cc14f087c1daad487534dd2d9 Mon Sep 17 00:00:00 2001 From: sylenien Date: Fri, 13 May 2022 13:35:27 +0200 Subject: [PATCH 118/260] fix(ui): fixed sessionitem types and removed withrouter connection --- .../components/shared/SessionItem/SessionItem.tsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/frontend/app/components/shared/SessionItem/SessionItem.tsx b/frontend/app/components/shared/SessionItem/SessionItem.tsx index f00f58c82..d8e485fbb 100644 --- a/frontend/app/components/shared/SessionItem/SessionItem.tsx +++ b/frontend/app/components/shared/SessionItem/SessionItem.tsx @@ -11,7 +11,7 @@ import { observer } from 'mobx-react-lite'; import { durationFormatted, formatTimeOrDate } from 'App/date'; import stl from './sessionItem.css'; import Counter from './Counter' -import { withRouter, RouteComponentProps } from 'react-router-dom'; +import { useLocation, RouteComponentProps } from 'react-router-dom'; import SessionMetaList from './SessionMetaList'; import PlayLink from './PlayLink'; import ErrorBars from './ErrorBars'; @@ -55,7 +55,7 @@ interface Props { }, } -function SessionItem(props: RouteComponentProps) { +function SessionItem(props: Props) { const { settingsStore } = useStore(); const { timezone } = settingsStore.sessionSettings; @@ -87,10 +87,14 @@ function SessionItem(props: RouteComponentProps) { lastPlayedSessionId, } = props; + const location = useLocation(); + + console.log(location.pathname); + const formattedDuration = durationFormatted(duration); const hasUserId = userId || userAnonymousId; - const isSessions = isRoute(SESSIONS_ROUTE, props.location.pathname); - const isAssist = isRoute(ASSIST_ROUTE, props.location.pathname) || isRoute(ASSIST_LIVE_SESSION, props.location.pathname); + const isSessions = isRoute(SESSIONS_ROUTE, location.pathname); + const isAssist = isRoute(ASSIST_ROUTE, location.pathname) || isRoute(ASSIST_LIVE_SESSION, location.pathname); const isLastPlayed = lastPlayedSessionId === sessionId; const _metaList = Object.keys(metadata).filter(i => metaList.includes(i)).map(key => { @@ -182,4 +186,4 @@ function SessionItem(props: RouteComponentProps) { ) } -export default withRouter(observer(SessionItem)) +export default observer(SessionItem) From e7a31dbb8c8f00b9f941e31d345b39198ce7a6d2 Mon Sep 17 00:00:00 2001 From: sylenien Date: Fri, 13 May 2022 13:39:49 +0200 Subject: [PATCH 119/260] fix(ui): refactor sessionitem --- .../shared/SessionItem/SessionItem.tsx | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/frontend/app/components/shared/SessionItem/SessionItem.tsx b/frontend/app/components/shared/SessionItem/SessionItem.tsx index d8e485fbb..09eae802f 100644 --- a/frontend/app/components/shared/SessionItem/SessionItem.tsx +++ b/frontend/app/components/shared/SessionItem/SessionItem.tsx @@ -46,13 +46,13 @@ interface Props { userSessionsCount: number issueTypes: []; active: boolean; - onUserClick: (userId: string, userAnonymousId: string) => null; - hasUserFilter: boolean; - disableUser: boolean; - metaList: Array; - showActive: boolean; - lastPlayedSessionId: string; }, + onUserClick: (userId: string, userAnonymousId: string) => null; + hasUserFilter: boolean; + disableUser: boolean; + metaList: Array; + showActive: boolean; + lastPlayedSessionId: string; } function SessionItem(props: Props) { @@ -60,25 +60,7 @@ function SessionItem(props: Props) { const { timezone } = settingsStore.sessionSettings; const { - session: { - sessionId, - userBrowser, - userOs, - userId, - userAnonymousId, - userDisplayName, - userCountry, - startedAt, - duration, - eventsCount, - viewed, - userDeviceType, - userNumericHash, - live, - metadata, - issueTypes, - active, - }, + session, onUserClick = () => null, hasUserFilter = false, disableUser = false, @@ -87,6 +69,25 @@ function SessionItem(props: Props) { lastPlayedSessionId, } = props; + const { + sessionId, + userBrowser, + userOs, + userId, + userAnonymousId, + userDisplayName, + userCountry, + startedAt, + duration, + eventsCount, + viewed, + userDeviceType, + userNumericHash, + live, + metadata, + issueTypes, + active, + } = session; const location = useLocation(); console.log(location.pathname); From cea121861367bc8a2ac563a4f1f82d56880bb775 Mon Sep 17 00:00:00 2001 From: sylenien Date: Fri, 13 May 2022 13:55:01 +0200 Subject: [PATCH 120/260] fix(ui): fix typo in comment --- .../shared/SessionSettings/components/DefaultTimezone.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx b/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx index 1f1299025..2332b62da 100644 --- a/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx +++ b/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx @@ -17,7 +17,7 @@ const generateGMTZones = (): TimezonesDropdown => { const positiveNumbers = [...Array(12).keys()]; const negativeNumbers = [...Array(12).keys()].reverse(); - negativeNumbers.pop(); // remove trailing zero since we have on in positive numbers array + negativeNumbers.pop(); // remove trailing zero since we have one in positive numbers array const combinedArray = [...negativeNumbers, ...positiveNumbers]; From d72f47b2964a6c491aadf3b1398fe46510e63b58 Mon Sep 17 00:00:00 2001 From: sylenien Date: Fri, 13 May 2022 15:35:22 +0200 Subject: [PATCH 121/260] fix(ui): fix prop types for sessionitem --- .../LiveSessionList/LiveSessionList.tsx | 14 ++++++------ .../shared/SessionItem/SessionItem.tsx | 22 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/frontend/app/components/shared/LiveSessionList/LiveSessionList.tsx b/frontend/app/components/shared/LiveSessionList/LiveSessionList.tsx index b0dbd80ac..ab6f0c662 100644 --- a/frontend/app/components/shared/LiveSessionList/LiveSessionList.tsx +++ b/frontend/app/components/shared/LiveSessionList/LiveSessionList.tsx @@ -20,14 +20,14 @@ const PER_PAGE = 10; interface Props { loading: Boolean, - list: List, + list: List, fetchLiveList: () => Promise, applyFilter: () => void, filters: any, addAttribute: (obj) => void, addFilterByKeyAndValue: (key: FilterKey, value: string) => void, updateCurrentPage: (page: number) => void, - currentPage: number, + currentPage: number, metaList: any, updateSort: (sort: any) => void, sort: any, @@ -41,7 +41,7 @@ function LiveSessionList(props: Props) { const sortOptions = metaList.map(i => ({ text: capitalize(i), value: i })).toJS(); - + // const displayedCount = Math.min(currentPage * PER_PAGE, sessions.size); // const addPage = () => props.updateCurrentPage(props.currentPage + 1) @@ -69,7 +69,7 @@ function LiveSessionList(props: Props) { if (filter.key === FilterKey.USERID) { const _userId = session.userId ? session.userId.toLowerCase() : ''; hasValidFilter = _values.length > 0 ? (_values.includes(_userId) && hasValidFilter) || _values.some(i => _userId.includes(i)) : hasValidFilter; - } + } if (filter.category === FilterCategory.METADATA) { const _source = session.metadata[filter.key] ? session.metadata[filter.key].toLowerCase() : ''; hasValidFilter = _values.length > 0 ? (_values.includes(_source) && hasValidFilter) || _values.some(i => _source.includes(i)) : hasValidFilter; @@ -80,7 +80,7 @@ function LiveSessionList(props: Props) { setSessions(filteredSessions); }, [filters, list]); - useEffect(() => { + useEffect(() => { props.fetchLiveList(); timeout(); return () => { @@ -88,7 +88,7 @@ function LiveSessionList(props: Props) { } }, []) - const onUserClick = (userId, userAnonymousId) => { + const onUserClick = (userId: string, userAnonymousId: string) => { if (userId) { props.addFilterByKeyAndValue(FilterKey.USERID, userId); } else { @@ -183,7 +183,7 @@ export default withPermissions(['ASSIST_LIVE'])(connect( metaList: state.getIn(['customFields', 'list']).map(i => i.key), sort: state.getIn(['liveSearch', 'sort']), }), - { + { fetchLiveList, applyFilter, addAttribute, diff --git a/frontend/app/components/shared/SessionItem/SessionItem.tsx b/frontend/app/components/shared/SessionItem/SessionItem.tsx index 09eae802f..7129a04c0 100644 --- a/frontend/app/components/shared/SessionItem/SessionItem.tsx +++ b/frontend/app/components/shared/SessionItem/SessionItem.tsx @@ -11,7 +11,7 @@ import { observer } from 'mobx-react-lite'; import { durationFormatted, formatTimeOrDate } from 'App/date'; import stl from './sessionItem.css'; import Counter from './Counter' -import { useLocation, RouteComponentProps } from 'react-router-dom'; +import { withRouter, RouteComponentProps } from 'react-router-dom'; import SessionMetaList from './SessionMetaList'; import PlayLink from './PlayLink'; import ErrorBars from './ErrorBars'; @@ -47,15 +47,16 @@ interface Props { issueTypes: []; active: boolean; }, - onUserClick: (userId: string, userAnonymousId: string) => null; - hasUserFilter: boolean; - disableUser: boolean; - metaList: Array; - showActive: boolean; - lastPlayedSessionId: string; + onUserClick?: (userId: string, userAnonymousId: string) => void; + hasUserFilter?: boolean; + disableUser?: boolean; + metaList?: Array; + showActive?: boolean; + lastPlayedSessionId?: string; + live?: boolean; } -function SessionItem(props: Props) { +function SessionItem(props: RouteComponentProps) { const { settingsStore } = useStore(); const { timezone } = settingsStore.sessionSettings; @@ -88,9 +89,8 @@ function SessionItem(props: Props) { issueTypes, active, } = session; - const location = useLocation(); - console.log(location.pathname); + const location = props.location; const formattedDuration = durationFormatted(duration); const hasUserId = userId || userAnonymousId; @@ -187,4 +187,4 @@ function SessionItem(props: Props) { ) } -export default observer(SessionItem) +export default withRouter(observer(SessionItem)) From 58397e6c6c7188d49af72a2d662747dbde0a52cd Mon Sep 17 00:00:00 2001 From: sylenien Date: Fri, 13 May 2022 15:36:24 +0200 Subject: [PATCH 122/260] fix(ui): remove attrs from icons --- frontend/app/svg/icons/binoculars.svg | 4 ++-- frontend/app/svg/icons/filters/arrow-return-right.svg | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/app/svg/icons/binoculars.svg b/frontend/app/svg/icons/binoculars.svg index 47bca444f..e85d493b3 100644 --- a/frontend/app/svg/icons/binoculars.svg +++ b/frontend/app/svg/icons/binoculars.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/frontend/app/svg/icons/filters/arrow-return-right.svg b/frontend/app/svg/icons/filters/arrow-return-right.svg index 228e24b4a..bbdcd41f7 100644 --- a/frontend/app/svg/icons/filters/arrow-return-right.svg +++ b/frontend/app/svg/icons/filters/arrow-return-right.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + From 44dae11886839152c84ce6f01218aa7be9e07f27 Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Fri, 13 May 2022 17:00:09 +0200 Subject: [PATCH 123/260] feat(backend/db): fixed ee version --- backend/cmd/db/main.go | 8 +-- backend/internal/datasaver/stats.go | 8 +++ ee/backend/internal/datasaver/stats.go | 79 ++++++++++++++++++++++++ ee/backend/services/db/stats.go | 83 -------------------------- 4 files changed, 91 insertions(+), 87 deletions(-) create mode 100644 ee/backend/internal/datasaver/stats.go delete mode 100644 ee/backend/services/db/stats.go diff --git a/backend/cmd/db/main.go b/backend/cmd/db/main.go index 20d6ce55b..1c1d3bf0e 100644 --- a/backend/cmd/db/main.go +++ b/backend/cmd/db/main.go @@ -44,6 +44,7 @@ func main() { // Init modules saver := datasaver.New(pg) + saver.InitStats() statsLogger := logger.NewQueueStats(cfg.LoggerTimeout) // Handler logic @@ -117,10 +118,9 @@ func main() { os.Exit(0) case <-commitTick: pg.CommitBatches() - // TODO: ee commit stats !!! - //if err := commitStats(); err != nil { - // log.Printf("Error on stats commit: %v", err) - //} + if err := saver.CommitStats(); err != nil { + log.Printf("Error on stats commit: %v", err) + } // TODO?: separate stats & regular messages if err := consumer.Commit(); err != nil { log.Printf("Error on consumer commit: %v", err) diff --git a/backend/internal/datasaver/stats.go b/backend/internal/datasaver/stats.go index a57d91824..26efe51b5 100644 --- a/backend/internal/datasaver/stats.go +++ b/backend/internal/datasaver/stats.go @@ -5,6 +5,10 @@ import ( . "openreplay/backend/pkg/messages" ) +func (si *Saver) InitStats() { + // noop +} + func (si *Saver) InsertStats(session *Session, msg Message) error { switch m := msg.(type) { // Web @@ -17,3 +21,7 @@ func (si *Saver) InsertStats(session *Session, msg Message) error { } return nil } + +func (si *Saver) CommitStats() error { + return nil +} diff --git a/ee/backend/internal/datasaver/stats.go b/ee/backend/internal/datasaver/stats.go new file mode 100644 index 000000000..501a861aa --- /dev/null +++ b/ee/backend/internal/datasaver/stats.go @@ -0,0 +1,79 @@ +package datasaver + +import ( + "log" + "time" + + "openreplay/backend/pkg/db/clickhouse" + "openreplay/backend/pkg/env" +) + +var ch *clickhouse.Connector +var finalizeTicker <-chan time.Time + +func (si *Saver) InitStats() { + ch = clickhouse.NewConnector(env.String("CLICKHOUSE_STRING")) + if err := ch.Prepare(); err != nil { + log.Fatalf("Clickhouse prepare error: %v\n", err) + } + + finalizeTicker = time.Tick(20 * time.Minute) + +} + +func (si *Saver) InsertStats(session *Session, msg Message) error { + switch m := msg.(type) { + // Web + case *SessionEnd: + return si.pg.InsertWebSession(session) + case *PerformanceTrackAggr: + return si.pg.InsertWebPerformanceTrackAggr(session, m) + case *ClickEvent: + return si.pg.InsertWebClickEvent(session, m) + case *InputEvent: + return si.pg.InsertWebInputEvent(session, m) + // Unique for Web + case *PageEvent: + si.pg.InsertWebPageEvent(session, m) + case *ResourceEvent: + return si.pg.InsertWebResourceEvent(session, m) + case *ErrorEvent: + return si.pg.InsertWebErrorEvent(session, m) + case *LongTask: + return si.pg.InsertLongtask(session, m) + + // IOS + case *IOSSessionEnd: + return si.pg.InsertIOSSession(session) + case *IOSPerformanceAggregated: + return si.pg.InsertIOSPerformanceAggregated(session, m) + case *IOSClickEvent: + return si.pg.InsertIOSClickEvent(session, m) + case *IOSInputEvent: + return si.pg.InsertIOSInputEvent(session, m) + // Unique for Web + case *IOSScreenEnter: + //ch.InsertIOSView(session, m) + case *IOSCrash: + return si.pg.InsertIOSCrash(session, m) + case *IOSNetworkCall: + return si.pg.InsertIOSNetworkCall(session, m) + } + return nil +} + +func (si *Saver) CommitStats() error { + select { + case <-finalizeTicker: + if err := ch.FinaliseSessionsTable(); err != nil { + log.Printf("Stats: FinaliseSessionsTable returned an error. %v", err) + } + default: + } + errCommit := ch.Commit() + errPrepare := ch.Prepare() + if errCommit != nil { + return errCommit + } + return errPrepare +} diff --git a/ee/backend/services/db/stats.go b/ee/backend/services/db/stats.go deleted file mode 100644 index 9d250fc51..000000000 --- a/ee/backend/services/db/stats.go +++ /dev/null @@ -1,83 +0,0 @@ -package main - -import ( - "log" - "time" - - - . "openreplay/backend/pkg/messages" - . "openreplay/backend/pkg/db/types" - "openreplay/backend/pkg/db/clickhouse" - "openreplay/backend/pkg/env" -) - -var ch *clickhouse.Connector -var finalizeTicker <-chan time.Time - -func initStats() { - ch = clickhouse.NewConnector(env.String("CLICKHOUSE_STRING")) - if err := ch.Prepare(); err != nil { - log.Fatalf("Clickhouse prepare error: %v\n", err) - } - - finalizeTicker = time.Tick(20 * time.Minute) - -} - -func insertStats(session *Session, msg Message) error { - switch m := msg.(type) { - // Web - case *SessionEnd: - return ch.InsertWebSession(session) - case *PerformanceTrackAggr: - return ch.InsertWebPerformanceTrackAggr(session, m) - case *ClickEvent: - return ch.InsertWebClickEvent(session, m) - case *InputEvent: - return ch.InsertWebInputEvent(session, m) - // Unique for Web - case *PageEvent: - ch.InsertWebPageEvent(session, m) - case *ResourceEvent: - return ch.InsertWebResourceEvent(session, m) - case *ErrorEvent: - return ch.InsertWebErrorEvent(session, m) - case *LongTask: - return ch.InsertLongtask(session, m) - - // IOS - case *IOSSessionEnd: - return ch.InsertIOSSession(session) - case *IOSPerformanceAggregated: - return ch.InsertIOSPerformanceAggregated(session, m) - case *IOSClickEvent: - return ch.InsertIOSClickEvent(session, m) - case *IOSInputEvent: - return ch.InsertIOSInputEvent(session, m) - // Unique for Web - case *IOSScreenEnter: - //ch.InsertIOSView(session, m) - case *IOSCrash: - return ch.InsertIOSCrash(session, m) - case *IOSNetworkCall: - return ch.InsertIOSNetworkCall(session, m) - } - return nil -} - -func commitStats() error { - select { - case <-finalizeTicker: - if err := ch.FinaliseSessionsTable(); err != nil { - log.Printf("Stats: FinaliseSessionsTable returned an error. %v", err) - } - default: - } - errCommit := ch.Commit() - errPrepare := ch.Prepare() - if errCommit != nil { - return errCommit - } - return errPrepare -} - From c94f4074bbe210d19c62b3ffb5c97015859912a1 Mon Sep 17 00:00:00 2001 From: rjshrjndrn Date: Mon, 16 May 2022 10:45:51 +0200 Subject: [PATCH 124/260] chore(helm): make ingress-nginx installation not mandatory. Signed-off-by: rjshrjndrn --- scripts/helmcharts/openreplay/Chart.yaml | 1 + scripts/helmcharts/openreplay/values.yaml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/scripts/helmcharts/openreplay/Chart.yaml b/scripts/helmcharts/openreplay/Chart.yaml index c1875102e..a9a2f8e83 100644 --- a/scripts/helmcharts/openreplay/Chart.yaml +++ b/scripts/helmcharts/openreplay/Chart.yaml @@ -28,3 +28,4 @@ dependencies: - name: ingress-nginx version: "4.x.x" repository: "https://kubernetes.github.io/ingress-nginx" + condition: ingress-nginx.enabled diff --git a/scripts/helmcharts/openreplay/values.yaml b/scripts/helmcharts/openreplay/values.yaml index f702c1a49..3c063340c 100644 --- a/scripts/helmcharts/openreplay/values.yaml +++ b/scripts/helmcharts/openreplay/values.yaml @@ -114,3 +114,5 @@ assist: fullnameOverride: assist-openreplay peers: fullnameOverride: peers-openreplay +ingress-nginx: + enabled: true From 4175d98be8180c7252cd2ff5e2a3edf07b7ab0c8 Mon Sep 17 00:00:00 2001 From: rjshrjndrn Date: Wed, 11 May 2022 21:13:06 +0200 Subject: [PATCH 125/260] chore(helmcharts): adding clickhouse operator helm chart Signed-off-by: rjshrjndrn --- .../databases/charts/clickhouse/Chart.yaml | 7 +- .../altinity-clickhouse-operator/Chart.yaml | 13 + .../altinity-clickhouse-operator/README.md | 49 + ...installations.clickhouse.altinity.com.yaml | 1321 +++++++++++++++++ ...tiontemplates.clickhouse.altinity.com.yaml | 1321 +++++++++++++++++ ...onfigurations.clickhouse.altinity.com.yaml | 284 ++++ .../hacks/sync-yamls.sh | 58 + .../templates/_helpers.tpl | 73 + ...rRole-clickhouse-operator-kube-system.yaml | 163 ++ ...nding-clickhouse-operator-kube-system.yaml | 17 + ...p-etc-clickhouse-operator-confd-files.yaml | 18 + ...etc-clickhouse-operator-configd-files.yaml | 59 + ...nfigMap-etc-clickhouse-operator-files.yaml | 230 +++ ...-clickhouse-operator-templatesd-files.yaml | 102 ++ ...-etc-clickhouse-operator-usersd-files.yaml | 62 + .../Deployment-clickhouse-operator.yaml | 175 +++ .../Service-clickhouse-operator-metrics.yaml | 25 + .../ServiceAccount-clickhouse-operator.yaml | 21 + .../templates/servicemonitor.yaml | 18 + .../altinity-clickhouse-operator/values.yaml | 88 ++ .../templates/clickhouse-cluster.yaml | 93 ++ .../charts/clickhouse/templates/service.yaml | 19 - .../clickhouse/templates/serviceaccount.yaml | 12 - .../clickhouse/templates/statefulset.yaml | 69 - .../databases/charts/clickhouse/values.yaml | 58 +- 25 files changed, 4203 insertions(+), 152 deletions(-) create mode 100644 scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/Chart.yaml create mode 100644 scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/README.md create mode 100644 scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/crds/CustomResourceDefinition-clickhouseinstallations.clickhouse.altinity.com.yaml create mode 100644 scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/crds/CustomResourceDefinition-clickhouseinstallationtemplates.clickhouse.altinity.com.yaml create mode 100644 scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/crds/CustomResourceDefinition-clickhouseoperatorconfigurations.clickhouse.altinity.com.yaml create mode 100644 scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/hacks/sync-yamls.sh create mode 100644 scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/_helpers.tpl create mode 100644 scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ClusterRole-clickhouse-operator-kube-system.yaml create mode 100644 scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ClusterRoleBinding-clickhouse-operator-kube-system.yaml create mode 100644 scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ConfigMap-etc-clickhouse-operator-confd-files.yaml create mode 100644 scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ConfigMap-etc-clickhouse-operator-configd-files.yaml create mode 100644 scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ConfigMap-etc-clickhouse-operator-files.yaml create mode 100644 scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ConfigMap-etc-clickhouse-operator-templatesd-files.yaml create mode 100644 scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ConfigMap-etc-clickhouse-operator-usersd-files.yaml create mode 100644 scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/Deployment-clickhouse-operator.yaml create mode 100644 scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/Service-clickhouse-operator-metrics.yaml create mode 100644 scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ServiceAccount-clickhouse-operator.yaml create mode 100644 scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/servicemonitor.yaml create mode 100644 scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/values.yaml create mode 100644 scripts/helmcharts/databases/charts/clickhouse/templates/clickhouse-cluster.yaml delete mode 100644 scripts/helmcharts/databases/charts/clickhouse/templates/service.yaml delete mode 100644 scripts/helmcharts/databases/charts/clickhouse/templates/serviceaccount.yaml delete mode 100644 scripts/helmcharts/databases/charts/clickhouse/templates/statefulset.yaml diff --git a/scripts/helmcharts/databases/charts/clickhouse/Chart.yaml b/scripts/helmcharts/databases/charts/clickhouse/Chart.yaml index c7a0eb3d6..4026f2308 100644 --- a/scripts/helmcharts/databases/charts/clickhouse/Chart.yaml +++ b/scripts/helmcharts/databases/charts/clickhouse/Chart.yaml @@ -20,4 +20,9 @@ version: 0.1.0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. -appVersion: 1.16.0 +# It is recommended to use it with quotes. +appVersion: "1.16.0" + +dependencies: + - name: altinity-clickhouse-operator + version: 0.0.14 diff --git a/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/Chart.yaml b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/Chart.yaml new file mode 100644 index 000000000..5556de4a7 --- /dev/null +++ b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/Chart.yaml @@ -0,0 +1,13 @@ +apiVersion: v2 +appVersion: 0.18.1 +description: Helm chart to deploy [altinity-clickhouse-operator](https://github.com/Altinity/clickhouse-operator). The + ClickHouse Operator creates, configures and manages ClickHouse clusters running + on Kubernetes. Refer to operator repo for additional information. +home: https://github.com/slamdev/helm-charts/tree/master/charts/altinity-clickhouse-operator +icon: https://artifacthub.io/image/2d6aa29c-c74f-4bff-bede-ba7e6e0315a7@2x +maintainers: +- email: valentin.fedoskin@gmail.com + name: slamdev +name: altinity-clickhouse-operator +type: application +version: 0.0.14 diff --git a/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/README.md b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/README.md new file mode 100644 index 000000000..a05913517 --- /dev/null +++ b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/README.md @@ -0,0 +1,49 @@ +# altinity-clickhouse-operator + +![Version: 0.0.13](https://img.shields.io/badge/Version-0.0.13-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.18.1](https://img.shields.io/badge/AppVersion-0.18.1-informational?style=flat-square) + +Helm chart to deploy [altinity-clickhouse-operator](https://github.com/Altinity/clickhouse-operator). + +The ClickHouse Operator creates, configures and manages ClickHouse clusters running on Kubernetes. + +Refer to operator repo for additional information. + +**Homepage:** + +## Maintainers + +| Name | Email | Url | +| ---- | ------ | --- | +| slamdev | valentin.fedoskin@gmail.com | | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | affinity for scheduler pod assignment | +| configs | object | `{"confdFiles":null,"configdFiles":null,"files":null,"templatesdFiles":null,"usersdFiles":null}` | overrides operator default configmaps | +| fullnameOverride | string | `""` | full name of the chart. | +| imagePullSecrets | list | `[]` | image pull secret for private images | +| metrics.env | list | `[]` | additional environment variables for the deployment | +| metrics.image.pullPolicy | string | `"IfNotPresent"` | image pull policy | +| metrics.image.repository | string | `"altinity/metrics-exporter"` | image repository | +| metrics.image.tag | string | `""` | image tag (chart's appVersion value will be used if not set) | +| metrics.resources | object | `{}` | custom resource configuration | +| metrics.command | list | `nil` | command for metrics-exporter container | +| metrics.args | list | `nil` | args for metrics-exporter container | +| nameOverride | string | `""` | override name of the chart | +| nodeSelector | object | `{}` | node for scheduler pod assignment | +| operator.env | list | `[]` | additional environment variables for the deployment | +| operator.image.pullPolicy | string | `"IfNotPresent"` | image pull policy | +| operator.image.repository | string | `"altinity/clickhouse-operator"` | image repository | +| operator.image.tag | string | `""` | image tag (chart's appVersion value will be used if not set) | +| operator.resources | object | `{}` | custom resource configuration | +| operator.command | list | `nil` | command for operator container | +| operator.args | list | `nil` | args for operator container | +| podAnnotations | object | `nil` | additional pod annotations | +| serviceAccount.annotations | object | `{}` | annotations to add to the service account | +| serviceAccount.create | bool | `true` | specifies whether a service account should be created | +| serviceAccount.name | string | `nil` | the name of the service account to use; if not set and create is true, a name is generated using the fullname template | +| serviceMonitor.additionalLabels | object | `{}` | additional labels for service monitor | +| serviceMonitor.enabled | bool | `false` | ServiceMonitor CRD is created for a prometheus operator | +| tolerations | list | `[]` | tolerations for scheduler pod assignment | diff --git a/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/crds/CustomResourceDefinition-clickhouseinstallations.clickhouse.altinity.com.yaml b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/crds/CustomResourceDefinition-clickhouseinstallations.clickhouse.altinity.com.yaml new file mode 100644 index 000000000..908961576 --- /dev/null +++ b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/crds/CustomResourceDefinition-clickhouseinstallations.clickhouse.altinity.com.yaml @@ -0,0 +1,1321 @@ +# Template Parameters: +# +# KIND=ClickHouseInstallation +# SINGULAR=clickhouseinstallation +# PLURAL=clickhouseinstallations +# SHORT=chi +# +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: clickhouseinstallations.clickhouse.altinity.com + labels: + clickhouse.altinity.com/chop: 0.18.1 +spec: + group: clickhouse.altinity.com + scope: Namespaced + names: + kind: ClickHouseInstallation + singular: clickhouseinstallation + plural: clickhouseinstallations + shortNames: + - chi + versions: + - name: v1 + served: true + storage: true + additionalPrinterColumns: + - name: version + type: string + description: Operator version + priority: 1 # show in wide view + jsonPath: .status.chop-version + - name: clusters + type: integer + description: Clusters count + priority: 0 # show in standard view + jsonPath: .status.clusters + - name: shards + type: integer + description: Shards count + priority: 1 # show in wide view + jsonPath: .status.shards + - name: hosts + type: integer + description: Hosts count + priority: 0 # show in standard view + jsonPath: .status.hosts + - name: taskID + type: string + description: TaskID + priority: 1 # show in wide view + jsonPath: .status.taskID + - name: status + type: string + description: CHI status + priority: 0 # show in standard view + jsonPath: .status.status + - name: updated + type: integer + description: Updated hosts count + priority: 1 # show in wide view + jsonPath: .status.updated + - name: added + type: integer + description: Added hosts count + priority: 1 # show in wide view + jsonPath: .status.added + - name: deleted + type: integer + description: Hosts deleted count + priority: 1 # show in wide view + jsonPath: .status.deleted + - name: delete + type: integer + description: Hosts to be deleted count + priority: 1 # show in wide view + jsonPath: .status.delete + - name: endpoint + type: string + description: Client access endpoint + priority: 1 # show in wide view + jsonPath: .status.endpoint + subresources: + status: {} + schema: + openAPIV3Schema: + description: "define a set of Kubernetes resources (StatefulSet, PVC, Service, ConfigMap) which describe behavior one or more ClickHouse clusters" + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + status: + type: object + description: "Current ClickHouseInstallation manifest status, contains many fields like a normalized configuration, clickhouse-operator version, current action and all applied action list, current taskID and all applied taskIDs and other" + properties: + chop-version: + type: string + description: "ClickHouse operator version" + chop-commit: + type: string + description: "ClickHouse operator git commit SHA" + chop-date: + type: string + description: "ClickHouse operator build date" + clusters: + type: integer + minimum: 0 + description: "Clusters count" + shards: + type: integer + minimum: 0 + description: "Shards count" + replicas: + type: integer + minimum: 0 + description: "Replicas count" + hosts: + type: integer + minimum: 0 + description: "Hosts count" + status: + type: string + description: "Status" + taskID: + type: string + description: "Current task id" + taskIDsStarted: + type: array + description: "Started task ids" + items: + type: string + taskIDsCompleted: + type: array + description: "Completed task ids" + items: + type: string + action: + type: string + description: "Action" + actions: + type: array + description: "Actions" + items: + type: string + error: + type: string + description: "Last error" + errors: + type: array + description: "Errors" + items: + type: string + updated: + type: integer + minimum: 0 + description: "Updated Hosts count" + added: + type: integer + minimum: 0 + description: "Added Hosts count" + deleted: + type: integer + minimum: 0 + description: "Deleted Hosts count" + delete: + type: integer + minimum: 0 + description: "About to delete Hosts count" + pods: + type: array + description: "Pods" + items: + type: string + fqdns: + type: array + description: "Pods FQDNs" + items: + type: string + endpoint: + type: string + description: "Endpoint" + generation: + type: integer + minimum: 0 + description: "Generation" + normalized: + type: object + description: "Normalized CHI" + x-kubernetes-preserve-unknown-fields: true + spec: + type: object + # x-kubernetes-preserve-unknown-fields: true + description: | + Specification of the desired behavior of one or more ClickHouse clusters + More info: https://github.com/Altinity/clickhouse-operator/blob/master/docs/custom_resource_explained.md" + properties: + taskID: + type: string + description: "Allow define custom taskID for named update and watch status of this update execution in .status.taskIDs field, by default every update of chi manifest will generate random taskID" + # Need to be StringBool + stop: + type: string + description: | + Allow stop all ClickHouse clusters described in current chi. + Stop mechanism works as follows: + - When `stop` is `1` then setup `Replicas: 0` in each related to current `chi` StatefulSet resource, all `Pods` and `Service` resources will desctroy, but PVCs still live + - When `stop` is `0` then `Pods` will created again and will attach retained PVCs and `Service` also will created again + enum: + # List StringBoolXXX constants from model + - "" + - "0" + - "1" + - "False" + - "false" + - "True" + - "true" + - "No" + - "no" + - "Yes" + - "yes" + - "Off" + - "off" + - "On" + - "on" + - "Disable" + - "disable" + - "Enable" + - "enable" + - "Disabled" + - "disabled" + - "Enabled" + - "enabled" + restart: + type: string + description: "This is a 'soft restart' button. When set to 'RollingUpdate' operator will restart ClickHouse pods in a graceful way. Remove it after the use in order to avoid unneeded restarts" + enum: + - "" + - "RollingUpdate" + # Need to be StringBool + troubleshoot: + type: string + description: "allows troubleshoot Pods during CrashLoopBack state, when you apply wrong configuration, `clickhouse-server` wouldn't startup" + enum: + # List StringBoolXXX constants from model + - "" + - "0" + - "1" + - "False" + - "false" + - "True" + - "true" + - "No" + - "no" + - "Yes" + - "yes" + - "Off" + - "off" + - "On" + - "on" + - "Disable" + - "disable" + - "Enable" + - "enable" + - "Disabled" + - "disabled" + - "Enabled" + - "enabled" + namespaceDomainPattern: + type: string + description: "custom domain suffix which will add to end of `Service` or `Pod` name, use it when you use custom cluster domain in your Kubernetes cluster" + templating: + type: object + # nullable: true + description: "optional, define policy for auto applying ClickHouseInstallationTemplate inside ClickHouseInstallation" + properties: + policy: + type: string + description: "when defined as `auto` inside ClickhouseInstallationTemplate, it will auto add into all ClickHouseInstallation, manual value is default" + enum: + - "auto" + - "manual" + reconciling: + type: object + description: "optional, allows tuning reconciling cycle for ClickhouseInstallation from clickhouse-operator side" + # nullable: true + properties: + policy: + type: string + description: DEPRECATED + configMapPropagationTimeout: + type: integer + description: | + timeout in seconds when `clickhouse-operator` will wait when applied `ConfigMap` during reconcile `ClickhouseInstallation` pods will updated from cache + see details: https://kubernetes.io/docs/concepts/configuration/configmap/#mounted-configmaps-are-updated-automatically + minimum: 0 + maximum: 3600 + cleanup: + type: object + description: "optional, define behavior for cleanup Kubernetes resources during reconcile cycle" + # nullable: true + properties: + unknownObjects: + type: object + description: "what clickhouse-operator shall do when found Kubernetes resources which should be managed with clickhouse-operator, but not have `ownerReference` to any currently managed `ClickHouseInstallation` resource, default behavior is `Delete`" + # nullable: true + properties: + statefulSet: + type: string + description: "behavior policy for unknown StatefulSet, Delete by default" + enum: + # List ObjectsCleanupXXX constants from model + - "Retain" + - "Delete" + pvc: + type: string + description: "behavior policy for unknown PVC, Delete by default" + enum: + # List ObjectsCleanupXXX constants from model + - "Retain" + - "Delete" + configMap: + type: string + description: "behavior policy for unknown ConfigMap, Delete by default" + enum: + # List ObjectsCleanupXXX constants from model + - "Retain" + - "Delete" + service: + type: string + description: "behavior policy for unknown Service, Delete by default" + enum: + # List ObjectsCleanupXXX constants from model + - "Retain" + - "Delete" + reconcileFailedObjects: + type: object + description: "what clickhouse-operator shall do when reconciling Kubernetes resources are failed, default behavior is `Retain`" + # nullable: true + properties: + statefulSet: + type: string + description: "behavior policy for failed StatefulSet reconciling, Retain by default" + enum: + # List ObjectsCleanupXXX constants from model + - "Retain" + - "Delete" + pvc: + type: string + description: "behavior policy for failed PVC reconciling, Retain by default" + enum: + # List ObjectsCleanupXXX constants from model + - "Retain" + - "Delete" + configMap: + type: string + description: "behavior policy for failed ConfigMap reconciling, Retain by default" + enum: + # List ObjectsCleanupXXX constants from model + - "Retain" + - "Delete" + service: + type: string + description: "behavior policy for failed Service reconciling, Retain by default" + enum: + # List ObjectsCleanupXXX constants from model + - "Retain" + - "Delete" + defaults: + type: object + description: | + define default behavior for whole ClickHouseInstallation, some behavior can be re-define on cluster, shard and replica level + More info: https://github.com/Altinity/clickhouse-operator/blob/master/docs/custom_resource_explained.md#specdefaults + # nullable: true + properties: + # Need to be StringBool + replicasUseFQDN: + type: string + description: | + define should replicas be specified by FQDN in ``, then "no" then will use short hostname and clickhouse-server will use kubernetes default suffixes for properly DNS lookup + "yes" by default + enum: + # List StringBoolXXX constants from model + - "" + - "0" + - "1" + - "False" + - "false" + - "True" + - "true" + - "No" + - "no" + - "Yes" + - "yes" + - "Off" + - "off" + - "On" + - "on" + - "Disable" + - "disable" + - "Enable" + - "enable" + - "Disabled" + - "disabled" + - "Enabled" + - "enabled" + distributedDDL: + type: object + description: | + allows change `` settings + More info: https://clickhouse.tech/docs/en/operations/server-configuration-parameters/settings/#server-settings-distributed_ddl + # nullable: true + properties: + profile: + type: string + description: "Settings from this profile will be used to execute DDL queries" + templates: + type: object + description: "optional, configuration of the templates names which will use for generate Kubernetes resources according to one or more ClickHouse clusters described in current ClickHouseInstallation (chi) resource" + # nullable: true + properties: + hostTemplate: + type: string + description: "optional, template name from chi.spec.templates.hostTemplates, which will apply to configure every `clickhouse-server` instance during render ConfigMap resources which will mount into `Pod`" + podTemplate: + type: string + description: "optional, template name from chi.spec.templates.podTemplates, allows customization each `Pod` resource during render and reconcile each StatefulSet.spec resource described in `chi.spec.configuration.clusters`" + dataVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse data directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters`" + logVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse log directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters`" + serviceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for one `Service` resource which will created by `clickhouse-operator` which cover all clusters in whole `chi` resource" + clusterServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover each clickhouse cluster described in `chi.spec.configuration.clusters`" + shardServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover each shard inside clickhouse cluster described in `chi.spec.configuration.clusters`" + replicaServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover each replica inside each shard inside each clickhouse cluster described in `chi.spec.configuration.clusters`" + volumeClaimTemplate: + type: string + description: "DEPRECATED! VolumeClaimTemplate is deprecated in favor of DataVolumeClaimTemplate and LogVolumeClaimTemplate" + configuration: + type: object + description: "allows configure multiple aspects and behavior for `clickhouse-server` instance and also allows describe multiple `clickhouse-server` clusters inside one `chi` resource" + # nullable: true + properties: + zookeeper: + type: object + description: | + allows configure .. section in each `Pod` during generate `ConfigMap` which will mounted in `/etc/clickhouse-server/config.d/` + `clickhouse-operator` itself doesn't manage Zookeeper, please install Zookeeper separatelly look examples on https://github.com/Altinity/clickhouse-operator/tree/master/deploy/zookeeper/ + currently, zookeeper (or clickhouse-keeper replacement) used for *ReplicatedMergeTree table engines and for `distributed_ddl` + More details: https://clickhouse.tech/docs/en/operations/server-configuration-parameters/settings/#server-settings_zookeeper + # nullable: true + properties: + nodes: + type: array + description: "describe every available zookeeper cluster node for interaction" + # nullable: true + items: + type: object + #required: + # - host + properties: + host: + type: string + description: "dns name or ip address for Zookeeper node" + port: + type: integer + description: "TCP port which used to connect to Zookeeper node" + minimum: 0 + maximum: 65535 + session_timeout_ms: + type: integer + description: "session timeout during connect to Zookeeper" + operation_timeout_ms: + type: integer + description: "one operation timeout during Zookeeper transactions" + root: + type: string + description: "optional root znode path inside zookeeper to store ClickHouse related data (replication queue or distributed DDL)" + identity: + type: string + description: "optional access credentials string with `user:password` format used when use digest authorization in Zookeeper" + users: + type: object + description: | + allows configure .. section in each `Pod` during generate `ConfigMap` which will mount in `/etc/clickhouse-server/users.d/` + you can configure password hashed, authorization restrictions, database level security row filters etc. + More details: https://clickhouse.tech/docs/en/operations/settings/settings-users/ + Your yaml code will convert to XML, see examples https://github.com/Altinity/clickhouse-operator/blob/master/docs/custom_resource_explained.md#specconfigurationusers + # nullable: true + x-kubernetes-preserve-unknown-fields: true + profiles: + type: object + description: | + allows configure .. section in each `Pod` during generate `ConfigMap` which will mount in `/etc/clickhouse-server/users.d/` + you can configure any aspect of settings profile + More details: https://clickhouse.tech/docs/en/operations/settings/settings-profiles/ + Your yaml code will convert to XML, see examples https://github.com/Altinity/clickhouse-operator/blob/master/docs/custom_resource_explained.md#specconfigurationprofiles + # nullable: true + x-kubernetes-preserve-unknown-fields: true + quotas: + type: object + description: | + allows configure .. section in each `Pod` during generate `ConfigMap` which will mount in `/etc/clickhouse-server/users.d/` + you can configure any aspect of resource quotas + More details: https://clickhouse.tech/docs/en/operations/quotas/ + Your yaml code will convert to XML, see examples https://github.com/Altinity/clickhouse-operator/blob/master/docs/custom_resource_explained.md#specconfigurationquotas + # nullable: true + x-kubernetes-preserve-unknown-fields: true + settings: + type: object + description: | + allows configure `clickhouse-server` settings inside ... tag in each `Pod` during generate `ConfigMap` which will mount in `/etc/clickhouse-server/config.d/` + More details: https://clickhouse.tech/docs/en/operations/settings/settings/ + Your yaml code will convert to XML, see examples https://github.com/Altinity/clickhouse-operator/blob/master/docs/custom_resource_explained.md#specconfigurationsettings + # nullable: true + x-kubernetes-preserve-unknown-fields: true + files: + type: object + description: | + allows define content of any setting file inside each `Pod` during generate `ConfigMap` which will mount in `/etc/clickhouse-server/config.d/` or `/etc/clickhouse-server/conf.d/` or `/etc/clickhouse-server/users.d/` + every key in this object is the file name + every value in this object is the file content + you can use `!!binary |` and base64 for binary files, see details here https://yaml.org/type/binary.html + each key could contains prefix like USERS, COMMON, HOST or config.d, users.d, cond.d, wrong prefixes will ignored, subfolders also will ignored + More details: https://github.com/Altinity/clickhouse-operator/blob/master/docs/chi-examples/05-settings-05-files-nested.yaml + # nullable: true + x-kubernetes-preserve-unknown-fields: true + clusters: + type: array + description: | + describes ClickHouse clusters layout and allows change settings on cluster-level, shard-level and replica-level + every cluster is a set of StatefulSet, one StatefulSet contains only one Pod with `clickhouse-server` + all Pods will rendered in part of ClickHouse configs, mounted from ConfigMap as `/etc/clickhouse-server/config.d/chop-generated-remote_servers.xml` + Clusters will use for Distributed table engine, more details: https://clickhouse.tech/docs/en/engines/table-engines/special/distributed/ + If `cluster` contains zookeeper settings (could be inherited from top `chi` level), when you can create *ReplicatedMergeTree tables + # nullable: true + items: + type: object + #required: + # - name + properties: + name: + type: string + description: "cluster name, used to identify set of ClickHouse servers and wide used during generate names of related Kubernetes resources" + minLength: 1 + # See namePartClusterMaxLen const + maxLength: 15 + pattern: "^[a-zA-Z0-9-]{0,15}$" + zookeeper: + type: object + description: | + optional, allows configure .. section in each `Pod` only in current ClickHouse cluster, during generate `ConfigMap` which will mounted in `/etc/clickhouse-server/config.d/` + override top-level `chi.spec.configuration.zookeeper` settings + # nullable: true + properties: + nodes: + type: array + description: "describe every available zookeeper cluster node for interaction" + # nullable: true + items: + type: object + #required: + # - host + properties: + host: + type: string + description: "dns name or ip address for Zookeeper node" + port: + type: integer + description: "TCP port which used to connect to Zookeeper node" + minimum: 0 + maximum: 65535 + session_timeout_ms: + type: integer + description: "session timeout during connect to Zookeeper" + operation_timeout_ms: + type: integer + description: "one operation timeout during Zookeeper transactions" + root: + type: string + description: "optional root znode path inside zookeeper to store ClickHouse related data (replication queue or distributed DDL)" + identity: + type: string + description: "optional access credentials string with `user:password` format used when use digest authorization in Zookeeper" + settings: + type: object + description: | + optional, allows configure `clickhouse-server` settings inside ... tag in each `Pod` only in one cluster during generate `ConfigMap` which will mount in `/etc/clickhouse-server/config.d/` + override top-level `chi.spec.configuration.settings` + More details: https://clickhouse.tech/docs/en/operations/settings/settings/ + # nullable: true + x-kubernetes-preserve-unknown-fields: true + files: + type: object + description: | + optional, allows define content of any setting file inside each `Pod` on current cluster during generate `ConfigMap` which will mount in `/etc/clickhouse-server/config.d/` or `/etc/clickhouse-server/conf.d/` or `/etc/clickhouse-server/users.d/` + override top-level `chi.spec.configuration.files` + # nullable: true + x-kubernetes-preserve-unknown-fields: true + templates: + type: object + description: | + optional, configuration of the templates names which will use for generate Kubernetes resources according to selected cluster + override top-level `chi.spec.configuration.templates` + # nullable: true + properties: + hostTemplate: + type: string + description: "optional, template name from chi.spec.templates.hostTemplates, which will apply to configure each `clickhouse-server` instance during render ConfigMap resources which will mount into `Pod` only for one cluster" + podTemplate: + type: string + description: "optional, template name from chi.spec.templates.podTemplates, allows customization each `Pod` resource during render and reconcile each StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one cluster" + dataVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse data directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one cluster" + logVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse log directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one cluster" + serviceTemplate: + type: string + description: "optional, fully ignores for cluster-level" + clusterServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover each clickhouse cluster described in `chi.spec.configuration.clusters` only for one cluster" + shardServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover each shard inside clickhouse cluster described in `chi.spec.configuration.clusters` only for one cluster" + replicaServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover each replica inside each shard inside each clickhouse cluster described in `chi.spec.configuration.clusters` only for one cluster" + volumeClaimTemplate: + type: string + description: "DEPRECATED! VolumeClaimTemplate is deprecated in favor of DataVolumeClaimTemplate and LogVolumeClaimTemplate" + layout: + type: object + description: | + describe current cluster layout, how much shards in cluster, how much replica in shard + allows override settings on each shard and replica separatelly + # nullable: true + properties: + type: + type: string + description: "DEPRECATED - to be removed soon" + shardsCount: + type: integer + description: "how much shards for current ClickHouse cluster will run in Kubernetes, each shard contains shared-nothing part of data and contains set of replicas, cluster contains 1 shard by default" + replicasCount: + type: integer + description: "how much replicas in each shards for current ClickHouse cluster will run in Kubernetes, each replica is a separate `StatefulSet` which contains only one `Pod` with `clickhouse-server` instance, every shard contains 1 replica by default" + shards: + type: array + description: "optional, allows override top-level `chi.spec.configuration`, cluster-level `chi.spec.configuration.clusters` settings for each shard separately, use it only if you fully understand what you do" + # nullable: true + items: + type: object + properties: + name: + type: string + description: "optional, by default shard name is generated, but you can override it and setup custom name" + minLength: 1 + # See namePartShardMaxLen const + maxLength: 15 + pattern: "^[a-zA-Z0-9-]{0,15}$" + definitionType: + type: string + description: "DEPRECATED - to be removed soon" + weight: + type: integer + description: | + optional, 1 by default, allows setup shard setting which will use during insert into tables with `Distributed` engine, + will apply in inside ConfigMap which will mount in /etc/clickhouse-server/config.d/chop-generated-remote_servers.xml + More details: https://clickhouse.tech/docs/en/engines/table-engines/special/distributed/ + # Need to be StringBool + internalReplication: + type: string + description: | + optional, `true` by default when `chi.spec.configuration.clusters[].layout.ReplicaCount` > 1 and 0 otherwise + allows setup setting which will use during insert into tables with `Distributed` engine for insert only in one live replica and other replicas will download inserted data during replication, + will apply in inside ConfigMap which will mount in /etc/clickhouse-server/config.d/chop-generated-remote_servers.xml + More details: https://clickhouse.tech/docs/en/engines/table-engines/special/distributed/ + enum: + # List StringBoolXXX constants from model + - "" + - "0" + - "1" + - "False" + - "false" + - "True" + - "true" + - "No" + - "no" + - "Yes" + - "yes" + - "Off" + - "off" + - "On" + - "on" + - "Disable" + - "disable" + - "Enable" + - "enable" + - "Disabled" + - "disabled" + - "Enabled" + - "enabled" + settings: + type: object + # nullable: true + description: | + optional, allows configure `clickhouse-server` settings inside ... tag in each `Pod` only in one shard during generate `ConfigMap` which will mount in `/etc/clickhouse-server/config.d/` + override top-level `chi.spec.configuration.settings` and cluster-level `chi.spec.configuration.clusters.settings` + More details: https://clickhouse.tech/docs/en/operations/settings/settings/ + x-kubernetes-preserve-unknown-fields: true + files: + type: object + # nullable: true + description: | + optional, allows define content of any setting file inside each `Pod` only in one shard during generate `ConfigMap` which will mount in `/etc/clickhouse-server/config.d/` or `/etc/clickhouse-server/conf.d/` or `/etc/clickhouse-server/users.d/` + override top-level `chi.spec.configuration.files` and cluster-level `chi.spec.configuration.clusters.files` + x-kubernetes-preserve-unknown-fields: true + templates: + type: object + description: | + optional, configuration of the templates names which will use for generate Kubernetes resources according to selected shard + override top-level `chi.spec.configuration.templates` and cluster-level `chi.spec.configuration.clusters.templates` + # nullable: true + properties: + hostTemplate: + type: string + description: "optional, template name from chi.spec.templates.hostTemplates, which will apply to configure each `clickhouse-server` instance during render ConfigMap resources which will mount into `Pod` only for one shard" + podTemplate: + type: string + description: "optional, template name from chi.spec.templates.podTemplates, allows customization each `Pod` resource during render and reconcile each StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one shard" + dataVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse data directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one shard" + logVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse log directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one shard" + serviceTemplate: + type: string + description: "optional, fully ignores for shard-level" + clusterServiceTemplate: + type: string + description: "optional, fully ignores for shard-level" + shardServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover shard inside clickhouse cluster described in `chi.spec.configuration.clusters` only for one shard" + replicaServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover each replica inside each shard inside clickhouse cluster described in `chi.spec.configuration.clusters` only for one shard" + volumeClaimTemplate: + type: string + description: "DEPRECATED! VolumeClaimTemplate is deprecated in favor of DataVolumeClaimTemplate and LogVolumeClaimTemplate" + replicasCount: + type: integer + description: | + optional, how much replicas in selected shard for selected ClickHouse cluster will run in Kubernetes, each replica is a separate `StatefulSet` which contains only one `Pod` with `clickhouse-server` instance, + shard contains 1 replica by default + override cluster-level `chi.spec.configuration.clusters.layout.replicasCount` + minimum: 1 + replicas: + type: array + description: | + optional, allows override behavior for selected replicas from cluster-level `chi.spec.configuration.clusters` and shard-level `chi.spec.configuration.clusters.layout.shards` + # nullable: true + items: + # Host + type: object + properties: + name: + type: string + description: "optional, by default replica name is generated, but you can override it and setup custom name" + minLength: 1 + # See namePartReplicaMaxLen const + maxLength: 15 + pattern: "^[a-zA-Z0-9-]{0,15}$" + tcpPort: + type: integer + description: | + optional, setup `Pod.spec.containers.ports` with name `tcp` for selected replica, override `chi.spec.templates.hostTemplates.spec.tcpPort` + allows connect to `clickhouse-server` via TCP Native protocol via kubernetes `Service` + minimum: 1 + maximum: 65535 + httpPort: + type: integer + description: | + optional, setup `Pod.spec.containers.ports` with name `http` for selected replica, override `chi.spec.templates.hostTemplates.spec.httpPort` + allows connect to `clickhouse-server` via HTTP protocol via kubernetes `Service` + minimum: 1 + maximum: 65535 + interserverHTTPPort: + type: integer + description: | + optional, setup `Pod.spec.containers.ports` with name `interserver` for selected replica, override `chi.spec.templates.hostTemplates.spec.interserverHTTPPort` + allows connect between replicas inside same shard during fetch replicated data parts HTTP protocol + minimum: 1 + maximum: 65535 + settings: + type: object + # nullable: true + description: | + optional, allows configure `clickhouse-server` settings inside ... tag in `Pod` only in one replica during generate `ConfigMap` which will mount in `/etc/clickhouse-server/conf.d/` + override top-level `chi.spec.configuration.settings`, cluster-level `chi.spec.configuration.clusters.settings` and shard-level `chi.spec.configuration.clusters.layout.shards.settings` + More details: https://clickhouse.tech/docs/en/operations/settings/settings/ + x-kubernetes-preserve-unknown-fields: true + files: + type: object + # nullable: true + description: | + optional, allows define content of any setting file inside `Pod` only in one replica during generate `ConfigMap` which will mount in `/etc/clickhouse-server/config.d/` or `/etc/clickhouse-server/conf.d/` or `/etc/clickhouse-server/users.d/` + override top-level `chi.spec.configuration.files`, cluster-level `chi.spec.configuration.clusters.files` and shard-level `chi.spec.configuration.clusters.layout.shards.files` + x-kubernetes-preserve-unknown-fields: true + templates: + type: object + description: | + optional, configuration of the templates names which will use for generate Kubernetes resources according to selected replica + override top-level `chi.spec.configuration.templates`, cluster-level `chi.spec.configuration.clusters.templates` and shard-level `chi.spec.configuration.clusters.layout.shards.templates` + # nullable: true + properties: + hostTemplate: + type: string + description: "optional, template name from chi.spec.templates.hostTemplates, which will apply to configure `clickhouse-server` instance during render ConfigMap resources which will mount into `Pod` only for one replica" + podTemplate: + type: string + description: "optional, template name from chi.spec.templates.podTemplates, allows customization each `Pod` resource during render and reconcile each StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one replica" + dataVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse data directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one shard" + logVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse log directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one shard" + serviceTemplate: + type: string + description: "optional, fully ignores for replica-level" + clusterServiceTemplate: + type: string + description: "optional, fully ignores for replica-level" + shardServiceTemplate: + type: string + description: "optional, fully ignores for replica-level" + replicaServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover each replica inside each shard inside clickhouse cluster described in `chi.spec.configuration.clusters` only for one replica" + volumeClaimTemplate: + type: string + description: "DEPRECATED! VolumeClaimTemplate is deprecated in favor of DataVolumeClaimTemplate and LogVolumeClaimTemplate" + replicas: + type: array + description: "optional, allows override top-level `chi.spec.configuration` and cluster-level `chi.spec.configuration.clusters` configuration for each replica and each shard relates to selected replica, use it only if you fully understand what you do" + # nullable: true + items: + type: object + properties: + name: + type: string + description: "optional, by default replica name is generated, but you can override it and setup custom name" + minLength: 1 + # See namePartShardMaxLen const + maxLength: 15 + pattern: "^[a-zA-Z0-9-]{0,15}$" + settings: + type: object + description: | + optional, allows configure `clickhouse-server` settings inside ... tag in `Pod` only in one replica during generate `ConfigMap` which will mount in `/etc/clickhouse-server/conf.d/` + override top-level `chi.spec.configuration.settings`, cluster-level `chi.spec.configuration.clusters.settings` and will ignore if shard-level `chi.spec.configuration.clusters.layout.shards` present + More details: https://clickhouse.tech/docs/en/operations/settings/settings/ + # nullable: true + x-kubernetes-preserve-unknown-fields: true + files: + type: object + # nullable: true + description: | + optional, allows define content of any setting file inside each `Pod` only in one replica during generate `ConfigMap` which will mount in `/etc/clickhouse-server/config.d/` or `/etc/clickhouse-server/conf.d/` or `/etc/clickhouse-server/users.d/` + override top-level `chi.spec.configuration.files` and cluster-level `chi.spec.configuration.clusters.files`, will ignore if `chi.spec.configuration.clusters.layout.shards` presents + x-kubernetes-preserve-unknown-fields: true + templates: + type: object + description: | + optional, configuration of the templates names which will use for generate Kubernetes resources according to selected replica + override top-level `chi.spec.configuration.templates`, cluster-level `chi.spec.configuration.clusters.templates` + # nullable: true + properties: + hostTemplate: + type: string + description: "optional, template name from chi.spec.templates.hostTemplates, which will apply to configure `clickhouse-server` instance during render ConfigMap resources which will mount into `Pod` only for one replica" + podTemplate: + type: string + description: "optional, template name from chi.spec.templates.podTemplates, allows customization each `Pod` resource during render and reconcile each StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one replica" + dataVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse data directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one shard" + logVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse log directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one shard" + serviceTemplate: + type: string + description: "optional, fully ignores for replica-level" + clusterServiceTemplate: + type: string + description: "optional, fully ignores for replica-level" + shardServiceTemplate: + type: string + description: "optional, fully ignores for replica-level" + replicaServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover each replica inside each shard inside clickhouse cluster described in `chi.spec.configuration.clusters` only for one replica" + volumeClaimTemplate: + type: string + description: "DEPRECATED! VolumeClaimTemplate is deprecated in favor of DataVolumeClaimTemplate and LogVolumeClaimTemplate" + shardsCount: + type: integer + description: "optional, count of shards related to current replica, you can override each shard behavior on low-level `chi.spec.configuration.clusters.layout.replicas.shards`" + minimum: 1 + shards: + type: array + description: "optional, list of shards related to current replica, will ignore if `chi.spec.configuration.clusters.layout.shards` presents" + # nullable: true + items: + # Host + type: object + properties: + name: + type: string + description: "optional, by default shard name is generated, but you can override it and setup custom name" + minLength: 1 + # See namePartReplicaMaxLen const + maxLength: 15 + pattern: "^[a-zA-Z0-9-]{0,15}$" + tcpPort: + type: integer + description: | + optional, setup `Pod.spec.containers.ports` with name `tcp` for selected shard, override `chi.spec.templates.hostTemplates.spec.tcpPort` + allows connect to `clickhouse-server` via TCP Native protocol via kubernetes `Service` + minimum: 1 + maximum: 65535 + httpPort: + type: integer + description: | + optional, setup `Pod.spec.containers.ports` with name `http` for selected shard, override `chi.spec.templates.hostTemplates.spec.httpPort` + allows connect to `clickhouse-server` via HTTP protocol via kubernetes `Service` + minimum: 1 + maximum: 65535 + interserverHTTPPort: + type: integer + description: | + optional, setup `Pod.spec.containers.ports` with name `interserver` for selected shard, override `chi.spec.templates.hostTemplates.spec.interserverHTTPPort` + allows connect between replicas inside same shard during fetch replicated data parts HTTP protocol + minimum: 1 + maximum: 65535 + settings: + type: object + description: | + optional, allows configure `clickhouse-server` settings inside ... tag in `Pod` only in one shard related to current replica during generate `ConfigMap` which will mount in `/etc/clickhouse-server/conf.d/` + override top-level `chi.spec.configuration.settings`, cluster-level `chi.spec.configuration.clusters.settings` and replica-level `chi.spec.configuration.clusters.layout.replicas.settings` + More details: https://clickhouse.tech/docs/en/operations/settings/settings/ + # nullable: true + x-kubernetes-preserve-unknown-fields: true + files: + type: object + description: | + optional, allows define content of any setting file inside each `Pod` only in one shard related to current replica during generate `ConfigMap` which will mount in `/etc/clickhouse-server/config.d/` or `/etc/clickhouse-server/conf.d/` or `/etc/clickhouse-server/users.d/` + override top-level `chi.spec.configuration.files` and cluster-level `chi.spec.configuration.clusters.files`, will ignore if `chi.spec.configuration.clusters.layout.shards` presents + # nullable: true + x-kubernetes-preserve-unknown-fields: true + templates: + type: object + description: | + optional, configuration of the templates names which will use for generate Kubernetes resources according to selected replica + override top-level `chi.spec.configuration.templates`, cluster-level `chi.spec.configuration.clusters.templates`, replica-level `chi.spec.configuration.clusters.layout.replicas.templates` + # nullable: true + properties: + hostTemplate: + type: string + description: "optional, template name from chi.spec.templates.hostTemplates, which will apply to configure each `clickhouse-server` instance during render ConfigMap resources which will mount into `Pod` only for one shard" + podTemplate: + type: string + description: "optional, template name from chi.spec.templates.podTemplates, allows customization each `Pod` resource during render and reconcile each StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one shard" + dataVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse data directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one shard" + logVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse log directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one shard" + serviceTemplate: + type: string + description: "optional, fully ignores for shard-level" + clusterServiceTemplate: + type: string + description: "optional, fully ignores for shard-level" + shardServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover shard inside clickhouse cluster described in `chi.spec.configuration.clusters` only for one shard" + replicaServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover each replica inside each shard inside clickhouse cluster described in `chi.spec.configuration.clusters` only for one shard" + volumeClaimTemplate: + type: string + description: "DEPRECATED! VolumeClaimTemplate is deprecated in favor of DataVolumeClaimTemplate and LogVolumeClaimTemplate" + templates: + type: object + description: "allows define templates which will use for render Kubernetes resources like StatefulSet, ConfigMap, Service, PVC, by default, clickhouse-operator have own templates, but you can override it" + # nullable: true + properties: + hostTemplates: + type: array + description: "hostTemplate will use during apply to generate `clickhose-server` config files" + # nullable: true + items: + type: object + #required: + # - name + properties: + name: + description: "template name, could use to link inside top-level `chi.spec.defaults.templates.hostTemplate`, cluster-level `chi.spec.configuration.clusters.templates.hostTemplate`, shard-level `chi.spec.configuration.clusters.layout.shards.temlates.hostTemplate`, replica-level `chi.spec.configuration.clusters.layout.replicas.templates.hostTemplate`" + type: string + portDistribution: + type: array + description: "define how will distribute numeric values of named ports in `Pod.spec.containers.ports` and clickhouse-server configs" + # nullable: true + items: + type: object + #required: + # - type + properties: + type: + type: string + description: "type of distribution, when `Unspecified` (default value) then all listen ports on clickhouse-server configuration in all Pods will have the same value, when `ClusterScopeIndex` then ports will increment to offset from base value depends on shard and replica index inside cluster with combination of `chi.spec.templates.podTemlates.spec.HostNetwork` it allows setup ClickHouse cluster inside Kubernetes and provide access via external network bypass Kubernetes internal network" + enum: + # List PortDistributionXXX constants + - "" + - "Unspecified" + - "ClusterScopeIndex" + spec: + # Host + type: object + properties: + name: + type: string + description: "by default, hostname will generate, but this allows define custom name for each `clickhuse-server`" + minLength: 1 + # See namePartReplicaMaxLen const + maxLength: 15 + pattern: "^[a-zA-Z0-9-]{0,15}$" + tcpPort: + type: integer + description: | + optional, setup `tcp_port` inside `clickhouse-server` settings for each Pod where current template will apply + if specified, should have equal value with `chi.spec.templates.podTemplates.spec.containers.ports[name=tcp]` + More info: https://clickhouse.tech/docs/en/interfaces/tcp/ + minimum: 1 + maximum: 65535 + httpPort: + type: integer + description: | + optional, setup `http_port` inside `clickhouse-server` settings for each Pod where current template will apply + if specified, should have equal value with `chi.spec.templates.podTemplates.spec.containers.ports[name=http]` + More info: https://clickhouse.tech/docs/en/interfaces/http/ + minimum: 1 + maximum: 65535 + interserverHTTPPort: + type: integer + description: | + optional, setup `interserver_http_port` inside `clickhouse-server` settings for each Pod where current template will apply + if specified, should have equal value with `chi.spec.templates.podTemplates.spec.containers.ports[name=interserver]` + More info: https://clickhouse.tech/docs/en/operations/server-configuration-parameters/settings/#interserver-http-port + minimum: 1 + maximum: 65535 + settings: + type: object + description: | + optional, allows configure `clickhouse-server` settings inside ... tag in each `Pod` where this template will apply during generate `ConfigMap` which will mount in `/etc/clickhouse-server/conf.d/` + More details: https://clickhouse.tech/docs/en/operations/settings/settings/ + # nullable: true + x-kubernetes-preserve-unknown-fields: true + files: + type: object + description: | + optional, allows define content of any setting file inside each `Pod` where this template will apply during generate `ConfigMap` which will mount in `/etc/clickhouse-server/config.d/` or `/etc/clickhouse-server/conf.d/` or `/etc/clickhouse-server/users.d/` + # nullable: true + x-kubernetes-preserve-unknown-fields: true + templates: + type: object + description: "be carefull, this part of CRD allows override template inside template, don't use it if you don't understand what you do" + # nullable: true + properties: + hostTemplate: + type: string + podTemplate: + type: string + dataVolumeClaimTemplate: + type: string + logVolumeClaimTemplate: + type: string + serviceTemplate: + type: string + clusterServiceTemplate: + type: string + shardServiceTemplate: + type: string + replicaServiceTemplate: + type: string + podTemplates: + type: array + description: | + podTemplate will use during render `Pod` inside `StatefulSet.spec` and allows define rendered `Pod.spec`, pod scheduling distribution and pod zone + More information: https://github.com/Altinity/clickhouse-operator/blob/master/docs/custom_resource_explained.md#spectemplatespodtemplates + # nullable: true + items: + type: object + #required: + # - name + properties: + name: + type: string + description: "template name, could use to link inside top-level `chi.spec.defaults.templates.podTemplate`, cluster-level `chi.spec.configuration.clusters.templates.podTemplate`, shard-level `chi.spec.configuration.clusters.layout.shards.temlates.podTemplate`, replica-level `chi.spec.configuration.clusters.layout.replicas.templates.podTemplate`" + generateName: + type: string + description: "allows define format for generated `Pod` name, look to https://github.com/Altinity/clickhouse-operator/blob/master/docs/custom_resource_explained.md#spectemplatesservicetemplates for details about aviailable template variables" + zone: + type: object + description: "allows define custom zone name and will separate ClickHouse `Pods` between nodes, shortcut for `chi.spec.templates.podTemplates.spec.affinity.podAntiAffinity`" + #required: + # - values + properties: + key: + type: string + description: "optional, if defined, allows select kubernetes nodes by label with `name` equal `key`" + values: + type: array + description: "optional, if defined, allows select kubernetes nodes by label with `value` in `values`" + # nullable: true + items: + type: string + distribution: + type: string + description: "DEPRECATED, shortcut for `chi.spec.templates.podTemplates.spec.affinity.podAntiAffinity`" + enum: + - "" + - "Unspecified" + - "OnePerHost" + podDistribution: + type: array + description: "define ClickHouse Pod distibution policy between Kubernetes Nodes inside Shard, Replica, Namespace, CHI, another ClickHouse cluster" + # nullable: true + items: + type: object + #required: + # - type + properties: + type: + type: string + description: "you can define multiple affinity policy types" + enum: + # List PodDistributionXXX constants + - "" + - "Unspecified" + - "ClickHouseAntiAffinity" + - "ShardAntiAffinity" + - "ReplicaAntiAffinity" + - "AnotherNamespaceAntiAffinity" + - "AnotherClickHouseInstallationAntiAffinity" + - "AnotherClusterAntiAffinity" + - "MaxNumberPerNode" + - "NamespaceAffinity" + - "ClickHouseInstallationAffinity" + - "ClusterAffinity" + - "ShardAffinity" + - "ReplicaAffinity" + - "PreviousTailAffinity" + - "CircularReplication" + scope: + type: string + description: "scope for apply each podDistribution" + enum: + # list PodDistributionScopeXXX constants + - "" + - "Unspecified" + - "Shard" + - "Replica" + - "Cluster" + - "ClickHouseInstallation" + - "Namespace" + number: + type: integer + description: "define, how much ClickHouse Pods could be inside selected scope with selected distribution type" + minimum: 0 + maximum: 65535 + topologyKey: + type: string + description: "use for inter-pod affinity look to `pod.spec.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution.podAffinityTerm.topologyKey`, More info: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity" + spec: + # TODO specify PodSpec + type: object + description: "allows define whole Pod.spec inside StaefulSet.spec, look to https://kubernetes.io/docs/concepts/workloads/pods/#pod-templates for details" + # nullable: true + x-kubernetes-preserve-unknown-fields: true + metadata: + type: object + description: | + allows pass standard object's metadata from template to Pod + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + # nullable: true + x-kubernetes-preserve-unknown-fields: true + volumeClaimTemplates: + type: array + description: "allows define template for rendering `PVC` kubernetes resource, which would use inside `Pod` for mount clickhouse `data`, clickhouse `logs` or something else" + # nullable: true + items: + type: object + #required: + # - name + # - spec + properties: + name: + description: | + template name, could use to link inside + top-level `chi.spec.defaults.templates.dataVolumeClaimTemplate` or `chi.spec.defaults.templates.logVolumeClaimTemplate`, + cluster-level `chi.spec.configuration.clusters.templates.dataVolumeClaimTemplate` or `chi.spec.configuration.clusters.templates.logVolumeClaimTemplate`, + shard-level `chi.spec.configuration.clusters.layout.shards.temlates.dataVolumeClaimTemplate` or `chi.spec.configuration.clusters.layout.shards.temlates.logVolumeClaimTemplate` + replica-level `chi.spec.configuration.clusters.layout.replicas.templates.dataVolumeClaimTemplate` or `chi.spec.configuration.clusters.layout.replicas.templates.logVolumeClaimTemplate` + type: string + reclaimPolicy: + type: string + description: "define behavior of `PVC` deletion policy during delete `Pod`, `Delete` by default, when `Retain` then `PVC` still alive even `Pod` will deleted" + enum: + - "" + - "Retain" + - "Delete" + metadata: + type: object + description: | + allows pass standard object's metadata from template to PVC + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + # nullable: true + x-kubernetes-preserve-unknown-fields: true + spec: + type: object + description: | + allows define all aspects of `PVC` resource + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims + # nullable: true + x-kubernetes-preserve-unknown-fields: true + serviceTemplates: + type: array + description: | + allows define template for rendering `Service` which would get endpoint from Pods which scoped chi-wide, cluster-wide, shard-wide, replica-wide level + # nullable: true + items: + type: object + #required: + # - name + # - spec + properties: + name: + type: string + description: | + template name, could use to link inside + chi-level `chi.spec.defaults.templates.serviceTemplate` + cluster-level `chi.spec.configuration.clusters.templates.clusterServiceTemplate` + shard-level `chi.spec.configuration.clusters.layout.shards.temlates.shardServiceTemplate` + replica-level `chi.spec.configuration.clusters.layout.replicas.templates.replicaServiceTemplate` or `chi.spec.configuration.clusters.layout.shards.replicas.replicaServiceTemplate` + generateName: + type: string + description: "allows define format for generated `Service` name, look to https://github.com/Altinity/clickhouse-operator/blob/master/docs/custom_resource_explained.md#spectemplatesservicetemplates for details about aviailable template variables" + metadata: + # TODO specify ObjectMeta + type: object + description: | + allows pass standard object's metadata from template to Service + Could be use for define specificly for Cloud Provider metadata which impact to behavior of service + More info: https://kubernetes.io/docs/concepts/services-networking/service/ + # nullable: true + x-kubernetes-preserve-unknown-fields: true + spec: + # TODO specify ServiceSpec + type: object + description: | + describe behavior of generated Service + More info: https://kubernetes.io/docs/concepts/services-networking/service/ + # nullable: true + x-kubernetes-preserve-unknown-fields: true + useTemplates: + type: array + description: "list of `ClickHouseInstallationTemplate` (chit) resource names which will merge with current `Chi` manifest during render Kubernetes resources to create related ClickHouse clusters" + # nullable: true + items: + type: object + #required: + # - name + properties: + name: + type: string + description: "name of `ClickHouseInstallationTemplate` (chit) resource" + namespace: + type: string + description: "Kubernetes namespace where need search `chit` resource, depending on `watchNamespaces` settings in `clichouse-operator`" + useType: + type: string + description: "optional, current strategy is only merge, and current `chi` settings have more priority than merged template `chit`" + enum: + # List useTypeXXX constants from model + - "" + - "merge" diff --git a/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/crds/CustomResourceDefinition-clickhouseinstallationtemplates.clickhouse.altinity.com.yaml b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/crds/CustomResourceDefinition-clickhouseinstallationtemplates.clickhouse.altinity.com.yaml new file mode 100644 index 000000000..7899b71de --- /dev/null +++ b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/crds/CustomResourceDefinition-clickhouseinstallationtemplates.clickhouse.altinity.com.yaml @@ -0,0 +1,1321 @@ +# Template Parameters: +# +# KIND=ClickHouseInstallationTemplate +# SINGULAR=clickhouseinstallationtemplate +# PLURAL=clickhouseinstallationtemplates +# SHORT=chit +# +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: clickhouseinstallationtemplates.clickhouse.altinity.com + labels: + clickhouse.altinity.com/chop: 0.18.1 +spec: + group: clickhouse.altinity.com + scope: Namespaced + names: + kind: ClickHouseInstallationTemplate + singular: clickhouseinstallationtemplate + plural: clickhouseinstallationtemplates + shortNames: + - chit + versions: + - name: v1 + served: true + storage: true + additionalPrinterColumns: + - name: version + type: string + description: Operator version + priority: 1 # show in wide view + jsonPath: .status.chop-version + - name: clusters + type: integer + description: Clusters count + priority: 0 # show in standard view + jsonPath: .status.clusters + - name: shards + type: integer + description: Shards count + priority: 1 # show in wide view + jsonPath: .status.shards + - name: hosts + type: integer + description: Hosts count + priority: 0 # show in standard view + jsonPath: .status.hosts + - name: taskID + type: string + description: TaskID + priority: 1 # show in wide view + jsonPath: .status.taskID + - name: status + type: string + description: CHI status + priority: 0 # show in standard view + jsonPath: .status.status + - name: updated + type: integer + description: Updated hosts count + priority: 1 # show in wide view + jsonPath: .status.updated + - name: added + type: integer + description: Added hosts count + priority: 1 # show in wide view + jsonPath: .status.added + - name: deleted + type: integer + description: Hosts deleted count + priority: 1 # show in wide view + jsonPath: .status.deleted + - name: delete + type: integer + description: Hosts to be deleted count + priority: 1 # show in wide view + jsonPath: .status.delete + - name: endpoint + type: string + description: Client access endpoint + priority: 1 # show in wide view + jsonPath: .status.endpoint + subresources: + status: {} + schema: + openAPIV3Schema: + description: "define a set of Kubernetes resources (StatefulSet, PVC, Service, ConfigMap) which describe behavior one or more ClickHouse clusters" + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + status: + type: object + description: "Current ClickHouseInstallation manifest status, contains many fields like a normalized configuration, clickhouse-operator version, current action and all applied action list, current taskID and all applied taskIDs and other" + properties: + chop-version: + type: string + description: "ClickHouse operator version" + chop-commit: + type: string + description: "ClickHouse operator git commit SHA" + chop-date: + type: string + description: "ClickHouse operator build date" + clusters: + type: integer + minimum: 0 + description: "Clusters count" + shards: + type: integer + minimum: 0 + description: "Shards count" + replicas: + type: integer + minimum: 0 + description: "Replicas count" + hosts: + type: integer + minimum: 0 + description: "Hosts count" + status: + type: string + description: "Status" + taskID: + type: string + description: "Current task id" + taskIDsStarted: + type: array + description: "Started task ids" + items: + type: string + taskIDsCompleted: + type: array + description: "Completed task ids" + items: + type: string + action: + type: string + description: "Action" + actions: + type: array + description: "Actions" + items: + type: string + error: + type: string + description: "Last error" + errors: + type: array + description: "Errors" + items: + type: string + updated: + type: integer + minimum: 0 + description: "Updated Hosts count" + added: + type: integer + minimum: 0 + description: "Added Hosts count" + deleted: + type: integer + minimum: 0 + description: "Deleted Hosts count" + delete: + type: integer + minimum: 0 + description: "About to delete Hosts count" + pods: + type: array + description: "Pods" + items: + type: string + fqdns: + type: array + description: "Pods FQDNs" + items: + type: string + endpoint: + type: string + description: "Endpoint" + generation: + type: integer + minimum: 0 + description: "Generation" + normalized: + type: object + description: "Normalized CHI" + x-kubernetes-preserve-unknown-fields: true + spec: + type: object + # x-kubernetes-preserve-unknown-fields: true + description: | + Specification of the desired behavior of one or more ClickHouse clusters + More info: https://github.com/Altinity/clickhouse-operator/blob/master/docs/custom_resource_explained.md" + properties: + taskID: + type: string + description: "Allow define custom taskID for named update and watch status of this update execution in .status.taskIDs field, by default every update of chi manifest will generate random taskID" + # Need to be StringBool + stop: + type: string + description: | + Allow stop all ClickHouse clusters described in current chi. + Stop mechanism works as follows: + - When `stop` is `1` then setup `Replicas: 0` in each related to current `chi` StatefulSet resource, all `Pods` and `Service` resources will desctroy, but PVCs still live + - When `stop` is `0` then `Pods` will created again and will attach retained PVCs and `Service` also will created again + enum: + # List StringBoolXXX constants from model + - "" + - "0" + - "1" + - "False" + - "false" + - "True" + - "true" + - "No" + - "no" + - "Yes" + - "yes" + - "Off" + - "off" + - "On" + - "on" + - "Disable" + - "disable" + - "Enable" + - "enable" + - "Disabled" + - "disabled" + - "Enabled" + - "enabled" + restart: + type: string + description: "This is a 'soft restart' button. When set to 'RollingUpdate' operator will restart ClickHouse pods in a graceful way. Remove it after the use in order to avoid unneeded restarts" + enum: + - "" + - "RollingUpdate" + # Need to be StringBool + troubleshoot: + type: string + description: "allows troubleshoot Pods during CrashLoopBack state, when you apply wrong configuration, `clickhouse-server` wouldn't startup" + enum: + # List StringBoolXXX constants from model + - "" + - "0" + - "1" + - "False" + - "false" + - "True" + - "true" + - "No" + - "no" + - "Yes" + - "yes" + - "Off" + - "off" + - "On" + - "on" + - "Disable" + - "disable" + - "Enable" + - "enable" + - "Disabled" + - "disabled" + - "Enabled" + - "enabled" + namespaceDomainPattern: + type: string + description: "custom domain suffix which will add to end of `Service` or `Pod` name, use it when you use custom cluster domain in your Kubernetes cluster" + templating: + type: object + # nullable: true + description: "optional, define policy for auto applying ClickHouseInstallationTemplate inside ClickHouseInstallation" + properties: + policy: + type: string + description: "when defined as `auto` inside ClickhouseInstallationTemplate, it will auto add into all ClickHouseInstallation, manual value is default" + enum: + - "auto" + - "manual" + reconciling: + type: object + description: "optional, allows tuning reconciling cycle for ClickhouseInstallation from clickhouse-operator side" + # nullable: true + properties: + policy: + type: string + description: DEPRECATED + configMapPropagationTimeout: + type: integer + description: | + timeout in seconds when `clickhouse-operator` will wait when applied `ConfigMap` during reconcile `ClickhouseInstallation` pods will updated from cache + see details: https://kubernetes.io/docs/concepts/configuration/configmap/#mounted-configmaps-are-updated-automatically + minimum: 0 + maximum: 3600 + cleanup: + type: object + description: "optional, define behavior for cleanup Kubernetes resources during reconcile cycle" + # nullable: true + properties: + unknownObjects: + type: object + description: "what clickhouse-operator shall do when found Kubernetes resources which should be managed with clickhouse-operator, but not have `ownerReference` to any currently managed `ClickHouseInstallation` resource, default behavior is `Delete`" + # nullable: true + properties: + statefulSet: + type: string + description: "behavior policy for unknown StatefulSet, Delete by default" + enum: + # List ObjectsCleanupXXX constants from model + - "Retain" + - "Delete" + pvc: + type: string + description: "behavior policy for unknown PVC, Delete by default" + enum: + # List ObjectsCleanupXXX constants from model + - "Retain" + - "Delete" + configMap: + type: string + description: "behavior policy for unknown ConfigMap, Delete by default" + enum: + # List ObjectsCleanupXXX constants from model + - "Retain" + - "Delete" + service: + type: string + description: "behavior policy for unknown Service, Delete by default" + enum: + # List ObjectsCleanupXXX constants from model + - "Retain" + - "Delete" + reconcileFailedObjects: + type: object + description: "what clickhouse-operator shall do when reconciling Kubernetes resources are failed, default behavior is `Retain`" + # nullable: true + properties: + statefulSet: + type: string + description: "behavior policy for failed StatefulSet reconciling, Retain by default" + enum: + # List ObjectsCleanupXXX constants from model + - "Retain" + - "Delete" + pvc: + type: string + description: "behavior policy for failed PVC reconciling, Retain by default" + enum: + # List ObjectsCleanupXXX constants from model + - "Retain" + - "Delete" + configMap: + type: string + description: "behavior policy for failed ConfigMap reconciling, Retain by default" + enum: + # List ObjectsCleanupXXX constants from model + - "Retain" + - "Delete" + service: + type: string + description: "behavior policy for failed Service reconciling, Retain by default" + enum: + # List ObjectsCleanupXXX constants from model + - "Retain" + - "Delete" + defaults: + type: object + description: | + define default behavior for whole ClickHouseInstallation, some behavior can be re-define on cluster, shard and replica level + More info: https://github.com/Altinity/clickhouse-operator/blob/master/docs/custom_resource_explained.md#specdefaults + # nullable: true + properties: + # Need to be StringBool + replicasUseFQDN: + type: string + description: | + define should replicas be specified by FQDN in ``, then "no" then will use short hostname and clickhouse-server will use kubernetes default suffixes for properly DNS lookup + "yes" by default + enum: + # List StringBoolXXX constants from model + - "" + - "0" + - "1" + - "False" + - "false" + - "True" + - "true" + - "No" + - "no" + - "Yes" + - "yes" + - "Off" + - "off" + - "On" + - "on" + - "Disable" + - "disable" + - "Enable" + - "enable" + - "Disabled" + - "disabled" + - "Enabled" + - "enabled" + distributedDDL: + type: object + description: | + allows change `` settings + More info: https://clickhouse.tech/docs/en/operations/server-configuration-parameters/settings/#server-settings-distributed_ddl + # nullable: true + properties: + profile: + type: string + description: "Settings from this profile will be used to execute DDL queries" + templates: + type: object + description: "optional, configuration of the templates names which will use for generate Kubernetes resources according to one or more ClickHouse clusters described in current ClickHouseInstallation (chi) resource" + # nullable: true + properties: + hostTemplate: + type: string + description: "optional, template name from chi.spec.templates.hostTemplates, which will apply to configure every `clickhouse-server` instance during render ConfigMap resources which will mount into `Pod`" + podTemplate: + type: string + description: "optional, template name from chi.spec.templates.podTemplates, allows customization each `Pod` resource during render and reconcile each StatefulSet.spec resource described in `chi.spec.configuration.clusters`" + dataVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse data directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters`" + logVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse log directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters`" + serviceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for one `Service` resource which will created by `clickhouse-operator` which cover all clusters in whole `chi` resource" + clusterServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover each clickhouse cluster described in `chi.spec.configuration.clusters`" + shardServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover each shard inside clickhouse cluster described in `chi.spec.configuration.clusters`" + replicaServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover each replica inside each shard inside each clickhouse cluster described in `chi.spec.configuration.clusters`" + volumeClaimTemplate: + type: string + description: "DEPRECATED! VolumeClaimTemplate is deprecated in favor of DataVolumeClaimTemplate and LogVolumeClaimTemplate" + configuration: + type: object + description: "allows configure multiple aspects and behavior for `clickhouse-server` instance and also allows describe multiple `clickhouse-server` clusters inside one `chi` resource" + # nullable: true + properties: + zookeeper: + type: object + description: | + allows configure .. section in each `Pod` during generate `ConfigMap` which will mounted in `/etc/clickhouse-server/config.d/` + `clickhouse-operator` itself doesn't manage Zookeeper, please install Zookeeper separatelly look examples on https://github.com/Altinity/clickhouse-operator/tree/master/deploy/zookeeper/ + currently, zookeeper (or clickhouse-keeper replacement) used for *ReplicatedMergeTree table engines and for `distributed_ddl` + More details: https://clickhouse.tech/docs/en/operations/server-configuration-parameters/settings/#server-settings_zookeeper + # nullable: true + properties: + nodes: + type: array + description: "describe every available zookeeper cluster node for interaction" + # nullable: true + items: + type: object + #required: + # - host + properties: + host: + type: string + description: "dns name or ip address for Zookeeper node" + port: + type: integer + description: "TCP port which used to connect to Zookeeper node" + minimum: 0 + maximum: 65535 + session_timeout_ms: + type: integer + description: "session timeout during connect to Zookeeper" + operation_timeout_ms: + type: integer + description: "one operation timeout during Zookeeper transactions" + root: + type: string + description: "optional root znode path inside zookeeper to store ClickHouse related data (replication queue or distributed DDL)" + identity: + type: string + description: "optional access credentials string with `user:password` format used when use digest authorization in Zookeeper" + users: + type: object + description: | + allows configure .. section in each `Pod` during generate `ConfigMap` which will mount in `/etc/clickhouse-server/users.d/` + you can configure password hashed, authorization restrictions, database level security row filters etc. + More details: https://clickhouse.tech/docs/en/operations/settings/settings-users/ + Your yaml code will convert to XML, see examples https://github.com/Altinity/clickhouse-operator/blob/master/docs/custom_resource_explained.md#specconfigurationusers + # nullable: true + x-kubernetes-preserve-unknown-fields: true + profiles: + type: object + description: | + allows configure .. section in each `Pod` during generate `ConfigMap` which will mount in `/etc/clickhouse-server/users.d/` + you can configure any aspect of settings profile + More details: https://clickhouse.tech/docs/en/operations/settings/settings-profiles/ + Your yaml code will convert to XML, see examples https://github.com/Altinity/clickhouse-operator/blob/master/docs/custom_resource_explained.md#specconfigurationprofiles + # nullable: true + x-kubernetes-preserve-unknown-fields: true + quotas: + type: object + description: | + allows configure .. section in each `Pod` during generate `ConfigMap` which will mount in `/etc/clickhouse-server/users.d/` + you can configure any aspect of resource quotas + More details: https://clickhouse.tech/docs/en/operations/quotas/ + Your yaml code will convert to XML, see examples https://github.com/Altinity/clickhouse-operator/blob/master/docs/custom_resource_explained.md#specconfigurationquotas + # nullable: true + x-kubernetes-preserve-unknown-fields: true + settings: + type: object + description: | + allows configure `clickhouse-server` settings inside ... tag in each `Pod` during generate `ConfigMap` which will mount in `/etc/clickhouse-server/config.d/` + More details: https://clickhouse.tech/docs/en/operations/settings/settings/ + Your yaml code will convert to XML, see examples https://github.com/Altinity/clickhouse-operator/blob/master/docs/custom_resource_explained.md#specconfigurationsettings + # nullable: true + x-kubernetes-preserve-unknown-fields: true + files: + type: object + description: | + allows define content of any setting file inside each `Pod` during generate `ConfigMap` which will mount in `/etc/clickhouse-server/config.d/` or `/etc/clickhouse-server/conf.d/` or `/etc/clickhouse-server/users.d/` + every key in this object is the file name + every value in this object is the file content + you can use `!!binary |` and base64 for binary files, see details here https://yaml.org/type/binary.html + each key could contains prefix like USERS, COMMON, HOST or config.d, users.d, cond.d, wrong prefixes will ignored, subfolders also will ignored + More details: https://github.com/Altinity/clickhouse-operator/blob/master/docs/chi-examples/05-settings-05-files-nested.yaml + # nullable: true + x-kubernetes-preserve-unknown-fields: true + clusters: + type: array + description: | + describes ClickHouse clusters layout and allows change settings on cluster-level, shard-level and replica-level + every cluster is a set of StatefulSet, one StatefulSet contains only one Pod with `clickhouse-server` + all Pods will rendered in part of ClickHouse configs, mounted from ConfigMap as `/etc/clickhouse-server/config.d/chop-generated-remote_servers.xml` + Clusters will use for Distributed table engine, more details: https://clickhouse.tech/docs/en/engines/table-engines/special/distributed/ + If `cluster` contains zookeeper settings (could be inherited from top `chi` level), when you can create *ReplicatedMergeTree tables + # nullable: true + items: + type: object + #required: + # - name + properties: + name: + type: string + description: "cluster name, used to identify set of ClickHouse servers and wide used during generate names of related Kubernetes resources" + minLength: 1 + # See namePartClusterMaxLen const + maxLength: 15 + pattern: "^[a-zA-Z0-9-]{0,15}$" + zookeeper: + type: object + description: | + optional, allows configure .. section in each `Pod` only in current ClickHouse cluster, during generate `ConfigMap` which will mounted in `/etc/clickhouse-server/config.d/` + override top-level `chi.spec.configuration.zookeeper` settings + # nullable: true + properties: + nodes: + type: array + description: "describe every available zookeeper cluster node for interaction" + # nullable: true + items: + type: object + #required: + # - host + properties: + host: + type: string + description: "dns name or ip address for Zookeeper node" + port: + type: integer + description: "TCP port which used to connect to Zookeeper node" + minimum: 0 + maximum: 65535 + session_timeout_ms: + type: integer + description: "session timeout during connect to Zookeeper" + operation_timeout_ms: + type: integer + description: "one operation timeout during Zookeeper transactions" + root: + type: string + description: "optional root znode path inside zookeeper to store ClickHouse related data (replication queue or distributed DDL)" + identity: + type: string + description: "optional access credentials string with `user:password` format used when use digest authorization in Zookeeper" + settings: + type: object + description: | + optional, allows configure `clickhouse-server` settings inside ... tag in each `Pod` only in one cluster during generate `ConfigMap` which will mount in `/etc/clickhouse-server/config.d/` + override top-level `chi.spec.configuration.settings` + More details: https://clickhouse.tech/docs/en/operations/settings/settings/ + # nullable: true + x-kubernetes-preserve-unknown-fields: true + files: + type: object + description: | + optional, allows define content of any setting file inside each `Pod` on current cluster during generate `ConfigMap` which will mount in `/etc/clickhouse-server/config.d/` or `/etc/clickhouse-server/conf.d/` or `/etc/clickhouse-server/users.d/` + override top-level `chi.spec.configuration.files` + # nullable: true + x-kubernetes-preserve-unknown-fields: true + templates: + type: object + description: | + optional, configuration of the templates names which will use for generate Kubernetes resources according to selected cluster + override top-level `chi.spec.configuration.templates` + # nullable: true + properties: + hostTemplate: + type: string + description: "optional, template name from chi.spec.templates.hostTemplates, which will apply to configure each `clickhouse-server` instance during render ConfigMap resources which will mount into `Pod` only for one cluster" + podTemplate: + type: string + description: "optional, template name from chi.spec.templates.podTemplates, allows customization each `Pod` resource during render and reconcile each StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one cluster" + dataVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse data directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one cluster" + logVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse log directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one cluster" + serviceTemplate: + type: string + description: "optional, fully ignores for cluster-level" + clusterServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover each clickhouse cluster described in `chi.spec.configuration.clusters` only for one cluster" + shardServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover each shard inside clickhouse cluster described in `chi.spec.configuration.clusters` only for one cluster" + replicaServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover each replica inside each shard inside each clickhouse cluster described in `chi.spec.configuration.clusters` only for one cluster" + volumeClaimTemplate: + type: string + description: "DEPRECATED! VolumeClaimTemplate is deprecated in favor of DataVolumeClaimTemplate and LogVolumeClaimTemplate" + layout: + type: object + description: | + describe current cluster layout, how much shards in cluster, how much replica in shard + allows override settings on each shard and replica separatelly + # nullable: true + properties: + type: + type: string + description: "DEPRECATED - to be removed soon" + shardsCount: + type: integer + description: "how much shards for current ClickHouse cluster will run in Kubernetes, each shard contains shared-nothing part of data and contains set of replicas, cluster contains 1 shard by default" + replicasCount: + type: integer + description: "how much replicas in each shards for current ClickHouse cluster will run in Kubernetes, each replica is a separate `StatefulSet` which contains only one `Pod` with `clickhouse-server` instance, every shard contains 1 replica by default" + shards: + type: array + description: "optional, allows override top-level `chi.spec.configuration`, cluster-level `chi.spec.configuration.clusters` settings for each shard separately, use it only if you fully understand what you do" + # nullable: true + items: + type: object + properties: + name: + type: string + description: "optional, by default shard name is generated, but you can override it and setup custom name" + minLength: 1 + # See namePartShardMaxLen const + maxLength: 15 + pattern: "^[a-zA-Z0-9-]{0,15}$" + definitionType: + type: string + description: "DEPRECATED - to be removed soon" + weight: + type: integer + description: | + optional, 1 by default, allows setup shard setting which will use during insert into tables with `Distributed` engine, + will apply in inside ConfigMap which will mount in /etc/clickhouse-server/config.d/chop-generated-remote_servers.xml + More details: https://clickhouse.tech/docs/en/engines/table-engines/special/distributed/ + # Need to be StringBool + internalReplication: + type: string + description: | + optional, `true` by default when `chi.spec.configuration.clusters[].layout.ReplicaCount` > 1 and 0 otherwise + allows setup setting which will use during insert into tables with `Distributed` engine for insert only in one live replica and other replicas will download inserted data during replication, + will apply in inside ConfigMap which will mount in /etc/clickhouse-server/config.d/chop-generated-remote_servers.xml + More details: https://clickhouse.tech/docs/en/engines/table-engines/special/distributed/ + enum: + # List StringBoolXXX constants from model + - "" + - "0" + - "1" + - "False" + - "false" + - "True" + - "true" + - "No" + - "no" + - "Yes" + - "yes" + - "Off" + - "off" + - "On" + - "on" + - "Disable" + - "disable" + - "Enable" + - "enable" + - "Disabled" + - "disabled" + - "Enabled" + - "enabled" + settings: + type: object + # nullable: true + description: | + optional, allows configure `clickhouse-server` settings inside ... tag in each `Pod` only in one shard during generate `ConfigMap` which will mount in `/etc/clickhouse-server/config.d/` + override top-level `chi.spec.configuration.settings` and cluster-level `chi.spec.configuration.clusters.settings` + More details: https://clickhouse.tech/docs/en/operations/settings/settings/ + x-kubernetes-preserve-unknown-fields: true + files: + type: object + # nullable: true + description: | + optional, allows define content of any setting file inside each `Pod` only in one shard during generate `ConfigMap` which will mount in `/etc/clickhouse-server/config.d/` or `/etc/clickhouse-server/conf.d/` or `/etc/clickhouse-server/users.d/` + override top-level `chi.spec.configuration.files` and cluster-level `chi.spec.configuration.clusters.files` + x-kubernetes-preserve-unknown-fields: true + templates: + type: object + description: | + optional, configuration of the templates names which will use for generate Kubernetes resources according to selected shard + override top-level `chi.spec.configuration.templates` and cluster-level `chi.spec.configuration.clusters.templates` + # nullable: true + properties: + hostTemplate: + type: string + description: "optional, template name from chi.spec.templates.hostTemplates, which will apply to configure each `clickhouse-server` instance during render ConfigMap resources which will mount into `Pod` only for one shard" + podTemplate: + type: string + description: "optional, template name from chi.spec.templates.podTemplates, allows customization each `Pod` resource during render and reconcile each StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one shard" + dataVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse data directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one shard" + logVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse log directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one shard" + serviceTemplate: + type: string + description: "optional, fully ignores for shard-level" + clusterServiceTemplate: + type: string + description: "optional, fully ignores for shard-level" + shardServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover shard inside clickhouse cluster described in `chi.spec.configuration.clusters` only for one shard" + replicaServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover each replica inside each shard inside clickhouse cluster described in `chi.spec.configuration.clusters` only for one shard" + volumeClaimTemplate: + type: string + description: "DEPRECATED! VolumeClaimTemplate is deprecated in favor of DataVolumeClaimTemplate and LogVolumeClaimTemplate" + replicasCount: + type: integer + description: | + optional, how much replicas in selected shard for selected ClickHouse cluster will run in Kubernetes, each replica is a separate `StatefulSet` which contains only one `Pod` with `clickhouse-server` instance, + shard contains 1 replica by default + override cluster-level `chi.spec.configuration.clusters.layout.replicasCount` + minimum: 1 + replicas: + type: array + description: | + optional, allows override behavior for selected replicas from cluster-level `chi.spec.configuration.clusters` and shard-level `chi.spec.configuration.clusters.layout.shards` + # nullable: true + items: + # Host + type: object + properties: + name: + type: string + description: "optional, by default replica name is generated, but you can override it and setup custom name" + minLength: 1 + # See namePartReplicaMaxLen const + maxLength: 15 + pattern: "^[a-zA-Z0-9-]{0,15}$" + tcpPort: + type: integer + description: | + optional, setup `Pod.spec.containers.ports` with name `tcp` for selected replica, override `chi.spec.templates.hostTemplates.spec.tcpPort` + allows connect to `clickhouse-server` via TCP Native protocol via kubernetes `Service` + minimum: 1 + maximum: 65535 + httpPort: + type: integer + description: | + optional, setup `Pod.spec.containers.ports` with name `http` for selected replica, override `chi.spec.templates.hostTemplates.spec.httpPort` + allows connect to `clickhouse-server` via HTTP protocol via kubernetes `Service` + minimum: 1 + maximum: 65535 + interserverHTTPPort: + type: integer + description: | + optional, setup `Pod.spec.containers.ports` with name `interserver` for selected replica, override `chi.spec.templates.hostTemplates.spec.interserverHTTPPort` + allows connect between replicas inside same shard during fetch replicated data parts HTTP protocol + minimum: 1 + maximum: 65535 + settings: + type: object + # nullable: true + description: | + optional, allows configure `clickhouse-server` settings inside ... tag in `Pod` only in one replica during generate `ConfigMap` which will mount in `/etc/clickhouse-server/conf.d/` + override top-level `chi.spec.configuration.settings`, cluster-level `chi.spec.configuration.clusters.settings` and shard-level `chi.spec.configuration.clusters.layout.shards.settings` + More details: https://clickhouse.tech/docs/en/operations/settings/settings/ + x-kubernetes-preserve-unknown-fields: true + files: + type: object + # nullable: true + description: | + optional, allows define content of any setting file inside `Pod` only in one replica during generate `ConfigMap` which will mount in `/etc/clickhouse-server/config.d/` or `/etc/clickhouse-server/conf.d/` or `/etc/clickhouse-server/users.d/` + override top-level `chi.spec.configuration.files`, cluster-level `chi.spec.configuration.clusters.files` and shard-level `chi.spec.configuration.clusters.layout.shards.files` + x-kubernetes-preserve-unknown-fields: true + templates: + type: object + description: | + optional, configuration of the templates names which will use for generate Kubernetes resources according to selected replica + override top-level `chi.spec.configuration.templates`, cluster-level `chi.spec.configuration.clusters.templates` and shard-level `chi.spec.configuration.clusters.layout.shards.templates` + # nullable: true + properties: + hostTemplate: + type: string + description: "optional, template name from chi.spec.templates.hostTemplates, which will apply to configure `clickhouse-server` instance during render ConfigMap resources which will mount into `Pod` only for one replica" + podTemplate: + type: string + description: "optional, template name from chi.spec.templates.podTemplates, allows customization each `Pod` resource during render and reconcile each StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one replica" + dataVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse data directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one shard" + logVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse log directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one shard" + serviceTemplate: + type: string + description: "optional, fully ignores for replica-level" + clusterServiceTemplate: + type: string + description: "optional, fully ignores for replica-level" + shardServiceTemplate: + type: string + description: "optional, fully ignores for replica-level" + replicaServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover each replica inside each shard inside clickhouse cluster described in `chi.spec.configuration.clusters` only for one replica" + volumeClaimTemplate: + type: string + description: "DEPRECATED! VolumeClaimTemplate is deprecated in favor of DataVolumeClaimTemplate and LogVolumeClaimTemplate" + replicas: + type: array + description: "optional, allows override top-level `chi.spec.configuration` and cluster-level `chi.spec.configuration.clusters` configuration for each replica and each shard relates to selected replica, use it only if you fully understand what you do" + # nullable: true + items: + type: object + properties: + name: + type: string + description: "optional, by default replica name is generated, but you can override it and setup custom name" + minLength: 1 + # See namePartShardMaxLen const + maxLength: 15 + pattern: "^[a-zA-Z0-9-]{0,15}$" + settings: + type: object + description: | + optional, allows configure `clickhouse-server` settings inside ... tag in `Pod` only in one replica during generate `ConfigMap` which will mount in `/etc/clickhouse-server/conf.d/` + override top-level `chi.spec.configuration.settings`, cluster-level `chi.spec.configuration.clusters.settings` and will ignore if shard-level `chi.spec.configuration.clusters.layout.shards` present + More details: https://clickhouse.tech/docs/en/operations/settings/settings/ + # nullable: true + x-kubernetes-preserve-unknown-fields: true + files: + type: object + # nullable: true + description: | + optional, allows define content of any setting file inside each `Pod` only in one replica during generate `ConfigMap` which will mount in `/etc/clickhouse-server/config.d/` or `/etc/clickhouse-server/conf.d/` or `/etc/clickhouse-server/users.d/` + override top-level `chi.spec.configuration.files` and cluster-level `chi.spec.configuration.clusters.files`, will ignore if `chi.spec.configuration.clusters.layout.shards` presents + x-kubernetes-preserve-unknown-fields: true + templates: + type: object + description: | + optional, configuration of the templates names which will use for generate Kubernetes resources according to selected replica + override top-level `chi.spec.configuration.templates`, cluster-level `chi.spec.configuration.clusters.templates` + # nullable: true + properties: + hostTemplate: + type: string + description: "optional, template name from chi.spec.templates.hostTemplates, which will apply to configure `clickhouse-server` instance during render ConfigMap resources which will mount into `Pod` only for one replica" + podTemplate: + type: string + description: "optional, template name from chi.spec.templates.podTemplates, allows customization each `Pod` resource during render and reconcile each StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one replica" + dataVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse data directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one shard" + logVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse log directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one shard" + serviceTemplate: + type: string + description: "optional, fully ignores for replica-level" + clusterServiceTemplate: + type: string + description: "optional, fully ignores for replica-level" + shardServiceTemplate: + type: string + description: "optional, fully ignores for replica-level" + replicaServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover each replica inside each shard inside clickhouse cluster described in `chi.spec.configuration.clusters` only for one replica" + volumeClaimTemplate: + type: string + description: "DEPRECATED! VolumeClaimTemplate is deprecated in favor of DataVolumeClaimTemplate and LogVolumeClaimTemplate" + shardsCount: + type: integer + description: "optional, count of shards related to current replica, you can override each shard behavior on low-level `chi.spec.configuration.clusters.layout.replicas.shards`" + minimum: 1 + shards: + type: array + description: "optional, list of shards related to current replica, will ignore if `chi.spec.configuration.clusters.layout.shards` presents" + # nullable: true + items: + # Host + type: object + properties: + name: + type: string + description: "optional, by default shard name is generated, but you can override it and setup custom name" + minLength: 1 + # See namePartReplicaMaxLen const + maxLength: 15 + pattern: "^[a-zA-Z0-9-]{0,15}$" + tcpPort: + type: integer + description: | + optional, setup `Pod.spec.containers.ports` with name `tcp` for selected shard, override `chi.spec.templates.hostTemplates.spec.tcpPort` + allows connect to `clickhouse-server` via TCP Native protocol via kubernetes `Service` + minimum: 1 + maximum: 65535 + httpPort: + type: integer + description: | + optional, setup `Pod.spec.containers.ports` with name `http` for selected shard, override `chi.spec.templates.hostTemplates.spec.httpPort` + allows connect to `clickhouse-server` via HTTP protocol via kubernetes `Service` + minimum: 1 + maximum: 65535 + interserverHTTPPort: + type: integer + description: | + optional, setup `Pod.spec.containers.ports` with name `interserver` for selected shard, override `chi.spec.templates.hostTemplates.spec.interserverHTTPPort` + allows connect between replicas inside same shard during fetch replicated data parts HTTP protocol + minimum: 1 + maximum: 65535 + settings: + type: object + description: | + optional, allows configure `clickhouse-server` settings inside ... tag in `Pod` only in one shard related to current replica during generate `ConfigMap` which will mount in `/etc/clickhouse-server/conf.d/` + override top-level `chi.spec.configuration.settings`, cluster-level `chi.spec.configuration.clusters.settings` and replica-level `chi.spec.configuration.clusters.layout.replicas.settings` + More details: https://clickhouse.tech/docs/en/operations/settings/settings/ + # nullable: true + x-kubernetes-preserve-unknown-fields: true + files: + type: object + description: | + optional, allows define content of any setting file inside each `Pod` only in one shard related to current replica during generate `ConfigMap` which will mount in `/etc/clickhouse-server/config.d/` or `/etc/clickhouse-server/conf.d/` or `/etc/clickhouse-server/users.d/` + override top-level `chi.spec.configuration.files` and cluster-level `chi.spec.configuration.clusters.files`, will ignore if `chi.spec.configuration.clusters.layout.shards` presents + # nullable: true + x-kubernetes-preserve-unknown-fields: true + templates: + type: object + description: | + optional, configuration of the templates names which will use for generate Kubernetes resources according to selected replica + override top-level `chi.spec.configuration.templates`, cluster-level `chi.spec.configuration.clusters.templates`, replica-level `chi.spec.configuration.clusters.layout.replicas.templates` + # nullable: true + properties: + hostTemplate: + type: string + description: "optional, template name from chi.spec.templates.hostTemplates, which will apply to configure each `clickhouse-server` instance during render ConfigMap resources which will mount into `Pod` only for one shard" + podTemplate: + type: string + description: "optional, template name from chi.spec.templates.podTemplates, allows customization each `Pod` resource during render and reconcile each StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one shard" + dataVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse data directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one shard" + logVolumeClaimTemplate: + type: string + description: "optional, template name from chi.spec.templates.volumeClaimTemplates, allows customization each `PVC` which will mount for clickhouse log directory in each `Pod` during render and reconcile every StatefulSet.spec resource described in `chi.spec.configuration.clusters` only for one shard" + serviceTemplate: + type: string + description: "optional, fully ignores for shard-level" + clusterServiceTemplate: + type: string + description: "optional, fully ignores for shard-level" + shardServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover shard inside clickhouse cluster described in `chi.spec.configuration.clusters` only for one shard" + replicaServiceTemplate: + type: string + description: "optional, template name from chi.spec.templates.serviceTemplates, allows customization for each `Service` resource which will created by `clickhouse-operator` which cover each replica inside each shard inside clickhouse cluster described in `chi.spec.configuration.clusters` only for one shard" + volumeClaimTemplate: + type: string + description: "DEPRECATED! VolumeClaimTemplate is deprecated in favor of DataVolumeClaimTemplate and LogVolumeClaimTemplate" + templates: + type: object + description: "allows define templates which will use for render Kubernetes resources like StatefulSet, ConfigMap, Service, PVC, by default, clickhouse-operator have own templates, but you can override it" + # nullable: true + properties: + hostTemplates: + type: array + description: "hostTemplate will use during apply to generate `clickhose-server` config files" + # nullable: true + items: + type: object + #required: + # - name + properties: + name: + description: "template name, could use to link inside top-level `chi.spec.defaults.templates.hostTemplate`, cluster-level `chi.spec.configuration.clusters.templates.hostTemplate`, shard-level `chi.spec.configuration.clusters.layout.shards.temlates.hostTemplate`, replica-level `chi.spec.configuration.clusters.layout.replicas.templates.hostTemplate`" + type: string + portDistribution: + type: array + description: "define how will distribute numeric values of named ports in `Pod.spec.containers.ports` and clickhouse-server configs" + # nullable: true + items: + type: object + #required: + # - type + properties: + type: + type: string + description: "type of distribution, when `Unspecified` (default value) then all listen ports on clickhouse-server configuration in all Pods will have the same value, when `ClusterScopeIndex` then ports will increment to offset from base value depends on shard and replica index inside cluster with combination of `chi.spec.templates.podTemlates.spec.HostNetwork` it allows setup ClickHouse cluster inside Kubernetes and provide access via external network bypass Kubernetes internal network" + enum: + # List PortDistributionXXX constants + - "" + - "Unspecified" + - "ClusterScopeIndex" + spec: + # Host + type: object + properties: + name: + type: string + description: "by default, hostname will generate, but this allows define custom name for each `clickhuse-server`" + minLength: 1 + # See namePartReplicaMaxLen const + maxLength: 15 + pattern: "^[a-zA-Z0-9-]{0,15}$" + tcpPort: + type: integer + description: | + optional, setup `tcp_port` inside `clickhouse-server` settings for each Pod where current template will apply + if specified, should have equal value with `chi.spec.templates.podTemplates.spec.containers.ports[name=tcp]` + More info: https://clickhouse.tech/docs/en/interfaces/tcp/ + minimum: 1 + maximum: 65535 + httpPort: + type: integer + description: | + optional, setup `http_port` inside `clickhouse-server` settings for each Pod where current template will apply + if specified, should have equal value with `chi.spec.templates.podTemplates.spec.containers.ports[name=http]` + More info: https://clickhouse.tech/docs/en/interfaces/http/ + minimum: 1 + maximum: 65535 + interserverHTTPPort: + type: integer + description: | + optional, setup `interserver_http_port` inside `clickhouse-server` settings for each Pod where current template will apply + if specified, should have equal value with `chi.spec.templates.podTemplates.spec.containers.ports[name=interserver]` + More info: https://clickhouse.tech/docs/en/operations/server-configuration-parameters/settings/#interserver-http-port + minimum: 1 + maximum: 65535 + settings: + type: object + description: | + optional, allows configure `clickhouse-server` settings inside ... tag in each `Pod` where this template will apply during generate `ConfigMap` which will mount in `/etc/clickhouse-server/conf.d/` + More details: https://clickhouse.tech/docs/en/operations/settings/settings/ + # nullable: true + x-kubernetes-preserve-unknown-fields: true + files: + type: object + description: | + optional, allows define content of any setting file inside each `Pod` where this template will apply during generate `ConfigMap` which will mount in `/etc/clickhouse-server/config.d/` or `/etc/clickhouse-server/conf.d/` or `/etc/clickhouse-server/users.d/` + # nullable: true + x-kubernetes-preserve-unknown-fields: true + templates: + type: object + description: "be carefull, this part of CRD allows override template inside template, don't use it if you don't understand what you do" + # nullable: true + properties: + hostTemplate: + type: string + podTemplate: + type: string + dataVolumeClaimTemplate: + type: string + logVolumeClaimTemplate: + type: string + serviceTemplate: + type: string + clusterServiceTemplate: + type: string + shardServiceTemplate: + type: string + replicaServiceTemplate: + type: string + podTemplates: + type: array + description: | + podTemplate will use during render `Pod` inside `StatefulSet.spec` and allows define rendered `Pod.spec`, pod scheduling distribution and pod zone + More information: https://github.com/Altinity/clickhouse-operator/blob/master/docs/custom_resource_explained.md#spectemplatespodtemplates + # nullable: true + items: + type: object + #required: + # - name + properties: + name: + type: string + description: "template name, could use to link inside top-level `chi.spec.defaults.templates.podTemplate`, cluster-level `chi.spec.configuration.clusters.templates.podTemplate`, shard-level `chi.spec.configuration.clusters.layout.shards.temlates.podTemplate`, replica-level `chi.spec.configuration.clusters.layout.replicas.templates.podTemplate`" + generateName: + type: string + description: "allows define format for generated `Pod` name, look to https://github.com/Altinity/clickhouse-operator/blob/master/docs/custom_resource_explained.md#spectemplatesservicetemplates for details about aviailable template variables" + zone: + type: object + description: "allows define custom zone name and will separate ClickHouse `Pods` between nodes, shortcut for `chi.spec.templates.podTemplates.spec.affinity.podAntiAffinity`" + #required: + # - values + properties: + key: + type: string + description: "optional, if defined, allows select kubernetes nodes by label with `name` equal `key`" + values: + type: array + description: "optional, if defined, allows select kubernetes nodes by label with `value` in `values`" + # nullable: true + items: + type: string + distribution: + type: string + description: "DEPRECATED, shortcut for `chi.spec.templates.podTemplates.spec.affinity.podAntiAffinity`" + enum: + - "" + - "Unspecified" + - "OnePerHost" + podDistribution: + type: array + description: "define ClickHouse Pod distibution policy between Kubernetes Nodes inside Shard, Replica, Namespace, CHI, another ClickHouse cluster" + # nullable: true + items: + type: object + #required: + # - type + properties: + type: + type: string + description: "you can define multiple affinity policy types" + enum: + # List PodDistributionXXX constants + - "" + - "Unspecified" + - "ClickHouseAntiAffinity" + - "ShardAntiAffinity" + - "ReplicaAntiAffinity" + - "AnotherNamespaceAntiAffinity" + - "AnotherClickHouseInstallationAntiAffinity" + - "AnotherClusterAntiAffinity" + - "MaxNumberPerNode" + - "NamespaceAffinity" + - "ClickHouseInstallationAffinity" + - "ClusterAffinity" + - "ShardAffinity" + - "ReplicaAffinity" + - "PreviousTailAffinity" + - "CircularReplication" + scope: + type: string + description: "scope for apply each podDistribution" + enum: + # list PodDistributionScopeXXX constants + - "" + - "Unspecified" + - "Shard" + - "Replica" + - "Cluster" + - "ClickHouseInstallation" + - "Namespace" + number: + type: integer + description: "define, how much ClickHouse Pods could be inside selected scope with selected distribution type" + minimum: 0 + maximum: 65535 + topologyKey: + type: string + description: "use for inter-pod affinity look to `pod.spec.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution.podAffinityTerm.topologyKey`, More info: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity" + spec: + # TODO specify PodSpec + type: object + description: "allows define whole Pod.spec inside StaefulSet.spec, look to https://kubernetes.io/docs/concepts/workloads/pods/#pod-templates for details" + # nullable: true + x-kubernetes-preserve-unknown-fields: true + metadata: + type: object + description: | + allows pass standard object's metadata from template to Pod + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + # nullable: true + x-kubernetes-preserve-unknown-fields: true + volumeClaimTemplates: + type: array + description: "allows define template for rendering `PVC` kubernetes resource, which would use inside `Pod` for mount clickhouse `data`, clickhouse `logs` or something else" + # nullable: true + items: + type: object + #required: + # - name + # - spec + properties: + name: + description: | + template name, could use to link inside + top-level `chi.spec.defaults.templates.dataVolumeClaimTemplate` or `chi.spec.defaults.templates.logVolumeClaimTemplate`, + cluster-level `chi.spec.configuration.clusters.templates.dataVolumeClaimTemplate` or `chi.spec.configuration.clusters.templates.logVolumeClaimTemplate`, + shard-level `chi.spec.configuration.clusters.layout.shards.temlates.dataVolumeClaimTemplate` or `chi.spec.configuration.clusters.layout.shards.temlates.logVolumeClaimTemplate` + replica-level `chi.spec.configuration.clusters.layout.replicas.templates.dataVolumeClaimTemplate` or `chi.spec.configuration.clusters.layout.replicas.templates.logVolumeClaimTemplate` + type: string + reclaimPolicy: + type: string + description: "define behavior of `PVC` deletion policy during delete `Pod`, `Delete` by default, when `Retain` then `PVC` still alive even `Pod` will deleted" + enum: + - "" + - "Retain" + - "Delete" + metadata: + type: object + description: | + allows pass standard object's metadata from template to PVC + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + # nullable: true + x-kubernetes-preserve-unknown-fields: true + spec: + type: object + description: | + allows define all aspects of `PVC` resource + More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims + # nullable: true + x-kubernetes-preserve-unknown-fields: true + serviceTemplates: + type: array + description: | + allows define template for rendering `Service` which would get endpoint from Pods which scoped chi-wide, cluster-wide, shard-wide, replica-wide level + # nullable: true + items: + type: object + #required: + # - name + # - spec + properties: + name: + type: string + description: | + template name, could use to link inside + chi-level `chi.spec.defaults.templates.serviceTemplate` + cluster-level `chi.spec.configuration.clusters.templates.clusterServiceTemplate` + shard-level `chi.spec.configuration.clusters.layout.shards.temlates.shardServiceTemplate` + replica-level `chi.spec.configuration.clusters.layout.replicas.templates.replicaServiceTemplate` or `chi.spec.configuration.clusters.layout.shards.replicas.replicaServiceTemplate` + generateName: + type: string + description: "allows define format for generated `Service` name, look to https://github.com/Altinity/clickhouse-operator/blob/master/docs/custom_resource_explained.md#spectemplatesservicetemplates for details about aviailable template variables" + metadata: + # TODO specify ObjectMeta + type: object + description: | + allows pass standard object's metadata from template to Service + Could be use for define specificly for Cloud Provider metadata which impact to behavior of service + More info: https://kubernetes.io/docs/concepts/services-networking/service/ + # nullable: true + x-kubernetes-preserve-unknown-fields: true + spec: + # TODO specify ServiceSpec + type: object + description: | + describe behavior of generated Service + More info: https://kubernetes.io/docs/concepts/services-networking/service/ + # nullable: true + x-kubernetes-preserve-unknown-fields: true + useTemplates: + type: array + description: "list of `ClickHouseInstallationTemplate` (chit) resource names which will merge with current `Chi` manifest during render Kubernetes resources to create related ClickHouse clusters" + # nullable: true + items: + type: object + #required: + # - name + properties: + name: + type: string + description: "name of `ClickHouseInstallationTemplate` (chit) resource" + namespace: + type: string + description: "Kubernetes namespace where need search `chit` resource, depending on `watchNamespaces` settings in `clichouse-operator`" + useType: + type: string + description: "optional, current strategy is only merge, and current `chi` settings have more priority than merged template `chit`" + enum: + # List useTypeXXX constants from model + - "" + - "merge" diff --git a/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/crds/CustomResourceDefinition-clickhouseoperatorconfigurations.clickhouse.altinity.com.yaml b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/crds/CustomResourceDefinition-clickhouseoperatorconfigurations.clickhouse.altinity.com.yaml new file mode 100644 index 000000000..515a4c608 --- /dev/null +++ b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/crds/CustomResourceDefinition-clickhouseoperatorconfigurations.clickhouse.altinity.com.yaml @@ -0,0 +1,284 @@ +# Template Parameters: +# +# NONE +# +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: clickhouseoperatorconfigurations.clickhouse.altinity.com + labels: + clickhouse.altinity.com/chop: 0.18.1 +spec: + group: clickhouse.altinity.com + scope: Namespaced + names: + kind: ClickHouseOperatorConfiguration + singular: clickhouseoperatorconfiguration + plural: clickhouseoperatorconfigurations + shortNames: + - chopconf + versions: + - name: v1 + served: true + storage: true + additionalPrinterColumns: + - name: namespaces + type: string + description: Watch namespaces + priority: 0 # show in standard view + jsonPath: .status + schema: + openAPIV3Schema: + type: object + description: "allows customize `clickhouse-operator` settings, need restart clickhouse-operator pod after adding, more details https://github.com/Altinity/clickhouse-operator/blob/master/docs/operator_configuration.md" + x-kubernetes-preserve-unknown-fields: true + properties: + status: + type: object + x-kubernetes-preserve-unknown-fields: true + spec: + type: object + description: | + Allows to define settings of the clickhouse-operator. + More info: https://github.com/Altinity/clickhouse-operator/blob/master/config/config.yaml + Check into etc-clickhouse-operator* ConfigMaps if you need more control + x-kubernetes-preserve-unknown-fields: true + properties: + watch: + type: object + properties: + namespaces: + type: array + description: "List of namespaces where clickhouse-operator watches for events." + items: + type: string + clickhouse: + type: object + properties: + configuration: + type: object + properties: + file: + type: object + properties: + path: + type: object + properties: + common: + type: string + description: "Path to the folder where ClickHouse configuration files common for all instances within a CHI are located. Default - config.d" + host: + type: string + description: "Path to the folder where ClickHouse configuration files unique for each instance (host) within a CHI are located. Default - conf.d" + user: + type: string + description: "Path to the folder where ClickHouse configuration files with users settings are located. Files are common for all instances within a CHI." + user: + type: object + properties: + default: + type: object + properties: + profile: + type: string + description: "ClickHouse server configuration `...` for any " + quota: + type: string + description: "ClickHouse server configuration `...` for any " + networksIP: + type: array + description: "ClickHouse server configuration `...` for any " + items: + type: string + password: + type: string + description: "ClickHouse server configuration `...` for any " + network: + type: object + properties: + hostRegexpTemplate: + type: string + description: "ClickHouse server configuration `...` for any " + access: + type: object + properties: + username: + type: string + description: "ClickHouse username to be used by operator to connect to ClickHouse instances, deprecated, use chCredentialsSecretName" + password: + type: string + description: "ClickHouse password to be used by operator to connect to ClickHouse instances, deprecated, use chCredentialsSecretName" + secret: + type: object + properties: + namespace: + type: string + description: "Location of k8s Secret with username and password to be used by operator to connect to ClickHouse instances" + name: + type: string + description: "Name of k8s Secret with username and password to be used by operator to connect to ClickHouse instances" + port: + type: integer + minimum: 1 + maximum: 65535 + description: "port to be used by operator to connect to ClickHouse instances" + template: + type: object + properties: + chi: + type: object + properties: + path: + type: string + description: "Path to folder where ClickHouseInstallationTemplate .yaml manifests are located." + reconcile: + type: object + properties: + runtime: + type: object + properties: + threadsNumber: + type: integer + minimum: 1 + maximum: 65535 + description: "How many goroutines will be used to reconcile in parallel, 10 by default" + statefulSet: + type: object + properties: + create: + type: object + properties: + onFailure: + type: string + description: | + What to do in case created StatefulSet is not in Ready after `statefulSetUpdateTimeout` seconds + Possible options: + 1. abort - do nothing, just break the process and wait for admin. + 2. delete - delete newly created problematic StatefulSet. + 3. ignore (default) - ignore error, pretend nothing happened and move on to the next StatefulSet. + update: + type: object + properties: + timeout: + type: integer + description: "How many seconds to wait for created/updated StatefulSet to be Ready" + pollInterval: + type: integer + description: "How many seconds to wait between checks for created/updated StatefulSet status" + onFailure: + type: string + description: | + What to do in case updated StatefulSet is not in Ready after `statefulSetUpdateTimeout` seconds + Possible options: + 1. abort - do nothing, just break the process and wait for admin. + 2. rollback (default) - delete Pod and rollback StatefulSet to previous Generation. Pod would be recreated by StatefulSet based on rollback-ed configuration. + 3. ignore - ignore error, pretend nothing happened and move on to the next StatefulSet. + host: + type: object + properties: + wait: + type: object + properties: + exclude: + type: boolean + include: + type: boolean + annotation: + type: object + properties: + include: + type: array + items: + type: string + exclude: + type: array + items: + type: string + label: + type: object + properties: + include: + type: array + items: + type: string + exclude: + type: array + items: + type: string + description: | + When propagating labels from the chi's `metadata.labels` section to child objects' `metadata.labels`, + exclude labels from the following list + appendScope: + type: string + description: | + Whether to append *Scope* labels to StatefulSet and Pod + - "LabelShardScopeIndex" + - "LabelReplicaScopeIndex" + - "LabelCHIScopeIndex" + - "LabelCHIScopeCycleSize" + - "LabelCHIScopeCycleIndex" + - "LabelCHIScopeCycleOffset" + - "LabelClusterScopeIndex" + - "LabelClusterScopeCycleSize" + - "LabelClusterScopeCycleIndex" + - "LabelClusterScopeCycleOffset" + enum: + # List StringBoolXXX constants from model + - "" + - "0" + - "1" + - "False" + - "false" + - "True" + - "true" + - "No" + - "no" + - "Yes" + - "yes" + - "Off" + - "off" + - "On" + - "on" + - "Disable" + - "disable" + - "Enable" + - "enable" + - "Disabled" + - "disabled" + - "Enabled" + - "enabled" + statefulSet: + type: object + properties: + revisionHistoryLimit: + type: integer + pod: + type: object + properties: + terminationGracePeriod: + type: integer + logger: + type: object + properties: + logtostderr: + type: string + description: "boolean, allows logs to stderr" + alsologtostderr: + type: string + description: "boolean allows logs to stderr and files both" + v: + type: string + description: "verbosity level of clickhouse-operator log, default - 1 max - 9" + stderrthreshold: + type: string + vmodule: + type: string + description: | + Comma-separated list of filename=N, where filename (can be a pattern) must have no .go ext, and N is a V level. + Ex.: file*=2 sets the 'V' to 2 in all files with names like file*. + log_backtrace_at: + type: string + description: | + It can be set to a file and line number with a logging line. + Ex.: file.go:123 + Each time when this line is being executed, a stack trace will be written to the Info log. diff --git a/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/hacks/sync-yamls.sh b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/hacks/sync-yamls.sh new file mode 100644 index 000000000..12b38d39e --- /dev/null +++ b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/hacks/sync-yamls.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash + +# +# Script downloads manifest from altinity repo, splits it to separate files +# and puts to the corresponding folders +# NOTE: yq ( https://mikefarah.gitbook.io/yq/ ) > v4.14.x is required +# +# Usage: ./sync.sh +# + +set -o errexit +set -o nounset +set -o pipefail + +readonly repo_url="https://raw.githubusercontent.com/Altinity/clickhouse-operator" +readonly crds_dir="../crds" +readonly templates_dir="../templates/generated" +readonly manifest_path="deploy/operator/clickhouse-operator-install-bundle.yaml" +readonly chart_def="../Chart.yaml" + +function main() { + readonly manifest_url="${repo_url}/$(detect_version)/${manifest_path}" + local tmpdir + tmpdir=$(mktemp -d) + + # shellcheck disable=SC2016 + (cd "${tmpdir}" && curl -s "${manifest_url}" 2>&1 | yq e --no-doc -s '$index') + + for f in "${tmpdir}"/*.yml; do + process "${f}" + done +} + +function process() { + local file="${1}" + + local kind + kind=$(yq e '.kind' "${file}") + + local name + name=$(yq e '.metadata.name' "${file}") + + local processed_file="${kind}-${name}.yaml" + + if [[ "${kind}" == "CustomResourceDefinition" ]]; then + processed_file="${crds_dir}/${processed_file}" + else + processed_file="${templates_dir}/${processed_file}" + fi + + mv "${file}" "${processed_file}" +} + +function detect_version() { + yq e '.appVersion' ${chart_def} +} + +main diff --git a/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/_helpers.tpl b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/_helpers.tpl new file mode 100644 index 000000000..f1cd6318a --- /dev/null +++ b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/_helpers.tpl @@ -0,0 +1,73 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "altinity-clickhouse-operator.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "altinity-clickhouse-operator.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "altinity-clickhouse-operator.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Common labels +*/}} +{{- define "altinity-clickhouse-operator.labels" -}} +helm.sh/chart: {{ include "altinity-clickhouse-operator.chart" . }} +{{ include "altinity-clickhouse-operator.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{/* +Selector labels +*/}} +{{- define "altinity-clickhouse-operator.selectorLabels" -}} +app.kubernetes.io/name: {{ include "altinity-clickhouse-operator.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} + +{{/* +Create the name of the service account to use +*/}} +{{- define "altinity-clickhouse-operator.serviceAccountName" -}} + {{ default (include "altinity-clickhouse-operator.fullname" .) .Values.serviceAccount.name }} +{{- end -}} + +{{/* +Create the tag for the docker image to use +*/}} +{{- define "altinity-clickhouse-operator.operator.tag" -}} +{{- .Values.operator.image.tag | default .Chart.AppVersion -}} +{{- end -}} + +{{/* +Create the tag for the docker image to use +*/}} +{{- define "altinity-clickhouse-operator.metrics.tag" -}} +{{- .Values.metrics.image.tag | default .Chart.AppVersion -}} +{{- end -}} diff --git a/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ClusterRole-clickhouse-operator-kube-system.yaml b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ClusterRole-clickhouse-operator-kube-system.yaml new file mode 100644 index 000000000..3bb1ab7cc --- /dev/null +++ b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ClusterRole-clickhouse-operator-kube-system.yaml @@ -0,0 +1,163 @@ +# Template Parameters: +# +# NAMESPACE=kube-system +# COMMENT=# +# ROLE_KIND=ClusterRole +# ROLE_NAME=clickhouse-operator-kube-system +# ROLE_BINDING_KIND=ClusterRoleBinding +# ROLE_BINDING_NAME=clickhouse-operator-kube-system +# +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: {{ include "altinity-clickhouse-operator.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + clickhouse.altinity.com/chop: 0.18.1 +rules: + - apiGroups: + - "" + resources: + - configmaps + - services + verbs: + - get + - list + - patch + - update + - watch + - create + - delete + - apiGroups: + - "" + resources: + - endpoints + verbs: + - get + - list + - watch + - apiGroups: + - "" + resources: + - events + verbs: + - create + - apiGroups: + - "" + resources: + - persistentvolumeclaims + verbs: + - get + - list + - patch + - update + - watch + - delete + - apiGroups: + - "" + resources: + - persistentvolumes + - pods + verbs: + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - statefulsets + verbs: + - get + - list + - patch + - update + - watch + - create + - delete + - apiGroups: + - apps + resources: + - replicasets + verbs: + - get + - patch + - update + - delete + - apiGroups: + - apps + resourceNames: + - clickhouse-operator + resources: + - deployments + verbs: + - get + - patch + - update + - delete + - apiGroups: + - policy + resources: + - poddisruptionbudgets + verbs: + - get + - list + - patch + - update + - watch + - create + - delete + - apiGroups: + - clickhouse.altinity.com + resources: + - clickhouseinstallations + verbs: + - get + - patch + - update + - delete + - apiGroups: + - clickhouse.altinity.com + resources: + - clickhouseinstallations + - clickhouseinstallationtemplates + - clickhouseoperatorconfigurations + verbs: + - get + - list + - watch + - apiGroups: + - clickhouse.altinity.com + resources: + - clickhouseinstallations/finalizers + - clickhouseinstallationtemplates/finalizers + - clickhouseoperatorconfigurations/finalizers + verbs: + - update + - apiGroups: + - clickhouse.altinity.com + resources: + - clickhouseinstallations/status + - clickhouseinstallationtemplates/status + - clickhouseoperatorconfigurations/status + verbs: + - get + - update + - patch + - create + - delete + - apiGroups: + - "" + resources: + - secrets + verbs: + - get + - list + - apiGroups: + - apiextensions.k8s.io + resources: + - customresourcedefinitions + verbs: + - get + - list diff --git a/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ClusterRoleBinding-clickhouse-operator-kube-system.yaml b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ClusterRoleBinding-clickhouse-operator-kube-system.yaml new file mode 100644 index 000000000..8c8ab1ff1 --- /dev/null +++ b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ClusterRoleBinding-clickhouse-operator-kube-system.yaml @@ -0,0 +1,17 @@ +# Setup ClusterRoleBinding between ClusterRole and ServiceAccount. +# ClusterRoleBinding is namespace-less and must have unique name +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: {{ include "altinity-clickhouse-operator.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + clickhouse.altinity.com/chop: 0.18.1 +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ include "altinity-clickhouse-operator.fullname" . }} +subjects: + - kind: ServiceAccount + name: {{ include "altinity-clickhouse-operator.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} diff --git a/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ConfigMap-etc-clickhouse-operator-confd-files.yaml b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ConfigMap-etc-clickhouse-operator-confd-files.yaml new file mode 100644 index 000000000..e8a9096f0 --- /dev/null +++ b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ConfigMap-etc-clickhouse-operator-confd-files.yaml @@ -0,0 +1,18 @@ +# Template Parameters: +# +# NAME=etc-clickhouse-operator-confd-files +# NAMESPACE=kube-system +# COMMENT= +# +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "altinity-clickhouse-operator.fullname" . }}-confd-files + namespace: {{ .Release.Namespace }} + labels: + clickhouse.altinity.com/chop: 0.18.1 + {{- include "altinity-clickhouse-operator.labels" . | nindent 4 }} +data: +{{- if .Values.configs.confdFiles }} + {{- toYaml .Values.configs.confdFiles | nindent 2 }} +{{ end }} diff --git a/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ConfigMap-etc-clickhouse-operator-configd-files.yaml b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ConfigMap-etc-clickhouse-operator-configd-files.yaml new file mode 100644 index 000000000..983602be4 --- /dev/null +++ b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ConfigMap-etc-clickhouse-operator-configd-files.yaml @@ -0,0 +1,59 @@ +# Template Parameters: +# +# NAME=etc-clickhouse-operator-configd-files +# NAMESPACE=kube-system +# COMMENT= +# +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "altinity-clickhouse-operator.fullname" . }}-configd-files + namespace: {{ .Release.Namespace }} + labels: + clickhouse.altinity.com/chop: 0.18.1 + {{- include "altinity-clickhouse-operator.labels" . | nindent 4 }} +data: +{{- if .Values.configs.configdFiles }} + {{- toYaml .Values.configs.configdFiles | nindent 2 }} +{{ else }} + 01-clickhouse-01-listen.xml: | + + + :: + 0.0.0.0 + 1 + + 01-clickhouse-02-logger.xml: | + + + + debug + /var/log/clickhouse-server/clickhouse-server.log + /var/log/clickhouse-server/clickhouse-server.err.log + 1000M + 10 + + 1 + + + 01-clickhouse-03-query_log.xml: | + + + system + query_log
    + Engine = MergeTree PARTITION BY event_date ORDER BY event_time TTL event_date + interval 30 day + 7500 +
    + +
    + 01-clickhouse-04-part_log.xml: | + + + system + part_log
    + Engine = MergeTree PARTITION BY event_date ORDER BY event_time TTL event_date + interval 30 day + 7500 +
    +
    + +{{ end }} diff --git a/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ConfigMap-etc-clickhouse-operator-files.yaml b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ConfigMap-etc-clickhouse-operator-files.yaml new file mode 100644 index 000000000..5ac2e1bbd --- /dev/null +++ b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ConfigMap-etc-clickhouse-operator-files.yaml @@ -0,0 +1,230 @@ +# Template Parameters: +# +# NAME=etc-clickhouse-operator-files +# NAMESPACE=kube-system +# COMMENT= +# +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "altinity-clickhouse-operator.fullname" . }}-files + namespace: {{ .Release.Namespace }} + labels: + clickhouse.altinity.com/chop: 0.18.1 + {{- include "altinity-clickhouse-operator.labels" . | nindent 4 }} +data: +{{- if .Values.configs.files }} + {{- toYaml .Values.configs.files | nindent 2 }} +{{ else }} + config.yaml: | + # IMPORTANT + # This file is auto-generated from deploy/builder/templates-config. + # It will be overwritten upon next sources build. + # + # Template parameters available: + # watchNamespaces + # chUsername + # chPassword + # password_sha256_hex + + ################################################ + ## + ## Watch Section + ## + ################################################ + watch: + # List of namespaces where clickhouse-operator watches for events. + # Concurrently running operators should watch on different namespaces + #namespaces: ["dev", "test"] + namespaces: [] + + clickhouse: + configuration: + ################################################ + ## + ## Configuration Files Section + ## + ################################################ + file: + path: + # Path to the folder where ClickHouse configuration files common for all instances within a CHI are located. + common: config.d + # Path to the folder where ClickHouse configuration files unique for each instance (host) within a CHI are located. + host: conf.d + # Path to the folder where ClickHouse configuration files with users settings are located. + # Files are common for all instances within a CHI. + user: users.d + ################################################ + ## + ## Configuration Users Section + ## + ################################################ + user: + default: + # Default values for ClickHouse user configuration + # 1. user/profile - string + # 2. user/quota - string + # 3. user/networks/ip - multiple strings + # 4. user/password - string + profile: default + quota: default + networksIP: + - "::1" + - "127.0.0.1" + password: "default" + ################################################ + ## + ## Configuration Network Section + ## + ################################################ + network: + # Default host_regexp to limit network connectivity from outside + hostRegexpTemplate: "(chi-{chi}-[^.]+\\d+-\\d+|clickhouse\\-{chi})\\.{namespace}\\.svc\\.cluster\\.local$" + ################################################ + ## + ## Access to ClickHouse instances + ## + ################################################ + access: + # ClickHouse credentials (username, password and port) to be used by operator to connect to ClickHouse instances + # for: + # 1. Metrics requests + # 2. Schema maintenance + # 3. DROP DNS CACHE + # User with such credentials can be specified in additional ClickHouse .xml config files, + # located in `chUsersConfigsPath` folder + username: "clickhouse_operator" + password: "clickhouse_operator_password" + secret: + # Location of k8s Secret with username and password to be used by operator to connect to ClickHouse instances + # Can be used instead of explicitly specified username and password + namespace: "" + name: "" + # Port where to connect to ClickHouse instances to + port: 8123 + + ################################################ + ## + ## Templates Section + ## + ################################################ + template: + chi: + # Path to the folder where ClickHouseInstallation .yaml manifests are located. + # Manifests are applied in sorted alpha-numeric order. + path: templates.d + + ################################################ + ## + ## Reconcile Section + ## + ################################################ + reconcile: + runtime: + # Max number of concurrent reconciles in progress + threadsNumber: 10 + + statefulSet: + create: + # What to do in case created StatefulSet is not in Ready after `statefulSetUpdateTimeout` seconds + # Possible options: + # 1. abort - do nothing, just break the process and wait for admin + # 2. delete - delete newly created problematic StatefulSet + # 3. ignore - ignore error, pretend nothing happened and move on to the next StatefulSet + onFailure: ignore + + update: + # How many seconds to wait for created/updated StatefulSet to be Ready + timeout: 300 + # How many seconds to wait between checks for created/updated StatefulSet status + pollInterval: 5 + # What to do in case updated StatefulSet is not in Ready after `statefulSetUpdateTimeout` seconds + # Possible options: + # 1. abort - do nothing, just break the process and wait for admin + # 2. rollback - delete Pod and rollback StatefulSet to previous Generation. + # Pod would be recreated by StatefulSet based on rollback-ed configuration + # 3. ignore - ignore error, pretend nothing happened and move on to the next StatefulSet + onFailure: rollback + + host: + wait: + exclude: true + include: false + + ################################################ + ## + ## Annotations management + ## + ################################################ + annotation: + # Applied when: + # 1. Propagating annotations from the CHI's `metadata.annotations` to child objects' `metadata.annotations`, + # 2. Propagating annotations from the CHI Template's `metadata.annotations` to CHI's `metadata.annotations`, + # Include annotations from the following list: + # Applied only when not empty. Empty list means "include all, no selection" + include: [] + # Exclude annotations from the following list: + exclude: [] + + ################################################ + ## + ## Labels management + ## + ################################################ + label: + # Applied when: + # 1. Propagating labels from the CHI's `metadata.labels` to child objects' `metadata.labels`, + # 2. Propagating labels from the CHI Template's `metadata.labels` to CHI's `metadata.labels`, + # Include labels from the following list: + # Applied only when not empty. Empty list means "include all, no selection" + include: [] + # Exclude labels from the following list: + exclude: [] + # Whether to append *Scope* labels to StatefulSet and Pod. + # Full list of available *scope* labels check in labeler.go + # LabelShardScopeIndex + # LabelReplicaScopeIndex + # LabelCHIScopeIndex + # LabelCHIScopeCycleSize + # LabelCHIScopeCycleIndex + # LabelCHIScopeCycleOffset + # LabelClusterScopeIndex + # LabelClusterScopeCycleSize + # LabelClusterScopeCycleIndex + # LabelClusterScopeCycleOffset + appendScope: "no" + + ################################################ + ## + ## StatefulSet management + ## + ################################################ + statefulSet: + revisionHistoryLimit: 0 + + ################################################ + ## + ## Pod management + ## + ################################################ + pod: + # Grace period for Pod termination. + # How many seconds to wait between sending + # SIGTERM and SIGKILL during Pod termination process. + # Increase this number is case of slow shutdown. + terminationGracePeriod: 30 + + ################################################ + ## + ## Log parameters + ## + ################################################ + logger: + logtostderr: "true" + alsologtostderr: "false" + v: "1" + stderrthreshold: "" + vmodule: "" + log_backtrace_at: "" + +{{ end }} \ No newline at end of file diff --git a/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ConfigMap-etc-clickhouse-operator-templatesd-files.yaml b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ConfigMap-etc-clickhouse-operator-templatesd-files.yaml new file mode 100644 index 000000000..c6131c299 --- /dev/null +++ b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ConfigMap-etc-clickhouse-operator-templatesd-files.yaml @@ -0,0 +1,102 @@ +# Template Parameters: +# +# NAME=etc-clickhouse-operator-templatesd-files +# NAMESPACE=kube-system +# COMMENT= +# +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "altinity-clickhouse-operator.fullname" . }}-templatesd-files + namespace: {{ .Release.Namespace }} + labels: + clickhouse.altinity.com/chop: 0.18.1 + {{- include "altinity-clickhouse-operator.labels" . | nindent 4 }} +data: +{{- if .Values.configs.templatesdFiles }} + {{- toYaml .Values.configs.templatesdFiles | nindent 2 }} +{{ else }} + 001-templates.json.example: | + { + "apiVersion": "clickhouse.altinity.com/v1", + "kind": "ClickHouseInstallationTemplate", + "metadata": { + "name": "01-default-volumeclaimtemplate" + }, + "spec": { + "templates": { + "volumeClaimTemplates": [ + { + "name": "chi-default-volume-claim-template", + "spec": { + "accessModes": [ + "ReadWriteOnce" + ], + "resources": { + "requests": { + "storage": "2Gi" + } + } + } + } + ], + "podTemplates": [ + { + "name": "chi-default-oneperhost-pod-template", + "distribution": "OnePerHost", + "spec": { + "containers" : [ + { + "name": "clickhouse", + "image": "yandex/clickhouse-server:21.3", + "ports": [ + { + "name": "http", + "containerPort": 8123 + }, + { + "name": "client", + "containerPort": 9000 + }, + { + "name": "interserver", + "containerPort": 9009 + } + ] + } + ] + } + } + ] + } + } + } + default-pod-template.yaml.example: | + apiVersion: "clickhouse.altinity.com/v1" + kind: "ClickHouseInstallationTemplate" + metadata: + name: "default-oneperhost-pod-template" + spec: + templates: + podTemplates: + - name: default-oneperhost-pod-template + distribution: "OnePerHost" + default-storage-template.yaml.example: | + apiVersion: "clickhouse.altinity.com/v1" + kind: "ClickHouseInstallationTemplate" + metadata: + name: "default-storage-template-2Gi" + spec: + templates: + volumeClaimTemplates: + - name: default-storage-template-2Gi + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 2Gi + readme: | + Templates in this folder are packaged with an operator and available via 'useTemplate' + +{{ end }} diff --git a/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ConfigMap-etc-clickhouse-operator-usersd-files.yaml b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ConfigMap-etc-clickhouse-operator-usersd-files.yaml new file mode 100644 index 000000000..3f6f8f5ce --- /dev/null +++ b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ConfigMap-etc-clickhouse-operator-usersd-files.yaml @@ -0,0 +1,62 @@ +# Template Parameters: +# +# NAME=etc-clickhouse-operator-usersd-files +# NAMESPACE=kube-system +# COMMENT= +# +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "altinity-clickhouse-operator.fullname" . }}-usersd-files + namespace: {{ .Release.Namespace }} + labels: + clickhouse.altinity.com/chop: 0.18.1 + {{- include "altinity-clickhouse-operator.labels" . | nindent 4 }} +data: +{{- if .Values.configs.usersdFiles }} + {{- toYaml .Values.configs.usersdFiles | nindent 2 }} +{{ else }} + 01-clickhouse-user.xml: | + + + + + 127.0.0.1 + 0.0.0.0/0 + ::/0 + + 716b36073a90c6fe1d445ac1af85f4777c5b7a155cea359961826a030513e448 + clickhouse_operator + default + + + + + 0 + 1 + 10 + + + + 02-clickhouse-default-profile.xml: | + + + + 1 + 1000 + 1 + 1 + + + + 03-database-ordinary.xml: | + + + + + Ordinary + + + + +{{ end }} diff --git a/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/Deployment-clickhouse-operator.yaml b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/Deployment-clickhouse-operator.yaml new file mode 100644 index 000000000..e7109ce8c --- /dev/null +++ b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/Deployment-clickhouse-operator.yaml @@ -0,0 +1,175 @@ +# Template Parameters: +# +# NAMESPACE=kube-system +# COMMENT= +# OPERATOR_IMAGE=altinity/clickhouse-operator:0.18.1 +# METRICS_EXPORTER_IMAGE=altinity/metrics-exporter:0.18.1 +# +# Setup Deployment for clickhouse-operator +# Deployment would be created in kubectl-specified namespace +kind: Deployment +apiVersion: apps/v1 +metadata: + name: {{ include "altinity-clickhouse-operator.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + clickhouse.altinity.com/chop: 0.18.1 + {{- include "altinity-clickhouse-operator.labels" . | nindent 4 }} +spec: + replicas: 1 + selector: + matchLabels: + {{- include "altinity-clickhouse-operator.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + {{- include "altinity-clickhouse-operator.selectorLabels" . | nindent 8 }} + annotations: + prometheus.io/port: '8888' + prometheus.io/scrape: 'true' + checksum/confd-files: {{ include (print $.Template.BasePath "/generated/ConfigMap-etc-clickhouse-operator-confd-files.yaml") . | sha256sum }} + checksum/configd-files: {{ include (print $.Template.BasePath "/generated/ConfigMap-etc-clickhouse-operator-configd-files.yaml") . | sha256sum }} + checksum/files: {{ include (print $.Template.BasePath "/generated/ConfigMap-etc-clickhouse-operator-files.yaml") . | sha256sum }} + checksum/templatesd-files: {{ include (print $.Template.BasePath "/generated/ConfigMap-etc-clickhouse-operator-templatesd-files.yaml") . | sha256sum }} + checksum/usersd-files: {{ include (print $.Template.BasePath "/generated/ConfigMap-etc-clickhouse-operator-usersd-files.yaml") . | sha256sum }} + {{- if .Values.podAnnotations }} + {{- toYaml .Values.podAnnotations | nindent 8 }} + {{- end }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "altinity-clickhouse-operator.serviceAccountName" . }} + volumes: + - name: etc-clickhouse-operator-folder + configMap: + name: {{ include "altinity-clickhouse-operator.fullname" . }}-files + - name: etc-clickhouse-operator-confd-folder + configMap: + name: {{ include "altinity-clickhouse-operator.fullname" . }}-confd-files + - name: etc-clickhouse-operator-configd-folder + configMap: + name: {{ include "altinity-clickhouse-operator.fullname" . }}-configd-files + - name: etc-clickhouse-operator-templatesd-folder + configMap: + name: {{ include "altinity-clickhouse-operator.fullname" . }}-templatesd-files + - name: etc-clickhouse-operator-usersd-folder + configMap: + name: {{ include "altinity-clickhouse-operator.fullname" . }}-usersd-files + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.operator.image.repository }}:{{ include "altinity-clickhouse-operator.operator.tag" . }}" + imagePullPolicy: {{ .Values.operator.image.pullPolicy }} + {{- if .Values.operator.command }} + command: + {{- range $value := .Values.operator.command }} + - {{ $value | quote }} + {{- end }} + {{- end }} + {{- if .Values.operator.args }} + args: + {{- range $value := .Values.operator.args }} + - {{ $value | quote }} + {{- end }} + {{- end }} + volumeMounts: + - name: etc-clickhouse-operator-folder + mountPath: /etc/clickhouse-operator + - name: etc-clickhouse-operator-confd-folder + mountPath: /etc/clickhouse-operator/conf.d + - name: etc-clickhouse-operator-configd-folder + mountPath: /etc/clickhouse-operator/config.d + - name: etc-clickhouse-operator-templatesd-folder + mountPath: /etc/clickhouse-operator/templates.d + - name: etc-clickhouse-operator-usersd-folder + mountPath: /etc/clickhouse-operator/users.d + env: + # Pod-specific + # spec.nodeName: ip-172-20-52-62.ec2.internal + - name: OPERATOR_POD_NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + # metadata.name: clickhouse-operator-6f87589dbb-ftcsf + - name: OPERATOR_POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + # metadata.namespace: kube-system + - name: OPERATOR_POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + # status.podIP: 100.96.3.2 + - name: OPERATOR_POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + # spec.serviceAccount: clickhouse-operator + # spec.serviceAccountName: clickhouse-operator + - name: OPERATOR_POD_SERVICE_ACCOUNT + valueFrom: + fieldRef: + fieldPath: spec.serviceAccountName + # Container-specific + - name: OPERATOR_CONTAINER_CPU_REQUEST + valueFrom: + resourceFieldRef: + containerName: {{ .Chart.Name }} + resource: requests.cpu + - name: OPERATOR_CONTAINER_CPU_LIMIT + valueFrom: + resourceFieldRef: + containerName: {{ .Chart.Name }} + resource: limits.cpu + - name: OPERATOR_CONTAINER_MEM_REQUEST + valueFrom: + resourceFieldRef: + containerName: {{ .Chart.Name }} + resource: requests.memory + - name: OPERATOR_CONTAINER_MEM_LIMIT + valueFrom: + resourceFieldRef: + containerName: {{ .Chart.Name }} + resource: limits.memory + {{- with .Values.operator.env }} + {{- toYaml . | nindent 12 }} + {{- end }} + resources: + {{- toYaml .Values.operator.resources | nindent 12 }} + - name: metrics-exporter + image: "{{ .Values.metrics.image.repository }}:{{ include "altinity-clickhouse-operator.metrics.tag" . }}" + imagePullPolicy: {{ .Values.metrics.image.pullPolicy }} + {{- if .Values.metrics.command }} + command: + {{- range $value := .Values.metrics.command }} + - {{ $value | quote }} + {{- end }} + {{- end }} + {{- if .Values.metrics.args }} + args: + {{- range $value := .Values.metrics.args }} + - {{ $value | quote }} + {{- end }} + {{- end }} + volumeMounts: + - name: etc-clickhouse-operator-folder + mountPath: /etc/clickhouse-operator + - name: etc-clickhouse-operator-confd-folder + mountPath: /etc/clickhouse-operator/conf.d + - name: etc-clickhouse-operator-configd-folder + mountPath: /etc/clickhouse-operator/config.d + - name: etc-clickhouse-operator-templatesd-folder + mountPath: /etc/clickhouse-operator/templates.d + - name: etc-clickhouse-operator-usersd-folder + mountPath: /etc/clickhouse-operator/users.d + ports: + - containerPort: 8888 + name: metrics + {{- with .Values.metrics.env }} + env: + {{- toYaml . | nindent 12 }} + {{- end }} + resources: + {{- toYaml .Values.metrics.resources | nindent 12 }} diff --git a/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/Service-clickhouse-operator-metrics.yaml b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/Service-clickhouse-operator-metrics.yaml new file mode 100644 index 000000000..3b03a6715 --- /dev/null +++ b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/Service-clickhouse-operator-metrics.yaml @@ -0,0 +1,25 @@ +# Template Parameters: +# +# NAMESPACE=kube-system +# COMMENT= +# +# Setup ClusterIP Service to provide monitoring metrics for Prometheus +# Service would be created in kubectl-specified namespace +# In order to get access outside of k8s it should be exposed as: +# kubectl --namespace prometheus port-forward service/prometheus 9090 +# and point browser to localhost:9090 +kind: Service +apiVersion: v1 +metadata: + name: {{ include "altinity-clickhouse-operator.fullname" . }}-metrics + namespace: {{ .Release.Namespace }} + labels: + clickhouse.altinity.com/chop: 0.18.1 + {{- include "altinity-clickhouse-operator.labels" . | nindent 4 }} +spec: + ports: + - port: 8888 + name: clickhouse-operator-metrics + targetPort: metrics + selector: + {{- include "altinity-clickhouse-operator.selectorLabels" . | nindent 4 }} diff --git a/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ServiceAccount-clickhouse-operator.yaml b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ServiceAccount-clickhouse-operator.yaml new file mode 100644 index 000000000..d6986674d --- /dev/null +++ b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/generated/ServiceAccount-clickhouse-operator.yaml @@ -0,0 +1,21 @@ +{{- if .Values.serviceAccount.create -}} +# Template Parameters: +# +# COMMENT= +# NAMESPACE=kube-system +# NAME=clickhouse-operator +# +# Setup ServiceAccount +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "altinity-clickhouse-operator.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} + labels: + clickhouse.altinity.com/chop: 0.18.1 + {{- include "altinity-clickhouse-operator.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end -}} diff --git a/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/servicemonitor.yaml b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/servicemonitor.yaml new file mode 100644 index 000000000..b96a4fe2f --- /dev/null +++ b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/templates/servicemonitor.yaml @@ -0,0 +1,18 @@ +{{- if .Values.serviceMonitor.enabled }} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ include "altinity-clickhouse-operator.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "altinity-clickhouse-operator.labels" . | nindent 4 }} + {{- if .Values.serviceMonitor.additionalLabels }} + {{- toYaml .Values.serviceMonitor.additionalLabels | nindent 4 }} + {{- end }} +spec: + endpoints: + - port: clickhouse-operator-metrics + selector: + matchLabels: + {{- include "altinity-clickhouse-operator.selectorLabels" . | nindent 6 }} +{{- end }} diff --git a/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/values.yaml b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/values.yaml new file mode 100644 index 000000000..9ad166824 --- /dev/null +++ b/scripts/helmcharts/databases/charts/clickhouse/charts/altinity-clickhouse-operator/values.yaml @@ -0,0 +1,88 @@ +operator: + image: + # operator.image.repository -- image repository + repository: altinity/clickhouse-operator + # operator.image.tag -- image tag (chart's appVersion value will be used if not set) + tag: "" + # operator.image.pullPolicy -- image pull policy + pullPolicy: IfNotPresent + # operator.resources -- custom resource configuration + resources: {} + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + # operator.env -- additional environment variables for the deployment + env: [ ] + # - name: SAMPLE + # value: text +metrics: + image: + # metrics.image.repository -- image repository + repository: altinity/metrics-exporter + # metrics.image.tag -- image tag (chart's appVersion value will be used if not set) + tag: "" + # metrics.image.pullPolicy -- image pull policy + pullPolicy: IfNotPresent + # metrics.resources -- custom resource configuration + resources: {} + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + # metrics.env -- additional environment variables for the deployment + env: [ ] + # - name: SAMPLE + # value: text + +# imagePullSecrets -- image pull secret for private images +imagePullSecrets: [] +# nameOverride -- override name of the chart +nameOverride: "" +# fullnameOverride -- full name of the chart. +fullnameOverride: "" + +serviceAccount: + # serviceAccount.create -- specifies whether a service account should be created + create: true + # serviceAccount.annotations -- annotations to add to the service account + annotations: {} + # serviceAccount.name -- the name of the service account to use; if not set and create is true, a name is generated using the fullname template + name: + +# nodeSelector -- node for scheduler pod assignment +nodeSelector: {} + +# tolerations -- tolerations for scheduler pod assignment +tolerations: [] + +# affinity -- affinity for scheduler pod assignment +affinity: {} + +serviceMonitor: + # serviceMonitor.enabled -- ServiceMonitor CRD is created for a prometheus operator + enabled: false + # serviceMonitor.additionalLabels -- additional labels for service monitor + additionalLabels: {} + +# configs -- overrides operator default configmaps +configs: + confdFiles: null +# some-file: | +# ... + configdFiles: null +# some-file: | +# ... + files: null +# some-file: | +# ... + templatesdFiles: null +# some-file: | +# ... + usersdFiles: null +# some-file: | +# ... diff --git a/scripts/helmcharts/databases/charts/clickhouse/templates/clickhouse-cluster.yaml b/scripts/helmcharts/databases/charts/clickhouse/templates/clickhouse-cluster.yaml new file mode 100644 index 000000000..f89bd5fed --- /dev/null +++ b/scripts/helmcharts/databases/charts/clickhouse/templates/clickhouse-cluster.yaml @@ -0,0 +1,93 @@ +apiVersion: "clickhouse.altinity.com/v1" +kind: "ClickHouseInstallation" + +metadata: + name: "openreplay-clickhouse" + +spec: + defaults: + templates: + dataVolumeClaimTemplate: default + podTemplate: clickhouse:19.6 + serviceTemplate: chi-service-template + + configuration: + zookeeper: + nodes: + - host: zookeeper + clusters: + - name: replicated + layout: + shardsCount: 1 + replicasCount: 2 + + templates: + volumeClaimTemplates: + - name: default + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: "{{ .Values.storage.size }}" + podTemplates: + - name: clickhouse:19.6 + spec: + containers: + - name: clickhouse-pod + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + resources: + {{ toYaml .Values.resources | nindent 16 }} + + # Ref: https://github.com/Altinity/clickhouse-operator/blob/master/docs/custom_resource_explained.md#spectemplatesservicetemplates + serviceTemplates: + - name: chi-service-template + # generateName understands different sets of macroses, + # depending on the level of the object, for which Service is being created: + # + # For CHI-level Service: + # 1. {chi} - ClickHouseInstallation name + # 2. {chiID} - short hashed ClickHouseInstallation name (BEWARE, this is an experimental feature) + # + # For Cluster-level Service: + # 1. {chi} - ClickHouseInstallation name + # 2. {chiID} - short hashed ClickHouseInstallation name (BEWARE, this is an experimental feature) + # 3. {cluster} - cluster name + # 4. {clusterID} - short hashed cluster name (BEWARE, this is an experimental feature) + # 5. {clusterIndex} - 0-based index of the cluster in the CHI (BEWARE, this is an experimental feature) + # + # For Shard-level Service: + # 1. {chi} - ClickHouseInstallation name + # 2. {chiID} - short hashed ClickHouseInstallation name (BEWARE, this is an experimental feature) + # 3. {cluster} - cluster name + # 4. {clusterID} - short hashed cluster name (BEWARE, this is an experimental feature) + # 5. {clusterIndex} - 0-based index of the cluster in the CHI (BEWARE, this is an experimental feature) + # 6. {shard} - shard name + # 7. {shardID} - short hashed shard name (BEWARE, this is an experimental feature) + # 8. {shardIndex} - 0-based index of the shard in the cluster (BEWARE, this is an experimental feature) + # + # For Replica-level Service: + # 1. {chi} - ClickHouseInstallation name + # 2. {chiID} - short hashed ClickHouseInstallation name (BEWARE, this is an experimental feature) + # 3. {cluster} - cluster name + # 4. {clusterID} - short hashed cluster name (BEWARE, this is an experimental feature) + # 5. {clusterIndex} - 0-based index of the cluster in the CHI (BEWARE, this is an experimental feature) + # 6. {shard} - shard name + # 7. {shardID} - short hashed shard name (BEWARE, this is an experimental feature) + # 8. {shardIndex} - 0-based index of the shard in the cluster (BEWARE, this is an experimental feature) + # 9. {replica} - replica name + # 10. {replicaID} - short hashed replica name (BEWARE, this is an experimental feature) + # 11. {replicaIndex} - 0-based index of the replica in the shard (BEWARE, this is an experimental feature) + generateName: "clickhouse-{chi}" + # type ObjectMeta struct from k8s.io/meta/v1 + metadata: + labels: + installation: "openreplay" + spec: + ports: + - name: http + port: 8123 + - name: client + port: 9000 + type: ClusterIP + diff --git a/scripts/helmcharts/databases/charts/clickhouse/templates/service.yaml b/scripts/helmcharts/databases/charts/clickhouse/templates/service.yaml deleted file mode 100644 index 4496f556c..000000000 --- a/scripts/helmcharts/databases/charts/clickhouse/templates/service.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: clickhouse - labels: - {{- include "clickhouse.labels" . | nindent 4 }} -spec: - type: ClusterIP - ports: - - port: {{ .Values.service.webPort }} - targetPort: web - protocol: TCP - name: web - - port: {{ .Values.service.dataPort }} - targetPort: data - protocol: TCP - name: data - selector: - {{- include "clickhouse.selectorLabels" . | nindent 4 }} diff --git a/scripts/helmcharts/databases/charts/clickhouse/templates/serviceaccount.yaml b/scripts/helmcharts/databases/charts/clickhouse/templates/serviceaccount.yaml deleted file mode 100644 index 1f1183598..000000000 --- a/scripts/helmcharts/databases/charts/clickhouse/templates/serviceaccount.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if .Values.serviceAccount.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "clickhouse.serviceAccountName" . }} - labels: - {{- include "clickhouse.labels" . | nindent 4 }} - {{- with .Values.serviceAccount.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -{{- end }} diff --git a/scripts/helmcharts/databases/charts/clickhouse/templates/statefulset.yaml b/scripts/helmcharts/databases/charts/clickhouse/templates/statefulset.yaml deleted file mode 100644 index 26a11970f..000000000 --- a/scripts/helmcharts/databases/charts/clickhouse/templates/statefulset.yaml +++ /dev/null @@ -1,69 +0,0 @@ -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: {{ include "clickhouse.fullname" . }} - labels: - {{- include "clickhouse.labels" . | nindent 4 }} -spec: - replicas: {{ .Values.replicaCount }} - serviceName: {{ include "clickhouse.fullname" . }} - selector: - matchLabels: - {{- include "clickhouse.selectorLabels" . | nindent 6 }} - template: - metadata: - {{- with .Values.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "clickhouse.selectorLabels" . | nindent 8 }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - serviceAccountName: {{ include "clickhouse.serviceAccountName" . }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - containers: - - name: {{ .Chart.Name }} - env: - {{- range $key, $value := .Values.env }} - - name: "{{ $key }}" - value: "{{ $value }}" - {{- end }} - securityContext: - {{- toYaml .Values.securityContext | nindent 12 }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - ports: - - containerPort: 9000 - name: web - - containerPort: 8123 - name: data - volumeMounts: - - name: ch-volume - mountPath: /var/lib/clickhouse - resources: - {{- toYaml .Values.resources | nindent 12 }} - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} - volumeClaimTemplates: - - metadata: - name: ch-volume - spec: - accessModes: [ "ReadWriteOnce" ] - resources: - requests: - storage: {{ .Values.storageSize }} diff --git a/scripts/helmcharts/databases/charts/clickhouse/values.yaml b/scripts/helmcharts/databases/charts/clickhouse/values.yaml index fc3d1ca10..00689b44d 100644 --- a/scripts/helmcharts/databases/charts/clickhouse/values.yaml +++ b/scripts/helmcharts/databases/charts/clickhouse/values.yaml @@ -1,58 +1,14 @@ -# Default values for clickhouse. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -replicaCount: 1 - image: - repository: yandex/clickhouse-server - pullPolicy: IfNotPresent - # Overrides the image tag whose default is the chart appVersion. - tag: "20.9" + repository: clickhouse/clickhouse-server + tag: "22.3" -imagePullSecrets: [] -nameOverride: "" -fullnameOverride: "" - -serviceAccount: - # Specifies whether a service account should be created - create: true - # Annotations to add to the service account - annotations: {} - # The name of the service account to use. - # If not set and create is true, a name is generated using the fullname template - name: "" - -podAnnotations: {} - -podSecurityContext: {} - # fsGroup: 2000 - -securityContext: {} - # capabilities: - # drop: - # - ALL - # readOnlyRootFilesystem: true - # runAsNonRoot: true - # runAsUser: 1000 - -env: {} - -service: - webPort: 9000 - dataPort: 8123 +storage: + size: 200Gi resources: requests: cpu: 1 - memory: 4Gi + memory: 500Mi limits: - cpu: 2 - memory: 8Gi - -nodeSelector: {} - -tolerations: [] - -affinity: {} -storageSize: 100G + cpu: 1 + memory: 2000Mi From 24f64af95ab46fad270659985de1de92f119d8e4 Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Mon, 16 May 2022 10:52:32 +0200 Subject: [PATCH 126/260] feat(backend/storage): service refactoring --- backend/build.sh | 2 +- backend/cmd/storage/main.go | 66 ++++++++++++ backend/internal/config/storage/config.go | 32 ++++++ .../{services => internal}/storage/clean.go | 10 +- .../{services => internal}/storage/gzip.go | 4 +- backend/internal/storage/storage.go | 58 ++++++++++ backend/services/storage/build_hack | 0 backend/services/storage/main.go | 100 ------------------ 8 files changed, 163 insertions(+), 109 deletions(-) create mode 100644 backend/cmd/storage/main.go create mode 100644 backend/internal/config/storage/config.go rename backend/{services => internal}/storage/clean.go (66%) rename backend/{services => internal}/storage/gzip.go (75%) create mode 100644 backend/internal/storage/storage.go create mode 100644 backend/services/storage/build_hack delete mode 100644 backend/services/storage/main.go diff --git a/backend/build.sh b/backend/build.sh index e67178c8c..97604dd0c 100755 --- a/backend/build.sh +++ b/backend/build.sh @@ -23,7 +23,7 @@ function build_service() { image="$1" echo "BUILDING $image" case "$image" in - http | db | sink | ender | heuristics) + http | db | sink | ender | heuristics | storage) echo build http docker build -t ${DOCKER_REPO:-'local'}/$image:${git_sha1} --platform linux/amd64 --build-arg SERVICE_NAME=$image -f ./cmd/Dockerfile . [[ $PUSH_IMAGE -eq 1 ]] && { diff --git a/backend/cmd/storage/main.go b/backend/cmd/storage/main.go new file mode 100644 index 000000000..57fbd1776 --- /dev/null +++ b/backend/cmd/storage/main.go @@ -0,0 +1,66 @@ +package main + +import ( + "log" + "os" + "os/signal" + "strconv" + "syscall" + "time" + + config "openreplay/backend/internal/config/storage" + "openreplay/backend/internal/storage" + "openreplay/backend/pkg/messages" + "openreplay/backend/pkg/queue" + "openreplay/backend/pkg/queue/types" + s3storage "openreplay/backend/pkg/storage" +) + +func main() { + log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) + + cfg := config.New() + + s3 := s3storage.NewS3(cfg.S3Region, cfg.S3Bucket) + srv, err := storage.New(cfg, s3) + if err != nil { + log.Printf("can't init storage service: %s", err) + return + } + + consumer := queue.NewMessageConsumer( + cfg.GroupStorage, + []string{ + cfg.TopicTrigger, + }, + func(sessionID uint64, msg messages.Message, meta *types.Meta) { + switch msg.(type) { + case *messages.SessionEnd: + srv.UploadKey(strconv.FormatUint(sessionID, 10), 5) + } + }, + true, + ) + + log.Printf("Storage service started\n") + + sigchan := make(chan os.Signal, 1) + signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM) + + cleanTick := time.Tick(time.Duration(cfg.FSCleanHRS) * time.Hour) + for { + select { + case sig := <-sigchan: + log.Printf("Caught signal %v: terminating\n", sig) + consumer.Close() + os.Exit(0) + case <-cleanTick: + go srv.CleanDir(cfg.FSDir) + default: + err := consumer.ConsumeNext() + if err != nil { + log.Fatalf("Error on consumption: %v", err) + } + } + } +} diff --git a/backend/internal/config/storage/config.go b/backend/internal/config/storage/config.go new file mode 100644 index 000000000..305c293c9 --- /dev/null +++ b/backend/internal/config/storage/config.go @@ -0,0 +1,32 @@ +package storage + +import ( + "openreplay/backend/pkg/env" + "time" +) + +type Config struct { + S3Region string + S3Bucket string + FSDir string + FSCleanHRS int + SessionFileSplitSize int + RetryTimeout time.Duration + GroupStorage string + TopicTrigger string + DeleteTimeout time.Duration +} + +func New() *Config { + return &Config{ + S3Region: env.String("AWS_REGION_WEB"), + S3Bucket: env.String("S3_BUCKET_WEB"), + FSDir: env.String("FS_DIR"), + FSCleanHRS: env.Int("FS_CLEAN_HRS"), + SessionFileSplitSize: 200000, // ~200 kB + RetryTimeout: 2 * time.Minute, + GroupStorage: env.String("GROUP_STORAGE"), + TopicTrigger: env.String("TOPIC_TRIGGER"), + DeleteTimeout: 48 * time.Hour, + } +} diff --git a/backend/services/storage/clean.go b/backend/internal/storage/clean.go similarity index 66% rename from backend/services/storage/clean.go rename to backend/internal/storage/clean.go index 72f5f359c..3b6e4d6eb 100644 --- a/backend/services/storage/clean.go +++ b/backend/internal/storage/clean.go @@ -1,4 +1,4 @@ -package main +package storage import ( "io/ioutil" @@ -10,9 +10,7 @@ import ( "openreplay/backend/pkg/flakeid" ) -const DELETE_TIMEOUT = 48 * time.Hour - -func cleanDir(dirname string) { +func (s *Storage) CleanDir(dirname string) { files, err := ioutil.ReadDir(dirname) if err != nil { log.Printf("Cannot read file directory. %v", err) @@ -27,8 +25,8 @@ func cleanDir(dirname string) { continue } ts := int64(flakeid.ExtractTimestamp(id)) - if time.UnixMilli(ts).Add(DELETE_TIMEOUT).Before(time.Now()) { - // returns a error. Don't log it sinse it can be race condition between worker instances + if time.UnixMilli(ts).Add(s.cfg.DeleteTimeout).Before(time.Now()) { + // returns an error. Don't log it since it can be race condition between worker instances os.Remove(dirname + "/" + name) } } diff --git a/backend/services/storage/gzip.go b/backend/internal/storage/gzip.go similarity index 75% rename from backend/services/storage/gzip.go rename to backend/internal/storage/gzip.go index 0e662efaa..ee47e5079 100644 --- a/backend/services/storage/gzip.go +++ b/backend/internal/storage/gzip.go @@ -1,11 +1,11 @@ -package main +package storage import ( gzip "github.com/klauspost/pgzip" "io" ) -func gzipFile(file io.Reader) io.Reader { +func (s *Storage) gzipFile(file io.Reader) io.Reader { reader, writer := io.Pipe() go func() { gw, _ := gzip.NewWriterLevel(writer, gzip.BestSpeed) diff --git a/backend/internal/storage/storage.go b/backend/internal/storage/storage.go new file mode 100644 index 000000000..0051fd5ea --- /dev/null +++ b/backend/internal/storage/storage.go @@ -0,0 +1,58 @@ +package storage + +import ( + "bytes" + "fmt" + "log" + config "openreplay/backend/internal/config/storage" + "openreplay/backend/pkg/storage" + "os" + "time" +) + +type Storage struct { + cfg *config.Config + s3 *storage.S3 +} + +func New(cfg *config.Config, s3 *storage.S3) (*Storage, error) { + switch { + case cfg == nil: + return nil, fmt.Errorf("config is empty") + case s3 == nil: + return nil, fmt.Errorf("s3 storage is empty") + } + return &Storage{s3: s3}, nil +} + +func (s *Storage) UploadKey(key string, retryCount int) { + if retryCount <= 0 { + return + } + + file, err := os.Open(s.cfg.FSDir + "/" + key) + if err != nil { + log.Printf("File error: %v; Will retry %v more time(s)\n", err, retryCount) + time.AfterFunc(s.cfg.RetryTimeout, func() { + s.UploadKey(key, retryCount-1) + }) + return + } + defer file.Close() + + startBytes := make([]byte, s.cfg.SessionFileSplitSize) + nRead, err := file.Read(startBytes) + if err != nil { + log.Printf("File read error: %f", err) + return + } + startReader := bytes.NewBuffer(startBytes) + if err := s.s3.Upload(s.gzipFile(startReader), key, "application/octet-stream", true); err != nil { + log.Fatalf("Storage: start upload failed. %v\n", err) + } + if nRead == s.cfg.SessionFileSplitSize { + if err := s.s3.Upload(s.gzipFile(file), key+"e", "application/octet-stream", true); err != nil { + log.Fatalf("Storage: end upload failed. %v\n", err) + } + } +} diff --git a/backend/services/storage/build_hack b/backend/services/storage/build_hack new file mode 100644 index 000000000..e69de29bb diff --git a/backend/services/storage/main.go b/backend/services/storage/main.go deleted file mode 100644 index 95c5c6d17..000000000 --- a/backend/services/storage/main.go +++ /dev/null @@ -1,100 +0,0 @@ -package main - -import ( - "log" - "os" - "strconv" - "time" - - "bytes" - - "os/signal" - "syscall" - - "openreplay/backend/pkg/env" - "openreplay/backend/pkg/messages" - "openreplay/backend/pkg/queue" - "openreplay/backend/pkg/queue/types" - "openreplay/backend/pkg/storage" -) - -const RetryTimeout = 2 * time.Minute - -const SESSION_FILE_SPLIT_SIZE = 200000 // ~200 kB - -func main() { - log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) - - storage := storage.NewS3(env.String("AWS_REGION_WEB"), env.String("S3_BUCKET_WEB")) - FS_DIR := env.String("FS_DIR") - FS_CLEAN_HRS := env.Int("FS_CLEAN_HRS") - - var uploadKey func(string, int) - uploadKey = func(key string, retryCount int) { - if retryCount <= 0 { - return - } - - file, err := os.Open(FS_DIR + "/" + key) - if err != nil { - log.Printf("File error: %v; Will retry %v more time(s)\n", err, retryCount) - time.AfterFunc(RetryTimeout, func() { - uploadKey(key, retryCount-1) - }) - return - } - defer file.Close() - - startBytes := make([]byte, SESSION_FILE_SPLIT_SIZE) - nRead, err := file.Read(startBytes) - if err != nil { - log.Printf("File read error: %f", err) - return - } - startReader := bytes.NewBuffer(startBytes) - if err := storage.Upload(gzipFile(startReader), key, "application/octet-stream", true); err != nil { - log.Fatalf("Storage: start upload failed. %v\n", err) - } - if nRead == SESSION_FILE_SPLIT_SIZE { - if err := storage.Upload(gzipFile(file), key+"e", "application/octet-stream", true); err != nil { - log.Fatalf("Storage: end upload failed. %v\n", err) - } - } - } - - consumer := queue.NewMessageConsumer( - env.String("GROUP_STORAGE"), - []string{ - env.String("TOPIC_TRIGGER"), - }, - func(sessionID uint64, msg messages.Message, meta *types.Meta) { - switch msg.(type) { - case *messages.SessionEnd: - uploadKey(strconv.FormatUint(sessionID, 10), 5) - } - }, - true, - ) - - sigchan := make(chan os.Signal, 1) - signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM) - - cleanTick := time.Tick(time.Duration(FS_CLEAN_HRS) * time.Hour) - - log.Printf("Storage service started\n") - for { - select { - case sig := <-sigchan: - log.Printf("Caught signal %v: terminating\n", sig) - consumer.Close() - os.Exit(0) - case <-cleanTick: - go cleanDir(FS_DIR) - default: - err := consumer.ConsumeNext() - if err != nil { - log.Fatalf("Error on consumption: %v", err) - } - } - } -} From d36d4862cf2d0e2a9f6c8b9568916b6bd02f5702 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Mon, 16 May 2022 14:12:16 +0200 Subject: [PATCH 127/260] fix(ui) - chart y axis numbers --- .../CustomMetriLineChart/CustomMetriLineChart.tsx | 5 +++-- .../BreakdownOfLoadedResources.tsx | 1 + .../PredefinedWidgets/ErrorsByOrigin/ErrorsByOrigin.tsx | 1 + .../Widgets/PredefinedWidgets/ErrorsByType/ErrorsByType.tsx | 1 + frontend/app/components/ui/Pagination/Pagination.tsx | 3 ++- 5 files changed, 8 insertions(+), 3 deletions(-) diff --git a/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetriLineChart/CustomMetriLineChart.tsx b/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetriLineChart/CustomMetriLineChart.tsx index 198afb088..4da7631fa 100644 --- a/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetriLineChart/CustomMetriLineChart.tsx +++ b/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetriLineChart/CustomMetriLineChart.tsx @@ -31,9 +31,10 @@ function CustomMetriLineChart(props: Props) { Styles.tickFormatter(val)} label={{ - ...Styles.axisLabelLeft, - value: "Number of Sessions" + ...Styles.axisLabelLeft, + value: "Number of Sessions" }} /> diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/BreakdownOfLoadedResources/BreakdownOfLoadedResources.tsx b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/BreakdownOfLoadedResources/BreakdownOfLoadedResources.tsx index fd38e2a55..73a8fd46a 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/BreakdownOfLoadedResources/BreakdownOfLoadedResources.tsx +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/BreakdownOfLoadedResources/BreakdownOfLoadedResources.tsx @@ -33,6 +33,7 @@ function BreakdownOfLoadedResources(props: Props) { {...Styles.yaxis} allowDecimals={false} label={{ ...Styles.axisLabelLeft, value: "Number of Resources" }} + tickFormatter={val => Styles.tickFormatter(val)} /> diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/ErrorsByOrigin/ErrorsByOrigin.tsx b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/ErrorsByOrigin/ErrorsByOrigin.tsx index d7aefebd0..f50859051 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/ErrorsByOrigin/ErrorsByOrigin.tsx +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/ErrorsByOrigin/ErrorsByOrigin.tsx @@ -33,6 +33,7 @@ function ErrorsByOrigin(props: Props) { /> Styles.tickFormatter(val)} label={{ ...Styles.axisLabelLeft, value: "Number of Errors" }} allowDecimals={false} /> diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/ErrorsByType/ErrorsByType.tsx b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/ErrorsByType/ErrorsByType.tsx index 23a6fda45..8d01941c8 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/ErrorsByType/ErrorsByType.tsx +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/ErrorsByType/ErrorsByType.tsx @@ -32,6 +32,7 @@ function ErrorsByType(props: Props) { /> Styles.tickFormatter(val)} label={{ ...Styles.axisLabelLeft, value: "Number of Errors" }} allowDecimals={false} /> diff --git a/frontend/app/components/ui/Pagination/Pagination.tsx b/frontend/app/components/ui/Pagination/Pagination.tsx index a915feee0..203213c90 100644 --- a/frontend/app/components/ui/Pagination/Pagination.tsx +++ b/frontend/app/components/ui/Pagination/Pagination.tsx @@ -4,6 +4,7 @@ import { Icon } from 'UI' import cn from 'classnames' import { debounce } from 'App/utils'; import { Tooltip } from 'react-tippy'; +import { numberWithCommas } from 'App/utils'; interface Props { page: number totalPages: number @@ -57,7 +58,7 @@ export default function Pagination(props: Props) { onChange={(e) => changePage(parseInt(e.target.value))} /> of - {totalPages} + {numberWithCommas(totalPages)} Date: Mon, 16 May 2022 14:12:37 +0200 Subject: [PATCH 128/260] feat(backend/assets): service refactoring --- backend/build.sh | 2 +- backend/{services => cmd}/assets/main.go | 29 +++++++++---------- .../assets/cacher/cacher.go | 0 .../assets/cacher/timeoutMap.go | 0 .../assets/jsexception.go | 4 +-- backend/internal/config/assets/config.go | 23 +++++++++++++++ backend/services/assets/build_hack | 0 7 files changed, 40 insertions(+), 18 deletions(-) rename backend/{services => cmd}/assets/main.go (77%) rename backend/{services => internal}/assets/cacher/cacher.go (100%) rename backend/{services => internal}/assets/cacher/timeoutMap.go (100%) rename backend/{services => internal}/assets/jsexception.go (87%) create mode 100644 backend/internal/config/assets/config.go create mode 100644 backend/services/assets/build_hack diff --git a/backend/build.sh b/backend/build.sh index 97604dd0c..58776c93b 100755 --- a/backend/build.sh +++ b/backend/build.sh @@ -23,7 +23,7 @@ function build_service() { image="$1" echo "BUILDING $image" case "$image" in - http | db | sink | ender | heuristics | storage) + http | db | sink | ender | heuristics | storage | assets) echo build http docker build -t ${DOCKER_REPO:-'local'}/$image:${git_sha1} --platform linux/amd64 --build-arg SERVICE_NAME=$image -f ./cmd/Dockerfile . [[ $PUSH_IMAGE -eq 1 ]] && { diff --git a/backend/services/assets/main.go b/backend/cmd/assets/main.go similarity index 77% rename from backend/services/assets/main.go rename to backend/cmd/assets/main.go index 259918395..3d417d916 100644 --- a/backend/services/assets/main.go +++ b/backend/cmd/assets/main.go @@ -2,35 +2,34 @@ package main import ( "log" - "time" - "os" "os/signal" "syscall" + "time" - "openreplay/backend/pkg/env" + "openreplay/backend/internal/assets" + "openreplay/backend/internal/assets/cacher" + config "openreplay/backend/internal/config/assets" "openreplay/backend/pkg/messages" "openreplay/backend/pkg/queue" "openreplay/backend/pkg/queue/types" - "openreplay/backend/services/assets/cacher" ) func main() { log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) - GROUP_CACHE := env.String("GROUP_CACHE") - TOPIC_CACHE := env.String("TOPIC_CACHE") + cfg := config.New() cacher := cacher.NewCacher( - env.String("AWS_REGION"), - env.String("S3_BUCKET_ASSETS"), - env.String("ASSETS_ORIGIN"), - env.Int("ASSETS_SIZE_LIMIT"), + cfg.AWSRegion, + cfg.S3BucketAssets, + cfg.AssetsOrigin, + cfg.AssetsSizeLimit, ) consumer := queue.NewMessageConsumer( - GROUP_CACHE, - []string{TOPIC_CACHE}, + cfg.GroupCache, + []string{cfg.TopicCache}, func(sessionID uint64, message messages.Message, e *types.Meta) { switch msg := message.(type) { case *messages.AssetCache: @@ -39,7 +38,7 @@ func main() { if msg.Source != "js_exception" { return } - sourceList, err := extractJSExceptionSources(&msg.Payload) + sourceList, err := assets.ExtractJSExceptionSources(&msg.Payload) if err != nil { log.Printf("Error on source extraction: %v", err) return @@ -52,12 +51,12 @@ func main() { true, ) - tick := time.Tick(20 * time.Minute) + log.Printf("Cacher service started\n") sigchan := make(chan os.Signal, 1) signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM) - log.Printf("Cacher service started\n") + tick := time.Tick(20 * time.Minute) for { select { case sig := <-sigchan: diff --git a/backend/services/assets/cacher/cacher.go b/backend/internal/assets/cacher/cacher.go similarity index 100% rename from backend/services/assets/cacher/cacher.go rename to backend/internal/assets/cacher/cacher.go diff --git a/backend/services/assets/cacher/timeoutMap.go b/backend/internal/assets/cacher/timeoutMap.go similarity index 100% rename from backend/services/assets/cacher/timeoutMap.go rename to backend/internal/assets/cacher/timeoutMap.go diff --git a/backend/services/assets/jsexception.go b/backend/internal/assets/jsexception.go similarity index 87% rename from backend/services/assets/jsexception.go rename to backend/internal/assets/jsexception.go index c0b26e0db..180f24df1 100644 --- a/backend/services/assets/jsexception.go +++ b/backend/internal/assets/jsexception.go @@ -1,4 +1,4 @@ -package main +package assets import ( "encoding/json" @@ -9,7 +9,7 @@ type frame struct { FileName string `json:"fileName"` } -func extractJSExceptionSources(payload *string) ([]string, error) { +func ExtractJSExceptionSources(payload *string) ([]string, error) { var frameList []frame err := json.Unmarshal([]byte(*payload), &frameList) if err != nil { diff --git a/backend/internal/config/assets/config.go b/backend/internal/config/assets/config.go new file mode 100644 index 000000000..279a8283c --- /dev/null +++ b/backend/internal/config/assets/config.go @@ -0,0 +1,23 @@ +package assets + +import "openreplay/backend/pkg/env" + +type Config struct { + GroupCache string + TopicCache string + AWSRegion string + S3BucketAssets string + AssetsOrigin string + AssetsSizeLimit int +} + +func New() *Config { + return &Config{ + GroupCache: env.String("GROUP_CACHE"), + TopicCache: env.String("TOPIC_CACHE"), + AWSRegion: env.String("AWS_REGION"), + S3BucketAssets: env.String("S3_BUCKET_ASSETS"), + AssetsOrigin: env.String("ASSETS_ORIGIN"), + AssetsSizeLimit: env.Int("ASSETS_SIZE_LIMIT"), + } +} diff --git a/backend/services/assets/build_hack b/backend/services/assets/build_hack new file mode 100644 index 000000000..e69de29bb From ebbc9cc984e8816f6befa37e561136bf410f097f Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Mon, 16 May 2022 14:18:42 +0200 Subject: [PATCH 129/260] fix(ui) - alert form footer bg --- frontend/app/components/Alerts/AlertForm.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/app/components/Alerts/AlertForm.js b/frontend/app/components/Alerts/AlertForm.js index f4b9362c7..d3258d578 100644 --- a/frontend/app/components/Alerts/AlertForm.js +++ b/frontend/app/components/Alerts/AlertForm.js @@ -71,7 +71,7 @@ const AlertForm = props => { const isThreshold = instance.detectionMethod === 'threshold'; return ( - props.onSubmit(instance)} id="alert-form"> + props.onSubmit(instance)} id="alert-form">
    {
    -
    +
    - of the sessions - -
    + )} )); } -export default CaptureRate; \ No newline at end of file +export default CaptureRate; diff --git a/frontend/app/components/shared/SessionSettings/components/DefaultPlaying.tsx b/frontend/app/components/shared/SessionSettings/components/DefaultPlaying.tsx index cb80c30b2..4ebd067a9 100644 --- a/frontend/app/components/shared/SessionSettings/components/DefaultPlaying.tsx +++ b/frontend/app/components/shared/SessionSettings/components/DefaultPlaying.tsx @@ -2,24 +2,31 @@ import React from 'react'; import { Toggler } from 'UI'; import { useStore } from 'App/mstore'; import { useObserver } from 'mobx-react-lite'; +import { toast } from 'react-toastify'; function DefaultPlaying(props) { const { settingsStore } = useStore(); const sessionSettings = useObserver(() => settingsStore.sessionSettings) - + + const toggleSkipToIssue = () => { + sessionSettings.updateKey('skipToIssue', !sessionSettings.skipToIssue) + toast.success("Default playing option saved successfully"); + } + + return useObserver(() => ( <> -

    Default Playing Options

    +

    Default Playing Option

    Always start playing the session from the first issue.
    sessionSettings.updateKey('skipToIssue', !sessionSettings.skipToIssue)} + onChange={toggleSkipToIssue} />
    )); } -export default DefaultPlaying; \ No newline at end of file +export default DefaultPlaying; diff --git a/frontend/app/components/shared/SessionSettings/components/ListingVisibility.tsx b/frontend/app/components/shared/SessionSettings/components/ListingVisibility.tsx index c358f9389..c5741fb14 100644 --- a/frontend/app/components/shared/SessionSettings/components/ListingVisibility.tsx +++ b/frontend/app/components/shared/SessionSettings/components/ListingVisibility.tsx @@ -3,6 +3,7 @@ import Select from 'Shared/Select'; import { Button, Input } from 'UI'; import { useStore } from 'App/mstore'; import { useObserver } from 'mobx-react-lite'; +import { toast } from 'react-toastify'; const numberOptions = [ { label: 'Less than', value: '<' }, @@ -19,18 +20,27 @@ function ListingVisibility(props) { const sessionSettings = useObserver(() => settingsStore.sessionSettings) const [durationSettings, setDurationSettings] = React.useState(sessionSettings.durationFilter); + const changeSettings = (changes) => { + setDurationSettings({ ...durationSettings, ...changes }); + setChanged(true); + } + const saveSettings = () => { + sessionSettings.updateKey('durationFilter', durationSettings); + setChanged(false); + toast.success("Listing visibility settings saved successfully"); + } + return ( <>

    Listing Visibility

    -
    Do not show sessions duration with.
    +
    Do not show sessions with duration.
    { - setTimezone(value); - setChanged(true); - }} + onChange={onSelectChange} />
    - +
    This change will impact the timestamp on session card and player.
    From 09056c103c18c1fa41431c1985b1de4a6bcbb699 Mon Sep 17 00:00:00 2001 From: sylenien Date: Mon, 16 May 2022 14:35:11 +0200 Subject: [PATCH 138/260] feat(ui): moved saved search list to new modal component --- .../shared/SavedSearch/SavedSearch.tsx | 7 +- .../SavedSearchModal/SavedSearchModal.tsx | 112 ++++++++++++++++++ .../components/SavedSearchModal/index.ts | 1 + .../SavedSearchModal/savedSearchModal.css | 40 +++++++ frontend/app/types/ts/search.ts | 14 +++ 5 files changed, 171 insertions(+), 3 deletions(-) create mode 100644 frontend/app/components/shared/SavedSearch/components/SavedSearchModal/SavedSearchModal.tsx create mode 100644 frontend/app/components/shared/SavedSearch/components/SavedSearchModal/index.ts create mode 100644 frontend/app/components/shared/SavedSearch/components/SavedSearchModal/savedSearchModal.css create mode 100644 frontend/app/types/ts/search.ts diff --git a/frontend/app/components/shared/SavedSearch/SavedSearch.tsx b/frontend/app/components/shared/SavedSearch/SavedSearch.tsx index b67b318be..2965c6a4d 100644 --- a/frontend/app/components/shared/SavedSearch/SavedSearch.tsx +++ b/frontend/app/components/shared/SavedSearch/SavedSearch.tsx @@ -5,8 +5,9 @@ import { connect } from 'react-redux'; import { fetchList as fetchListSavedSearch } from 'Duck/search'; import OutsideClickDetectingDiv from 'Shared/OutsideClickDetectingDiv'; import cn from 'classnames'; -import { list } from 'App/components/BugFinder/CustomFilters/filterModal.css'; import stl from './SavedSearch.css'; +import { useModal } from 'App/components/Modal'; +import SavedSearchModal from './components/SavedSearchModal' interface Props { fetchListSavedSearch: () => void; @@ -17,6 +18,7 @@ function SavedSearch(props) { const { list } = props; const { savedSearch } = props; const [showMenu, setShowMenu] = useState(false) + const { showModal } = useModal(); useEffect(() => { props.fetchListSavedSearch() @@ -24,14 +26,13 @@ function SavedSearch(props) { return ( setShowMenu(false)} >
    - +
    @@ -172,7 +172,7 @@ const AlertForm = props => { )} { !unit && ( { name="webhook" type="checkbox" checked={ instance.webhook } - onClick={ onChangeOption } + onClick={ onChangeOption } label="Webhook" />
    @@ -266,7 +266,7 @@ const AlertForm = props => {
    - {
    )} - + {instance.webhook && (
    @@ -294,8 +294,8 @@ const AlertForm = props => { } />
    - - + +
    } +
    -
    - {dashboard.exists() && } -
    -
    - { !dashboard.exists() && ( - <> - -

    Create new dashboard by choosing from the range of predefined metrics that you care about. You can always add your custom metrics later.

    - - )} - + { !dashboard.exists() && ( + <> + +

    Create new dashboard by choosing from the range of predefined metrics that you care about. You can always add your custom metrics later.

    + + )} + -
    - - {selectedWidgetsCount} Widgets +
    + + {selectedWidgetsCount} Metrics +
    )); } -export default withRouter(DashboardModal); \ No newline at end of file +export default withRouter(DashboardModal); diff --git a/frontend/app/components/Dashboard/components/DashboardOptions/DashboardOptions.tsx b/frontend/app/components/Dashboard/components/DashboardOptions/DashboardOptions.tsx index b616d2e50..08e5f88f4 100644 --- a/frontend/app/components/Dashboard/components/DashboardOptions/DashboardOptions.tsx +++ b/frontend/app/components/Dashboard/components/DashboardOptions/DashboardOptions.tsx @@ -19,10 +19,10 @@ function DashboardOptions(props: Props) { if (isEnterprise) { menuItems.unshift({ icon: 'pdf-download', text: 'Download Report', onClick: renderReport }); } - + return ( ); @@ -30,4 +30,4 @@ function DashboardOptions(props: Props) { export default connect(state => ({ isEnterprise: state.getIn([ 'user', 'client', 'edition' ]) === 'ee', -}))(DashboardOptions); \ No newline at end of file +}))(DashboardOptions); diff --git a/frontend/app/components/Dashboard/components/DashboardRouter/DashboardRouter.tsx b/frontend/app/components/Dashboard/components/DashboardRouter/DashboardRouter.tsx index 6004202a2..31e509d52 100644 --- a/frontend/app/components/Dashboard/components/DashboardRouter/DashboardRouter.tsx +++ b/frontend/app/components/Dashboard/components/DashboardRouter/DashboardRouter.tsx @@ -58,4 +58,4 @@ function DashboardRouter(props: Props) { ); } -export default withRouter(DashboardRouter); \ No newline at end of file +export default withRouter(DashboardRouter); diff --git a/frontend/app/components/Dashboard/components/DashboardSideMenu/DashboardSideMenu.tsx b/frontend/app/components/Dashboard/components/DashboardSideMenu/DashboardSideMenu.tsx index 9dd64733c..7d2ca62b4 100644 --- a/frontend/app/components/Dashboard/components/DashboardSideMenu/DashboardSideMenu.tsx +++ b/frontend/app/components/Dashboard/components/DashboardSideMenu/DashboardSideMenu.tsx @@ -11,15 +11,18 @@ import DashboardModal from '../DashboardModal'; import cn from 'classnames'; import { Tooltip } from 'react-tippy'; import { connect } from 'react-redux'; +import { compose } from 'redux' import { setShowAlerts } from 'Duck/dashboard'; +import stl from 'Shared/MainSearchBar/mainSearchBar.css'; const SHOW_COUNT = 8; + interface Props { siteId: string history: any setShowAlerts: (show: boolean) => void } -function DashboardSideMenu(props: Props) { +function DashboardSideMenu(props: RouteComponentProps) { const { history, siteId, setShowAlerts } = props; const { hideModal, showModal } = useModal(); const { dashboardStore } = useStore(); @@ -40,7 +43,7 @@ function DashboardSideMenu(props: Props) { const onAddDashboardClick = (e) => { dashboardStore.initDashboard(); - showModal(, {}) + showModal(, { right: true }) } const togglePinned = (dashboard) => { @@ -49,11 +52,24 @@ function DashboardSideMenu(props: Props) { return useObserver(() => (
    - + + + Create + + } + /> {dashboardsPicked.sort((a: any, b: any) => a.isPinned === b.isPinned ? 0 : a.isPinned ? -1 : 1 ).map((item: any) => ( onItemClick(item)} @@ -92,14 +108,6 @@ function DashboardSideMenu(props: Props) { )}
    -
    - -
    setShowAlerts(true)} - /> + />
    )); } -export default connect(null, { setShowAlerts })(withRouter(DashboardSideMenu)); \ No newline at end of file +export default compose( + withRouter, + connect(null, { setShowAlerts }), +)(DashboardSideMenu) as React.FunctionComponent> From 8a29f8ecf4d555561c9bb8e9fcb8f2778696db3d Mon Sep 17 00:00:00 2001 From: sylenien Date: Mon, 16 May 2022 17:52:46 +0200 Subject: [PATCH 152/260] fix(ui): wording, keys warnings --- .../DashboardView/DashboardView.tsx | 36 +++++++++--------- .../MetricListItem/MetricListItem.tsx | 4 +- .../components/MetricsList/MetricsList.tsx | 6 ++- .../components/MetricsView/MetricsView.tsx | 4 +- .../components/WidgetForm/WidgetForm.tsx | 12 +++--- .../WidgetWrapper/WidgetWrapper.tsx | 38 ++++++++++--------- 6 files changed, 53 insertions(+), 47 deletions(-) diff --git a/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx b/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx index 083e55d1a..69f7b7297 100644 --- a/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx +++ b/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx @@ -1,5 +1,5 @@ import React, { useEffect } from 'react'; -import { useObserver } from 'mobx-react-lite'; +import { observer } from 'mobx-react-lite'; import { useStore } from 'App/mstore'; import { Button, PageTitle, Loader, NoContent } from 'UI'; import { withSiteId } from 'App/routes'; @@ -26,12 +26,12 @@ interface Props { function DashboardView(props: Props) { const { siteId, dashboardId } = props; const { dashboardStore } = useStore(); - const { hideModal, showModal } = useModal(); - const showAlertModal = useObserver(() => dashboardStore.showAlertModal); - const loading = useObserver(() => dashboardStore.fetchingDashboard); - const dashboards = useObserver(() => dashboardStore.dashboards); - const dashboard: any = useObserver(() => dashboardStore.selectedDashboard); - const period = useObserver(() => dashboardStore.period); + const { showModal } = useModal(); + const showAlertModal = dashboardStore.showAlertModal; + const loading = dashboardStore.fetchingDashboard; + const dashboards = dashboardStore.dashboards; + const dashboard: any = dashboardStore.selectedDashboard; + const period = dashboardStore.period; const [showEditModal, setShowEditModal] = React.useState(false); useEffect(() => { @@ -43,10 +43,10 @@ function DashboardView(props: Props) { if (dashboardId) return; dashboardStore.selectDefaultDashboard(); }, []); - + const onAddWidgets = () => { dashboardStore.initDashboard(dashboard) - showModal(, {}) + showModal(, { right: true }) } const onEdit = () => { @@ -67,17 +67,17 @@ function DashboardView(props: Props) { }); } } - - return useObserver(() => ( + + return ( Gather and analyze
    important metrics in one place.} size="small" iconSize={180} subtext={ - + } >
    @@ -95,7 +95,7 @@ function DashboardView(props: Props) { } /> - +
    @@ -132,9 +132,9 @@ function DashboardView(props: Props) {
    - )); + ); } export default withPageTitle('Dashboards - OpenReplay')( - withReport(withRouter(withModal(DashboardView))) -); \ No newline at end of file + withReport(withRouter(withModal(observer(DashboardView)))) +); diff --git a/frontend/app/components/Dashboard/components/MetricListItem/MetricListItem.tsx b/frontend/app/components/Dashboard/components/MetricListItem/MetricListItem.tsx index f9f5e6d96..cbeb4ee4e 100644 --- a/frontend/app/components/Dashboard/components/MetricListItem/MetricListItem.tsx +++ b/frontend/app/components/Dashboard/components/MetricListItem/MetricListItem.tsx @@ -9,12 +9,14 @@ interface Props { function DashboardLink({ dashboards}) { return ( dashboards.map(dashboard => ( +
    ·
    {dashboard.name}
    +
    )) ); } @@ -44,4 +46,4 @@ function MetricListItem(props: Props) { ); } -export default MetricListItem; \ No newline at end of file +export default MetricListItem; diff --git a/frontend/app/components/Dashboard/components/MetricsList/MetricsList.tsx b/frontend/app/components/Dashboard/components/MetricsList/MetricsList.tsx index 9d895de13..10b061c8b 100644 --- a/frontend/app/components/Dashboard/components/MetricsList/MetricsList.tsx +++ b/frontend/app/components/Dashboard/components/MetricsList/MetricsList.tsx @@ -39,7 +39,9 @@ function MetricsList(props: Props) {
    {sliceListPerPage(list, metricStore.page - 1, metricStore.pageSize).map((metric: any) => ( - + + + ))}
    @@ -56,4 +58,4 @@ function MetricsList(props: Props) { )); } -export default MetricsList; \ No newline at end of file +export default MetricsList; diff --git a/frontend/app/components/Dashboard/components/MetricsView/MetricsView.tsx b/frontend/app/components/Dashboard/components/MetricsView/MetricsView.tsx index 9d82d6288..9fffa8624 100644 --- a/frontend/app/components/Dashboard/components/MetricsView/MetricsView.tsx +++ b/frontend/app/components/Dashboard/components/MetricsView/MetricsView.tsx @@ -24,7 +24,7 @@ function MetricsView(props: Props) { {metricsCount}
    - +
    @@ -34,4 +34,4 @@ function MetricsView(props: Props) { )); } -export default withPageTitle('Metrics - OpenReplay')(MetricsView); \ No newline at end of file +export default withPageTitle('Metrics - OpenReplay')(MetricsView); diff --git a/frontend/app/components/Dashboard/components/WidgetForm/WidgetForm.tsx b/frontend/app/components/Dashboard/components/WidgetForm/WidgetForm.tsx index 79b44bc5a..a66126577 100644 --- a/frontend/app/components/Dashboard/components/WidgetForm/WidgetForm.tsx +++ b/frontend/app/components/Dashboard/components/WidgetForm/WidgetForm.tsx @@ -34,17 +34,17 @@ function WidgetForm(props: Props) { const write = ({ target: { value, name } }) => metricStore.merge({ [ name ]: value }); const writeOption = (e, { value, name }) => { const obj = { [ name ]: value }; - + if (name === 'metricValue') { obj['metricValue'] = [value]; } - + if (name === 'metricOf') { if (value === FilterKey.ISSUE) { obj['metricValue'] = ['all']; } } - + if (name === 'metricType') { if (value === 'timeseries') { obj['metricOf'] = timeseriesOptions[0].value; @@ -67,7 +67,7 @@ function WidgetForm(props: Props) { } else { history.push(withSiteId(metricDetails(metric.metricId), siteId)); } - + } }); } @@ -85,7 +85,7 @@ function WidgetForm(props: Props) { const onObserveChanges = () => { // metricStore.fetchMetricChartData(metric); } - + return useObserver(() => (
    @@ -222,4 +222,4 @@ function WidgetForm(props: Props) { )); } -export default WidgetForm; \ No newline at end of file +export default WidgetForm; diff --git a/frontend/app/components/Dashboard/components/WidgetWrapper/WidgetWrapper.tsx b/frontend/app/components/Dashboard/components/WidgetWrapper/WidgetWrapper.tsx index 8f2d5b051..cfccd664c 100644 --- a/frontend/app/components/Dashboard/components/WidgetWrapper/WidgetWrapper.tsx +++ b/frontend/app/components/Dashboard/components/WidgetWrapper/WidgetWrapper.tsx @@ -30,7 +30,7 @@ interface Props { function WidgetWrapper(props: Props) { const { dashboardStore } = useStore(); const { isWidget = false, active = false, index = 0, moveListItem = null, isPreview = false, isTemplate = false, dashboardId, siteId } = props; - const widget: any = useObserver(() => props.widget); + const widget: any = useObserver(() => props.widget); const isPredefined = widget.metricType === 'predefined'; const dashboard = useObserver(() => dashboardStore.selectedDashboard); const isOverviewWidget = widget.widgetType === 'predefined' && widget.viewType === 'overview'; @@ -69,13 +69,13 @@ function WidgetWrapper(props: Props) { const onChartClick = () => { if (!isWidget || isPredefined) return; - + props.history.push(withSiteId(dashboardMetricDetails(dashboard?.dashboardId, widget.metricId),siteId)); } const ref: any = useRef(null) const dragDropRef: any = dragRef(dropRef(ref)) - + return useObserver(() => (
    )} - - + + {!isTemplate && ( + + )}
    )}
    @@ -128,4 +130,4 @@ function WidgetWrapper(props: Props) { )); } -export default withRouter(WidgetWrapper); \ No newline at end of file +export default withRouter(WidgetWrapper); From fec8b9e13c9a0e7a0acb04994c965a3dd10eaa2c Mon Sep 17 00:00:00 2001 From: sylenien Date: Mon, 16 May 2022 17:53:42 +0200 Subject: [PATCH 153/260] fix(ui): fix clipping bg on hover, fix side menu header --- .../components/Dashboard/SideMenu/SideMenuHeader.js | 2 +- .../components/Dashboard/SideMenu/SideMenuSection.js | 10 +++++----- .../app/components/Errors/SideMenu/SideMenuHeader.js | 2 +- frontend/app/components/Modal/index.tsx | 2 +- frontend/app/components/ui/ItemMenu/ItemMenu.js | 4 ++-- .../components/ui/SideMenuHeader/SideMenuHeader.tsx | 11 +++++++---- 6 files changed, 17 insertions(+), 14 deletions(-) diff --git a/frontend/app/components/Dashboard/SideMenu/SideMenuHeader.js b/frontend/app/components/Dashboard/SideMenu/SideMenuHeader.js index 7f237263a..7be18b006 100644 --- a/frontend/app/components/Dashboard/SideMenu/SideMenuHeader.js +++ b/frontend/app/components/Dashboard/SideMenu/SideMenuHeader.js @@ -10,4 +10,4 @@ function SideMenuHeader({ text, className }) { } SideMenuHeader.displayName = "SideMenuHeader"; -export default SideMenuHeader; \ No newline at end of file +export default SideMenuHeader; diff --git a/frontend/app/components/Dashboard/SideMenu/SideMenuSection.js b/frontend/app/components/Dashboard/SideMenu/SideMenuSection.js index 494ce7128..338094107 100644 --- a/frontend/app/components/Dashboard/SideMenu/SideMenuSection.js +++ b/frontend/app/components/Dashboard/SideMenu/SideMenuSection.js @@ -7,13 +7,13 @@ import { NavLink } from 'react-router-dom'; import { withSiteId } from 'App/routes'; import CustomMetrics from 'Shared/CustomMetrics'; -function SideMenuSection({ title, items, onItemClick, setShowAlerts, siteId }) { +function SideMenuSection({ title, items, onItemClick, setShowAlerts, siteId, activeSection }) { return ( <> { items.filter(i => i.section === 'metrics').map(item => setShowAlerts(true)} - /> + />
    -
    +
    @@ -42,4 +42,4 @@ SideMenuSection.displayName = "SideMenuSection"; export default connect(state => ({ siteId: state.getIn([ 'site', 'siteId' ]) -}), { setShowAlerts })(SideMenuSection); \ No newline at end of file +}), { setShowAlerts })(SideMenuSection); diff --git a/frontend/app/components/Errors/SideMenu/SideMenuHeader.js b/frontend/app/components/Errors/SideMenu/SideMenuHeader.js index 7f237263a..7be18b006 100644 --- a/frontend/app/components/Errors/SideMenu/SideMenuHeader.js +++ b/frontend/app/components/Errors/SideMenu/SideMenuHeader.js @@ -10,4 +10,4 @@ function SideMenuHeader({ text, className }) { } SideMenuHeader.displayName = "SideMenuHeader"; -export default SideMenuHeader; \ No newline at end of file +export default SideMenuHeader; diff --git a/frontend/app/components/Modal/index.tsx b/frontend/app/components/Modal/index.tsx index 339a79fbd..dba7d0c08 100644 --- a/frontend/app/components/Modal/index.tsx +++ b/frontend/app/components/Modal/index.tsx @@ -54,4 +54,4 @@ export class ModalProvider extends Component { export const ModalConsumer = ModalContext.Consumer; -export const useModal = () => React.useContext(ModalContext); \ No newline at end of file +export const useModal = () => React.useContext(ModalContext); diff --git a/frontend/app/components/ui/ItemMenu/ItemMenu.js b/frontend/app/components/ui/ItemMenu/ItemMenu.js index 450cd7fc7..422344377 100644 --- a/frontend/app/components/ui/ItemMenu/ItemMenu.js +++ b/frontend/app/components/ui/ItemMenu/ItemMenu.js @@ -26,7 +26,7 @@ export default class ItemMenu extends React.PureComponent { return (
    -
    {label}}
    { this.menuBtnRef = ref; } } - className={cn("rounded-full flex items-center justify-center hover:bg-gray-light", { 'bg-gray-light' : displayed, "w-10 h-10" : !label })} + className={cn("rounded-full flex items-center justify-center", { 'bg-gray-light' : displayed, "w-10 h-10" : !label })} role="button" > diff --git a/frontend/app/components/ui/SideMenuHeader/SideMenuHeader.tsx b/frontend/app/components/ui/SideMenuHeader/SideMenuHeader.tsx index 2a5ccd6fa..25545ba32 100644 --- a/frontend/app/components/ui/SideMenuHeader/SideMenuHeader.tsx +++ b/frontend/app/components/ui/SideMenuHeader/SideMenuHeader.tsx @@ -3,12 +3,15 @@ import cn from 'classnames'; import stl from './sideMenuHeader.css'; function SideMenuHeader(props) { - const { text, className } = props; + const { text, className, button } = props; return ( -
    - { text } +
    +
    + { text } +
    +
    {button}
    ) } -export default SideMenuHeader; \ No newline at end of file +export default SideMenuHeader; From a2c999ccefca1db2ac2a49f875db9fbc70ac6271 Mon Sep 17 00:00:00 2001 From: sylenien Date: Mon, 16 May 2022 17:54:20 +0200 Subject: [PATCH 154/260] fix(ui): fix weird wording, bug with svg --- frontend/app/svg/icons/dashboard-icn.svg | 48 ++++++++++++++++++++++++ frontend/app/types/dashboard/index.js | 8 ++-- frontend/scripts/icons.js | 9 +++-- 3 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 frontend/app/svg/icons/dashboard-icn.svg diff --git a/frontend/app/svg/icons/dashboard-icn.svg b/frontend/app/svg/icons/dashboard-icn.svg new file mode 100644 index 000000000..c14996229 --- /dev/null +++ b/frontend/app/svg/icons/dashboard-icn.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/app/types/dashboard/index.js b/frontend/app/types/dashboard/index.js index 7359334e5..c250d64d6 100644 --- a/frontend/app/types/dashboard/index.js +++ b/frontend/app/types/dashboard/index.js @@ -2,7 +2,7 @@ import { Map, List } from 'immutable'; import Session from 'Types/session'; import { camelCased } from 'App/utils'; -import { getChartFormatter } from './helper'; +import { getChartFormatter } from './helper'; import ProcessedSessions from './processedSessions'; import DomBuildingTime from './domBuildingTime'; import MemoryConsumption from './memoryConsumption'; @@ -84,7 +84,7 @@ export const WIDGET_LIST = [{ if (sessionK1 !== sessionK2) return sessionK2 - sessionK1; return i2.avgDuration - i1.avgDuration; }), - }, + }, // { // key: "errorsTrend", // name: "Most Impactful Errors", @@ -130,7 +130,7 @@ export const WIDGET_LIST = [{ }, { key: "overview", - name: "Overview Widgets", + name: "Overview Metrics", description: 'List of resources that are slowing down your website, sorted by the number of impacted sessions.', thumb: 'na.png', dataWrapper: (p, period) => { @@ -571,7 +571,7 @@ WIDGET_LIST.forEach(w => { WIDGET_MAP[ w.key ] = w; }); const OVERVIEW_WIDGET_MAP = {}; WIDGET_LIST.filter(w => w.type === 'overview').forEach(w => { OVERVIEW_WIDGET_MAP[ w.key ] = w; }); -export { +export { WIDGET_MAP, OVERVIEW_WIDGET_MAP, ProcessedSessions, diff --git a/frontend/scripts/icons.js b/frontend/scripts/icons.js index adc9352d0..90bdfcfed 100644 --- a/frontend/scripts/icons.js +++ b/frontend/scripts/icons.js @@ -8,7 +8,8 @@ const ICONS_DIRNAME = 'app/svg/icons'; const UI_DIRNAME = 'app/components/ui'; const svgo = new SVGO({ plugins: [ - { removeAttrs: { attrs: [ "width", "height", "class", "data-name", "dataName" ] } }, + //"width", "height", + { removeAttrs: { attrs: [ "class", "data-name", "dataName" ] } }, { addAttributesToSVGElement: { attributes: [ "width={ `${ width }px` }", "height={ `${ height }px` }" ] } }, { convertPathData: true }, // ? { removeViewBox: false }, // ? @@ -20,7 +21,7 @@ const svgo = new SVGO({ plugins: [ item.eachAttr(attr => { attr.name = attr.name.replace(/-([a-z])/g, gr => gr[1].toUpperCase()) }) - } + } }} ]}); @@ -41,7 +42,7 @@ ${ icons.map(name => ` case '${ name.slice(0, -4) }': return ${ .replace(/xlink\:href/g, 'xlinkHref') .replace(/xmlns\:xlink/g, 'xmlnsXlink') }`).join('\n') } - default: + default: if (window.ENV.PRODUCTION) return null; throw "unknown icon name " + name; } @@ -51,4 +52,4 @@ SVG.displayName = 'SVG'; export default SVG; `); -console.log('SVG.js generated') \ No newline at end of file +console.log('SVG.js generated') From cba53fa2844390c0606c00fd77c7569a32028ef6 Mon Sep 17 00:00:00 2001 From: sylenien Date: Mon, 16 May 2022 18:10:52 +0200 Subject: [PATCH 155/260] fix(ui): fix comments in iconsjs --- frontend/scripts/icons.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/scripts/icons.js b/frontend/scripts/icons.js index 90bdfcfed..923426dd6 100644 --- a/frontend/scripts/icons.js +++ b/frontend/scripts/icons.js @@ -8,7 +8,7 @@ const ICONS_DIRNAME = 'app/svg/icons'; const UI_DIRNAME = 'app/components/ui'; const svgo = new SVGO({ plugins: [ - //"width", "height", + //"width", "height", <- sometimes eating useful attrs from icons and break them { removeAttrs: { attrs: [ "class", "data-name", "dataName" ] } }, { addAttributesToSVGElement: { attributes: [ "width={ `${ width }px` }", "height={ `${ height }px` }" ] } }, { convertPathData: true }, // ? From 33ff7914be8adf0d7f4d939c92bc87c66bbccb3a Mon Sep 17 00:00:00 2001 From: sylenien Date: Tue, 17 May 2022 10:12:11 +0200 Subject: [PATCH 156/260] fix(ui): remove state updates on unmounted components --- .../components/WidgetChart/WidgetChart.tsx | 18 ++++++++++-------- .../WidgetSessions/WidgetSessions.tsx | 9 ++++++--- frontend/app/hooks/useIsMounted.ts | 14 ++++++++++++++ 3 files changed, 30 insertions(+), 11 deletions(-) create mode 100644 frontend/app/hooks/useIsMounted.ts diff --git a/frontend/app/components/Dashboard/components/WidgetChart/WidgetChart.tsx b/frontend/app/components/Dashboard/components/WidgetChart/WidgetChart.tsx index eb63d8f08..0bcef96bc 100644 --- a/frontend/app/components/Dashboard/components/WidgetChart/WidgetChart.tsx +++ b/frontend/app/components/Dashboard/components/WidgetChart/WidgetChart.tsx @@ -1,4 +1,4 @@ -import React, { useState, useRef, useEffect } from 'react'; +import React, { useState, useRef, useEffect, useCallback } from 'react'; import CustomMetriLineChart from 'App/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetriLineChart'; import CustomMetricPercentage from 'App/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricPercentage'; import CustomMetricTable from 'App/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricTable'; @@ -9,8 +9,10 @@ import { Loader } from 'UI'; import { useStore } from 'App/mstore'; import WidgetPredefinedChart from '../WidgetPredefinedChart'; import CustomMetricOverviewChart from 'App/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricOverviewChart'; -import { getStartAndEndTimestampsByDensity } from 'Types/dashboard/helper'; +import { getStartAndEndTimestampsByDensity } from 'Types/dashboard/helper'; import { debounce } from 'App/utils'; +import useIsMounted from 'App/hooks/useIsMounted' + interface Props { metric: any; isWidget?: boolean @@ -24,12 +26,12 @@ function WidgetChart(props: Props) { const colors = Styles.customMetricColors; const [loading, setLoading] = useState(true) const isOverviewWidget = metric.metricType === 'predefined' && metric.viewType === 'overview'; - const params = { density: isOverviewWidget ? 7 : 70 } + const params = { density: isOverviewWidget ? 7 : 70 } const metricParams = { ...params } const prevMetricRef = useRef(); + const isMounted = useIsMounted(); const [data, setData] = useState(metric.data); - const isTableWidget = metric.metricType === 'table' && metric.viewType === 'table'; const isPieChart = metric.metricType === 'table' && metric.viewType === 'pieChart'; @@ -57,16 +59,16 @@ function WidgetChart(props: Props) { const depsString = JSON.stringify(_metric.series); - const fetchMetricChartData = (metric, payload, isWidget) => { + if (!isMounted()) return; setLoading(true) dashboardStore.fetchMetricChartData(metric, payload, isWidget).then((res: any) => { - setData(res); + if (isMounted()) setData(res); }).finally(() => { setLoading(false); }); } - + const debounceRequest: any = React.useCallback(debounce(fetchMetricChartData, 500), []); useEffect(() => { if (prevMetricRef.current && prevMetricRef.current.name !== metric.name) { @@ -137,4 +139,4 @@ function WidgetChart(props: Props) { )); } -export default observer(WidgetChart); \ No newline at end of file +export default observer(WidgetChart); diff --git a/frontend/app/components/Dashboard/components/WidgetSessions/WidgetSessions.tsx b/frontend/app/components/Dashboard/components/WidgetSessions/WidgetSessions.tsx index 9f2f1cb3d..7e199b3d5 100644 --- a/frontend/app/components/Dashboard/components/WidgetSessions/WidgetSessions.tsx +++ b/frontend/app/components/Dashboard/components/WidgetSessions/WidgetSessions.tsx @@ -6,13 +6,15 @@ import SessionItem from 'Shared/SessionItem'; import { observer, useObserver } from 'mobx-react-lite'; import { DateTime } from 'luxon'; import { debounce } from 'App/utils'; +import useIsMounted from 'App/hooks/useIsMounted' + interface Props { className?: string; } function WidgetSessions(props: Props) { const { className = '' } = props; const [data, setData] = useState([]); - + const isMounted = useIsMounted() const [loading, setLoading] = useState(false); const [seriesOptions, setSeriesOptions] = useState([ { text: 'All', value: 'all' }, @@ -34,6 +36,7 @@ function WidgetSessions(props: Props) { }, [data]); const fetchSessions = (metricId, filter) => { + if (!isMounted()) return; setLoading(true) widget.fetchSessions(metricId, filter).then(res => { setData(res) @@ -41,7 +44,7 @@ function WidgetSessions(props: Props) { setLoading(false) }); } - + const filteredSessions = getListSessionsBySeries(data, activeSeries); const { dashboardStore, metricStore } = useStore(); const filter = useObserver(() => dashboardStore.drillDownFilter); @@ -126,4 +129,4 @@ const getListSessionsBySeries = (data, seriesId) => { return arr; } -export default observer(WidgetSessions); \ No newline at end of file +export default observer(WidgetSessions); diff --git a/frontend/app/hooks/useIsMounted.ts b/frontend/app/hooks/useIsMounted.ts new file mode 100644 index 000000000..3587a3351 --- /dev/null +++ b/frontend/app/hooks/useIsMounted.ts @@ -0,0 +1,14 @@ +import { useRef, useEffect, useCallback } from 'react' + +export default function useIsMounted(): () => boolean { + const ref = useRef(false); + + useEffect(() => { + ref.current = true; + return () => { + ref.current = false; + }; + }, []); + + return useCallback(() => ref.current, [ref]); +} From a3aecae559ee1a734a88d136a5f60086b02a23f4 Mon Sep 17 00:00:00 2001 From: sylenien Date: Tue, 17 May 2022 10:13:04 +0200 Subject: [PATCH 157/260] fix(ui): fix text on widget updates, remove back link on metrics page and add brdcmbs --- .../components/WidgetView/WidgetView.tsx | 18 ++++++++++---- .../WidgetWrapper/WidgetWrapper.tsx | 2 +- frontend/app/mstore/dashboardStore.ts | 24 +++++++++---------- frontend/app/mstore/types/dashboard.ts | 4 ++-- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/frontend/app/components/Dashboard/components/WidgetView/WidgetView.tsx b/frontend/app/components/Dashboard/components/WidgetView/WidgetView.tsx index 1993cd2f6..6d55eb5d2 100644 --- a/frontend/app/components/Dashboard/components/WidgetView/WidgetView.tsx +++ b/frontend/app/components/Dashboard/components/WidgetView/WidgetView.tsx @@ -1,12 +1,13 @@ import React, { useState } from 'react'; import { useStore } from 'App/mstore'; +import { Icon, Loader, Link } from 'UI'; import WidgetForm from '../WidgetForm'; import WidgetPreview from '../WidgetPreview'; import WidgetSessions from '../WidgetSessions'; -import { Icon, BackLink, Loader } from 'UI'; import { useObserver } from 'mobx-react-lite'; import { withSiteId } from 'App/routes'; import WidgetName from '../WidgetName'; + interface Props { history: any; match: any @@ -29,7 +30,7 @@ function WidgetView(props: Props) { const onBackHandler = () => { if (dashboardId) { - props.history.push(withSiteId(`/dashboard/${dashboardId}`, siteId)); + props.history.push(withSiteId(`/dashboard/${dashboardId}`, siteId)); } else { props.history.push(withSiteId(`/metrics`, siteId)); } @@ -37,8 +38,17 @@ function WidgetView(props: Props) { return useObserver(() => ( +
    + +
    + Dashboards + / + Metrics + / + {widget.name} +
    +
    -

    @@ -69,4 +79,4 @@ function WidgetView(props: Props) { )); } -export default WidgetView; \ No newline at end of file +export default WidgetView; diff --git a/frontend/app/components/Dashboard/components/WidgetWrapper/WidgetWrapper.tsx b/frontend/app/components/Dashboard/components/WidgetWrapper/WidgetWrapper.tsx index cfccd664c..03c14ff9c 100644 --- a/frontend/app/components/Dashboard/components/WidgetWrapper/WidgetWrapper.tsx +++ b/frontend/app/components/Dashboard/components/WidgetWrapper/WidgetWrapper.tsx @@ -111,7 +111,7 @@ function WidgetWrapper(props: Props) { disabled: widget.metricType === 'predefined', }, { - text: 'Remove from view', + text: 'Hide', onClick: onDelete }, ]} diff --git a/frontend/app/mstore/dashboardStore.ts b/frontend/app/mstore/dashboardStore.ts index 56c92e4b9..922b83536 100644 --- a/frontend/app/mstore/dashboardStore.ts +++ b/frontend/app/mstore/dashboardStore.ts @@ -4,7 +4,7 @@ import Widget, { IWidget } from "./types/widget"; import { dashboardService, metricService } from "App/services"; import { toast } from 'react-toastify'; import Period, { LAST_24_HOURS, LAST_7_DAYS } from 'Types/app/period'; -import { getChartFormatter } from 'Types/dashboard/helper'; +import { getChartFormatter } from 'Types/dashboard/helper'; import Filter, { IFilter } from "./types/filter"; export interface IDashboardSotre { @@ -24,7 +24,7 @@ export interface IDashboardSotre { metricsPage: number metricsPageSize: number metricsSearch: string - + isLoading: boolean isSaving: boolean isDeleting: boolean @@ -37,7 +37,7 @@ export interface IDashboardSotre { toggleAllSelectedWidgets: (isSelected: boolean) => void removeSelectedWidgetByCategory(category: string): void toggleWidgetSelection(widget: IWidget): void - + initDashboard(dashboard?: IDashboard): void updateKey(key: string, value: any): void resetCurrentWidget(): void @@ -82,12 +82,12 @@ export default class DashboardStore implements IDashboardSotre { drillDownFilter: Filter = new Filter() startTimestamp: number = 0 endTimestamp: number = 0 - + // Metrics metricsPage: number = 1 metricsPageSize: number = 10 metricsSearch: string = '' - + // Loading states isLoading: boolean = true isSaving: boolean = false @@ -109,7 +109,7 @@ export default class DashboardStore implements IDashboardSotre { getDashboardByIndex: action, getDashboardCount: action, selectDashboardById: action, - selectDefaultDashboard: action, + selectDefaultDashboard: action, toJson: action, fromJson: action, setSiteId: action, @@ -213,9 +213,9 @@ export default class DashboardStore implements IDashboardSotre { save(dashboard: IDashboard): Promise { this.isSaving = true const isCreating = !dashboard.dashboardId - + dashboard.metrics = this.selectedWidgets.map(w => w.metricId) - + return new Promise((resolve, reject) => { dashboardService.saveDashboard(dashboard).then(_dashboard => { runInAction(() => { @@ -381,7 +381,7 @@ export default class DashboardStore implements IDashboardSotre { deleteDashboardWidget(dashboardId: string, widgetId: string) { this.isDeleting = true return dashboardService.deleteWidget(dashboardId, widgetId).then(() => { - toast.success('Widget deleted successfully') + toast.success('Dashboard updated successfully') runInAction(() => { this.selectedDashboard?.removeWidget(widgetId) }) @@ -420,7 +420,7 @@ export default class DashboardStore implements IDashboardSotre { // this.isSaving = false }) } - + setPeriod(period: any) { this.period = Period({ start: period.startDate, end: period.endDate, rangeName: period.rangeValue }) } @@ -463,7 +463,7 @@ export default class DashboardStore implements IDashboardSotre { return unique; }, []) : [] } - + metric.setData(_data) resolve(_data); } @@ -472,4 +472,4 @@ export default class DashboardStore implements IDashboardSotre { }) }) } -} \ No newline at end of file +} diff --git a/frontend/app/mstore/types/dashboard.ts b/frontend/app/mstore/types/dashboard.ts index c4ee376c6..948cb916a 100644 --- a/frontend/app/mstore/types/dashboard.ts +++ b/frontend/app/mstore/types/dashboard.ts @@ -44,7 +44,7 @@ export default class Dashboard implements IDashboard { isPinned: boolean = false currentWidget: IWidget = new Widget() config: any = {} - + constructor() { makeAutoObservable(this, { name: observable, @@ -158,7 +158,7 @@ export default class Dashboard implements IDashboard { dashboardService.saveWidget(this.dashboardId, widgetA), dashboardService.saveWidget(this.dashboardId, widgetB) ]).then(() => { - toast.success("Widget position updated") + toast.success("Dashboard updated successfully") resolve() }).catch(() => { toast.error("Error updating widget position") From 536bacad64af8e9f1840a705003e88b888a545e2 Mon Sep 17 00:00:00 2001 From: sylenien Date: Tue, 17 May 2022 10:57:28 +0200 Subject: [PATCH 158/260] fix(ui): rm conflicting code --- .../Dashboard/components/WidgetView/WidgetView.tsx | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/frontend/app/components/Dashboard/components/WidgetView/WidgetView.tsx b/frontend/app/components/Dashboard/components/WidgetView/WidgetView.tsx index 6d55eb5d2..7cb96634b 100644 --- a/frontend/app/components/Dashboard/components/WidgetView/WidgetView.tsx +++ b/frontend/app/components/Dashboard/components/WidgetView/WidgetView.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; import { useStore } from 'App/mstore'; -import { Icon, Loader, Link } from 'UI'; +import { Icon, BackLink, Loader } from 'UI'; import WidgetForm from '../WidgetForm'; import WidgetPreview from '../WidgetPreview'; import WidgetSessions from '../WidgetSessions'; @@ -38,17 +38,8 @@ function WidgetView(props: Props) { return useObserver(() => ( -
    - -
    - Dashboards - / - Metrics - / - {widget.name} -
    -
    +

    From 0617e8b48557dad54bfd4f91d4ac7271186513bb Mon Sep 17 00:00:00 2001 From: sylenien Date: Tue, 17 May 2022 11:16:49 +0200 Subject: [PATCH 159/260] fix(ui): fix icons generation script to properly trim svg attrs --- frontend/scripts/icons.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/scripts/icons.js b/frontend/scripts/icons.js index 923426dd6..49c4459b9 100644 --- a/frontend/scripts/icons.js +++ b/frontend/scripts/icons.js @@ -8,8 +8,7 @@ const ICONS_DIRNAME = 'app/svg/icons'; const UI_DIRNAME = 'app/components/ui'; const svgo = new SVGO({ plugins: [ - //"width", "height", <- sometimes eating useful attrs from icons and break them - { removeAttrs: { attrs: [ "class", "data-name", "dataName" ] } }, + { removeAttrs: { attrs: [ "class", "data-name", "dataName", "svg:width", "svg:height" ] } }, { addAttributesToSVGElement: { attributes: [ "width={ `${ width }px` }", "height={ `${ height }px` }" ] } }, { convertPathData: true }, // ? { removeViewBox: false }, // ? From d7037771edd73eab1e4f9644031e6ac3b7e3e4d4 Mon Sep 17 00:00:00 2001 From: rjshrjndrn Date: Tue, 17 May 2022 12:15:52 +0200 Subject: [PATCH 160/260] chore(helmcharts): adding heuristics service Signed-off-by: rjshrjndrn --- .../openreplay/charts/heuristics/.helmignore | 23 +++++ .../openreplay/charts/heuristics/Chart.yaml | 24 ++++++ .../charts/heuristics/templates/NOTES.txt | 22 +++++ .../charts/heuristics/templates/_helpers.tpl | 62 ++++++++++++++ .../heuristics/templates/deployment.yaml | 70 +++++++++++++++ .../charts/heuristics/templates/hpa.yaml | 28 ++++++ .../charts/heuristics/templates/ingress.yaml | 61 +++++++++++++ .../charts/heuristics/templates/service.yaml | 15 ++++ .../heuristics/templates/serviceaccount.yaml | 12 +++ .../templates/tests/test-connection.yaml | 15 ++++ .../openreplay/charts/heuristics/values.yaml | 85 +++++++++++++++++++ 11 files changed, 417 insertions(+) create mode 100644 scripts/helmcharts/openreplay/charts/heuristics/.helmignore create mode 100644 scripts/helmcharts/openreplay/charts/heuristics/Chart.yaml create mode 100644 scripts/helmcharts/openreplay/charts/heuristics/templates/NOTES.txt create mode 100644 scripts/helmcharts/openreplay/charts/heuristics/templates/_helpers.tpl create mode 100644 scripts/helmcharts/openreplay/charts/heuristics/templates/deployment.yaml create mode 100644 scripts/helmcharts/openreplay/charts/heuristics/templates/hpa.yaml create mode 100644 scripts/helmcharts/openreplay/charts/heuristics/templates/ingress.yaml create mode 100644 scripts/helmcharts/openreplay/charts/heuristics/templates/service.yaml create mode 100644 scripts/helmcharts/openreplay/charts/heuristics/templates/serviceaccount.yaml create mode 100644 scripts/helmcharts/openreplay/charts/heuristics/templates/tests/test-connection.yaml create mode 100644 scripts/helmcharts/openreplay/charts/heuristics/values.yaml diff --git a/scripts/helmcharts/openreplay/charts/heuristics/.helmignore b/scripts/helmcharts/openreplay/charts/heuristics/.helmignore new file mode 100644 index 000000000..0e8a0eb36 --- /dev/null +++ b/scripts/helmcharts/openreplay/charts/heuristics/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/scripts/helmcharts/openreplay/charts/heuristics/Chart.yaml b/scripts/helmcharts/openreplay/charts/heuristics/Chart.yaml new file mode 100644 index 000000000..4885c51b8 --- /dev/null +++ b/scripts/helmcharts/openreplay/charts/heuristics/Chart.yaml @@ -0,0 +1,24 @@ +apiVersion: v2 +name: heuristics +description: A Helm chart for Kubernetes + +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rheuristicsing +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +# Versions are expected to follow Semantic Versioning (https://semver.org/) +version: 0.1.0 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +# It is recommended to use it with quotes. +AppVersion: "v1.6.0" diff --git a/scripts/helmcharts/openreplay/charts/heuristics/templates/NOTES.txt b/scripts/helmcharts/openreplay/charts/heuristics/templates/NOTES.txt new file mode 100644 index 000000000..bf775345c --- /dev/null +++ b/scripts/helmcharts/openreplay/charts/heuristics/templates/NOTES.txt @@ -0,0 +1,22 @@ +1. Get the application URL by running these commands: +{{- if .Values.ingress.enabled }} +{{- range $host := .Values.ingress.hosts }} + {{- range .paths }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} + {{- end }} +{{- end }} +{{- else if contains "NodePort" .Values.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "heuristics.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "heuristics.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "heuristics.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") + echo http://$SERVICE_IP:{{ .Values.service.port }} +{{- else if contains "ClusterIP" .Values.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "heuristics.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT +{{- end }} diff --git a/scripts/helmcharts/openreplay/charts/heuristics/templates/_helpers.tpl b/scripts/helmcharts/openreplay/charts/heuristics/templates/_helpers.tpl new file mode 100644 index 000000000..cec89d6e3 --- /dev/null +++ b/scripts/helmcharts/openreplay/charts/heuristics/templates/_helpers.tpl @@ -0,0 +1,62 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "heuristics.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "heuristics.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "heuristics.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "heuristics.labels" -}} +helm.sh/chart: {{ include "heuristics.chart" . }} +{{ include "heuristics.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "heuristics.selectorLabels" -}} +app.kubernetes.io/name: {{ include "heuristics.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "heuristics.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "heuristics.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} diff --git a/scripts/helmcharts/openreplay/charts/heuristics/templates/deployment.yaml b/scripts/helmcharts/openreplay/charts/heuristics/templates/deployment.yaml new file mode 100644 index 000000000..79a7d1e72 --- /dev/null +++ b/scripts/helmcharts/openreplay/charts/heuristics/templates/deployment.yaml @@ -0,0 +1,70 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "heuristics.fullname" . }} + labels: + {{- include "heuristics.labels" . | nindent 4 }} +spec: + {{- if not .Values.autoscaling.enabled }} + replicas: {{ .Values.replicaCount }} + {{- end }} + selector: + matchLabels: + {{- include "heuristics.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "heuristics.selectorLabels" . | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "heuristics.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + {{- if .Values.global.enterpriseEditionLicense }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}-ee" + {{- else }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + {{- end }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + - name: LICENSE_KEY + value: '{{ .Values.global.enterpriseEditionLicense }}' + - name: REDIS_STRING + value: '{{ .Values.global.redis.redisHost }}:{{ .Values.global.redis.redisPort }}' + - name: KAFKA_SERVERS + value: '{{ .Values.global.kafka.kafkaHost }}:{{ .Values.global.kafka.kafkaPort }}' + - name: KAFKA_USE_SSL + value: '{{ .Values.global.kafka.kafkaUseSsl }}' + {{- range $key, $val := .Values.env }} + - name: {{ $key }} + value: '{{ $val }}' + {{- end}} + ports: + - name: http + containerPort: {{ .Values.service.port }} + protocol: TCP + resources: + {{- toYaml .Values.resources | nindent 12 }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/scripts/helmcharts/openreplay/charts/heuristics/templates/hpa.yaml b/scripts/helmcharts/openreplay/charts/heuristics/templates/hpa.yaml new file mode 100644 index 000000000..7b29f1426 --- /dev/null +++ b/scripts/helmcharts/openreplay/charts/heuristics/templates/hpa.yaml @@ -0,0 +1,28 @@ +{{- if .Values.autoscaling.enabled }} +apiVersion: autoscaling/v2beta1 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "heuristics.fullname" . }} + labels: + {{- include "heuristics.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "heuristics.fullname" . }} + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: + {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/scripts/helmcharts/openreplay/charts/heuristics/templates/ingress.yaml b/scripts/helmcharts/openreplay/charts/heuristics/templates/ingress.yaml new file mode 100644 index 000000000..3d7a13ac2 --- /dev/null +++ b/scripts/helmcharts/openreplay/charts/heuristics/templates/ingress.yaml @@ -0,0 +1,61 @@ +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "heuristics.fullname" . -}} +{{- $svcPort := .Values.service.port -}} +{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} + {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} + {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} + {{- end }} +{{- end }} +{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1 +{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1beta1 +{{- else -}} +apiVersion: extensions/v1beta1 +{{- end }} +kind: Ingress +metadata: + name: {{ $fullName }} + labels: + {{- include "heuristics.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} + pathType: {{ .pathType }} + {{- end }} + backend: + {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} + service: + name: {{ $fullName }} + port: + number: {{ $svcPort }} + {{- else }} + serviceName: {{ $fullName }} + servicePort: {{ $svcPort }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/scripts/helmcharts/openreplay/charts/heuristics/templates/service.yaml b/scripts/helmcharts/openreplay/charts/heuristics/templates/service.yaml new file mode 100644 index 000000000..416041806 --- /dev/null +++ b/scripts/helmcharts/openreplay/charts/heuristics/templates/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "heuristics.fullname" . }} + labels: + {{- include "heuristics.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "heuristics.selectorLabels" . | nindent 4 }} diff --git a/scripts/helmcharts/openreplay/charts/heuristics/templates/serviceaccount.yaml b/scripts/helmcharts/openreplay/charts/heuristics/templates/serviceaccount.yaml new file mode 100644 index 000000000..6bfd69d4c --- /dev/null +++ b/scripts/helmcharts/openreplay/charts/heuristics/templates/serviceaccount.yaml @@ -0,0 +1,12 @@ +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "heuristics.serviceAccountName" . }} + labels: + {{- include "heuristics.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/scripts/helmcharts/openreplay/charts/heuristics/templates/tests/test-connection.yaml b/scripts/helmcharts/openreplay/charts/heuristics/templates/tests/test-connection.yaml new file mode 100644 index 000000000..5a0111e22 --- /dev/null +++ b/scripts/helmcharts/openreplay/charts/heuristics/templates/tests/test-connection.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "heuristics.fullname" . }}-test-connection" + labels: + {{- include "heuristics.labels" . | nindent 4 }} + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['{{ include "heuristics.fullname" . }}:{{ .Values.service.port }}'] + restartPolicy: Never diff --git a/scripts/helmcharts/openreplay/charts/heuristics/values.yaml b/scripts/helmcharts/openreplay/charts/heuristics/values.yaml new file mode 100644 index 000000000..a6d3fe6f6 --- /dev/null +++ b/scripts/helmcharts/openreplay/charts/heuristics/values.yaml @@ -0,0 +1,85 @@ +# Default values for openreplay. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +image: + repository: rg.fr-par.scw.cloud/foss/heuristics + pullPolicy: IfNotPresent + # Overrides the image tag whose default is the chart appVersion. + tag: "" + +imagePullSecrets: [] +nameOverride: "heuristics" +fullnameOverride: "heuristics" + +serviceAccount: + # Specifies whether a service account should be created + create: true + # Annotations to add to the service account + annotations: {} + # The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +podAnnotations: {} + +podSecurityContext: {} + # fsGroup: 2000 + +securityContext: {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +service: + type: ClusterIP + port: 9000 + +ingress: + enabled: false + className: "" + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: + - host: chart-example.local + paths: + - path: / + pathType: ImplementationSpecific + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +resources: {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + +autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 5 + targetCPUUtilizationPercentage: 80 + # targetMemoryUtilizationPercentage: 80 + +env: {} + + +nodeSelector: {} + +tolerations: [] + +affinity: {} From 749093d9f62ab04655e243edb94eb94c47d64df2 Mon Sep 17 00:00:00 2001 From: sylenien Date: Tue, 17 May 2022 12:18:58 +0200 Subject: [PATCH 161/260] fix(ui): fix routing in dashboards --- .../app/components/Dashboard/NewDashboard.tsx | 15 ++++++++++++--- .../components/DashboardModal/DashboardModal.tsx | 8 ++++++-- .../DashboardSideMenu/DashboardSideMenu.tsx | 2 +- .../components/DashboardView/DashboardView.tsx | 6 ++++-- frontend/app/mstore/dashboardStore.ts | 5 ++--- 5 files changed, 25 insertions(+), 11 deletions(-) diff --git a/frontend/app/components/Dashboard/NewDashboard.tsx b/frontend/app/components/Dashboard/NewDashboard.tsx index ae00c2034..b3e6ac59f 100644 --- a/frontend/app/components/Dashboard/NewDashboard.tsx +++ b/frontend/app/components/Dashboard/NewDashboard.tsx @@ -6,6 +6,7 @@ import DashboardSideMenu from './components/DashboardSideMenu'; import { Loader } from 'UI'; import DashboardRouter from './components/DashboardRouter'; import cn from 'classnames'; +import { withSiteId } from 'App/routes'; function NewDashboard(props: RouteComponentProps<{}>) { const { history, match: { params: { siteId, dashboardId, metricId } } } = props; @@ -20,18 +21,26 @@ function NewDashboard(props: RouteComponentProps<{}>) { dashboardStore.selectDashboardById(dashboardId); } }); + if (!dashboardId) { + dashboardStore.selectDefaultDashboard().then(({ dashboardId }) => { + props.history.push(withSiteId(`/dashboard/${dashboardId}`, siteId)); + }, () => { + props.history.push(withSiteId('/dashboard', siteId)); + }) + } + }, [siteId]); return useObserver(() => (
    -
    +
    diff --git a/frontend/app/components/Dashboard/components/DashboardModal/DashboardModal.tsx b/frontend/app/components/Dashboard/components/DashboardModal/DashboardModal.tsx index f310cc824..719729432 100644 --- a/frontend/app/components/Dashboard/components/DashboardModal/DashboardModal.tsx +++ b/frontend/app/components/Dashboard/components/DashboardModal/DashboardModal.tsx @@ -22,11 +22,15 @@ function DashboardModal(props) { const loading = useObserver(() => dashboardStore.isSaving); const onSave = () => { - dashboardStore.save(dashboard).then(hideModal).then(() => { + dashboardStore.save(dashboard).then(async (syncedDashboard) => { if (dashboard.exists()) { - dashboardStore.fetch(dashboard.dashboardId) + await dashboardStore.fetch(dashboard.dashboardId) } + console.log(syncedDashboard, history, siteId, withSiteId(`/dashboard/${syncedDashboard.dashboardId}`, siteId)) + dashboardStore.selectDashboardById(syncedDashboard.dashboardId); + history.push(withSiteId(`/dashboard/${syncedDashboard.dashboardId}`, siteId)) }) + .then(hideModal) } const handleCreateNew = () => { diff --git a/frontend/app/components/Dashboard/components/DashboardSideMenu/DashboardSideMenu.tsx b/frontend/app/components/Dashboard/components/DashboardSideMenu/DashboardSideMenu.tsx index 7d2ca62b4..a2a582a76 100644 --- a/frontend/app/components/Dashboard/components/DashboardSideMenu/DashboardSideMenu.tsx +++ b/frontend/app/components/Dashboard/components/DashboardSideMenu/DashboardSideMenu.tsx @@ -43,7 +43,7 @@ function DashboardSideMenu(props: RouteComponentProps) { const onAddDashboardClick = (e) => { dashboardStore.initDashboard(); - showModal(, { right: true }) + showModal(, { right: true }) } const togglePinned = (dashboard) => { diff --git a/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx b/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx index 69f7b7297..c3502f7eb 100644 --- a/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx +++ b/frontend/app/components/Dashboard/components/DashboardView/DashboardView.tsx @@ -62,8 +62,10 @@ function DashboardView(props: Props) { })) { dashboardStore.deleteDashboard(dashboard).then(() => { dashboardStore.selectDefaultDashboard().then(({ dashboardId }) => { - props.history.push(withSiteId(dashboard(), siteId)); - }); + props.history.push(withSiteId(`/dashboard/${dashboardId}`, siteId)); + }, () => { + props.history.push(withSiteId('/dashboard', siteId)); + }) }); } } diff --git a/frontend/app/mstore/dashboardStore.ts b/frontend/app/mstore/dashboardStore.ts index 922b83536..de61cacd3 100644 --- a/frontend/app/mstore/dashboardStore.ts +++ b/frontend/app/mstore/dashboardStore.ts @@ -341,11 +341,10 @@ export default class DashboardStore implements IDashboardSotre { } else { this.selectedDashboard = this.dashboards[0] } - } - if (this.selectedDashboard) { + resolve(this.selectedDashboard) } - // reject(new Error("No dashboards found")) + reject(new Error("No dashboards found")) }) } From 30add0fd3c2e5651a325414ecbdf4c531100d79a Mon Sep 17 00:00:00 2001 From: sylenien Date: Tue, 17 May 2022 12:20:39 +0200 Subject: [PATCH 162/260] fix(ui): rm consolelog --- .../Dashboard/components/DashboardModal/DashboardModal.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/app/components/Dashboard/components/DashboardModal/DashboardModal.tsx b/frontend/app/components/Dashboard/components/DashboardModal/DashboardModal.tsx index 719729432..851a103a2 100644 --- a/frontend/app/components/Dashboard/components/DashboardModal/DashboardModal.tsx +++ b/frontend/app/components/Dashboard/components/DashboardModal/DashboardModal.tsx @@ -26,7 +26,6 @@ function DashboardModal(props) { if (dashboard.exists()) { await dashboardStore.fetch(dashboard.dashboardId) } - console.log(syncedDashboard, history, siteId, withSiteId(`/dashboard/${syncedDashboard.dashboardId}`, siteId)) dashboardStore.selectDashboardById(syncedDashboard.dashboardId); history.push(withSiteId(`/dashboard/${syncedDashboard.dashboardId}`, siteId)) }) From 14ef2cba26fa29455c78e6ca0fbeffbc9b945f05 Mon Sep 17 00:00:00 2001 From: sylenien Date: Tue, 17 May 2022 13:10:41 +0200 Subject: [PATCH 163/260] fix(ui): fix tooltip behavior on a metric widget --- .../WidgetWrapper/TemplateOverlay.tsx | 14 +-- .../WidgetWrapper/WidgetWrapper.tsx | 108 +++++++++++------- 2 files changed, 67 insertions(+), 55 deletions(-) diff --git a/frontend/app/components/Dashboard/components/WidgetWrapper/TemplateOverlay.tsx b/frontend/app/components/Dashboard/components/WidgetWrapper/TemplateOverlay.tsx index d95e9d894..7a25de14f 100644 --- a/frontend/app/components/Dashboard/components/WidgetWrapper/TemplateOverlay.tsx +++ b/frontend/app/components/Dashboard/components/WidgetWrapper/TemplateOverlay.tsx @@ -1,20 +1,10 @@ //@ts-nocheck import React from 'react'; -import { Tooltip } from 'react-tippy'; function TemplateOverlay() { return ( -
    - -
    - -
    +
    ); } -export default TemplateOverlay; \ No newline at end of file +export default TemplateOverlay; diff --git a/frontend/app/components/Dashboard/components/WidgetWrapper/WidgetWrapper.tsx b/frontend/app/components/Dashboard/components/WidgetWrapper/WidgetWrapper.tsx index 03c14ff9c..433ff9880 100644 --- a/frontend/app/components/Dashboard/components/WidgetWrapper/WidgetWrapper.tsx +++ b/frontend/app/components/Dashboard/components/WidgetWrapper/WidgetWrapper.tsx @@ -12,6 +12,7 @@ import { withSiteId, dashboardMetricDetails } from 'App/routes'; import TemplateOverlay from './TemplateOverlay'; import WidgetIcon from './WidgetIcon'; import AlertButton from './AlertButton'; +import { Tooltip } from 'react-tippy'; interface Props { className?: string; @@ -77,57 +78,78 @@ function WidgetWrapper(props: Props) { const dragDropRef: any = dragRef(dropRef(ref)) return useObserver(() => ( -
    {}} - id={`widget-${widget.widgetId}`} - > - {isTemplate && }
    {}} + id={`widget-${widget.widgetId}`} > -
    {widget.name}
    - {isWidget && ( -
    - {!isPredefined && ( - <> - -
    - - )} + {/* @ts-ignore */} + + {isTemplate && } +
    +
    {widget.name}
    + {isWidget && ( +
    + {!isPredefined && ( + <> + +
    + + )} - {!isTemplate && ( - + {!isTemplate && ( + + )} +
    )}
    - )} + + {/* */} +
    + +
    + {/*
    */} +
    - {/* */} -
    - -
    - {/*
    */} -
    )); } + export default withRouter(WidgetWrapper); From 9960927ca0425c6983bd408c44f525b7adf17aa7 Mon Sep 17 00:00:00 2001 From: sylenien Date: Tue, 17 May 2022 13:29:55 +0200 Subject: [PATCH 164/260] fix(ui): fix show more button for metric adding --- .../Widgets/CallWithErrors/CallWithErrors.js | 1 + .../CustomMetricTable/CustomMetricTable.tsx | 4 +++- .../CustomMetricWidget/CustomMetricWidget.tsx | 12 +++++++----- .../Widgets/MissingResources/MissingResources.js | 3 ++- .../MostImpactfulErrors/MostImpactfulErrors.js | 1 + .../CallWithErrors/CallWithErrors.tsx | 6 ++++-- .../MissingResources/MissingResources.tsx | 8 +++++--- .../SlowestResources/SlowestResources.tsx | 6 ++++-- .../Widgets/SlowestImages/SlowestImages.js | 3 ++- .../Widgets/SlowestResources/SlowestResources.js | 10 +++++----- .../components/Dashboard/Widgets/common/Table.js | 7 ++++--- .../components/WidgetChart/WidgetChart.tsx | 8 +++++--- .../WidgetPredefinedChart/WidgetPredefinedChart.tsx | 13 +++++++------ .../components/WidgetWrapper/WidgetWrapper.tsx | 2 +- 14 files changed, 51 insertions(+), 33 deletions(-) diff --git a/frontend/app/components/Dashboard/Widgets/CallWithErrors/CallWithErrors.js b/frontend/app/components/Dashboard/Widgets/CallWithErrors/CallWithErrors.js index 3f24ba40e..6c7379a2a 100644 --- a/frontend/app/components/Dashboard/Widgets/CallWithErrors/CallWithErrors.js +++ b/frontend/app/components/Dashboard/Widgets/CallWithErrors/CallWithErrors.js @@ -68,6 +68,7 @@ export default class CallWithErrors extends React.PureComponent { diff --git a/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricTable/CustomMetricTable.tsx b/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricTable/CustomMetricTable.tsx index a43a35fc8..b9d0f73a2 100644 --- a/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricTable/CustomMetricTable.tsx +++ b/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricTable/CustomMetricTable.tsx @@ -27,9 +27,10 @@ interface Props { metric?: any, data: any; onClick?: (filters) => void; + isTemplate?: boolean; } function CustomMetriTable(props: Props) { - const { metric = {}, data = { values: [] }, onClick = () => null } = props; + const { metric = {}, data = { values: [] }, onClick = () => null, isTemplate } = props; const rows = List(data.values); const onClickHandler = (event, data) => { @@ -56,6 +57,7 @@ function CustomMetriTable(props: Props) { rows={ rows } rowClass="group" onRowClick={ onClickHandler } + isTemplate={isTemplate} /> diff --git a/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricWidget/CustomMetricWidget.tsx b/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricWidget/CustomMetricWidget.tsx index 15acd21bb..432cef988 100644 --- a/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricWidget/CustomMetricWidget.tsx +++ b/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricWidget/CustomMetricWidget.tsx @@ -5,7 +5,7 @@ import { Styles } from '../../common'; import { ResponsiveContainer } from 'recharts'; import { LAST_24_HOURS, LAST_30_MINUTES, YESTERDAY, LAST_7_DAYS } from 'Types/app/period'; import stl from './CustomMetricWidget.css'; -import { getChartFormatter, getStartAndEndTimestampsByDensity } from 'Types/dashboard/helper'; +import { getChartFormatter, getStartAndEndTimestampsByDensity } from 'Types/dashboard/helper'; import { init, edit, remove, setAlertMetricId, setActiveWidget, updateActiveState } from 'Duck/customMetrics'; import APIClient from 'App/api_client'; import { setShowAlerts } from 'Duck/dashboard'; @@ -21,7 +21,7 @@ const customParams = rangeName => { // if (rangeName === LAST_30_MINUTES) params.density = 70 // if (rangeName === YESTERDAY) params.density = 70 // if (rangeName === LAST_7_DAYS) params.density = 70 - + return params } @@ -41,9 +41,10 @@ interface Props { edit: (setDefault?) => void; setActiveWidget: (widget) => void; updateActiveState: (metricId, state) => void; + isTemplate?: boolean; } function CustomMetricWidget(props: Props) { - const { metric, showSync, compare, period } = props; + const { metric, showSync, compare, period, isTemplate } = props; const [loading, setLoading] = useState(false) const [data, setData] = useState([]); const [seriesMap, setSeriesMap] = useState([]); @@ -97,7 +98,7 @@ function CustomMetricWidget(props: Props) { const periodTimestamps = metric.metricType === 'timeseries' ? getStartAndEndTimestampsByDensity(timestamp, period.start, period.end, params.density) : period.toTimestamps(); - + const activeWidget = { widget: metric, period: period, @@ -166,6 +167,7 @@ function CustomMetricWidget(props: Props) { metric={ metric } data={ data[0] } onClick={ clickHandlerTable } + isTemplate={isTemplate} /> )} @@ -202,4 +204,4 @@ const WidgetIcon = ({ className = '', tooltip = '', icon, onClick }) => ( position="top center" inverted /> -) \ No newline at end of file +) diff --git a/frontend/app/components/Dashboard/Widgets/MissingResources/MissingResources.js b/frontend/app/components/Dashboard/Widgets/MissingResources/MissingResources.js index 765104efb..c9803e43d 100644 --- a/frontend/app/components/Dashboard/Widgets/MissingResources/MissingResources.js +++ b/frontend/app/components/Dashboard/Widgets/MissingResources/MissingResources.js @@ -8,7 +8,7 @@ const cols = [ { key: 'resource', title: 'Resource', - Component: ResourceInfo, + Component: ResourceInfo, width: '40%', }, { @@ -49,6 +49,7 @@ export default class MissingResources extends React.PureComponent { rows={ resources } rowClass="group" compare={compare} + isTemplate={this.props.isTemplate} /> diff --git a/frontend/app/components/Dashboard/Widgets/MostImpactfulErrors/MostImpactfulErrors.js b/frontend/app/components/Dashboard/Widgets/MostImpactfulErrors/MostImpactfulErrors.js index f5d252e08..ef10f02e6 100644 --- a/frontend/app/components/Dashboard/Widgets/MostImpactfulErrors/MostImpactfulErrors.js +++ b/frontend/app/components/Dashboard/Widgets/MostImpactfulErrors/MostImpactfulErrors.js @@ -53,6 +53,7 @@ export default class MostImpactfulErrors extends React.PureComponent { cols={ cols } rows={ errors } rowProps={ { findJourneys: this.findJourneys } } + isTemplate={this.props.isTemplate} /> diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/CallWithErrors.tsx b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/CallWithErrors.tsx index 4e5d0f637..698c8ee18 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/CallWithErrors.tsx +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/CallWithErrors.tsx @@ -45,6 +45,7 @@ const cols = [ interface Props { data: any metric?: any + isTemplate?: boolean } function CallWithErrors(props: Props) { const { data, metric } = props; @@ -57,7 +58,7 @@ function CallWithErrors(props: Props) { }; return ( - + ); } -export default CallWithErrors; \ No newline at end of file +export default CallWithErrors; diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/MissingResources/MissingResources.tsx b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/MissingResources/MissingResources.tsx index 0a3d5567e..69517328c 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/MissingResources/MissingResources.tsx +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/MissingResources/MissingResources.tsx @@ -11,7 +11,7 @@ const cols = [ { key: 'resource', title: 'Resource', - Component: ResourceInfo, + Component: ResourceInfo, width: '40%', }, { @@ -38,9 +38,10 @@ const cols = [ interface Props { data: any metric?: any + isTemplate?: boolean } function MissingResources(props: Props) { - const { data, metric } = props; + const { data, metric, isTemplate } = props; return ( ); } -export default MissingResources; \ No newline at end of file +export default MissingResources; diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SlowestResources/SlowestResources.tsx b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SlowestResources/SlowestResources.tsx index c4bbb1ed9..ac400904a 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SlowestResources/SlowestResources.tsx +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SlowestResources/SlowestResources.tsx @@ -56,9 +56,10 @@ const cols = [ interface Props { data: any metric?: any + isTemplate?: boolean } function SlowestResources(props: Props) { - const { data, metric } = props; + const { data, metric, isTemplate } = props; return ( ); } -export default SlowestResources; \ No newline at end of file +export default SlowestResources; diff --git a/frontend/app/components/Dashboard/Widgets/SlowestImages/SlowestImages.js b/frontend/app/components/Dashboard/Widgets/SlowestImages/SlowestImages.js index fe48ceb81..670cbf524 100644 --- a/frontend/app/components/Dashboard/Widgets/SlowestImages/SlowestImages.js +++ b/frontend/app/components/Dashboard/Widgets/SlowestImages/SlowestImages.js @@ -35,7 +35,7 @@ const cols = [ @widgetHOC('slowestImages', { fitContent: true }) export default class SlowestImages extends React.PureComponent { render() { - const { data: images, loading } = this.props; + const { data: images, loading, isTemplate } = this.props; return ( diff --git a/frontend/app/components/Dashboard/Widgets/SlowestResources/SlowestResources.js b/frontend/app/components/Dashboard/Widgets/SlowestResources/SlowestResources.js index 830326b87..5124938f3 100644 --- a/frontend/app/components/Dashboard/Widgets/SlowestResources/SlowestResources.js +++ b/frontend/app/components/Dashboard/Widgets/SlowestResources/SlowestResources.js @@ -65,13 +65,13 @@ export default class SlowestResources extends React.PureComponent { }; writeOption = (e, { name, value }) => { - this.setState({ [ name ]: value }) + this.setState({ [ name ]: value }) this.props.fetchWidget(WIDGET_KEY, this.props.period, this.props.platform, { [ name ]: value === 'all' ? null : value }) } render() { - const { data, loading, compare } = this.props; - + const { data, loading, compare, isTemplate } = this.props; + return (
    @@ -86,8 +86,8 @@ export default class SlowestResources extends React.PureComponent { -
    + > +
    diff --git a/frontend/app/components/Dashboard/Widgets/common/Table.js b/frontend/app/components/Dashboard/Widgets/common/Table.js index e3d88502f..9c8c1928f 100644 --- a/frontend/app/components/Dashboard/Widgets/common/Table.js +++ b/frontend/app/components/Dashboard/Widgets/common/Table.js @@ -19,9 +19,10 @@ export default class Table extends React.PureComponent { compare = false, maxHeight = 200, onRowClick = null, + isTemplate, } = this.props; const { showAll } = this.state; - + return (
    @@ -47,9 +48,9 @@ export default class Table extends React.PureComponent {
    )) }
    - )) } + )) } - { rows.size > (small ? 3 : 5) && !showAll && + { !isTemplate && rows.size > (small ? 3 : 5) && !showAll &&
    } @@ -125,6 +124,9 @@ function DashboardView(props: Props) {
    +
    +

    {dashboard?.description}

    +
    void; } function TemplateOverlay(props: IProps) { return ( -
    +
    ); } diff --git a/frontend/app/components/Dashboard/components/WidgetWrapper/WidgetWrapper.tsx b/frontend/app/components/Dashboard/components/WidgetWrapper/WidgetWrapper.tsx index 26c4019d3..2afd8320a 100644 --- a/frontend/app/components/Dashboard/components/WidgetWrapper/WidgetWrapper.tsx +++ b/frontend/app/components/Dashboard/components/WidgetWrapper/WidgetWrapper.tsx @@ -73,8 +73,6 @@ function WidgetWrapper(props: Props) { const addOverlay = isTemplate || !isPredefined - console.log(widget, isTemplate, addOverlay) - return useObserver(() => (
    Click to select} > - {addOverlay && } + {addOverlay && }
    From ff02248900af5a73658f0f81ed5614a9fa142f06 Mon Sep 17 00:00:00 2001 From: sylenien Date: Tue, 17 May 2022 18:09:30 +0200 Subject: [PATCH 169/260] fix(ui): remove additional divider line, fix zindex for menu --- .../components/DashboardSideMenu/DashboardSideMenu.tsx | 1 - frontend/app/components/ui/ItemMenu/itemMenu.css | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/frontend/app/components/Dashboard/components/DashboardSideMenu/DashboardSideMenu.tsx b/frontend/app/components/Dashboard/components/DashboardSideMenu/DashboardSideMenu.tsx index 339af5565..93338d7f3 100644 --- a/frontend/app/components/Dashboard/components/DashboardSideMenu/DashboardSideMenu.tsx +++ b/frontend/app/components/Dashboard/components/DashboardSideMenu/DashboardSideMenu.tsx @@ -109,7 +109,6 @@ function DashboardSideMenu(props: RouteComponentProps) { )}
    -
    Date: Tue, 17 May 2022 18:18:08 +0200 Subject: [PATCH 170/260] fix(ui): fix weird scrolling --- .../DashboardMetricSelection/DashboardMetricSelection.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/app/components/Dashboard/components/DashboardMetricSelection/DashboardMetricSelection.tsx b/frontend/app/components/Dashboard/components/DashboardMetricSelection/DashboardMetricSelection.tsx index 6f4e0e876..26c5235c6 100644 --- a/frontend/app/components/Dashboard/components/DashboardMetricSelection/DashboardMetricSelection.tsx +++ b/frontend/app/components/Dashboard/components/DashboardMetricSelection/DashboardMetricSelection.tsx @@ -80,7 +80,7 @@ function DashboardMetricSelection(props) {
    -
    +
    {activeCategory && widgetCategories.map((category, index) =>
    {activeCategory && activeCategory.widgets.map((widget: any) => ( Date: Tue, 17 May 2022 18:20:12 +0200 Subject: [PATCH 171/260] fix(ui): fix typo --- frontend/app/components/ui/ItemMenu/itemMenu.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/app/components/ui/ItemMenu/itemMenu.css b/frontend/app/components/ui/ItemMenu/itemMenu.css index 053c8af2e..f6095b8b3 100644 --- a/frontend/app/components/ui/ItemMenu/itemMenu.css +++ b/frontend/app/components/ui/ItemMenu/itemMenu.css @@ -29,7 +29,7 @@ } white-space: nowrap; - z-index: 10; + z-index: 20; position: absolute; right: 31px; top: 27px; @@ -40,7 +40,7 @@ & .menuItem { cursor: pointer; - padding: 20px; + padding: 10px; display: flex; align-items: center; border-bottom: 1px solid $gray-light; From 5041bcb177e3ff3b0720a3f2110723235d0c1d42 Mon Sep 17 00:00:00 2001 From: Rajesh Rajendran Date: Tue, 17 May 2022 20:07:02 +0000 Subject: [PATCH 172/260] GH aciton with new format (#479) * chore(actions): update GH Actions to new deployment format Signed-off-by: rjshrjndrn * fix(actions): yaml indentation Signed-off-by: rjshrjndrn * fix(actions): image override helm doesn't support multipart yaml files. Signed-off-by: rjshrjndrn * chore(action): enable docker image cache Signed-off-by: rjshrjndrn * chore(actions): chalice deployment Signed-off-by: rjshrjndrn * chore(actions): check previous image prior deploying Because we're using an umbrella chart and not storing the image tags which is deployed from actions anywhere, a new deployment will reset all older deployed image tags. For that we've to fetch the existing image tags and feed it to the current deployment. Signed-off-by: rjshrjndrn * fix(actions): static path the build input Signed-off-by: rjshrjndrn * chore(actions): adding dev branch to chalice deployment Signed-off-by: rjshrjndrn --- .github/workflows/api.yaml | 48 +++++++++++++++++++++---- .github/workflows/workers.yaml | 64 ++++++++++++++++++++++++++-------- 2 files changed, 91 insertions(+), 21 deletions(-) diff --git a/.github/workflows/api.yaml b/.github/workflows/api.yaml index 9fe8c5611..b721f21ee 100644 --- a/.github/workflows/api.yaml +++ b/.github/workflows/api.yaml @@ -3,6 +3,7 @@ on: workflow_dispatch: push: branches: + - dev - api-v1.5.5 paths: - api/** @@ -32,6 +33,12 @@ jobs: kubeconfig: ${{ secrets.OSS_KUBECONFIG }} # Use content of kubeconfig in secret. id: setcontext + # Caching docker images + - uses: satackey/action-docker-layer-caching@v0.0.11 + # Ignore the failure of a step and avoid terminating the job. + continue-on-error: true + + - name: Building and Pusing api image id: build-image env: @@ -41,15 +48,42 @@ jobs: run: | cd api PUSH_IMAGE=1 bash build.sh + - name: Creating old image input + run: | + # + # Create yaml with existing image tags + # + kubectl get pods -n app -o jsonpath="{.items[*].spec.containers[*].image}" |\ + tr -s '[[:space:]]' '\n' | sort | uniq -c | grep '/foss/' | cut -d '/' -f3 > /tmp/image_tag.txt + + echo > /tmp/image_override.yaml + + for line in `cat /tmp/image_tag.txt`; + do + image_array=($(echo "$line" | tr ':' '\n')) + cat <> /tmp/image_override.yaml + ${image_array[0]}: + image: + tag: ${image_array[1]} + EOF + done + - name: Deploy to kubernetes run: | - cd scripts/helm/ - sed -i "s#minio_access_key.*#minio_access_key: \"${{ secrets.OSS_MINIO_ACCESS_KEY }}\" #g" vars.yaml - sed -i "s#minio_secret_key.*#minio_secret_key: \"${{ secrets.OSS_MINIO_SECRET_KEY }}\" #g" vars.yaml - sed -i "s#domain_name.*#domain_name: \"foss.openreplay.com\" #g" vars.yaml - sed -i "s#kubeconfig.*#kubeconfig_path: ${KUBECONFIG}#g" vars.yaml - sed -i "s/image_tag:.*/image_tag: \"$IMAGE_TAG\"/g" vars.yaml - bash kube-install.sh --app chalice + cd scripts/helmcharts/ + + ## Update secerts + sed -i "s/postgresqlPassword: \"changeMePassword\"/postgresqlPassword: \"${{ secrets.OSS_PG_PASSWORD }}\"/g" vars.yaml + sed -i "s/accessKey: \"changeMeMinioAccessKey\"/accessKey: \"${{ secrets.OSS_MINIO_ACCESS_KEY }}\"/g" vars.yaml + sed -i "s/secretKey: \"changeMeMinioPassword\"/secretKey: \"${{ secrets.OSS_MINIO_SECRET_KEY }}\"/g" vars.yaml + sed -i "s/jwt_secret: \"SetARandomStringHere\"/jwt_secret: \"${{ secrets.OSS_JWT_SECRET }}\"/g" vars.yaml + sed -i "s/domainName: \"\"/domainName: \"${{ secrets.OSS_DOMAIN_NAME }}\"/g" vars.yaml + + # Update changed image tag + sed -i "/chalice/{n;n;s/.*/ tag: ${IMAGE_TAG}/}" /tmp/image_override.yaml + + # Deploy command + helm upgrade --install openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml env: DOCKER_REPO: ${{ secrets.OSS_REGISTRY_URL }} IMAGE_TAG: ${{ github.sha }} diff --git a/.github/workflows/workers.yaml b/.github/workflows/workers.yaml index e6a91647d..5a43446af 100644 --- a/.github/workflows/workers.yaml +++ b/.github/workflows/workers.yaml @@ -33,7 +33,12 @@ jobs: kubeconfig: ${{ secrets.OSS_KUBECONFIG }} # Use content of kubeconfig in secret. id: setcontext - - name: Build, tag, and Deploy to k8s + # Caching docker images + - uses: satackey/action-docker-layer-caching@v0.0.11 + # Ignore the failure of a step and avoid terminating the job. + continue-on-error: true + + - name: Build, tag id: build-image env: DOCKER_REPO: ${{ secrets.OSS_REGISTRY_URL }} @@ -47,42 +52,73 @@ jobs: # # Getting the images to build # - + set -x { git diff --name-only HEAD HEAD~1 | grep -E "backend/cmd|backend/services" | grep -vE ^ee/ | cut -d '/' -f3 git diff --name-only HEAD HEAD~1 | grep -E "backend/pkg|backend/internal" | grep -vE ^ee/ | cut -d '/' -f3 | uniq | while read -r pkg_name ; do grep -rl "pkg/$pkg_name" backend/services backend/cmd | cut -d '/' -f3 done - } | uniq > backend/images_to_build.txt + } | uniq > /tmp/images_to_build.txt - [[ $(cat backend/images_to_build.txt) != "" ]] || (echo "Nothing to build here"; exit 0) + [[ $(cat /tmp/images_to_build.txt) != "" ]] || (echo "Nothing to build here"; exit 0) # # Pushing image to registry # cd backend - for image in $(cat images_to_build.txt); + for image in $(cat /tmp/images_to_build.txt); do echo "Bulding $image" PUSH_IMAGE=1 bash -x ./build.sh skip $image echo "::set-output name=image::$DOCKER_REPO/$image:$IMAGE_TAG" done + - name: Creating old image input + env: + IMAGE_TAG: ${{ github.sha }} + run: | + # + # Create yaml with existing image tags + # + kubectl get pods -n app -o jsonpath="{.items[*].spec.containers[*].image}" |\ + tr -s '[[:space:]]' '\n' | sort | uniq -c | grep '/foss/' | cut -d '/' -f3 > /tmp/image_tag.txt + + echo > /tmp/image_override.yaml + + for line in `cat /tmp/image_tag.txt`; + do + image_array=($(echo "$line" | tr ':' '\n')) + cat <> /tmp/image_override.yaml + ${image_array[0]}: + image: + tag: ${image_array[1]} + EOF + done + + - name: Deploying to kuberntes + env: + IMAGE_TAG: ${{ github.sha }} + run: | # # Deploying image to environment. # - cd ../scripts/helm/ - sed -i "s#minio_access_key.*#minio_access_key: \"${{ secrets.OSS_MINIO_ACCESS_KEY }}\" #g" vars.yaml - sed -i "s#minio_secret_key.*#minio_secret_key: \"${{ secrets.OSS_MINIO_SECRET_KEY }}\" #g" vars.yaml - sed -i "s#domain_name.*#domain_name: \"foss.openreplay.com\" #g" vars.yaml - sed -i "s#kubeconfig.*#kubeconfig_path: ${KUBECONFIG}#g" vars.yaml - for image in $(cat ../../backend/images_to_build.txt); + cd scripts/helmcharts/ + + ## Update secerts + sed -i "s/postgresqlPassword: \"changeMePassword\"/postgresqlPassword: \"${{ secrets.OSS_PG_PASSWORD }}\"/g" vars.yaml + sed -i "s/accessKey: \"changeMeMinioAccessKey\"/accessKey: \"${{ secrets.OSS_MINIO_ACCESS_KEY }}\"/g" vars.yaml + sed -i "s/secretKey: \"changeMeMinioPassword\"/secretKey: \"${{ secrets.OSS_MINIO_SECRET_KEY }}\"/g" vars.yaml + sed -i "s/jwt_secret: \"SetARandomStringHere\"/jwt_secret: \"${{ secrets.OSS_JWT_SECRET }}\"/g" vars.yaml + sed -i "s/domainName: \"\"/domainName: \"${{ secrets.OSS_DOMAIN_NAME }}\"/g" vars.yaml + ## Update images + for image in $(cat /tmp/images_to_build.txt); do - sed -i "s/image_tag:.*/image_tag: \"$IMAGE_TAG\"/g" vars.yaml - # Deploy command - bash kube-install.sh --app $image + sed -i "/${image}/{n;n;s/.*/ tag: ${IMAGE_TAG}/}" /tmp/image_override.yaml done + # Deploy command + helm upgrade --install openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml + # - name: Debug Job # if: ${{ failure() }} # uses: mxschmitt/action-tmate@v3 From 336046a44397f413500aea80a5417271d735f1a6 Mon Sep 17 00:00:00 2001 From: rjshrjndrn Date: Wed, 18 May 2022 12:38:42 +0200 Subject: [PATCH 173/260] chore(helm): common naming convention --- .../openreplay/charts/alerts/values.yaml | 2 +- .../openreplay/charts/assets/values.yaml | 2 +- .../openreplay/charts/assist/values.yaml | 2 +- .../openreplay/charts/chalice/values.yaml | 2 +- .../openreplay/charts/db/values.yaml | 2 +- .../openreplay/charts/ender/values.yaml | 2 +- .../openreplay/charts/heuristics/values.yaml | 2 +- .../openreplay/charts/http/values.yaml | 2 +- scripts/helmcharts/openreplay/values.yaml | 22 ------------------- 9 files changed, 8 insertions(+), 30 deletions(-) diff --git a/scripts/helmcharts/openreplay/charts/alerts/values.yaml b/scripts/helmcharts/openreplay/charts/alerts/values.yaml index 5a19d43e1..5cf71717c 100644 --- a/scripts/helmcharts/openreplay/charts/alerts/values.yaml +++ b/scripts/helmcharts/openreplay/charts/alerts/values.yaml @@ -12,7 +12,7 @@ image: imagePullSecrets: [] nameOverride: "alerts" -fullnameOverride: "alerts" +fullnameOverride: "alerts-openreplay" serviceAccount: # Specifies whether a service account should be created diff --git a/scripts/helmcharts/openreplay/charts/assets/values.yaml b/scripts/helmcharts/openreplay/charts/assets/values.yaml index 709f502d1..2a9160c23 100644 --- a/scripts/helmcharts/openreplay/charts/assets/values.yaml +++ b/scripts/helmcharts/openreplay/charts/assets/values.yaml @@ -12,7 +12,7 @@ image: imagePullSecrets: [] nameOverride: "assets" -fullnameOverride: "assets" +fullnameOverride: "assets-openreplay" serviceAccount: # Specifies whether a service account should be created diff --git a/scripts/helmcharts/openreplay/charts/assist/values.yaml b/scripts/helmcharts/openreplay/charts/assist/values.yaml index a78be6a33..ab8b7cd1c 100644 --- a/scripts/helmcharts/openreplay/charts/assist/values.yaml +++ b/scripts/helmcharts/openreplay/charts/assist/values.yaml @@ -12,7 +12,7 @@ image: imagePullSecrets: [] nameOverride: "assist" -fullnameOverride: "assist" +fullnameOverride: "assist-openreplay" serviceAccount: # Specifies whether a service account should be created diff --git a/scripts/helmcharts/openreplay/charts/chalice/values.yaml b/scripts/helmcharts/openreplay/charts/chalice/values.yaml index a95ed4732..e1b56ebfd 100644 --- a/scripts/helmcharts/openreplay/charts/chalice/values.yaml +++ b/scripts/helmcharts/openreplay/charts/chalice/values.yaml @@ -12,7 +12,7 @@ image: imagePullSecrets: [] nameOverride: "chalice" -fullnameOverride: "chalice" +fullnameOverride: "chalice-openreplay" serviceAccount: # Specifies whether a service account should be created diff --git a/scripts/helmcharts/openreplay/charts/db/values.yaml b/scripts/helmcharts/openreplay/charts/db/values.yaml index acc565368..a57e79572 100644 --- a/scripts/helmcharts/openreplay/charts/db/values.yaml +++ b/scripts/helmcharts/openreplay/charts/db/values.yaml @@ -12,7 +12,7 @@ image: imagePullSecrets: [] nameOverride: "db" -fullnameOverride: "db" +fullnameOverride: "db-openreplay" serviceAccount: # Specifies whether a service account should be created diff --git a/scripts/helmcharts/openreplay/charts/ender/values.yaml b/scripts/helmcharts/openreplay/charts/ender/values.yaml index e860a1ea2..9c5cf6d9c 100644 --- a/scripts/helmcharts/openreplay/charts/ender/values.yaml +++ b/scripts/helmcharts/openreplay/charts/ender/values.yaml @@ -12,7 +12,7 @@ image: imagePullSecrets: [] nameOverride: "ender" -fullnameOverride: "ender" +fullnameOverride: "ender-openreplay" serviceAccount: # Specifies whether a service account should be created diff --git a/scripts/helmcharts/openreplay/charts/heuristics/values.yaml b/scripts/helmcharts/openreplay/charts/heuristics/values.yaml index a6d3fe6f6..6b2eeaa0d 100644 --- a/scripts/helmcharts/openreplay/charts/heuristics/values.yaml +++ b/scripts/helmcharts/openreplay/charts/heuristics/values.yaml @@ -12,7 +12,7 @@ image: imagePullSecrets: [] nameOverride: "heuristics" -fullnameOverride: "heuristics" +fullnameOverride: "heuristics-openreplay" serviceAccount: # Specifies whether a service account should be created diff --git a/scripts/helmcharts/openreplay/charts/http/values.yaml b/scripts/helmcharts/openreplay/charts/http/values.yaml index 1f52ed5cf..04b370b17 100644 --- a/scripts/helmcharts/openreplay/charts/http/values.yaml +++ b/scripts/helmcharts/openreplay/charts/http/values.yaml @@ -12,7 +12,7 @@ image: imagePullSecrets: [] nameOverride: "http" -fullnameOverride: "http" +fullnameOverride: "http-openreplay" serviceAccount: # Specifies whether a service account should be created diff --git a/scripts/helmcharts/openreplay/values.yaml b/scripts/helmcharts/openreplay/values.yaml index 3c063340c..57f3a1432 100644 --- a/scripts/helmcharts/openreplay/values.yaml +++ b/scripts/helmcharts/openreplay/values.yaml @@ -92,27 +92,5 @@ nginx-ingress: # Overrides the image tag whose default is the chart appVersion. tag: "buster" -alerts: - fullnameOverride: alerts-openreplay -assets: - fullnameOverride: assets-openreplay -chalice: - fullnameOverride: chalice-openreplay -db: - fullnameOverride: db-openreplay -ender: - fullnameOverride: ender-openreplay -http: - fullnameOverride: http-openreplay -integrations: - fullnameOverride: integrations-openreplay -sink: - fullnameOverride: sink-openreplay -storage: - fullnameOverride: storage-openreplay -assist: - fullnameOverride: assist-openreplay -peers: - fullnameOverride: peers-openreplay ingress-nginx: enabled: true From 9ea1992b343b501b601500bd09c48881f71b80fc Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Wed, 18 May 2022 12:04:07 +0200 Subject: [PATCH 174/260] merged vault (from main) and resolved conflicts --- .../BugFinder/SessionsMenu/SessionsMenu.js | 7 ++- .../components/Session_/PlayerBlockHeader.js | 6 +- .../components/shared/Bookmark/Bookmark.tsx | 59 +++++++++++++++---- frontend/app/svg/icons/safe-fill.svg | 4 ++ frontend/app/svg/icons/safe.svg | 4 ++ 5 files changed, 62 insertions(+), 18 deletions(-) create mode 100644 frontend/app/svg/icons/safe-fill.svg create mode 100644 frontend/app/svg/icons/safe.svg diff --git a/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js b/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js index 198dc6593..eb5eaab86 100644 --- a/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js +++ b/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js @@ -11,7 +11,7 @@ import { useModal } from 'App/components/Modal'; import SessionSettings from 'Shared/SessionSettings/SessionSettings' function SessionsMenu(props) { - const { activeTab } = props; + const { activeTab, keyMap, wdTypeCount, toggleRehydratePanel, isEnterprise } = props; const { showModal } = useModal(); const onMenuItemClick = (filter) => { @@ -76,8 +76,8 @@ function SessionsMenu(props) {
    onMenuItemClick({ name: 'Bookmarks', type: 'bookmark' })} /> @@ -96,6 +96,7 @@ export default connect(state => ({ captureRate: state.getIn(['watchdogs', 'captureRate']), filters: state.getIn([ 'filters', 'appliedFilter' ]), sessionsLoading: state.getIn([ 'sessions', 'fetchLiveListRequest', 'loading' ]), + isEnterprise: state.getIn([ 'user', 'client', 'edition' ]) === 'ee', }), { clearEvents, fetchSessionList })(SessionsMenu); diff --git a/frontend/app/components/Session_/PlayerBlockHeader.js b/frontend/app/components/Session_/PlayerBlockHeader.js index 58a524022..4717c6329 100644 --- a/frontend/app/components/Session_/PlayerBlockHeader.js +++ b/frontend/app/components/Session_/PlayerBlockHeader.js @@ -12,6 +12,7 @@ import SharePopup from '../shared/SharePopup/SharePopup'; import { fetchList as fetchListIntegration } from 'Duck/integrations/actions'; import { countries } from 'App/constants'; import SessionMetaList from 'Shared/SessionItem/SessionMetaList'; +import Bookmark from 'Shared/Bookmark' import stl from './playerBlockHeader.css'; import Issues from './Issues/Issues'; @@ -162,7 +163,8 @@ export default class PlayerBlockHeader extends React.PureComponent { <>
    - + {/* + /> */}
    void, + toggleFavorite: (sessionId: string) => Promise, favorite: Boolean, - sessionId: any + sessionId: any, + isEnterprise: Boolean } -function Bookmark({ toggleFavorite, sessionId, favorite } : Props ) { +function Bookmark(props : Props ) { + const { sessionId, favorite, isEnterprise } = props; + const [isFavorite, setIsFavorite] = useState(favorite); + const ADDED_MESSAGE = isEnterprise ? 'Session added to vault' : 'Session added to your favorites'; + const REMOVED_MESSAGE = isEnterprise ? 'Session removed from vault' : 'Session removed from your favorites'; + const TOOLTIP_TEXT_ADD = isEnterprise ? 'Add to vault' : 'Add to favorites'; + const TOOLTIP_TEXT_REMOVE = isEnterprise ? 'Remove from vault' : 'Remove from favorites'; - return ( -
    toggleFavorite(sessionId) } - data-favourite={ favorite } + const ACTIVE_ICON = isEnterprise ? 'safe-fill' : 'star-solid'; + const INACTIVE_ICON = isEnterprise ? 'safe' : 'star'; + + + useEffect(() => { + setIsFavorite(favorite); + }, [favorite]); + + const toggleFavorite = async () => { + props.toggleFavorite(sessionId).then(() => { + toast.success(isFavorite ? REMOVED_MESSAGE : ADDED_MESSAGE); + setIsFavorite(!isFavorite); + }); + } + + return ( + - -
    +
    + +
    + ) } -export default connect(null, { toggleFavorite })(Bookmark) +export default connect(state => ({ + isEnterprise: state.getIn([ 'user', 'client', 'edition' ]) === 'ee', +}), { toggleFavorite })(Bookmark) diff --git a/frontend/app/svg/icons/safe-fill.svg b/frontend/app/svg/icons/safe-fill.svg new file mode 100644 index 000000000..76ed5854e --- /dev/null +++ b/frontend/app/svg/icons/safe-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/frontend/app/svg/icons/safe.svg b/frontend/app/svg/icons/safe.svg new file mode 100644 index 000000000..f06ce9c78 --- /dev/null +++ b/frontend/app/svg/icons/safe.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file From ab2a800b7c0e166ccab720216ead9198090cd831 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Wed, 18 May 2022 12:26:21 +0200 Subject: [PATCH 175/260] merged vault (from main) and resolved conflicts --- .../BugFinder/SessionList/SessionListHeader.js | 10 ++++++---- .../components/BugFinder/SessionsMenu/SessionsMenu.js | 3 ++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/frontend/app/components/BugFinder/SessionList/SessionListHeader.js b/frontend/app/components/BugFinder/SessionList/SessionListHeader.js index 57d1a21b4..eba5ad002 100644 --- a/frontend/app/components/BugFinder/SessionList/SessionListHeader.js +++ b/frontend/app/components/BugFinder/SessionList/SessionListHeader.js @@ -33,10 +33,12 @@ function SessionListHeader({ { activeTab.name } { count ? numberWithCommas(count) : 0 } -
    - Sessions Captured in - -
    + { activeTab.type !== 'bookmark' && ( +
    + Sessions Captured in + +
    + )}
    {/*
    diff --git a/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js b/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js index eb5eaab86..c86c7e573 100644 --- a/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js +++ b/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js @@ -79,7 +79,8 @@ function SessionsMenu(props) { title={ isEnterprise ? "Vault" : "Bookmarks" } iconName={ isEnterprise ? "safe" : "star" } active={activeTab.type === 'bookmark'} - onClick={() => onMenuItemClick({ name: 'Bookmarks', type: 'bookmark' })} + onClick={() => onMenuItemClick({ name: isEnterprise ? 'Vault' : 'Bookmarks', type: 'bookmark', description: isEnterprise ? 'Sessions saved to vault never get\'s deleted from records.' : '' })} + // TODO show the description in header />
    From 8d0d05c2cf020f39f01652686de220f1452bd417 Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Wed, 18 May 2022 13:28:00 +0200 Subject: [PATCH 176/260] fix(backend/heuristics): fixed panic in performanceAggr message encoding --- backend/internal/handlers/web/performanceAggregator.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/internal/handlers/web/performanceAggregator.go b/backend/internal/handlers/web/performanceAggregator.go index 928cedeb9..ba23978b2 100644 --- a/backend/internal/handlers/web/performanceAggregator.go +++ b/backend/internal/handlers/web/performanceAggregator.go @@ -109,8 +109,9 @@ func (b *PerformanceAggregator) Build() Message { b.PerformanceTrackAggr.AvgCPU = 100 - uint64(math.Round(b.sumTickRate*100/b.count)) b.PerformanceTrackAggr.AvgTotalJSHeapSize = uint64(math.Round(b.sumTotalJSHeapSize / b.count)) b.PerformanceTrackAggr.AvgUsedJSHeapSize = uint64(math.Round(b.sumUsedJSHeapSize / b.count)) + msg := b.PerformanceTrackAggr b.reset() - return b.PerformanceTrackAggr + return msg } b.reset() return nil From a9071b68f2bd12ee11ea18115c75beab3d2f6bd4 Mon Sep 17 00:00:00 2001 From: Alexander Zavorotynskiy Date: Wed, 18 May 2022 13:30:21 +0200 Subject: [PATCH 177/260] chore(bash): added heuristics service to local_build.sh --- scripts/helmcharts/local_deploy.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/scripts/helmcharts/local_deploy.sh b/scripts/helmcharts/local_deploy.sh index c8c82ceb4..1cfdde2f3 100644 --- a/scripts/helmcharts/local_deploy.sh +++ b/scripts/helmcharts/local_deploy.sh @@ -18,6 +18,7 @@ apps=( integrations sink storage + heuristics assist peers all @@ -80,6 +81,11 @@ restart(){ source build.sh nil storage restart storage ;; + heuristics) + cd ../../backend + source build.sh nil heuristics + restart heuristics + ;; assist) cd ../../utilities source build.sh $@ From 4c8751944c839e12b9a2ce6bff4c3529a84ef4cf Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Wed, 18 May 2022 13:57:38 +0200 Subject: [PATCH 178/260] style(tracker-*): do not store lock files under the npm puckage dirs --- tracker/.gitignore | 2 + tracker/tracker-assist/package-lock.json | 6863 -------------------- tracker/tracker-axios/package-lock.json | 823 --- tracker/tracker-fetch/package-lock.json | 1900 ------ tracker/tracker-graphql/package-lock.json | 1900 ------ tracker/tracker-mobx/package-lock.json | 814 --- tracker/tracker-ngrx/package-lock.json | 808 --- tracker/tracker-profiler/package-lock.json | 808 --- tracker/tracker-redux/package-lock.json | 1945 ------ tracker/tracker-vuex/package-lock.json | 808 --- tracker/tracker/package-lock.json | 4626 ------------- 11 files changed, 2 insertions(+), 21295 deletions(-) create mode 100644 tracker/.gitignore delete mode 100644 tracker/tracker-assist/package-lock.json delete mode 100644 tracker/tracker-axios/package-lock.json delete mode 100644 tracker/tracker-fetch/package-lock.json delete mode 100644 tracker/tracker-graphql/package-lock.json delete mode 100644 tracker/tracker-mobx/package-lock.json delete mode 100644 tracker/tracker-ngrx/package-lock.json delete mode 100644 tracker/tracker-profiler/package-lock.json delete mode 100644 tracker/tracker-redux/package-lock.json delete mode 100644 tracker/tracker-vuex/package-lock.json delete mode 100644 tracker/tracker/package-lock.json diff --git a/tracker/.gitignore b/tracker/.gitignore new file mode 100644 index 000000000..eeeaa029b --- /dev/null +++ b/tracker/.gitignore @@ -0,0 +1,2 @@ +*package-lock.json +*yarn.lock \ No newline at end of file diff --git a/tracker/tracker-assist/package-lock.json b/tracker/tracker-assist/package-lock.json deleted file mode 100644 index 3c159da6d..000000000 --- a/tracker/tracker-assist/package-lock.json +++ /dev/null @@ -1,6863 +0,0 @@ -{ - "name": "@openreplay/tracker-assist", - "version": "3.5.8", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@openreplay/tracker-assist", - "version": "3.5.8", - "license": "MIT", - "dependencies": { - "csstype": "^3.0.10", - "peerjs": "1.3.2", - "socket.io-client": "^4.4.1" - }, - "devDependencies": { - "@openreplay/tracker": "file:../tracker", - "prettier": "^1.18.2", - "replace-in-files-cli": "^1.0.0", - "typescript": "^4.6.0-dev.20211126" - }, - "peerDependencies": { - "@openreplay/tracker": "^3.5.3" - } - }, - "../tracker": { - "name": "@openreplay/tracker", - "version": "3.5.11", - "dev": true, - "license": "MIT", - "dependencies": { - "error-stack-parser": "^2.0.6" - }, - "devDependencies": { - "@babel/core": "^7.10.2", - "@rollup/plugin-babel": "^5.0.3", - "@rollup/plugin-node-resolve": "^8.0.1", - "@typescript-eslint/eslint-plugin": "^2.34.0", - "@typescript-eslint/parser": "^2.34.0", - "eslint": "^6.8.0", - "eslint-plugin-prettier": "^3.1.4", - "prettier": "^2.0.0", - "replace-in-files": "^2.0.3", - "rollup": "^2.17.0", - "rollup-plugin-terser": "^6.1.0", - "semver": "^6.3.0", - "typescript": "^4.6.0-dev.20211126" - }, - "engines": { - "node": ">=12" - } - }, - "../tracker/node_modules/@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.8.3" - } - }, - "../tracker/node_modules/@babel/core": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.2.tgz", - "integrity": "sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.2", - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helpers": "^7.10.1", - "@babel/parser": "^7.10.2", - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.2", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "../tracker/node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.1" - } - }, - "../tracker/node_modules/@babel/core/node_modules/@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.1", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "../tracker/node_modules/@babel/core/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "../tracker/node_modules/@babel/generator": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", - "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.10.2", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "../tracker/node_modules/@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", - "dev": true, - "dependencies": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "../tracker/node_modules/@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.10.1" - } - }, - "../tracker/node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", - "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.10.1" - } - }, - "../tracker/node_modules/@babel/helper-module-imports": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", - "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.10.1" - } - }, - "../tracker/node_modules/@babel/helper-module-transforms": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", - "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1", - "@babel/helper-simple-access": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1", - "lodash": "^4.17.13" - } - }, - "../tracker/node_modules/@babel/helper-optimise-call-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", - "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.10.1" - } - }, - "../tracker/node_modules/@babel/helper-replace-supers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", - "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", - "dev": true, - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "../tracker/node_modules/@babel/helper-simple-access": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", - "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "../tracker/node_modules/@babel/helper-split-export-declaration": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", - "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.10.1" - } - }, - "../tracker/node_modules/@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", - "dev": true - }, - "../tracker/node_modules/@babel/helpers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz", - "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "../tracker/node_modules/@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "dependencies": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "../tracker/node_modules/@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "../tracker/node_modules/@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "../tracker/node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.1" - } - }, - "../tracker/node_modules/@babel/template/node_modules/@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.1", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "../tracker/node_modules/@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "../tracker/node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.1" - } - }, - "../tracker/node_modules/@babel/traverse/node_modules/@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.1", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "../tracker/node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "../tracker/node_modules/@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.1", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "../tracker/node_modules/@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "../tracker/node_modules/@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "../tracker/node_modules/@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "../tracker/node_modules/@rollup/plugin-babel": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.0.3.tgz", - "integrity": "sha512-NlaPf4E6YFxeOCbqc+A2PTkB1BSy3rfKu6EJuQ1MGhMHpTVvMqKi6Rf0DlwtnEsTNK9LueUgsGEgp5Occ4KDVA==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.7.4", - "@rollup/pluginutils": "^3.0.8" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "rollup": "^1.20.0||^2.0.0" - } - }, - "../tracker/node_modules/@rollup/plugin-node-resolve": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.0.1.tgz", - "integrity": "sha512-KIeAmueDDaYMqMBnUngLVVZhURwxA12nq/YB6nGm5/JpVyOMwI1fCVU3oL/dAnnLBG7oiPXntO5LHOiMrfNXCA==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.0.8", - "@types/resolve": "0.0.8", - "builtin-modules": "^3.1.0", - "deep-freeze": "^0.0.1", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.14.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "../tracker/node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "../tracker/node_modules/@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, - "../tracker/node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "../tracker/node_modules/@types/glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "../tracker/node_modules/@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", - "dev": true - }, - "../tracker/node_modules/@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "../tracker/node_modules/@types/node": { - "version": "14.0.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.13.tgz", - "integrity": "sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA==", - "dev": true - }, - "../tracker/node_modules/@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "../tracker/node_modules/@typescript-eslint/eslint-plugin": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", - "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/experimental-utils": "2.34.0", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^2.0.0", - "eslint": "^5.0.0 || ^6.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../tracker/node_modules/@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", - "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "../tracker/node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "../tracker/node_modules/@typescript-eslint/parser": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", - "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", - "dev": true, - "dependencies": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.34.0", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../tracker/node_modules/@typescript-eslint/typescript-estree": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", - "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../tracker/node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "../tracker/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "../tracker/node_modules/acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0" - } - }, - "../tracker/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../tracker/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../tracker/node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../tracker/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" - } - }, - "../tracker/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" - } - }, - "../tracker/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "../tracker/node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "../tracker/node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "../tracker/node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "../tracker/node_modules/binaryextensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz", - "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==", - "dev": true, - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "../tracker/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "../tracker/node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "../tracker/node_modules/builtin-modules": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", - "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "../tracker/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" - } - }, - "../tracker/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" - } - }, - "../tracker/node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "../tracker/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "../tracker/node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "../tracker/node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "../tracker/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" - } - }, - "../tracker/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "../tracker/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "../tracker/node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "../tracker/node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "../tracker/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "../tracker/node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "../tracker/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "../tracker/node_modules/deep-freeze": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz", - "integrity": "sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ=", - "dev": true - }, - "../tracker/node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "../tracker/node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "../tracker/node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../tracker/node_modules/dir-glob/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" - } - }, - "../tracker/node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "../tracker/node_modules/editions": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/editions/-/editions-2.3.1.tgz", - "integrity": "sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA==", - "dev": true, - "dependencies": { - "errlop": "^2.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "../tracker/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 - }, - "../tracker/node_modules/errlop": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/errlop/-/errlop-2.2.0.tgz", - "integrity": "sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==", - "dev": true, - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "../tracker/node_modules/error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", - "dev": true, - "dependencies": { - "stackframe": "^1.1.1" - } - }, - "../tracker/node_modules/es6-promisify": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz", - "integrity": "sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==", - "dev": true - }, - "../tracker/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": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "../tracker/node_modules/eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "../tracker/node_modules/eslint-plugin-prettier": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz", - "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "eslint": ">=5.0.0", - "prettier": ">=1.13.0" - } - }, - "../tracker/node_modules/eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "../tracker/node_modules/eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "../tracker/node_modules/eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "../tracker/node_modules/eslint/node_modules/regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true, - "engines": { - "node": ">=6.5.0" - } - }, - "../tracker/node_modules/espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", - "dev": true, - "dependencies": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "../tracker/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "../tracker/node_modules/esquery": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", - "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", - "dev": true, - "dependencies": { - "estraverse": "^4.0.0" - }, - "engines": { - "node": ">=0.6" - } - }, - "../tracker/node_modules/esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "dependencies": { - "estraverse": "^4.1.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "../tracker/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "../tracker/node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "../tracker/node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "../tracker/node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "../tracker/node_modules/fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "../tracker/node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "../tracker/node_modules/fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8" - } - }, - "../tracker/node_modules/fast-glob/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../tracker/node_modules/fast-glob/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../tracker/node_modules/fast-glob/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "../tracker/node_modules/fast-glob/node_modules/micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - }, - "engines": { - "node": ">=8" - } - }, - "../tracker/node_modules/fast-glob/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "../tracker/node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "../tracker/node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "../tracker/node_modules/fastq": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", - "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "../tracker/node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../tracker/node_modules/file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "dependencies": { - "flat-cache": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "../tracker/node_modules/flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "dependencies": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "engines": { - "node": ">=4" - } - }, - "../tracker/node_modules/flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", - "dev": true - }, - "../tracker/node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "../tracker/node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "../tracker/node_modules/gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "../tracker/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../tracker/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "../tracker/node_modules/globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", - "dev": true, - "dependencies": { - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - } - }, - "../tracker/node_modules/globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../tracker/node_modules/globby/node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "../tracker/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "../tracker/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "../tracker/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "../tracker/node_modules/import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "../tracker/node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "../tracker/node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "../tracker/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 - }, - "../tracker/node_modules/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "../tracker/node_modules/inquirer/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" - } - }, - "../tracker/node_modules/inquirer/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" - } - }, - "../tracker/node_modules/inquirer/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" - } - }, - "../tracker/node_modules/inquirer/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 - }, - "../tracker/node_modules/inquirer/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" - } - }, - "../tracker/node_modules/inquirer/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" - } - }, - "../tracker/node_modules/inquirer/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" - } - }, - "../tracker/node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "../tracker/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" - } - }, - "../tracker/node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "../tracker/node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", - "dev": true - }, - "../tracker/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "../tracker/node_modules/istextorbinary": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.6.0.tgz", - "integrity": "sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA==", - "dev": true, - "dependencies": { - "binaryextensions": "^2.1.2", - "editions": "^2.2.0", - "textextensions": "^2.5.0" - }, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "../tracker/node_modules/jest-worker": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", - "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", - "dev": true, - "dependencies": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "../tracker/node_modules/jest-worker/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" - } - }, - "../tracker/node_modules/jest-worker/node_modules/supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../tracker/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 - }, - "../tracker/node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "../tracker/node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "../tracker/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "../tracker/node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "../tracker/node_modules/json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "../tracker/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../tracker/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "../tracker/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 - }, - "../tracker/node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "../tracker/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" - } - }, - "../tracker/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "../tracker/node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "../tracker/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "../tracker/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "../tracker/node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "../tracker/node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "../tracker/node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "../tracker/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "../tracker/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" - } - }, - "../tracker/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../tracker/node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "../tracker/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" - } - }, - "../tracker/node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "../tracker/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "../tracker/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 - }, - "../tracker/node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "../tracker/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "../tracker/node_modules/prettier": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", - "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "../tracker/node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "../tracker/node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "../tracker/node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "../tracker/node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "../tracker/node_modules/regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "../tracker/node_modules/replace-in-files": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/replace-in-files/-/replace-in-files-2.0.3.tgz", - "integrity": "sha512-wm9kg+WhKQ10CFaCS9jvUtgw9JnaPilm4TqSRq57H06v5EgX7hTrr/qwgyvq3G+IeNhmr6VTW84LvfnpZfq5/g==", - "dev": true, - "dependencies": { - "co": "^4.6.0", - "es6-promisify": "^6.0.2", - "globby": "^10.0.1", - "istextorbinary": "^2.5.1", - "lodash": "^4.17.15" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "../tracker/node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../tracker/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" - } - }, - "../tracker/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "../tracker/node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "../tracker/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "../tracker/node_modules/rollup": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.17.0.tgz", - "integrity": "sha512-4Um68vKyyTLzT+EWClgc+nyxSlunlmx8wgCO16RDicwxvccnyBHguoNqxPaJL/YPAdvuAJkqaFPf/BfDojzEZA==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.2" - } - }, - "../tracker/node_modules/rollup-plugin-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-6.1.0.tgz", - "integrity": "sha512-4fB3M9nuoWxrwm39habpd4hvrbrde2W2GG4zEGPQg1YITNkM3Tqur5jSuXlWNzbv/2aMLJ+dZJaySc3GCD8oDw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.8.3", - "jest-worker": "^26.0.0", - "serialize-javascript": "^3.0.0", - "terser": "^4.7.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" - } - }, - "../tracker/node_modules/rollup/node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "../tracker/node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "../tracker/node_modules/run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "../tracker/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "../tracker/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "../tracker/node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "../tracker/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "../tracker/node_modules/serialize-javascript": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", - "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "../tracker/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "../tracker/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "../tracker/node_modules/signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true - }, - "../tracker/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "../tracker/node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "../tracker/node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "../tracker/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "../tracker/node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "../tracker/node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "../tracker/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "../tracker/node_modules/stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", - "dev": true - }, - "../tracker/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" - } - }, - "../tracker/node_modules/string-width/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" - } - }, - "../tracker/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "../tracker/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "../tracker/node_modules/strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "../tracker/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" - } - }, - "../tracker/node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "../tracker/node_modules/table/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "../tracker/node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "../tracker/node_modules/table/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "../tracker/node_modules/terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "../tracker/node_modules/terser/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "../tracker/node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "../tracker/node_modules/textextensions": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.6.0.tgz", - "integrity": "sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==", - "dev": true, - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "../tracker/node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "../tracker/node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "../tracker/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "../tracker/node_modules/tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - }, - "../tracker/node_modules/tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "../tracker/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../tracker/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" - } - }, - "../tracker/node_modules/typescript": { - "version": "4.6.0-dev.20211126", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.0-dev.20211126.tgz", - "integrity": "sha512-m+LKstqVv6FYW363aIbO6bm8awsLbeSUCzU6FxPtzUF/WJkFieQfYmdVwEIzigeTpw4E2GETBXnk6P6AixcQJQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "../tracker/node_modules/uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "../tracker/node_modules/v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", - "dev": true - }, - "../tracker/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "../tracker/node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "../tracker/node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "../tracker/node_modules/write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", - "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@openreplay/tracker": { - "resolved": "../tracker", - "link": true - }, - "node_modules/@socket.io/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz", - "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==" - }, - "node_modules/@types/minimist": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", - "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", - "dev": true - }, - "node_modules/@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "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/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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": "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/chalk/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": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "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/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/csstype": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", - "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" - }, - "node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/engine.io-client": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.1.1.tgz", - "integrity": "sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g==", - "dependencies": { - "@socket.io/component-emitter": "~3.0.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.0", - "has-cors": "1.1.0", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~8.2.3", - "xmlhttprequest-ssl": "~2.0.0", - "yeast": "0.1.2" - } - }, - "node_modules/engine.io-parser": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", - "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", - "dependencies": { - "@socket.io/base64-arraybuffer": "~1.0.2" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "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/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" - }, - "node_modules/fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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/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/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "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/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "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": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "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/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/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.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "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/map-obj": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", - "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", - "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": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.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-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/minimist-options/node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "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/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/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/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/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/parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" - }, - "node_modules/parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" - }, - "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-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/peerjs": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/peerjs/-/peerjs-1.3.2.tgz", - "integrity": "sha512-+PHfmsC7QGUU8Ye3OLi6tKQZGPCNy7QatUVNw4JtE8alkguF3+DdO5W0bzepqP2OtE9FqH/ltXt37qyvHw2CqA==", - "dependencies": { - "@types/node": "^10.14.33", - "eventemitter3": "^3.1.2", - "peerjs-js-binarypack": "1.0.1", - "webrtc-adapter": "^7.7.1" - } - }, - "node_modules/peerjs-js-binarypack": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/peerjs-js-binarypack/-/peerjs-js-binarypack-1.0.1.tgz", - "integrity": "sha512-N6aeia3NhdpV7kiGxJV5xQiZZCVEEVjRz2T2C6UZQiBkHWHzUv/oWA4myQLcwBwO8LUoR1KWW5oStvwVesmfCg==" - }, - "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "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/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/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/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/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/replace-in-files-cli": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-in-files-cli/-/replace-in-files-cli-1.0.0.tgz", - "integrity": "sha512-/HMPLZeCA24CBUQ59ymHji6LyMKM+gEgDZlYsiPvXW6+3PdfOw6SsMCVd9KC2B+KlAEe/8vkJA6gfnexVdF15A==", - "dev": true, - "dependencies": { - "arrify": "^2.0.1", - "escape-string-regexp": "^4.0.0", - "globby": "^11.0.1", - "meow": "^7.1.1", - "normalize-path": "^3.0.0", - "write-file-atomic": "^3.0.0" - }, - "bin": { - "replace-in-files": "cli.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rtcpeerconnection-shim": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/rtcpeerconnection-shim/-/rtcpeerconnection-shim-1.2.15.tgz", - "integrity": "sha512-C6DxhXt7bssQ1nHb154lqeL0SXz5Dx4RczXZu2Aa/L1NJFnEVDxFwCBo3fqtuljhHIGceg5JKBV4XJ0gW5JKyw==", - "dependencies": { - "sdp": "^2.6.0" - }, - "engines": { - "node": ">=6.0.0", - "npm": ">=3.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "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" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/sdp": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/sdp/-/sdp-2.12.0.tgz", - "integrity": "sha512-jhXqQAQVM+8Xj5EjJGVweuEzgtGWb3tmEEpl3CLP3cStInSbVHSg0QWOGQzNq8pSID4JkpeV2mPqlMDLrm0/Vw==" - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/socket.io-client": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.4.1.tgz", - "integrity": "sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ==", - "dependencies": { - "@socket.io/component-emitter": "~3.0.0", - "backo2": "~1.0.2", - "debug": "~4.3.2", - "engine.io-client": "~6.1.1", - "parseuri": "0.0.6", - "socket.io-parser": "~4.1.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.1.1.tgz", - "integrity": "sha512-USQVLSkDWE5nbcY760ExdKaJxCE65kcsG/8k5FDGZVVxpD1pA7hABYXYkCUvxUuYYh/+uQw0N/fvBzfT8o07KA==", - "dependencies": { - "@socket.io/component-emitter": "~3.0.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "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.9", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", - "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", - "dev": true - }, - "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": "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/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "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/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "4.6.0-dev.20211126", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.0-dev.20211126.tgz", - "integrity": "sha512-m+LKstqVv6FYW363aIbO6bm8awsLbeSUCzU6FxPtzUF/WJkFieQfYmdVwEIzigeTpw4E2GETBXnk6P6AixcQJQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "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/webrtc-adapter": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/webrtc-adapter/-/webrtc-adapter-7.7.1.tgz", - "integrity": "sha512-TbrbBmiQBL9n0/5bvDdORc6ZfRY/Z7JnEj+EYOD1ghseZdpJ+nF2yx14k3LgQKc7JZnG7HAcL+zHnY25So9d7A==", - "dependencies": { - "rtcpeerconnection-shim": "^1.2.15", - "sdp": "^2.12.0" - }, - "engines": { - "node": ">=6.0.0", - "npm": ">=3.10.0" - } - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", - "dev": true - }, - "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", - "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@openreplay/tracker": { - "version": "file:../tracker", - "requires": { - "@babel/core": "^7.10.2", - "@rollup/plugin-babel": "^5.0.3", - "@rollup/plugin-node-resolve": "^8.0.1", - "@typescript-eslint/eslint-plugin": "^2.34.0", - "@typescript-eslint/parser": "^2.34.0", - "error-stack-parser": "^2.0.6", - "eslint": "^6.8.0", - "eslint-plugin-prettier": "^3.1.4", - "prettier": "^2.0.0", - "replace-in-files": "^2.0.3", - "rollup": "^2.17.0", - "rollup-plugin-terser": "^6.1.0", - "semver": "^6.3.0", - "typescript": "^4.6.0-dev.20211126" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.2.tgz", - "integrity": "sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.2", - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helpers": "^7.10.1", - "@babel/parser": "^7.10.2", - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.2", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.1" - } - }, - "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.1", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", - "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", - "dev": true, - "requires": { - "@babel/types": "^7.10.2", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", - "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", - "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-module-transforms": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", - "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1", - "@babel/helper-simple-access": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1", - "lodash": "^4.17.13" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", - "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", - "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", - "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", - "dev": true, - "requires": { - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", - "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz", - "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==", - "dev": true, - "requires": { - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", - "dev": true - }, - "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.1" - } - }, - "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.1", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - } - } - }, - "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.1" - } - }, - "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.1", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.1", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - } - }, - "@rollup/plugin-babel": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.0.3.tgz", - "integrity": "sha512-NlaPf4E6YFxeOCbqc+A2PTkB1BSy3rfKu6EJuQ1MGhMHpTVvMqKi6Rf0DlwtnEsTNK9LueUgsGEgp5Occ4KDVA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.7.4", - "@rollup/pluginutils": "^3.0.8" - } - }, - "@rollup/plugin-node-resolve": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.0.1.tgz", - "integrity": "sha512-KIeAmueDDaYMqMBnUngLVVZhURwxA12nq/YB6nGm5/JpVyOMwI1fCVU3oL/dAnnLBG7oiPXntO5LHOiMrfNXCA==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.0.8", - "@types/resolve": "0.0.8", - "builtin-modules": "^3.1.0", - "deep-freeze": "^0.0.1", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.14.2" - } - }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - } - }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "@types/glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "14.0.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.13.tgz", - "integrity": "sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA==", - "dev": true - }, - "@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", - "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "2.34.0", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", - "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - } - } - }, - "@typescript-eslint/parser": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", - "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", - "dev": true, - "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.34.0", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", - "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "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 - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "binaryextensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz", - "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "builtin-modules": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", - "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", - "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-freeze": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz", - "integrity": "sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - }, - "dependencies": { - "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 - } - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "editions": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/editions/-/editions-2.3.1.tgz", - "integrity": "sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA==", - "dev": true, - "requires": { - "errlop": "^2.0.0", - "semver": "^6.3.0" - } - }, - "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 - }, - "errlop": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/errlop/-/errlop-2.2.0.tgz", - "integrity": "sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==", - "dev": true - }, - "error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", - "dev": true, - "requires": { - "stackframe": "^1.1.1" - } - }, - "es6-promisify": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz", - "integrity": "sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - } - } - }, - "eslint-plugin-prettier": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz", - "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - }, - "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", - "dev": true, - "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", - "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", - "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "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, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "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 - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "istextorbinary": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.6.0.tgz", - "integrity": "sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA==", - "dev": true, - "requires": { - "binaryextensions": "^2.1.2", - "editions": "^2.2.0", - "textextensions": "^2.5.0" - } - }, - "jest-worker": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", - "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "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 - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "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 - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "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 - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "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 - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "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, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "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 - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prettier": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", - "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true - }, - "replace-in-files": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/replace-in-files/-/replace-in-files-2.0.3.tgz", - "integrity": "sha512-wm9kg+WhKQ10CFaCS9jvUtgw9JnaPilm4TqSRq57H06v5EgX7hTrr/qwgyvq3G+IeNhmr6VTW84LvfnpZfq5/g==", - "dev": true, - "requires": { - "co": "^4.6.0", - "es6-promisify": "^6.0.2", - "globby": "^10.0.1", - "istextorbinary": "^2.5.1", - "lodash": "^4.17.15" - } - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "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 - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.17.0.tgz", - "integrity": "sha512-4Um68vKyyTLzT+EWClgc+nyxSlunlmx8wgCO16RDicwxvccnyBHguoNqxPaJL/YPAdvuAJkqaFPf/BfDojzEZA==", - "dev": true, - "requires": { - "fsevents": "~2.1.2" - }, - "dependencies": { - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - } - } - }, - "rollup-plugin-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-6.1.0.tgz", - "integrity": "sha512-4fB3M9nuoWxrwm39habpd4hvrbrde2W2GG4zEGPQg1YITNkM3Tqur5jSuXlWNzbv/2aMLJ+dZJaySc3GCD8oDw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "jest-worker": "^26.0.0", - "serialize-javascript": "^3.0.0", - "terser": "^4.7.0" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "serialize-javascript": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", - "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", - "dev": true - }, - "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, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "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, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - } - } - }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "textextensions": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.6.0.tgz", - "integrity": "sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "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 - }, - "typescript": { - "version": "4.6.0-dev.20211126", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.0-dev.20211126.tgz", - "integrity": "sha512-m+LKstqVv6FYW363aIbO6bm8awsLbeSUCzU6FxPtzUF/WJkFieQfYmdVwEIzigeTpw4E2GETBXnk6P6AixcQJQ==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - } - } - }, - "@socket.io/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==" - }, - "@socket.io/component-emitter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz", - "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==" - }, - "@types/minimist": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", - "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", - "dev": true - }, - "@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "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, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "csstype": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", - "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" - }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "engine.io-client": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.1.1.tgz", - "integrity": "sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g==", - "requires": { - "@socket.io/component-emitter": "~3.0.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.0", - "has-cors": "1.1.0", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~8.2.3", - "xmlhttprequest-ssl": "~2.0.0", - "yeast": "0.1.2" - } - }, - "engine.io-parser": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", - "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", - "requires": { - "@socket.io/base64-arraybuffer": "~1.0.2" - } - }, - "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, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" - }, - "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - } - }, - "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "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 - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "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 - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "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 - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "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 - }, - "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 - }, - "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 - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "map-obj": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", - "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", - "dev": true - }, - "meow": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", - "dev": true, - "requires": { - "@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": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "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 - }, - "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, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "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, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "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, - "requires": { - "p-try": "^2.0.0" - } - }, - "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, - "requires": { - "p-limit": "^2.2.0" - } - }, - "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 - }, - "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, - "requires": { - "@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" - } - }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" - }, - "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 - }, - "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 - }, - "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 - }, - "peerjs": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/peerjs/-/peerjs-1.3.2.tgz", - "integrity": "sha512-+PHfmsC7QGUU8Ye3OLi6tKQZGPCNy7QatUVNw4JtE8alkguF3+DdO5W0bzepqP2OtE9FqH/ltXt37qyvHw2CqA==", - "requires": { - "@types/node": "^10.14.33", - "eventemitter3": "^3.1.2", - "peerjs-js-binarypack": "1.0.1", - "webrtc-adapter": "^7.7.1" - } - }, - "peerjs-js-binarypack": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/peerjs-js-binarypack/-/peerjs-js-binarypack-1.0.1.tgz", - "integrity": "sha512-N6aeia3NhdpV7kiGxJV5xQiZZCVEEVjRz2T2C6UZQiBkHWHzUv/oWA4myQLcwBwO8LUoR1KWW5oStvwVesmfCg==" - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "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 - } - } - }, - "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, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "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 - } - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "replace-in-files-cli": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-in-files-cli/-/replace-in-files-cli-1.0.0.tgz", - "integrity": "sha512-/HMPLZeCA24CBUQ59ymHji6LyMKM+gEgDZlYsiPvXW6+3PdfOw6SsMCVd9KC2B+KlAEe/8vkJA6gfnexVdF15A==", - "dev": true, - "requires": { - "arrify": "^2.0.1", - "escape-string-regexp": "^4.0.0", - "globby": "^11.0.1", - "meow": "^7.1.1", - "normalize-path": "^3.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rtcpeerconnection-shim": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/rtcpeerconnection-shim/-/rtcpeerconnection-shim-1.2.15.tgz", - "integrity": "sha512-C6DxhXt7bssQ1nHb154lqeL0SXz5Dx4RczXZu2Aa/L1NJFnEVDxFwCBo3fqtuljhHIGceg5JKBV4XJ0gW5JKyw==", - "requires": { - "sdp": "^2.6.0" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "sdp": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/sdp/-/sdp-2.12.0.tgz", - "integrity": "sha512-jhXqQAQVM+8Xj5EjJGVweuEzgtGWb3tmEEpl3CLP3cStInSbVHSg0QWOGQzNq8pSID4JkpeV2mPqlMDLrm0/Vw==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "socket.io-client": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.4.1.tgz", - "integrity": "sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ==", - "requires": { - "@socket.io/component-emitter": "~3.0.0", - "backo2": "~1.0.2", - "debug": "~4.3.2", - "engine.io-client": "~6.1.1", - "parseuri": "0.0.6", - "socket.io-parser": "~4.1.1" - } - }, - "socket.io-parser": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.1.1.tgz", - "integrity": "sha512-USQVLSkDWE5nbcY760ExdKaJxCE65kcsG/8k5FDGZVVxpD1pA7hABYXYkCUvxUuYYh/+uQw0N/fvBzfT8o07KA==", - "requires": { - "@socket.io/component-emitter": "~3.0.0", - "debug": "~4.3.1" - } - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "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 - }, - "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, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", - "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", - "dev": true - }, - "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, - "requires": { - "min-indent": "^1.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "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 - }, - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.6.0-dev.20211126", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.0-dev.20211126.tgz", - "integrity": "sha512-m+LKstqVv6FYW363aIbO6bm8awsLbeSUCzU6FxPtzUF/WJkFieQfYmdVwEIzigeTpw4E2GETBXnk6P6AixcQJQ==", - "dev": true - }, - "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, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "webrtc-adapter": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/webrtc-adapter/-/webrtc-adapter-7.7.1.tgz", - "integrity": "sha512-TbrbBmiQBL9n0/5bvDdORc6ZfRY/Z7JnEj+EYOD1ghseZdpJ+nF2yx14k3LgQKc7JZnG7HAcL+zHnY25So9d7A==", - "requires": { - "rtcpeerconnection-shim": "^1.2.15", - "sdp": "^2.12.0" - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "requires": {} - }, - "xmlhttprequest-ssl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==" - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - } - } -} diff --git a/tracker/tracker-axios/package-lock.json b/tracker/tracker-axios/package-lock.json deleted file mode 100644 index 9894d6bc8..000000000 --- a/tracker/tracker-axios/package-lock.json +++ /dev/null @@ -1,823 +0,0 @@ -{ - "name": "@openreplay/tracker-axios", - "version": "3.4.1", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.4", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.4", - "fastq": "^1.6.0" - } - }, - "@openreplay/tracker": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/@openreplay/tracker/-/tracker-3.4.9.tgz", - "integrity": "sha512-7w1ddAboWu6NN926ySMUsKG6kmlYM0BYelSRIPM1xdoddLMRKZT4XaggLYjFezNSi9UJ9WYI8qwMHFIkS9lhCQ==", - "dev": true, - "requires": { - "error-stack-parser": "^2.0.6" - } - }, - "@types/minimist": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", - "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "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, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "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, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", - "dev": true, - "requires": { - "stackframe": "^1.1.1" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - } - }, - "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "follow-redirects": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", - "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "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 - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "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 - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "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 - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "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 - }, - "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 - }, - "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 - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "map-obj": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", - "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", - "dev": true - }, - "meow": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", - "dev": true, - "requires": { - "@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": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "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 - }, - "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, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - } - } - }, - "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, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "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, - "requires": { - "p-try": "^2.0.0" - } - }, - "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, - "requires": { - "p-limit": "^2.2.0" - } - }, - "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 - }, - "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, - "requires": { - "@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" - } - }, - "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 - }, - "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 - }, - "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 - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "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 - } - } - }, - "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, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "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 - } - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "replace-in-files-cli": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-in-files-cli/-/replace-in-files-cli-1.0.0.tgz", - "integrity": "sha512-/HMPLZeCA24CBUQ59ymHji6LyMKM+gEgDZlYsiPvXW6+3PdfOw6SsMCVd9KC2B+KlAEe/8vkJA6gfnexVdF15A==", - "dev": true, - "requires": { - "arrify": "^2.0.1", - "escape-string-regexp": "^4.0.0", - "globby": "^11.0.1", - "meow": "^7.1.1", - "normalize-path": "^3.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "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 - }, - "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, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", - "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", - "dev": true - }, - "stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", - "dev": true - }, - "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, - "requires": { - "min-indent": "^1.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "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 - }, - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.6.0-dev.20211126", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.0-dev.20211126.tgz", - "integrity": "sha512-m+LKstqVv6FYW363aIbO6bm8awsLbeSUCzU6FxPtzUF/WJkFieQfYmdVwEIzigeTpw4E2GETBXnk6P6AixcQJQ==", - "dev": true - }, - "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, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } -} diff --git a/tracker/tracker-fetch/package-lock.json b/tracker/tracker-fetch/package-lock.json deleted file mode 100644 index 61699bcb7..000000000 --- a/tracker/tracker-fetch/package-lock.json +++ /dev/null @@ -1,1900 +0,0 @@ -{ - "name": "@openreplay/tracker-fetch", - "version": "3.4.1", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@openreplay/tracker-fetch", - "version": "3.4.1", - "license": "MIT", - "devDependencies": { - "@openreplay/tracker": "^3.0.0", - "prettier": "^1.18.2", - "replace-in-files-cli": "^1.0.0", - "typescript": "^3.6.4" - }, - "peerDependencies": { - "@openreplay/tracker": "^3.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@openreplay/tracker": { - "version": "3.4.11", - "resolved": "https://registry.npmjs.org/@openreplay/tracker/-/tracker-3.4.11.tgz", - "integrity": "sha512-lpWxBrw30tv490Jftb6YGX+4Zn6jhbfkxY0fI4lkfuGaNmmKHnwRTpJe8NoZyisbcQZ8r1a6xgFiag13q+03Lw==", - "dev": true, - "dependencies": { - "error-stack-parser": "^2.0.6" - }, - "engines": { - "node": ">=12" - } - }, - "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/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/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/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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": "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/chalk/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": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "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/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", - "dev": true, - "dependencies": { - "stackframe": "^1.1.1" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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/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/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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/ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "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/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "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": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "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/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/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": "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/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": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", - "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": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.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-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/minimist-options/node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/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/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/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-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/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "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/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/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/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/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/replace-in-files-cli": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-in-files-cli/-/replace-in-files-cli-1.0.0.tgz", - "integrity": "sha512-/HMPLZeCA24CBUQ59ymHji6LyMKM+gEgDZlYsiPvXW6+3PdfOw6SsMCVd9KC2B+KlAEe/8vkJA6gfnexVdF15A==", - "dev": true, - "dependencies": { - "arrify": "^2.0.1", - "escape-string-regexp": "^4.0.0", - "globby": "^11.0.1", - "meow": "^7.1.1", - "normalize-path": "^3.0.0", - "write-file-atomic": "^3.0.0" - }, - "bin": { - "replace-in-files": "cli.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "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" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "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.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "node_modules/stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", - "dev": true - }, - "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": "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/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "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/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "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/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - }, - "@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@openreplay/tracker": { - "version": "3.4.11", - "resolved": "https://registry.npmjs.org/@openreplay/tracker/-/tracker-3.4.11.tgz", - "integrity": "sha512-lpWxBrw30tv490Jftb6YGX+4Zn6jhbfkxY0fI4lkfuGaNmmKHnwRTpJe8NoZyisbcQZ8r1a6xgFiag13q+03Lw==", - "dev": true, - "requires": { - "error-stack-parser": "^2.0.6" - } - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "@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 - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "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, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "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, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", - "dev": true, - "requires": { - "stackframe": "^1.1.1" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "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 - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "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 - }, - "ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "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 - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "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 - }, - "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 - }, - "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 - }, - "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 - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "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 - }, - "meow": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", - "dev": true, - "requires": { - "@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": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "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 - }, - "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, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - } - } - }, - "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, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "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, - "requires": { - "p-try": "^2.0.0" - } - }, - "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, - "requires": { - "p-limit": "^2.2.0" - } - }, - "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 - }, - "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, - "requires": { - "@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" - } - }, - "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 - }, - "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 - }, - "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 - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "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 - } - } - }, - "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, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "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 - } - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "replace-in-files-cli": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-in-files-cli/-/replace-in-files-cli-1.0.0.tgz", - "integrity": "sha512-/HMPLZeCA24CBUQ59ymHji6LyMKM+gEgDZlYsiPvXW6+3PdfOw6SsMCVd9KC2B+KlAEe/8vkJA6gfnexVdF15A==", - "dev": true, - "requires": { - "arrify": "^2.0.1", - "escape-string-regexp": "^4.0.0", - "globby": "^11.0.1", - "meow": "^7.1.1", - "normalize-path": "^3.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "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 - }, - "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, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", - "dev": true - }, - "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, - "requires": { - "min-indent": "^1.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "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 - }, - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "dev": true - }, - "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, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } -} diff --git a/tracker/tracker-graphql/package-lock.json b/tracker/tracker-graphql/package-lock.json deleted file mode 100644 index 2b3303cb3..000000000 --- a/tracker/tracker-graphql/package-lock.json +++ /dev/null @@ -1,1900 +0,0 @@ -{ - "name": "@openreplay/tracker-graphql", - "version": "3.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@openreplay/tracker-graphql", - "version": "3.0.0", - "license": "MIT", - "devDependencies": { - "@openreplay/tracker": "^3.0.0", - "prettier": "^1.18.2", - "replace-in-files-cli": "^1.0.0", - "typescript": "^3.6.4" - }, - "peerDependencies": { - "@openreplay/tracker": "^3.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@openreplay/tracker": { - "version": "3.4.11", - "resolved": "https://registry.npmjs.org/@openreplay/tracker/-/tracker-3.4.11.tgz", - "integrity": "sha512-lpWxBrw30tv490Jftb6YGX+4Zn6jhbfkxY0fI4lkfuGaNmmKHnwRTpJe8NoZyisbcQZ8r1a6xgFiag13q+03Lw==", - "dev": true, - "dependencies": { - "error-stack-parser": "^2.0.6" - }, - "engines": { - "node": ">=12" - } - }, - "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/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/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/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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": "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/chalk/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": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "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/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", - "dev": true, - "dependencies": { - "stackframe": "^1.1.1" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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/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/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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/ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "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/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "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": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "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/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/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": "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/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": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", - "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": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.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-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/minimist-options/node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/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/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/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-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/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "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/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/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/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/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/replace-in-files-cli": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-in-files-cli/-/replace-in-files-cli-1.0.0.tgz", - "integrity": "sha512-/HMPLZeCA24CBUQ59ymHji6LyMKM+gEgDZlYsiPvXW6+3PdfOw6SsMCVd9KC2B+KlAEe/8vkJA6gfnexVdF15A==", - "dev": true, - "dependencies": { - "arrify": "^2.0.1", - "escape-string-regexp": "^4.0.0", - "globby": "^11.0.1", - "meow": "^7.1.1", - "normalize-path": "^3.0.0", - "write-file-atomic": "^3.0.0" - }, - "bin": { - "replace-in-files": "cli.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "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" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "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.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "node_modules/stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", - "dev": true - }, - "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": "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/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "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/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "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/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - }, - "@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@openreplay/tracker": { - "version": "3.4.11", - "resolved": "https://registry.npmjs.org/@openreplay/tracker/-/tracker-3.4.11.tgz", - "integrity": "sha512-lpWxBrw30tv490Jftb6YGX+4Zn6jhbfkxY0fI4lkfuGaNmmKHnwRTpJe8NoZyisbcQZ8r1a6xgFiag13q+03Lw==", - "dev": true, - "requires": { - "error-stack-parser": "^2.0.6" - } - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "@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 - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "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, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "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, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", - "dev": true, - "requires": { - "stackframe": "^1.1.1" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "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 - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "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 - }, - "ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "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 - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "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 - }, - "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 - }, - "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 - }, - "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 - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "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 - }, - "meow": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", - "dev": true, - "requires": { - "@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": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "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 - }, - "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, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - } - } - }, - "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, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "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, - "requires": { - "p-try": "^2.0.0" - } - }, - "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, - "requires": { - "p-limit": "^2.2.0" - } - }, - "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 - }, - "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, - "requires": { - "@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" - } - }, - "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 - }, - "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 - }, - "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 - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "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 - } - } - }, - "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, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "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 - } - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "replace-in-files-cli": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-in-files-cli/-/replace-in-files-cli-1.0.0.tgz", - "integrity": "sha512-/HMPLZeCA24CBUQ59ymHji6LyMKM+gEgDZlYsiPvXW6+3PdfOw6SsMCVd9KC2B+KlAEe/8vkJA6gfnexVdF15A==", - "dev": true, - "requires": { - "arrify": "^2.0.1", - "escape-string-regexp": "^4.0.0", - "globby": "^11.0.1", - "meow": "^7.1.1", - "normalize-path": "^3.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "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 - }, - "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, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", - "dev": true - }, - "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, - "requires": { - "min-indent": "^1.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "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 - }, - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "dev": true - }, - "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, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } -} diff --git a/tracker/tracker-mobx/package-lock.json b/tracker/tracker-mobx/package-lock.json deleted file mode 100644 index 7e115ddcd..000000000 --- a/tracker/tracker-mobx/package-lock.json +++ /dev/null @@ -1,814 +0,0 @@ -{ - "name": "@openreplay/tracker-mobx", - "version": "3.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.4", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.4", - "fastq": "^1.6.0" - } - }, - "@openreplay/tracker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@openreplay/tracker/-/tracker-3.0.3.tgz", - "integrity": "sha512-50C2cwJFENeHNjXVV90uIA5YE1bxfGbhI8e76Nfw9Pg+GVN38DcvGhr3PJ3OKjioT9V4gXBbvtE/RDGRaJJWLA==", - "dev": true, - "requires": { - "error-stack-parser": "^2.0.6" - } - }, - "@types/minimist": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", - "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "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, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "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, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", - "dev": true, - "requires": { - "stackframe": "^1.1.1" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - } - }, - "fastq": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.1.tgz", - "integrity": "sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globby": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "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 - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "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 - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "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 - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "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 - }, - "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 - }, - "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 - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "map-obj": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", - "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", - "dev": true - }, - "meow": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", - "dev": true, - "requires": { - "@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": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "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 - }, - "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, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - } - } - }, - "mobx": { - "version": "4.15.7", - "resolved": "https://registry.npmjs.org/mobx/-/mobx-4.15.7.tgz", - "integrity": "sha512-X4uQvuf2zYKHVO5kRT5Utmr+J9fDnRgxWWnSqJ4oiccPTQU38YG+/O3nPmOhUy4jeHexl7XJJpWDBgEnEfp+8w==", - "dev": true - }, - "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, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "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, - "requires": { - "p-try": "^2.0.0" - } - }, - "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, - "requires": { - "p-limit": "^2.2.0" - } - }, - "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 - }, - "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, - "requires": { - "@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" - } - }, - "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 - }, - "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 - }, - "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 - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz", - "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "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 - } - } - }, - "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, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "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 - } - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "replace-in-files-cli": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-in-files-cli/-/replace-in-files-cli-1.0.0.tgz", - "integrity": "sha512-/HMPLZeCA24CBUQ59ymHji6LyMKM+gEgDZlYsiPvXW6+3PdfOw6SsMCVd9KC2B+KlAEe/8vkJA6gfnexVdF15A==", - "dev": true, - "requires": { - "arrify": "^2.0.1", - "escape-string-regexp": "^4.0.0", - "globby": "^11.0.1", - "meow": "^7.1.1", - "normalize-path": "^3.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "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 - }, - "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, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true - }, - "stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", - "dev": true - }, - "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, - "requires": { - "min-indent": "^1.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "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 - }, - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", - "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==", - "dev": true - }, - "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, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } -} diff --git a/tracker/tracker-ngrx/package-lock.json b/tracker/tracker-ngrx/package-lock.json deleted file mode 100644 index 60cfabefe..000000000 --- a/tracker/tracker-ngrx/package-lock.json +++ /dev/null @@ -1,808 +0,0 @@ -{ - "name": "@openreplay/tracker-ngrx", - "version": "3.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.4", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.4", - "fastq": "^1.6.0" - } - }, - "@openreplay/tracker": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@openreplay/tracker/-/tracker-3.4.8.tgz", - "integrity": "sha512-Qrvoa0MUzVHCfU3tl8c9e4pz5Ee59Z5TZWV4cR5f5yFMZtxUNsv5b5Q0B2DebYI/dDI1iKBscluvmQOrIaIAzw==", - "dev": true, - "requires": { - "error-stack-parser": "^2.0.6" - } - }, - "@types/minimist": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", - "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "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, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "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, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", - "dev": true, - "requires": { - "stackframe": "^1.1.1" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - } - }, - "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "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 - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "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 - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "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 - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "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 - }, - "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 - }, - "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 - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "map-obj": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", - "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", - "dev": true - }, - "meow": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", - "dev": true, - "requires": { - "@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": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "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 - }, - "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, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - } - } - }, - "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, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "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, - "requires": { - "p-try": "^2.0.0" - } - }, - "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, - "requires": { - "p-limit": "^2.2.0" - } - }, - "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 - }, - "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, - "requires": { - "@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" - } - }, - "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 - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "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 - }, - "picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "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 - } - } - }, - "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, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "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 - } - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "replace-in-files-cli": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-in-files-cli/-/replace-in-files-cli-1.0.0.tgz", - "integrity": "sha512-/HMPLZeCA24CBUQ59ymHji6LyMKM+gEgDZlYsiPvXW6+3PdfOw6SsMCVd9KC2B+KlAEe/8vkJA6gfnexVdF15A==", - "dev": true, - "requires": { - "arrify": "^2.0.1", - "escape-string-regexp": "^4.0.0", - "globby": "^11.0.1", - "meow": "^7.1.1", - "normalize-path": "^3.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "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 - }, - "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, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true - }, - "stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", - "dev": true - }, - "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, - "requires": { - "min-indent": "^1.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "trim-newlines": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", - "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", - "dev": true - }, - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.6.0-dev.20211126", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.0-dev.20211126.tgz", - "integrity": "sha512-m+LKstqVv6FYW363aIbO6bm8awsLbeSUCzU6FxPtzUF/WJkFieQfYmdVwEIzigeTpw4E2GETBXnk6P6AixcQJQ==", - "dev": true - }, - "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, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } -} diff --git a/tracker/tracker-profiler/package-lock.json b/tracker/tracker-profiler/package-lock.json deleted file mode 100644 index 4a4565bcc..000000000 --- a/tracker/tracker-profiler/package-lock.json +++ /dev/null @@ -1,808 +0,0 @@ -{ - "name": "@openreplay/tracker-profiler", - "version": "3.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.4", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.4", - "fastq": "^1.6.0" - } - }, - "@openreplay/tracker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@openreplay/tracker/-/tracker-3.0.0.tgz", - "integrity": "sha512-kuMnXxGFvieVsuQJJ70FVataAZgCT9//Vji/qrsTVjXStQuhPTe61iyUS4eAudaR/N3r5/yFt9Z0dEb3fJHDFg==", - "dev": true, - "requires": { - "error-stack-parser": "^2.0.6" - } - }, - "@types/minimist": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", - "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "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, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "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, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", - "dev": true, - "requires": { - "stackframe": "^1.1.1" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - } - }, - "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "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 - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "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 - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "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 - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-core-module": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.3.0.tgz", - "integrity": "sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "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 - }, - "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 - }, - "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 - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "map-obj": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", - "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", - "dev": true - }, - "meow": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", - "dev": true, - "requires": { - "@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": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "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 - }, - "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, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - } - } - }, - "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, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "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, - "requires": { - "p-try": "^2.0.0" - } - }, - "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, - "requires": { - "p-limit": "^2.2.0" - } - }, - "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 - }, - "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, - "requires": { - "@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" - } - }, - "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 - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "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 - }, - "picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "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 - } - } - }, - "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, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "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 - } - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "replace-in-files-cli": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-in-files-cli/-/replace-in-files-cli-1.0.0.tgz", - "integrity": "sha512-/HMPLZeCA24CBUQ59ymHji6LyMKM+gEgDZlYsiPvXW6+3PdfOw6SsMCVd9KC2B+KlAEe/8vkJA6gfnexVdF15A==", - "dev": true, - "requires": { - "arrify": "^2.0.1", - "escape-string-regexp": "^4.0.0", - "globby": "^11.0.1", - "meow": "^7.1.1", - "normalize-path": "^3.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "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 - }, - "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, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true - }, - "stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", - "dev": true - }, - "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, - "requires": { - "min-indent": "^1.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "trim-newlines": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", - "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", - "dev": true - }, - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.2.tgz", - "integrity": "sha512-EgOVgL/4xfVrCMbhYKUQTdF37SQn4Iw73H5BgCrF1Abdun7Kwy/QZsE/ssAy0y4LxBbvua3PIbFsbRczWWnDdQ==", - "dev": true - }, - "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, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } -} diff --git a/tracker/tracker-redux/package-lock.json b/tracker/tracker-redux/package-lock.json deleted file mode 100644 index 00aecf7ec..000000000 --- a/tracker/tracker-redux/package-lock.json +++ /dev/null @@ -1,1945 +0,0 @@ -{ - "name": "@openreplay/tracker-redux", - "version": "3.5.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@openreplay/tracker-redux", - "version": "3.5.0", - "license": "MIT", - "devDependencies": { - "@openreplay/tracker": "^3.5.0", - "prettier": "^1.18.2", - "replace-in-files-cli": "^1.0.0", - "typescript": "^4.6.0-dev.20211126" - }, - "peerDependencies": { - "@openreplay/tracker": "^3.5.0", - "redux": "^4.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.12.13" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "node_modules/@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz", - "integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==", - "peer": true, - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.4", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.4", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@openreplay/tracker": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@openreplay/tracker/-/tracker-3.5.2.tgz", - "integrity": "sha512-b0/BCFRQW4afh/k1cYhudbszmdkTQu7GBob8MYzd0vuWLMx6muXv2oSXHsyc3cro9fWrymQPeRZV3zrpNb5ioA==", - "dev": true, - "dependencies": { - "error-stack-parser": "^2.0.6" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@types/minimist": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", - "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", - "dev": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "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/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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": "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/chalk/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": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "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/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", - "dev": true, - "dependencies": { - "stackframe": "^1.1.1" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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/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/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "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/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "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": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "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/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/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.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "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/map-obj": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.0.tgz", - "integrity": "sha512-NAq0fCmZYGz9UFEQyndp7sisrow4GroyGeKluyKC/chuITZsPyOyC1UJZPJlVFImhXdROIP5xqouRLThT3BbpQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", - "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": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - }, - "engines": { - "node": ">=8" - } - }, - "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-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/minimist-options/node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/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/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/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-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "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/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "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/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/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/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/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/redux": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.2.tgz", - "integrity": "sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "peer": true - }, - "node_modules/replace-in-files-cli": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-in-files-cli/-/replace-in-files-cli-1.0.0.tgz", - "integrity": "sha512-/HMPLZeCA24CBUQ59ymHji6LyMKM+gEgDZlYsiPvXW6+3PdfOw6SsMCVd9KC2B+KlAEe/8vkJA6gfnexVdF15A==", - "dev": true, - "dependencies": { - "arrify": "^2.0.1", - "escape-string-regexp": "^4.0.0", - "globby": "^11.0.1", - "meow": "^7.1.1", - "normalize-path": "^3.0.0", - "write-file-atomic": "^3.0.0" - }, - "bin": { - "replace-in-files": "cli.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "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" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "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.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true - }, - "node_modules/stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", - "dev": true - }, - "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": "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/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", - "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "4.6.0-dev.20211126", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.0-dev.20211126.tgz", - "integrity": "sha512-m+LKstqVv6FYW363aIbO6bm8awsLbeSUCzU6FxPtzUF/WJkFieQfYmdVwEIzigeTpw4E2GETBXnk6P6AixcQJQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "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/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/runtime": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz", - "integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==", - "peer": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.4", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.4", - "fastq": "^1.6.0" - } - }, - "@openreplay/tracker": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@openreplay/tracker/-/tracker-3.5.2.tgz", - "integrity": "sha512-b0/BCFRQW4afh/k1cYhudbszmdkTQu7GBob8MYzd0vuWLMx6muXv2oSXHsyc3cro9fWrymQPeRZV3zrpNb5ioA==", - "dev": true, - "requires": { - "error-stack-parser": "^2.0.6" - } - }, - "@types/minimist": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", - "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "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, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "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, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", - "dev": true, - "requires": { - "stackframe": "^1.1.1" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - } - }, - "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "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 - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "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 - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "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 - }, - "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 - }, - "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 - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "map-obj": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.0.tgz", - "integrity": "sha512-NAq0fCmZYGz9UFEQyndp7sisrow4GroyGeKluyKC/chuITZsPyOyC1UJZPJlVFImhXdROIP5xqouRLThT3BbpQ==", - "dev": true - }, - "meow": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", - "dev": true, - "requires": { - "@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": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "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 - }, - "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, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - } - } - }, - "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, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "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, - "requires": { - "p-try": "^2.0.0" - } - }, - "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, - "requires": { - "p-limit": "^2.2.0" - } - }, - "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 - }, - "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, - "requires": { - "@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" - } - }, - "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 - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "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 - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "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 - } - } - }, - "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, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "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 - } - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "redux": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.2.tgz", - "integrity": "sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw==", - "peer": true, - "requires": { - "@babel/runtime": "^7.9.2" - } - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "peer": true - }, - "replace-in-files-cli": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-in-files-cli/-/replace-in-files-cli-1.0.0.tgz", - "integrity": "sha512-/HMPLZeCA24CBUQ59ymHji6LyMKM+gEgDZlYsiPvXW6+3PdfOw6SsMCVd9KC2B+KlAEe/8vkJA6gfnexVdF15A==", - "dev": true, - "requires": { - "arrify": "^2.0.1", - "escape-string-regexp": "^4.0.0", - "globby": "^11.0.1", - "meow": "^7.1.1", - "normalize-path": "^3.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "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 - }, - "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, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true - }, - "stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", - "dev": true - }, - "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, - "requires": { - "min-indent": "^1.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "trim-newlines": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", - "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", - "dev": true - }, - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.6.0-dev.20211126", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.0-dev.20211126.tgz", - "integrity": "sha512-m+LKstqVv6FYW363aIbO6bm8awsLbeSUCzU6FxPtzUF/WJkFieQfYmdVwEIzigeTpw4E2GETBXnk6P6AixcQJQ==", - "dev": true - }, - "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, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } -} diff --git a/tracker/tracker-vuex/package-lock.json b/tracker/tracker-vuex/package-lock.json deleted file mode 100644 index 35fd251fe..000000000 --- a/tracker/tracker-vuex/package-lock.json +++ /dev/null @@ -1,808 +0,0 @@ -{ - "name": "@openreplay/tracker-vuex", - "version": "3.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.4", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.4", - "fastq": "^1.6.0" - } - }, - "@openreplay/tracker": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@openreplay/tracker/-/tracker-3.4.8.tgz", - "integrity": "sha512-Qrvoa0MUzVHCfU3tl8c9e4pz5Ee59Z5TZWV4cR5f5yFMZtxUNsv5b5Q0B2DebYI/dDI1iKBscluvmQOrIaIAzw==", - "dev": true, - "requires": { - "error-stack-parser": "^2.0.6" - } - }, - "@types/minimist": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", - "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "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, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "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, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", - "dev": true, - "requires": { - "stackframe": "^1.1.1" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - } - }, - "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "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 - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "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 - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "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 - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "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 - }, - "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 - }, - "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 - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "map-obj": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", - "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", - "dev": true - }, - "meow": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", - "dev": true, - "requires": { - "@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": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "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 - }, - "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, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - } - } - }, - "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, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "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, - "requires": { - "p-try": "^2.0.0" - } - }, - "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, - "requires": { - "p-limit": "^2.2.0" - } - }, - "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 - }, - "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, - "requires": { - "@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" - } - }, - "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 - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "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 - }, - "picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "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 - } - } - }, - "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, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "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 - } - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "replace-in-files-cli": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-in-files-cli/-/replace-in-files-cli-1.0.0.tgz", - "integrity": "sha512-/HMPLZeCA24CBUQ59ymHji6LyMKM+gEgDZlYsiPvXW6+3PdfOw6SsMCVd9KC2B+KlAEe/8vkJA6gfnexVdF15A==", - "dev": true, - "requires": { - "arrify": "^2.0.1", - "escape-string-regexp": "^4.0.0", - "globby": "^11.0.1", - "meow": "^7.1.1", - "normalize-path": "^3.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "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 - }, - "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, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true - }, - "stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", - "dev": true - }, - "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, - "requires": { - "min-indent": "^1.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "trim-newlines": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", - "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", - "dev": true - }, - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.6.0-dev.20211126", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.0-dev.20211126.tgz", - "integrity": "sha512-m+LKstqVv6FYW363aIbO6bm8awsLbeSUCzU6FxPtzUF/WJkFieQfYmdVwEIzigeTpw4E2GETBXnk6P6AixcQJQ==", - "dev": true - }, - "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, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } -} diff --git a/tracker/tracker/package-lock.json b/tracker/tracker/package-lock.json deleted file mode 100644 index a6d59f356..000000000 --- a/tracker/tracker/package-lock.json +++ /dev/null @@ -1,4626 +0,0 @@ -{ - "name": "@openreplay/tracker", - "version": "3.5.9", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@openreplay/tracker", - "version": "3.5.9", - "license": "MIT", - "dependencies": { - "error-stack-parser": "^2.0.6" - }, - "devDependencies": { - "@babel/core": "^7.10.2", - "@rollup/plugin-babel": "^5.0.3", - "@rollup/plugin-node-resolve": "^8.0.1", - "@typescript-eslint/eslint-plugin": "^2.34.0", - "@typescript-eslint/parser": "^2.34.0", - "eslint": "^6.8.0", - "eslint-plugin-prettier": "^3.1.4", - "prettier": "^2.0.0", - "replace-in-files": "^2.0.3", - "rollup": "^2.17.0", - "rollup-plugin-terser": "^6.1.0", - "semver": "^6.3.0", - "typescript": "^4.6.0-dev.20211126" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.8.3" - } - }, - "node_modules/@babel/core": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.2.tgz", - "integrity": "sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.2", - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helpers": "^7.10.1", - "@babel/parser": "^7.10.2", - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.2", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.1" - } - }, - "node_modules/@babel/core/node_modules/@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.1", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@babel/generator": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", - "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.10.2", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", - "dev": true, - "dependencies": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.10.1" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", - "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.10.1" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", - "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.10.1" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", - "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1", - "@babel/helper-simple-access": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1", - "lodash": "^4.17.13" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", - "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.10.1" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", - "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", - "dev": true, - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", - "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", - "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.10.1" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", - "dev": true - }, - "node_modules/@babel/helpers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz", - "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "node_modules/@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "dependencies": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.1" - } - }, - "node_modules/@babel/template/node_modules/@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.1", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.1" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.1", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.1", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rollup/plugin-babel": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.0.3.tgz", - "integrity": "sha512-NlaPf4E6YFxeOCbqc+A2PTkB1BSy3rfKu6EJuQ1MGhMHpTVvMqKi6Rf0DlwtnEsTNK9LueUgsGEgp5Occ4KDVA==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.7.4", - "@rollup/pluginutils": "^3.0.8" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.0.1.tgz", - "integrity": "sha512-KIeAmueDDaYMqMBnUngLVVZhURwxA12nq/YB6nGm5/JpVyOMwI1fCVU3oL/dAnnLBG7oiPXntO5LHOiMrfNXCA==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.0.8", - "@types/resolve": "0.0.8", - "builtin-modules": "^3.1.0", - "deep-freeze": "^0.0.1", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.14.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, - "node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "node_modules/@types/glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "14.0.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.13.tgz", - "integrity": "sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA==", - "dev": true - }, - "node_modules/@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", - "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/experimental-utils": "2.34.0", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^2.0.0", - "eslint": "^5.0.0 || ^6.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", - "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", - "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", - "dev": true, - "dependencies": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.34.0", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", - "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": "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/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "node_modules/binaryextensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz", - "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==", - "dev": true, - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "node_modules/builtin-modules": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", - "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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/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/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "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/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/deep-freeze": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz", - "integrity": "sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ=", - "dev": true - }, - "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dir-glob/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/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/editions": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/editions/-/editions-2.3.1.tgz", - "integrity": "sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA==", - "dev": true, - "dependencies": { - "errlop": "^2.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "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/errlop": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/errlop/-/errlop-2.2.0.tgz", - "integrity": "sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==", - "dev": true, - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", - "dependencies": { - "stackframe": "^1.1.1" - } - }, - "node_modules/es6-promisify": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz", - "integrity": "sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==", - "dev": true - }, - "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": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz", - "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "eslint": ">=5.0.0", - "prettier": ">=1.13.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true, - "engines": { - "node": ">=6.5.0" - } - }, - "node_modules/espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", - "dev": true, - "dependencies": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", - "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", - "dev": true, - "dependencies": { - "estraverse": "^4.0.0" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "dependencies": { - "estraverse": "^4.1.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-glob/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-glob/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-glob/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/fast-glob/node_modules/micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-glob/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fastq": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", - "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "dependencies": { - "flat-cache": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "dependencies": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", - "dev": true, - "dependencies": { - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/globby/node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "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/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/inquirer/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/inquirer/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/inquirer/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/inquirer/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/inquirer/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/inquirer/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/inquirer/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/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/istextorbinary": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.6.0.tgz", - "integrity": "sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA==", - "dev": true, - "dependencies": { - "binaryextensions": "^2.1.2", - "editions": "^2.2.0", - "textextensions": "^2.5.0" - }, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/jest-worker": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", - "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", - "dev": true, - "dependencies": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-worker/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/jest-worker/node_modules/supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "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/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/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "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/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "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/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", - "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/replace-in-files": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/replace-in-files/-/replace-in-files-2.0.3.tgz", - "integrity": "sha512-wm9kg+WhKQ10CFaCS9jvUtgw9JnaPilm4TqSRq57H06v5EgX7hTrr/qwgyvq3G+IeNhmr6VTW84LvfnpZfq5/g==", - "dev": true, - "dependencies": { - "co": "^4.6.0", - "es6-promisify": "^6.0.2", - "globby": "^10.0.1", - "istextorbinary": "^2.5.1", - "lodash": "^4.17.15" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/rollup": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.17.0.tgz", - "integrity": "sha512-4Um68vKyyTLzT+EWClgc+nyxSlunlmx8wgCO16RDicwxvccnyBHguoNqxPaJL/YPAdvuAJkqaFPf/BfDojzEZA==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.2" - } - }, - "node_modules/rollup-plugin-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-6.1.0.tgz", - "integrity": "sha512-4fB3M9nuoWxrwm39habpd4hvrbrde2W2GG4zEGPQg1YITNkM3Tqur5jSuXlWNzbv/2aMLJ+dZJaySc3GCD8oDw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.8.3", - "jest-worker": "^26.0.0", - "serialize-javascript": "^3.0.0", - "terser": "^4.7.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" - } - }, - "node_modules/rollup/node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/serialize-javascript": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", - "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" - }, - "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/string-width/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-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/table/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/table/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/terser/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/textextensions": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.6.0.tgz", - "integrity": "sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==", - "dev": true, - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "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/typescript": { - "version": "4.6.0-dev.20211126", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.0-dev.20211126.tgz", - "integrity": "sha512-m+LKstqVv6FYW363aIbO6bm8awsLbeSUCzU6FxPtzUF/WJkFieQfYmdVwEIzigeTpw4E2GETBXnk6P6AixcQJQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", - "dev": true - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=4" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.2.tgz", - "integrity": "sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.2", - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helpers": "^7.10.1", - "@babel/parser": "^7.10.2", - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.2", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.1" - } - }, - "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.1", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", - "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", - "dev": true, - "requires": { - "@babel/types": "^7.10.2", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", - "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", - "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-module-transforms": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", - "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1", - "@babel/helper-simple-access": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1", - "lodash": "^4.17.13" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", - "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", - "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", - "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", - "dev": true, - "requires": { - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", - "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz", - "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==", - "dev": true, - "requires": { - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", - "dev": true - }, - "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.1" - } - }, - "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.1", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - } - } - }, - "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.1" - } - }, - "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.1", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.1", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - } - }, - "@rollup/plugin-babel": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.0.3.tgz", - "integrity": "sha512-NlaPf4E6YFxeOCbqc+A2PTkB1BSy3rfKu6EJuQ1MGhMHpTVvMqKi6Rf0DlwtnEsTNK9LueUgsGEgp5Occ4KDVA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.7.4", - "@rollup/pluginutils": "^3.0.8" - } - }, - "@rollup/plugin-node-resolve": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.0.1.tgz", - "integrity": "sha512-KIeAmueDDaYMqMBnUngLVVZhURwxA12nq/YB6nGm5/JpVyOMwI1fCVU3oL/dAnnLBG7oiPXntO5LHOiMrfNXCA==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.0.8", - "@types/resolve": "0.0.8", - "builtin-modules": "^3.1.0", - "deep-freeze": "^0.0.1", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.14.2" - } - }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - } - }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "@types/glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "14.0.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.13.tgz", - "integrity": "sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA==", - "dev": true - }, - "@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", - "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "2.34.0", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", - "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - } - } - }, - "@typescript-eslint/parser": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", - "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", - "dev": true, - "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.34.0", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", - "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "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 - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "binaryextensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz", - "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "builtin-modules": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", - "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", - "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-freeze": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz", - "integrity": "sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - }, - "dependencies": { - "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 - } - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "editions": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/editions/-/editions-2.3.1.tgz", - "integrity": "sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA==", - "dev": true, - "requires": { - "errlop": "^2.0.0", - "semver": "^6.3.0" - } - }, - "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 - }, - "errlop": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/errlop/-/errlop-2.2.0.tgz", - "integrity": "sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==", - "dev": true - }, - "error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", - "requires": { - "stackframe": "^1.1.1" - } - }, - "es6-promisify": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz", - "integrity": "sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - } - } - }, - "eslint-plugin-prettier": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz", - "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - }, - "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", - "dev": true, - "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", - "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", - "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "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, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "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 - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "istextorbinary": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.6.0.tgz", - "integrity": "sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA==", - "dev": true, - "requires": { - "binaryextensions": "^2.1.2", - "editions": "^2.2.0", - "textextensions": "^2.5.0" - } - }, - "jest-worker": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", - "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "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 - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "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 - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "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 - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "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 - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "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, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "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 - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prettier": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", - "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true - }, - "replace-in-files": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/replace-in-files/-/replace-in-files-2.0.3.tgz", - "integrity": "sha512-wm9kg+WhKQ10CFaCS9jvUtgw9JnaPilm4TqSRq57H06v5EgX7hTrr/qwgyvq3G+IeNhmr6VTW84LvfnpZfq5/g==", - "dev": true, - "requires": { - "co": "^4.6.0", - "es6-promisify": "^6.0.2", - "globby": "^10.0.1", - "istextorbinary": "^2.5.1", - "lodash": "^4.17.15" - } - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "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 - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.17.0.tgz", - "integrity": "sha512-4Um68vKyyTLzT+EWClgc+nyxSlunlmx8wgCO16RDicwxvccnyBHguoNqxPaJL/YPAdvuAJkqaFPf/BfDojzEZA==", - "dev": true, - "requires": { - "fsevents": "~2.1.2" - }, - "dependencies": { - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - } - } - }, - "rollup-plugin-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-6.1.0.tgz", - "integrity": "sha512-4fB3M9nuoWxrwm39habpd4hvrbrde2W2GG4zEGPQg1YITNkM3Tqur5jSuXlWNzbv/2aMLJ+dZJaySc3GCD8oDw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "jest-worker": "^26.0.0", - "serialize-javascript": "^3.0.0", - "terser": "^4.7.0" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "serialize-javascript": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", - "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" - }, - "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, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "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, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - } - } - }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "textextensions": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.6.0.tgz", - "integrity": "sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "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 - }, - "typescript": { - "version": "4.6.0-dev.20211126", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.0-dev.20211126.tgz", - "integrity": "sha512-m+LKstqVv6FYW363aIbO6bm8awsLbeSUCzU6FxPtzUF/WJkFieQfYmdVwEIzigeTpw4E2GETBXnk6P6AixcQJQ==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - } - } -} From bda652ccab05eed952e9d0424f2f97331856ed37 Mon Sep 17 00:00:00 2001 From: rjshrjndrn Date: Wed, 18 May 2022 14:02:27 +0200 Subject: [PATCH 179/260] fix(helm): service name Signed-off-by: rjshrjndrn --- scripts/helmcharts/openreplay/charts/integrations/values.yaml | 2 +- scripts/helmcharts/openreplay/charts/peers/values.yaml | 2 +- scripts/helmcharts/openreplay/charts/sink/values.yaml | 2 +- scripts/helmcharts/openreplay/charts/storage/values.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/helmcharts/openreplay/charts/integrations/values.yaml b/scripts/helmcharts/openreplay/charts/integrations/values.yaml index cbe9f301a..f7420e694 100644 --- a/scripts/helmcharts/openreplay/charts/integrations/values.yaml +++ b/scripts/helmcharts/openreplay/charts/integrations/values.yaml @@ -12,7 +12,7 @@ image: imagePullSecrets: [] nameOverride: "integrations" -fullnameOverride: "integrations" +fullnameOverride: "integrations-openreplay" serviceAccount: # Specifies whether a service account should be created diff --git a/scripts/helmcharts/openreplay/charts/peers/values.yaml b/scripts/helmcharts/openreplay/charts/peers/values.yaml index ab74348fc..3dffa62e7 100644 --- a/scripts/helmcharts/openreplay/charts/peers/values.yaml +++ b/scripts/helmcharts/openreplay/charts/peers/values.yaml @@ -12,7 +12,7 @@ image: imagePullSecrets: [] nameOverride: "peers" -fullnameOverride: "peers" +fullnameOverride: "peers-openreplay" serviceAccount: # Specifies whether a service account should be created diff --git a/scripts/helmcharts/openreplay/charts/sink/values.yaml b/scripts/helmcharts/openreplay/charts/sink/values.yaml index 26ef4367e..508670e42 100644 --- a/scripts/helmcharts/openreplay/charts/sink/values.yaml +++ b/scripts/helmcharts/openreplay/charts/sink/values.yaml @@ -12,7 +12,7 @@ image: imagePullSecrets: [] nameOverride: "sink" -fullnameOverride: "sink" +fullnameOverride: "sink-openreplay" serviceAccount: # Specifies whether a service account should be created diff --git a/scripts/helmcharts/openreplay/charts/storage/values.yaml b/scripts/helmcharts/openreplay/charts/storage/values.yaml index d82614693..2dbd9cd6e 100644 --- a/scripts/helmcharts/openreplay/charts/storage/values.yaml +++ b/scripts/helmcharts/openreplay/charts/storage/values.yaml @@ -12,7 +12,7 @@ image: imagePullSecrets: [] nameOverride: "storage" -fullnameOverride: "storage" +fullnameOverride: "storage-openreplay" serviceAccount: # Specifies whether a service account should be created From bd6dba47810d6d0f5af3f0e0476babf236ce794e Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Wed, 18 May 2022 14:50:56 +0200 Subject: [PATCH 180/260] fix(tracker-assisst): ConfirmWindow: override default button style & separate defaults --- tracker/tracker-assist/README.md | 129 ++++++++++++------ tracker/tracker-assist/package.json | 2 +- tracker/tracker-assist/src/Assist.ts | 7 +- .../src/{ => ConfirmWindow}/ConfirmWindow.ts | 68 ++------- .../src/ConfirmWindow/defaults.ts | 42 ++++++ tracker/tracker-assist/src/RemoteControl.ts | 5 +- 6 files changed, 150 insertions(+), 103 deletions(-) rename tracker/tracker-assist/src/{ => ConfirmWindow}/ConfirmWindow.ts (68%) create mode 100644 tracker/tracker-assist/src/ConfirmWindow/defaults.ts diff --git a/tracker/tracker-assist/README.md b/tracker/tracker-assist/README.md index 0c7bfe00f..4897477b3 100644 --- a/tracker/tracker-assist/README.md +++ b/tracker/tracker-assist/README.md @@ -1,86 +1,131 @@ -# OpenReplay Tracker Assist plugin +# OpenReplay Assist -Tracker plugin for WebRTC video support at your site. +OpenReplay Assist Plugin allows you to support your users by seeing their live screen and instantly hopping on call (WebRTC) with them without requiring any 3rd-party screen sharing software. ## Installation ```bash npm i @openreplay/tracker-assist ``` +OR +```bash +yarn add @openreplay/tracker-assist +``` ## Usage -Initialize the `@openreplay/tracker` package as usual and load the plugin into it. +### With NPM + +Initialize the tracker then load the `@openreplay/tracker-assist` plugin. + +#### If your website is a Single Page Application (SPA) ```js import Tracker from '@openreplay/tracker'; import trackerAssist from '@openreplay/tracker-assist'; const tracker = new Tracker({ - projectKey: YOUR_PROJECT_KEY, + projectKey: PROJECT_KEY, }); +tracker.use(trackerAssist(options)); // check the list of available options below + tracker.start(); -tracker.use(trackerAssist()); ``` -Options: +#### If your web app is Server-Side-Rendered (SSR) -```ts -{ - confirmText: string, - confirmStyle: Object, - config: RTCConfiguration, - onAgentConnect: () => (()=>void | void), - onCallStart: () => (()=>void | void), +Follow the below example if your app is SSR. Ensure `tracker.start()` is called once the app is started (in `useEffect` or `componentDidMount`). + +```js +import OpenReplay from '@openreplay/tracker/cjs'; +import trackerFetch from '@openreplay/tracker-assist/cjs'; + +const tracker = new OpenReplay({ + projectKey: PROJECT_KEY +}); +tracker.use(trackerAssist(options)); // check the list of available options below + +//... +function MyApp() { + useEffect(() => { // use componentDidMount in case of React Class Component + tracker.start(); + }, []) +//... } ``` -Use `confirmText` option to specify a text in the call confirmation popup. -You can specify its styles as well with `confirmStyle` style object. -```ts -{ - background: "#555" - color: "orange" -} +#### Options +```js +trackerAssist({ + callConfirm?: string|ConfirmOptions; + controlConfirm?: string|ConfirmOptions; + config?: object; + onAgentConnect?: () => (()=>void | void); + onCallStart?: () => (()=>void | void); + onRemoteControlStart?: () => (()=>void | void); +}) ``` -It is possible to pass `config` RTCConfiguration object in order to configure TURN server or other parameters. -```ts -config: { - iceServers: [{ - urls: "stun:stun.services.mozilla.com", - username: "louis@mozilla.com", - credential: "webrtcdemo" - }, { - urls: ["stun:stun.example.com", "stun:stun-1.example.com"] - }] +```js +type ConfirmOptions = { + text?:string, + style?: StyleObject, // style object (i.e {color: 'red', borderRadius: '10px'}) + confirmBtn?: ButtonOptions, + declineBtn?: ButtonOptions } +type ButtonOptions = HTMLButtonElement | string | { + innerHTML?: string, // to pass an svg string or text + style?: StyleObject, // style object (i.e {color: 'red', borderRadius: '10px'}) +} ``` -You can pass `onAgentConnect` callback. It will be called when someone from OpenReplay UI connects to the current live session. It can return another function. In this case, returned callback will be called when the same agent connection gets closed. -```ts -onAgentConnect: () => { - console.log("Hello!") - const onAgentDisconnect = () => console.log("Bye!") +- `callConfirm`: Customize the text and/or layout of the call request popup. +- `controlConfirm`: Customize the text and/or layout of the remote control request popup. +- `config`: Contains any custom ICE/TURN server configuration. Defaults to `{ 'iceServers': [{ 'urls': 'stun:stun.l.google.com:19302' }], 'sdpSemantics': 'unified-plan' }`. +- `onAgentConnect: () => (()=>void | void)`: This callback function is fired when someone from OpenReplay UI connects to the current live session. It can return another function. In this case, returned callback will be called when the same agent connection gets closed. + +```js +onAgentConnect = () => { + console.log("Live session started") + const onAgentDisconnect = () => console.log("Live session stopped") return onAgentDisconnect } - ``` -Warning: it is possible for the same agent to be connected/disconnected several times during one session due to a bad network. Several agents may connect simultaneously. +- `onCallStart: () => (()=>void | void)`: This callback function is fired as soon as a call (webRTC) starts. It can also return `onCallEnd` which will be called when the call ends. In case of an unstable connection, this may be called several times. Below is an example: -A callback `onCallStart` will be fired when the end-user accepts the call. It can return another callback that will be called on the call end. -```ts +```js onCallStart: () => { - console.log("Allo!") - const onCallEnd = () => console.log("short beeps...") + console.log("Call started") + const onCallEnd = () => console.log("Call ended") return onCallEnd } - ``` +- `onRemoteControlStart: () => (()=>void | void)`: This callback function is fired as soon as a remote control session starts. It can also return `onRemoteControlEnd` which will be called when the remote control permissions are revoked. Below is an example: +```js +onCallStart: () => { + console.log("Remote control started") + const onCallEnd = () => console.log("Remote control ended") + return onCallEnd +} +``` +## Troubleshooting + +### Critical dependency: the request of a dependency is an expression + +Please apply this [workaround](https://github.com/peers/peerjs/issues/630#issuecomment-910028230) if you face the below error when compiling: + +```log +Failed to compile. + +./node_modules/peerjs/dist/peerjs.min.js +Critical dependency: the request of a dependency is an expression +``` + +If you encounter any other issue, please connect to our [Slack](https://slack.openreplay.com) and get help from our community. diff --git a/tracker/tracker-assist/package.json b/tracker/tracker-assist/package.json index 437a86499..980082681 100644 --- a/tracker/tracker-assist/package.json +++ b/tracker/tracker-assist/package.json @@ -1,7 +1,7 @@ { "name": "@openreplay/tracker-assist", "description": "Tracker plugin for screen assistance through the WebRTC", - "version": "3.5.9", + "version": "3.5.10 ", "keywords": [ "WebRTC", "assistance", diff --git a/tracker/tracker-assist/src/Assist.ts b/tracker/tracker-assist/src/Assist.ts index ab64ab9b2..f4dff48c5 100644 --- a/tracker/tracker-assist/src/Assist.ts +++ b/tracker/tracker-assist/src/Assist.ts @@ -8,8 +8,9 @@ import RequestLocalStream from './LocalStream.js'; import RemoteControl from './RemoteControl.js'; import CallWindow from './CallWindow.js'; import AnnotationCanvas from './AnnotationCanvas.js'; -import ConfirmWindow, { callConfirmDefault, controlConfirmDefault } from './ConfirmWindow.js'; -import type { Options as ConfirmOptions } from './ConfirmWindow.js'; +import ConfirmWindow from './ConfirmWindow/ConfirmWindow.js'; +import { callConfirmDefault } from './ConfirmWindow/defaults.js'; +import type { Options as ConfirmOptions } from './ConfirmWindow/defaults.js'; // TODO: fully specified strict check (everywhere) @@ -231,7 +232,7 @@ export default class Assist { peerOptions['config'] = this.options.config } const peer = this.peer = new Peer(peerID, peerOptions); - app.debug.log('Peer created: ', peer) + // app.debug.log('Peer created: ', peer) peer.on('error', e => app.debug.warn("Peer error: ", e.type, e)) peer.on('disconnect', () => peer.reconnect()) peer.on('call', (call) => { diff --git a/tracker/tracker-assist/src/ConfirmWindow.ts b/tracker/tracker-assist/src/ConfirmWindow/ConfirmWindow.ts similarity index 68% rename from tracker/tracker-assist/src/ConfirmWindow.ts rename to tracker/tracker-assist/src/ConfirmWindow/ConfirmWindow.ts index 6cfabbca9..02d9dd9c6 100644 --- a/tracker/tracker-assist/src/ConfirmWindow.ts +++ b/tracker/tracker-assist/src/ConfirmWindow/ConfirmWindow.ts @@ -1,12 +1,6 @@ import type { Properties } from 'csstype'; -import { declineCall, acceptCall, cross, remoteControl } from './icons.js' - -const TEXT_GRANT_REMORTE_ACCESS = "Grant Remote Access"; -const TEXT_REJECT = "Reject"; -const TEXT_ANSWER_CALL = `${acceptCall}   Answer`; - -type ButtonOptions = +export type ButtonOptions = | HTMLButtonElement | string | { @@ -15,48 +9,15 @@ type ButtonOptions = }; // TODO: common strategy for InputOptions/defaultOptions merging -interface ConfirmWindowOptions { +export interface ConfirmWindowOptions { text: string; style?: Properties; confirmBtn: ButtonOptions; declineBtn: ButtonOptions; } -export type Options = string | Partial; -function confirmDefault( - opts: Options, - confirmBtn: ButtonOptions, - declineBtn: ButtonOptions, - text: string -): ConfirmWindowOptions { - const isStr = typeof opts === "string"; - return Object.assign( - { - text: isStr ? opts : text, - confirmBtn, - declineBtn - }, - isStr ? undefined : opts - ); -} - -export const callConfirmDefault = (opts: Options) => - confirmDefault( - opts, - TEXT_ANSWER_CALL, - TEXT_REJECT, - "You have an incoming call. Do you want to answer?" - ); -export const controlConfirmDefault = (opts: Options) => - confirmDefault( - opts, - TEXT_GRANT_REMORTE_ACCESS, - TEXT_REJECT, - "Allow remote control?" - ); - -function makeButton(options: ButtonOptions): HTMLButtonElement { +function makeButton(options: ButtonOptions, defaultStyle?: Properties): HTMLButtonElement { if (options instanceof HTMLButtonElement) { return options; } @@ -71,7 +32,7 @@ function makeButton(options: ButtonOptions): HTMLButtonElement { alignItems: "center", textTransform: "uppercase", marginRight: "10px" - }); + }, defaultStyle); if (typeof options === "string") { btn.innerHTML = options; } else { @@ -90,22 +51,19 @@ export default class ConfirmWindow { const p = document.createElement("p"); p.innerText = options.text; const buttons = document.createElement("div"); - const confirmBtn = makeButton(options.confirmBtn); - const declineBtn = makeButton(options.declineBtn); - buttons.appendChild(confirmBtn); - buttons.appendChild(declineBtn); - popup.appendChild(p); - popup.appendChild(buttons); - - Object.assign(confirmBtn.style, { + const confirmBtn = makeButton(options.confirmBtn, { background: "rgba(0, 167, 47, 1)", color: "white" - }); - - Object.assign(declineBtn.style, { + }) + const declineBtn = makeButton(options.declineBtn, { background: "#FFE9E9", color: "#CC0000" - }); + }) + buttons.appendChild(confirmBtn) + buttons.appendChild(declineBtn) + popup.appendChild(p) + popup.appendChild(buttons) + Object.assign(buttons.style, { marginTop: "10px", diff --git a/tracker/tracker-assist/src/ConfirmWindow/defaults.ts b/tracker/tracker-assist/src/ConfirmWindow/defaults.ts new file mode 100644 index 000000000..8f84cbe89 --- /dev/null +++ b/tracker/tracker-assist/src/ConfirmWindow/defaults.ts @@ -0,0 +1,42 @@ +import { declineCall, acceptCall, cross, remoteControl } from '../icons.js' +import type { ButtonOptions, ConfirmWindowOptions } from './ConfirmWindow.js' + + +const TEXT_GRANT_REMORTE_ACCESS = "Grant Remote Control"; +const TEXT_REJECT = "Reject"; +const TEXT_ANSWER_CALL = `${acceptCall}   Answer`; + +export type Options = string | Partial; + +function confirmDefault( + opts: Options, + confirmBtn: ButtonOptions, + declineBtn: ButtonOptions, + text: string +): ConfirmWindowOptions { + const isStr = typeof opts === "string"; + return Object.assign( + { + text: isStr ? opts : text, + confirmBtn, + declineBtn + }, + isStr ? undefined : opts + ); +} + +export const callConfirmDefault = (opts: Options) => + confirmDefault( + opts, + TEXT_ANSWER_CALL, + TEXT_REJECT, + "You have an incoming call. Do you want to answer?" + ) + +export const controlConfirmDefault = (opts: Options) => + confirmDefault( + opts, + TEXT_GRANT_REMORTE_ACCESS, + TEXT_REJECT, + "Agent requested remote control. Allow?" + ) diff --git a/tracker/tracker-assist/src/RemoteControl.ts b/tracker/tracker-assist/src/RemoteControl.ts index 02137d99f..d2903f9c4 100644 --- a/tracker/tracker-assist/src/RemoteControl.ts +++ b/tracker/tracker-assist/src/RemoteControl.ts @@ -1,6 +1,7 @@ import Mouse from './Mouse.js'; -import ConfirmWindow, { controlConfirmDefault } from './ConfirmWindow.js'; -import type { Options as AssistOptions } from './Assist' +import ConfirmWindow from './ConfirmWindow/ConfirmWindow.js'; +import { controlConfirmDefault } from './ConfirmWindow/defaults.js'; +import type { Options as AssistOptions } from './Assist'; enum RCStatus { Disabled, From 437341257c7c794965c37ff9eae264b0a5b394b8 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Wed, 18 May 2022 15:49:58 +0200 Subject: [PATCH 181/260] change(ui) - enable annotation without call --- .../AssistActions/AssistActions.tsx | 30 ++++++++----------- .../managers/AssistManager.ts | 2 +- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/frontend/app/components/Assist/components/AssistActions/AssistActions.tsx b/frontend/app/components/Assist/components/AssistActions/AssistActions.tsx index 88713a6ae..3ec1060cf 100644 --- a/frontend/app/components/Assist/components/AssistActions/AssistActions.tsx +++ b/frontend/app/components/Assist/components/AssistActions/AssistActions.tsx @@ -82,23 +82,19 @@ function AssistActions({ toggleChatWindow, userId, calling, annotating, peerConn return (
    - {onCall && ( - <> -
    - -
    -
    - - )} +
    + +
    +
    Date: Wed, 18 May 2022 16:01:18 +0200 Subject: [PATCH 182/260] feat(tracker-assist): annotation available on RemoteControl as well --- tracker/tracker-assist/src/Assist.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tracker/tracker-assist/src/Assist.ts b/tracker/tracker-assist/src/Assist.ts index f4dff48c5..c5bd43ea8 100644 --- a/tracker/tracker-assist/src/Assist.ts +++ b/tracker/tracker-assist/src/Assist.ts @@ -146,17 +146,24 @@ export default class Assist { socket.onAny((...args) => app.debug.log("Socket:", ...args)) + const remoteControl = new RemoteControl( this.options, id => { this.agents[id].onControlReleased = this.options.onRemoteControlStart() this.emit("control_granted", id) + annot = new AnnotationCanvas() + annot.mount() }, id => { const cb = this.agents[id].onControlReleased delete this.agents[id].onControlReleased typeof cb === "function" && cb() this.emit("control_rejected", id) + if (annot != null) { + annot.remove() + annot = null + } }, ) From f8bbc16208585af502242ecadea30bbad1b60bd6 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Wed, 18 May 2022 16:46:30 +0200 Subject: [PATCH 183/260] fix(frontend-player):apply set_input_value on blure if focused (for the case of remote controle) --- .../managers/AssistManager.ts | 4 +- .../MessageDistributor/managers/DOMManager.ts | 73 ++++++++++--------- 2 files changed, 39 insertions(+), 38 deletions(-) diff --git a/frontend/app/player/MessageDistributor/managers/AssistManager.ts b/frontend/app/player/MessageDistributor/managers/AssistManager.ts index d3d6f9570..d5de4da7f 100644 --- a/frontend/app/player/MessageDistributor/managers/AssistManager.ts +++ b/frontend/app/player/MessageDistributor/managers/AssistManager.ts @@ -251,8 +251,8 @@ export default class AssistManager { this.socket.emit("click", [ data.x, data.y ]); } - private toggleRemoteControl(newState: boolean){ - if (newState) { + private toggleRemoteControl(enable: boolean){ + if (enable) { this.md.overlay.addEventListener("mousemove", this.onMouseMove) this.md.overlay.addEventListener("click", this.onMouseClick) this.md.overlay.addEventListener("wheel", this.onWheel) diff --git a/frontend/app/player/MessageDistributor/managers/DOMManager.ts b/frontend/app/player/MessageDistributor/managers/DOMManager.ts index 685a34f2c..b698bf062 100644 --- a/frontend/app/player/MessageDistributor/managers/DOMManager.ts +++ b/frontend/app/player/MessageDistributor/managers/DOMManager.ts @@ -149,11 +149,11 @@ export default class DOMManager extends ListWalker { //this.screen.setDisconnected(false); this.stylesManager.reset(); - break; + return case "create_text_node": this.nl[ msg.id ] = document.createTextNode(''); this.insertNode(msg); - break; + return case "create_element_node": // console.log('elementnode', msg) if (msg.svg) { @@ -168,20 +168,20 @@ export default class DOMManager extends ListWalker { } this.removeBodyScroll(msg.id); this.removeAutocomplete(msg); - break; + return case "move_node": this.insertNode(msg); - break; + return case "remove_node": node = this.nl[ msg.id ] - if (!node) { logger.error("Node not found", msg); break; } - if (!node.parentElement) { logger.error("Parent node not found", msg); break; } + if (!node) { logger.error("Node not found", msg); return } + if (!node.parentElement) { logger.error("Parent node not found", msg); return } node.parentElement.removeChild(node); - break; + return case "set_node_attribute": let { id, name, value } = msg; node = this.nl[ id ]; - if (!node) { logger.error("Node not found", msg); break; } + if (!node) { logger.error("Node not found", msg); return } if (this.isLink[ id ] && name === "href") { // @ts-ignore TODO: global ENV type if (value.startsWith(window.ENV.ASSETS_HOST)) { // Hack for queries in rewrited urls @@ -198,43 +198,54 @@ export default class DOMManager extends ListWalker { logger.error(e, msg); } this.removeBodyScroll(msg.id); - break; + return case "remove_node_attribute": - if (!this.nl[ msg.id ]) { logger.error("Node not found", msg); break; } + if (!this.nl[ msg.id ]) { logger.error("Node not found", msg); return } try { (this.nl[ msg.id ] as HTMLElement).removeAttribute(msg.name); } catch(e) { logger.error(e, msg); } - break; + return case "set_input_value": - if (!this.nl[ msg.id ]) { logger.error("Node not found", msg); break; } - const val = msg.mask > 0 ? '*'.repeat(msg.mask) : msg.value; - (this.nl[ msg.id ] as HTMLInputElement).value = val; - break; + node = this.nl[ msg.id ] + if (!node) { logger.error("Node not found", msg); return } + if (!(node instanceof HTMLInputElement || node instanceof HTMLTextAreaElement)) { + logger.error("Trying to set value of non-Input element", msg) + return + } + const val = msg.mask > 0 ? '*'.repeat(msg.mask) : msg.value + doc = this.screen.document + if (doc && node === doc.activeElement) { + // For the case of Remote Control + node.onblur = () => { node.value = val } + return + } + node.value = val + return case "set_input_checked": node = this.nl[ msg.id ]; - if (!node) { logger.error("Node not found", msg); break; } + if (!node) { logger.error("Node not found", msg); return } (node as HTMLInputElement).checked = msg.checked; - break; + return case "set_node_data": case "set_css_data": node = this.nl[ msg.id ] - if (!node) { logger.error("Node not found", msg); break; } + if (!node) { logger.error("Node not found", msg); return } // @ts-ignore node.data = msg.data; if (node instanceof HTMLStyleElement) { doc = this.screen.document doc && rewriteNodeStyleSheet(doc, node) } - break; + return case "css_insert_rule": node = this.nl[ msg.id ]; - if (!node) { logger.error("Node not found", msg); break; } + if (!node) { logger.error("Node not found", msg); return } if (!(node instanceof HTMLStyleElement) // link or null || node.sheet == null) { logger.warn("Non-style node in CSS rules message (or sheet is null)", msg); - break; + return } try { node.sheet.insertRule(msg.rule, msg.index) @@ -246,21 +257,21 @@ export default class DOMManager extends ListWalker { logger.warn("Cannot insert rule.", e, msg) } } - break; + return case "css_delete_rule": node = this.nl[ msg.id ]; - if (!node) { logger.error("Node not found", msg); break; } + if (!node) { logger.error("Node not found", msg); return } if (!(node instanceof HTMLStyleElement) // link or null || node.sheet == null) { logger.warn("Non-style node in CSS rules message (or sheet is null)", msg); - break; + return } try { node.sheet.deleteRule(msg.index) } catch (e) { logger.warn(e, msg) } - break; + return case "create_i_frame_document": node = this.nl[ msg.frameID ]; // console.log('ifr', msg, node) @@ -282,17 +293,7 @@ export default class DOMManager extends ListWalker { } else { logger.warn("Context message host is not Element", msg) } - - break; - //not sure what to do with this one - //case "disconnected": - //setTimeout(() => { - // if last one - //if (this.msgs[ this.msgs.length - 1 ] === msg) { - // this.setDisconnected(true); - // } - //}, 10000); - //break; + return } } From 9294748352291614c898cdc86e5b5abad7ada1e2 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Wed, 18 May 2022 17:17:11 +0200 Subject: [PATCH 184/260] fix(frontend-assist): toggleAnnotation incapsulate + fix inverse booleans --- .../MessageDistributor/managers/AssistManager.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/frontend/app/player/MessageDistributor/managers/AssistManager.ts b/frontend/app/player/MessageDistributor/managers/AssistManager.ts index d5de4da7f..04fcc40d0 100644 --- a/frontend/app/player/MessageDistributor/managers/AssistManager.ts +++ b/frontend/app/player/MessageDistributor/managers/AssistManager.ts @@ -262,6 +262,7 @@ export default class AssistManager { this.md.overlay.removeEventListener("click", this.onMouseClick) this.md.overlay.removeEventListener("wheel", this.onWheel) update({ remoteControl: RemoteControlStatus.Disabled }) + this.toggleAnnotation(false) } } @@ -335,10 +336,9 @@ export default class AssistManager { private handleCallEnd() { this.callArgs && this.callArgs.onCallEnd() this.callConnection && this.callConnection.close() - update({ calling: CallingState.NoCall, annotating: false }) + update({ calling: CallingState.NoCall }) this.callArgs = null - this.annot?.remove() - this.annot = null + this.toggleAnnotation(false) } private initiateCallEnd = () => { @@ -352,6 +352,7 @@ export default class AssistManager { this.callConnection && this.callConnection.close() update({ calling: CallingState.NoCall }) this.callArgs = null + this.toggleAnnotation(false) } else { this.handleCallEnd() } @@ -389,7 +390,7 @@ export default class AssistManager { if (typeof enable !== "boolean") { enable = !!getState().annotating } - if (!enable && !this.annot) { + if (enable && !this.annot) { const annot = this.annot = new AnnotationCanvas() annot.mount(this.md.overlay) annot.canvas.addEventListener("mousedown", e => { @@ -416,7 +417,7 @@ export default class AssistManager { this.socket.emit("moveAnnotation", [ data.x, data.y ]) }) update({ annotating: true }) - } else if (enable && !!this.annot) { + } else if (!enable && !!this.annot) { this.annot.remove() this.annot = null update({ annotating: false }) From dce918972f8dcd7d82ab186e81369dd2815cf3f8 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Wed, 18 May 2022 17:27:11 +0200 Subject: [PATCH 185/260] change(ui) - enable annotation on call or remote --- .../AssistActions/AssistActions.tsx | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/frontend/app/components/Assist/components/AssistActions/AssistActions.tsx b/frontend/app/components/Assist/components/AssistActions/AssistActions.tsx index 3ec1060cf..2ea90b143 100644 --- a/frontend/app/components/Assist/components/AssistActions/AssistActions.tsx +++ b/frontend/app/components/Assist/components/AssistActions/AssistActions.tsx @@ -82,19 +82,23 @@ function AssistActions({ toggleChatWindow, userId, calling, annotating, peerConn return (
    -
    - -
    -
    + {(onCall || remoteActive) && ( + <> +
    toggleAnnotation(!annotating) } + role="button" + > + +
    +
    + + )}
    Date: Wed, 18 May 2022 17:29:17 +0200 Subject: [PATCH 186/260] fix(player): take into account first message time --- frontend/app/player/MessageDistributor/MessageDistributor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/app/player/MessageDistributor/MessageDistributor.ts b/frontend/app/player/MessageDistributor/MessageDistributor.ts index 653b05f54..b6f0037f1 100644 --- a/frontend/app/player/MessageDistributor/MessageDistributor.ts +++ b/frontend/app/player/MessageDistributor/MessageDistributor.ts @@ -457,7 +457,7 @@ export default class MessageDistributor extends StatedScreen { } getFirstMessageTime(): number { - return 0; //this.pagesManager.minTime; + return this.pagesManager.minTime; } // TODO: clean managers? From 84b99616bd7cfb24b96f0b9b4d5403c1710fd6d9 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Wed, 18 May 2022 17:43:31 +0200 Subject: [PATCH 187/260] chore(tracker-assist): fix package number string --- tracker/tracker-assist/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracker/tracker-assist/package.json b/tracker/tracker-assist/package.json index 980082681..ad080d92f 100644 --- a/tracker/tracker-assist/package.json +++ b/tracker/tracker-assist/package.json @@ -1,7 +1,7 @@ { "name": "@openreplay/tracker-assist", "description": "Tracker plugin for screen assistance through the WebRTC", - "version": "3.5.10 ", + "version": "3.5.10", "keywords": [ "WebRTC", "assistance", From e8f7e2e9bef3ff6762710247e42a5c2f09465100 Mon Sep 17 00:00:00 2001 From: sylenien Date: Wed, 18 May 2022 13:04:56 +0200 Subject: [PATCH 188/260] feat(ui): make edit metric title hoverable and clickable, create plain text button for future usage --- .../components/WidgetName/WidgetName.tsx | 11 ++++++----- .../components/WidgetName/widgetName.css | 4 ++++ .../components/WidgetView/WidgetView.tsx | 9 ++++++++- .../components/WidgetView/widgetView.css | 14 ++++++++++++++ frontend/app/components/ui/Button/Button.js | 2 ++ frontend/app/components/ui/Button/button.css | 18 +++++++++++++++++- 6 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 frontend/app/components/Dashboard/components/WidgetName/widgetName.css create mode 100644 frontend/app/components/Dashboard/components/WidgetView/widgetView.css diff --git a/frontend/app/components/Dashboard/components/WidgetName/WidgetName.tsx b/frontend/app/components/Dashboard/components/WidgetName/WidgetName.tsx index 09e3b66b3..57fdcbadd 100644 --- a/frontend/app/components/Dashboard/components/WidgetName/WidgetName.tsx +++ b/frontend/app/components/Dashboard/components/WidgetName/WidgetName.tsx @@ -1,5 +1,7 @@ import React, { useState, useRef, useEffect } from 'react'; +import cn from 'classnames'; import { Icon } from 'UI'; +import stl from './widgetName.css' interface Props { name: string; @@ -31,17 +33,17 @@ function WidgetName(props: Props) { useEffect(() => { setName(props.name) }, [props.name]) - + // const { name } = props; + return (
    { editing ? ( setEditing(true)} @@ -49,10 +51,9 @@ function WidgetName(props: Props) { ) : (
    { name }
    )} - { canEdit &&
    setEditing(true)}>
    }
    ); } -export default WidgetName; \ No newline at end of file +export default WidgetName; diff --git a/frontend/app/components/Dashboard/components/WidgetName/widgetName.css b/frontend/app/components/Dashboard/components/WidgetName/widgetName.css new file mode 100644 index 000000000..f52459368 --- /dev/null +++ b/frontend/app/components/Dashboard/components/WidgetName/widgetName.css @@ -0,0 +1,4 @@ +.input { + padding: 5px 9px; + height: 32px!important; +} diff --git a/frontend/app/components/Dashboard/components/WidgetView/WidgetView.tsx b/frontend/app/components/Dashboard/components/WidgetView/WidgetView.tsx index 7cb96634b..9f346a315 100644 --- a/frontend/app/components/Dashboard/components/WidgetView/WidgetView.tsx +++ b/frontend/app/components/Dashboard/components/WidgetView/WidgetView.tsx @@ -1,5 +1,6 @@ import React, { useState } from 'react'; import { useStore } from 'App/mstore'; +import cn from 'classnames' import { Icon, BackLink, Loader } from 'UI'; import WidgetForm from '../WidgetForm'; import WidgetPreview from '../WidgetPreview'; @@ -7,6 +8,7 @@ import WidgetSessions from '../WidgetSessions'; import { useObserver } from 'mobx-react-lite'; import { withSiteId } from 'App/routes'; import WidgetName from '../WidgetName'; +import stl from './widgetView.css'; interface Props { history: any; @@ -36,12 +38,17 @@ function WidgetView(props: Props) { } } + const openEdit = () => { + if (expanded) return; + setExpanded(true) + } + return useObserver(() => (
    -
    +

    ( } + {isDashboardExists && }

    - { !dashboard.exists() && ( + { !isDashboardExists && ( <>

    Create new dashboard by choosing from the range of predefined metrics that you care about. You can always add your custom metrics later.

    )} - +
    {selectedWidgetsCount} Metrics
    From 69002865d6ca7e5afb627f56b68955644efc0210 Mon Sep 17 00:00:00 2001 From: sylenien Date: Wed, 18 May 2022 14:14:33 +0200 Subject: [PATCH 191/260] fix(ui): remove unnecessary code --- .../components/Dashboard/components/WidgetName/WidgetName.tsx | 4 +--- .../components/Dashboard/components/WidgetName/widgetName.css | 4 ---- 2 files changed, 1 insertion(+), 7 deletions(-) delete mode 100644 frontend/app/components/Dashboard/components/WidgetName/widgetName.css diff --git a/frontend/app/components/Dashboard/components/WidgetName/WidgetName.tsx b/frontend/app/components/Dashboard/components/WidgetName/WidgetName.tsx index 57fdcbadd..3e8396ab7 100644 --- a/frontend/app/components/Dashboard/components/WidgetName/WidgetName.tsx +++ b/frontend/app/components/Dashboard/components/WidgetName/WidgetName.tsx @@ -1,7 +1,5 @@ import React, { useState, useRef, useEffect } from 'react'; -import cn from 'classnames'; import { Icon } from 'UI'; -import stl from './widgetName.css' interface Props { name: string; @@ -42,7 +40,7 @@ function WidgetName(props: Props) { Date: Wed, 18 May 2022 15:27:15 +0200 Subject: [PATCH 192/260] feat(ui): move create metric button to the grid --- .../DashboardMetricSelection.tsx | 28 +++++++++++++-- .../dashboardMetricSelection.css | 11 ++++++ .../DashboardModal/DashboardModal.tsx | 6 ++-- .../DashboardView/DashboardView.tsx | 34 ++++++++++++++----- .../components/WidgetView/WidgetView.tsx | 6 +--- 5 files changed, 66 insertions(+), 19 deletions(-) create mode 100644 frontend/app/components/Dashboard/components/DashboardMetricSelection/dashboardMetricSelection.css diff --git a/frontend/app/components/Dashboard/components/DashboardMetricSelection/DashboardMetricSelection.tsx b/frontend/app/components/Dashboard/components/DashboardMetricSelection/DashboardMetricSelection.tsx index fcdf37429..a9858102c 100644 --- a/frontend/app/components/Dashboard/components/DashboardMetricSelection/DashboardMetricSelection.tsx +++ b/frontend/app/components/Dashboard/components/DashboardMetricSelection/DashboardMetricSelection.tsx @@ -3,6 +3,8 @@ import WidgetWrapper from '../WidgetWrapper'; import { useObserver } from 'mobx-react-lite'; import cn from 'classnames'; import { useStore } from 'App/mstore'; +import stl from 'App/components/Dashboard/components/WidgetWrapper/widgetWrapper.css'; +import ownStl from './dashboardMetricSelection.css'; function WidgetCategoryItem({ category, isSelected, onClick, selectedWidgetIds }) { const selectedCategoryWidgetsCount = useObserver(() => { @@ -24,7 +26,12 @@ function WidgetCategoryItem({ category, isSelected, onClick, selectedWidgetIds } ); } -function DashboardMetricSelection(props) { +interface IProps { + handleCreateNew?: () => void; + isDashboardExists?: boolean; +} + +function DashboardMetricSelection(props: IProps) { const { dashboardStore } = useStore(); let widgetCategories: any[] = useObserver(() => dashboardStore.widgetCategories); const [activeCategory, setActiveCategory] = React.useState(); @@ -67,8 +74,7 @@ function DashboardMetricSelection(props) { {activeCategory.widgets.length}
    -
    - Past 7 days data +
    diff --git a/frontend/app/components/Dashboard/components/DashboardMetricSelection/dashboardMetricSelection.css b/frontend/app/components/Dashboard/components/DashboardMetricSelection/dashboardMetricSelection.css new file mode 100644 index 000000000..d134a7512 --- /dev/null +++ b/frontend/app/components/Dashboard/components/DashboardMetricSelection/dashboardMetricSelection.css @@ -0,0 +1,11 @@ +.addNew { + text-align: center; + color: $teal; + cursor: pointer; + background-color: white; + + &:hover { + background-color: $active-blue; + transition: all 0.2s; + } +} diff --git a/frontend/app/components/Dashboard/components/DashboardModal/DashboardModal.tsx b/frontend/app/components/Dashboard/components/DashboardModal/DashboardModal.tsx index 5ffb1c1ca..b2f656475 100644 --- a/frontend/app/components/Dashboard/components/DashboardModal/DashboardModal.tsx +++ b/frontend/app/components/Dashboard/components/DashboardModal/DashboardModal.tsx @@ -12,6 +12,7 @@ interface Props { history: any siteId?: string dashboardId?: string + onMetricAdd?: () => void; } function DashboardModal(props) { const { history, siteId, dashboardId } = props; @@ -34,6 +35,7 @@ function DashboardModal(props) { const handleCreateNew = () => { const path = withSiteId(dashboardMetricCreate(dashboardId), siteId); + props.onMetricAdd(); history.push(path); hideModal(); } @@ -52,7 +54,7 @@ function DashboardModal(props) {
    - {isDashboardExists && } + Past 7 days data
    { !isDashboardExists && ( @@ -61,7 +63,7 @@ function DashboardModal(props) {

    Create new dashboard by choosing from the range of predefined metrics that you care about. You can always add your custom metrics later.

    )} - +
    )} {shownItems.map(item => ( -
    onClick(item, e)}> +
    onClick(item, e)}>
    {item.name}
    @@ -111,4 +111,4 @@ function SavedSearchModal(props: Props) { ) } -export default React.memo(connect(null, { applySavedSearch, remove, editSavedSearch })(SavedSearchModal)) +export default connect(state => ({ list: state.getIn([ 'search', 'list' ]) }), { applySavedSearch, remove, editSavedSearch })(SavedSearchModal) From af45af8bd0a28528b3d6ac664b41b082fa3573c5 Mon Sep 17 00:00:00 2001 From: sylenien Date: Fri, 20 May 2022 12:59:21 +0200 Subject: [PATCH 211/260] fix(ui): design review - dashboard metric selection --- .../DashboardMetricSelection/DashboardMetricSelection.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/app/components/Dashboard/components/DashboardMetricSelection/DashboardMetricSelection.tsx b/frontend/app/components/Dashboard/components/DashboardMetricSelection/DashboardMetricSelection.tsx index 969a3a575..1c4518d2a 100644 --- a/frontend/app/components/Dashboard/components/DashboardMetricSelection/DashboardMetricSelection.tsx +++ b/frontend/app/components/Dashboard/components/DashboardMetricSelection/DashboardMetricSelection.tsx @@ -11,7 +11,7 @@ function WidgetCategoryItem({ category, isSelected, onClick, selectedWidgetIds } }); return (
    onClick(category)} >
    {category.name}
    From 6a801a2026fc4c33f8a36f0b3e3646c87c83d70a Mon Sep 17 00:00:00 2001 From: sylenien Date: Fri, 20 May 2022 13:38:11 +0200 Subject: [PATCH 212/260] fix(ui): make menuitem configurable --- frontend/app/components/ui/ItemMenu/ItemMenu.js | 14 ++++++++++++-- frontend/app/components/ui/ItemMenu/itemMenu.css | 15 +++++++++++++-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/frontend/app/components/ui/ItemMenu/ItemMenu.js b/frontend/app/components/ui/ItemMenu/ItemMenu.js index b4b7170f7..cd1dff700 100644 --- a/frontend/app/components/ui/ItemMenu/ItemMenu.js +++ b/frontend/app/components/ui/ItemMenu/ItemMenu.js @@ -3,11 +3,21 @@ import styles from './itemMenu.css'; import OutsideClickDetectingDiv from 'Shared/OutsideClickDetectingDiv'; import cn from 'classnames'; import { Tooltip } from 'react-tippy'; + export default class ItemMenu extends React.PureComponent { state = { displayed: false, }; + handleEsc = (e) => e.key === 'Escape' && this.closeMenu() + + componentDidMount() { + document.addEventListener("keydown", this.handleEsc, false); + } + componentWillUnmount() { + document.removeEventListener("keydown", this.handleEsc, false); + } + onClick = callback => (e) => { e.stopPropagation(); callback(e); @@ -44,7 +54,7 @@ export default class ItemMenu extends React.PureComponent {
    { items.filter(({ hidden }) => !hidden).map(({ onClick, text, icon, disabled = false, disabledMessage = '' }) => ( @@ -63,7 +73,7 @@ export default class ItemMenu extends React.PureComponent { position="left" disabled={ !disabled } > -
    +
    { icon && (
    diff --git a/frontend/app/components/ui/ItemMenu/itemMenu.css b/frontend/app/components/ui/ItemMenu/itemMenu.css index f6095b8b3..8c892a8e1 100644 --- a/frontend/app/components/ui/ItemMenu/itemMenu.css +++ b/frontend/app/components/ui/ItemMenu/itemMenu.css @@ -23,6 +23,16 @@ background-color: #fff; } } + +.menuDim { + border: none!important; + box-shadow: 0 1px 3px 0 $gray-light!important; + + & .menuItem { + color: $gray-dark!important; + } +} + .menu { &[data-displayed=false] { display: none; @@ -36,7 +46,9 @@ min-width: 150px; background-color: $white; border-radius: 3px; - box-shadow: 0px 1px 3px 0 $gray-light; + border: 1px solid rgba(34,36,38,.15); + box-shadow: 0 2px 3px 0 rgb(34 36 38 / 15%); + & .menuItem { cursor: pointer; @@ -44,7 +56,6 @@ display: flex; align-items: center; border-bottom: 1px solid $gray-light; - color: $gray-dark; & .iconWrapper { width: 13px; From d4fa960fdf80628f6a2d8520bf0e801581e5e2da Mon Sep 17 00:00:00 2001 From: sylenien Date: Fri, 20 May 2022 13:40:48 +0200 Subject: [PATCH 213/260] fix(ui): make dashboardeditModal closable with esc --- .../components/DashboardEditModal/DashboardEditModal.tsx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/frontend/app/components/Dashboard/components/DashboardEditModal/DashboardEditModal.tsx b/frontend/app/components/Dashboard/components/DashboardEditModal/DashboardEditModal.tsx index b96a5c07f..889c9fe18 100644 --- a/frontend/app/components/Dashboard/components/DashboardEditModal/DashboardEditModal.tsx +++ b/frontend/app/components/Dashboard/components/DashboardEditModal/DashboardEditModal.tsx @@ -18,6 +18,14 @@ function DashboardEditModal(props: Props) { dashboardStore.save(dashboard).then(closeHandler); } + React.useEffect(() => { + const handleEsc = (e) => e.key === 'Escape' && closeHandler?.() + document.addEventListener("keydown", handleEsc, false); + return () => { + document.removeEventListener("keydown", handleEsc, false); + } + }, []) + const write = ({ target: { value, name } }) => dashboard.update({ [ name ]: value }) const writeOption = (e, { checked, name }) => { dashboard.update({ [name]: checked }); From 40ab7d1e41fccf207c7854232c19742179b02a02 Mon Sep 17 00:00:00 2001 From: sylenien Date: Fri, 20 May 2022 15:45:55 +0200 Subject: [PATCH 214/260] fix(ui): minor fixes for sesson settings --- .../components/shared/SessionSettings/SessionSettings.tsx | 6 +++--- .../shared/SessionSettings/components/CaptureRate.tsx | 2 +- .../shared/SessionSettings/components/DefaultTimezone.tsx | 2 +- frontend/app/components/ui/Toggler/toggler.css | 1 - frontend/app/mstore/settingsStore.ts | 4 ++-- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/frontend/app/components/shared/SessionSettings/SessionSettings.tsx b/frontend/app/components/shared/SessionSettings/SessionSettings.tsx index 409ede776..c35086f6a 100644 --- a/frontend/app/components/shared/SessionSettings/SessionSettings.tsx +++ b/frontend/app/components/shared/SessionSettings/SessionSettings.tsx @@ -10,10 +10,10 @@ import CaptureRate from './components/CaptureRate'; function SessionSettings(props) { return useObserver(() => (
    -
    +

    Sessions Settings

    - +
    @@ -33,4 +33,4 @@ function SessionSettings(props) { )); } -export default SessionSettings; \ No newline at end of file +export default SessionSettings; diff --git a/frontend/app/components/shared/SessionSettings/components/CaptureRate.tsx b/frontend/app/components/shared/SessionSettings/components/CaptureRate.tsx index a08d19b2b..04495d51e 100644 --- a/frontend/app/components/shared/SessionSettings/components/CaptureRate.tsx +++ b/frontend/app/components/shared/SessionSettings/components/CaptureRate.tsx @@ -36,7 +36,7 @@ function CaptureRate(props) { name="test" onChange={toggleRate} /> - 100% + 100%
    {!captureAll && (
    diff --git a/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx b/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx index 475ed7fa3..f36406820 100644 --- a/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx +++ b/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx @@ -64,7 +64,7 @@ function DefaultTimezone(props) { <>

    Default Timezone

    Session Time
    -
    +
    { {!isThreshold && (
    - writeOption(null , { name: 'change', value }) } id="change-dropdown" />
    @@ -134,29 +136,28 @@ const AlertForm = props => {
    - i.value === instance.query.left) } + // onChange={ writeQueryOption } + onChange={ ({ value }) => writeQueryOption(null, { name: 'left', value }) } />
    - writeQueryOption(null, { name: 'operator', value }) } /> { unit && ( { )} { !unit && ( + wrapperClassName="ml-2" + // className="pl-4" + name="right" + value={ instance.query.right } + onChange={ writeQuery } + placeholder="Specify Value" + /> )}
    - writeOption(null, { name: 'currentPeriod', value }) } />
    {!isThreshold && (
    - writeOption(null, { name: 'previousPeriod', value }) } />
    )} @@ -223,18 +225,17 @@ const AlertForm = props => {
    @@ -242,7 +243,7 @@ const AlertForm = props => { name="webhook" type="checkbox" checked={ instance.webhook } - onClick={ onChangeOption } + onClick={ onChangeCheck } label="Webhook" />
    @@ -300,7 +301,7 @@ const AlertForm = props => {
    diff --git a/frontend/app/components/Alerts/Notifications/ListItem/listItem.css b/frontend/app/components/Alerts/Notifications/ListItem/listItem.module.css similarity index 100% rename from frontend/app/components/Alerts/Notifications/ListItem/listItem.css rename to frontend/app/components/Alerts/Notifications/ListItem/listItem.module.css diff --git a/frontend/app/components/Alerts/Notifications/Notifications.js b/frontend/app/components/Alerts/Notifications/Notifications.js deleted file mode 100644 index b4dd055a0..000000000 --- a/frontend/app/components/Alerts/Notifications/Notifications.js +++ /dev/null @@ -1,147 +0,0 @@ -import React from 'react'; -import stl from './notifications.css'; -import ListItem from './ListItem'; -import { connect } from 'react-redux'; -import { Button, SlideModal, Icon, Popup, NoContent, SegmentSelection } from 'UI'; -import { fetchList, setViewed, setLastRead, clearAll } from 'Duck/notifications'; -import withToggle from 'Components/hocs/withToggle'; -import { withRouter } from 'react-router-dom'; -import { fetchList as fetchAlerts, init as initAlert } from 'Duck/alerts'; -import cn from 'classnames'; - -const AUTOREFRESH_INTERVAL = 5 * 60 * 1000; - -@withToggle('visible', 'toggleVisisble') -@withRouter -class Notifications extends React.Component { - state = { alertType: '' }; - - constructor(props) { - super(props); - // setTimeout(() => { - // props.fetchList(); - // }, 1000); - - setInterval(() => { - props.fetchList(); - }, AUTOREFRESH_INTERVAL); - } - - writeOption = (e, { name, value }) => this.setState({ [ name ]: value }); - - navigateToUrl = notification => { // TODO should be able to open the alert edit form - if (notification.options.source === 'ALERT') { - const { initAlert } = this.props; - this.props.fetchAlerts().then(function() { - const { alerts } = this.props; - const alert = alerts.find(i => i.alertId === notification.options.sourceId) - initAlert(alert.toJS()); - }.bind(this)); - } - } - - onClearAll = () => { - const { notifications } = this.props; - const firstItem = notifications.first(); - this.props.clearAll({ endTimestamp: firstItem.createdAt.ts }); - } - - onClear = notification => { - this.props.setViewed(notification.notificationId) - } - - toggleModal = () => { - this.props.toggleVisisble(!this.props.visible); - } - - render() { - const { notifications, visible, loading, clearing, clearingAll } = this.props; - const { alertType } = this.state; - const unReadNotificationsCount = notifications.filter(({viewed}) => !viewed).size - - const filteredList = alertType === '' ? - notifications : - notifications.filter(i => i.filterKey === alertType); - - return ( -
    - -
    - { unReadNotificationsCount } -
    - -
    - } - content={ `Alerts` } - size="tiny" - inverted - position="top center" - /> - -
    Alerts
    - { unReadNotificationsCount > 0 && ( -
    - -
    - )} -
    - } - right - isDisplayed={ visible } - onClose={ visible && this.toggleModal } - bgColor="white" - size="small" - content={ -
    - - { - filteredList.map(item => ( -
    - this.onClear(item)} - loading={clearing} - /> -
    - )) - } -
    -
    - } - /> -
    - ); - } -} - -export default connect(state => ({ - notifications: state.getIn(['notifications', 'list']), - loading: state.getIn(['notifications', 'fetchRequest', 'loading']), - clearing: state.getIn(['notifications', 'setViewed', 'loading']), - clearingAll: state.getIn(['notifications', 'clearAll', 'loading']), - alerts: state.getIn(['alerts', 'list']), -}), { fetchList, setLastRead, setViewed, clearAll, fetchAlerts, initAlert })(Notifications); \ No newline at end of file diff --git a/frontend/app/components/Alerts/Notifications/Notifications.tsx b/frontend/app/components/Alerts/Notifications/Notifications.tsx new file mode 100644 index 000000000..2b9645d77 --- /dev/null +++ b/frontend/app/components/Alerts/Notifications/Notifications.tsx @@ -0,0 +1,184 @@ +import React, { useEffect } from 'react'; +import stl from './notifications.module.css'; +import ListItem from './ListItem'; +import { connect } from 'react-redux'; +import { Button, SlideModal, Icon, Popup, NoContent } from 'UI'; +import { fetchList, setViewed, clearAll } from 'Duck/notifications'; +import { setLastRead } from 'Duck/announcements'; +import cn from 'classnames'; +import AnimatedSVG, { ICONS } from 'Shared/AnimatedSVG/AnimatedSVG'; +import { useModal } from 'App/components/Modal'; +import AlertTriggersModal from 'Shared/AlertTriggersModal'; + +const AUTOREFRESH_INTERVAL = 5 * 60 * 1000; + +// @withToggle('visible', 'toggleVisisble') +// @withRouter +// class Notifications extends React.Component { +// state = { alertType: '' }; + +// constructor(props) { +// super(props); +// // setTimeout(() => { +// // props.fetchList(); +// // }, 1000); + +// setInterval(() => { +// props.fetchList(); +// }, AUTOREFRESH_INTERVAL); +// } + +// writeOption = (e, { name, value }) => this.setState({ [ name ]: value }); + +// navigateToUrl = notification => { // TODO should be able to open the alert edit form +// if (notification.options.source === 'ALERT') { +// const { initAlert } = this.props; +// this.props.fetchAlerts().then(function() { +// const { alerts } = this.props; +// const alert = alerts.find(i => i.alertId === notification.options.sourceId) +// initAlert(alert.toJS()); +// }.bind(this)); +// } +// } + +// onClearAll = () => { +// const { notifications } = this.props; +// const firstItem = notifications.first(); +// this.props.clearAll({ endTimestamp: firstItem.createdAt.ts }); +// } + +// onClear = notification => { +// this.props.setViewed(notification.notificationId) +// } + +// toggleModal = () => { +// this.props.toggleVisisble(!this.props.visible); +// } + +// render() { +// const { notifications, visible, loading, clearing, clearingAll } = this.props; +// const { alertType } = this.state; +// const unReadNotificationsCount = notifications.filter(({viewed}) => !viewed).size + +// const filteredList = alertType === '' ? +// notifications : +// notifications.filter(i => i.filterKey === alertType); + +// return ( +//
    +// +//
    +//
    +// { unReadNotificationsCount } +//
    +// +//
    +//
    +// +//
    Alerts
    +// { unReadNotificationsCount > 0 && ( +//
    +// +//
    +// )} +//
    +// } +// right +// isDisplayed={ visible } +// onClose={ visible && this.toggleModal } +// bgColor="white" +// size="small" +// content={ +//
    +// +// +//
    +// } +// subtext="There are no alerts to show." +// show={ !loading && notifications.size === 0 } +// size="small" +// > +// { +// filteredList.map(item => ( +//
    +// this.onClear(item)} +// loading={clearing} +// /> +//
    +// )) +// } +// +//
    +// } +// /> +//
    +// ); +// } +// } + +// export default connect(state => ({ +// notifications: state.getIn(['notifications', 'list']), +// loading: state.getIn(['notifications', 'fetchRequest', 'loading']), +// clearing: state.getIn(['notifications', 'setViewed', 'loading']), +// clearingAll: state.getIn(['notifications', 'clearAll', 'loading']), +// alerts: state.getIn(['alerts', 'list']), +// }), { fetchList, setLastRead, setViewed, clearAll, fetchAlerts, initAlert })(Notifications); + +interface Props { + notifications: any; + fetchList: any; +} +function Notifications(props: Props) { + const { notifications } = props; + const { showModal } = useModal(); + const unReadNotificationsCount = notifications.filter(({viewed}: any) => !viewed).size + + useEffect(() => { + if (notifications.size === 0) { + props.fetchList(); + } + + const interval = setInterval(() => { + props.fetchList(); + }, AUTOREFRESH_INTERVAL); + + return () => clearInterval(interval); + }, []); + + return ( + +
    showModal(, { right: true }) }> +
    + { unReadNotificationsCount } +
    + +
    +
    + ); +} + +export default connect((state: any) => ({ + notifications: state.getIn(['notifications', 'list']), +}), { fetchList, setLastRead, setViewed, clearAll })(Notifications); \ No newline at end of file diff --git a/frontend/app/components/Alerts/Notifications/index.js b/frontend/app/components/Alerts/Notifications/index.ts similarity index 100% rename from frontend/app/components/Alerts/Notifications/index.js rename to frontend/app/components/Alerts/Notifications/index.ts diff --git a/frontend/app/components/Alerts/Notifications/notifications.css b/frontend/app/components/Alerts/Notifications/notifications.module.css similarity index 100% rename from frontend/app/components/Alerts/Notifications/notifications.css rename to frontend/app/components/Alerts/Notifications/notifications.module.css diff --git a/frontend/app/components/Alerts/alertForm.css b/frontend/app/components/Alerts/alertForm.module.css similarity index 100% rename from frontend/app/components/Alerts/alertForm.css rename to frontend/app/components/Alerts/alertForm.module.css diff --git a/frontend/app/components/Alerts/alertItem.css b/frontend/app/components/Alerts/alertItem.module.css similarity index 100% rename from frontend/app/components/Alerts/alertItem.css rename to frontend/app/components/Alerts/alertItem.module.css diff --git a/frontend/app/components/Alerts/alertTypeLabel.css b/frontend/app/components/Alerts/alertTypeLabel.module.css similarity index 100% rename from frontend/app/components/Alerts/alertTypeLabel.css rename to frontend/app/components/Alerts/alertTypeLabel.module.css diff --git a/frontend/app/components/Announcements/Announcements.js b/frontend/app/components/Announcements/Announcements.js index 6252e4d79..b61b62757 100644 --- a/frontend/app/components/Announcements/Announcements.js +++ b/frontend/app/components/Announcements/Announcements.js @@ -1,11 +1,12 @@ import React from 'react'; -import stl from './announcements.css'; +import stl from './announcements.module.css'; import ListItem from './ListItem'; import { connect } from 'react-redux'; import { SlideModal, Icon, NoContent, Popup } from 'UI'; import { fetchList, setLastRead } from 'Duck/announcements'; import withToggle from 'Components/hocs/withToggle'; import { withRouter } from 'react-router-dom'; +import AnimatedSVG, { ICONS } from 'Shared/AnimatedSVG/AnimatedSVG'; @withToggle('visible', 'toggleVisisble') @withRouter @@ -13,7 +14,7 @@ class Announcements extends React.Component { navigateToUrl = url => { if (url) { - if (url.startsWith(window.ENV.ORIGIN)) { + if (url.startsWith(window.env.ORIGIN)) { const { history } = this.props; var path = new URL(url).pathname if (path.includes('/metrics')) { @@ -44,20 +45,14 @@ class Announcements extends React.Component { return (
    - + +
    { unReadNotificationsCount }
    - } - content={ `Announcements` } - size="tiny" - inverted - position="top center" - /> +
    + +
    + } subtext="There are no announcements to show." - animatedIcon="no-results" + // animatedIcon="no-results" show={ !loading && announcements.size === 0 } size="small" > diff --git a/frontend/app/components/Announcements/ListItem/ListItem.js b/frontend/app/components/Announcements/ListItem/ListItem.js index 1c28cd135..dd777c719 100644 --- a/frontend/app/components/Announcements/ListItem/ListItem.js +++ b/frontend/app/components/Announcements/ListItem/ListItem.js @@ -1,6 +1,6 @@ import React from 'react'; import { Button, Label } from 'UI'; -import stl from './listItem.css'; +import stl from './listItem.module.css'; const ListItem = ({ announcement, onButtonClick }) => { return ( @@ -17,7 +17,7 @@ const ListItem = ({ announcement, onButtonClick }) => {
    {announcement.description}
    {announcement.buttonUrl &&
    - diff --git a/frontend/app/components/Assist/ChatWindow/ChatWindow.tsx b/frontend/app/components/Assist/ChatWindow/ChatWindow.tsx index b57f5ca35..8af2e0614 100644 --- a/frontend/app/components/Assist/ChatWindow/ChatWindow.tsx +++ b/frontend/app/components/Assist/ChatWindow/ChatWindow.tsx @@ -4,7 +4,7 @@ import VideoContainer from '../components/VideoContainer' import { Icon, Popup, Button } from 'UI' import cn from 'classnames' import Counter from 'App/components/shared/SessionItem/Counter' -import stl from './chatWindow.css' +import stl from './chatWindow.module.css' import ChatControls from '../ChatControls/ChatControls' import Draggable from 'react-draggable'; import type { LocalStream } from 'Player/MessageDistributor/managers/LocalStream'; diff --git a/frontend/app/components/Assist/ChatWindow/chatWindow.css b/frontend/app/components/Assist/ChatWindow/chatWindow.module.css similarity index 100% rename from frontend/app/components/Assist/ChatWindow/chatWindow.css rename to frontend/app/components/Assist/ChatWindow/chatWindow.module.css diff --git a/frontend/app/components/Assist/components/AssistActions/AassistActions.css b/frontend/app/components/Assist/components/AssistActions/AassistActions.module.css similarity index 100% rename from frontend/app/components/Assist/components/AssistActions/AassistActions.css rename to frontend/app/components/Assist/components/AssistActions/AassistActions.module.css diff --git a/frontend/app/components/Assist/components/AssistActions/AssistActions.tsx b/frontend/app/components/Assist/components/AssistActions/AssistActions.tsx index 2ea90b143..4b9c411b6 100644 --- a/frontend/app/components/Assist/components/AssistActions/AssistActions.tsx +++ b/frontend/app/components/Assist/components/AssistActions/AssistActions.tsx @@ -11,8 +11,8 @@ import RequestLocalStream from 'Player/MessageDistributor/managers/LocalStream'; import type { LocalStream } from 'Player/MessageDistributor/managers/LocalStream'; import { toast } from 'react-toastify'; -import { confirm } from 'UI/Confirmation'; -import stl from './AassistActions.css' +import { confirm } from 'UI'; +import stl from './AassistActions.module.css' function onClose(stream) { stream.getTracks().forEach(t=>t.stop()); @@ -114,25 +114,21 @@ function AssistActions({ toggleChatWindow, userId, calling, annotating, peerConn
    - -
    - } content={ cannotCall ? "You don’t have the permissions to perform this action." : `Call ${userId ? userId : 'User'}` } - size="tiny" - inverted - position="top right" - /> + > +
    + +
    +
    { onCall && callObject && } diff --git a/frontend/app/components/Assist/components/AssistTabs/AssistTabs.tsx b/frontend/app/components/Assist/components/AssistTabs/AssistTabs.tsx index 6bacc38fc..385ca2e19 100644 --- a/frontend/app/components/Assist/components/AssistTabs/AssistTabs.tsx +++ b/frontend/app/components/Assist/components/AssistTabs/AssistTabs.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from 'react'; import { SlideModal, Avatar, TextEllipsis, Icon } from 'UI'; import SessionList from '../SessionList'; -import stl from './assistTabs.css' +import stl from './assistTabs.module.css' interface Props { userId: any, diff --git a/frontend/app/components/Assist/components/AssistTabs/assistTabs.css b/frontend/app/components/Assist/components/AssistTabs/assistTabs.module.css similarity index 100% rename from frontend/app/components/Assist/components/AssistTabs/assistTabs.css rename to frontend/app/components/Assist/components/AssistTabs/assistTabs.module.css diff --git a/frontend/app/components/Assist/components/VideoContainer/VideoContainer.css b/frontend/app/components/Assist/components/VideoContainer/VideoContainer.module.css similarity index 100% rename from frontend/app/components/Assist/components/VideoContainer/VideoContainer.css rename to frontend/app/components/Assist/components/VideoContainer/VideoContainer.module.css diff --git a/frontend/app/components/BugFinder/AlertManager/AlertForm.js b/frontend/app/components/BugFinder/AlertManager/AlertForm.js deleted file mode 100644 index 26da182ab..000000000 --- a/frontend/app/components/BugFinder/AlertManager/AlertForm.js +++ /dev/null @@ -1,73 +0,0 @@ -import React from 'react'; -import { Input, Dropdown, Button } from 'UI'; -import styles from './alertForm.css'; - -const periodOptions = [ - { - text: '1 Week', - value: 'week', - }, - { - text: '1 Month', - value: 'month', - }, -]; - -const AlertForm = ({ - alert, write, onSave, loading, onCancel = null, -}) => ( -
    -
    -

    {'Title'}

    - -
    - -
    -

    {'Threshold'}

    - -
    - -
    -

    {'For Next'}

    - -
    - -
    -); - -export default AlertForm; diff --git a/frontend/app/components/BugFinder/AlertManager/AlertManager.js b/frontend/app/components/BugFinder/AlertManager/AlertManager.js deleted file mode 100644 index 207405e32..000000000 --- a/frontend/app/components/BugFinder/AlertManager/AlertManager.js +++ /dev/null @@ -1,57 +0,0 @@ -import { connect } from 'react-redux'; -import { Icon, SlideModal } from 'UI'; -import withToggle from 'HOCs/withToggle'; -import { save, edit } from 'Duck/alerts'; - -import styles from './alertManager.css'; -import AlertForm from './AlertForm'; - -@connect(state => ({ - alert: state.getIn([ 'alerts', 'instance' ]), - loading: state.getIn([ 'alerts', 'saveRequest', 'loading' ]), - filter: state.getIn([ 'filters', 'appliedFilter' ]), -}), { - save, - edit, -}) -@withToggle('isModalDisplayed', 'toggleModal') -export default class AlertManager extends React.PureComponent { - write = (e, { name, value }) => { - this.props.edit({ [ name ]: value }); - } - - save = () => { - const { toggleModal, alert, filter } = this.props; - this.props.save(alert.set('filter', filter)) - .then(toggleModal); - } - - render() { - const { - isModalDisplayed, alert, toggleModal, loading, - } = this.props; - return ( - -
    - -
    - - -
    - } - /> - - ); - } -} diff --git a/frontend/app/components/BugFinder/AlertManager/alertForm.css b/frontend/app/components/BugFinder/AlertManager/alertForm.css deleted file mode 100644 index 2f2210a3a..000000000 --- a/frontend/app/components/BugFinder/AlertManager/alertForm.css +++ /dev/null @@ -1,9 +0,0 @@ -.formGroup { - margin-bottom: 15px; - - & .label { - font-size: 14px; - margin: 0; - margin-bottom: 5px; - } -} \ No newline at end of file diff --git a/frontend/app/components/BugFinder/AlertManager/alertManager.css b/frontend/app/components/BugFinder/AlertManager/alertManager.css deleted file mode 100644 index 776db10b8..000000000 --- a/frontend/app/components/BugFinder/AlertManager/alertManager.css +++ /dev/null @@ -1,20 +0,0 @@ -.wrapper { - padding: 20px; -} - -.button { - padding: 5px 10px; - cursor: pointer; - display: flex; - align-items: center; -} - -.formGroup { - margin-bottom: 15px; - - & .label { - font-size: 14px; - margin: 0; - margin-bottom: 5px; - } -} \ No newline at end of file diff --git a/frontend/app/components/BugFinder/AlertManager/index.js b/frontend/app/components/BugFinder/AlertManager/index.js deleted file mode 100644 index 93e26da4c..000000000 --- a/frontend/app/components/BugFinder/AlertManager/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './AlertManager'; diff --git a/frontend/app/components/BugFinder/Attributes/ActiveLabel.js b/frontend/app/components/BugFinder/Attributes/ActiveLabel.js deleted file mode 100644 index eeed1ea4c..000000000 --- a/frontend/app/components/BugFinder/Attributes/ActiveLabel.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import stl from './activeLabel.css'; - -const ActiveLabel = ({ item, onRemove }) => { - return ( -
    onRemove(item) }>{ item.text }
    - ); -}; - -export default ActiveLabel; diff --git a/frontend/app/components/BugFinder/Attributes/AttributeItem.js b/frontend/app/components/BugFinder/Attributes/AttributeItem.js deleted file mode 100644 index 74d4fa6bd..000000000 --- a/frontend/app/components/BugFinder/Attributes/AttributeItem.js +++ /dev/null @@ -1,93 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import { operatorOptions } from 'Types/filter'; -import { Icon } from 'UI'; -import { editAttribute, removeAttribute, applyFilter, fetchFilterOptions } from 'Duck/filters'; -import { debounce } from 'App/utils'; -import { KEYS } from 'Types/filter/customFilter'; -import stl from './attributeItem.css' -import AttributeValueField from './AttributeValueField'; -import OperatorDropdown from './OperatorDropdown'; -import CustomFilters from '../CustomFilters'; -import FilterSelectionButton from '../FilterSelectionButton'; - -const DEFAULT = null; - -@connect(state => ({ - loadingFilterOptions: state.getIn([ 'filters', 'fetchFilterOptions', 'loading' ]), - filterOptions: state.getIn([ 'filters', 'filterOptions' ]), -}), { - editAttribute, - removeAttribute, - applyFilter, - fetchFilterOptions -}) - -class AttributeItem extends React.PureComponent { - applyFilter = debounce(this.props.applyFilter, 1000) - fetchFilterOptionsDebounce = debounce(this.props.fetchFilterOptions, 500) - - onFilterChange = (name, value, valueIndex) => { - const { index } = this.props; - this.props.editAttribute(index, name, value, valueIndex); - this.applyFilter(); - } - - removeFilter = () => { - const { index } = this.props; - this.props.removeAttribute(index) - this.applyFilter(); - } - - handleSearchChange = (e, { searchQuery }) => { - const { filter } = this.props; - this.fetchFilterOptionsDebounce(filter, searchQuery); - } - - render() { - const { filter, options, index, loadingFilterOptions, filterOptions } = this.props; - const _operatorOptions = operatorOptions(filter); - - let filterLabel = filter.label; - if (filter.type === KEYS.METADATA) - filterLabel = filter.key; - - return ( -
    - } - showFilters={ true } - filterType="filter" - /> - { filter.type !== KEYS.DURATION && - - } - { - // !filter.hasNoValue && - - } - -
    - -
    -
    - ); - } -} - -export default AttributeItem; diff --git a/frontend/app/components/BugFinder/Attributes/AttributeValueField.js b/frontend/app/components/BugFinder/Attributes/AttributeValueField.js deleted file mode 100644 index 9e6b7eb78..000000000 --- a/frontend/app/components/BugFinder/Attributes/AttributeValueField.js +++ /dev/null @@ -1,194 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import cn from 'classnames'; -import stl from './attributeItem.css' -import { Dropdown } from 'semantic-ui-react'; -import { LinkStyledInput, CircularLoader } from 'UI'; -import { KEYS } from 'Types/filter/customFilter'; -import Event, { TYPES } from 'Types/filter/event'; -import CustomFilter from 'Types/filter/customFilter'; -import { setActiveKey, addCustomFilter, removeCustomFilter, applyFilter, updateValue } from 'Duck/filters'; -import DurationFilter from '../DurationFilter/DurationFilter'; -import AutoComplete from '../AutoComplete'; - -const DEFAULT = null; - -const getHeader = (type) => { - if (type === 'LOCATION') return 'Path'; - - return type; -} - -@connect(null, { - setActiveKey, - addCustomFilter, - removeCustomFilter, - applyFilter, - updateValue, -}) -class AttributeValueField extends React.PureComponent { - state = { - minDuration: this.props.filter.minDuration, - maxDuration: this.props.filter.maxDuration, - } - - onValueChange = (e, { name: key, value }) => { - this.props.addCustomFilter(key, value); - }; - - onDurationChange = (durationValues) => { - this.setState(durationValues); - } - - isAutoComplete = (type) => { - switch (type) { - case TYPES.METADATA: - case TYPES.CLICK: - case TYPES.CONSOLE: - case TYPES.GRAPHQL: - case TYPES.FETCH: - case TYPES.STATEACTION: - case TYPES.USERID: - case TYPES.USERANONYMOUSID: - case TYPES.REVID: - case TYPES.GRAPHQL: - case TYPES.CUSTOM: - case TYPES.LOCATION: - case TYPES.VIEW: - case TYPES.INPUT: - case 'metadata': - return true; - } - - return false; - } - - handleClose = (e) => { - const { filter, onChange } = this.props; - if (filter.key === KEYS.DURATION) { - const { maxDuration, minDuration, key } = filter; - if (maxDuration || minDuration) return; - if (maxDuration !== this.state.maxDuration || - minDuration !== this.state.minDuration) { - onChange(e, { name: 'value', value: [this.state.minDuration, this.state.maxDuration] }); - } - } - } - - renderField() { - const { filter, onChange } = this.props; - - if (filter.key === KEYS.DURATION) { - const { maxDuration, minDuration } = this.state; - return ( - - ); - } - - const { options = [], handleSearchChange, loading } = this.props; - return ( - 0 || options.size > 0} - onChange={ onChange } - onSearchChange={handleSearchChange} - icon={ null } - noResultsMessage={loading ?
    - -
    : 'No results found.'} - /> - ) - } - - optionMapping = (values) => { - const { filter } = this.props; - if ([KEYS.USER_DEVICE, KEYS.USER_OS, KEYS.USER_BROWSER, KEYS.REFERRER, KEYS.PLATFORM].indexOf(filter.type) !== -1) { - return values.map(item => ({ type: TYPES.METADATA, value: item })).map(CustomFilter); - } else { - return values.map(Event); - } - } - - getParams = filter => { - const params = {}; - - if (filter.type === TYPES.METADATA) { - params.key = filter.key - } - - params.type = filter.type - if (filter.type === TYPES.ERROR && filter.source) { - params.source = filter.source - } - return params; - } - - onAddValue = () => { - const { index, filter } = this.props; - this.props.updateValue('filters', index, filter.value.concat("")); - } - - onRemoveValue = (valueIndex) => { - const { index, filter } = this.props; - this.props.updateValue('filters', index, filter.value.filter((_, i) => i !== valueIndex)); - } - - onChange = (name, value, valueIndex) => { - const { index, filter } = this.props; - this.props.updateValue('filters', index, filter.value.map((item, i) => i === valueIndex ? value : item)); - } - - render() { - // const { filter, onChange } = this.props; - const { filter } = this.props; - const _showAutoComplete = this.isAutoComplete(filter.type); - const _params = _showAutoComplete ? this.getParams(filter) : {}; - let _optionsEndpoint= '/events/search'; - - return ( - - { _showAutoComplete ? filter.value.map((v, i) => ( - onChange(name, value, i) } - headerText={
    { getHeader(filter.type) }
    } - fullWidth={ (filter.type === TYPES.CONSOLE || filter.type === TYPES.LOCATION || filter.type === TYPES.CUSTOM) && filter.value } - onRemoveValue={() => this.onRemoveValue(i)} - onAddValue={this.onAddValue} - showCloseButton={i !== filter.value.length - 1} - /> - )) - : this.renderField() - } - { filter.type === 'INPUT' && - - } -
    - ); - } -} - -export default AttributeValueField; diff --git a/frontend/app/components/BugFinder/Attributes/Attributes.js b/frontend/app/components/BugFinder/Attributes/Attributes.js deleted file mode 100644 index 060731969..000000000 --- a/frontend/app/components/BugFinder/Attributes/Attributes.js +++ /dev/null @@ -1,71 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import { countries } from 'App/constants'; -import { KEYS } from 'Types/filter/customFilter'; -import { addAttribute } from 'Duck/filters'; -import AttributeItem from './AttributeItem'; -import ListHeader from '../ListHeader'; -import logger from 'App/logger'; - -const DEFAULT = null; -const DEFAULT_OPTION = { text: 'Any', value: DEFAULT }; -const toOptions = (values, mapper) => (values ? values - .map(({value}) => ({ - text: mapper ? mapper[ value ] : value, - value, - })) - .toJS() : [ DEFAULT_OPTION ]); - -const countryOptions = Object.keys(countries).map(i => ({ text: countries[i], value: i })); - -@connect(state => ({ - filters: state.getIn([ 'filters', 'appliedFilter', 'filters' ]), - filterValues: state.get('filterValues'), - filterOptions: state.getIn([ 'filters', 'filterOptions' ]), -}), { - addAttribute, -}) -class Attributes extends React.PureComponent { - getOptions = filter => { - const { filterValues, filterOptions } = this.props; - - if (filter.key === KEYS.USER_COUNTRY) { - logger.log('Filters: country') - return countryOptions; - } - - if (filter.key === KEYS.METADATA) { - logger.log('Filters: metadata ' + filter.key) - const options = filterValues.get(filter.key); - return options && options.size ? toOptions(options) : []; - } - - logger.log('Filters: general filters ' + filter.key) - const options = filterOptions.get(filter.key) - return options && options.size ? toOptions(options.filter(i => !!i)) : [] - } - render() { - const { filters } = this.props; - return ( - <> - { filters.size > 0 && -
    -
    - { - filters.map((filter, index) => ( - - )) - } -
    - } - - ); - } -} - -export default Attributes; diff --git a/frontend/app/components/BugFinder/Attributes/OperatorDropdown.js b/frontend/app/components/BugFinder/Attributes/OperatorDropdown.js deleted file mode 100644 index 4d2ba0d54..000000000 --- a/frontend/app/components/BugFinder/Attributes/OperatorDropdown.js +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react'; -import cn from 'classnames'; -import { Dropdown, Icon } from 'UI'; -import stl from './attributeItem.css' - -const OperatorDropdown = ({ options, value, onChange }) => { - return ( - } - /> - ); -}; - -export default OperatorDropdown; diff --git a/frontend/app/components/BugFinder/Attributes/activeLabel.css b/frontend/app/components/BugFinder/Attributes/activeLabel.css deleted file mode 100644 index 283fed288..000000000 --- a/frontend/app/components/BugFinder/Attributes/activeLabel.css +++ /dev/null @@ -1,9 +0,0 @@ -.wrapper { - padding: 3px 8px; - background-color: $gray-lightest; - border-radius: 10px; - margin-right: 5px; - box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) inset; - font-size: 13px; - color: $gray-medium; -} \ No newline at end of file diff --git a/frontend/app/components/BugFinder/Attributes/attributeItem.css b/frontend/app/components/BugFinder/Attributes/attributeItem.css deleted file mode 100644 index 72c908bd9..000000000 --- a/frontend/app/components/BugFinder/Attributes/attributeItem.css +++ /dev/null @@ -1,130 +0,0 @@ -@import 'icons.css'; - -.wrapper { - display: flex; - align-items: center; - padding: 8px 15px; - background-color: white; - border-bottom: solid thin $gray-lightest; - &:last-child { - border-bottom: solid thin transparent; - } - - &:hover { - background-color: $active-blue; - & .actions { - opacity: 1; - transition: all 0.2s; - } - } - - & > div:not(:last-child) { - margin-right: 10px; - } - - & .label { - font-weight: 600; - min-width: 80px; - } - - & .filterDropdown { - /* height: 28px !important; */ - padding: 0 5px !important; - min-height: 28px !important; - display: flex !important; - align-items: center !important; - font-weight: 400; - min-width: 280px !important; - max-width: 75% !important; - flex-wrap: wrap; - padding: 1.9px !important; - background-color: rgba(255, 255, 255, 0.8) !important; - padding-left: 5px !important; - - & a { - background-color: $gray-lightest !important; - box-shadow: none !important; - border-radius: 10px !important; - white-space: nowrap !important; - margin: 0 !important; - margin-right: 5px !important; - margin-bottom: 2px !important; - font-size: 13px !important; - font-weight: 400; - display: flex !important; - align-items: center !important; - padding: 3px 5px !important; - - & i::before { - display: none; - } - & i::after { - content: '' !important; - @mixin icon close, $gray-dark, 12px; - } - } - - & input { - padding: 6px !important; - margin: 0 !important; - color: $gray-medium !important; - } - - & .delete.icon { - padding: 0 !important; - display: none; - } - } -} - -.operatorDropdown { - font-weight: 400; - height: 28px; - min-width: 60px; - display: flex !important; - align-items: center; - justify-content: space-between; - padding: 0 8px !important; - font-size: 13px; - background-color: rgba(255, 255, 255, 0.8) !important; - border: solid thin rgba(34, 36, 38, 0.15) !important; - border-radius: 4px !important; - color: $gray-darkest !important; - font-size: 14px !important; - &.ui.basic.button { - box-shadow: 0 0 0 1px rgba(62, 170, 175,36,38,.35) inset, 0 0 0 0 rgba(62, 170, 175,.15) inset !important; - } -} - -.button { - width: 25px; - height: 25px; - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; - margin-left: 10px; -} - -.actions { - margin-left: auto; - opacity: 0; - transition: all 0.4s; -} - -.inputValue { - height: 28px !important; - width: 180px; - color: $gray-medium !important; -} - -.header { - margin-bottom: 10px; - font-size: 13px; - color: #596764; - white-space: nowrap; - text-transform: uppercase; - font-weight: normal; - letter-spacing: 0.1em; - text-align: left; -} \ No newline at end of file diff --git a/frontend/app/components/BugFinder/Attributes/index.js b/frontend/app/components/BugFinder/Attributes/index.js deleted file mode 100644 index 023362198..000000000 --- a/frontend/app/components/BugFinder/Attributes/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './Attributes'; diff --git a/frontend/app/components/BugFinder/AutoComplete/AutoComplete.js b/frontend/app/components/BugFinder/AutoComplete/AutoComplete.js index dbd6f9729..832f49768 100644 --- a/frontend/app/components/BugFinder/AutoComplete/AutoComplete.js +++ b/frontend/app/components/BugFinder/AutoComplete/AutoComplete.js @@ -5,7 +5,7 @@ import { Input, Icon } from 'UI'; import { debounce } from 'App/utils'; import OutsideClickDetectingDiv from 'Shared/OutsideClickDetectingDiv'; import EventSearchInput from 'Shared/EventSearchInput'; -import stl from './autoComplete.css'; +import stl from './autoComplete.module.css'; import FilterItem from '../CustomFilters/FilterItem'; const TYPE_TO_SEARCH_MSG = "Start typing to search..."; diff --git a/frontend/app/components/BugFinder/AutoComplete/DropdownItem.js b/frontend/app/components/BugFinder/AutoComplete/DropdownItem.js index a8275a14d..dc2b97304 100644 --- a/frontend/app/components/BugFinder/AutoComplete/DropdownItem.js +++ b/frontend/app/components/BugFinder/AutoComplete/DropdownItem.js @@ -1,5 +1,5 @@ import React from 'react'; -import stl from './dropdownItem.css'; +import stl from './dropdownItem.module.css'; const DropdownItem = ({ value, onSelect }) => { return ( diff --git a/frontend/app/components/BugFinder/AutoComplete/autoComplete.css b/frontend/app/components/BugFinder/AutoComplete/autoComplete.module.css similarity index 100% rename from frontend/app/components/BugFinder/AutoComplete/autoComplete.css rename to frontend/app/components/BugFinder/AutoComplete/autoComplete.module.css diff --git a/frontend/app/components/BugFinder/AutoComplete/dropdownItem.css b/frontend/app/components/BugFinder/AutoComplete/dropdownItem.module.css similarity index 100% rename from frontend/app/components/BugFinder/AutoComplete/dropdownItem.css rename to frontend/app/components/BugFinder/AutoComplete/dropdownItem.module.css diff --git a/frontend/app/components/BugFinder/BugFinder.js b/frontend/app/components/BugFinder/BugFinder.js index 6e4f589a6..3bbd55943 100644 --- a/frontend/app/components/BugFinder/BugFinder.js +++ b/frontend/app/components/BugFinder/BugFinder.js @@ -1,3 +1,4 @@ +import React from 'react'; import cn from 'classnames'; import { connect } from 'react-redux'; import withPageTitle from 'HOCs/withPageTitle'; @@ -8,11 +9,10 @@ import { applyFilter, clearEvents, addAttribute } from 'Duck/filters'; import { fetchList as fetchFunnelsList } from 'Duck/funnels'; import { KEYS } from 'Types/filter/customFilter'; import SessionList from './SessionList'; -import stl from './bugFinder.css'; +import stl from './bugFinder.module.css'; import withLocationHandlers from "HOCs/withLocationHandlers"; import { fetch as fetchFilterVariables } from 'Duck/sources'; import { fetchSources } from 'Duck/customField'; -import { RehydrateSlidePanel } from './WatchDogs/components'; import { setFunnelPage } from 'Duck/sessions'; import { setActiveTab } from 'Duck/search'; import SessionsMenu from './SessionsMenu/SessionsMenu'; @@ -137,10 +137,6 @@ export default class BugFinder extends React.PureComponent {
    - this.setState({ showRehydratePanel: false })} - />
    ); } diff --git a/frontend/app/components/BugFinder/CustomFilters/CustomFilters.js b/frontend/app/components/BugFinder/CustomFilters/CustomFilters.js deleted file mode 100644 index 5add05ef4..000000000 --- a/frontend/app/components/BugFinder/CustomFilters/CustomFilters.js +++ /dev/null @@ -1,28 +0,0 @@ -import React, { useCallback, useState } from 'react'; -import { connect } from 'react-redux'; -import { addEvent, applyFilter, setActiveKey, addAttribute } from 'Duck/filters'; -import OutsideClickDetectingDiv from 'Shared/OutsideClickDetectingDiv'; -import FilterModal from './FilterModal'; - -export default React.memo(function CustomFilters({ - index, - buttonComponent, - filterType, -}) { - const [ displayed, setDisplayed ] = useState(false); - const close = useCallback(() => setDisplayed(false), []); - const toggle = useCallback(() => setDisplayed(d => !d), []); - - return ( - -
    { buttonComponent || 'Add Step' }
    - - -
    - ); -}) \ No newline at end of file diff --git a/frontend/app/components/BugFinder/CustomFilters/FilterItem.js b/frontend/app/components/BugFinder/CustomFilters/FilterItem.js deleted file mode 100644 index 8b60b601c..000000000 --- a/frontend/app/components/BugFinder/CustomFilters/FilterItem.js +++ /dev/null @@ -1,15 +0,0 @@ -import React from 'react'; -import { Icon } from 'UI'; -import stl from './filterItem.css'; -import cn from 'classnames'; - -const FilterItem = ({ className = '', icon, label, onClick }) => { - return ( -
    - { icon && } - { label } -
    - ); -}; - -export default FilterItem; diff --git a/frontend/app/components/BugFinder/CustomFilters/FilterModal.js b/frontend/app/components/BugFinder/CustomFilters/FilterModal.js deleted file mode 100644 index 5bd536de5..000000000 --- a/frontend/app/components/BugFinder/CustomFilters/FilterModal.js +++ /dev/null @@ -1,220 +0,0 @@ -import React from 'react'; -import cn from 'classnames'; -import { List } from 'immutable'; -import { connect } from 'react-redux'; -import { getRE } from 'App/utils'; -import { defaultFilters, preloadedFilters } from 'Types/filter'; -import { TYPES } from 'Types/filter/event'; -import CustomFilter, { KEYS } from 'Types/filter/customFilter'; -import { applyFilter, setActiveKey, addEvent, removeEvent, setFilterOption, changeEvent, addAttribute, removeAttribute } from 'Duck/filters'; -import { NoContent, CircularLoader } from 'UI'; -import { debounce } from 'App/utils'; -import FilterItem from './FilterItem'; -import logger from 'App/logger'; - -import stl from './filterModal.css'; - -const customFilterAutoCompleteKeys = ['METADATA', KEYS.CLICK, KEYS.USER_BROWSER, KEYS.USER_OS, KEYS.USER_DEVICE, KEYS.REFERRER] - -@connect(state => ({ - filter: state.getIn([ 'filters', 'appliedFilter' ]), - customFilters: state.getIn([ 'filters', 'customFilters' ]), - variables: state.getIn([ 'customFields', 'list' ]), - sources: state.getIn([ 'customFields', 'sources' ]), - activeTab: state.getIn([ 'sessions', 'activeTab', 'type' ]), -}), { - applyFilter, - setActiveKey, - addEvent, - removeEvent, - addAttribute, - removeAttribute, - setFilterOption -}) -export default class FilterModal extends React.PureComponent { - state = { query: '' } - applyFilter = debounce(this.props.applyFilter, 300); - - onFilterClick = (filter, apply) => { - const key = filter.key || filter.type; - if (customFilterAutoCompleteKeys.includes(key)) { - this.props.setFilterOption(key, filter.value ? [{value: filter.value[0], type: key}] : []) - } - this.addFilter(filter); - if (apply || filter.hasNoValue) { - this.applyFilter(); - } - } - - renderFilterItem(type, filter) { - return ( - this.onFilterClick(filter) } - /> - ); - } - - addFilter = (filter) => { - const { index, filterType, filter: { filters } } = this.props; - this.props.close(); - - if (filter.isFilter || filter.type === 'METADATA') { - logger.log('Adding Filter', filter) - const _index = filterType === 'filter' ? index : undefined; // should add new one if coming from events - const _in = filters.findIndex(e => e.type === 'USERID'); - this.props.addAttribute(filter, _in >= 0 ? _in : _index); - } else { - logger.log('Adding Event', filter) - const _index = filterType === 'event' ? index : undefined; // should add new one if coming from filters - this.props.addEvent(filter, false, _index); - } - - if (filterType === 'event' && filter.isFilter) { // selected a filter from events - this.props.removeEvent(index); - } - - if (filterType === 'filter' && !filter.isFilter) { // selected an event from filters - this.props.removeAttribute(index); - } - }; - - renderList(type, list) { - const { activeTab } = this.props; - const blocks = []; - for (let j = 0; j < list.length; j++) { - blocks.push( -
    - { list[ j ] && this.renderFilterItem(type, list[ j ]) } -
    - ); - } - return blocks; - } - - test = (value = '') => getRE(this.props.searchQuery, 'i').test(value); - - renderEventDropdownItem = filter => ( - this.onFilterClick(filter, true) } - /> - ) - - renderEventDropdownPartFromList = (list, headerText) => (list.size > 0 && -
    -
    { headerText }
    - { list.map(this.renderEventDropdownItem) } -
    - ) - - renderEventDropdownPart = (type, headerText) => { - const searched = this.props.searchedEvents - .filter(e => e.type === type) - .filter(({ value, target }) => !this.props.loading || this.test(value) || this.test(target && target.label)); - - return this.renderEventDropdownPartFromList(searched, headerText) - }; - - renderStaticFiltersDropdownPart = (type, headerText, appliedFilterKeys) => { - if (appliedFilterKeys && appliedFilterKeys.includes(type)) return; - const staticFilters = List(preloadedFilters) - .filter(e => e.type === type) - .filter(({ value, actualValue }) => this.test(actualValue || value)) - .map(CustomFilter); - - return this.renderEventDropdownPartFromList(staticFilters, headerText) - }; - - render() { - const { - displayed, - customFilters, - filter, - loading = false, - searchedEvents, - searchQuery = '', - activeTab, - } = this.props; - const { query } = this.state; - const reg = getRE(query, 'i'); - - const _appliedFilterKeys = filter.filters.map(({type}) => type).toJS(); - const filteredList = defaultFilters.map(cat => { - let _keys = []; - if (query.length === 0 && cat.type === 'custom') { // default show limited custom fields - _keys = cat.keys.slice(0, 9).filter(({key}) => reg.test(key)) - } else { - _keys = cat.keys.filter(({key}) => reg.test(key)); - } - return { - ...cat, - keys: _keys - .filter(({key, filterKey}) => !_appliedFilterKeys.includes(filterKey) && !customFilters.has(filterKey || key) && !filter.get(filterKey || key)) - } - }).filter(cat => cat.keys.length > 0); - - const staticFilters = preloadedFilters - .filter(({ value, actualValue }) => !this.props.loading && this.test(actualValue || value)) - - return (!displayed ? null : -
    - { loading && -
    - } - - -
    - { searchQuery && - - {this.renderEventDropdownPart(TYPES.USERID, 'User Id')} - {activeTab !== 'live' && ( - <> - {this.renderEventDropdownPart(TYPES.METADATA, 'Metadata')} - {this.renderEventDropdownPart(TYPES.CONSOLE, 'Errors')} - {this.renderEventDropdownPart(TYPES.CUSTOM, 'Custom Events')} - {this.renderEventDropdownPart(KEYS.USER_COUNTRY, 'Country', _appliedFilterKeys)} - {this.renderEventDropdownPart(KEYS.USER_BROWSER, 'Browser', _appliedFilterKeys)} - {this.renderEventDropdownPart(KEYS.USER_DEVICE, 'Device', _appliedFilterKeys)} - {this.renderEventDropdownPart(TYPES.LOCATION, 'Page')} - {this.renderEventDropdownPart(TYPES.CLICK, 'Click')} - {this.renderEventDropdownPart(TYPES.FETCH, 'Fetch')} - {this.renderEventDropdownPart(TYPES.INPUT, 'Input')} - - {this.renderEventDropdownPart(KEYS.USER_OS, 'Operating System', _appliedFilterKeys)} - {this.renderEventDropdownPart(KEYS.REFERRER, 'Referrer', _appliedFilterKeys)} - {this.renderEventDropdownPart(TYPES.GRAPHQL, 'GraphQL')} - {this.renderEventDropdownPart(TYPES.STATEACTION, 'Store Action')} - {this.renderEventDropdownPart(TYPES.REVID, 'Rev ID')} - - )} - - } -
    - { searchQuery === '' && -
    - { - filteredList.map(category => ( -
    -
    { category.category }
    -
    - { this.renderList(category.type, category.keys) } -
    -
    - )) - } -
    - } -
    -
    - ); - } -} diff --git a/frontend/app/components/BugFinder/CustomFilters/filterItem.css b/frontend/app/components/BugFinder/CustomFilters/filterItem.css deleted file mode 100644 index 2840f2119..000000000 --- a/frontend/app/components/BugFinder/CustomFilters/filterItem.css +++ /dev/null @@ -1,20 +0,0 @@ -.filterItem { - display: flex; - align-items: center; - padding: 8px; - cursor: pointer; - border-radius: 3px; - transition: all 0.4s; - margin-bottom: 5px; - max-width: 100%; - & .label { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - &:hover { - background-color: $gray-lightest; - transition: all 0.2s; - } -} \ No newline at end of file diff --git a/frontend/app/components/BugFinder/CustomFilters/filterModal.css b/frontend/app/components/BugFinder/CustomFilters/filterModal.css deleted file mode 100644 index 5b84dd732..000000000 --- a/frontend/app/components/BugFinder/CustomFilters/filterModal.css +++ /dev/null @@ -1,96 +0,0 @@ -.modal { - position: absolute; - left: 0; - background-color: white; - width: -webkit-fill-available; - min-width: 705px; - max-width: calc(100vw - 500px); - border-radius: 3px; - border: solid thin $gray-light; - box-shadow: 0 2px 10px 0 $gray-light; - z-index: 99; - padding: 20px; -} - -.hint { - color: $gray-light; - font-size: 12px; - padding-bottom: 5px; -} - -h5.title { - margin: 10px 0 3px; -} - -.filterListDynamic { - max-height: 350px; - overflow-y: auto; - - &::-webkit-scrollbar { - width: 2px; - } - - &::-webkit-scrollbar-thumb { - background: transparent; - } - &::-webkit-scrollbar-track { - background: transparent; - } - &:hover { - &::-webkit-scrollbar-track { - background: #f3f3f3; - } - &::-webkit-scrollbar-thumb { - background: $gray-medium; - } - } - - - & .header { - margin-bottom: 10px; - font-size: 13px; - color: #596764; - white-space: nowrap; - text-transform: uppercase; - font-weight: 600; - letter-spacing: 0.1em; - text-align: left; - } - - & .list { - margin-left: -8px; - } -} - -.filterListStatic { - display: flex; - flex-wrap: wrap; - flex-direction: column; - max-height: 33rem; - min-height: 20px; - color: $gray-medium; - - & .header { - margin-bottom: 10px; - font-size: 13px; - color: #596764; - white-space: nowrap; - text-transform: uppercase; - font-weight: 600; - letter-spacing: 0.1em; - text-align: left; - } - - & .list { - margin-left: -8px; - } - - & .filterGroup { - width: 205px; - } -} - -.disabled { - opacity: 0.5; - pointer-events: none; -} \ No newline at end of file diff --git a/frontend/app/components/BugFinder/CustomFilters/index.js b/frontend/app/components/BugFinder/CustomFilters/index.js deleted file mode 100644 index 29dfa472a..000000000 --- a/frontend/app/components/BugFinder/CustomFilters/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './CustomFilters'; \ No newline at end of file diff --git a/frontend/app/components/BugFinder/DateRange.js b/frontend/app/components/BugFinder/DateRange.js index c0758b426..9a6e77f12 100644 --- a/frontend/app/components/BugFinder/DateRange.js +++ b/frontend/app/components/BugFinder/DateRange.js @@ -1,3 +1,4 @@ +import React from 'react'; import { connect } from 'react-redux'; import { applyFilter } from 'Duck/search'; import { fetchList as fetchFunnelsList } from 'Duck/funnels'; diff --git a/frontend/app/components/BugFinder/DurationFilter/DurationFilter.js b/frontend/app/components/BugFinder/DurationFilter/DurationFilter.js deleted file mode 100644 index c69e199a8..000000000 --- a/frontend/app/components/BugFinder/DurationFilter/DurationFilter.js +++ /dev/null @@ -1,66 +0,0 @@ -import { Input, Label } from 'semantic-ui-react'; -import styles from './durationFilter.css'; - -const fromMs = value => value ? `${ value / 1000 / 60 }` : '' -const toMs = value => value !== '' ? value * 1000 * 60 : null - -export default class DurationFilter extends React.PureComponent { - state = { focused: false } - onChange = (e, { name, value }) => { - const { onChange } = this.props; - if (typeof onChange === 'function') { - onChange({ - [ name ]: toMs(value), - }); - } - } - - onKeyPress = e => { - const { onEnterPress } = this.props; - if (e.key === 'Enter' && typeof onEnterPress === 'function') { - onEnterPress(e); - } - } - - render() { - const { - minDuration, - maxDuration, - } = this.props; - - return ( -
    - this.setState({ focused: true })} - onBlur={this.props.onBlur} - > - - - - this.setState({ focused: true })} - onBlur={this.props.onBlur} - > - - - -
    - ); - } -} diff --git a/frontend/app/components/BugFinder/DurationFilter/durationFilter.css b/frontend/app/components/BugFinder/DurationFilter/durationFilter.css deleted file mode 100644 index c7a272458..000000000 --- a/frontend/app/components/BugFinder/DurationFilter/durationFilter.css +++ /dev/null @@ -1,24 +0,0 @@ -.wrapper { - display: flex; - justify-content: space-between; - - & input { - max-width: 85px !important; - font-size: 13px !important; - font-weight: 400 !important; - color: $gray-medium !important; - } - - & > div { - &:first-child { - margin-right: 10px; - } - } -} - -.label { - font-size: 13px !important; - font-weight: 400 !important; - color: $gray-medium !important; -} - diff --git a/frontend/app/components/BugFinder/EventFilter/EventDropdownItem.js b/frontend/app/components/BugFinder/EventFilter/EventDropdownItem.js deleted file mode 100644 index 8d6d58f0a..000000000 --- a/frontend/app/components/BugFinder/EventFilter/EventDropdownItem.js +++ /dev/null @@ -1,32 +0,0 @@ -import { TYPES } from 'Types/filter/event'; -import cn from 'classnames'; -import { Icon } from 'UI'; -import cls from './eventDropdownItem.css'; - - -const getText = (event) => { - if (event.type === TYPES.METADATA) { - return `${ event.key }: ${ event.value }`; - } - if (event.target) { - return event.target.label || event.value; - } - return event.value; // both should be? -}; - -export default function EventDropdownItem({ event }) { - return ( -
    - -
    - { getText(event) } -
    -
    - ); -} diff --git a/frontend/app/components/BugFinder/EventFilter/EventEditor.js b/frontend/app/components/BugFinder/EventFilter/EventEditor.js deleted file mode 100644 index 29488a231..000000000 --- a/frontend/app/components/BugFinder/EventFilter/EventEditor.js +++ /dev/null @@ -1,109 +0,0 @@ -import { connect } from 'react-redux'; -// import { DNDSource, DNDTarget } from 'Components/hocs/dnd'; -import Event, { TYPES } from 'Types/filter/event'; -import { operatorOptions } from 'Types/filter'; -import { editEvent, removeEvent, clearEvents, applyFilter } from 'Duck/filters'; -import { Icon } from 'UI'; -import stl from './eventEditor.css'; -import { debounce } from 'App/utils'; -import AttributeValueField from '../Attributes/AttributeValueField'; -import OperatorDropdown from '../Attributes/OperatorDropdown'; -import CustomFilters from '../CustomFilters'; -import FilterSelectionButton from '../FilterSelectionButton'; - -const getPlaceholder = ({ type }) => { - if (type === TYPES.INPUT) return "E.g. First Name"; - if (type === TYPES.LOCATION) return "Specify URL / Path"; - if (type === TYPES.VIEW) return "Specify View Name"; - if (type === TYPES.CONSOLE) return "Specify Error Message"; - if (type === TYPES.CUSTOM) return "Specify Custom Event Name"; - return ''; -}; - -const getLabel = ({ type }) => { - if (type === TYPES.INPUT) return "Specify Value"; - return getPlaceholder({ type }); -}; - -// @DNDTarget('event') -// @DNDSource('event') -@connect(state => ({ - isLastEvent: state.getIn([ 'filters', 'appliedFilter', 'events' ]).size === 1, -}), { editEvent, removeEvent, clearEvents, applyFilter }) -export default class EventEditor extends React.PureComponent { - applyFilter = debounce(this.props.applyFilter, 1500) - - onChange = (e, { name, value, searchType }) => { - const { index } = this.props; - const updFields = { [name]: value }; - if (searchType != null) { - updFields.searchType = searchType; - } - this.props.editEvent(index, updFields); - this.applyFilter(); - } - - onTargetChange = (e, {target}) => { - const { index, event } = this.props; - this.props.editEvent(index, {target}); - this.applyFilter(); - } - - onCheckboxChange = ({ target: { name, checked }}) => { - this.props.editEvent(this.props.index, name, checked); - } - - remove = () => { - this.props.removeEvent(this.props.index); - this.applyFilter() - }; - - render() { - const { - event, - index, - isDragging, - connectDragSource, - connectDropTarget, - } = this.props; - - const _operatorOptions = operatorOptions(event); - - const dndBtn = connectDragSource( - - ); - - return connectDropTarget( -
    -
    -
    { index + 1 }
    - - } - filterType="event" - /> - - - - -
    -
    - { dndBtn } - -
    -
    - ); - } -} diff --git a/frontend/app/components/BugFinder/EventFilter/EventFilter.js b/frontend/app/components/BugFinder/EventFilter/EventFilter.js deleted file mode 100644 index 5adc5a42e..000000000 --- a/frontend/app/components/BugFinder/EventFilter/EventFilter.js +++ /dev/null @@ -1,200 +0,0 @@ -import { connect } from 'react-redux'; -import { Input } from 'semantic-ui-react'; -// import { DNDContext } from 'Components/hocs/dnd'; -import { - addEvent, applyFilter, moveEvent, clearEvents, edit, - addCustomFilter, addAttribute, setSearchQuery, setActiveFlow, setFilterOption -} from 'Duck/filters'; -import { fetchList as fetchEventList } from 'Duck/events'; -import { debounce } from 'App/utils'; -import OutsideClickDetectingDiv from 'Shared/OutsideClickDetectingDiv'; -import EventEditor from './EventEditor'; -import ListHeader from '../ListHeader'; -import FilterModal from '../CustomFilters/FilterModal'; -import { IconButton, SegmentSelection } from 'UI'; -import stl from './eventFilter.css'; -import Attributes from '../Attributes/Attributes'; -import RandomPlaceholder from './RandomPlaceholder'; -import CustomFilters from '../CustomFilters'; -import ManageFilters from '../ManageFilters'; -import { blink as setBlink } from 'Duck/funnels'; -import cn from 'classnames'; -import SaveFilterButton from 'Shared/SaveFilterButton'; - -@connect(state => ({ - events: state.getIn([ 'filters', 'appliedFilter', 'events' ]), - appliedFilter: state.getIn([ 'filters', 'appliedFilter' ]), - searchQuery: state.getIn([ 'filters', 'searchQuery' ]), - appliedFilterKeys: state.getIn([ 'filters', 'appliedFilter', 'filters' ]) - .map(({type}) => type).toJS(), - searchedEvents: state.getIn([ 'events', 'list' ]), - loading: state.getIn([ 'events', 'loading' ]), - strict: state.getIn([ 'filters', 'appliedFilter', 'strict' ]), - blink: state.getIn([ 'funnels', 'blink' ]), -}), { - applyFilter, - addEvent, - moveEvent, - fetchEventList, - clearEvents, - addCustomFilter, - addAttribute, - setSearchQuery, - setActiveFlow, - setFilterOption, - setBlink, - edit, -}) -// @DNDContext -export default class EventFilter extends React.PureComponent { - state = { search: '', showFilterModal: false, showPlacehoder: true } - fetchEventList = debounce(this.props.fetchEventList, 500) - inputRef = React.createRef() - - componentDidUpdate(){ - const { blink, setBlink } = this.props; - if (blink) { - setTimeout(function() { - setBlink(false) - }, 3000) - } - } - - onBlur = () => { - const { searchQuery } = this.props; - this.setState({ showPlacehoder: searchQuery === '' }); - } - - onFocus = () => { - this.setState({ showPlacehoder: false, showFilterModal: true }); - } - - onChangeStrict = () => { - this.props.applyFilter({ strict: !this.props.strict }); - } - - onSearchChange = (e, { value }) => { - this.props.setSearchQuery(value) - if (value !== '') this.fetchEventList({ q: value }); - } - - onPlaceholderClick = () => { - this.inputRef.current && this.inputRef.current.focus(); - } - - closeModal = () => { - this.setState({ showPlacehoder: true, showFilterModal: false }) - } - - onPlaceholderItemClick = (e, filter) => { - e.stopPropagation(); - e.preventDefault(); - - if (Array.isArray(filter)) { - for (var i = 0; i < filter.length; i++) { - this.onPlaceholderItemClick(e, filter[i]); - } - } else if (filter.isFilter) { - this.props.setFilterOption(filter.key, [{ value: filter.value[0], type: filter.key }]) - this.props.addAttribute(filter); - } - else - this.props.addEvent(filter); - - if (filter.value || filter.hasNoValue) { - this.props.applyFilter(); - } - } - - clearEvents = () => { - this.props.clearEvents(); - this.props.setActiveFlow(null) - } - - changeConditionTab = (e, { name, value }) => { - this.props.edit({ [ 'condition' ]: value }) - }; - - render() { - const { - events, - loading, - searchedEvents, - appliedFilterKeys, - appliedFilter, - searchQuery, - blink - } = this.props; - const { showFilterModal, showPlacehoder } = this.state; - const hasFilters = appliedFilter.events.size > 0 || appliedFilter.filters.size > 0; - - return ( - - - - { hasFilters && -
    -
    -
    Operator
    - -
    - - { events.size > 0 && - <> -
    - { events.map((event, i) => ( - - )) } - - } - -
    - -
    -
    - - -
    - } - showFilters={ true } - /> -
    - -
    -
    - -
    - -
    -
    -
    - } - - ); - } -} diff --git a/frontend/app/components/BugFinder/EventFilter/RandomPlaceholder.js b/frontend/app/components/BugFinder/EventFilter/RandomPlaceholder.js deleted file mode 100644 index a8df1c5a4..000000000 --- a/frontend/app/components/BugFinder/EventFilter/RandomPlaceholder.js +++ /dev/null @@ -1,88 +0,0 @@ -import React from 'react'; -import { RandomElement } from 'UI'; -import stl from './randomPlaceholder.css'; -import Event, { TYPES } from 'Types/filter/event'; -import CustomFilter, { KEYS } from 'Types/filter/customFilter'; - -const getLabel = (type) => { - if (type === KEYS.MISSING_RESOURCE) return 'Missing Resource'; - if (type === KEYS.SLOW_SESSION) return 'Slow Sessions'; - if (type === KEYS.USER_COUNTRY) return 'Country'; - if (type === KEYS.USER_BROWSER) return 'Browser'; - if (type === KEYS.USERID) return 'User Id'; -} - -const getObject = (type, key) => { - switch(type) { - case TYPES.CLICK: - case TYPES.INPUT: - case TYPES.ERROR: - case TYPES.LOCATION: - return Event({ type, key: type }); - case KEYS.JOURNEY: - return [ - Event({ type: TYPES.LOCATION, key: TYPES.LOCATION }), - Event({ type: TYPES.LOCATION, key: TYPES.LOCATION }), - Event({ type: TYPES.CLICK, key: TYPES.CLICK }) - ] - - case KEYS.USER_BROWSER: - return CustomFilter({type, key: type, isFilter: true, label: getLabel(type), value: ['Chrome'] }); - case TYPES.METADATA: - return CustomFilter({type, key, isFilter: true, label: key }); - case TYPES.USERID: - return CustomFilter({type, key, isFilter: true, label: key }); - case KEYS.USER_COUNTRY: - return CustomFilter({type, key: type, isFilter: true, value: ['FR'], label: getLabel(type) }); - case KEYS.SLOW_SESSION: - case KEYS.MISSING_RESOURCE: - return CustomFilter({type, key: type, hasNoValue: true, isFilter: true, label: getLabel(type) }); - } -} - -const getList = (onClick, appliedFilterKeys) => { - let list = [ - { - key: KEYS.CLICK, - element:
    Find sessions with onClick(e, getObject(TYPES.CLICK))}>Click
    - }, - { - key: KEYS.INPUT, - element:
    Find sessions with onClick(e, getObject(TYPES.INPUT))}>Input
    - }, - { - key: KEYS.ERROR, - element:
    Find sessions with onClick(e, getObject(TYPES.ERROR))}>Errors
    - }, - { - key: KEYS.LOCATION, - element:
    Find sessions with onClick(e, getObject(TYPES.LOCATION))}>URL
    - }, - { - key: TYPES.USERID, - element:
    Find sessions with onClick(e, getObject(TYPES.USERID))}>User ID
    - }, - { - key: KEYS.JOURNEY, - element:
    Find sessions in a onClick(e, getObject(KEYS.JOURNEY))}>Journey
    - }, - { - key: KEYS.USER_COUNTRY, - element:
    Find sessions from onClick(e, getObject(KEYS.USER_COUNTRY))}>France
    - }, - { - key: KEYS.USER_BROWSER, - element:
    Find sessions on onClick(e, getObject(KEYS.USER_BROWSER))}>Chrome
    - }, - ] - - return list.filter(({key}) => !appliedFilterKeys.includes(key)) -} - -const RandomPlaceholder = ({ onClick, appliedFilterKeys }) => { - return ( - - ); -}; - -export default RandomPlaceholder; diff --git a/frontend/app/components/BugFinder/EventFilter/TypeBadge.js b/frontend/app/components/BugFinder/EventFilter/TypeBadge.js deleted file mode 100644 index 5ad9a69a7..000000000 --- a/frontend/app/components/BugFinder/EventFilter/TypeBadge.js +++ /dev/null @@ -1,45 +0,0 @@ -import cn from 'classnames'; -import { TYPES } from 'Types/filter/event'; -import { LEVEL } from 'Types/session/log'; -import { Icon } from 'UI'; - -import styles from './typeBadge.css'; - -function getText(type, source) { - if (type === TYPES.CLICK) return 'Click'; - if (type === TYPES.LOCATION) return 'URL'; - if (type === TYPES.VIEW) return 'View'; - if (type === TYPES.INPUT) return 'Input'; - if (type === TYPES.CONSOLE) return 'Console'; - if (type === TYPES.GRAPHQL) return 'GraphQL'; - if (type === TYPES.ERROR) return 'Error'; - if (type === TYPES.STATEACTION) return 'Store Action'; - if (type === TYPES.FETCH) return 'Fetch'; - if (type === TYPES.REVID) return 'Rev ID'; - if (type === TYPES.METADATA) return 'Metadata'; - if (type === TYPES.CUSTOM) { - if (!source) return 'Custom'; - return ( - - - { 'Custom' } - - ); - } - return '?'; -} - -const TypeBadge = ({ event: { type, level, source } }) => ( -
    - { getText(type, source) } -
    -); - -TypeBadge.displayName = 'TypeBadge'; - -export default TypeBadge; diff --git a/frontend/app/components/BugFinder/EventFilter/eventDropdownItem.css b/frontend/app/components/BugFinder/EventFilter/eventDropdownItem.css deleted file mode 100644 index a6f7dc4d1..000000000 --- a/frontend/app/components/BugFinder/EventFilter/eventDropdownItem.css +++ /dev/null @@ -1,26 +0,0 @@ -.eventDropdownItem { - padding: 8px 0; - padding-left: 18px; - border-bottom: solid thin $gray-light; - - &:last-child { - border-bottom: solid thin transparent; - } - - & .values { - max-width: 400px; - overflow: hidden; - text-overflow: ellipsis; - - &.inputType, - &.clickType { - color: $gray-darkest !important; - font-size: 14px; - } - - &.consoleType { - font-family: 'menlo', 'monaco', 'consolas', monospace; - font-size: 12px; - } - } -} \ No newline at end of file diff --git a/frontend/app/components/BugFinder/EventFilter/eventEditor.css b/frontend/app/components/BugFinder/EventFilter/eventEditor.css deleted file mode 100644 index a997f0ff0..000000000 --- a/frontend/app/components/BugFinder/EventFilter/eventEditor.css +++ /dev/null @@ -1,71 +0,0 @@ -@import 'mixins.css'; - -@import 'icons.css'; - -.wrapper { - width: 100%; - display: flex; - padding: 8px 15px; - background-color: white; - border-bottom: solid thin $gray-lightest; - transition: all 0.4s; - - &:last-child { - border-bottom: solid thin transparent; - } - - &:hover { - background-color: $active-blue; - transition: all 0.2s; - - & .actions { - opacity: 1; - transition: all 0.2s; - } - } - - & .leftSection, - & .actions { - display: flex; - align-items: center; - } - - & .leftSection { - flex: 1; - & > div { - margin-right: 10px; - flex-shrink: 0; - } - } -} - -.index { - background: $white; - width: 24px; - height: 24px; - border-radius: 12px; - margin-right: 10px; - color: $gray-medium; - font-weight: 300; - font-size: 12px; - display: flex; - align-items: center; - justify-content: center; - user-select: none; - box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1) inset; -} - -.button { - width: 25px; - height: 25px; - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; - margin-left: 10px; -} - -.actions { - opacity: 0; - transition: all 0.4s; -} \ No newline at end of file diff --git a/frontend/app/components/BugFinder/EventFilter/eventFilter.css b/frontend/app/components/BugFinder/EventFilter/eventFilter.css deleted file mode 100644 index 976fd4640..000000000 --- a/frontend/app/components/BugFinder/EventFilter/eventFilter.css +++ /dev/null @@ -1,77 +0,0 @@ -.searchField { - box-shadow: none !important; - & input { - box-shadow: none !important; - border-radius: 3 !important; - border: solid thin $gray-light !important; - height: 46px !important; - font-size: 16px; - } -} - -.wrapper { - box-shadow: none !important; - position: relative; - - & .clearStepsButton { - position: absolute; - bottom: 10px; - right: 10x; - } -} - -.randomElement { - position: absolute; - left: 0; - top: 0; - right: 0; - z-index: 8; - padding: 15px; - padding-left: 40px; -} - -.dropdownMenu { - max-width: 100%; - border-top-left-radius: 0 !important; - border-top-right-radius: 0 !important; - - &[data-hidden=true] { - display: none !important; - } -} - - -.header { - padding: 5px 10px; - letter-spacing: 1.5px; - background-color: $gray-lightest; - color: $gray-medium; - font-size: 12px; - text-transform: uppercase; -} - -.dateRange { - color: red; - z-index: 8; - position: absolute; - right: 9px; - top: 9px; -} - -.placeholder { - color: $gray-medium; - font-weight: 300; - font-size: 16px; - user-select: none; - - & span { - font-weight: 400; - color: $teal; - cursor: pointer; - border-bottom: dashed thin $teal; - - &:hover { - color: $teal-dark; - } - } -} \ No newline at end of file diff --git a/frontend/app/components/BugFinder/EventFilter/index.js b/frontend/app/components/BugFinder/EventFilter/index.js deleted file mode 100644 index 8298d268d..000000000 --- a/frontend/app/components/BugFinder/EventFilter/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './EventFilter'; diff --git a/frontend/app/components/BugFinder/EventFilter/randomPlaceholder.css b/frontend/app/components/BugFinder/EventFilter/randomPlaceholder.css deleted file mode 100644 index c0958d2aa..000000000 --- a/frontend/app/components/BugFinder/EventFilter/randomPlaceholder.css +++ /dev/null @@ -1,17 +0,0 @@ -.placeholder { - color: $gray-medium; - font-weight: 300; - font-size: 16px; - user-select: none; - - & span { - font-weight: 400; - color: $teal; - cursor: pointer; - border-bottom: dashed thin $teal; - - &:hover { - color: $teal-dark; - } - } -} \ No newline at end of file diff --git a/frontend/app/components/BugFinder/EventFilter/typeBadge.css b/frontend/app/components/BugFinder/EventFilter/typeBadge.css deleted file mode 100644 index 2ff7005e4..000000000 --- a/frontend/app/components/BugFinder/EventFilter/typeBadge.css +++ /dev/null @@ -1,23 +0,0 @@ -.badge { - font-size: 11px; - border-radius: 3px; - background-color: white; - border: solid thin $gray-light; - padding: 2px 0; - text-align: center; - width: 66px; - margin-right: 10px; - user-select: none; - - &.red { - background-color: rgba(204, 0, 0, 0.05); - } - - &.yellow { - background-color: rgba(245, 166, 35, 0.05); - } -} - -.icon { - vertical-align: text-top; -} \ No newline at end of file diff --git a/frontend/app/components/BugFinder/FilterSelectionButton.js b/frontend/app/components/BugFinder/FilterSelectionButton.js index 7779f0ebd..9854b29a3 100644 --- a/frontend/app/components/BugFinder/FilterSelectionButton.js +++ b/frontend/app/components/BugFinder/FilterSelectionButton.js @@ -1,6 +1,6 @@ import React from 'react'; import { Icon } from 'UI'; -import stl from './filterSelectionButton.css'; +import stl from './filterSelectionButton.module.css'; const FilterSelectionButton = ({ label }) => { return ( diff --git a/frontend/app/components/BugFinder/Filters/SortDropdown.js b/frontend/app/components/BugFinder/Filters/SortDropdown.js index cdcc2e468..d75b4222f 100644 --- a/frontend/app/components/BugFinder/Filters/SortDropdown.js +++ b/frontend/app/components/BugFinder/Filters/SortDropdown.js @@ -1,14 +1,15 @@ +import React from 'react'; import { connect } from 'react-redux'; -import { Dropdown } from 'semantic-ui-react'; +import Select from 'Shared/Select'; import { Icon } from 'UI'; import { sort } from 'Duck/sessions'; import { applyFilter } from 'Duck/search'; -import stl from './sortDropdown.css'; +import stl from './sortDropdown.module.css'; @connect(null, { sort, applyFilter }) export default class SortDropdown extends React.PureComponent { state = { value: null } - sort = (e, { value }) => { + sort = ({ value }) => { this.setState({ value: value }) const [ sort, order ] = value.split('-'); const sign = order === 'desc' ? -1 : 1; @@ -21,14 +22,14 @@ export default class SortDropdown extends React.PureComponent { render() { const { options } = this.props; return ( - } /> ); diff --git a/frontend/app/components/BugFinder/Filters/sortDropdown.css b/frontend/app/components/BugFinder/Filters/sortDropdown.module.css similarity index 100% rename from frontend/app/components/BugFinder/Filters/sortDropdown.css rename to frontend/app/components/BugFinder/Filters/sortDropdown.module.css diff --git a/frontend/app/components/BugFinder/FindBlock.js b/frontend/app/components/BugFinder/FindBlock.js deleted file mode 100644 index 7b8f295c5..000000000 --- a/frontend/app/components/BugFinder/FindBlock.js +++ /dev/null @@ -1,33 +0,0 @@ -import { connect } from 'react-redux'; -import { Button } from 'UI'; -import { applyFilter } from 'Duck/filters'; -import styles from './findBlock.css'; - -@connect(state => ({ - eventsCount: state.getIn([ 'filters', 'appliedFilter', 'events' ]).size, - lodaing: state.getIn([ 'sessions', 'loading' ]), -}), { - applyFilter, -}) -export default class FindBlock extends React.PureComponent { - onClick = () => this.props.applyFilter() - render() { - const { lodaing, eventsCount } = this.props; - - return ( -
    -
    - -
    -
    - ); - } -} diff --git a/frontend/app/components/BugFinder/Insights.js b/frontend/app/components/BugFinder/Insights.js index d96c62faa..39cfdd041 100644 --- a/frontend/app/components/BugFinder/Insights.js +++ b/frontend/app/components/BugFinder/Insights.js @@ -1,5 +1,5 @@ import { connect } from 'react-redux'; -import styles from './insights.css'; +import styles from './insights.module.css'; const Insights = ({ insights }) => (
    diff --git a/frontend/app/components/BugFinder/ListHeader.js b/frontend/app/components/BugFinder/ListHeader.js index 0c7801ce8..4379d0647 100644 --- a/frontend/app/components/BugFinder/ListHeader.js +++ b/frontend/app/components/BugFinder/ListHeader.js @@ -1,5 +1,5 @@ import React from 'react'; -import stl from './listHeader.css'; +import stl from './listHeader.module.css'; const ListHeader = ({ title }) => { return ( diff --git a/frontend/app/components/BugFinder/ManageFilters/ActiveFilterDetails.js b/frontend/app/components/BugFinder/ManageFilters/ActiveFilterDetails.js deleted file mode 100644 index 42136831d..000000000 --- a/frontend/app/components/BugFinder/ManageFilters/ActiveFilterDetails.js +++ /dev/null @@ -1,64 +0,0 @@ -import { Button } from 'UI'; -import styles from './activeFilterDetails.css'; -import cn from 'classnames'; -import { BrowserIcon, OsIcon } from 'UI'; -import TypeBadge from '../EventFilter/TypeBadge'; - -export default ({ - activeFilter, applyFiltersHandler, removeFilter, loading, -}) => ( -
    -
    - { activeFilter.name } -
    -
    -
    -
    { 'User Events' }
    -
    -
    - { activeFilter.events.map((item, i) => ( -
    -
    { i+1 }
    - -
    { item.value }
    -
    - ))} -
    -
    -
    - -
    -
    { 'Location:' }
    -
    - { activeFilter.userCountry } -
    -
    - -
    -
    { 'Browser:' }
    -
    - - { activeFilter.userBrowser } -
    -
    - -
    -
    { 'OS:' }
    -
    - - { activeFilter.userOs } -
    -
    -
    -
    - - -
    -
    -); diff --git a/frontend/app/components/BugFinder/ManageFilters/ManageFilters.js b/frontend/app/components/BugFinder/ManageFilters/ManageFilters.js deleted file mode 100644 index f43ed0e23..000000000 --- a/frontend/app/components/BugFinder/ManageFilters/ManageFilters.js +++ /dev/null @@ -1,77 +0,0 @@ -import { connect } from 'react-redux'; -import { IconButton } from 'UI'; -import Funnel from 'Types/funnel'; -import { - remove as removeFilter, - setActive as setActiveFilter, - applyFilter, - toggleFilterModal -} from 'Duck/filters'; -import { - fetchList as fetchFilterList, - save as saveFunnel -} from 'Duck/funnels'; -import withToggle from 'Components/hocs/withToggle'; -import SaveModal from './SaveModal'; - -@withToggle('slideModalDisplayed', 'toggleSlideModal') -@connect( - state => - ({ - savedFilters: state.getIn([ 'filters', 'list' ]), - activeFilter: state.getIn([ 'filters', 'activeFilter' ]), - fetching: state.getIn([ 'filters', 'fetchListRequest', 'loading' ]), - loading: state.getIn([ 'filters', 'loading' ]), - saveModalOpen: state.getIn([ 'filters', 'saveModalOpen' ]), - appliedFilter: state.getIn([ 'filters', 'appliedFilter' ]), - customFilters: state.getIn([ 'filters', 'customFilters']), - }) - , - { - fetchFilterList, - saveFunnel, - removeFilter, - setActiveFilter, - applyFilter, - toggleFilterModal, - }, -) -export default class ManageFilters extends React.PureComponent { - updateFilter = (name, isPublic = false) => { - const { appliedFilter } = this.props; - const savedFilter = Funnel({name, filter: appliedFilter, isPublic }); - this.props.saveFunnel(savedFilter).then(function() { - this.props.fetchFilterList(); - this.props.toggleFilterModal(false); - }.bind(this)); - } - - applyFiltersHandler = (filter) => { - this.props.applyFilter(filter); - this.props.toggleSlideModal(false); - } - - render() { - const { - saveModalOpen, - appliedFilter, - } = this.props; - - return ( -
    - this.props.toggleFilterModal(true) } - /> - -
    - ); - } -} diff --git a/frontend/app/components/BugFinder/ManageFilters/SaveModal.js b/frontend/app/components/BugFinder/ManageFilters/SaveModal.js deleted file mode 100644 index 1f804b87c..000000000 --- a/frontend/app/components/BugFinder/ManageFilters/SaveModal.js +++ /dev/null @@ -1,100 +0,0 @@ -import { connect } from 'react-redux'; -import { Button, Modal, Form, Icon, Checkbox } from 'UI'; -import styles from './saveModal.css'; - -@connect(state => ({ - loading: state.getIn([ 'funnels', 'saveRequest', 'loading' ]) || state.getIn([ 'funnels', 'updateRequest', 'loading' ]), -})) -export default class SaveModal extends React.PureComponent { - state = { name: 'Untitled', isPublic: false }; - static getDerivedStateFromProps(props) { - if (!props.saveModalOpen) { - return { - name: props.appliedFilter.name || 'Untitled', - }; - } - return null; - } - - onNameChange = ({ target: { value } }) => { - this.setState({ name: value }); - }; - - onChangeOption = (e, { checked, name }) => this.setState({ [ name ]: !this.state.isPublic }) - - onSave = () => { - const { toggleFilterModal } = this.props; - const { name, isPublic } = this.state; - if (name.trim() === '') return; - this.props.updateFilter(name.trim(), isPublic); - } - - render() { - const { - saveModalOpen, - appliedFilter, - toggleFilterModal, - loading, - } = this.props; - const { name, isPublic } = this.state; - - return ( - - -
    { 'Save Funnel' }
    - toggleFilterModal(false) } - /> -
    - - - - - - - - - -
    - this.setState({ 'isPublic' : !isPublic }) } - className="mr-3" - /> -
    this.setState({ 'isPublic' : !isPublic }) }> - - Team Visible -
    -
    -
    - -
    - - - - -
    - ); - } -} diff --git a/frontend/app/components/BugFinder/ManageFilters/SavedFilterList.js b/frontend/app/components/BugFinder/ManageFilters/SavedFilterList.js deleted file mode 100644 index b372c6d1f..000000000 --- a/frontend/app/components/BugFinder/ManageFilters/SavedFilterList.js +++ /dev/null @@ -1,17 +0,0 @@ -import styles from './savedFilterList.css'; - -export default ({ savedFilters, activeFilter, onFilterClick }) => ( -
    - { savedFilters && savedFilters.size > 0 && - savedFilters.map((filter, index) => filter && -
    onFilterClick(filter) } - key={ index } - > - { filter.name } -
    ) - } -
    -); diff --git a/frontend/app/components/BugFinder/ManageFilters/activeFilterDetails.css b/frontend/app/components/BugFinder/ManageFilters/activeFilterDetails.css deleted file mode 100644 index 4b07bb60a..000000000 --- a/frontend/app/components/BugFinder/ManageFilters/activeFilterDetails.css +++ /dev/null @@ -1,85 +0,0 @@ -.userEvents { - & .list { - margin-top: 10px; - margin-bottom: 10px; - border: solid thin $gray-light; - border-radius: 3px; - background-color: white; - & .filterType { - border-bottom: solid thin $gray-light; - padding: 8px 10px; - align-items: center; - - & .value { - max-width: 200px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - &:last-child { - border-bottom: none; - } - - & .indexCount { - width: 20px; - height: 20px; - background-color: white; - border-radius: 50%; - margin-right: 10px; - box-shadow: 0 1px 5px 0 $gray-light; - display: flex; - align-items: center; - justify-content: center; - font-size: 10px; - } - } - } -} - -.filterDetails { - width: 400px; - padding: 20px; - - & .title { - font-size: 20px; - margin-bottom: 25px; - } -} - -.filterType { - display: flex; - align-items: start; - padding: 10px 0; - font-size: 12px; -} - -.filterLabel { - font-weight: bold; - width: 100px; - flex-grow: 0; - flex-shrink: 0; -} - -.eventsBadge { - display: flex; - align-items: center; - flex-wrap: wrap; -} - -.footer { - margin-top: 30px; -} - -.badge { - padding: 5px 10px; - background-color: $gray-light; - margin-right: 10px; - border-radius: 3px; - font-size: 12px; - /* margin-bottom: 10px; */ -} - -[data-hidden=true] { - display: none; -} \ No newline at end of file diff --git a/frontend/app/components/BugFinder/ManageFilters/index.js b/frontend/app/components/BugFinder/ManageFilters/index.js deleted file mode 100644 index d890d9507..000000000 --- a/frontend/app/components/BugFinder/ManageFilters/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './ManageFilters'; diff --git a/frontend/app/components/BugFinder/ManageFilters/savedFilterList.css b/frontend/app/components/BugFinder/ManageFilters/savedFilterList.css deleted file mode 100644 index 9c5110038..000000000 --- a/frontend/app/components/BugFinder/ManageFilters/savedFilterList.css +++ /dev/null @@ -1,17 +0,0 @@ -.filter { - padding: 15px; - cursor: pointer; - border-top: solid thin $gray-light; - border-bottom: solid thin transparent; - transition: all 0.3s; - - &:last-child { - border-bottom: solid thin $gray-light; - } - - &[data-active=true], - &:hover { - background-color: $active-blue; - transition: all 0.2s; - } -} \ No newline at end of file diff --git a/frontend/app/components/BugFinder/SessionCaptureRate/SessionCaptureRate.js b/frontend/app/components/BugFinder/SessionCaptureRate/SessionCaptureRate.js deleted file mode 100644 index f545bcacd..000000000 --- a/frontend/app/components/BugFinder/SessionCaptureRate/SessionCaptureRate.js +++ /dev/null @@ -1,80 +0,0 @@ -import React, { useState } from 'react' -import { Input, Slider, Button, Popup, CircularLoader } from 'UI'; -import { saveCaptureRate, editCaptureRate } from 'Duck/watchdogs'; -import { connect } from 'react-redux'; -import stl from './sessionCaptureRate.css'; - -function isPercent(val) { - if (isNaN(+val)) return false; - if (+val > 100 || +val < 0) return false; - return true; -} - -const SessionCaptureRate = props => { - const { captureRate, saveCaptureRate, editCaptureRate, loading, onClose } = props; - const _sampleRate = captureRate.get('rate'); - if (_sampleRate == null) return null; - - const [sampleRate, setSampleRate] = useState(_sampleRate) - - const captureAll = captureRate.get('captureAll'); - - const onSampleRateChange = (e) => { - saveCaptureRate({ rate: sampleRate, captureAll: captureAll }).then(onClose); - } - const onCaptureAllChange = () => saveCaptureRate({ rate: sampleRate, captureAll: !captureAll }); - - return ( -
    - - } - content={ `Capture All` } - size="tiny" - inverted - position="top center" - /> - { !captureAll && ( -
    - isPercent(value) && setSampleRate(+value) } - size="small" - className={stl.inputField} - /> -
    - - -
    -
    - )} -
    - ) -} - -export default connect(state => ({ - currentProjectId: state.getIn([ 'site', 'siteId' ]), - captureRate: state.getIn(['watchdogs', 'captureRate']), - loading: state.getIn(['watchdogs', 'savingCaptureRate', 'loading']), -}), { - saveCaptureRate, editCaptureRate -})(SessionCaptureRate); \ No newline at end of file diff --git a/frontend/app/components/BugFinder/SessionCaptureRate/index.js b/frontend/app/components/BugFinder/SessionCaptureRate/index.js deleted file mode 100644 index aadc24425..000000000 --- a/frontend/app/components/BugFinder/SessionCaptureRate/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './SessionCaptureRate'; \ No newline at end of file diff --git a/frontend/app/components/BugFinder/SessionCaptureRate/sessionCaptureRate.css b/frontend/app/components/BugFinder/SessionCaptureRate/sessionCaptureRate.css deleted file mode 100644 index 6ad48ee08..000000000 --- a/frontend/app/components/BugFinder/SessionCaptureRate/sessionCaptureRate.css +++ /dev/null @@ -1,13 +0,0 @@ -.inputField { - max-width: 140px !important; - & label { - font-weight: 300 !important; - } - & input { - max-width: 70px !important; - } -} - -.customSlider { - line-height: 20px !important; -} \ No newline at end of file diff --git a/frontend/app/components/BugFinder/SessionFlowList/SessionFlowList.js b/frontend/app/components/BugFinder/SessionFlowList/SessionFlowList.js deleted file mode 100644 index f4962573a..000000000 --- a/frontend/app/components/BugFinder/SessionFlowList/SessionFlowList.js +++ /dev/null @@ -1,33 +0,0 @@ -import React from 'react' -import { connect } from 'react-redux' -import { Loader, NoContent } from 'UI'; -import SessionStack from 'Shared/SessionStack/SessionStack' -import FunnelListHeader from 'Components/Funnels/FunnelListHeader'; - -function SessionFlowList({ activeTab, savedFilters, loading }) { - return ( -
    - - - - {savedFilters.map(item => ( -
    - -
    - ))} -
    -
    -
    - ) -} - -export default connect(state => ({ - loading: state.getIn([ 'filters', 'fetchListRequest', 'loading' ]), - activeTab: state.getIn([ 'sessions', 'activeTab' ]), - savedFilters: state.getIn([ 'filters', 'list' ]), -}), {})(SessionFlowList) diff --git a/frontend/app/components/BugFinder/SessionFlowList/index.js b/frontend/app/components/BugFinder/SessionFlowList/index.js deleted file mode 100644 index f43dd9c40..000000000 --- a/frontend/app/components/BugFinder/SessionFlowList/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './SessionFlowList' \ No newline at end of file diff --git a/frontend/app/components/BugFinder/SessionList/SessionList.js b/frontend/app/components/BugFinder/SessionList/SessionList.js index 64bf722f4..47f02e5f5 100644 --- a/frontend/app/components/BugFinder/SessionList/SessionList.js +++ b/frontend/app/components/BugFinder/SessionList/SessionList.js @@ -1,10 +1,12 @@ +import React from 'react'; import { connect } from 'react-redux'; -import { Loader, NoContent, Button, Pagination } from 'UI'; +import { Loader, NoContent, Pagination } from 'UI'; import { applyFilter, addAttribute, addEvent } from 'Duck/filters'; import { fetchSessions, addFilterByKeyAndValue, updateCurrentPage, setScrollPosition } from 'Duck/search'; import SessionItem from 'Shared/SessionItem'; import SessionListHeader from './SessionListHeader'; import { FilterKey } from 'Types/filter/filterType'; +import AnimatedSVG, { ICONS } from 'Shared/AnimatedSVG/AnimatedSVG'; // const ALL = 'all'; const PER_PAGE = 10; @@ -94,24 +96,16 @@ export default class SessionList extends React.PureComponent { return ( + + {this.getNoContentMessage(activeTab)} +
    } // subtext="Please try changing your search parameters." - animatedIcon="no-results" + // animatedIcon="no-results" show={ !loading && list.size === 0} subtext={
    Please try changing your search parameters.
    - {/* {allList.size > 0 && ( -
    - However, we found other sessions based on your search parameters. -
    - -
    -
    - )} */}
    } > @@ -142,18 +136,6 @@ export default class SessionList extends React.PureComponent { render() { const { activeTab, allList, total } = this.props; - // var filteredList; - - // if (activeTab.type !== ALL && activeTab.type !== 'bookmark' && activeTab.type !== 'live') { // Watchdog sessions - // filteredList = allList.filter(session => activeTab.fits(session)) - // } else { - // filteredList = allList - // } - - // if (activeTab.type === 'bookmark') { - // filteredList = filteredList.filter(item => item.favorite) - // } - // const _total = activeTab.type === 'all' ? total : allList.size return (
    diff --git a/frontend/app/components/BugFinder/SessionList/SessionListFooter.js b/frontend/app/components/BugFinder/SessionList/SessionListFooter.js index e9fc16cab..2d8edd726 100644 --- a/frontend/app/components/BugFinder/SessionList/SessionListFooter.js +++ b/frontend/app/components/BugFinder/SessionList/SessionListFooter.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; import { Button } from 'UI'; -import styles from './sessionListFooter.css'; +import styles from './sessionListFooter.module.css'; const SessionListFooter = ({ displayedCount, totalCount, loading, onLoadMoreClick, diff --git a/frontend/app/components/BugFinder/SessionList/SessionListHeader.js b/frontend/app/components/BugFinder/SessionList/SessionListHeader.js index eba5ad002..167b448f5 100644 --- a/frontend/app/components/BugFinder/SessionList/SessionListHeader.js +++ b/frontend/app/components/BugFinder/SessionList/SessionListHeader.js @@ -1,14 +1,11 @@ -import React, { useEffect } from 'react'; +import React from 'react'; import { connect } from 'react-redux'; -import { applyFilter } from 'Duck/filters'; import SortDropdown from '../Filters/SortDropdown'; -import DateRange from '../DateRange'; -import { TimezoneDropdown } from 'UI'; import { numberWithCommas } from 'App/utils'; -import DropdownPlain from 'Shared/DropdownPlain'; +import SelectDateRange from 'Shared/SelectDateRange'; +import { applyFilter } from 'Duck/search'; +import Period from 'Types/app/period'; -const DEFAULT_SORT = 'startTs'; -const DEFAULT_ORDER = 'desc'; const sortOptionsMap = { 'startTs-desc': 'Newest', 'startTs-asc': 'Oldest', @@ -16,16 +13,22 @@ const sortOptionsMap = { 'eventsCount-desc': 'Events Descending', }; const sortOptions = Object.entries(sortOptionsMap) - .map(([ value, text ]) => ({ value, text })); + .map(([ value, label ]) => ({ value, label })); function SessionListHeader({ activeTab, count, applyFilter, - ...props + filter, }) { - // useEffect(() => { applyFilter({ sort: DEFAULT_SORT, order: DEFAULT_ORDER }) }, []) + const { startDate, endDate, rangeValue } = filter; + const period = new Period({ start: startDate, end: endDate, rangeName: rangeValue }); + + const onDateChange = (e) => { + const dateValues = e.toJSON(); + applyFilter(dateValues); + }; return (
    @@ -36,22 +39,14 @@ function SessionListHeader({ { activeTab.type !== 'bookmark' && (
    Sessions Captured in - +
    )}
    - {/*
    - Session View - {}} - value='list' - /> -
    */}
    Sort By @@ -63,4 +58,6 @@ function SessionListHeader({ export default connect(state => ({ activeTab: state.getIn([ 'search', 'activeTab' ]), + period: state.getIn([ 'search', 'period' ]), + filter: state.getIn([ 'search', 'instance' ]), }), { applyFilter })(SessionListHeader); diff --git a/frontend/app/components/BugFinder/SessionList/Tooltip.js b/frontend/app/components/BugFinder/SessionList/Tooltip.js index 7d500d0c0..a054b0beb 100644 --- a/frontend/app/components/BugFinder/SessionList/Tooltip.js +++ b/frontend/app/components/BugFinder/SessionList/Tooltip.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Popup } from 'UI'; export default class Tooltip extends React.PureComponent { @@ -26,15 +27,14 @@ export default class Tooltip extends React.PureComponent { open={ open } content={ tooltip } inverted - trigger={ - - { trigger } - - } - /> + > + + { trigger } + + ); } } \ No newline at end of file diff --git a/frontend/app/components/BugFinder/SessionList/sessionList.css b/frontend/app/components/BugFinder/SessionList/sessionList.module.css similarity index 100% rename from frontend/app/components/BugFinder/SessionList/sessionList.css rename to frontend/app/components/BugFinder/SessionList/sessionList.module.css diff --git a/frontend/app/components/BugFinder/SessionList/sessionListFooter.css b/frontend/app/components/BugFinder/SessionList/sessionListFooter.module.css similarity index 100% rename from frontend/app/components/BugFinder/SessionList/sessionListFooter.css rename to frontend/app/components/BugFinder/SessionList/sessionListFooter.module.css diff --git a/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js b/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js index 8d3b4b174..8cec3cb1a 100644 --- a/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js +++ b/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js @@ -1,9 +1,8 @@ import React from 'react' import { connect } from 'react-redux'; -import { Tooltip } from 'react-tippy' import cn from 'classnames'; -import { SideMenuitem, SavedSearchList, Progress, Popup } from 'UI' -import stl from './sessionMenu.css'; +import { SideMenuitem, SavedSearchList, Popup } from 'UI' +import stl from './sessionMenu.module.css'; import { clearEvents } from 'Duck/filters'; import { issues_types } from 'Types/session/issue' import { fetchList as fetchSessionList } from 'Duck/sessions'; @@ -25,32 +24,13 @@ function SessionsMenu(props) { Sessions
    showModal(, { right: true })}> - Configure the percentage of sessions
    to be captured, timezone and more.
    } + content={Configure the percentage of sessions
    to be captured, timezone and more.
    } > Settings - + - {/* { !capturingAll && ( - - -
    - } - content={ `Capturing ${props.captureRate.get('rate')}% of all sessions. Click to manage capture rate. ` } - size="tiny" - inverted - position="top right" - /> - )} */}
    diff --git a/frontend/app/components/BugFinder/SessionsMenu/sessionMenu.css b/frontend/app/components/BugFinder/SessionsMenu/sessionMenu.module.css similarity index 100% rename from frontend/app/components/BugFinder/SessionsMenu/sessionMenu.css rename to frontend/app/components/BugFinder/SessionsMenu/sessionMenu.module.css diff --git a/frontend/app/components/BugFinder/TabItem/TabItem.js b/frontend/app/components/BugFinder/TabItem/TabItem.js index 302f6e2e8..cf1202046 100644 --- a/frontend/app/components/BugFinder/TabItem/TabItem.js +++ b/frontend/app/components/BugFinder/TabItem/TabItem.js @@ -1,7 +1,7 @@ import React from 'react'; import cn from 'classnames'; import { Icon } from 'UI'; -import stl from './tabItem.css'; +import stl from './tabItem.module.css'; const TabItem = ({ icon, label, count, iconColor = 'teal', active = false, leading, ...rest }) => { return ( diff --git a/frontend/app/components/BugFinder/TabItem/tabItem.css b/frontend/app/components/BugFinder/TabItem/tabItem.module.css similarity index 100% rename from frontend/app/components/BugFinder/TabItem/tabItem.css rename to frontend/app/components/BugFinder/TabItem/tabItem.module.css diff --git a/frontend/app/components/BugFinder/WatchDogs/components/JobCard/JobCard.js b/frontend/app/components/BugFinder/WatchDogs/components/JobCard/JobCard.js deleted file mode 100644 index d0229e761..000000000 --- a/frontend/app/components/BugFinder/WatchDogs/components/JobCard/JobCard.js +++ /dev/null @@ -1,34 +0,0 @@ -import React from 'react'; -import { Icon, CircularLoader } from 'UI'; - -const JobCard = ({ className, job, ...rest }) => { - return ( -
    -
    -
    { job.name }
    -
    { job.isInProgress() ? - : - }
    -
    -
    - Sessions: { job.sessionsCount } -
    -
    - Period: { job.period() } -
    - -
    -
    - - { job.createdAt.toFormat('LLL dd, yyyy') } -
    -
    - - { job.user && job.user.name } -
    -
    -
    - ); -}; - -export default JobCard; diff --git a/frontend/app/components/BugFinder/WatchDogs/components/JobCard/JobCard.stories.js b/frontend/app/components/BugFinder/WatchDogs/components/JobCard/JobCard.stories.js deleted file mode 100644 index 6b4d263e4..000000000 --- a/frontend/app/components/BugFinder/WatchDogs/components/JobCard/JobCard.stories.js +++ /dev/null @@ -1,13 +0,0 @@ -import JobCard from './JobCard'; - -const job = { - name: "Job Name", - sessionsCount: 32000, - userName: 'Username' -} - -export default { - title: 'WatchDog|JobCard', -}; - -export const empty = () => ; diff --git a/frontend/app/components/BugFinder/WatchDogs/components/JobCard/index.js b/frontend/app/components/BugFinder/WatchDogs/components/JobCard/index.js deleted file mode 100644 index e769eaf64..000000000 --- a/frontend/app/components/BugFinder/WatchDogs/components/JobCard/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './JobCard' \ No newline at end of file diff --git a/frontend/app/components/BugFinder/WatchDogs/components/JobForm/JobForm.js b/frontend/app/components/BugFinder/WatchDogs/components/JobForm/JobForm.js deleted file mode 100644 index 17bbf4143..000000000 --- a/frontend/app/components/BugFinder/WatchDogs/components/JobForm/JobForm.js +++ /dev/null @@ -1,109 +0,0 @@ -import React from 'react'; -import { Form, Input, Button } from 'UI'; -import { connect } from 'react-redux'; -import { save, edit } from 'Duck/rehydrate'; -import DatePicker from 'react-datepicker'; - -class JobForm extends React.PureComponent { - constructor(props) { - super(props); - this.state = { }; - } - - write = ({ target: { name, value } }) => this.props.edit({ [ name ]: value }); - writeOption = (e, { name, value }) => this.props.edit({ [ name ]: value }); - onSubmit = () => { - this.props.save(this.props.instance).then(() => this.props.onCancel()) - } - - handleStartDateChange = (startAt) => { - const { endAt: currentEndDate } = this.state; - const endAt = currentEndDate - startAt > 0 - ? currentEndDate - : new Date(); - this.setState({ startAt, endAt }); - this.props.edit({ startAt: startAt.getTime(), endAt: endAt.getTime() }) - } - - handleEndDateChange = (endAt) => { - this.setState({ endAt }); - this.props.edit({ endAt: endAt.getTime() }) - } - - render() { - const { instance = {}, creating, onCancel, saving } = this.props; - const { startAt, endAt } = this.state; - const now = new Date(); - return ( -
    - - - - - - -
    -
    - - -
    -
    - - -
    -
    -
    - - - - - - ); - } -} - -export default connect(state => ({ - instance: state.getIn(['rehydrate', 'instance']), - saving: state.getIn(['rehydrate', 'saveRequest', 'loading']) -}), { save, edit })(JobForm); diff --git a/frontend/app/components/BugFinder/WatchDogs/components/JobForm/JobForm.stories.js b/frontend/app/components/BugFinder/WatchDogs/components/JobForm/JobForm.stories.js deleted file mode 100644 index ac1b2267f..000000000 --- a/frontend/app/components/BugFinder/WatchDogs/components/JobForm/JobForm.stories.js +++ /dev/null @@ -1,7 +0,0 @@ -import JobForm from './JobForm'; - -export default { - title: 'WatchDog|JobForm', -}; - -export const empty = () =>
    ; diff --git a/frontend/app/components/BugFinder/WatchDogs/components/JobForm/index.js b/frontend/app/components/BugFinder/WatchDogs/components/JobForm/index.js deleted file mode 100644 index 6c2a904df..000000000 --- a/frontend/app/components/BugFinder/WatchDogs/components/JobForm/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './JobForm' \ No newline at end of file diff --git a/frontend/app/components/BugFinder/WatchDogs/components/RehydrateSlidePanel/RehydrateSlidePanel.js b/frontend/app/components/BugFinder/WatchDogs/components/RehydrateSlidePanel/RehydrateSlidePanel.js deleted file mode 100644 index 50360b7d8..000000000 --- a/frontend/app/components/BugFinder/WatchDogs/components/RehydrateSlidePanel/RehydrateSlidePanel.js +++ /dev/null @@ -1,46 +0,0 @@ -import React, { useState } from 'react'; -import { connect } from 'react-redux'; -import { SlideModal } from 'UI'; -import { fetchList, init } from 'Duck/rehydrate'; -import SessionCaptureRate from '../../../SessionCaptureRate'; - -const RehydrateSlidePanel = props => { - const { onClose, list, isModalDisplayed = true, users } = props; - const [showDetail, setShowDetail] = useState(false) - - list.map(job => job.user = users.filter(user => user.id === job.createdBy).first()) - - const showDetailsForm = (job) => { - props.init(job); - setShowDetail(true); - } - - return ( - - { 'Sessions Capture Rate' } -
    - } - isDisplayed={ isModalDisplayed } - onClose={ onClose } - size="small" - content={ - isModalDisplayed && ( -
    -
    -
    -
    { 'What percentage of your user sessions do you want to record and monitor?' }
    - -
    -
    - ) - } - /> - ); -}; - -export default connect(state => ({ - list: state.getIn(['rehydrate', 'list']), - users: state.getIn([ 'members', 'list' ]).filter(u => u.id), -}), { fetchList, init })(RehydrateSlidePanel); diff --git a/frontend/app/components/BugFinder/WatchDogs/components/RehydrateSlidePanel/RehydrateSlidePanel.stories.js b/frontend/app/components/BugFinder/WatchDogs/components/RehydrateSlidePanel/RehydrateSlidePanel.stories.js deleted file mode 100644 index 3c288d5b5..000000000 --- a/frontend/app/components/BugFinder/WatchDogs/components/RehydrateSlidePanel/RehydrateSlidePanel.stories.js +++ /dev/null @@ -1,8 +0,0 @@ -import RehydrateSlidePanel from './RehydrateSlidePanel'; - -export default { - title: 'Watchdog|RehydrateSlidePanel', -}; - -export const empty = () =>
    ; - diff --git a/frontend/app/components/BugFinder/WatchDogs/components/RehydrateSlidePanel/index.js b/frontend/app/components/BugFinder/WatchDogs/components/RehydrateSlidePanel/index.js deleted file mode 100644 index 66bba354b..000000000 --- a/frontend/app/components/BugFinder/WatchDogs/components/RehydrateSlidePanel/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './RehydrateSlidePanel'; \ No newline at end of file diff --git a/frontend/app/components/BugFinder/WatchDogs/components/index.js b/frontend/app/components/BugFinder/WatchDogs/components/index.js deleted file mode 100644 index 400dcf390..000000000 --- a/frontend/app/components/BugFinder/WatchDogs/components/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default as RehydrateSlidePanel } from './RehydrateSlidePanel' \ No newline at end of file diff --git a/frontend/app/components/BugFinder/bugFinder.css b/frontend/app/components/BugFinder/bugFinder.module.css similarity index 100% rename from frontend/app/components/BugFinder/bugFinder.css rename to frontend/app/components/BugFinder/bugFinder.module.css diff --git a/frontend/app/components/BugFinder/filterSelectionButton.css b/frontend/app/components/BugFinder/filterSelectionButton.module.css similarity index 100% rename from frontend/app/components/BugFinder/filterSelectionButton.css rename to frontend/app/components/BugFinder/filterSelectionButton.module.css diff --git a/frontend/app/components/BugFinder/findBlock.css b/frontend/app/components/BugFinder/findBlock.css deleted file mode 100644 index ef04b7814..000000000 --- a/frontend/app/components/BugFinder/findBlock.css +++ /dev/null @@ -1,26 +0,0 @@ - -@import 'mixins.css'; - -.clearStepsButton { - margin-right: 10px; -} - -.findBlock { - display: flex; - align-items: center; - justify-content: space-between; - margin-right: auto; - &[data-hide=true] { - display: none; - } - - & .findButton { - text-transform: uppercase; - } - - & button { - height: 23px !important; - padding: 0px 15px !important; - font-size: 12px !important; - } -} \ No newline at end of file diff --git a/frontend/app/components/BugFinder/insights.css b/frontend/app/components/BugFinder/insights.module.css similarity index 100% rename from frontend/app/components/BugFinder/insights.css rename to frontend/app/components/BugFinder/insights.module.css diff --git a/frontend/app/components/BugFinder/listHeader.css b/frontend/app/components/BugFinder/listHeader.module.css similarity index 100% rename from frontend/app/components/BugFinder/listHeader.css rename to frontend/app/components/BugFinder/listHeader.module.css diff --git a/frontend/app/components/BugFinder/managerFitler.stories.js b/frontend/app/components/BugFinder/managerFitler.stories.js deleted file mode 100644 index 85d3a257e..000000000 --- a/frontend/app/components/BugFinder/managerFitler.stories.js +++ /dev/null @@ -1,40 +0,0 @@ -import { storiesOf } from '@storybook/react'; -import { List } from 'immutable'; -import Filter from 'Types/filter'; -import ActiveFilterDetails from './ManageFilters/ActiveFilterDetails'; -import SavedFilterList from './ManageFilters/SavedFilterList'; - -const savedFilters = List([ - Filter({ - id: 1, - name: 'First Filter', - events: [ - {type: 'CLICK', value: 'test'}, - {type: 'CLICK', value: 'test'}, - {type: 'CLICK', value: 'this is some long test to test the text overflow, should show ellipsis'} - ], - userCountry: 'IN', userBrowser: 'Chrome', userOs: 'windows' - }), - Filter({ - id: 2, - name: 'Second Filter', - events: [ - {type: 'CLICK', value: 'test'}, - {type: 'CLICK', value: 'test'}, - {type: 'CLICK', value: 'this is some long test to test the text overflow, should show ellipsis'} - ], - userCountry: 'IN', userBrowser: 'Chrome', userOs: 'windows' - })] -) -storiesOf('ManageFilter', module) - .add('Filter Details', () => ( - - )) - .add('FilterList', () => ( - - )) - diff --git a/frontend/app/components/Client/Audit/AuditList/AuditList.tsx b/frontend/app/components/Client/Audit/AuditList/AuditList.tsx index 5ab4c0d3a..41f413f1e 100644 --- a/frontend/app/components/Client/Audit/AuditList/AuditList.tsx +++ b/frontend/app/components/Client/Audit/AuditList/AuditList.tsx @@ -5,6 +5,7 @@ import React, { useEffect } from 'react'; import { Loader, Pagination, NoContent } from 'UI'; import AuditDetailModal from '../AuditDetailModal'; import AuditListItem from '../AuditListItem'; +import AnimatedSVG, { ICONS } from 'Shared/AnimatedSVG/AnimatedSVG'; interface Props { @@ -18,7 +19,6 @@ function AuditList(props: Props) { const order = useObserver(() => auditStore.order); const period = useObserver(() => auditStore.period); const { showModal } = useModal(); - console.log('AuditList', period.toTimestamps()); useEffect(() => { const { startTimestamp, endTimestamp } = period.toTimestamps(); @@ -34,7 +34,15 @@ function AuditList(props: Props) { return useObserver(() => ( - + + +
    No data available.
    +
    + } + >
    Name
    Status
    diff --git a/frontend/app/components/Client/Audit/AuditSearchField/AuditSearchField.tsx b/frontend/app/components/Client/Audit/AuditSearchField/AuditSearchField.tsx index 5574da847..b410e12eb 100644 --- a/frontend/app/components/Client/Audit/AuditSearchField/AuditSearchField.tsx +++ b/frontend/app/components/Client/Audit/AuditSearchField/AuditSearchField.tsx @@ -1,5 +1,5 @@ import React, { useEffect } from 'react'; -import { Icon } from 'UI'; +import { Icon, Input } from 'UI'; import { debounce } from 'App/utils'; let debounceUpdate: any = () => {} @@ -20,11 +20,12 @@ function AuditSearchField(props: Props) { return (
    -
    ); diff --git a/frontend/app/components/Client/Audit/AuditView/AuditView.tsx b/frontend/app/components/Client/Audit/AuditView/AuditView.tsx index 41d506b11..6d427bb00 100644 --- a/frontend/app/components/Client/Audit/AuditView/AuditView.tsx +++ b/frontend/app/components/Client/Audit/AuditView/AuditView.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { PageTitle, Icon } from 'UI'; +import { PageTitle, Icon, Button } from 'UI'; import AuditList from '../AuditList'; import AuditSearchField from '../AuditSearchField'; import { useStore } from 'App/mstore'; @@ -49,10 +49,10 @@ function AuditView(props) {
    auditStore.updateKey('searchQuery', value) }/>
    - +
    diff --git a/frontend/app/components/Client/Client.js b/frontend/app/components/Client/Client.js index c58056b5f..adae9f536 100644 --- a/frontend/app/components/Client/Client.js +++ b/frontend/app/components/Client/Client.js @@ -1,3 +1,4 @@ +import React from 'react'; import { connect } from 'react-redux'; import { withRouter } from 'react-router-dom'; import { Switch, Route, Redirect } from 'react-router'; @@ -6,35 +7,29 @@ import { fetchList as fetchMemberList } from 'Duck/member'; import ProfileSettings from './ProfileSettings'; import Integrations from './Integrations'; -import ManageUsers from './ManageUsers'; import UserView from './Users/UsersView'; import AuditView from './Audit/AuditView'; import Sites from './Sites'; import CustomFields from './CustomFields'; import Webhooks from './Webhooks'; -import styles from './client.css'; +import styles from './client.module.css'; import cn from 'classnames'; import PreferencesMenu from './PreferencesMenu'; import Notifications from './Notifications'; import Roles from './Roles'; -@connect((state) => ({ - appearance: state.getIn([ 'user', 'account', 'appearance' ]), -}), { - fetchMemberList, -}) +@connect(null, { fetchMemberList, }) @withRouter export default class Client extends React.PureComponent { constructor(props){ super(props); - // props.fetchMemberList(); } setTab = (tab) => { this.props.history.push(clientRoute(tab)); } - renderActiveTab = (appearance) => ( + renderActiveTab = () => ( @@ -50,7 +45,7 @@ export default class Client extends React.PureComponent { ) render() { - const { match: { params: { activeTab } }, appearance } = this.props; + const { match: { params: { activeTab } } } = this.props; return (
    @@ -58,7 +53,7 @@ export default class Client extends React.PureComponent {
    - { activeTab && this.renderActiveTab(appearance) } + { activeTab && this.renderActiveTab() }
    diff --git a/frontend/app/components/Client/CustomFields/CustomFieldForm.js b/frontend/app/components/Client/CustomFields/CustomFieldForm.js index e0b901392..76ee849d5 100644 --- a/frontend/app/components/Client/CustomFields/CustomFieldForm.js +++ b/frontend/app/components/Client/CustomFields/CustomFieldForm.js @@ -1,7 +1,8 @@ +import React from 'react'; import { connect } from 'react-redux'; import { edit, save } from 'Duck/customField'; -import { Form, Button, Message } from 'UI'; -import styles from './customFieldForm.css'; +import { Form, Input, Button, Message } from 'UI'; +import styles from './customFieldForm.module.css'; @connect(state => ({ field: state.getIn(['customFields', 'instance']), @@ -23,7 +24,7 @@ class CustomFieldForm extends React.PureComponent {
    - { this.focusElement = ref; } } name="key" value={ field.key } @@ -42,15 +43,14 @@ class CustomFieldForm extends React.PureComponent { onClick={ () => this.props.onSave(field) } disabled={ !field.validate() } loading={ this.props.saving } - primary - marginRight + variant="primary" + className="float-left mr-2" > { exists ? 'Update' : 'Add' } diff --git a/frontend/app/components/Client/CustomFields/CustomFields.js b/frontend/app/components/Client/CustomFields/CustomFields.js index cd4e06da0..c0983d38e 100644 --- a/frontend/app/components/Client/CustomFields/CustomFields.js +++ b/frontend/app/components/Client/CustomFields/CustomFields.js @@ -1,13 +1,15 @@ +import React from 'react'; import cn from 'classnames'; import { connect } from 'react-redux'; import withPageTitle from 'HOCs/withPageTitle'; import { IconButton, SlideModal, Loader, NoContent, Icon, TextLink } from 'UI'; import { init, fetchList, save, remove } from 'Duck/customField'; import SiteDropdown from 'Shared/SiteDropdown'; -import styles from './customFields.css'; +import styles from './customFields.module.css'; import CustomFieldForm from './CustomFieldForm'; import ListItem from './ListItem'; -import { confirm } from 'UI/Confirmation'; +import { confirm } from 'UI'; +import AnimatedSVG, { ICONS } from 'Shared/AnimatedSVG/AnimatedSVG'; @connect(state => ({ fields: state.getIn(['customFields', 'list']).sortBy(i => i.index), @@ -48,7 +50,7 @@ class CustomFields extends React.Component { this.setState({ showModal: true }); } - onChangeSelect = (event, { value }) => { + onChangeSelect = ({ value }) => { const site = this.props.sites.find(s => s.id === value); this.setState({ currentSite: site }) this.props.fetchList(site.id); @@ -97,10 +99,15 @@ class CustomFields extends React.Component { + +
    No data available.
    +
    + } size="small" show={ fields.size === 0 } - animatedIcon="empty-state" + // animatedIcon="empty-state" >
    { fields.filter(i => i.index).map(field => ( diff --git a/frontend/app/components/Client/CustomFields/ListItem.js b/frontend/app/components/Client/CustomFields/ListItem.js index a6841ad7e..ef806fc93 100644 --- a/frontend/app/components/Client/CustomFields/ListItem.js +++ b/frontend/app/components/Client/CustomFields/ListItem.js @@ -1,7 +1,7 @@ import React from 'react'; import cn from 'classnames' import { Icon } from 'UI'; -import styles from './listItem.css'; +import styles from './listItem.module.css'; const ListItem = ({ field, onEdit, onDelete, disabled }) => { return ( diff --git a/frontend/app/components/Client/CustomFields/customFieldForm.css b/frontend/app/components/Client/CustomFields/customFieldForm.module.css similarity index 100% rename from frontend/app/components/Client/CustomFields/customFieldForm.css rename to frontend/app/components/Client/CustomFields/customFieldForm.module.css diff --git a/frontend/app/components/Client/CustomFields/customFields.css b/frontend/app/components/Client/CustomFields/customFields.module.css similarity index 100% rename from frontend/app/components/Client/CustomFields/customFields.css rename to frontend/app/components/Client/CustomFields/customFields.module.css diff --git a/frontend/app/components/Client/CustomFields/listItem.css b/frontend/app/components/Client/CustomFields/listItem.module.css similarity index 100% rename from frontend/app/components/Client/CustomFields/listItem.css rename to frontend/app/components/Client/CustomFields/listItem.module.css diff --git a/frontend/app/components/Client/Integrations/AssistDoc/AssistDoc.js b/frontend/app/components/Client/Integrations/AssistDoc/AssistDoc.js index a0aef3cad..4cf2d0e7f 100644 --- a/frontend/app/components/Client/Integrations/AssistDoc/AssistDoc.js +++ b/frontend/app/components/Client/Integrations/AssistDoc/AssistDoc.js @@ -1,5 +1,5 @@ +import React from 'react'; import Highlight from 'react-highlight' -import ToggleContent from 'Shared/ToggleContent' import DocLink from 'Shared/DocLink/DocLink'; import AssistScript from './AssistScript' import AssistNpm from './AssistNpm' diff --git a/frontend/app/components/Client/Integrations/AxiosDoc/AxiosDoc.js b/frontend/app/components/Client/Integrations/AxiosDoc/AxiosDoc.js index 6d8233826..8fe32cfd0 100644 --- a/frontend/app/components/Client/Integrations/AxiosDoc/AxiosDoc.js +++ b/frontend/app/components/Client/Integrations/AxiosDoc/AxiosDoc.js @@ -1,3 +1,4 @@ +import React from 'react'; import Highlight from 'react-highlight' import ToggleContent from 'Shared/ToggleContent' import DocLink from 'Shared/DocLink/DocLink'; diff --git a/frontend/app/components/Client/Integrations/BugsnagForm/BugsnagForm.js b/frontend/app/components/Client/Integrations/BugsnagForm/BugsnagForm.js index b67af43c3..b1aba5a30 100644 --- a/frontend/app/components/Client/Integrations/BugsnagForm/BugsnagForm.js +++ b/frontend/app/components/Client/Integrations/BugsnagForm/BugsnagForm.js @@ -1,3 +1,4 @@ +import React from 'react'; import { tokenRE } from 'Types/integrations/bugsnagConfig'; import IntegrationForm from '../IntegrationForm'; import ProjectListDropdown from './ProjectListDropdown'; diff --git a/frontend/app/components/Client/Integrations/BugsnagForm/ProjectListDropdown.js b/frontend/app/components/Client/Integrations/BugsnagForm/ProjectListDropdown.js index bb4758f4d..c4b7f884b 100644 --- a/frontend/app/components/Client/Integrations/BugsnagForm/ProjectListDropdown.js +++ b/frontend/app/components/Client/Integrations/BugsnagForm/ProjectListDropdown.js @@ -1,3 +1,4 @@ +import React from 'react'; import { connect } from 'react-redux'; import { tokenRE } from 'Types/integrations/bugsnagConfig'; import { edit } from 'Duck/integrations/actions'; diff --git a/frontend/app/components/Client/Integrations/CloudwatchForm/CloudwatchForm.js b/frontend/app/components/Client/Integrations/CloudwatchForm/CloudwatchForm.js index e29e343f9..482167c72 100644 --- a/frontend/app/components/Client/Integrations/CloudwatchForm/CloudwatchForm.js +++ b/frontend/app/components/Client/Integrations/CloudwatchForm/CloudwatchForm.js @@ -1,3 +1,4 @@ +import React from 'react'; import { ACCESS_KEY_ID_LENGTH, SECRET_ACCESS_KEY_LENGTH } from 'Types/integrations/cloudwatchConfig'; import IntegrationForm from '../IntegrationForm'; import LogGroupDropdown from './LogGroupDropdown'; diff --git a/frontend/app/components/Client/Integrations/CloudwatchForm/LogGroupDropdown.js b/frontend/app/components/Client/Integrations/CloudwatchForm/LogGroupDropdown.js index 3617d58b7..640aa3de5 100644 --- a/frontend/app/components/Client/Integrations/CloudwatchForm/LogGroupDropdown.js +++ b/frontend/app/components/Client/Integrations/CloudwatchForm/LogGroupDropdown.js @@ -1,3 +1,4 @@ +import React from 'react'; import { connect } from 'react-redux'; import { ACCESS_KEY_ID_LENGTH, SECRET_ACCESS_KEY_LENGTH } from 'Types/integrations/cloudwatchConfig'; import { edit } from 'Duck/integrations/actions'; diff --git a/frontend/app/components/Client/Integrations/CloudwatchForm/RegionDropdown.js b/frontend/app/components/Client/Integrations/CloudwatchForm/RegionDropdown.js index 21d8ed05a..e96aff591 100644 --- a/frontend/app/components/Client/Integrations/CloudwatchForm/RegionDropdown.js +++ b/frontend/app/components/Client/Integrations/CloudwatchForm/RegionDropdown.js @@ -1,13 +1,15 @@ +import React from 'react'; import { regionLabels as labels } from 'Types/integrations/cloudwatchConfig'; -import { Dropdown } from 'UI'; +import Select from 'Shared/Select'; -const options = Object.keys(labels).map(key => ({ text: labels[ key ], value: key })); +const options = Object.keys(labels).map(key => ({ text: labels[ key ], label: key })); const RegionDropdown = props => ( - props.onChange({target})} + onChange={({ value }) => props.onChange({value})} selection + value={ options.find(option => option.value === props.value) } options={ options } /> ); diff --git a/frontend/app/components/Client/Integrations/DatadogForm.js b/frontend/app/components/Client/Integrations/DatadogForm.js index 11c1016d3..76ca0734d 100644 --- a/frontend/app/components/Client/Integrations/DatadogForm.js +++ b/frontend/app/components/Client/Integrations/DatadogForm.js @@ -1,3 +1,4 @@ +import React from 'react'; import IntegrationForm from './IntegrationForm'; import DocLink from 'Shared/DocLink/DocLink'; diff --git a/frontend/app/components/Client/Integrations/ElasticsearchForm.js b/frontend/app/components/Client/Integrations/ElasticsearchForm.js index 1f5316564..271ccefe1 100644 --- a/frontend/app/components/Client/Integrations/ElasticsearchForm.js +++ b/frontend/app/components/Client/Integrations/ElasticsearchForm.js @@ -1,3 +1,4 @@ +import React from 'react'; import { connect } from 'react-redux'; import IntegrationForm from './IntegrationForm'; import { withRequest } from 'HOCs'; diff --git a/frontend/app/components/Client/Integrations/FetchDoc/FetchDoc.js b/frontend/app/components/Client/Integrations/FetchDoc/FetchDoc.js index 8ba8e590d..8d9bbd5b9 100644 --- a/frontend/app/components/Client/Integrations/FetchDoc/FetchDoc.js +++ b/frontend/app/components/Client/Integrations/FetchDoc/FetchDoc.js @@ -1,3 +1,4 @@ +import React from 'react'; import Highlight from 'react-highlight' import ToggleContent from 'Shared/ToggleContent' import DocLink from 'Shared/DocLink/DocLink'; diff --git a/frontend/app/components/Client/Integrations/GithubForm.js b/frontend/app/components/Client/Integrations/GithubForm.js index 32bc42ceb..586ab3093 100644 --- a/frontend/app/components/Client/Integrations/GithubForm.js +++ b/frontend/app/components/Client/Integrations/GithubForm.js @@ -1,3 +1,4 @@ +import React from 'react'; import IntegrationForm from './IntegrationForm'; import DocLink from 'Shared/DocLink/DocLink'; diff --git a/frontend/app/components/Client/Integrations/GraphQLDoc/GraphQLDoc.js b/frontend/app/components/Client/Integrations/GraphQLDoc/GraphQLDoc.js index 7a964de3a..a9150bc44 100644 --- a/frontend/app/components/Client/Integrations/GraphQLDoc/GraphQLDoc.js +++ b/frontend/app/components/Client/Integrations/GraphQLDoc/GraphQLDoc.js @@ -1,3 +1,4 @@ +import React from 'react'; import Highlight from 'react-highlight' import DocLink from 'Shared/DocLink/DocLink'; import ToggleContent from 'Shared/ToggleContent'; diff --git a/frontend/app/components/Client/Integrations/IntegrationForm.js b/frontend/app/components/Client/Integrations/IntegrationForm.js index 239958233..a26576fc3 100644 --- a/frontend/app/components/Client/Integrations/IntegrationForm.js +++ b/frontend/app/components/Client/Integrations/IntegrationForm.js @@ -1,5 +1,6 @@ +import React from 'react'; import { connect } from 'react-redux'; -import { Select, Form, Button, Checkbox } from 'UI'; +import { Input, Form, Button, Checkbox } from 'UI'; import SiteDropdown from 'Shared/SiteDropdown'; import { save, init, edit, remove, fetchList } from 'Duck/integrations/actions'; @@ -32,7 +33,7 @@ export default class IntegrationForm extends React.PureComponent { this.props.edit(this.props.name, { [ key ]: value }) }; - onChangeSelect = (event, { value }) => { + onChangeSelect = ({ value }) => { const { sites, list, name } = this.props; const site = sites.find(s => s.id === value); this.setState({ currentSiteId: site.id }) @@ -106,7 +107,7 @@ export default class IntegrationForm extends React.PureComponent { : - { config.exists() ? 'Update' : 'Add' } - + {config.exists() && ( + + )}
    ); diff --git a/frontend/app/components/Client/Integrations/IntegrationItem.js b/frontend/app/components/Client/Integrations/IntegrationItem.js index e75eb6c37..e4179855e 100644 --- a/frontend/app/components/Client/Integrations/IntegrationItem.js +++ b/frontend/app/components/Client/Integrations/IntegrationItem.js @@ -1,7 +1,7 @@ import React from 'react'; import cn from 'classnames'; import { Icon } from 'UI'; -import stl from './integrationItem.css'; +import stl from './integrationItem.module.css'; const onDocLinkClick = (e, link) => { e.stopPropagation(); diff --git a/frontend/app/components/Client/Integrations/Integrations.js b/frontend/app/components/Client/Integrations/Integrations.js index 855ff8511..00bbac68b 100644 --- a/frontend/app/components/Client/Integrations/Integrations.js +++ b/frontend/app/components/Client/Integrations/Integrations.js @@ -1,3 +1,4 @@ +import React from 'react'; import { connect } from 'react-redux'; import withPageTitle from 'HOCs/withPageTitle'; import { Loader, IconButton, Button, Icon, SlideModal } from 'UI'; @@ -19,7 +20,7 @@ import CloudwatchForm from './CloudwatchForm'; import ElasticsearchForm from './ElasticsearchForm'; import SumoLogicForm from './SumoLogicForm'; import JiraForm from './JiraForm'; -import styles from './integrations.css'; +import styles from './integrations.module.css'; import ReduxDoc from './ReduxDoc'; import VueDoc from './VueDoc'; import GraphQLDoc from './GraphQLDoc'; @@ -367,7 +368,7 @@ export default class Integrations extends React.PureComponent { title="Github" description="Easily share issues on GitHub directly from any session replay." icon="integrations/github" - url={ `https://auth.openreplay.com/oauth/login?provider=github&back_url=${window.ENV.ORIGIN}` } + url={ `https://auth.openreplay.com/oauth/login?provider=github&back_url=${window.env.ORIGIN}` } onClick={ () => this.showIntegrationConfig(GITHUB) } integrated={ issuesIntegrated } deleteHandler={issuesIntegrated ? () => this.deleteHandler('issues') : null} diff --git a/frontend/app/components/Client/Integrations/JiraForm/JiraForm.js b/frontend/app/components/Client/Integrations/JiraForm/JiraForm.js index 867ebbcd1..dc4585872 100644 --- a/frontend/app/components/Client/Integrations/JiraForm/JiraForm.js +++ b/frontend/app/components/Client/Integrations/JiraForm/JiraForm.js @@ -1,3 +1,4 @@ +import React from 'react'; import IntegrationForm from '../IntegrationForm'; import DocLink from 'Shared/DocLink/DocLink'; diff --git a/frontend/app/components/Client/Integrations/JiraForm/ProjectDropdown.js b/frontend/app/components/Client/Integrations/JiraForm/ProjectDropdown.js deleted file mode 100644 index b41eb543e..000000000 --- a/frontend/app/components/Client/Integrations/JiraForm/ProjectDropdown.js +++ /dev/null @@ -1,67 +0,0 @@ -import { connect } from 'react-redux'; -import { edit } from 'Duck/integrations/actions'; -import { Dropdown } from 'UI'; -import { withRequest } from 'HOCs'; - -@connect(state => ({ - config: state.getIn([ 'issues', 'list' ]) -}), { edit }) -@withRequest({ - dataName: "values", - initialData: [], - resetBeforeRequest: true, - requestName: "fetchProjects", - endpoint: '/integrations/issues/list_projects', - method: 'GET', -}) -export default class ProductDropdown extends React.PureComponent { - constructor(props) { - super(props); - this.fetchProjects() - } - fetchProjects() { - const { config } = this.props; - if (!config.validateFetchProjects()) return; - - this.props.fetchProjects().then(() => { - const { value, values, name } = this.props; - if (values && !values.includes(value) && values.length > 0) { - this.props.edit("jira", { - [ name ]: values[0].id, - }); - } - }); - } - componentDidUpdate(prevProps) { - const { config } = this.props; - if ((prevProps.config.url !== config.url || prevProps.config.apiToken !== config.apiToken) && config.validateFetchProjects()) { - this.fetchProjects(); - } - } - onChange = (e, target) => { - if (typeof this.props.onChange === 'function') { - this.props.onChange({ target }); - } - } - render() { - const { - values, - name, - value, - placeholder, - loading, - } = this.props; - const options = values ? values.map(g => ({ text: g.name, value: g.id })) : [] - return ( - - ); - } -} \ No newline at end of file diff --git a/frontend/app/components/Client/Integrations/MobxDoc/MobxDoc.js b/frontend/app/components/Client/Integrations/MobxDoc/MobxDoc.js index 79166da56..320e1a742 100644 --- a/frontend/app/components/Client/Integrations/MobxDoc/MobxDoc.js +++ b/frontend/app/components/Client/Integrations/MobxDoc/MobxDoc.js @@ -1,3 +1,4 @@ +import React from 'react'; import Highlight from 'react-highlight' import ToggleContent from 'Shared/ToggleContent' import DocLink from 'Shared/DocLink/DocLink'; diff --git a/frontend/app/components/Client/Integrations/NewrelicForm/NewrelicForm.js b/frontend/app/components/Client/Integrations/NewrelicForm/NewrelicForm.js index 0e7b0bed6..d7ce557e8 100644 --- a/frontend/app/components/Client/Integrations/NewrelicForm/NewrelicForm.js +++ b/frontend/app/components/Client/Integrations/NewrelicForm/NewrelicForm.js @@ -1,3 +1,4 @@ +import React from 'react'; import IntegrationForm from '../IntegrationForm'; import DocLink from 'Shared/DocLink/DocLink'; diff --git a/frontend/app/components/Client/Integrations/NgRxDoc/NgRxDoc.js b/frontend/app/components/Client/Integrations/NgRxDoc/NgRxDoc.js index 9aa441c7e..385b0d4e4 100644 --- a/frontend/app/components/Client/Integrations/NgRxDoc/NgRxDoc.js +++ b/frontend/app/components/Client/Integrations/NgRxDoc/NgRxDoc.js @@ -1,3 +1,4 @@ +import React from 'react'; import Highlight from 'react-highlight' import ToggleContent from 'Shared/ToggleContent' import DocLink from 'Shared/DocLink/DocLink'; diff --git a/frontend/app/components/Client/Integrations/ProfilerDoc/ProfilerDoc.js b/frontend/app/components/Client/Integrations/ProfilerDoc/ProfilerDoc.js index f00b98815..9cada092b 100644 --- a/frontend/app/components/Client/Integrations/ProfilerDoc/ProfilerDoc.js +++ b/frontend/app/components/Client/Integrations/ProfilerDoc/ProfilerDoc.js @@ -1,3 +1,4 @@ +import React from 'react'; import Highlight from 'react-highlight' import ToggleContent from 'Shared/ToggleContent' import DocLink from 'Shared/DocLink/DocLink'; diff --git a/frontend/app/components/Client/Integrations/ReduxDoc/ReduxDoc.js b/frontend/app/components/Client/Integrations/ReduxDoc/ReduxDoc.js index c4fa51240..8e3b12432 100644 --- a/frontend/app/components/Client/Integrations/ReduxDoc/ReduxDoc.js +++ b/frontend/app/components/Client/Integrations/ReduxDoc/ReduxDoc.js @@ -1,3 +1,4 @@ +import React from 'react'; import Highlight from 'react-highlight' import ToggleContent from '../../../shared/ToggleContent'; import DocLink from 'Shared/DocLink/DocLink'; diff --git a/frontend/app/components/Client/Integrations/RollbarForm.js b/frontend/app/components/Client/Integrations/RollbarForm.js index 04ccc8b2b..3b8830423 100644 --- a/frontend/app/components/Client/Integrations/RollbarForm.js +++ b/frontend/app/components/Client/Integrations/RollbarForm.js @@ -1,3 +1,4 @@ +import React from 'react'; import IntegrationForm from './IntegrationForm'; import DocLink from 'Shared/DocLink/DocLink'; diff --git a/frontend/app/components/Client/Integrations/SentryForm.js b/frontend/app/components/Client/Integrations/SentryForm.js index c3e125cc4..fd7bf1f11 100644 --- a/frontend/app/components/Client/Integrations/SentryForm.js +++ b/frontend/app/components/Client/Integrations/SentryForm.js @@ -1,3 +1,4 @@ +import React from 'react'; import IntegrationForm from './IntegrationForm'; import DocLink from 'Shared/DocLink/DocLink'; diff --git a/frontend/app/components/Client/Integrations/SlackAddForm/SlackAddForm.js b/frontend/app/components/Client/Integrations/SlackAddForm/SlackAddForm.js index 4eb16f868..8e1bb121e 100644 --- a/frontend/app/components/Client/Integrations/SlackAddForm/SlackAddForm.js +++ b/frontend/app/components/Client/Integrations/SlackAddForm/SlackAddForm.js @@ -2,7 +2,7 @@ import React from 'react' import { connect } from 'react-redux' import { edit, save, init, update } from 'Duck/integrations/slack' import { Form, Input, Button, Message } from 'UI' -import { confirm } from 'UI/Confirmation'; +import { confirm } from 'UI'; import { remove } from 'Duck/integrations/slack' class SlackAddForm extends React.PureComponent { @@ -62,18 +62,14 @@ class SlackAddForm extends React.PureComponent { onClick={ this.save } disabled={ !instance.validate() } loading={ saving } - primary - marginRight + variant="primary" + className="float-left mr-2" > { instance.exists() ? 'Update' : 'Add' } @@ -82,8 +78,6 @@ class SlackAddForm extends React.PureComponent { diff --git a/frontend/app/components/Client/Integrations/SlackForm.js b/frontend/app/components/Client/Integrations/SlackForm.js index 9ae37fbf1..986af20ab 100644 --- a/frontend/app/components/Client/Integrations/SlackForm.js +++ b/frontend/app/components/Client/Integrations/SlackForm.js @@ -1,5 +1,4 @@ -import IntegrationForm from './IntegrationForm'; -import SlackAddForm from './SlackAddForm'; +import React from 'react'; import SlackChannelList from './SlackChannelList/SlackChannelList'; const SlackForm = (props) => { diff --git a/frontend/app/components/Client/Integrations/StackdriverForm.js b/frontend/app/components/Client/Integrations/StackdriverForm.js index a76a6f446..b8e29fa3c 100644 --- a/frontend/app/components/Client/Integrations/StackdriverForm.js +++ b/frontend/app/components/Client/Integrations/StackdriverForm.js @@ -1,3 +1,4 @@ +import React from 'react'; import IntegrationForm from './IntegrationForm'; import DocLink from 'Shared/DocLink/DocLink'; diff --git a/frontend/app/components/Client/Integrations/SumoLogicForm/RegionDropdown.js b/frontend/app/components/Client/Integrations/SumoLogicForm/RegionDropdown.js index f0625d521..48fa3151d 100644 --- a/frontend/app/components/Client/Integrations/SumoLogicForm/RegionDropdown.js +++ b/frontend/app/components/Client/Integrations/SumoLogicForm/RegionDropdown.js @@ -1,14 +1,15 @@ +import React from 'react'; import { regionLabels as labels } from 'Types/integrations/sumoLogicConfig'; -import { Dropdown } from 'UI'; +import Select from 'Shared/Select'; -const options = Object.keys(labels).map(key => ({ text: labels[ key ], value: key })); +const options = Object.keys(labels).map(key => ({ text: labels[ key ], label: key })); const RegionDropdown = props => ( - props.onChange({target})} + onChange={(e) => props.onChange(e)} selection - options={ options } + options={ options.find(option => option.value === props.value) } /> ); diff --git a/frontend/app/components/Client/Integrations/SumoLogicForm/SumoLogicForm.js b/frontend/app/components/Client/Integrations/SumoLogicForm/SumoLogicForm.js index 556105107..0a807edb6 100644 --- a/frontend/app/components/Client/Integrations/SumoLogicForm/SumoLogicForm.js +++ b/frontend/app/components/Client/Integrations/SumoLogicForm/SumoLogicForm.js @@ -1,3 +1,4 @@ +import React from 'react'; import IntegrationForm from '../IntegrationForm'; import RegionDropdown from './RegionDropdown'; import DocLink from 'Shared/DocLink/DocLink'; diff --git a/frontend/app/components/Client/Integrations/VueDoc/VueDoc.js b/frontend/app/components/Client/Integrations/VueDoc/VueDoc.js index b6682411c..e00d1c0ad 100644 --- a/frontend/app/components/Client/Integrations/VueDoc/VueDoc.js +++ b/frontend/app/components/Client/Integrations/VueDoc/VueDoc.js @@ -1,3 +1,4 @@ +import React from 'react'; import Highlight from 'react-highlight' import ToggleContent from '../../../shared/ToggleContent'; import DocLink from 'Shared/DocLink/DocLink'; diff --git a/frontend/app/components/Client/Integrations/_IntegrationItem .js_old b/frontend/app/components/Client/Integrations/_IntegrationItem .js_old index 6aebe13a3..962135633 100644 --- a/frontend/app/components/Client/Integrations/_IntegrationItem .js_old +++ b/frontend/app/components/Client/Integrations/_IntegrationItem .js_old @@ -1,7 +1,7 @@ import React from 'react'; import cn from 'classnames'; import { Icon } from 'UI'; -import styles from './integrationItem.css'; +import styles from './integrationItem.module.css'; const onDocLinkClick = (e, link) => { e.stopPropagation(); diff --git a/frontend/app/components/Client/Integrations/integrationItem.css b/frontend/app/components/Client/Integrations/integrationItem.module.css similarity index 100% rename from frontend/app/components/Client/Integrations/integrationItem.css rename to frontend/app/components/Client/Integrations/integrationItem.module.css diff --git a/frontend/app/components/Client/Integrations/integrations.css b/frontend/app/components/Client/Integrations/integrations.module.css similarity index 100% rename from frontend/app/components/Client/Integrations/integrations.css rename to frontend/app/components/Client/Integrations/integrations.module.css diff --git a/frontend/app/components/Client/ManageUsers/ManageUsers.js b/frontend/app/components/Client/ManageUsers/ManageUsers.js index 1504a0631..d773d6025 100644 --- a/frontend/app/components/Client/ManageUsers/ManageUsers.js +++ b/frontend/app/components/Client/ManageUsers/ManageUsers.js @@ -1,16 +1,17 @@ +import React from 'react'; import { connect } from 'react-redux'; import cn from 'classnames'; import withPageTitle from 'HOCs/withPageTitle'; import { - IconButton, SlideModal, Input, Button, Loader, + Form, IconButton, SlideModal, Input, Button, Loader, NoContent, Popup, CopyButton, Dropdown } from 'UI'; import { init, save, edit, remove as deleteMember, fetchList, generateInviteLink } from 'Duck/member'; import { fetchList as fetchRoles } from 'Duck/roles'; -import styles from './manageUsers.css'; +import styles from './manageUsers.module.css'; import UserItem from './UserItem'; -import { confirm } from 'UI/Confirmation'; +import { confirm } from 'UI'; import { toast } from 'react-toastify'; -import BannerMessage from 'Shared/BannerMessage'; +import AnimatedSVG, { ICONS } from 'Shared/AnimatedSVG/AnimatedSVG'; const PERMISSION_WARNING = 'You don’t have the permissions to perform this action.'; const LIMIT_WARNING = 'You have reached users limit.'; @@ -91,7 +92,7 @@ class ManageUsers extends React.PureComponent { return (
    -
    +
    -
    + -
    + { !account.smtp &&
    SMTP is not configured (see here how to set it up). You can still add new users, but you’d have to manually copy then send them the invitation link.
    } -
    +
    { 'Can manage Projects and team members.' }
    -
    + { isEnterprise && ( -
    + -
    + )} - +
    @@ -155,18 +156,18 @@ class ManageUsers extends React.PureComponent { onClick={ this.save } disabled={ !member.validate() } loading={ this.props.saving } - primary - marginRight + variant="primary" + className="float-left mr-2" > { member.exists() ? 'Update' : 'Invite' } - + {member.exists() && ( + + )}
    { !member.joined && member.invitationLink && { (isAdmin ? 'Manage ' : '') + `Users (${members.size})` } } { hideHeader &&

    { `Users (${members.size})` }

    } - this.init() } - /> -
    - } disabled={ canAddUsers } content={ `${ !canAddUsers ? (!isAdmin ? PERMISSION_WARNING : LIMIT_WARNING) : 'Add team member' }` } - size="tiny" - inverted - position="top left" - /> + > +
    + this.init() } + /> +
    +
    + +
    No data available.
    +
    + } size="small" show={ members.size === 0 } - animatedIcon="empty-state" + // animatedIcon="empty-state" >
    { diff --git a/frontend/app/components/Client/ManageUsers/UserItem.js b/frontend/app/components/Client/ManageUsers/UserItem.js index 757f709a9..7192b9004 100644 --- a/frontend/app/components/Client/ManageUsers/UserItem.js +++ b/frontend/app/components/Client/ManageUsers/UserItem.js @@ -1,6 +1,6 @@ import React from 'react'; import { Icon, CopyButton, Popup } from 'UI'; -import styles from './userItem.css'; +import styles from './userItem.module.css'; const UserItem = ({ user, adminLabel, deleteHandler, editHandler, generateInviteLink }) => (
    @@ -12,33 +12,25 @@ const UserItem = ({ user, adminLabel, deleteHandler, editHandler, generateInvite
    { user.expiredInvitation && !user.joined && generateInviteLink(user) } id="trash"> + content={ `Generate Invitation Link` } + > +
    generateInviteLink(user) } id="trash">
    - } - content={ `Generate Invitation Link` } - size="tiny" - inverted - position="top center" - /> +
    } { !user.expiredInvitation && !user.joined && user.invitationLink && + content={ `Copy Invitation Link` } + > +
    } />
    - } - content={ `Copy Invitation Link` } - size="tiny" - inverted - position="top center" - /> +
    } { !!deleteHandler &&
    deleteHandler(user) } id="trash"> diff --git a/frontend/app/components/Client/ManageUsers/manageUsers.css b/frontend/app/components/Client/ManageUsers/manageUsers.module.css similarity index 100% rename from frontend/app/components/Client/ManageUsers/manageUsers.css rename to frontend/app/components/Client/ManageUsers/manageUsers.module.css diff --git a/frontend/app/components/Client/ManageUsers/userItem.css b/frontend/app/components/Client/ManageUsers/userItem.module.css similarity index 100% rename from frontend/app/components/Client/ManageUsers/userItem.css rename to frontend/app/components/Client/ManageUsers/userItem.module.css diff --git a/frontend/app/components/Client/Notifications/Notifications.js b/frontend/app/components/Client/Notifications/Notifications.js index 31e6e3699..15d6b9b4d 100644 --- a/frontend/app/components/Client/Notifications/Notifications.js +++ b/frontend/app/components/Client/Notifications/Notifications.js @@ -1,6 +1,6 @@ import React, { useEffect } from 'react' import cn from 'classnames' -import stl from './notifications.css' +import stl from './notifications.module.css' import { Checkbox } from 'UI' import { connect } from 'react-redux' import { withRequest } from 'HOCs' @@ -35,7 +35,7 @@ function Notifications(props) { className="mr-8" label="Send me a weekly report for each project." /> - +
    ) diff --git a/frontend/app/components/Client/Notifications/notifications.css b/frontend/app/components/Client/Notifications/notifications.module.css similarity index 100% rename from frontend/app/components/Client/Notifications/notifications.css rename to frontend/app/components/Client/Notifications/notifications.module.css diff --git a/frontend/app/components/Client/PreferencesMenu/PreferencesMenu.js b/frontend/app/components/Client/PreferencesMenu/PreferencesMenu.js index 682d1519a..82678867a 100644 --- a/frontend/app/components/Client/PreferencesMenu/PreferencesMenu.js +++ b/frontend/app/components/Client/PreferencesMenu/PreferencesMenu.js @@ -2,11 +2,11 @@ import React from 'react' import { connect } from 'react-redux'; import cn from 'classnames'; import { SideMenuitem } from 'UI' -import stl from './preferencesMenu.css'; +import stl from './preferencesMenu.module.css'; import { CLIENT_TABS, client as clientRoute } from 'App/routes'; import { withRouter } from 'react-router-dom'; -function PreferencesMenu({ activeTab, appearance, history, isEnterprise }) { +function PreferencesMenu({ activeTab, history, isEnterprise }) { const setTab = (tab) => { history.push(clientRoute(tab)); @@ -112,6 +112,5 @@ function PreferencesMenu({ activeTab, appearance, history, isEnterprise }) { } export default connect(state => ({ - appearance: state.getIn([ 'user', 'account', 'appearance' ]), isEnterprise: state.getIn([ 'user', 'client', 'edition' ]) === 'ee', }))(withRouter(PreferencesMenu)); diff --git a/frontend/app/components/Client/PreferencesMenu/preferencesMenu.css b/frontend/app/components/Client/PreferencesMenu/preferencesMenu.module.css similarity index 100% rename from frontend/app/components/Client/PreferencesMenu/preferencesMenu.css rename to frontend/app/components/Client/PreferencesMenu/preferencesMenu.module.css diff --git a/frontend/app/components/Client/ProfileSettings/Api.js b/frontend/app/components/Client/ProfileSettings/Api.js index fe648c2ae..39cf5ff61 100644 --- a/frontend/app/components/Client/ProfileSettings/Api.js +++ b/frontend/app/components/Client/ProfileSettings/Api.js @@ -1,7 +1,8 @@ -// TODO this can be deleted +import React from 'react'; import copy from 'copy-to-clipboard'; import { connect } from 'react-redux'; -import styles from './profileSettings.css'; +import styles from './profileSettings.module.css'; +import { Form, Input, Button } from 'UI'; @connect(state => ({ apiKey: state.getIn([ 'user', 'client', 'apiKey' ]), @@ -25,27 +26,28 @@ export default class Api extends React.PureComponent { const { copied } = this.state; return ( -
    -
    + + -
    - -
    - { copied ? 'copied' : 'copy' } -
    -
    -
    - + + { copied ? 'copied' : 'copy' } + + } + /> + + ); } } diff --git a/frontend/app/components/Client/ProfileSettings/ChangePassword.js b/frontend/app/components/Client/ProfileSettings/ChangePassword.js index c213024d2..d02638b9a 100644 --- a/frontend/app/components/Client/ProfileSettings/ChangePassword.js +++ b/frontend/app/components/Client/ProfileSettings/ChangePassword.js @@ -1,6 +1,7 @@ +import React from 'react'; import { connect } from 'react-redux'; -import { Button, Message } from 'UI'; -import styles from './profileSettings.css'; +import { Button, Message, Form, Input } from 'UI'; +import styles from './profileSettings.module.css'; import { updatePassword } from 'Duck/user'; const ERROR_DOESNT_MATCH = "Passwords doesn't match"; @@ -67,12 +68,12 @@ export default class ChangePassword extends React.PureComponent { const doesntMatch = checkDoesntMatch(newPassword, newPasswordRepeat); return ( -
    -
    + + - -
    -
    + + - { PASSWORD_POLICY }
    -
    -
    + + - -
    + { passwordErrors.map(err => ( { err } @@ -118,16 +119,17 @@ export default class ChangePassword extends React.PureComponent { { ERROR_DOESNT_MATCH } - + ); } } diff --git a/frontend/app/components/Client/ProfileSettings/ProfileSettings.js b/frontend/app/components/Client/ProfileSettings/ProfileSettings.js index 48cf2ce23..14d021810 100644 --- a/frontend/app/components/Client/ProfileSettings/ProfileSettings.js +++ b/frontend/app/components/Client/ProfileSettings/ProfileSettings.js @@ -1,7 +1,8 @@ +import React from 'react'; import withPageTitle from 'HOCs/withPageTitle'; import Settings from './Settings'; import ChangePassword from './ChangePassword'; -import styles from './profileSettings.css'; +import styles from './profileSettings.module.css'; import Api from './Api'; import TenantKey from './TenantKey'; import OptOut from './OptOut'; @@ -28,15 +29,20 @@ export default class ProfileSettings extends React.PureComponent {
    -
    -
    -

    { 'Change Password' }

    -
    { 'Updating your password from time to time enhances your account’s security.' }
    -
    -
    -
    + { account.hasPassword && ( + <> +
    +
    +

    { 'Change Password' }

    +
    { 'Updating your password from time to time enhances your account’s security.' }
    +
    +
    +
    + -
    +
    + + )}
    diff --git a/frontend/app/components/Client/ProfileSettings/Settings.js b/frontend/app/components/Client/ProfileSettings/Settings.js index 3d6d3f416..2f5639bcb 100644 --- a/frontend/app/components/Client/ProfileSettings/Settings.js +++ b/frontend/app/components/Client/ProfileSettings/Settings.js @@ -1,9 +1,10 @@ +import React from 'react'; import copy from 'copy-to-clipboard'; import { connect } from 'react-redux'; -import { Button } from 'UI'; +import { Button, Input, Form } from 'UI'; import { updateAccount, updateClient } from 'Duck/user'; -import styles from './profileSettings.css'; +import styles from './profileSettings.module.css'; @connect(state => ({ accountName: state.getIn([ 'user', 'account', 'name' ]), @@ -53,31 +54,31 @@ export default class Settings extends React.PureComponent { const { accountName, organizationName, changed, copied } = this.state; return ( -
    -
    + + - -
    + -
    + - -
    + - - + + ); } } diff --git a/frontend/app/components/Client/ProfileSettings/TenantKey.js b/frontend/app/components/Client/ProfileSettings/TenantKey.js index e6c43591d..ca03e656b 100644 --- a/frontend/app/components/Client/ProfileSettings/TenantKey.js +++ b/frontend/app/components/Client/ProfileSettings/TenantKey.js @@ -1,7 +1,9 @@ // TODO this can be deleted +import React from 'react'; import copy from 'copy-to-clipboard'; import { connect } from 'react-redux'; -import styles from './profileSettings.css'; +import styles from './profileSettings.module.css'; +import { Form, Input, Button } from "UI"; @connect(state => ({ tenantKey: state.getIn([ 'user', 'client', 'tenantKey' ]), @@ -23,27 +25,27 @@ export default class TenantKey extends React.PureComponent { const { copied } = this.state; return ( -
    -
    + + -
    - + { copied ? 'copied' : 'copy' } + + } /> -
    - { copied ? 'copied' : 'copy' } -
    -
    -
    - + + ); } } diff --git a/frontend/app/components/Client/ProfileSettings/profileSettings.css b/frontend/app/components/Client/ProfileSettings/profileSettings.module.css similarity index 100% rename from frontend/app/components/Client/ProfileSettings/profileSettings.css rename to frontend/app/components/Client/ProfileSettings/profileSettings.module.css diff --git a/frontend/app/components/Client/Roles/Roles.tsx b/frontend/app/components/Client/Roles/Roles.tsx index 91c09056b..831477b90 100644 --- a/frontend/app/components/Client/Roles/Roles.tsx +++ b/frontend/app/components/Client/Roles/Roles.tsx @@ -2,11 +2,11 @@ import React, { useState, useEffect } from 'react' import cn from 'classnames' import { Loader, IconButton, Popup, NoContent, SlideModal } from 'UI' import { connect } from 'react-redux' -import stl from './roles.css' +import stl from './roles.module.css' import RoleForm from './components/RoleForm' import { init, edit, fetchList, remove as deleteRole, resetErrors } from 'Duck/roles'; import RoleItem from './components/RoleItem' -import { confirm } from 'UI/Confirmation'; +import { confirm } from 'UI'; import { toast } from 'react-toastify'; import withPageTitle from 'HOCs/withPageTitle'; @@ -85,24 +85,20 @@ function Roles(props: Props) {

    Roles and Access

    - setShowmModal(true) } - /> -
    - } content="You don’t have the permissions to perform this action." disabled={ isAdmin } - size="tiny" - inverted - position="top left" - /> + > +
    + setShowmModal(true) } + /> +
    +
    diff --git a/frontend/app/components/Client/Roles/components/RoleForm/RoleForm.tsx b/frontend/app/components/Client/Roles/components/RoleForm/RoleForm.tsx index ce535c9dd..0b1c70dca 100644 --- a/frontend/app/components/Client/Roles/components/RoleForm/RoleForm.tsx +++ b/frontend/app/components/Client/Roles/components/RoleForm/RoleForm.tsx @@ -1,8 +1,9 @@ import React, { useRef, useEffect } from 'react' import { connect } from 'react-redux' -import stl from './roleForm.css' +import stl from './roleForm.module.css' import { save, edit } from 'Duck/roles' -import { Input, Button, Checkbox, Dropdown, Icon } from 'UI' +import { Form, Input, Button, Checkbox, Icon } from 'UI' +import Select from 'Shared/Select'; interface Permission { name: string, @@ -47,7 +48,8 @@ const RoleForm = (props: Props) => { edit({ projects: _projects }) } - const writeOption = (e, { name, value }) => { + const writeOption = ({ name, value }: any) => { + console.log('name', name); if (name === 'permissions') { onChangePermissions(value) } else if (name === 'projects') { @@ -66,8 +68,8 @@ const RoleForm = (props: Props) => { return (
    -
    -
    + + { id="name-field" placeholder="Ex. Admin" /> -
    + -
    +
    @@ -101,18 +103,12 @@ const RoleForm = (props: Props) => {
    { !role.allProjects && ( <> - writeOption({ name: 'projects', value }) } value={null} - onChange={ writeOption } - id="change-dropdown" - selectOnBlur={false} - selectOnNavigation={false} /> { role.projects.size > 0 && (
    @@ -123,22 +119,16 @@ const RoleForm = (props: Props) => { )} )} -
    +
    -
    + - writeOption({ name: 'permissions', value }) } value={null} - onChange={ writeOption } - id="change-dropdown" - selectOnBlur={false} - selectOnNavigation={false} /> { role.permissions.size > 0 && (
    @@ -147,8 +137,8 @@ const RoleForm = (props: Props) => { )) }
    )} -
    - + +
    @@ -156,51 +146,47 @@ const RoleForm = (props: Props) => { onClick={ _save } disabled={ !role.validate() } loading={ saving } - primary - marginRight + variant="primary" + className="float-left mr-2" > { role.exists() ? 'Update' : 'Add' } - + { role.exists() && ( + + )}
    { role.exists() && ( -
    - -
    + )}
    ); } -export default connect(state => { +export default connect((state: any) => { const role = state.getIn(['roles', 'instance']) const projects = state.getIn([ 'site', 'list' ]) return { role, - projectOptions: projects.map(p => ({ + projectOptions: projects.map((p: any) => ({ key: p.get('id'), value: p.get('id'), - text: p.get('name'), - disabled: role.projects.includes(p.get('id')), + label: p.get('name'), + isDisabled: role.projects.includes(p.get('id')), })).toJS(), permissions: state.getIn(['roles', 'permissions']) - .map(({ text, value }) => ({ text, value, disabled: role.permissions.includes(value) })).toJS(), + .map(({ text, value }: any) => ({ label: text, value, isDisabled: role.permissions.includes(value) })).toJS(), saving: state.getIn([ 'roles', 'saveRequest', 'loading' ]), - projectsMap: projects.reduce((acc, p) => { + projectsMap: projects.reduce((acc: any, p: any) => { acc[ p.get('id') ] = p.get('name') return acc } diff --git a/frontend/app/components/Client/Roles/components/RoleForm/roleForm.css b/frontend/app/components/Client/Roles/components/RoleForm/roleForm.module.css similarity index 100% rename from frontend/app/components/Client/Roles/components/RoleForm/roleForm.css rename to frontend/app/components/Client/Roles/components/RoleForm/roleForm.module.css diff --git a/frontend/app/components/Client/Roles/components/RoleItem/RoleItem.tsx b/frontend/app/components/Client/Roles/components/RoleItem/RoleItem.tsx index 3fddd489c..c07919e8e 100644 --- a/frontend/app/components/Client/Roles/components/RoleItem/RoleItem.tsx +++ b/frontend/app/components/Client/Roles/components/RoleItem/RoleItem.tsx @@ -1,6 +1,6 @@ import React from 'react' import { Icon, Link } from 'UI' -import stl from './roleItem.css' +import stl from './roleItem.module.css' import cn from 'classnames' import { CLIENT_TABS, client as clientRoute } from 'App/routes'; diff --git a/frontend/app/components/Client/Roles/components/RoleItem/roleItem.css b/frontend/app/components/Client/Roles/components/RoleItem/roleItem.module.css similarity index 100% rename from frontend/app/components/Client/Roles/components/RoleItem/roleItem.css rename to frontend/app/components/Client/Roles/components/RoleItem/roleItem.module.css diff --git a/frontend/app/components/Client/Roles/roles.css b/frontend/app/components/Client/Roles/roles.module.css similarity index 100% rename from frontend/app/components/Client/Roles/roles.css rename to frontend/app/components/Client/Roles/roles.module.css diff --git a/frontend/app/components/Client/Sites/BlockedIps.js b/frontend/app/components/Client/Sites/BlockedIps.js index c5ba4be44..98f6acfde 100644 --- a/frontend/app/components/Client/Sites/BlockedIps.js +++ b/frontend/app/components/Client/Sites/BlockedIps.js @@ -1,6 +1,6 @@ import React from 'react'; import { Input, Button, Icon } from 'UI'; -import styles from './blockedIps.css'; +import styles from './blockedIps.module.css'; class BlockedIps extends React.PureComponent { render() { diff --git a/frontend/app/components/Client/Sites/GDPRForm.js b/frontend/app/components/Client/Sites/GDPRForm.js index 6e52c9962..c65559cd3 100644 --- a/frontend/app/components/Client/Sites/GDPRForm.js +++ b/frontend/app/components/Client/Sites/GDPRForm.js @@ -1,13 +1,15 @@ +import React from 'react'; import { connect } from 'react-redux'; -import { Button, Select, Input, Icon } from 'UI'; +import { Form, Button, Input, Icon } from 'UI'; import { editGDPR, saveGDPR } from 'Duck/site'; import { validateNumber } from 'App/validate'; -import styles from './siteForm.css'; +import styles from './siteForm.module.css'; +import Select from 'Shared/Select'; const inputModeOptions = [ - { text: 'Record all inputs', value: 'plain' }, - { text: 'Ignore all inputs', value: 'obscured' }, - { text: 'Obscure all inputs', value: 'hidden' }, + { label: 'Record all inputs', value: 'plain' }, + { label: 'Ignore all inputs', value: 'obscured' }, + { label: 'Obscure all inputs', value: 'hidden' }, ]; @connect(state => ({ @@ -35,7 +37,7 @@ export default class GDPRForm extends React.PureComponent { } } - onChangeSelect = (event, { name, value }) => { + onChangeSelect = ({ name, value }) => { this.props.editGDPR({ [ name ]: value }); }; @@ -55,13 +57,13 @@ export default class GDPRForm extends React.PureComponent { } = this.props; return ( -
    +
    -
    +
    { site.host }
    -
    -
    + + -
    + -
    + { 'If enabled, OpenReplay will not record or store any numeric text for all sessions.' }
    -
    + -
    +
    -
    +
    @@ -120,16 +122,14 @@ export default class GDPRForm extends React.PureComponent {
    - + ); } } diff --git a/frontend/app/components/Client/Sites/NewSiteForm.js b/frontend/app/components/Client/Sites/NewSiteForm.js index e7cd88f12..2daaa5cb1 100644 --- a/frontend/app/components/Client/Sites/NewSiteForm.js +++ b/frontend/app/components/Client/Sites/NewSiteForm.js @@ -1,11 +1,12 @@ +import React from 'react'; import { connect } from 'react-redux'; -import { Input, Button, Icon } from 'UI'; +import { Form, Input, Button, Icon } from 'UI'; import { save, edit, update , fetchList, remove } from 'Duck/site'; import { pushNewSite } from 'Duck/user'; import { setSiteId } from 'Duck/site'; import { withRouter } from 'react-router-dom'; -import styles from './siteForm.css'; -import { confirm } from 'UI/Confirmation'; +import styles from './siteForm.module.css'; +import { confirm } from 'UI'; @connect(state => ({ site: state.getIn([ 'site', 'instance' ]), @@ -73,27 +74,28 @@ export default class NewSiteForm extends React.PureComponent { render() { const { site, loading } = this.props; return ( -
    +
    -
    + -
    +
    +
    @@ -103,7 +105,7 @@ export default class NewSiteForm extends React.PureComponent {
    }
    - + ); } } \ No newline at end of file diff --git a/frontend/app/components/Client/Sites/SiteSearch/SiteSearch.tsx b/frontend/app/components/Client/Sites/SiteSearch/SiteSearch.tsx index 1a4c2b881..ed91ed25d 100644 --- a/frontend/app/components/Client/Sites/SiteSearch/SiteSearch.tsx +++ b/frontend/app/components/Client/Sites/SiteSearch/SiteSearch.tsx @@ -1,5 +1,5 @@ import React, { useEffect } from 'react'; -import { Icon } from 'UI'; +import { Icon, Input } from 'UI'; import { debounce } from 'App/utils'; let debounceUpdate: any = () => {} @@ -20,12 +20,13 @@ function SiteSearch(props: Props) { return (
    -
    ); diff --git a/frontend/app/components/Client/Sites/Sites.js b/frontend/app/components/Client/Sites/Sites.js index ba3c72e6e..0dd140add 100644 --- a/frontend/app/components/Client/Sites/Sites.js +++ b/frontend/app/components/Client/Sites/Sites.js @@ -1,15 +1,16 @@ +import React from 'react'; import { connect } from 'react-redux'; import cn from 'classnames'; import withPageTitle from 'HOCs/withPageTitle'; import { Loader, SlideModal, IconButton, Icon, Button, Popup, TextLink } from 'UI'; import { init, remove, fetchGDPR } from 'Duck/site'; import { RED, YELLOW, GREEN, STATUS_COLOR_MAP } from 'Types/site'; -import stl from './sites.css'; +import stl from './sites.module.css'; import NewSiteForm from './NewSiteForm'; import GDPRForm from './GDPRForm'; import TrackingCodeModal from 'Shared/TrackingCodeModal'; import BlockedIps from './BlockedIps'; -import { confirm } from 'UI/Confirmation'; +import { confirm } from 'UI'; import SiteSearch from './SiteSearch'; const STATUS_MESSAGE_MAP = { @@ -144,8 +145,10 @@ class Sites extends React.PureComponent {

    { 'Projects' }

    + disabled={ canAddSites } + content={ `${ !isAdmin ? PERMISSION_WARNING : LIMIT_WARNING }` } + > +
    - } - disabled={ canAddSites } - content={ `${ !isAdmin ? PERMISSION_WARNING : LIMIT_WARNING }` } - size="tiny" - inverted - position="top left" - /> +
    - -
    - } content={ STATUS_MESSAGE_MAP[ _site.status ] } inverted position="top center" - /> + > +
    + +
    + { _site.host }
    @@ -207,7 +203,7 @@ class Sites extends React.PureComponent {
    {_site.projectKey}
    */}
    -
    +
    {/* */} - + {/* */}
    diff --git a/frontend/app/components/Client/Sites/blockedIps.css b/frontend/app/components/Client/Sites/blockedIps.module.css similarity index 100% rename from frontend/app/components/Client/Sites/blockedIps.css rename to frontend/app/components/Client/Sites/blockedIps.module.css diff --git a/frontend/app/components/Client/Sites/siteForm.css b/frontend/app/components/Client/Sites/siteForm.module.css similarity index 100% rename from frontend/app/components/Client/Sites/siteForm.css rename to frontend/app/components/Client/Sites/siteForm.module.css diff --git a/frontend/app/components/Client/Sites/sites.css b/frontend/app/components/Client/Sites/sites.module.css similarity index 100% rename from frontend/app/components/Client/Sites/sites.css rename to frontend/app/components/Client/Sites/sites.module.css diff --git a/frontend/app/components/Client/TabItem.js b/frontend/app/components/Client/TabItem.js index ec40037b3..dae16e7df 100644 --- a/frontend/app/components/Client/TabItem.js +++ b/frontend/app/components/Client/TabItem.js @@ -1,5 +1,6 @@ +import React from 'react'; import { Icon } from 'UI'; -import styles from './client.css'; +import styles from './client.module.css'; const TabItem = ({ active = false, onClick, icon, label }) => { return ( diff --git a/frontend/app/components/Client/Users/UsersView.tsx b/frontend/app/components/Client/Users/UsersView.tsx index 37e6fdbcd..165230cbf 100644 --- a/frontend/app/components/Client/Users/UsersView.tsx +++ b/frontend/app/components/Client/Users/UsersView.tsx @@ -44,24 +44,21 @@ function UsersView(props: Props) { title={
    Team {userCount}
    } actionButton={( - editHandler(null) } - /> -
    - } content={ `${ !isAdmin ? PERMISSION_WARNING : (reachedLimit ? LIMIT_WARNING : 'Add team member') }` } size="tiny" inverted position="top left" - /> + > + editHandler(null) } + /> + )} />
    diff --git a/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx b/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx index d1da252f4..c81576b14 100644 --- a/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx +++ b/frontend/app/components/Client/Users/components/UserForm/UserForm.tsx @@ -1,11 +1,11 @@ import React from 'react'; -import { Input, CopyButton, Button, Icon } from 'UI' +import { Form, Input, CopyButton, Button, Icon } from 'UI' import cn from 'classnames'; import { useStore } from 'App/mstore'; import { useObserver } from 'mobx-react-lite'; import { useModal } from 'App/components/Modal'; import Select from 'Shared/Select'; -import { confirm } from 'UI/Confirmation'; +import { confirm } from 'UI'; import { connect } from 'react-redux'; interface Props { @@ -51,8 +51,8 @@ function UserForm(props: Props) {

    {`${user.exists() ? 'Update' : 'Invite'} User`}

    -
    -
    + + -
    +
    @@ -79,7 +79,7 @@ function UserForm(props: Props) { SMTP is not configured (see here how to set it up). You can still add new users, but you’d have to manually copy then send them the invitation link.
    } -
    +
    -
    + { isEnterprise && ( -
    +
    )); diff --git a/frontend/app/components/Client/Webhooks/ListItem.js b/frontend/app/components/Client/Webhooks/ListItem.js index c14265dc9..c493cc176 100644 --- a/frontend/app/components/Client/Webhooks/ListItem.js +++ b/frontend/app/components/Client/Webhooks/ListItem.js @@ -1,6 +1,6 @@ import React from 'react'; import { Icon } from 'UI'; -import styles from './listItem.css'; +import styles from './listItem.module.css'; const ListItem = ({ webhook, onEdit, onDelete }) => { return ( diff --git a/frontend/app/components/Client/Webhooks/WebhookForm.js b/frontend/app/components/Client/Webhooks/WebhookForm.js index 5aa991a14..6ea5737ea 100644 --- a/frontend/app/components/Client/Webhooks/WebhookForm.js +++ b/frontend/app/components/Client/Webhooks/WebhookForm.js @@ -1,8 +1,8 @@ import React from 'react'; import { connect } from 'react-redux'; import { edit, save } from 'Duck/webhook'; -import { Form, Button } from 'UI'; -import styles from './webhookForm.css'; +import { Form, Button, Input } from 'UI'; +import styles from './webhookForm.module.css'; @connect(state => ({ webhook: state.getIn(['webhooks', 'instance']), @@ -28,7 +28,7 @@ class WebhookForm extends React.PureComponent { - { this.focusElement = ref; } } name="name" value={ webhook.name } @@ -39,7 +39,7 @@ class WebhookForm extends React.PureComponent { - { this.focusElement = ref; } } name="endpoint" value={ webhook.endpoint } @@ -50,7 +50,7 @@ class WebhookForm extends React.PureComponent { - { this.focusElement = ref; } } name="authHeader" value={ webhook.authHeader } @@ -63,18 +63,18 @@ class WebhookForm extends React.PureComponent { onClick={ this.save } disabled={ !webhook.validate() } loading={ loading } - primary - marginRight + variant="primary" + className="float-left mr-2" > { webhook.exists() ? 'Update' : 'Add' } - + { webhook.exists() && ( + + )} ); } diff --git a/frontend/app/components/Client/Webhooks/Webhooks.js b/frontend/app/components/Client/Webhooks/Webhooks.js index 150ed05a6..6f2e90d44 100644 --- a/frontend/app/components/Client/Webhooks/Webhooks.js +++ b/frontend/app/components/Client/Webhooks/Webhooks.js @@ -1,3 +1,4 @@ +import React from 'react'; import { connect } from 'react-redux'; import cn from 'classnames'; import withPageTitle from 'HOCs/withPageTitle'; @@ -5,7 +6,8 @@ import { IconButton, SlideModal, Loader, NoContent } from 'UI'; import { init, fetchList, remove } from 'Duck/webhook'; import WebhookForm from './WebhookForm'; import ListItem from './ListItem'; -import styles from './webhooks.css'; +import styles from './webhooks.module.css'; +import AnimatedSVG, { ICONS } from 'Shared/AnimatedSVG/AnimatedSVG'; @connect(state => ({ webhooks: state.getIn(['webhooks', 'list']), @@ -56,10 +58,15 @@ class Webhooks extends React.PureComponent { + +
    No webhooks available.
    +
    + } size="small" show={ noSlackWebhooks.size === 0 } - animatedIcon="no-results" + // animatedIcon="no-results" >
    { noSlackWebhooks.map(webhook => ( diff --git a/frontend/app/components/Client/Webhooks/listItem.css b/frontend/app/components/Client/Webhooks/listItem.module.css similarity index 100% rename from frontend/app/components/Client/Webhooks/listItem.css rename to frontend/app/components/Client/Webhooks/listItem.module.css diff --git a/frontend/app/components/Client/Webhooks/webhookForm.css b/frontend/app/components/Client/Webhooks/webhookForm.module.css similarity index 100% rename from frontend/app/components/Client/Webhooks/webhookForm.css rename to frontend/app/components/Client/Webhooks/webhookForm.module.css diff --git a/frontend/app/components/Client/Webhooks/webhooks.css b/frontend/app/components/Client/Webhooks/webhooks.module.css similarity index 100% rename from frontend/app/components/Client/Webhooks/webhooks.css rename to frontend/app/components/Client/Webhooks/webhooks.module.css diff --git a/frontend/app/components/Client/client.css b/frontend/app/components/Client/client.module.css similarity index 100% rename from frontend/app/components/Client/client.css rename to frontend/app/components/Client/client.module.css diff --git a/frontend/app/components/Dashboard/AddWidgets.js b/frontend/app/components/Dashboard/AddWidgets.js deleted file mode 100644 index 23751e90a..000000000 --- a/frontend/app/components/Dashboard/AddWidgets.js +++ /dev/null @@ -1,50 +0,0 @@ -import { connect } from 'react-redux'; -import cn from 'classnames'; -import withToggle from 'HOCs/withToggle'; -import { IconButton, SlideModal, NoContent } from 'UI'; -import { updateAppearance } from 'Duck/user'; -import { WIDGET_LIST } from 'Types/dashboard'; -import stl from './addWidgets.css'; -import OutsideClickDetectingDiv from 'Shared/OutsideClickDetectingDiv'; - -@connect(state => ({ - appearance: state.getIn([ 'user', 'account', 'appearance' ]), -}), { - updateAppearance, -}) -@withToggle() -export default class AddWidgets extends React.PureComponent { - makeAddHandler = widgetKey => () => { - const { appearance } = this.props; - const newAppearance = appearance.setIn([ 'dashboard', widgetKey ], true); - this.props.switchOpen(false); - this.props.updateAppearance(newAppearance) - } - - render() { - const { appearance } = this.props; - const avaliableWidgets = WIDGET_LIST.filter(({ key, type }) => !appearance.dashboard[ key ] && type === this.props.type ); - - return ( -
    - this.props.switchOpen(false)}> - {this.props.open && -
    - {avaliableWidgets.map(w => ( -
    - {w.name} -
    - ))} -
    - } -
    -
    - ); - } -} \ No newline at end of file diff --git a/frontend/app/components/Dashboard/Dashboard.js b/frontend/app/components/Dashboard/Dashboard.js deleted file mode 100644 index f5002788a..000000000 --- a/frontend/app/components/Dashboard/Dashboard.js +++ /dev/null @@ -1,305 +0,0 @@ -import { connect } from 'react-redux'; -import cn from 'classnames'; -import withPageTitle from 'HOCs/withPageTitle'; -import withPermissions from 'HOCs/withPermissions' -import { setPeriod, setPlatform, fetchMetadataOptions } from 'Duck/dashboard'; -import { NoContent, Icon } from 'UI'; -import { WIDGET_KEYS, WIDGET_LIST } from 'Types/dashboard'; -// import CustomMetrics from 'Shared/CustomMetrics'; -import CustomMetricsModal from 'Shared/CustomMetrics/CustomMetricsModal'; -import SessionListModal from 'Shared/CustomMetrics/SessionListModal'; - -import { - MissingResources, - SlowestResources, - DomBuildingTime, - ResourceLoadingTime, - ResponseTime, - ResponseTimeDistribution, - TimeToRender, - SessionsImpactedBySlowRequests, - MemoryConsumption, - CpuLoad, - FPS, - Crashes, - SlowestDomains, - ErrorsPerDomain, - CallWithErrors, - ErrorsByType, - ErrorsByOrigin, - ResourceLoadedVsResponseEnd, - ResourceLoadedVsVisuallyComplete, - SessionsAffectedByJSErrors, - BreakdownOfLoadedResources, - SpeedIndexLocation, - SessionsPerBrowser, - CallsErrors5xx, - CallsErrors4xx -} from './Widgets'; - -import SideMenuSection from './SideMenu/SideMenuSection'; -import styles from './dashboard.css'; -import WidgetSection from 'Shared/WidgetSection/WidgetSection'; -import OverviewWidgets from './Widgets/OverviewWidgets/OverviewWidgets'; -import CustomMetricsWidgets from './Widgets/CustomMetricsWidgets/CustomMetricsWidgets'; -import WidgetHolder from './WidgetHolder/WidgetHolder'; -import MetricsFilters from 'Shared/MetricsFilters/MetricsFilters'; -import { withRouter } from 'react-router'; - -const OVERVIEW = 'overview'; -const PERFORMANCE = 'performance'; -const ERRORS_N_CRASHES = 'errors'; -const RESOURCES = 'resources'; -const CUSTOM_METRICS = 'custom_metrics'; - -const menuList = [ - { - key: OVERVIEW, - section: 'metrics', - icon: "info-square", - label: getStatusLabel(OVERVIEW), - active: status === OVERVIEW, - }, - { - key: CUSTOM_METRICS, - section: 'metrics', - icon: "sliders", - label: getStatusLabel(CUSTOM_METRICS), - active: status === CUSTOM_METRICS, - }, - { - key: ERRORS_N_CRASHES, - section: 'metrics', - icon: "exclamation-circle", - label: getStatusLabel(ERRORS_N_CRASHES), - active: status === ERRORS_N_CRASHES, - }, - { - key: PERFORMANCE, - section: 'metrics', - icon: "tachometer-slow", - label: getStatusLabel(PERFORMANCE), - active: status === PERFORMANCE, - }, - { - key: RESOURCES, - section: 'metrics', - icon: "collection", - label: getStatusLabel(RESOURCES), - active: status === RESOURCES, - }, - -]; - -function getStatusLabel(status) { - switch(status) { - case OVERVIEW: - return "Overview"; - case CUSTOM_METRICS: - return "Custom Metrics"; - case PERFORMANCE: - return "Performance"; - case ERRORS_N_CRASHES: - return "Errors"; - case RESOURCES: - return "Resources"; - default: - return ""; - } -} - -function isInViewport(el) { - const rect = el.getBoundingClientRect(); - return ( - rect.top >= 0 && - rect.left >= 0 && - rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && - rect.right <= (window.innerWidth || document.documentElement.clientWidth) - ); -} - -@withPermissions(['METRICS'], 'page-margin container-90') -@connect(state => ({ - period: state.getIn([ 'dashboard', 'period' ]), - comparing: state.getIn([ 'dashboard', 'comparing' ]), - platform: state.getIn([ 'dashboard', 'platform' ]), - dashboardAppearance: state.getIn([ 'user', 'account', 'appearance', 'dashboard' ]), - activeWidget: state.getIn(['customMetrics', 'activeWidget']), - appearance: state.getIn([ 'user', 'account', 'appearance' ]), -}), { setPeriod, setPlatform, fetchMetadataOptions }) -@withPageTitle('Metrics - OpenReplay') -@withRouter -export default class Dashboard extends React.PureComponent { - constructor(props) { - super(props) - this.list = {}; - menuList.forEach(item => { - this.list[item.key] = React.createRef(); - }); - props.fetchMetadataOptions(); - } - - state = { - rangeName: this.props.period.rangeName, - startDate: null, - endDate: null, - pageSection: 'metrics', - }; - - getWidgetsByKey = (widgetType) => { - return WIDGET_LIST.filter(({ key, type }) => !this.props.appearance.dashboard[ key ] && type === widgetType); - } - - componentDidMount() { - const { history, location } = this.props; - // TODO check the hash navigato it - } - - onMenuItemClick = ({section, key}) => { - const { history, location } = this.props; - const path = location.pathname + '#' + key; - history.push(path); - this.setState({ pageSection: section }); - setTimeout(function() { - this.navigateHash(section, key); - }.bind(this), 10); - } - - navigateHash = (section, key) => { - const { history, location } = this.props; - - const element = this.list[key].current; - const offset = 110; - const bodyRect = document.body.getBoundingClientRect().top; - const elementRect = element.getBoundingClientRect().top; - const elementPosition = elementRect - bodyRect; - const offsetPosition = elementPosition - offset; - - const path = location.pathname + '#' + key; - history.push(path); - window.scrollTo({ - top: offsetPosition, - behavior: 'smooth' - }); - } - - render() { - const { dashboardAppearance, comparing, activeWidget } = this.props; - const { pageSection } = this.state; - - const noWidgets = WIDGET_KEYS - .filter(key => dashboardAppearance[ key ]) - .length === 0; - - return ( -
    -
    - -
    -
    -
    -
    - - - { activeWidget && } -
    -
    - - -
    - -
    -
    - - - {comparing && ( -
    - - Custom Metrics are not supported for comparison. -
    - )} -
    - } - > -
    - null}/> -
    - - - -
    - { dashboardAppearance.impactedSessionsByJsErrors && } - { dashboardAppearance.errorsPerDomains && } - { dashboardAppearance.errorsPerType && } - { dashboardAppearance.resourcesByParty && } - { dashboardAppearance.domainsErrors_4xx && } - { dashboardAppearance.domainsErrors_5xx && } - { dashboardAppearance.callsErrors && -
    - } -
    -
    - - -
    - { dashboardAppearance.speedLocation && } - { dashboardAppearance.crashes && } - { dashboardAppearance.pagesResponseTime && } - { dashboardAppearance.impactedSessionsBySlowPages && } - { dashboardAppearance.pagesResponseTimeDistribution && -
    - } - { dashboardAppearance.pagesDomBuildtime && } - { dashboardAppearance.timeToRender && } - { dashboardAppearance.memoryConsumption && } - { dashboardAppearance.cpu && } - { dashboardAppearance.slowestDomains && } - { dashboardAppearance.resourcesVsVisuallyComplete && } - { dashboardAppearance.fps && } - { dashboardAppearance.sessionsPerBrowser && } -
    -
    - - -
    - { dashboardAppearance.resourcesCountByType && } - { dashboardAppearance.resourcesLoadingTime && } - { dashboardAppearance.resourceTypeVsResponseEnd && } - { dashboardAppearance.missingResources && } - { dashboardAppearance.slowestResources && -
    - } -
    -
    - -
    -
    -
    - - -
    - ); - } -} diff --git a/frontend/app/components/Dashboard/DashboardHeader/DashboardHeader.js b/frontend/app/components/Dashboard/DashboardHeader/DashboardHeader.js index c4160b598..cc8792848 100644 --- a/frontend/app/components/Dashboard/DashboardHeader/DashboardHeader.js +++ b/frontend/app/components/Dashboard/DashboardHeader/DashboardHeader.js @@ -4,7 +4,7 @@ import { ALL, DESKTOP, MOBILE } from 'Types/app/platform'; import { connect } from 'react-redux'; import { setPeriod, setPlatform } from 'Duck/dashboard'; import cn from 'classnames'; -import styles from './DashboardHeader.css'; +import styles from './DashboardHeader.module.css'; import Filters from '../Filters/Filters'; export const PERIOD_OPTIONS = [ diff --git a/frontend/app/components/Dashboard/DashboardHeader/DashboardHeader.css b/frontend/app/components/Dashboard/DashboardHeader/DashboardHeader.module.css similarity index 100% rename from frontend/app/components/Dashboard/DashboardHeader/DashboardHeader.css rename to frontend/app/components/Dashboard/DashboardHeader/DashboardHeader.module.css diff --git a/frontend/app/components/Dashboard/Filters/FilterItem/FilterItem.js b/frontend/app/components/Dashboard/Filters/FilterItem/FilterItem.js deleted file mode 100644 index 4fc4410cf..000000000 --- a/frontend/app/components/Dashboard/Filters/FilterItem/FilterItem.js +++ /dev/null @@ -1,86 +0,0 @@ -import React, { useState } from 'react'; -import { Icon, Button } from 'UI'; -import { LAST_24_HOURS, LAST_30_MINUTES, LAST_7_DAYS, LAST_30_DAYS, CUSTOM_RANGE } from 'Types/app/period'; -import stl from './filterItem.css'; -import cn from 'classnames'; -import { setPeriod } from 'Duck/dashboard'; -import { connect } from 'react-redux'; -import { debounce } from 'App/utils'; -import DateRangeDropdown from 'Shared/DateRangeDropdown/DateRangeDropdown'; -import FilterDropdown from 'Shared/FilterDropdown'; - -export const PERIOD_OPTIONS = [ - { text: 'Past 30 Min', value: LAST_30_MINUTES }, - { text: 'Past 24 Hours', value: LAST_24_HOURS }, - { text: 'Past 7 Days', value: LAST_7_DAYS }, - { text: 'Past 30 Days', value: LAST_30_DAYS }, - { text: 'Choose Date', value: CUSTOM_RANGE }, -]; - -const FilterItem = props => { - const { period, filters, compare = false, metaOptions } = props; - const filterKeyMaps = filters.map(f => f.key).toJS(); - const [rangeName, setRangeName] = useState(period.rangeName) - const [startDate, setStartDate] = useState(null) - const [endDate, setEndDate] = useState(null) - const setPeriod = debounce(props.setPeriod, 500) - - const onDateChange = (e) => { - setPeriod(compare, { rangeName: e.rangeValue, start: e.startDate, end: e.endDate }); - setRangeName(e.rangeValue) - setStartDate(e.startDate) - setEndDate(e.endDate) - } - - return ( -
    -
    - -
    - -
    - {filters.map(f => ( -
    -
    - {f.value} - props.removeFilter(f)} /> -
    -
    - ))} - -
    -
    -
    - {filters.size > 0 && ( - - )} - { compare && - - } -
    -
    -
    - ) -} - -export default connect((state, props) => { - const comparing = props && props.compare; - return { - period: state.getIn([ 'dashboard', comparing ? 'periodCompare' : 'period' ]), - metaOptions: state.getIn([ 'dashboard', 'metaOptions' ]) - } -}, { setPeriod })(FilterItem) \ No newline at end of file diff --git a/frontend/app/components/Dashboard/Filters/FilterItem/filterItem.css b/frontend/app/components/Dashboard/Filters/FilterItem/filterItem.css deleted file mode 100644 index 3a6bb1008..000000000 --- a/frontend/app/components/Dashboard/Filters/FilterItem/filterItem.css +++ /dev/null @@ -1,29 +0,0 @@ -.wrapper { - min-height: 38px; -} - -.dropdown { - display: 'flex' !important; - align-items: 'center'; - padding: 5px 8px; - border-radius: 3px; - transition: all 0.3s; - font-weight: 500; - - &:hover { - background-color: #DDDDDD; - transition: all 0.2s; - } -} - -.circle { - width: 15px; - height: 15px; - background-color: $tealx; - border-radius: 50%; - margin-right: 10px; - - &.compare { - background-color: $teal; - } -} \ No newline at end of file diff --git a/frontend/app/components/Dashboard/Filters/FilterItem/index.js b/frontend/app/components/Dashboard/Filters/FilterItem/index.js deleted file mode 100644 index 7442505f6..000000000 --- a/frontend/app/components/Dashboard/Filters/FilterItem/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './FilterItem'; diff --git a/frontend/app/components/Dashboard/Filters/Filters.js b/frontend/app/components/Dashboard/Filters/Filters.js deleted file mode 100644 index 0c4ce0d62..000000000 --- a/frontend/app/components/Dashboard/Filters/Filters.js +++ /dev/null @@ -1,58 +0,0 @@ -import React from 'react' -import { Button } from 'UI'; -import stl from './filters.css'; -import { LAST_24_HOURS, LAST_30_MINUTES, LAST_7_DAYS, LAST_30_DAYS, CUSTOM_RANGE } from 'Types/app/period'; -import FilterItem from './FilterItem'; -import { setComparing, setFilters, clearFilters, removeFilter } from 'Duck/dashboard'; -import { connect } from 'react-redux'; - -export const PERIOD_OPTIONS = [ - { text: 'Past 30 Min', value: LAST_30_MINUTES }, - { text: 'Past 24 Hours', value: LAST_24_HOURS }, - { text: 'Past 7 Days', value: LAST_7_DAYS }, - { text: 'Past 30 Days', value: LAST_30_DAYS }, - { text: 'Choose Date', value: CUSTOM_RANGE }, -]; - -const Filters = props => { - const { rangeName, comparing, filters, filtersCompare } = props; - - return ( -
    - props.setFilters('default', filter)} - removeFilter={filter => props.removeFilter('default', filter.key)} - resetFilters={() => props.clearFilters('default')} - /> -
    - {!comparing && ( -
    - -
    - )} - {comparing && ( - - props.setFilters('compare', filter)} - removeFilter={filter => props.removeFilter('compare', filter.key)} - removeCompare={() => props.setComparing(false)} - resetFilters={() => props.clearFilters('compare')} - /> - - )} -
    - ) -} - -export default connect(state => ({ - comparing: state.getIn([ 'dashboard', 'comparing' ]), - filters: state.getIn([ 'dashboard', 'filters' ]), - filtersCompare: state.getIn([ 'dashboard', 'filtersCompare' ]), -}), { setComparing, setFilters, clearFilters, removeFilter })(Filters) diff --git a/frontend/app/components/Dashboard/Filters/filters.css b/frontend/app/components/Dashboard/Filters/filters.css deleted file mode 100644 index 9c0bda3a4..000000000 --- a/frontend/app/components/Dashboard/Filters/filters.css +++ /dev/null @@ -1,32 +0,0 @@ -.dropdown { - display: 'flex' !important; - align-items: 'center'; - padding: 5px 8px; - border-radius: 3px; - transition: all 0.3s; - font-weight: 500; - - &:hover { - background-color: #DDDDDD; - transition: all 0.2s; - } -} - -.dateInput { - display: flex; - align-items: center; - padding: 4px; - font-weight: 500; - font-size: 14px; - color: $gray-darkest; - - &:hover { - background-color: lightgray; - border-radius: 3px; - } -} - -.divider { - margin: 10px 0; - border-top: solid thin $gray-light; -} \ No newline at end of file diff --git a/frontend/app/components/Dashboard/Filters/index.js b/frontend/app/components/Dashboard/Filters/index.js deleted file mode 100644 index a7eb8c1cf..000000000 --- a/frontend/app/components/Dashboard/Filters/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default as Filters } from './Filters'; diff --git a/frontend/app/components/Dashboard/SideMenu/SideMenuHeader.js b/frontend/app/components/Dashboard/SideMenu/SideMenuHeader.js index 7be18b006..9ab4f194b 100644 --- a/frontend/app/components/Dashboard/SideMenu/SideMenuHeader.js +++ b/frontend/app/components/Dashboard/SideMenu/SideMenuHeader.js @@ -1,5 +1,5 @@ import cn from 'classnames'; -import stl from './sideMenuHeader.css'; +import stl from './sideMenuHeader.module.css'; function SideMenuHeader({ text, className }) { return ( diff --git a/frontend/app/components/Dashboard/SideMenu/SideMenuSection.js b/frontend/app/components/Dashboard/SideMenu/SideMenuSection.js index 338094107..1c7cd3c43 100644 --- a/frontend/app/components/Dashboard/SideMenu/SideMenuSection.js +++ b/frontend/app/components/Dashboard/SideMenu/SideMenuSection.js @@ -1,7 +1,7 @@ import { SideMenuitem } from 'UI'; import SideMenuHeader from './SideMenuHeader'; import { setShowAlerts } from 'Duck/dashboard'; -import stl from './sideMenuSection.css'; +import stl from './sideMenuSection.module.css'; import { connect } from 'react-redux'; import { NavLink } from 'react-router-dom'; import { withSiteId } from 'App/routes'; diff --git a/frontend/app/components/Dashboard/SideMenu/sideMenuHeader.css b/frontend/app/components/Dashboard/SideMenu/sideMenuHeader.module.css similarity index 100% rename from frontend/app/components/Dashboard/SideMenu/sideMenuHeader.css rename to frontend/app/components/Dashboard/SideMenu/sideMenuHeader.module.css diff --git a/frontend/app/components/Dashboard/SideMenu/sideMenuSection.css b/frontend/app/components/Dashboard/SideMenu/sideMenuSection.module.css similarity index 100% rename from frontend/app/components/Dashboard/SideMenu/sideMenuSection.css rename to frontend/app/components/Dashboard/SideMenu/sideMenuSection.module.css diff --git a/frontend/app/components/Dashboard/WidgetHolder/WidgetHolder.js b/frontend/app/components/Dashboard/WidgetHolder/WidgetHolder.js index e5c90967d..7a5d8c2e2 100644 --- a/frontend/app/components/Dashboard/WidgetHolder/WidgetHolder.js +++ b/frontend/app/components/Dashboard/WidgetHolder/WidgetHolder.js @@ -1,7 +1,7 @@ import React from 'react' import { connect } from 'react-redux' import cn from 'classnames' -import stl from './widgetHolder.css' +import stl from './widgetHolder.module.css' import LazyLoad from 'react-lazyload'; const WidgetHolder = props => { diff --git a/frontend/app/components/Dashboard/WidgetHolder/widgetHolder.css b/frontend/app/components/Dashboard/WidgetHolder/widgetHolder.module.css similarity index 100% rename from frontend/app/components/Dashboard/WidgetHolder/widgetHolder.css rename to frontend/app/components/Dashboard/WidgetHolder/widgetHolder.module.css diff --git a/frontend/app/components/Dashboard/WidgetSection/WidgetSection.js b/frontend/app/components/Dashboard/WidgetSection/WidgetSection.js deleted file mode 100644 index 43959ff57..000000000 --- a/frontend/app/components/Dashboard/WidgetSection/WidgetSection.js +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react' -import cn from 'classnames' -import AddWidgets from '../AddWidgets'; - -function WidgetSection({ className, title, children, description, type }) { - return ( -
    -
    -
    -
    {title}
    - {/* */} -
    - {description &&
    {description}
    } -
    - { children } -
    - ) -} - -export default WidgetSection diff --git a/frontend/app/components/Dashboard/WidgetSection/index.js b/frontend/app/components/Dashboard/WidgetSection/index.js deleted file mode 100644 index 13f279e4e..000000000 --- a/frontend/app/components/Dashboard/WidgetSection/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default as WidgetSection } from './WidgetSection'; diff --git a/frontend/app/components/Dashboard/Widgets/ApplicationActivity.js b/frontend/app/components/Dashboard/Widgets/ApplicationActivity.js index d19b83faa..d091e0a66 100644 --- a/frontend/app/components/Dashboard/Widgets/ApplicationActivity.js +++ b/frontend/app/components/Dashboard/Widgets/ApplicationActivity.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader } from 'UI'; import { msToSec } from 'App/date'; import { CountBadge, Divider, widgetHOC } from './common'; diff --git a/frontend/app/components/Dashboard/Widgets/BreakdownOfLoadedResources/BreakdownOfLoadedResources.js b/frontend/app/components/Dashboard/Widgets/BreakdownOfLoadedResources/BreakdownOfLoadedResources.js index 240b9b9bc..10ab766a7 100644 --- a/frontend/app/components/Dashboard/Widgets/BreakdownOfLoadedResources/BreakdownOfLoadedResources.js +++ b/frontend/app/components/Dashboard/Widgets/BreakdownOfLoadedResources/BreakdownOfLoadedResources.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { widgetHOC, Styles } from '../common'; import { diff --git a/frontend/app/components/Dashboard/Widgets/BusiestTimeOfTheDay/BusiestTimeOfTheDay.js b/frontend/app/components/Dashboard/Widgets/BusiestTimeOfTheDay/BusiestTimeOfTheDay.js index a0e601afa..31deb2cba 100644 --- a/frontend/app/components/Dashboard/Widgets/BusiestTimeOfTheDay/BusiestTimeOfTheDay.js +++ b/frontend/app/components/Dashboard/Widgets/BusiestTimeOfTheDay/BusiestTimeOfTheDay.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { Table, widgetHOC, domain } from '../common'; import { diff --git a/frontend/app/components/Dashboard/Widgets/BusiestTimeOfTheDay/Chart.js b/frontend/app/components/Dashboard/Widgets/BusiestTimeOfTheDay/Chart.js index 2a23c4f47..a66c2801d 100644 --- a/frontend/app/components/Dashboard/Widgets/BusiestTimeOfTheDay/Chart.js +++ b/frontend/app/components/Dashboard/Widgets/BusiestTimeOfTheDay/Chart.js @@ -1,3 +1,4 @@ +import React from 'react'; import { AreaChart, Area } from 'recharts'; const Chart = ({ data }) => { diff --git a/frontend/app/components/Dashboard/Widgets/BusiestTimeOfTheDay/ImageInfo.js b/frontend/app/components/Dashboard/Widgets/BusiestTimeOfTheDay/ImageInfo.js index dc085df5c..febeb62b4 100644 --- a/frontend/app/components/Dashboard/Widgets/BusiestTimeOfTheDay/ImageInfo.js +++ b/frontend/app/components/Dashboard/Widgets/BusiestTimeOfTheDay/ImageInfo.js @@ -1,24 +1,20 @@ import { Popup, Icon } from 'UI'; -import styles from './imageInfo.css'; +import styles from './imageInfo.module.css'; const ImageInfo = ({ data }) => (
    + content={ One of the slowest images } + > +
    { 'Preview' }
    - } - content={ One of the slowest images } - /> - { data.name } - } - content={ data.url } - /> + + + { data.name } +
    ); diff --git a/frontend/app/components/Dashboard/Widgets/BusiestTimeOfTheDay/imageInfo.css b/frontend/app/components/Dashboard/Widgets/BusiestTimeOfTheDay/imageInfo.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/BusiestTimeOfTheDay/imageInfo.css rename to frontend/app/components/Dashboard/Widgets/BusiestTimeOfTheDay/imageInfo.module.css diff --git a/frontend/app/components/Dashboard/Widgets/CallWithErrors/CallWithErrors.js b/frontend/app/components/Dashboard/Widgets/CallWithErrors/CallWithErrors.js index 6c7379a2a..8bf8b90c2 100644 --- a/frontend/app/components/Dashboard/Widgets/CallWithErrors/CallWithErrors.js +++ b/frontend/app/components/Dashboard/Widgets/CallWithErrors/CallWithErrors.js @@ -1,10 +1,11 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { Table, widgetHOC } from '../common'; import { getRE } from 'App/utils'; import ImageInfo from './ImageInfo'; import MethodType from './MethodType'; import cn from 'classnames'; -import stl from './callWithErrors.css'; +import stl from './callWithErrors.module.css'; const cols = [ { diff --git a/frontend/app/components/Dashboard/Widgets/CallWithErrors/Chart.js b/frontend/app/components/Dashboard/Widgets/CallWithErrors/Chart.js index 2a23c4f47..a66c2801d 100644 --- a/frontend/app/components/Dashboard/Widgets/CallWithErrors/Chart.js +++ b/frontend/app/components/Dashboard/Widgets/CallWithErrors/Chart.js @@ -1,3 +1,4 @@ +import React from 'react'; import { AreaChart, Area } from 'recharts'; const Chart = ({ data }) => { diff --git a/frontend/app/components/Dashboard/Widgets/CallWithErrors/ImageInfo.js b/frontend/app/components/Dashboard/Widgets/CallWithErrors/ImageInfo.js index 8251bec60..80a2010b9 100644 --- a/frontend/app/components/Dashboard/Widgets/CallWithErrors/ImageInfo.js +++ b/frontend/app/components/Dashboard/Widgets/CallWithErrors/ImageInfo.js @@ -1,5 +1,6 @@ -import { Popup, Icon, TextEllipsis } from 'UI'; -import styles from './imageInfo.css'; +import React from 'react'; +import { TextEllipsis } from 'UI'; +import styles from './imageInfo.module.css'; const ImageInfo = ({ data }) => (
    diff --git a/frontend/app/components/Dashboard/Widgets/CallWithErrors/callWithErrors.css b/frontend/app/components/Dashboard/Widgets/CallWithErrors/callWithErrors.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/CallWithErrors/callWithErrors.css rename to frontend/app/components/Dashboard/Widgets/CallWithErrors/callWithErrors.module.css diff --git a/frontend/app/components/Dashboard/Widgets/CallWithErrors/imageInfo.css b/frontend/app/components/Dashboard/Widgets/CallWithErrors/imageInfo.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/CallWithErrors/imageInfo.css rename to frontend/app/components/Dashboard/Widgets/CallWithErrors/imageInfo.module.css diff --git a/frontend/app/components/Dashboard/Widgets/CallsErrors4xx/CallsErrors4xx.js b/frontend/app/components/Dashboard/Widgets/CallsErrors4xx/CallsErrors4xx.js index 00693315d..7b710adf5 100644 --- a/frontend/app/components/Dashboard/Widgets/CallsErrors4xx/CallsErrors4xx.js +++ b/frontend/app/components/Dashboard/Widgets/CallsErrors4xx/CallsErrors4xx.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { widgetHOC, Styles } from '../common'; import { ResponsiveContainer, XAxis, YAxis, CartesianGrid, diff --git a/frontend/app/components/Dashboard/Widgets/CallsErrors5xx/CallsErrors5xx.js b/frontend/app/components/Dashboard/Widgets/CallsErrors5xx/CallsErrors5xx.js index 3790d64bd..a0e0d05a0 100644 --- a/frontend/app/components/Dashboard/Widgets/CallsErrors5xx/CallsErrors5xx.js +++ b/frontend/app/components/Dashboard/Widgets/CallsErrors5xx/CallsErrors5xx.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { widgetHOC, Styles } from '../common'; import { ResponsiveContainer, XAxis, YAxis, CartesianGrid, diff --git a/frontend/app/components/Dashboard/Widgets/CpuLoad/CpuLoad.js b/frontend/app/components/Dashboard/Widgets/CpuLoad/CpuLoad.js index 479db15e8..0579480fb 100644 --- a/frontend/app/components/Dashboard/Widgets/CpuLoad/CpuLoad.js +++ b/frontend/app/components/Dashboard/Widgets/CpuLoad/CpuLoad.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { widgetHOC, Styles, AvgLabel } from '../common'; import { ResponsiveContainer, XAxis, YAxis, CartesianGrid, AreaChart, Area, Tooltip } from 'recharts'; diff --git a/frontend/app/components/Dashboard/Widgets/Crashes/Crashes.js b/frontend/app/components/Dashboard/Widgets/Crashes/Crashes.js index c657bae19..16f96a07c 100644 --- a/frontend/app/components/Dashboard/Widgets/Crashes/Crashes.js +++ b/frontend/app/components/Dashboard/Widgets/Crashes/Crashes.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { widgetHOC, Styles } from '../common'; import { diff --git a/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricPieChart/CustomMetricPieChart.css b/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricPieChart/CustomMetricPieChart.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricPieChart/CustomMetricPieChart.css rename to frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricPieChart/CustomMetricPieChart.module.css diff --git a/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricTable/CustomMetricTable.css b/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricTable/CustomMetricTable.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricTable/CustomMetricTable.css rename to frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricTable/CustomMetricTable.module.css diff --git a/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricWidget/CustomMetricWidget.css b/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricWidget/CustomMetricWidget.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricWidget/CustomMetricWidget.css rename to frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricWidget/CustomMetricWidget.module.css diff --git a/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricWidget/CustomMetricWidget.tsx b/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricWidget/CustomMetricWidget.tsx index 432cef988..51420daf8 100644 --- a/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricWidget/CustomMetricWidget.tsx +++ b/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricWidget/CustomMetricWidget.tsx @@ -4,7 +4,7 @@ import { Loader, NoContent, Icon, Popup } from 'UI'; import { Styles } from '../../common'; import { ResponsiveContainer } from 'recharts'; import { LAST_24_HOURS, LAST_30_MINUTES, YESTERDAY, LAST_7_DAYS } from 'Types/app/period'; -import stl from './CustomMetricWidget.css'; +import stl from './CustomMetricWidget.module.css'; import { getChartFormatter, getStartAndEndTimestampsByDensity } from 'Types/dashboard/helper'; import { init, edit, remove, setAlertMetricId, setActiveWidget, updateActiveState } from 'Duck/customMetrics'; import APIClient from 'App/api_client'; @@ -195,13 +195,10 @@ export default connect(state => ({ const WidgetIcon = ({ className = '', tooltip = '', icon, onClick }) => ( - -
    - } content={tooltip} - position="top center" - inverted - /> + > +
    + +
    + ) diff --git a/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricWidgetPreview/CustomMetricWidgetPreview.css b/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricWidgetPreview/CustomMetricWidgetPreview.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricWidgetPreview/CustomMetricWidgetPreview.css rename to frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricWidgetPreview/CustomMetricWidgetPreview.module.css diff --git a/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricWidgetPreview/CustomMetricWidgetPreview.tsx b/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricWidgetPreview/CustomMetricWidgetPreview.tsx index a1a2534f9..5f90e01ac 100644 --- a/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricWidgetPreview/CustomMetricWidgetPreview.tsx +++ b/frontend/app/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricWidgetPreview/CustomMetricWidgetPreview.tsx @@ -4,7 +4,7 @@ import { Loader, NoContent, SegmentSelection, Icon } from 'UI'; import { Styles } from '../../common'; // import { ResponsiveContainer, XAxis, YAxis, CartesianGrid, Tooltip, LineChart, Line, Legend } from 'recharts'; import Period, { LAST_24_HOURS, LAST_30_MINUTES, YESTERDAY, LAST_7_DAYS } from 'Types/app/period'; -import stl from './CustomMetricWidgetPreview.css'; +import stl from './CustomMetricWidgetPreview.module.css'; import { getChartFormatter } from 'Types/dashboard/helper'; import { remove } from 'Duck/customMetrics'; import DateRange from 'Shared/DateRange'; diff --git a/frontend/app/components/Dashboard/Widgets/DomBuildingTime/DomBuildingTime.js b/frontend/app/components/Dashboard/Widgets/DomBuildingTime/DomBuildingTime.js index c46bea4f7..27cc682ff 100644 --- a/frontend/app/components/Dashboard/Widgets/DomBuildingTime/DomBuildingTime.js +++ b/frontend/app/components/Dashboard/Widgets/DomBuildingTime/DomBuildingTime.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { widgetHOC, Styles, AvgLabel } from '../common'; import { withRequest } from 'HOCs'; diff --git a/frontend/app/components/Dashboard/Widgets/Errors/Errors.js b/frontend/app/components/Dashboard/Widgets/Errors/Errors.js index 0faf167cf..ad2313c7f 100644 --- a/frontend/app/components/Dashboard/Widgets/Errors/Errors.js +++ b/frontend/app/components/Dashboard/Widgets/Errors/Errors.js @@ -1,7 +1,8 @@ +import React from 'react'; import { ResponsiveContainer, AreaChart, XAxis, YAxis, CartesianGrid, Area } from 'recharts'; import { Loader, NoContent } from 'UI'; import { CountBadge, domain, widgetHOC } from '../common'; -import styles from './errors.css'; +import styles from './errors.module.css'; @widgetHOC('errors') export default class Errors extends React.PureComponent { diff --git a/frontend/app/components/Dashboard/Widgets/Errors/errors.css b/frontend/app/components/Dashboard/Widgets/Errors/errors.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/Errors/errors.css rename to frontend/app/components/Dashboard/Widgets/Errors/errors.module.css diff --git a/frontend/app/components/Dashboard/Widgets/ErrorsByOrigin/ErrorsByOrigin.js b/frontend/app/components/Dashboard/Widgets/ErrorsByOrigin/ErrorsByOrigin.js index eaa4802b9..399908f74 100644 --- a/frontend/app/components/Dashboard/Widgets/ErrorsByOrigin/ErrorsByOrigin.js +++ b/frontend/app/components/Dashboard/Widgets/ErrorsByOrigin/ErrorsByOrigin.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { widgetHOC, Styles } from '../common'; import { diff --git a/frontend/app/components/Dashboard/Widgets/ErrorsByType/ErrorsByType.js b/frontend/app/components/Dashboard/Widgets/ErrorsByType/ErrorsByType.js index fc07c8ec9..3bca2406c 100644 --- a/frontend/app/components/Dashboard/Widgets/ErrorsByType/ErrorsByType.js +++ b/frontend/app/components/Dashboard/Widgets/ErrorsByType/ErrorsByType.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { widgetHOC, domain, Styles } from '../common'; import { numberWithCommas} from 'App/utils'; diff --git a/frontend/app/components/Dashboard/Widgets/ErrorsPerDomain/Bar.js b/frontend/app/components/Dashboard/Widgets/ErrorsPerDomain/Bar.js index 8a09c13d4..14f52349d 100644 --- a/frontend/app/components/Dashboard/Widgets/ErrorsPerDomain/Bar.js +++ b/frontend/app/components/Dashboard/Widgets/ErrorsPerDomain/Bar.js @@ -1,5 +1,5 @@ import React from 'react' -import stl from './Bar.css' +import stl from './Bar.module.css' const Bar = ({ className = '', width = 0, avg, domain, color }) => { return ( diff --git a/frontend/app/components/Dashboard/Widgets/ErrorsPerDomain/Bar.css b/frontend/app/components/Dashboard/Widgets/ErrorsPerDomain/Bar.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/ErrorsPerDomain/Bar.css rename to frontend/app/components/Dashboard/Widgets/ErrorsPerDomain/Bar.module.css diff --git a/frontend/app/components/Dashboard/Widgets/ErrorsPerDomain/ErrorsPerDomain.js b/frontend/app/components/Dashboard/Widgets/ErrorsPerDomain/ErrorsPerDomain.js index 3a152161d..68752c46b 100644 --- a/frontend/app/components/Dashboard/Widgets/ErrorsPerDomain/ErrorsPerDomain.js +++ b/frontend/app/components/Dashboard/Widgets/ErrorsPerDomain/ErrorsPerDomain.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { Table, widgetHOC, domain, AvgLabel, Styles } from '../common'; import Bar from './Bar'; diff --git a/frontend/app/components/Dashboard/Widgets/FPS/FPS.js b/frontend/app/components/Dashboard/Widgets/FPS/FPS.js index 2da364985..d91379188 100644 --- a/frontend/app/components/Dashboard/Widgets/FPS/FPS.js +++ b/frontend/app/components/Dashboard/Widgets/FPS/FPS.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { widgetHOC, Styles, AvgLabel } from '../common'; import { ResponsiveContainer, Tooltip, XAxis, YAxis, CartesianGrid, AreaChart, Area } from 'recharts'; diff --git a/frontend/app/components/Dashboard/Widgets/LastFrustrations/LastFrustrations.js b/frontend/app/components/Dashboard/Widgets/LastFrustrations/LastFrustrations.js index ee68539b8..23f5731d9 100644 --- a/frontend/app/components/Dashboard/Widgets/LastFrustrations/LastFrustrations.js +++ b/frontend/app/components/Dashboard/Widgets/LastFrustrations/LastFrustrations.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent, BrowserIcon, OsIcon } from 'UI'; import { countries } from 'App/constants'; import { diffFromNowString } from 'App/date'; diff --git a/frontend/app/components/Dashboard/Widgets/LastPerformance/LastPerformance.js b/frontend/app/components/Dashboard/Widgets/LastPerformance/LastPerformance.js index e23e10be1..e44e556aa 100644 --- a/frontend/app/components/Dashboard/Widgets/LastPerformance/LastPerformance.js +++ b/frontend/app/components/Dashboard/Widgets/LastPerformance/LastPerformance.js @@ -1,4 +1,4 @@ -import { connect } from 'react-redux'; +import React from 'react'; import { Loader, NoContent } from 'UI'; import { widgetHOC, SessionLine } from '../common'; diff --git a/frontend/app/components/Dashboard/Widgets/MemoryConsumption/MemoryConsumption.js b/frontend/app/components/Dashboard/Widgets/MemoryConsumption/MemoryConsumption.js index cc778a02d..839db02bc 100644 --- a/frontend/app/components/Dashboard/Widgets/MemoryConsumption/MemoryConsumption.js +++ b/frontend/app/components/Dashboard/Widgets/MemoryConsumption/MemoryConsumption.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { widgetHOC, Styles, AvgLabel } from '../common'; import { ResponsiveContainer, Tooltip, XAxis, YAxis, CartesianGrid, AreaChart, Area } from 'recharts'; diff --git a/frontend/app/components/Dashboard/Widgets/MissingResources/Chart.js b/frontend/app/components/Dashboard/Widgets/MissingResources/Chart.js index 0cbf173c1..cf2e5758e 100644 --- a/frontend/app/components/Dashboard/Widgets/MissingResources/Chart.js +++ b/frontend/app/components/Dashboard/Widgets/MissingResources/Chart.js @@ -1,3 +1,4 @@ +import React from 'react'; import { AreaChart, Area } from 'recharts'; import { Styles } from '../common'; diff --git a/frontend/app/components/Dashboard/Widgets/MissingResources/MissingResources.js b/frontend/app/components/Dashboard/Widgets/MissingResources/MissingResources.js index c9803e43d..af2444418 100644 --- a/frontend/app/components/Dashboard/Widgets/MissingResources/MissingResources.js +++ b/frontend/app/components/Dashboard/Widgets/MissingResources/MissingResources.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { Table, widgetHOC } from '../common'; import Chart from './Chart'; diff --git a/frontend/app/components/Dashboard/Widgets/MissingResources/ResourceInfo.js b/frontend/app/components/Dashboard/Widgets/MissingResources/ResourceInfo.js index d4b1ed9b8..0a3ba485e 100644 --- a/frontend/app/components/Dashboard/Widgets/MissingResources/ResourceInfo.js +++ b/frontend/app/components/Dashboard/Widgets/MissingResources/ResourceInfo.js @@ -1,7 +1,8 @@ +import React from 'react'; import { diffFromNowString } from 'App/date'; import { TextEllipsis } from 'UI'; -import styles from './resourceInfo.css'; +import styles from './resourceInfo.module.css'; export default class ResourceInfo extends React.PureComponent { render() { diff --git a/frontend/app/components/Dashboard/Widgets/MissingResources/resourceInfo.css b/frontend/app/components/Dashboard/Widgets/MissingResources/resourceInfo.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/MissingResources/resourceInfo.css rename to frontend/app/components/Dashboard/Widgets/MissingResources/resourceInfo.module.css diff --git a/frontend/app/components/Dashboard/Widgets/MostImpactfulErrors/ErrorInfo.js b/frontend/app/components/Dashboard/Widgets/MostImpactfulErrors/ErrorInfo.js index 4dbbd2583..4ac5e5f67 100644 --- a/frontend/app/components/Dashboard/Widgets/MostImpactfulErrors/ErrorInfo.js +++ b/frontend/app/components/Dashboard/Widgets/MostImpactfulErrors/ErrorInfo.js @@ -1,6 +1,7 @@ +import React from 'react'; import { diffFromNowString } from 'App/date'; import { TextEllipsis } from 'UI'; -import styles from './errorInfo.css'; +import styles from './errorInfo.module.css'; export default class ErrorInfo extends React.PureComponent { findJourneys = () => this.props.findJourneys(this.props.data.error) diff --git a/frontend/app/components/Dashboard/Widgets/MostImpactfulErrors/MostImpactfulErrors.js b/frontend/app/components/Dashboard/Widgets/MostImpactfulErrors/MostImpactfulErrors.js index ef10f02e6..6f2d300a1 100644 --- a/frontend/app/components/Dashboard/Widgets/MostImpactfulErrors/MostImpactfulErrors.js +++ b/frontend/app/components/Dashboard/Widgets/MostImpactfulErrors/MostImpactfulErrors.js @@ -1,3 +1,4 @@ +import React from 'react'; import { connect } from 'react-redux'; import withSiteIdRouter from 'HOCs/withSiteIdRouter'; import { Loader, NoContent } from 'UI'; diff --git a/frontend/app/components/Dashboard/Widgets/MostImpactfulErrors/errorInfo.css b/frontend/app/components/Dashboard/Widgets/MostImpactfulErrors/errorInfo.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/MostImpactfulErrors/errorInfo.css rename to frontend/app/components/Dashboard/Widgets/MostImpactfulErrors/errorInfo.module.css diff --git a/frontend/app/components/Dashboard/Widgets/OverviewWidgets/OverviewWidgets.js b/frontend/app/components/Dashboard/Widgets/OverviewWidgets/OverviewWidgets.js index 11d819175..e42e643a0 100644 --- a/frontend/app/components/Dashboard/Widgets/OverviewWidgets/OverviewWidgets.js +++ b/frontend/app/components/Dashboard/Widgets/OverviewWidgets/OverviewWidgets.js @@ -1,3 +1,4 @@ +import React from 'react'; import { widgetHOC } from '../common'; import { TrendChart } from '../TrendChart'; import { OVERVIEW_WIDGET_MAP } from 'Types/dashboard'; @@ -6,7 +7,7 @@ import { connect } from 'react-redux'; import { updateAppearance } from 'Duck/user'; import { LAST_24_HOURS, LAST_30_MINUTES, YESTERDAY, LAST_7_DAYS } from 'Types/app/period'; import cn from 'classnames'; -import stl from './overviewWidgets.css'; +import stl from './overviewWidgets.module.css'; const customParams = rangeName => { const params = { density: 16 } diff --git a/frontend/app/components/Dashboard/Widgets/OverviewWidgets/overviewWidgets.css b/frontend/app/components/Dashboard/Widgets/OverviewWidgets/overviewWidgets.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/OverviewWidgets/overviewWidgets.css rename to frontend/app/components/Dashboard/Widgets/OverviewWidgets/overviewWidgets.module.css diff --git a/frontend/app/components/Dashboard/Widgets/PageMetrics.js b/frontend/app/components/Dashboard/Widgets/PageMetrics.js index 333b5b4cc..0df75ae99 100644 --- a/frontend/app/components/Dashboard/Widgets/PageMetrics.js +++ b/frontend/app/components/Dashboard/Widgets/PageMetrics.js @@ -1,4 +1,4 @@ -import { connect } from 'react-redux'; +import React from 'react'; import { Loader } from 'UI'; import { CountBadge, Divider, widgetHOC } from './common'; diff --git a/frontend/app/components/Dashboard/Widgets/Performance/Performance.js b/frontend/app/components/Dashboard/Widgets/Performance/Performance.js index 7876f1ee8..d31e64269 100644 --- a/frontend/app/components/Dashboard/Widgets/Performance/Performance.js +++ b/frontend/app/components/Dashboard/Widgets/Performance/Performance.js @@ -1,3 +1,4 @@ +import React from 'react'; import { connect } from 'react-redux'; import { Map } from 'immutable'; import cn from 'classnames'; @@ -8,7 +9,7 @@ import { LAST_24_HOURS, LAST_30_MINUTES, LAST_7_DAYS, LAST_30_DAYS } from 'Types import { fetchPerformanseSearch } from 'Duck/dashboard'; import { widgetHOC } from '../common'; -import styles from './performance.css'; +import styles from './performance.module.css'; const BASE_KEY = 'resource'; @@ -113,16 +114,15 @@ export default class Performance extends React.PureComponent { const resourceIndex = Number.parseInt(value.substr(BASE_KEY.length)); return ( + - } - wide - content={ this.state.resources.getIn([ resourceIndex, 'value' ]) } - /> + ); } } diff --git a/frontend/app/components/Dashboard/Widgets/Performance/performance.css b/frontend/app/components/Dashboard/Widgets/Performance/performance.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/Performance/performance.css rename to frontend/app/components/Dashboard/Widgets/Performance/performance.module.css diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/CallWithErrors.tsx b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/CallWithErrors.tsx index 698c8ee18..45673614f 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/CallWithErrors.tsx +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/CallWithErrors.tsx @@ -5,7 +5,7 @@ import { getRE } from 'App/utils'; import ImageInfo from './ImageInfo'; import MethodType from './MethodType'; import cn from 'classnames'; -import stl from './callWithErrors.css'; +import stl from './callWithErrors.module.css'; const cols = [ { diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/Chart.js b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/Chart.js index 2f406622d..11f184df2 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/Chart.js +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/Chart.js @@ -1,3 +1,4 @@ +import React from 'react'; import { AreaChart, Area } from 'recharts'; import { Styles } from '../../common'; diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/ImageInfo.js b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/ImageInfo.js index 8251bec60..80a2010b9 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/ImageInfo.js +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/ImageInfo.js @@ -1,5 +1,6 @@ -import { Popup, Icon, TextEllipsis } from 'UI'; -import styles from './imageInfo.css'; +import React from 'react'; +import { TextEllipsis } from 'UI'; +import styles from './imageInfo.module.css'; const ImageInfo = ({ data }) => (
    diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/callWithErrors.css b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/callWithErrors.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/callWithErrors.css rename to frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/callWithErrors.module.css diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/imageInfo.css b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/imageInfo.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/imageInfo.css rename to frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/imageInfo.module.css diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/MissingResources/Chart.js b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/MissingResources/Chart.js index 2f406622d..11f184df2 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/MissingResources/Chart.js +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/MissingResources/Chart.js @@ -1,3 +1,4 @@ +import React from 'react'; import { AreaChart, Area } from 'recharts'; import { Styles } from '../../common'; diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/MissingResources/ResourceInfo.js b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/MissingResources/ResourceInfo.js index d4b1ed9b8..0a3ba485e 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/MissingResources/ResourceInfo.js +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/MissingResources/ResourceInfo.js @@ -1,7 +1,8 @@ +import React from 'react'; import { diffFromNowString } from 'App/date'; import { TextEllipsis } from 'UI'; -import styles from './resourceInfo.css'; +import styles from './resourceInfo.module.css'; export default class ResourceInfo extends React.PureComponent { render() { diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/MissingResources/resourceInfo.css b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/MissingResources/resourceInfo.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/PredefinedWidgets/MissingResources/resourceInfo.css rename to frontend/app/components/Dashboard/Widgets/PredefinedWidgets/MissingResources/resourceInfo.module.css diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SessionsPerBrowser/Bar.js b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SessionsPerBrowser/Bar.js index b1204ee9e..0894e7426 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SessionsPerBrowser/Bar.js +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SessionsPerBrowser/Bar.js @@ -1,5 +1,5 @@ import React from 'react' -import stl from './Bar.css' +import stl from './Bar.module.css' // import { Styles } from '../common' import { TextEllipsis } from 'UI'; diff --git a/frontend/app/components/Dashboard/Widgets/SessionsPerBrowser/Bar.css b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SessionsPerBrowser/Bar.module.css similarity index 88% rename from frontend/app/components/Dashboard/Widgets/SessionsPerBrowser/Bar.css rename to frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SessionsPerBrowser/Bar.module.css index dde6009e4..39420d6f2 100644 --- a/frontend/app/components/Dashboard/Widgets/SessionsPerBrowser/Bar.css +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SessionsPerBrowser/Bar.module.css @@ -4,8 +4,8 @@ border-radius: 3px; display: flex; align-items: center; - & div { - padding: 0 5px; + & > div { + padding: 3px !important; height: 20px; color: #FFF; } diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SlowestResources/Chart.js b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SlowestResources/Chart.js index ab0a27a94..7833688bb 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SlowestResources/Chart.js +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SlowestResources/Chart.js @@ -1,3 +1,4 @@ +import React from 'react'; import { AreaChart, Area } from 'recharts'; import { Styles } from '../../common'; diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SlowestResources/ImageInfo.js b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SlowestResources/ImageInfo.js index fed6b71b6..c220e44cf 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SlowestResources/ImageInfo.js +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SlowestResources/ImageInfo.js @@ -1,6 +1,7 @@ +import React from 'react'; import { Popup } from 'UI'; import cn from 'classnames'; -import styles from './imageInfo.css'; +import styles from './imageInfo.module.css'; const supportedTypes = ['png', 'jpg', 'jpeg', 'svg']; @@ -10,14 +11,13 @@ const ImageInfo = ({ data }) => {
    -
    {data.name}
    -
    - } disabled={!canPreview} content={ One of the slowest images } - /> + > +
    +
    {data.name}
    +
    +
    ) }; diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SlowestResources/imageInfo.css b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SlowestResources/imageInfo.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SlowestResources/imageInfo.css rename to frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SlowestResources/imageInfo.module.css diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SpeedIndexByLocation/Scale.js b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SpeedIndexByLocation/Scale.js index 2171c432e..c83d32110 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SpeedIndexByLocation/Scale.js +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SpeedIndexByLocation/Scale.js @@ -1,7 +1,7 @@ import React from 'react' import { Styles } from '../../common'; import cn from 'classnames'; -import stl from './scale.css'; +import stl from './scale.module.css'; function Scale({ colors }) { const lastIndex = (Styles.colors.length - 1) diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SpeedIndexByLocation/SpeedIndexByLocation.css b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SpeedIndexByLocation/SpeedIndexByLocation.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SpeedIndexByLocation/SpeedIndexByLocation.css rename to frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SpeedIndexByLocation/SpeedIndexByLocation.module.css diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SpeedIndexByLocation/SpeedIndexByLocation.tsx b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SpeedIndexByLocation/SpeedIndexByLocation.tsx index a538ed36a..5b4946901 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SpeedIndexByLocation/SpeedIndexByLocation.tsx +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SpeedIndexByLocation/SpeedIndexByLocation.tsx @@ -6,7 +6,7 @@ import { observer } from 'mobx-react-lite'; import { numberWithCommas, positionOfTheNumber } from 'App/utils'; import WorldMap from "@svg-maps/world"; import { SVGMap } from "react-svg-map"; -import stl from './SpeedIndexByLocation.css'; +import stl from './SpeedIndexByLocation.module.css'; import cn from 'classnames'; interface Props { diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SpeedIndexByLocation/scale.css b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SpeedIndexByLocation/scale.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SpeedIndexByLocation/scale.css rename to frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SpeedIndexByLocation/scale.module.css diff --git a/frontend/app/components/Dashboard/Widgets/ProcessedSessions.js b/frontend/app/components/Dashboard/Widgets/ProcessedSessions.js index 9155e89a7..7b1a92918 100644 --- a/frontend/app/components/Dashboard/Widgets/ProcessedSessions.js +++ b/frontend/app/components/Dashboard/Widgets/ProcessedSessions.js @@ -1,4 +1,4 @@ -import { connect } from 'react-redux'; +import React from 'react'; import { ResponsiveContainer, AreaChart, XAxis, YAxis, CartesianGrid, Area } from 'recharts'; import { Loader } from 'UI'; import { CountBadge, domain, widgetHOC, Styles } from './common'; diff --git a/frontend/app/components/Dashboard/Widgets/ResourceLoadedVsResponseEnd/ResourceLoadedVsResponseEnd.js b/frontend/app/components/Dashboard/Widgets/ResourceLoadedVsResponseEnd/ResourceLoadedVsResponseEnd.js index 23ed0047b..e106b3728 100644 --- a/frontend/app/components/Dashboard/Widgets/ResourceLoadedVsResponseEnd/ResourceLoadedVsResponseEnd.js +++ b/frontend/app/components/Dashboard/Widgets/ResourceLoadedVsResponseEnd/ResourceLoadedVsResponseEnd.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { widgetHOC, Styles } from '../common'; import { ComposedChart, Bar, CartesianGrid, Line, Legend, ResponsiveContainer, diff --git a/frontend/app/components/Dashboard/Widgets/ResourceLoadedVsVisuallyComplete/ResourceLoadedVsVisuallyComplete.js b/frontend/app/components/Dashboard/Widgets/ResourceLoadedVsVisuallyComplete/ResourceLoadedVsVisuallyComplete.js index ba5651c55..d883964a3 100644 --- a/frontend/app/components/Dashboard/Widgets/ResourceLoadedVsVisuallyComplete/ResourceLoadedVsVisuallyComplete.js +++ b/frontend/app/components/Dashboard/Widgets/ResourceLoadedVsVisuallyComplete/ResourceLoadedVsVisuallyComplete.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { widgetHOC, Styles } from '../common'; import { diff --git a/frontend/app/components/Dashboard/Widgets/ResourceLoadingTime/ResourceLoadingTime.js b/frontend/app/components/Dashboard/Widgets/ResourceLoadingTime/ResourceLoadingTime.js index 83f0a7625..262312f1b 100644 --- a/frontend/app/components/Dashboard/Widgets/ResourceLoadingTime/ResourceLoadingTime.js +++ b/frontend/app/components/Dashboard/Widgets/ResourceLoadingTime/ResourceLoadingTime.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent, DropdownPlain } from 'UI'; import { widgetHOC, Styles, AvgLabel } from '../common'; import { withRequest } from 'HOCs'; diff --git a/frontend/app/components/Dashboard/Widgets/ResponseTime/ResponseTime.js b/frontend/app/components/Dashboard/Widgets/ResponseTime/ResponseTime.js index 60f23042a..549c20f14 100644 --- a/frontend/app/components/Dashboard/Widgets/ResponseTime/ResponseTime.js +++ b/frontend/app/components/Dashboard/Widgets/ResponseTime/ResponseTime.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { widgetHOC, domain, Styles, AvgLabel } from '../common'; import { ResponsiveContainer, AreaChart, XAxis, YAxis, CartesianGrid, Area, Tooltip } from 'recharts'; diff --git a/frontend/app/components/Dashboard/Widgets/ResponseTimeDistribution/ResponseTimeDistribution.js b/frontend/app/components/Dashboard/Widgets/ResponseTimeDistribution/ResponseTimeDistribution.js index 10373abe6..242dc0932 100644 --- a/frontend/app/components/Dashboard/Widgets/ResponseTimeDistribution/ResponseTimeDistribution.js +++ b/frontend/app/components/Dashboard/Widgets/ResponseTimeDistribution/ResponseTimeDistribution.js @@ -1,9 +1,9 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; -import { widgetHOC, domain, Styles, AvgLabel } from '../common'; -import { numberWithCommas } from 'App/utils'; +import { widgetHOC, Styles, AvgLabel } from '../common'; import { ComposedChart, Bar, BarChart, CartesianGrid, ResponsiveContainer, - XAxis, YAxis, ReferenceLine, Tooltip, Legend + XAxis, YAxis, ReferenceLine, Tooltip } from 'recharts'; import { LAST_24_HOURS, LAST_30_MINUTES, YESTERDAY, LAST_7_DAYS } from 'Types/app/period'; diff --git a/frontend/app/components/Dashboard/Widgets/SessionsAffectedByJSErrors/SessionsAffectedByJSErrors.js b/frontend/app/components/Dashboard/Widgets/SessionsAffectedByJSErrors/SessionsAffectedByJSErrors.js index 3fdffe6fd..747247872 100644 --- a/frontend/app/components/Dashboard/Widgets/SessionsAffectedByJSErrors/SessionsAffectedByJSErrors.js +++ b/frontend/app/components/Dashboard/Widgets/SessionsAffectedByJSErrors/SessionsAffectedByJSErrors.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { widgetHOC, Styles, AvgLabel } from '../common'; import { diff --git a/frontend/app/components/Dashboard/Widgets/SessionsImpactedBySlowRequests/SessionsImpactedBySlowRequests.js b/frontend/app/components/Dashboard/Widgets/SessionsImpactedBySlowRequests/SessionsImpactedBySlowRequests.js index 743c8c57e..e46ad6df1 100644 --- a/frontend/app/components/Dashboard/Widgets/SessionsImpactedBySlowRequests/SessionsImpactedBySlowRequests.js +++ b/frontend/app/components/Dashboard/Widgets/SessionsImpactedBySlowRequests/SessionsImpactedBySlowRequests.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { widgetHOC, Styles } from '../common'; import { ResponsiveContainer, AreaChart, XAxis, YAxis, CartesianGrid, Area, Tooltip } from 'recharts'; diff --git a/frontend/app/components/Dashboard/Widgets/SessionsPerBrowser/Bar.js b/frontend/app/components/Dashboard/Widgets/SessionsPerBrowser/Bar.js index f09b5c2ec..ffcace6ba 100644 --- a/frontend/app/components/Dashboard/Widgets/SessionsPerBrowser/Bar.js +++ b/frontend/app/components/Dashboard/Widgets/SessionsPerBrowser/Bar.js @@ -1,5 +1,5 @@ import React from 'react' -import stl from './Bar.css' +import stl from './Bar.module.css' import { Styles } from '../common' import { TextEllipsis } from 'UI'; diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SessionsPerBrowser/Bar.css b/frontend/app/components/Dashboard/Widgets/SessionsPerBrowser/Bar.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SessionsPerBrowser/Bar.css rename to frontend/app/components/Dashboard/Widgets/SessionsPerBrowser/Bar.module.css diff --git a/frontend/app/components/Dashboard/Widgets/SessionsPerBrowser/SessionsPerBrowser.js b/frontend/app/components/Dashboard/Widgets/SessionsPerBrowser/SessionsPerBrowser.js index e2080f930..960715a8a 100644 --- a/frontend/app/components/Dashboard/Widgets/SessionsPerBrowser/SessionsPerBrowser.js +++ b/frontend/app/components/Dashboard/Widgets/SessionsPerBrowser/SessionsPerBrowser.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { widgetHOC, AvgLabel, Styles } from '../common'; import Bar from './Bar'; diff --git a/frontend/app/components/Dashboard/Widgets/SlowestDomains/Bar.js b/frontend/app/components/Dashboard/Widgets/SlowestDomains/Bar.js index 66e0875e1..e680a0efb 100644 --- a/frontend/app/components/Dashboard/Widgets/SlowestDomains/Bar.js +++ b/frontend/app/components/Dashboard/Widgets/SlowestDomains/Bar.js @@ -1,5 +1,5 @@ import React from 'react' -import stl from './Bar.css' +import stl from './Bar.module.css' const Bar = ({ className = '', width = 0, avg, domain, color }) => { return ( diff --git a/frontend/app/components/Dashboard/Widgets/SlowestDomains/Bar.css b/frontend/app/components/Dashboard/Widgets/SlowestDomains/Bar.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/SlowestDomains/Bar.css rename to frontend/app/components/Dashboard/Widgets/SlowestDomains/Bar.module.css diff --git a/frontend/app/components/Dashboard/Widgets/SlowestDomains/SlowestDomains.js b/frontend/app/components/Dashboard/Widgets/SlowestDomains/SlowestDomains.js index cff121f21..b31b93891 100644 --- a/frontend/app/components/Dashboard/Widgets/SlowestDomains/SlowestDomains.js +++ b/frontend/app/components/Dashboard/Widgets/SlowestDomains/SlowestDomains.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { widgetHOC, Styles } from '../common'; import Bar from './Bar'; diff --git a/frontend/app/components/Dashboard/Widgets/SlowestImages/Chart.js b/frontend/app/components/Dashboard/Widgets/SlowestImages/Chart.js index 2a23c4f47..a66c2801d 100644 --- a/frontend/app/components/Dashboard/Widgets/SlowestImages/Chart.js +++ b/frontend/app/components/Dashboard/Widgets/SlowestImages/Chart.js @@ -1,3 +1,4 @@ +import React from 'react'; import { AreaChart, Area } from 'recharts'; const Chart = ({ data }) => { diff --git a/frontend/app/components/Dashboard/Widgets/SlowestImages/ImageInfo.js b/frontend/app/components/Dashboard/Widgets/SlowestImages/ImageInfo.js index ad8c4294b..6381434f0 100644 --- a/frontend/app/components/Dashboard/Widgets/SlowestImages/ImageInfo.js +++ b/frontend/app/components/Dashboard/Widgets/SlowestImages/ImageInfo.js @@ -1,25 +1,24 @@ +import React from 'react'; import { Popup, Icon } from 'UI'; -import styles from './imageInfo.css'; +import styles from './imageInfo.module.css'; const ImageInfo = ({ data }) => (
    - -
    { 'Preview' }
    -
    - } content={ One of the slowest images } - /> + > +
    + +
    { 'Preview' }
    +
    + { data.name } - } disabled content={ data.url } - /> + > + { data.name } +
    ); diff --git a/frontend/app/components/Dashboard/Widgets/SlowestImages/SlowestImages.js b/frontend/app/components/Dashboard/Widgets/SlowestImages/SlowestImages.js index fe48ceb81..87cf5478f 100644 --- a/frontend/app/components/Dashboard/Widgets/SlowestImages/SlowestImages.js +++ b/frontend/app/components/Dashboard/Widgets/SlowestImages/SlowestImages.js @@ -1,4 +1,4 @@ -import { connect } from 'react-redux'; +import React from 'react'; import { Loader, NoContent } from 'UI'; import { Table, widgetHOC } from '../common'; import Chart from './Chart'; diff --git a/frontend/app/components/Dashboard/Widgets/SlowestImages/imageInfo.css b/frontend/app/components/Dashboard/Widgets/SlowestImages/imageInfo.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/SlowestImages/imageInfo.css rename to frontend/app/components/Dashboard/Widgets/SlowestImages/imageInfo.module.css diff --git a/frontend/app/components/Dashboard/Widgets/SlowestResources/Chart.js b/frontend/app/components/Dashboard/Widgets/SlowestResources/Chart.js index 6697b6fb4..1990733fb 100644 --- a/frontend/app/components/Dashboard/Widgets/SlowestResources/Chart.js +++ b/frontend/app/components/Dashboard/Widgets/SlowestResources/Chart.js @@ -1,3 +1,4 @@ +import React from 'react'; import { AreaChart, Area } from 'recharts'; import { Styles } from '../common'; diff --git a/frontend/app/components/Dashboard/Widgets/SlowestResources/ImageInfo.js b/frontend/app/components/Dashboard/Widgets/SlowestResources/ImageInfo.js index fed6b71b6..c220e44cf 100644 --- a/frontend/app/components/Dashboard/Widgets/SlowestResources/ImageInfo.js +++ b/frontend/app/components/Dashboard/Widgets/SlowestResources/ImageInfo.js @@ -1,6 +1,7 @@ +import React from 'react'; import { Popup } from 'UI'; import cn from 'classnames'; -import styles from './imageInfo.css'; +import styles from './imageInfo.module.css'; const supportedTypes = ['png', 'jpg', 'jpeg', 'svg']; @@ -10,14 +11,13 @@ const ImageInfo = ({ data }) => {
    -
    {data.name}
    -
    - } disabled={!canPreview} content={ One of the slowest images } - /> + > +
    +
    {data.name}
    +
    +
    ) }; diff --git a/frontend/app/components/Dashboard/Widgets/SlowestResources/SlowestResources.js b/frontend/app/components/Dashboard/Widgets/SlowestResources/SlowestResources.js index 5124938f3..7ae632f67 100644 --- a/frontend/app/components/Dashboard/Widgets/SlowestResources/SlowestResources.js +++ b/frontend/app/components/Dashboard/Widgets/SlowestResources/SlowestResources.js @@ -1,10 +1,11 @@ +import React from 'react'; import { Loader, NoContent, DropdownPlain } from 'UI'; import { Table, widgetHOC } from '../common'; import Chart from './Chart'; import ImageInfo from './ImageInfo'; import { getRE } from 'App/utils'; import cn from 'classnames'; -import stl from './SlowestResources.css'; +import stl from './SlowestResources.module.css'; import ResourceType from './ResourceType'; import CopyPath from './CopyPath'; import { numberWithCommas } from 'App/utils'; diff --git a/frontend/app/components/Dashboard/Widgets/SlowestResources/SlowestResources.css b/frontend/app/components/Dashboard/Widgets/SlowestResources/SlowestResources.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/SlowestResources/SlowestResources.css rename to frontend/app/components/Dashboard/Widgets/SlowestResources/SlowestResources.module.css diff --git a/frontend/app/components/Dashboard/Widgets/SlowestResources/imageInfo.css b/frontend/app/components/Dashboard/Widgets/SlowestResources/imageInfo.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/SlowestResources/imageInfo.css rename to frontend/app/components/Dashboard/Widgets/SlowestResources/imageInfo.module.css diff --git a/frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/Bar.js b/frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/Bar.js index 4da50d6ae..8702869e9 100644 --- a/frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/Bar.js +++ b/frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/Bar.js @@ -1,5 +1,5 @@ import React from 'react' -import stl from './Bar.css' +import stl from './Bar.module.css' const Bar = ({ className = '', width = 0, avg, domain, color }) => { return ( diff --git a/frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/Bar.css b/frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/Bar.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/Bar.css rename to frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/Bar.module.css diff --git a/frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/Scale.js b/frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/Scale.js index 7bf6f8f5d..6ee56f2b3 100644 --- a/frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/Scale.js +++ b/frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/Scale.js @@ -1,7 +1,7 @@ import React from 'react' import { Styles } from '../common'; import cn from 'classnames'; -import stl from './scale.css'; +import stl from './scale.module.css'; function Scale({ colors }) { const lastIndex = (Styles.colors.length - 1) diff --git a/frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/SpeedIndexLocation.js b/frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/SpeedIndexLocation.js index 86a5419e1..9e1a23213 100644 --- a/frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/SpeedIndexLocation.js +++ b/frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/SpeedIndexLocation.js @@ -1,9 +1,10 @@ +import React from 'react'; import { widgetHOC, AvgLabel, Styles } from '../common'; import * as DataMap from "datamaps"; import { threeLetter } from 'App/constants/countries'; import Scale from './Scale'; import { numberWithCommas } from 'App/utils'; -import stl from './speedIndexLocation.css'; +import stl from './speedIndexLocation.module.css'; import { colorScale } from 'App/utils'; @widgetHOC('speedLocation', { fitContent: false }) diff --git a/frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/scale.css b/frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/scale.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/scale.css rename to frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/scale.module.css diff --git a/frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/speedIndexLocation.css b/frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/speedIndexLocation.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/speedIndexLocation.css rename to frontend/app/components/Dashboard/Widgets/SpeedIndexLocation/speedIndexLocation.module.css diff --git a/frontend/app/components/Dashboard/Widgets/TimeToRender/TimeToRender.js b/frontend/app/components/Dashboard/Widgets/TimeToRender/TimeToRender.js index a6589a7da..956174cba 100644 --- a/frontend/app/components/Dashboard/Widgets/TimeToRender/TimeToRender.js +++ b/frontend/app/components/Dashboard/Widgets/TimeToRender/TimeToRender.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { widgetHOC, Styles, AvgLabel } from '../common'; import { withRequest } from 'HOCs'; diff --git a/frontend/app/components/Dashboard/Widgets/TopDomains/TopDomains.js b/frontend/app/components/Dashboard/Widgets/TopDomains/TopDomains.js index e5994da01..e300ce0a9 100644 --- a/frontend/app/components/Dashboard/Widgets/TopDomains/TopDomains.js +++ b/frontend/app/components/Dashboard/Widgets/TopDomains/TopDomains.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Loader, NoContent } from 'UI'; import { widgetHOC, Styles } from '../common'; import { ResponsiveContainer, XAxis, YAxis, CartesianGrid, diff --git a/frontend/app/components/Dashboard/Widgets/TopMetrics.js b/frontend/app/components/Dashboard/Widgets/TopMetrics.js index 2134b3e1e..bac8d5d41 100644 --- a/frontend/app/components/Dashboard/Widgets/TopMetrics.js +++ b/frontend/app/components/Dashboard/Widgets/TopMetrics.js @@ -1,4 +1,4 @@ -import { connect } from 'react-redux'; +import React from 'react'; import { Loader } from 'UI'; import { msToSec } from 'App/date'; import { CountBadge, Divider, widgetHOC } from './common'; diff --git a/frontend/app/components/Dashboard/Widgets/TrendChart/TrendChart.js b/frontend/app/components/Dashboard/Widgets/TrendChart/TrendChart.js index d73c8e061..b32f4171a 100644 --- a/frontend/app/components/Dashboard/Widgets/TrendChart/TrendChart.js +++ b/frontend/app/components/Dashboard/Widgets/TrendChart/TrendChart.js @@ -4,7 +4,7 @@ import { CloseButton, Loader } from 'UI'; import { ResponsiveContainer, AreaChart, XAxis, YAxis, Area, Tooltip } from 'recharts'; import { numberWithCommas } from 'App/utils'; import cn from 'classnames'; -import stl from './trendChart.css'; +import stl from './trendChart.module.css'; const loadChart = (data, loading, unit, syncId, compare, tooltipLael) => { const gradientDef = Styles.gradientDef(); diff --git a/frontend/app/components/Dashboard/Widgets/TrendChart/trendChart.css b/frontend/app/components/Dashboard/Widgets/TrendChart/trendChart.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/TrendChart/trendChart.css rename to frontend/app/components/Dashboard/Widgets/TrendChart/trendChart.module.css diff --git a/frontend/app/components/Dashboard/Widgets/UserActivity.js b/frontend/app/components/Dashboard/Widgets/UserActivity.js index 48952315c..282e305d9 100644 --- a/frontend/app/components/Dashboard/Widgets/UserActivity.js +++ b/frontend/app/components/Dashboard/Widgets/UserActivity.js @@ -1,4 +1,4 @@ -import { connect } from 'react-redux'; +import React from 'react'; import { msToMin } from 'App/date'; import { Loader } from 'UI'; import { CountBadge, Divider, widgetHOC } from './common'; diff --git a/frontend/app/components/Dashboard/Widgets/common/AutoComplete/AutoComplete.js b/frontend/app/components/Dashboard/Widgets/common/AutoComplete/AutoComplete.js deleted file mode 100644 index 5923d4c5d..000000000 --- a/frontend/app/components/Dashboard/Widgets/common/AutoComplete/AutoComplete.js +++ /dev/null @@ -1,86 +0,0 @@ -import React, { useState } from 'react'; -import { Icon, CircularLoader, Button } from 'UI'; -import cn from 'classnames'; -import stl from './autoComplete.css'; -import { debounce } from 'App/utils'; - -const AutoComplete = props => { - const { className, placeholder = "Search for Resource", itemStyle = {}, filterParams = {} } = props; - const [selected, setSelected] = useState(null) - const [focused, setFocused] = useState(props.autoFocus) - - const fetchOptions = debounce(props.fetchOptions, 300) - - const handleChange = ({ target: { name, value } }) => { - fetchOptions({ ...filterParams, q: value }); - } - - const onSelected = opt => { - setSelected(opt); - props.onSelect(opt); - } - - const onItemClick = (e, { name, value }) => { - props.onSelect({ url: value }); - setSelected(value); - } - - const onClearHandle = (e) => { - e.preventDefault(); - e.stopPropagation(); - - setSelected(null); - props.onSelect({}); - } - - return ( -
    -
    !focused && setFocused(true)} - > - { !focused && selected && ( -
    - {selected.value} - -
    - )} - { (focused || !selected) && ( - setFocused(true)} - onBlur={() => setFocused(false)} - /> - )} -
    - { props.loading && } -
    -
    - { focused && props.options.length > 0 && ( -
    - { - props.options.map(opt => ( -
    onSelected(opt)} - style={itemStyle} - > - {opt.value} -
    - )) - } -
    - )} -
    - ) -} - -export default AutoComplete diff --git a/frontend/app/components/Dashboard/Widgets/common/AutoComplete/autoComplete.css b/frontend/app/components/Dashboard/Widgets/common/AutoComplete/autoComplete.css deleted file mode 100644 index fc2b23384..000000000 --- a/frontend/app/components/Dashboard/Widgets/common/AutoComplete/autoComplete.css +++ /dev/null @@ -1,85 +0,0 @@ -.searchWrapper { - width: 250px; - padding: 10px 5px; - height: 30px; - border-radius: 3px; - cursor: pointer; - border: solid thin transparent; - margin: 0 -5px; - &:after { - content: ''; - width: 100%; - border-bottom: dotted thin $gray-light; - position: absolute; - right: 5px; - bottom: 0; - } - & input { - padding: 0 5px; - } - &:hover { - border: solid thin $gray-light; - &:after { - display: none; - } - } - &.focused { - background-color: $gray-light; - &:after { - display: none; - } - } -} - -.selected { - width: 100%; - & span { - max-width: 210px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } -} - -.search { - padding: 8px 0; - border: none; - &:focus, &:active { - border: none !important; - } -} - -.menuWrapper { - display: flex; - flex-direction: column; - & > div { - flex-shrink: 0; - } - - border: solid thin $gray-light; - top: 31px; - z-index: 1; - margin-left: -5px; - max-height: 180px; - overflow-y: auto; - &::-webkit-scrollbar { - width: 1px; - } -} - -.optionItem { - border-bottom: solid thin $gray-light; - padding: 8px; - max-width: 250px; - /* max-width: 90%; */ - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - cursor: pointer; - &:last-child { - border-bottom: none; - } - &:hover { - background-color: $gray-lightest; - } -} \ No newline at end of file diff --git a/frontend/app/components/Dashboard/Widgets/common/AutoComplete/index.js b/frontend/app/components/Dashboard/Widgets/common/AutoComplete/index.js deleted file mode 100644 index 7560dd22b..000000000 --- a/frontend/app/components/Dashboard/Widgets/common/AutoComplete/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './AutoComplete'; diff --git a/frontend/app/components/Dashboard/Widgets/common/CountBadge.js b/frontend/app/components/Dashboard/Widgets/common/CountBadge.js index 86e93ebd5..18d986ffa 100644 --- a/frontend/app/components/Dashboard/Widgets/common/CountBadge.js +++ b/frontend/app/components/Dashboard/Widgets/common/CountBadge.js @@ -1,5 +1,6 @@ +import React from 'react'; import { Icon } from 'UI'; -import styles from './countBadge.css'; +import styles from './countBadge.module.css'; import cn from 'classnames'; const getFixedValue = (val) => { diff --git a/frontend/app/components/Dashboard/Widgets/common/CustomMetricWidgetHoc/CustomMetricWidgetHoc.css b/frontend/app/components/Dashboard/Widgets/common/CustomMetricWidgetHoc/CustomMetricWidgetHoc.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/common/CustomMetricWidgetHoc/CustomMetricWidgetHoc.css rename to frontend/app/components/Dashboard/Widgets/common/CustomMetricWidgetHoc/CustomMetricWidgetHoc.module.css diff --git a/frontend/app/components/Dashboard/Widgets/common/CustomMetricWidgetHoc/CustomMetricWidgetHoc.tsx b/frontend/app/components/Dashboard/Widgets/common/CustomMetricWidgetHoc/CustomMetricWidgetHoc.tsx index 89a8b1231..4df0d6fbb 100644 --- a/frontend/app/components/Dashboard/Widgets/common/CustomMetricWidgetHoc/CustomMetricWidgetHoc.tsx +++ b/frontend/app/components/Dashboard/Widgets/common/CustomMetricWidgetHoc/CustomMetricWidgetHoc.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import stl from './CustomMetricWidgetHoc.css'; +import stl from './CustomMetricWidgetHoc.module.css'; import { Icon } from 'UI'; interface Props { diff --git a/frontend/app/components/Dashboard/Widgets/common/Divider.js b/frontend/app/components/Dashboard/Widgets/common/Divider.js index e5e2147e3..29d5aae00 100644 --- a/frontend/app/components/Dashboard/Widgets/common/Divider.js +++ b/frontend/app/components/Dashboard/Widgets/common/Divider.js @@ -1,3 +1,4 @@ +import React from 'react' const Divider = () => (
    diff --git a/frontend/app/components/Dashboard/Widgets/common/Title.js b/frontend/app/components/Dashboard/Widgets/common/Title.js index e8b31422e..ffd8444a3 100644 --- a/frontend/app/components/Dashboard/Widgets/common/Title.js +++ b/frontend/app/components/Dashboard/Widgets/common/Title.js @@ -1,4 +1,4 @@ -import styles from './title.css'; +import styles from './title.module.css'; const Title = ({ title, sub }) => (
    diff --git a/frontend/app/components/Dashboard/Widgets/common/countBadge.css b/frontend/app/components/Dashboard/Widgets/common/countBadge.module.css similarity index 90% rename from frontend/app/components/Dashboard/Widgets/common/countBadge.css rename to frontend/app/components/Dashboard/Widgets/common/countBadge.module.css index 5b6c54d64..c0419e7c6 100644 --- a/frontend/app/components/Dashboard/Widgets/common/countBadge.css +++ b/frontend/app/components/Dashboard/Widgets/common/countBadge.module.css @@ -15,13 +15,14 @@ .count { font-size: 20px; font-weight: 500; + line-height: initial; } .unit { font-size: 15px; align-self: flex-end; margin-left: 5px; - margin-bottom: 3px; + /* margin-bottom: 3px; */ } .change { diff --git a/frontend/app/components/Dashboard/Widgets/common/sessionLine.css b/frontend/app/components/Dashboard/Widgets/common/sessionLine.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/common/sessionLine.css rename to frontend/app/components/Dashboard/Widgets/common/sessionLine.module.css diff --git a/frontend/app/components/Dashboard/Widgets/common/table.css b/frontend/app/components/Dashboard/Widgets/common/table.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/common/table.css rename to frontend/app/components/Dashboard/Widgets/common/table.module.css diff --git a/frontend/app/components/Dashboard/Widgets/common/title.css b/frontend/app/components/Dashboard/Widgets/common/title.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/common/title.css rename to frontend/app/components/Dashboard/Widgets/common/title.module.css diff --git a/frontend/app/components/Dashboard/Widgets/common/widgetHOC.js b/frontend/app/components/Dashboard/Widgets/common/widgetHOC.js index 34df08a2a..88c0c3115 100644 --- a/frontend/app/components/Dashboard/Widgets/common/widgetHOC.js +++ b/frontend/app/components/Dashboard/Widgets/common/widgetHOC.js @@ -1,3 +1,4 @@ +import React from 'react'; import { connect } from 'react-redux'; import cn from 'classnames'; import { CloseButton } from 'UI'; @@ -5,7 +6,7 @@ import { fetchWidget } from 'Duck/dashboard'; import { updateAppearance } from 'Duck/user'; import { WIDGET_MAP } from 'Types/dashboard'; import Title from './Title'; -import stl from './widgetHOC.css'; +import stl from './widgetHOC.module.css'; export default ( widgetKey, diff --git a/frontend/app/components/Dashboard/Widgets/common/widgetHOC.css b/frontend/app/components/Dashboard/Widgets/common/widgetHOC.module.css similarity index 100% rename from frontend/app/components/Dashboard/Widgets/common/widgetHOC.css rename to frontend/app/components/Dashboard/Widgets/common/widgetHOC.module.css diff --git a/frontend/app/components/Dashboard/addWidgets.css b/frontend/app/components/Dashboard/addWidgets.css deleted file mode 100644 index 452ee92b7..000000000 --- a/frontend/app/components/Dashboard/addWidgets.css +++ /dev/null @@ -1,48 +0,0 @@ -.widgetCard { - min-height: 110px; - padding: 15px; - width: 100%; - border: 1px solid $gray-light; - border-bottom: none; - - &:last-child { - border-bottom: 1px solid $gray-light; - } - & h4 { - margin-bottom: 10px; - } - & p { - color: $gray-medium; - font-weight: 300; - font-size: 12px; - } -} - -.thumb { - border: solid thin $gray-light; - margin-right: 10px; - width: 170px; -} - -.menuWrapper { - max-height: 300px; - overflow-y: auto; - &::-webkit-scrollbar { - width: 2px; - } -} - -.menuItem { - transition: all .2s; - border-bottom: solid thin $gray-light; - padding: 8px 10px; - overflow: hidden; - text-overflow: ellipsis; - &:last-child { - border-bottom: none; - } - &:hover { - transition: all .4s; - background-color: $gray-lightest; - } -} \ No newline at end of file diff --git a/frontend/app/components/Dashboard/components/DashboardEditModal/DashboardEditModal.tsx b/frontend/app/components/Dashboard/components/DashboardEditModal/DashboardEditModal.tsx index 889c9fe18..9590a2ed4 100644 --- a/frontend/app/components/Dashboard/components/DashboardEditModal/DashboardEditModal.tsx +++ b/frontend/app/components/Dashboard/components/DashboardEditModal/DashboardEditModal.tsx @@ -1,6 +1,6 @@ import { useObserver } from 'mobx-react-lite'; import React from 'react'; -import { Button, Modal, Form, Icon, Checkbox } from 'UI'; +import { Button, Modal, Form, Icon, Checkbox, Input } from 'UI'; import { useStore } from 'App/mstore' interface Props { @@ -32,7 +32,7 @@ function DashboardEditModal(props: Props) { } return useObserver(() => ( - +
    { 'Edit Dashboard' }
    - -
    dashboard.update({ 'isPublic': !dashboard.isPublic }) }> - - Team can see and edit the dashboard. + + Team can see and edit the dashboard.
    - +
    - +
    -
    + )); } diff --git a/frontend/app/components/Dashboard/components/DashboardForm/DashboardForm.tsx b/frontend/app/components/Dashboard/components/DashboardForm/DashboardForm.tsx index f4f9fa258..dc06c7a53 100644 --- a/frontend/app/components/Dashboard/components/DashboardForm/DashboardForm.tsx +++ b/frontend/app/components/Dashboard/components/DashboardForm/DashboardForm.tsx @@ -1,7 +1,6 @@ import { useObserver } from 'mobx-react-lite'; import React from 'react'; import { Input } from 'UI'; -import { useDashboardStore } from '../../store/store'; import cn from 'classnames'; import { useStore } from 'App/mstore'; diff --git a/frontend/app/components/Dashboard/components/DashboardModal/DashboardModal.tsx b/frontend/app/components/Dashboard/components/DashboardModal/DashboardModal.tsx index c1788d344..0250da735 100644 --- a/frontend/app/components/Dashboard/components/DashboardModal/DashboardModal.tsx +++ b/frontend/app/components/Dashboard/components/DashboardModal/DashboardModal.tsx @@ -67,10 +67,10 @@ function DashboardModal(props) {
    diff --git a/frontend/app/components/Dashboard/components/DashboardSelectionModal/DashboardSelectionModal.tsx b/frontend/app/components/Dashboard/components/DashboardSelectionModal/DashboardSelectionModal.tsx index 830730d7b..65e8e7051 100644 --- a/frontend/app/components/Dashboard/components/DashboardSelectionModal/DashboardSelectionModal.tsx +++ b/frontend/app/components/Dashboard/components/DashboardSelectionModal/DashboardSelectionModal.tsx @@ -2,7 +2,7 @@ import { useObserver } from 'mobx-react-lite'; import React from 'react'; import { Button, Modal, Form, Icon } from 'UI'; import { useStore } from 'App/mstore' -import DropdownPlain from 'Shared/DropdownPlain'; +import Select from 'Shared/Select'; interface Props { metricId: string, @@ -14,7 +14,7 @@ function DashboardSelectionModal(props: Props) { const { dashboardStore } = useStore(); const dashboardOptions = dashboardStore.dashboards.map((i: any) => ({ key: i.id, - text: i.name, + label: i.name, value: i.dashboardId, })); const [selectedId, setSelectedId] = React.useState(dashboardOptions[0].value); @@ -27,7 +27,7 @@ function DashboardSelectionModal(props: Props) { } return useObserver(() => ( - +
    { 'Add to selected dashboard' }
    -
    -
    - - - setSelectedId(value)} - /> - - -
    + + + + + No Errors Found! + + } subtext="Please try to change your search parameters." - animatedIcon="empty-state" + // animatedIcon="empty-state" show={ !loading && list.size === 0} > diff --git a/frontend/app/components/Errors/List/ListItem/ListItem.js b/frontend/app/components/Errors/List/ListItem/ListItem.js index 994c15235..2752fcfb4 100644 --- a/frontend/app/components/Errors/List/ListItem/ListItem.js +++ b/frontend/app/components/Errors/List/ListItem/ListItem.js @@ -1,3 +1,4 @@ +import React from 'react'; import { BarChart, Bar, YAxis, Tooltip, XAxis } from 'recharts'; import cn from 'classnames'; import moment from 'moment'; @@ -8,7 +9,7 @@ import { diffFromNowShortString } from 'App/date'; import { Checkbox, Link } from 'UI'; import ErrorName from 'Components/Errors/ui/ErrorName'; import Label from 'Components/Errors/ui/Label'; -import stl from './listItem.css'; +import stl from './listItem.module.css'; import { Styles } from '../../../Dashboard/Widgets/common'; diff --git a/frontend/app/components/Errors/List/ListItem/listItem.css b/frontend/app/components/Errors/List/ListItem/listItem.module.css similarity index 100% rename from frontend/app/components/Errors/List/ListItem/listItem.css rename to frontend/app/components/Errors/List/ListItem/listItem.module.css diff --git a/frontend/app/components/Errors/SideMenu/SideMenuDividedItem.js b/frontend/app/components/Errors/SideMenu/SideMenuDividedItem.js index 7ae10668e..9efa63ed4 100644 --- a/frontend/app/components/Errors/SideMenu/SideMenuDividedItem.js +++ b/frontend/app/components/Errors/SideMenu/SideMenuDividedItem.js @@ -1,3 +1,4 @@ +import React from 'react'; import { SideMenuitem } from "UI"; import Divider from 'Components/Errors/ui/Divider'; function SideMenuDividedItem({ className, noTopDivider = false, noBottomDivider = false, ...props }) { diff --git a/frontend/app/components/Errors/SideMenu/SideMenuHeader.js b/frontend/app/components/Errors/SideMenu/SideMenuHeader.js index 7be18b006..32f1f7fc6 100644 --- a/frontend/app/components/Errors/SideMenu/SideMenuHeader.js +++ b/frontend/app/components/Errors/SideMenu/SideMenuHeader.js @@ -1,5 +1,6 @@ +import React from 'react'; import cn from 'classnames'; -import stl from './sideMenuHeader.css'; +import stl from './sideMenuHeader.module.css'; function SideMenuHeader({ text, className }) { return ( diff --git a/frontend/app/components/Errors/SideMenu/SideMenuSection.js b/frontend/app/components/Errors/SideMenu/SideMenuSection.js index 18498daef..f2d6732f2 100644 --- a/frontend/app/components/Errors/SideMenu/SideMenuSection.js +++ b/frontend/app/components/Errors/SideMenu/SideMenuSection.js @@ -1,3 +1,4 @@ +import React from 'react'; import { SideMenuitem } from 'UI'; import SideMenuHeader from './SideMenuHeader'; diff --git a/frontend/app/components/Errors/SideMenu/sideMenuHeader.css b/frontend/app/components/Errors/SideMenu/sideMenuHeader.module.css similarity index 100% rename from frontend/app/components/Errors/SideMenu/sideMenuHeader.css rename to frontend/app/components/Errors/SideMenu/sideMenuHeader.module.css diff --git a/frontend/app/components/Errors/ui/Divider.js b/frontend/app/components/Errors/ui/Divider.js index b77dd09e6..dabe32dab 100644 --- a/frontend/app/components/Errors/ui/Divider.js +++ b/frontend/app/components/Errors/ui/Divider.js @@ -1,5 +1,6 @@ +import React from 'react' import cn from 'classnames'; -import stl from './divider.css'; +import stl from './divider.module.css'; function Divider({ className, color="gray-light" }) { return
    diff --git a/frontend/app/components/Errors/ui/ErrorName.js b/frontend/app/components/Errors/ui/ErrorName.js index 9d744f0db..c83e0a1a1 100644 --- a/frontend/app/components/Errors/ui/ErrorName.js +++ b/frontend/app/components/Errors/ui/ErrorName.js @@ -1,4 +1,4 @@ -import { Icon } from 'UI'; +import React from 'react'; import cn from "classnames"; function ErrorText({ className, icon, name, message, bold, lineThrough = false }) { diff --git a/frontend/app/components/Errors/ui/Label.js b/frontend/app/components/Errors/ui/Label.js index 0c2347fbb..a82b0328a 100644 --- a/frontend/app/components/Errors/ui/Label.js +++ b/frontend/app/components/Errors/ui/Label.js @@ -1,3 +1,4 @@ +import React from 'react'; import cn from "classnames"; function Label({ className, topValue, topValueSize = 'text-base', bottomValue, topMuted = false, bottomMuted = false }) { diff --git a/frontend/app/components/Errors/ui/divider.css b/frontend/app/components/Errors/ui/divider.module.css similarity index 100% rename from frontend/app/components/Errors/ui/divider.css rename to frontend/app/components/Errors/ui/divider.module.css diff --git a/frontend/app/components/Errors/ui/errorName.css b/frontend/app/components/Errors/ui/errorName.module.css similarity index 100% rename from frontend/app/components/Errors/ui/errorName.css rename to frontend/app/components/Errors/ui/errorName.module.css diff --git a/frontend/app/components/ForgotPassword/ForgotPassword.js b/frontend/app/components/ForgotPassword/ForgotPassword.js index 571602a14..e931677bf 100644 --- a/frontend/app/components/ForgotPassword/ForgotPassword.js +++ b/frontend/app/components/ForgotPassword/ForgotPassword.js @@ -1,13 +1,14 @@ +import React from 'react'; import { connect } from 'react-redux'; import ReCAPTCHA from 'react-google-recaptcha'; import withPageTitle from 'HOCs/withPageTitle'; -import { Loader, Button, Link, Icon, Message } from 'UI'; +import { Form, Input, Loader, Button, Link, Icon, Message } from 'UI'; import { requestResetPassword, resetPassword } from 'Duck/user'; import { login as loginRoute } from 'App/routes'; import { withRouter } from 'react-router-dom'; import { validateEmail } from 'App/validate'; import cn from 'classnames'; -import stl from './forgotPassword.css'; +import stl from './forgotPassword.module.css'; const LOGIN = loginRoute(); const recaptchaRef = React.createRef(); @@ -37,6 +38,7 @@ export default class ForgotPassword extends React.PureComponent { passwordRepeat: '', requested: false, updated: false, + CAPTCHA_ENABLED: window.env.CAPTCHA_ENABLED === 'true', }; handleSubmit = (token) => { @@ -79,14 +81,16 @@ export default class ForgotPassword extends React.PureComponent { onSubmit = e => { e.preventDefault(); - if (window.ENV.CAPTCHA_ENABLED && recaptchaRef.current) { + const { CAPTCHA_ENABLED } = this.state; + if (CAPTCHA_ENABLED && recaptchaRef.current) { recaptchaRef.current.execute() - } else if (!window.ENV.CAPTCHA_ENABLED) { + } else if (!CAPTCHA_ENABLED) { this.handleSubmit(); } } render() { + const { CAPTCHA_ENABLED } = this.state; const { errors, loading, params } = this.props; const { requested, updated, password, passwordRepeat, email } = this.state; const dontMatch = checkDontMatch(password, passwordRepeat); @@ -100,7 +104,7 @@ export default class ForgotPassword extends React.PureComponent {
    - +
    @@ -109,37 +113,38 @@ export default class ForgotPassword extends React.PureComponent {
    -
    +

    {`${resetting ? 'Create' : 'Reset'} Password`}

    -
    - { window.ENV.CAPTCHA_ENABLED && ( +
    + { CAPTCHA_ENABLED && (
    this.handleSubmit(token) } />
    )} { !resetting && !requested && -
    + - -
    + } { @@ -151,43 +156,31 @@ export default class ForgotPassword extends React.PureComponent { { resetting && ( - {/*
    + - -
    */} - -
    - - -
    +
    { PASSWORD_POLICY }
    -
    + - -
    +
    ) } @@ -208,24 +201,26 @@ export default class ForgotPassword extends React.PureComponent { { 'Your password has been updated sucessfully.' }
    -
    - + {/*
    */} + {!(updated || requested) && ( + + )}
    - + { updated && ()}
    {'Back to Login'}
    -
    - + {/*
    */} +
    ); diff --git a/frontend/app/components/ForgotPassword/forgotPassword.css b/frontend/app/components/ForgotPassword/forgotPassword.module.css similarity index 99% rename from frontend/app/components/ForgotPassword/forgotPassword.css rename to frontend/app/components/ForgotPassword/forgotPassword.module.css index bd270c4e9..c56213550 100644 --- a/frontend/app/components/ForgotPassword/forgotPassword.css +++ b/frontend/app/components/ForgotPassword/forgotPassword.module.css @@ -1,4 +1,4 @@ -@import "icons.css"; +@import 'icons.css'; .form { position: absolute; diff --git a/frontend/app/components/Funnels/FunnelDetails/FunnelDetails.js b/frontend/app/components/Funnels/FunnelDetails/FunnelDetails.js index 17078976c..59e172c54 100644 --- a/frontend/app/components/Funnels/FunnelDetails/FunnelDetails.js +++ b/frontend/app/components/Funnels/FunnelDetails/FunnelDetails.js @@ -12,7 +12,6 @@ import { import { applyFilter, setFilterOptions, resetFunnelFilters, setInitialFilters } from 'Duck/funnelFilters'; import { withRouter } from 'react-router'; import { sessions as sessionsRoute, funnel as funnelRoute, withSiteId } from 'App/routes'; -import EventFilter from 'Shared/EventFilter'; import FunnelSearch from 'Shared/FunnelSearch'; import cn from 'classnames'; import IssuesEmptyMessage from 'Components/Funnels/IssuesEmptyMessage' @@ -92,10 +91,6 @@ const FunnelDetails = (props) => {
    {showFilters && ( - // setShowFilters(!showFilters)} - // /> ) }
    diff --git a/frontend/app/components/Funnels/FunnelGraph/FunnelGraph.js b/frontend/app/components/Funnels/FunnelGraph/FunnelGraph.js index c110d16ab..3159dacba 100644 --- a/frontend/app/components/Funnels/FunnelGraph/FunnelGraph.js +++ b/frontend/app/components/Funnels/FunnelGraph/FunnelGraph.js @@ -163,14 +163,10 @@ function FunnelGraph(props) { onClick={resetActiveSatges} > - } content={ `Reset Selection` } - size="tiny" - inverted - position="top center" - /> + > + +
    )} { return ( @@ -74,26 +74,20 @@ const FunnelHeader = (props) => { /> - - +
    setShowSaveModal(true)} />} content={ `Edit Funnel` } - size="tiny" - inverted - position="top center" - /> - deleteFunnel(e, funnel)} className="ml-2 mr-2" />} - content={ `Remove Funnel` } - size="tiny" - inverted - position="top center" - /> + > + setShowSaveModal(true)} /> + + + deleteFunnel(e, funnel)} className="ml-2 mr-2" /> +
    + +
    No Issues Found!
    +
    + } subtext="Please try changing your search parameters." - animatedIcon="no-results" + // animatedIcon="no-results" show={ !loading && filteredList.size === 0} > { filteredList.take(displayedCount).map(issue => ( diff --git a/frontend/app/components/Funnels/FunnelIssues/SortDropdown/SortDropdown.js b/frontend/app/components/Funnels/FunnelIssues/SortDropdown/SortDropdown.js index aa263f0d4..a9d22f2f0 100644 --- a/frontend/app/components/Funnels/FunnelIssues/SortDropdown/SortDropdown.js +++ b/frontend/app/components/Funnels/FunnelIssues/SortDropdown/SortDropdown.js @@ -1,9 +1,8 @@ +import React from 'react'; import { connect } from 'react-redux'; -import { Dropdown } from 'semantic-ui-react'; -import { Icon } from 'UI'; +import Select from 'Shared/Select' import { sort } from 'Duck/sessions'; import { applyIssueFilter } from 'Duck/funnels'; -import stl from './sortDropdown.css'; const sortOptionsMap = { 'afectedUsers-desc': 'Affected Users (High)', @@ -15,14 +14,14 @@ const sortOptionsMap = { }; const sortOptions = Object.entries(sortOptionsMap) - .map(([ value, text ]) => ({ value, text })); + .map(([ value, label ]) => ({ value, label })); @connect(state => ({ sorts: state.getIn(['funnels', 'issueFilters', 'sort']) }), { sort, applyIssueFilter }) export default class SortDropdown extends React.PureComponent { state = { value: null } - sort = (e, { value }) => { + sort = ({ value }) => { this.setState({ value: value }) const [ sort, order ] = value.split('-'); const sign = order === 'desc' ? -1 : 1; @@ -36,15 +35,13 @@ export default class SortDropdown extends React.PureComponent { const { sorts } = this.props; return ( - } + options={sortOptions} + onChange={ this.sort } /> ); } diff --git a/frontend/app/components/Funnels/FunnelIssues/SortDropdown/sortDropdown.css b/frontend/app/components/Funnels/FunnelIssues/SortDropdown/sortDropdown.module.css similarity index 100% rename from frontend/app/components/Funnels/FunnelIssues/SortDropdown/sortDropdown.css rename to frontend/app/components/Funnels/FunnelIssues/SortDropdown/sortDropdown.module.css diff --git a/frontend/app/components/Funnels/FunnelIssuesHeader/DateRange.js b/frontend/app/components/Funnels/FunnelIssuesHeader/DateRange.js index e80b8d1d8..4780f8c75 100644 --- a/frontend/app/components/Funnels/FunnelIssuesHeader/DateRange.js +++ b/frontend/app/components/Funnels/FunnelIssuesHeader/DateRange.js @@ -1,3 +1,4 @@ +import React from 'react'; import { connect } from 'react-redux'; import { applyFilter, fetchList } from 'Duck/filters'; import { fetchList as fetchFunnelsList } from 'Duck/funnels'; diff --git a/frontend/app/components/Funnels/FunnelList/FunnelList.js b/frontend/app/components/Funnels/FunnelList/FunnelList.js deleted file mode 100644 index c96ef2e74..000000000 --- a/frontend/app/components/Funnels/FunnelList/FunnelList.js +++ /dev/null @@ -1,32 +0,0 @@ -import React from 'react' -import FunnelItem from 'Components/Funnels/FunnelItem' -import FunnelListHeader from '../FunnelListHeader' -import { connect } from 'react-redux' -import { withRouter } from 'react-router' -import { funnel as funnelRoute, withSiteId } from 'App/routes' - -function FunnelList(props) { - const { list = []} = props; - - const onFlowClick = ({ funnelId }) => { - const { siteId, history } = props; - history.push(withSiteId(funnelRoute(funnelId), siteId)); - } - - return ( -
    - -
    - { list.map(funnel => ( -
    - onFlowClick(funnel)} /> -
    - ))} -
    - ) -} - -export default connect(state => ({ - list: state.getIn(['funnels', 'list']), - siteId: state.getIn([ 'site', 'siteId' ]), -}))(withRouter(FunnelList)) diff --git a/frontend/app/components/Funnels/FunnelList/index.js b/frontend/app/components/Funnels/FunnelList/index.js deleted file mode 100644 index bf019d7dd..000000000 --- a/frontend/app/components/Funnels/FunnelList/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './FunnelList' \ No newline at end of file diff --git a/frontend/app/components/Funnels/FunnelListHeader/DateRange.js b/frontend/app/components/Funnels/FunnelListHeader/DateRange.js deleted file mode 100644 index 4f2ce8e22..000000000 --- a/frontend/app/components/Funnels/FunnelListHeader/DateRange.js +++ /dev/null @@ -1,32 +0,0 @@ -import { connect } from 'react-redux'; -import { applyFilter, fetchList } from 'Duck/filters'; -import { fetchList as fetchFunnelsList } from 'Duck/funnels'; -import DateRangeDropdown from 'Shared/DateRangeDropdown'; - -@connect(state => ({ - rangeValue: state.getIn([ 'filters', 'appliedFilter', 'rangeValue' ]), - startDate: state.getIn([ 'filters', 'appliedFilter', 'startDate' ]), - endDate: state.getIn([ 'filters', 'appliedFilter', 'endDate' ]), -}), { - applyFilter, fetchList, fetchFunnelsList -}) -export default class DateRange extends React.PureComponent { - onDateChange = (e) => { - this.props.fetchList(e.rangeValue) - this.props.fetchFunnelsList(e.rangeValue) - this.props.applyFilter(e) - } - render() { - const { startDate, endDate, rangeValue, className } = this.props; - return ( - - ); - } -} \ No newline at end of file diff --git a/frontend/app/components/Funnels/FunnelListHeader/Filters/SortDropdown.js b/frontend/app/components/Funnels/FunnelListHeader/Filters/SortDropdown.js deleted file mode 100644 index a3a17458f..000000000 --- a/frontend/app/components/Funnels/FunnelListHeader/Filters/SortDropdown.js +++ /dev/null @@ -1,37 +0,0 @@ -import { connect } from 'react-redux'; -import { Dropdown } from 'semantic-ui-react'; -import { Icon } from 'UI'; -import { sort } from 'Duck/sessions'; -import { applyFilter } from 'Duck/filters'; -import stl from './sortDropdown.css'; - -@connect(null, { sort, applyFilter }) -export default class SortDropdown extends React.PureComponent { - state = { value: null } - sort = (e, { value }) => { - this.setState({ value: value }) - const [ sort, order ] = value.split('-'); - const sign = order === 'desc' ? -1 : 1; - this.props.applyFilter({ order, sort }); - - this.props.sort(sort, sign) - setTimeout(() => this.props.sort(sort, sign), 3000); //AAA - } - - render() { - const { options } = this.props; - const { value = 'startTs-desc' } = this.state; - return ( - } - /> - ); - } -} diff --git a/frontend/app/components/Funnels/FunnelListHeader/Filters/index.js b/frontend/app/components/Funnels/FunnelListHeader/Filters/index.js deleted file mode 100644 index 5b18d95f3..000000000 --- a/frontend/app/components/Funnels/FunnelListHeader/Filters/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './Filters'; diff --git a/frontend/app/components/Funnels/FunnelListHeader/FunnelListHeader.js b/frontend/app/components/Funnels/FunnelListHeader/FunnelListHeader.js deleted file mode 100644 index 534b3010c..000000000 --- a/frontend/app/components/Funnels/FunnelListHeader/FunnelListHeader.js +++ /dev/null @@ -1,64 +0,0 @@ -import React, { useEffect } from 'react'; -import { connect } from 'react-redux'; -import { applyFilter } from 'Duck/funnels'; -import SortDropdown from './Filters/SortDropdown'; -import DateRange from 'Shared/DateRange'; -import { TimezoneDropdown } from 'UI'; -import { numberWithCommas } from 'App/utils'; - -const DEFAULT_SORT = 'startTs'; -const DEFAULT_ORDER = 'desc'; -const sortOptionsMap = { - 'startTs-desc': 'Newest', - 'startTs-asc': 'Oldest', - 'eventsCount-asc': 'Events Ascending', - 'eventsCount-desc': 'Events Descending', -}; -const sortOptions = Object.entries(sortOptionsMap) - .map(([ value, text ]) => ({ value, text })); - - -function FunnelListHeader(props) { - const { activeTab, count, applyFilter, funnelFilters } = props; - - useEffect(() => { applyFilter({ sort: DEFAULT_SORT, order: DEFAULT_ORDER }) }, []) - - const onDateChange = (e) => { - applyFilter(e) - } - - return ( -
    -
    -

    - { activeTab.name } - { count ? { numberWithCommas(count) } : '' } -

    -
    - Sessions Captured in - -
    -
    -
    -
    - Timezone - -
    -
    - Sort By - -
    -
    -
    - ); -}; - -export default connect(state => ({ - activeTab: state.getIn([ 'sessions', 'activeTab' ]), - funnelFilters: state.getIn([ 'funnels', 'funnelFilters']), -}), { applyFilter })(FunnelListHeader); diff --git a/frontend/app/components/Funnels/FunnelListHeader/index.js b/frontend/app/components/Funnels/FunnelListHeader/index.js deleted file mode 100644 index 5a2cf84f3..000000000 --- a/frontend/app/components/Funnels/FunnelListHeader/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './FunnelListHeader' \ No newline at end of file diff --git a/frontend/app/components/Funnels/FunnelMenuItem/FunnelMenuItem.js b/frontend/app/components/Funnels/FunnelMenuItem/FunnelMenuItem.js index b43d83708..68a7686b4 100644 --- a/frontend/app/components/Funnels/FunnelMenuItem/FunnelMenuItem.js +++ b/frontend/app/components/Funnels/FunnelMenuItem/FunnelMenuItem.js @@ -1,6 +1,6 @@ import React from 'react' import cn from 'classnames' -import stl from './funnelMenuItem.css' +import stl from './funnelMenuItem.module.css' import { Icon, ItemMenu, Popup } from 'UI' function FunnelMenuItem({ @@ -30,17 +30,11 @@ function FunnelMenuItem({
    -
    - } - content={ `Shared with team` } - size="tiny" - inverted - position="top right" - /> +
    diff --git a/frontend/app/components/Funnels/FunnelMenuItem/funnelMenuItem.css b/frontend/app/components/Funnels/FunnelMenuItem/funnelMenuItem.module.css similarity index 100% rename from frontend/app/components/Funnels/FunnelMenuItem/funnelMenuItem.css rename to frontend/app/components/Funnels/FunnelMenuItem/funnelMenuItem.module.css diff --git a/frontend/app/components/Funnels/FunnelSaveModal/FunnelSaveModal.js b/frontend/app/components/Funnels/FunnelSaveModal/FunnelSaveModal.js index 9c9d1d907..6e324e8db 100644 --- a/frontend/app/components/Funnels/FunnelSaveModal/FunnelSaveModal.js +++ b/frontend/app/components/Funnels/FunnelSaveModal/FunnelSaveModal.js @@ -1,6 +1,7 @@ +import React from 'react'; import { connect } from 'react-redux'; -import { Button, Modal, Form, Icon, Checkbox } from 'UI'; -import styles from './funnelSaveModal.css'; +import { Button, Modal, Form, Icon, Checkbox, Input } from 'UI'; +import styles from './funnelSaveModal.module.css'; import { edit, save, fetchList as fetchFunnelsList } from 'Duck/funnels'; @connect(state => ({ @@ -45,7 +46,7 @@ export default class FunnelSaveModal extends React.PureComponent { } = this.props; return ( - +
    { 'Save Funnel' }
    - - + - - + +
    ); } diff --git a/frontend/app/components/Funnels/FunnelSaveModal/funnelSaveModal.css b/frontend/app/components/Funnels/FunnelSaveModal/funnelSaveModal.css deleted file mode 100644 index ed2600745..000000000 --- a/frontend/app/components/Funnels/FunnelSaveModal/funnelSaveModal.css +++ /dev/null @@ -1,15 +0,0 @@ -@import 'mixins.css'; - -.modalHeader { - display: flex !important; - align-items: center; - justify-content: space-between; -} - -.cancelButton { - @mixin plainButton; -} - -.applyButton { - @mixin basicButton; -} \ No newline at end of file diff --git a/frontend/app/components/BugFinder/ManageFilters/saveModal.css b/frontend/app/components/Funnels/FunnelSaveModal/funnelSaveModal.module.css similarity index 100% rename from frontend/app/components/BugFinder/ManageFilters/saveModal.css rename to frontend/app/components/Funnels/FunnelSaveModal/funnelSaveModal.module.css diff --git a/frontend/app/components/Funnels/FunnelSessionList/FunnelSessionList.js b/frontend/app/components/Funnels/FunnelSessionList/FunnelSessionList.js index f1b3ec67a..c16a98407 100644 --- a/frontend/app/components/Funnels/FunnelSessionList/FunnelSessionList.js +++ b/frontend/app/components/Funnels/FunnelSessionList/FunnelSessionList.js @@ -5,6 +5,7 @@ import { fetchSessions, fetchSessionsFiltered } from 'Duck/funnels' import { setFunnelPage } from 'Duck/sessions' import { LoadMoreButton, NoContent, Loader } from 'UI' import FunnelSessionsHeader from '../FunnelSessionsHeader' +import AnimatedSVG, { ICONS } from 'Shared/AnimatedSVG/AnimatedSVG'; const PER_PAGE = 10; @@ -28,9 +29,14 @@ function FunnelSessionList(props) {
    + +
    No recordings found!
    +
    + } subtext="Please try changing your search parameters." - animatedIcon="no-results" + // animatedIcon="no-results" show={ list.size === 0} > { list.take(displayedCount).map(session => ( diff --git a/frontend/app/components/Funnels/FunnelSessionsHeader/DateRange.js b/frontend/app/components/Funnels/FunnelSessionsHeader/DateRange.js index 66761ce9c..c532f5af6 100644 --- a/frontend/app/components/Funnels/FunnelSessionsHeader/DateRange.js +++ b/frontend/app/components/Funnels/FunnelSessionsHeader/DateRange.js @@ -1,3 +1,4 @@ +import React from 'react'; import { connect } from 'react-redux'; import { applyFilter, fetchList } from 'Duck/filters'; import { fetchList as fetchFunnelsList } from 'Duck/funnels'; diff --git a/frontend/app/components/Funnels/FunnelSessionsHeader/FunnelSessionsHeader.js b/frontend/app/components/Funnels/FunnelSessionsHeader/FunnelSessionsHeader.js index 3a58ccca0..b44b64e9f 100644 --- a/frontend/app/components/Funnels/FunnelSessionsHeader/FunnelSessionsHeader.js +++ b/frontend/app/components/Funnels/FunnelSessionsHeader/FunnelSessionsHeader.js @@ -8,7 +8,7 @@ const sortOptionsMap = { 'eventsCount-desc': 'Events (High)', }; const sortOptions = Object.entries(sortOptionsMap) - .map(([ value, text ]) => ({ value, text })); + .map(([ value, label ]) => ({ value, label })); function FunnelSessionsHeader({ sessionsCount, inDetails = false }) { return ( diff --git a/frontend/app/components/Funnels/FunnelSessionsHeader/SortDropdown/SortDropdown.js b/frontend/app/components/Funnels/FunnelSessionsHeader/SortDropdown/SortDropdown.js index e022f8142..b865a6b57 100644 --- a/frontend/app/components/Funnels/FunnelSessionsHeader/SortDropdown/SortDropdown.js +++ b/frontend/app/components/Funnels/FunnelSessionsHeader/SortDropdown/SortDropdown.js @@ -1,16 +1,15 @@ +import React from 'react'; import { connect } from 'react-redux'; -import { Dropdown } from 'semantic-ui-react'; -import { Icon } from 'UI'; +import Select from 'Shared/Select'; import { setSessionsSort as sort } from 'Duck/funnels'; import { setSessionsSort } from 'Duck/funnels'; -import stl from './sortDropdown.css'; @connect(state => ({ sessionsSort: state.getIn(['funnels','sessionsSort']) }), { sort, setSessionsSort }) export default class SortDropdown extends React.PureComponent { state = { value: null } - sort = (e, { value }) => { + sort = ({ value }) => { this.setState({ value: value }) const [ sort, order ] = value.split('-'); const sign = order === 'desc' ? -1 : 1; @@ -19,17 +18,14 @@ export default class SortDropdown extends React.PureComponent { render() { const { options, issuesSort } = this.props; - const { value = 'startTs-desc' } = this.state; return ( - } + onChange={ this.sort } /> ); } diff --git a/frontend/app/components/Funnels/FunnelListHeader/Filters/sortDropdown.css b/frontend/app/components/Funnels/FunnelSessionsHeader/SortDropdown/sortDropdown.module.css similarity index 100% rename from frontend/app/components/Funnels/FunnelListHeader/Filters/sortDropdown.css rename to frontend/app/components/Funnels/FunnelSessionsHeader/SortDropdown/sortDropdown.module.css diff --git a/frontend/app/components/Funnels/IssueFilter/IssueFilter.js b/frontend/app/components/Funnels/IssueFilter/IssueFilter.js index f081318fe..3996b9939 100644 --- a/frontend/app/components/Funnels/IssueFilter/IssueFilter.js +++ b/frontend/app/components/Funnels/IssueFilter/IssueFilter.js @@ -3,7 +3,7 @@ import { connect } from 'react-redux'; import { Icon, Dropdown, TagBadge } from 'UI' import { applyIssueFilter, removeIssueFilter } from 'Duck/funnels'; import cn from 'classnames'; -import stl from './issueFilter.css'; +import stl from './issueFilter.module.css'; import { List } from 'immutable'; function IssueFilter(props) { diff --git a/frontend/app/components/Funnels/IssueFilter/issueFilter.css b/frontend/app/components/Funnels/IssueFilter/issueFilter.module.css similarity index 100% rename from frontend/app/components/Funnels/IssueFilter/issueFilter.css rename to frontend/app/components/Funnels/IssueFilter/issueFilter.module.css diff --git a/frontend/app/components/Funnels/IssueItem/IssueGraph.js b/frontend/app/components/Funnels/IssueItem/IssueGraph.js index 9da602965..0c3827c75 100644 --- a/frontend/app/components/Funnels/IssueItem/IssueGraph.js +++ b/frontend/app/components/Funnels/IssueItem/IssueGraph.js @@ -4,43 +4,25 @@ import { Popup } from 'UI' function IssueGraph({ issue }) { return (
    -
    {issue.unaffectedSessions}
    -
    - } - content={ `Unaffected sessions` } - size="tiny" - inverted - position="top center" - /> - + +
    {issue.affectedSessions}
    {/*
    {issue.affectedSessionsPer}
    */}
    - } - content={ `Affected sessions` } - size="tiny" - inverted - position="top center" - /> - +
    {issue.lostConversions}
    - } - content={ `Conversion lost` } - size="tiny" - inverted - position="top center" - /> +
    ) } diff --git a/frontend/app/components/Funnels/IssuesEmptyMessage/IssuesEmptyMessage.js b/frontend/app/components/Funnels/IssuesEmptyMessage/IssuesEmptyMessage.js index 344aa3aed..f1fbcc453 100644 --- a/frontend/app/components/Funnels/IssuesEmptyMessage/IssuesEmptyMessage.js +++ b/frontend/app/components/Funnels/IssuesEmptyMessage/IssuesEmptyMessage.js @@ -11,14 +11,14 @@ function IssuesEmptyMessage(props) { props.onAddEvent(); } return (show ? ( -
    -
    -
    See what's impacting conversions
    -
    Add events to your funnel to identify potential issues that are causing conversion loss.
    - +
    +
    +
    See what's impacting conversions
    +
    Add events to your funnel to identify potential issues that are causing conversion loss.
    + +
    +
    - -
    ) : children ) } diff --git a/frontend/app/components/Header/AlertItem.js b/frontend/app/components/Header/AlertItem.js index 77702eeb2..ee0e30226 100644 --- a/frontend/app/components/Header/AlertItem.js +++ b/frontend/app/components/Header/AlertItem.js @@ -1,6 +1,6 @@ import React from 'react'; import { Icon } from 'UI'; -import styles from './alertItem.css'; +import styles from './alertItem.module.css'; const AlertItem = ({ alert, onDelete, onEdit }) => (
    diff --git a/frontend/app/components/Header/Discover/Discover.js b/frontend/app/components/Header/Discover/Discover.js index 1f3cf8f80..b3f40066f 100644 --- a/frontend/app/components/Header/Discover/Discover.js +++ b/frontend/app/components/Header/Discover/Discover.js @@ -1,7 +1,7 @@ -import { connect } from 'react-redux'; import React from 'react'; +import { connect } from 'react-redux'; import withToggle from 'Components/hocs/withToggle'; -import stl from './discover.css'; +import stl from './discover.module.css'; import FeatureItem from './FeatureItem'; import { getOnboard } from 'Duck/dashboard'; import OutsideClickDetectingDiv from 'Shared/OutsideClickDetectingDiv'; @@ -69,7 +69,7 @@ class Discover extends React.PureComponent { onClick = task => { if (task.URL) { - if (task.URL.includes(window.ENV.ORIGIN)) { + if (task.URL.includes(window.env.ORIGIN)) { const { history } = this.props; var path = new URL(task.URL).pathname history.push(path) diff --git a/frontend/app/components/Header/Discover/FeatureItem.js b/frontend/app/components/Header/Discover/FeatureItem.js index a403fbeb9..6c972ffbd 100644 --- a/frontend/app/components/Header/Discover/FeatureItem.js +++ b/frontend/app/components/Header/Discover/FeatureItem.js @@ -1,7 +1,7 @@ import React from 'react'; import { Checkbox } from 'UI'; import cn from 'classnames'; -import stl from './featureItem.css'; +import stl from './featureItem.module.css'; const FeatureItem = ({ label, completed = false, subText, onClick }) => { return ( diff --git a/frontend/app/components/Header/Discover/discover.css b/frontend/app/components/Header/Discover/discover.module.css similarity index 100% rename from frontend/app/components/Header/Discover/discover.css rename to frontend/app/components/Header/Discover/discover.module.css diff --git a/frontend/app/components/Header/Discover/featureItem.css b/frontend/app/components/Header/Discover/featureItem.module.css similarity index 100% rename from frontend/app/components/Header/Discover/featureItem.css rename to frontend/app/components/Header/Discover/featureItem.module.css diff --git a/frontend/app/components/Header/Header.js b/frontend/app/components/Header/Header.js index 460f518d7..61b3bf39f 100644 --- a/frontend/app/components/Header/Header.js +++ b/frontend/app/components/Header/Header.js @@ -15,16 +15,17 @@ import { import { logout } from 'Duck/user'; import { Icon, Popup } from 'UI'; import SiteDropdown from './SiteDropdown'; -import styles from './header.css'; -import Discover from './Discover/Discover'; +import styles from './header.module.css'; import OnboardingExplore from './OnboardingExplore/OnboardingExplore' import Announcements from '../Announcements'; import Notifications from '../Alerts/Notifications'; import { init as initSite, fetchList as fetchSiteList } from 'Duck/site'; +import Logo from '../../svg/logo-small.svg'; import ErrorGenPanel from 'App/dev/components'; import ErrorsBadge from 'Shared/ErrorsBadge'; import Alerts from '../Alerts/Alerts'; +import AnimatedSVG, { ICONS } from '../shared/AnimatedSVG/AnimatedSVG'; const DASHBOARD_PATH = dashboard(); const SESSIONS_PATH = sessions(); @@ -70,8 +71,14 @@ const Header = (props) => {
    -
    -
    v{window.ENV.VERSION}
    + {/* React Logo */} + {/* */} +
    + + {/* */} + {/* */} + +
    v{window.env.VERSION}
    @@ -118,15 +125,9 @@ const Header = (props) => {
    - - } - content={ `Preferences` } - size="tiny" - inverted - position="top center" - /> + + +
    diff --git a/frontend/app/components/Header/NotificationItem.js b/frontend/app/components/Header/NotificationItem.js index 54da02705..01c5a6dc5 100644 --- a/frontend/app/components/Header/NotificationItem.js +++ b/frontend/app/components/Header/NotificationItem.js @@ -1,6 +1,6 @@ import { checkForRecent } from 'App/dateRange'; -import styles from './notificationItem.css'; +import styles from './notificationItem.module.css'; const NotificationItem = ({ notification: { diff --git a/frontend/app/components/Header/OnboardingExplore/FeatureItem.js b/frontend/app/components/Header/OnboardingExplore/FeatureItem.js index cbb0c3472..d30ce85a1 100644 --- a/frontend/app/components/Header/OnboardingExplore/FeatureItem.js +++ b/frontend/app/components/Header/OnboardingExplore/FeatureItem.js @@ -1,7 +1,7 @@ import React from 'react'; import { Checkbox, Icon } from 'UI'; import cn from 'classnames'; -import stl from './featureItem.css'; +import stl from './featureItem.module.css'; const FeatureItem = ({ label, completed = false, subText, onClick }) => { return ( diff --git a/frontend/app/components/Header/OnboardingExplore/OnboardingExplore.js b/frontend/app/components/Header/OnboardingExplore/OnboardingExplore.js index d143a6bbd..9e003145f 100644 --- a/frontend/app/components/Header/OnboardingExplore/OnboardingExplore.js +++ b/frontend/app/components/Header/OnboardingExplore/OnboardingExplore.js @@ -1,7 +1,7 @@ -import { connect } from 'react-redux'; import React from 'react'; +import { connect } from 'react-redux'; import withToggle from 'Components/hocs/withToggle'; -import stl from './onboardingExplore.css'; +import stl from './onboardingExplore.module.css'; import FeatureItem from './FeatureItem'; import { getOnboard } from 'Duck/dashboard'; import OutsideClickDetectingDiv from 'Shared/OutsideClickDetectingDiv'; @@ -87,17 +87,6 @@ class OnboardingExplore extends React.PureComponent { const { siteId, history } = this.props; const tab = this.getOnboardingTab(task.task) history.push(withSiteId(onboardingRoute(tab), siteId)); - - // if (task.URL) { - // if (task.URL.includes(window.ENV.ORIGIN)) { - // const { history } = props; - // var path = new URL(task.URL).pathname - // history.push(path) - // } else { - // window.open(task.URL, "_blank") - // } - // this.props.toggleModal(); - // } } render() { diff --git a/frontend/app/components/Header/OnboardingExplore/featureItem.css b/frontend/app/components/Header/OnboardingExplore/featureItem.module.css similarity index 100% rename from frontend/app/components/Header/OnboardingExplore/featureItem.css rename to frontend/app/components/Header/OnboardingExplore/featureItem.module.css diff --git a/frontend/app/components/Header/OnboardingExplore/onboardingExplore.css b/frontend/app/components/Header/OnboardingExplore/onboardingExplore.module.css similarity index 100% rename from frontend/app/components/Header/OnboardingExplore/onboardingExplore.css rename to frontend/app/components/Header/OnboardingExplore/onboardingExplore.module.css diff --git a/frontend/app/components/Header/SiteDropdown.js b/frontend/app/components/Header/SiteDropdown.js index 5e560567f..d46c347fe 100644 --- a/frontend/app/components/Header/SiteDropdown.js +++ b/frontend/app/components/Header/SiteDropdown.js @@ -1,3 +1,4 @@ +import React from 'react'; import { connect } from 'react-redux'; import { setSiteId } from 'Duck/site'; import { withRouter } from 'react-router-dom'; @@ -6,13 +7,13 @@ import { STATUS_COLOR_MAP, GREEN } from 'Types/site'; import { Icon, SlideModal } from 'UI'; import { pushNewSite } from 'Duck/user' import { init } from 'Duck/site'; -import styles from './siteDropdown.css'; +import styles from './siteDropdown.module.css'; import cn from 'classnames'; import NewSiteForm from '../Client/Sites/NewSiteForm'; import { clearSearch } from 'Duck/search'; import { fetchList as fetchIntegrationVariables } from 'Duck/customField'; -import { fetchList as fetchAlerts } from 'Duck/alerts'; import { withStore } from 'App/mstore' +import AnimatedSVG, { ICONS } from '../shared/AnimatedSVG/AnimatedSVG'; @withStore @withRouter @@ -26,15 +27,10 @@ import { withStore } from 'App/mstore' init, clearSearch, fetchIntegrationVariables, - fetchAlerts, }) export default class SiteDropdown extends React.PureComponent { state = { showProductModal: false } - // componentDidMount() { - // this.props.fetchIntegrationVariables(); - // } - closeModal = (e, newSite) => { this.setState({ showProductModal: false }) }; @@ -47,11 +43,9 @@ export default class SiteDropdown extends React.PureComponent { switchSite = (siteId) => { const { mstore } = this.props - this.props.setSiteId(siteId); this.props.clearSearch(); this.props.fetchIntegrationVariables(); - this.props.fetchAlerts(); mstore.initClient(); } @@ -64,14 +58,17 @@ export default class SiteDropdown extends React.PureComponent { const disabled = !siteChangeAvaliable(pathname); const showCurrent = hasSiteId(pathname) || siteChangeAvaliable(pathname); const canAddSites = isAdmin && account.limits.projects && account.limits.projects.remaining !== 0; + + // const signslGreenSvg = + // const signslRedSvg = return (
    { showCurrent ? -
    : + (activeSite && activeSite.status === GREEN) ? : : } -
    { showCurrent && activeSite ? activeSite.host : 'All Projects' }
    +
    { showCurrent && activeSite ? activeSite.host : 'All Projects' }
      diff --git a/frontend/app/components/Header/alertItem.css b/frontend/app/components/Header/alertItem.module.css similarity index 100% rename from frontend/app/components/Header/alertItem.css rename to frontend/app/components/Header/alertItem.module.css diff --git a/frontend/app/components/Header/alertList.css b/frontend/app/components/Header/alertList.module.css similarity index 100% rename from frontend/app/components/Header/alertList.css rename to frontend/app/components/Header/alertList.module.css diff --git a/frontend/app/components/Header/header.css b/frontend/app/components/Header/header.module.css similarity index 99% rename from frontend/app/components/Header/header.css rename to frontend/app/components/Header/header.module.css index e817d80fb..8eba021a9 100644 --- a/frontend/app/components/Header/header.css +++ b/frontend/app/components/Header/header.module.css @@ -1,4 +1,4 @@ -@import "icons.css"; +@import 'icons.css'; @import "zindex.css"; $height: 50px; diff --git a/frontend/app/components/Header/notificationItem.css b/frontend/app/components/Header/notificationItem.module.css similarity index 100% rename from frontend/app/components/Header/notificationItem.css rename to frontend/app/components/Header/notificationItem.module.css diff --git a/frontend/app/components/Header/notifications.css b/frontend/app/components/Header/notifications.module.css similarity index 100% rename from frontend/app/components/Header/notifications.css rename to frontend/app/components/Header/notifications.module.css diff --git a/frontend/app/components/Header/siteDropdown.css b/frontend/app/components/Header/siteDropdown.module.css similarity index 100% rename from frontend/app/components/Header/siteDropdown.css rename to frontend/app/components/Header/siteDropdown.module.css diff --git a/frontend/app/components/InfoModal/InfoModal.js b/frontend/app/components/InfoModal/InfoModal.js deleted file mode 100644 index cebfcb222..000000000 --- a/frontend/app/components/InfoModal/InfoModal.js +++ /dev/null @@ -1,19 +0,0 @@ -import { connect } from 'react-redux'; -import { Modal } from 'UI'; - -@connect(state => ({ - open: false, -})) -export default class InfoModal extends React.PureComponent { - render() { - return ( - - - - - ); - } -} \ No newline at end of file diff --git a/frontend/app/components/Login/Login.js b/frontend/app/components/Login/Login.js index 8e135d221..3c572a9df 100644 --- a/frontend/app/components/Login/Login.js +++ b/frontend/app/components/Login/Login.js @@ -1,11 +1,12 @@ +import React from 'react'; import { connect } from 'react-redux'; import withPageTitle from 'HOCs/withPageTitle'; -import { Icon, Loader, Button, Link } from 'UI'; +import { Icon, Loader, Button, Link, Input, Form } from 'UI'; import { login } from 'Duck/user'; import { forgotPassword, signup } from 'App/routes'; import ReCAPTCHA from 'react-google-recaptcha'; import { withRouter } from 'react-router-dom'; -import stl from './login.css'; +import stl from './login.module.css'; import cn from 'classnames'; import { setJwt } from 'Duck/jwt'; @@ -28,6 +29,7 @@ export default class Login extends React.Component { state = { email: '', password: '', + CAPTCHA_ENABLED: window.env.CAPTCHA_ENABLED === 'true', }; componentDidMount() { @@ -48,23 +50,27 @@ export default class Login extends React.Component { onSubmit = (e) => { e.preventDefault(); - if (window.ENV.CAPTCHA_ENABLED && recaptchaRef.current) { + const { CAPTCHA_ENABLED } = this.state; + if (CAPTCHA_ENABLED && recaptchaRef.current) { recaptchaRef.current.execute(); - } else if (!window.ENV.CAPTCHA_ENABLED) { + } else if (!CAPTCHA_ENABLED) { this.handleSubmit(); } } write = ({ target: { value, name } }) => this.setState({ [ name ]: value }) + + render() { const { errors, loading, authDetails } = this.props; + const { CAPTCHA_ENABLED } = this.state; return ( -
      -
      +
      +
      - +
      @@ -72,28 +78,28 @@ export default class Login extends React.Component {
      -
      +
      -
      +

      Login to OpenReplay

      { !authDetails.tenants &&
      Don't have an account? Sign up
      }
      - { window.ENV.CAPTCHA_ENABLED && ( + { CAPTCHA_ENABLED && ( this.handleSubmit(token) } /> )} -
      +
      -
      - - */} + {/* */} + -
      + {/*
      */}
      -
      - - */} + {/* */} + -
      + {/*
      */}
      @@ -133,18 +141,18 @@ export default class Login extends React.Component {
      }
      - +
      {'Forgot your password?'}
      - + { authDetails.sso && ( )} diff --git a/frontend/app/components/Login/login.css b/frontend/app/components/Login/login.module.css similarity index 98% rename from frontend/app/components/Login/login.css rename to frontend/app/components/Login/login.module.css index 04a0768c7..3ee57c660 100644 --- a/frontend/app/components/Login/login.css +++ b/frontend/app/components/Login/login.module.css @@ -1,4 +1,4 @@ -@import "icons.css"; +@import 'icons.css'; .form { /* position: absolute; */ /* top: 50%; */ @@ -76,7 +76,7 @@ .errors { border-radius: 5px; - width: 400px; + /* width: 400px; */ margin: auto; /* border: 1px solid $red; */ padding: 15px; diff --git a/frontend/app/components/Modal/Modal.js b/frontend/app/components/Modal/Modal.tsx similarity index 80% rename from frontend/app/components/Modal/Modal.js rename to frontend/app/components/Modal/Modal.tsx index fa6727ebe..33fb5f149 100644 --- a/frontend/app/components/Modal/Modal.js +++ b/frontend/app/components/Modal/Modal.tsx @@ -1,9 +1,9 @@ -import React, { useEffect } from 'react'; +import React from 'react'; import ReactDOM from 'react-dom'; import { useModal } from '.'; import ModalOverlay from './ModalOverlay'; -export default function Modal({ children }){ +export default function Modal() { const { component, props} = useModal(); return component ? ReactDOM.createPortal( diff --git a/frontend/app/components/Modal/ModalContext.js b/frontend/app/components/Modal/ModalContext.js deleted file mode 100644 index 43ab9f8b8..000000000 --- a/frontend/app/components/Modal/ModalContext.js +++ /dev/null @@ -1,40 +0,0 @@ -import React, { Component, createContext } from 'react'; - -const ModalContext = createContext({ - component: null, - props: {}, - showModal: () => {}, - hideModal: () => {} -}); - -export class ModalProvider extends Component { - showModal = (component, props = {}) => { - this.setState({ - component, - props - }); - }; - - hideModal = () => - this.setState({ - component: null, - props: {} - }); - - state = { - component: null, - props: {}, - showModal: this.showModal, - hideModal: this.hideModal - }; - - render() { - return ( - - {this.props.children} - - ); - } -} - -export const ModalConsumer = ModalContext.Consumer; diff --git a/frontend/app/components/Modal/ModalOverlay.css b/frontend/app/components/Modal/ModalOverlay.module.css similarity index 100% rename from frontend/app/components/Modal/ModalOverlay.css rename to frontend/app/components/Modal/ModalOverlay.module.css diff --git a/frontend/app/components/Modal/ModalOverlay.tsx b/frontend/app/components/Modal/ModalOverlay.tsx index 270840a65..762782427 100644 --- a/frontend/app/components/Modal/ModalOverlay.tsx +++ b/frontend/app/components/Modal/ModalOverlay.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { useModal } from 'App/components/Modal'; -import stl from './ModalOverlay.css' +import stl from './ModalOverlay.module.css' import cn from 'classnames'; function ModalOverlay({ children, left = false, right = false }) { diff --git a/frontend/app/components/Modal/ModalRoot.js b/frontend/app/components/Modal/ModalRoot.js deleted file mode 100644 index 98152c59e..000000000 --- a/frontend/app/components/Modal/ModalRoot.js +++ /dev/null @@ -1,12 +0,0 @@ -import React from 'react'; -import { ModalConsumer } from './ModalContext'; - -const ModalRoot = () => ( - - {({ component: Component, props, hideModal }) => - Component ? : null - } - -); - -export default ModalRoot; diff --git a/frontend/app/components/Modal/useModal.ts b/frontend/app/components/Modal/useModal.ts deleted file mode 100644 index edcf08e98..000000000 --- a/frontend/app/components/Modal/useModal.ts +++ /dev/null @@ -1,15 +0,0 @@ -import React from "react"; - -export default () => { - let [modal, setModal] = React.useState(false); - let [modalContent, setModalContent] = React.useState("I'm the Modal Content"); - - let handleModal = (content = false) => { - setModal(!modal); - if (content) { - setModalContent(content); - } - }; - - return { modal, handleModal, modalContent }; -}; diff --git a/frontend/app/components/Modal/withModal.js b/frontend/app/components/Modal/withModal.tsx similarity index 70% rename from frontend/app/components/Modal/withModal.js rename to frontend/app/components/Modal/withModal.tsx index 1ecc93ed2..ec5030e54 100644 --- a/frontend/app/components/Modal/withModal.js +++ b/frontend/app/components/Modal/withModal.tsx @@ -1,4 +1,5 @@ -import { ModalConsumer } from './ModalContext'; +import React from 'react'; +import { ModalConsumer } from './'; export default BaseComponent => React.memo(props => ( diff --git a/frontend/app/components/Onboarding/Onboarding.js b/frontend/app/components/Onboarding/Onboarding.js index 007b4ae0e..e0f4fd973 100644 --- a/frontend/app/components/Onboarding/Onboarding.js +++ b/frontend/app/components/Onboarding/Onboarding.js @@ -43,7 +43,6 @@ const Onboarding = (props) => {
      -
      diff --git a/frontend/app/components/Onboarding/components/CircleNumber/CircleNumber.js b/frontend/app/components/Onboarding/components/CircleNumber/CircleNumber.js index c51458176..91325b553 100644 --- a/frontend/app/components/Onboarding/components/CircleNumber/CircleNumber.js +++ b/frontend/app/components/Onboarding/components/CircleNumber/CircleNumber.js @@ -1,5 +1,5 @@ import React from 'react' -import stl from './circleNumber.css' +import stl from './circleNumber.module.css' export default function CircleNumber({ text }) { return ( diff --git a/frontend/app/components/Onboarding/components/CircleNumber/circleNumber.css b/frontend/app/components/Onboarding/components/CircleNumber/circleNumber.module.css similarity index 100% rename from frontend/app/components/Onboarding/components/CircleNumber/circleNumber.css rename to frontend/app/components/Onboarding/components/CircleNumber/circleNumber.module.css diff --git a/frontend/app/components/Onboarding/components/MetadataList/MetadataList.js b/frontend/app/components/Onboarding/components/MetadataList/MetadataList.js index fddccaf51..96dfc6345 100644 --- a/frontend/app/components/Onboarding/components/MetadataList/MetadataList.js +++ b/frontend/app/components/Onboarding/components/MetadataList/MetadataList.js @@ -3,7 +3,7 @@ import { Button, SlideModal, TagBadge } from 'UI' import { connect } from 'react-redux' import { init, fetchList, save, remove } from 'Duck/customField'; import CustomFieldForm from '../../../Client/CustomFields/CustomFieldForm'; -import { confirm } from 'UI/Confirmation'; +import { confirm } from 'UI'; const MetadataList = (props) => { const { site, fields } = props; @@ -34,7 +34,7 @@ const MetadataList = (props) => { return (
      - +
      { fields.map((f, index) => ( { } return ( - <> +
      - - { - - } - + + +
      ) } diff --git a/frontend/app/components/Onboarding/components/OnboardingTabs/InstallDocs/InstallDocs.js b/frontend/app/components/Onboarding/components/OnboardingTabs/InstallDocs/InstallDocs.js index bd2cb7d21..5096f0b16 100644 --- a/frontend/app/components/Onboarding/components/OnboardingTabs/InstallDocs/InstallDocs.js +++ b/frontend/app/components/Onboarding/components/OnboardingTabs/InstallDocs/InstallDocs.js @@ -1,10 +1,11 @@ import React, { useState } from 'react' import { connect } from 'react-redux' -import stl from './installDocs.css' +import stl from './installDocs.module.css' import cn from 'classnames' import Highlight from 'react-highlight' import CircleNumber from '../../CircleNumber' import { Slider, CopyButton } from 'UI' +import { Toggler } from 'UI'; const installationCommand = 'npm i @openreplay/tracker' const usageCode = `import Tracker from '@openreplay/tracker'; @@ -29,8 +30,8 @@ function MyApp() { //... }` - -function InstallDocs({ site }) { +function InstallDocs({ siteId, sites }) { + const site = sites.find(s => s.id === siteId); const _usageCode = usageCode.replace('PROJECT_KEY', site.projectKey) const _usageCodeSST = usageCodeSST.replace('PROJECT_KEY', site.projectKey) const [isSpa, setIsSpa] = useState(true) @@ -56,13 +57,11 @@ function InstallDocs({ site }) {
      setIsSpa(!isSpa)}>Server-Side-Rendered (SSR)?
      - setIsSpa(!isSpa) } - checked={ !isSpa } - // className={stl.customSlider} - style={{ lineHeight: '23px' }} - // label="Server-Side-Rendered (SSR)?" + // style={{ lineHeight: '23px' }} />
      @@ -102,5 +101,6 @@ function InstallDocs({ site }) { // export default InstallDocs export default connect(state => ({ - site: state.getIn([ 'site', 'instance' ]), + siteId: state.getIn([ 'site', 'siteId' ]), + sites: state.getIn([ 'site', 'list' ]), }))(InstallDocs) \ No newline at end of file diff --git a/frontend/app/components/Onboarding/components/OnboardingTabs/InstallDocs/installDocs.css b/frontend/app/components/Onboarding/components/OnboardingTabs/InstallDocs/installDocs.module.css similarity index 100% rename from frontend/app/components/Onboarding/components/OnboardingTabs/InstallDocs/installDocs.css rename to frontend/app/components/Onboarding/components/OnboardingTabs/InstallDocs/installDocs.module.css diff --git a/frontend/app/components/Onboarding/components/OnboardingTabs/ProjectCodeSnippet/ProjectCodeSnippet.js b/frontend/app/components/Onboarding/components/OnboardingTabs/ProjectCodeSnippet/ProjectCodeSnippet.js index fd3f9a7e8..2eae2074c 100644 --- a/frontend/app/components/Onboarding/components/OnboardingTabs/ProjectCodeSnippet/ProjectCodeSnippet.js +++ b/frontend/app/components/Onboarding/components/OnboardingTabs/ProjectCodeSnippet/ProjectCodeSnippet.js @@ -1,29 +1,38 @@ -import React, { useState } from 'react' +import React, { useEffect, useState } from 'react' import { connect } from 'react-redux'; -import { editGDPR, saveGDPR } from 'Duck/site'; +import { editGDPR, saveGDPR, init } from 'Duck/site'; import copy from 'copy-to-clipboard'; -import { Select, Checkbox } from 'UI'; +import { Checkbox } from 'UI'; import GDPR from 'Types/site/gdpr'; import cn from 'classnames' -import stl from './projectCodeSnippet.css' +import stl from './projectCodeSnippet.module.css' import CircleNumber from '../../CircleNumber'; import Highlight from 'react-highlight' +import Select from 'Shared/Select' const inputModeOptions = [ - { text: 'Record all inputs', value: 'plain' }, - { text: 'Ignore all inputs', value: 'obscured' }, - { text: 'Obscure all inputs', value: 'hidden' }, + { label: 'Record all inputs', value: 'plain' }, + { label: 'Ignore all inputs', value: 'obscured' }, + { label: 'Obscure all inputs', value: 'hidden' }, ]; const inputModeOptionsMap = {} inputModeOptions.forEach((o, i) => inputModeOptionsMap[o.value] = i) const ProjectCodeSnippet = props => { - const site = props.sites.find(s => s.id === props.siteId); - const { gdpr } = site; + // const site = props.sites.find(s => s.id === props.siteId); + const { site } = props; + const { gdpr } = props.site; const [changed, setChanged] = useState(false) const [copied, setCopied] = useState(false) + useEffect(() => { + const site = props.sites.find(s => s.id === props.siteId); + if (site) { + props.init(site) + } + }, []) + const codeSnippet = ` `; const saveGDPR = (value) => { @@ -55,8 +64,9 @@ const ProjectCodeSnippet = props => { props.saveGDPR(site.id, GDPR({...value})); } - const onChangeSelect = (event, { name, value }) => { - const { gdpr } = site; + const onChangeSelect = ({ name, value }) => { + // console.log(name, value) + // const { gdpr } = site; const _gdpr = { ...gdpr.toData() }; props.editGDPR({ [ name ]: value }); _gdpr[name] = value; @@ -64,8 +74,9 @@ const ProjectCodeSnippet = props => { saveGDPR(_gdpr) }; - const onChangeOption = (event, { name, checked }) => { - const { gdpr } = props.site; + const onChangeOption = ({ target: { name, checked } }) => { + // const { gdpr } = site; + console.log(name, checked) const _gdpr = { ...gdpr.toData() }; _gdpr[name] = checked; props.editGDPR({ [ name ]: checked }); @@ -97,6 +108,8 @@ const ProjectCodeSnippet = props => { }; const _snippet = getCodeSnippet(site); + + // console.log('gdpr.defaultInputMode', gdpr.defaultInputMode) return (
      @@ -108,9 +121,9 @@ const ProjectCodeSnippet = props => { + +
      Body is Empty.
      +
      + } size="small" show={ !payload } - animatedIcon="no-results" + // animatedIcon="no-results" >
      @@ -60,10 +66,15 @@ export default class FetchDetails extends React.PureComponent { case RESPONSE: return ( + +
      Body is Empty.
      +
      + } size="small" show={ !response } - animatedIcon="no-results" + // animatedIcon="no-results" >
      @@ -147,10 +158,10 @@ export default class FetchDetails extends React.PureComponent {
      - -
      diff --git a/frontend/app/components/Session_/Fetch/components/Headers/Headers.tsx b/frontend/app/components/Session_/Fetch/components/Headers/Headers.tsx index 47ebff217..c2ec31a07 100644 --- a/frontend/app/components/Session_/Fetch/components/Headers/Headers.tsx +++ b/frontend/app/components/Session_/Fetch/components/Headers/Headers.tsx @@ -1,15 +1,21 @@ import React from 'react' import { NoContent, TextEllipsis } from 'UI' -import stl from './headers.css' +import stl from './headers.module.css' +import AnimatedSVG, { ICONS } from 'Shared/AnimatedSVG/AnimatedSVG'; function Headers(props) { return (
      + +
      No data available.
      +
      + } size="small" show={ !props.requestHeaders && !props.responseHeaders } - animatedIcon="no-results" + // animatedIcon="no-results" > { props.requestHeaders && ( <> diff --git a/frontend/app/components/Session_/Fetch/components/Headers/headers.css b/frontend/app/components/Session_/Fetch/components/Headers/headers.module.css similarity index 100% rename from frontend/app/components/Session_/Fetch/components/Headers/headers.css rename to frontend/app/components/Session_/Fetch/components/Headers/headers.module.css diff --git a/frontend/app/components/Session_/Fetch/fetchDetails.css b/frontend/app/components/Session_/Fetch/fetchDetails.module.css similarity index 100% rename from frontend/app/components/Session_/Fetch/fetchDetails.css rename to frontend/app/components/Session_/Fetch/fetchDetails.module.css diff --git a/frontend/app/components/Session_/GraphQL/GQLDetails.js b/frontend/app/components/Session_/GraphQL/GQLDetails.js index 8b665b056..47ec43239 100644 --- a/frontend/app/components/Session_/GraphQL/GQLDetails.js +++ b/frontend/app/components/Session_/GraphQL/GQLDetails.js @@ -1,3 +1,4 @@ +import React from 'react'; import { JSONTree, Button } from 'UI' import cn from 'classnames'; @@ -66,10 +67,10 @@ export default class GQLDetails extends React.PureComponent {
      - -
      diff --git a/frontend/app/components/Session_/GraphQL/GraphQL.js b/frontend/app/components/Session_/GraphQL/GraphQL.js index 0b2765b58..2d3a112e4 100644 --- a/frontend/app/components/Session_/GraphQL/GraphQL.js +++ b/frontend/app/components/Session_/GraphQL/GraphQL.js @@ -1,4 +1,5 @@ -import { Label, Icon, NoContent, Input, SlideModal, CloseButton } from 'UI'; +import React from 'react'; +import { NoContent, Input, SlideModal, CloseButton } from 'UI'; import { getRE } from 'App/utils'; import { connectPlayer, pause, jump } from 'Player'; import BottomBlock from '../BottomBlock'; @@ -23,7 +24,7 @@ export default class GraphQL extends React.PureComponent { hasPreviousError: false, } - onFilterChange = (e, { value }) => { + onFilterChange = ({ target: { value } }) => { const { list } = this.props; const filterRE = getRE(value, 'i'); const filtered = list @@ -87,7 +88,7 @@ export default class GraphQL extends React.PureComponent {

      GraphQL

      { return ( diff --git a/frontend/app/components/Session_/Inspector/AttrView.tsx b/frontend/app/components/Session_/Inspector/AttrView.tsx index 9f04d8b58..04ab6d791 100644 --- a/frontend/app/components/Session_/Inspector/AttrView.tsx +++ b/frontend/app/components/Session_/Inspector/AttrView.tsx @@ -1,6 +1,6 @@ import React, { useState, useCallback } from 'react'; import InlineInput from './InlineInput'; -import stl from './inspector.css'; +import stl from './inspector.module.css'; import cn from 'classnames'; interface Props { diff --git a/frontend/app/components/Session_/Inspector/ElementView.tsx b/frontend/app/components/Session_/Inspector/ElementView.tsx index 42d6eb81d..7c12aea3e 100644 --- a/frontend/app/components/Session_/Inspector/ElementView.tsx +++ b/frontend/app/components/Session_/Inspector/ElementView.tsx @@ -3,7 +3,7 @@ import cn from 'classnames'; import useToggle from 'App/hooks/useToggle'; import useForceUpdate from 'App/hooks/useForceUpdate'; import { Icon } from 'UI'; -import stl from './inspector.css'; +import stl from './inspector.module.css'; import AttrView from './AttrView'; import TextView from './TextView'; diff --git a/frontend/app/components/Session_/Inspector/index.js b/frontend/app/components/Session_/Inspector/index.js index 2c563fd28..e3fda7096 100644 --- a/frontend/app/components/Session_/Inspector/index.js +++ b/frontend/app/components/Session_/Inspector/index.js @@ -2,7 +2,7 @@ import React, { useEffect, useState, useRef } from 'react'; import { toggleInspectorMode, markElement } from 'Player'; import ElementView from './ElementView'; import BottomBlock from '../BottomBlock'; -import stl from './inspector.css' +import stl from './inspector.module.css' // TODO: refactor: use Layout from the Sessions and put everything there under the WebPlayer folder diff --git a/frontend/app/components/Session_/Inspector/inspector.css b/frontend/app/components/Session_/Inspector/inspector.module.css similarity index 100% rename from frontend/app/components/Session_/Inspector/inspector.css rename to frontend/app/components/Session_/Inspector/inspector.module.css diff --git a/frontend/app/components/Session_/Issues/ActiveIssueClose.js b/frontend/app/components/Session_/Issues/ActiveIssueClose.js index 1c02f3a79..c51bd326e 100644 --- a/frontend/app/components/Session_/Issues/ActiveIssueClose.js +++ b/frontend/app/components/Session_/Issues/ActiveIssueClose.js @@ -7,7 +7,7 @@ const ActiveIssueClose = ({ resetActiveIsue }) => { return (
      diff --git a/frontend/app/components/Session_/Issues/IssueDetails.js b/frontend/app/components/Session_/Issues/IssueDetails.js index f91f0ad73..9c50c858b 100644 --- a/frontend/app/components/Session_/Issues/IssueDetails.js +++ b/frontend/app/components/Session_/Issues/IssueDetails.js @@ -5,7 +5,7 @@ import { Loader } from 'UI'; import IssueHeader from './IssueHeader'; import IssueCommentForm from './IssueCommentForm'; import IssueComment from './IssueComment'; -import stl from './issueDetails.css'; +import stl from './issueDetails.module.css'; import IssueDescription from './IssueDescription'; class IssueDetails extends React.PureComponent { diff --git a/frontend/app/components/Session_/Issues/IssueForm.js b/frontend/app/components/Session_/Issues/IssueForm.js index 81dda0504..c0efe562a 100644 --- a/frontend/app/components/Session_/Issues/IssueForm.js +++ b/frontend/app/components/Session_/Issues/IssueForm.js @@ -1,8 +1,9 @@ import React from 'react'; import { connect } from 'react-redux'; -import { Form, Input, Button, Dropdown, CircularLoader } from 'UI'; +import { Form, Input, Button, CircularLoader } from 'UI'; //import { } from 'Duck/issues'; import { addActivity, init, edit, fetchAssignments, fetchMeta } from 'Duck/assignments'; +import Select from 'Shared/Select' const SelectedValue = ({ icon, text }) => { return( @@ -67,8 +68,7 @@ class IssueForm extends React.PureComponent { Project - - - {'Create'} diff --git a/frontend/app/components/Session_/Issues/IssueHeader.js b/frontend/app/components/Session_/Issues/IssueHeader.js index e27f63819..e98288589 100644 --- a/frontend/app/components/Session_/Issues/IssueHeader.js +++ b/frontend/app/components/Session_/Issues/IssueHeader.js @@ -1,7 +1,7 @@ import React from 'react'; import { Icon, Input } from 'UI'; import ActiveIssueClose from './ActiveIssueClose'; -import stl from './issueHeader.css'; +import stl from './issueHeader.module.css'; const GotoSessionLink = props => ( diff --git a/frontend/app/components/Session_/Issues/IssueListItem.js b/frontend/app/components/Session_/Issues/IssueListItem.js index 51b5bb25c..1ccdbcfe2 100644 --- a/frontend/app/components/Session_/Issues/IssueListItem.js +++ b/frontend/app/components/Session_/Issues/IssueListItem.js @@ -1,7 +1,7 @@ import React from 'react'; import cn from 'classnames'; import { Popup } from 'UI'; -import stl from './issueListItem.css'; +import stl from './issueListItem.module.css'; const IssueListItem = ({ issue, onClick, icon, user, active }) => { return ( @@ -17,15 +17,9 @@ const IssueListItem = ({ issue, onClick, icon, user, active }) => {
      { user && - - } - content={ 'Assignee ' + user.name } - size="small" - position="top right" - inverted - /> + + + }
      diff --git a/frontend/app/components/Session_/Issues/Issues.js b/frontend/app/components/Session_/Issues/Issues.js index bba3eaf40..8bbf4232d 100644 --- a/frontend/app/components/Session_/Issues/Issues.js +++ b/frontend/app/components/Session_/Issues/Issues.js @@ -1,16 +1,12 @@ import React from 'react'; import { connect } from 'react-redux'; -// import cn from 'classnames'; -import { SlideModal, Popup, Button, Icon, SplitButton } from 'UI'; +import { Popup, Button } from 'UI'; import OutsideClickDetectingDiv from 'Shared/OutsideClickDetectingDiv'; import IssuesModal from './IssuesModal'; -// import { fetchIssue } from 'Duck/issues'; -import { fetchProjects, fetchAssignments, fetchMeta, fetchAssigment } from 'Duck/assignments'; -import SessionIssuesPanel from './SessionIssuesPanel'; -import IssueDetails from './IssueDetails'; +import { fetchProjects, fetchMeta } from 'Duck/assignments'; import withToggle from 'HOCs/withToggle'; -// import { withRequest } from 'HOCs'; -import stl from './issues.css'; +import stl from './issues.module.css'; +import { fetchList as fetchListIntegration } from 'Duck/integrations/actions'; @connect(state => ({ issues: state.getIn(['assignments', 'list']), @@ -22,15 +18,42 @@ import stl from './issues.css'; fetchIssuesLoading: state.getIn(['assignments', 'fetchAssignments', 'loading']), projectsLoading: state.getIn(['assignments', 'fetchProjects', 'loading']), issuesIntegration: state.getIn([ 'issues', 'list']).first() || {}, -}), { fetchAssigment, fetchAssignments, fetchMeta, fetchProjects }) + + jiraConfig: state.getIn([ 'issues', 'list' ]).first(), + issuesFetched: state.getIn([ 'issues', 'issuesFetched' ]), +}), { fetchMeta, fetchProjects, fetchListIntegration }) @withToggle('isModalDisplayed', 'toggleModal') class Issues extends React.Component { state = {showModal: false }; + componentDidMount() { + if (!this.props.issuesFetched) + this.props.fetchListIntegration('issues') + } + constructor(props) { super(props); this.state = { showModal: false }; - if (!props.projectsFetched) { // cache projects fetch + } + + closeModal = () => { + this.setState({ showModal: false }); + } + + showIssuesList = (e) => { + e.preventDefault(); + e.stopPropagation(); + this.setState({ showModal: true }); + } + + handleClose = () => { + this.setState({ showModal: false }); + } + + handleOpen = () => { + alert('test') + this.setState({ showModal: true }); + if (!this.props.projectsFetched) { // cache projects fetch this.props.fetchProjects().then(function() { const { projects } = this.props; if (projects && projects.first()) { @@ -38,69 +61,28 @@ class Issues extends React.Component { } }.bind(this)) } - this.props.fetchAssignments(this.props.sessionId) } - - closeModal = () => { - if (!this.props.isModalDisplayed) return; - this.props.toggleModal(); - } - - onIssueClick = (issue) => { - const { sessionId } = this.props; - this.setState({ showModal: true }); - this.props.fetchAssigment(sessionId, issue.id); - - if (this.props.isModalDisplayed) - this.props.toggleModal(); - } - - showIssuesList = (e) => { - e.preventDefault(); - e.stopPropagation(); - this.setState({ showModal: true }); - } render() { const { - sessionId, activeIssue, isModalDisplayed, projectsLoading, - fetchIssueLoading, issues, metaLoading, fetchIssuesLoading, issuesIntegration + sessionId, isModalDisplayed, projectsLoading, metaLoading, fetchIssuesLoading, issuesIntegration } = this.props; const { showModal } = this.state; const provider = issuesIntegration.provider return (
      -
      +
      -
      - - Report Issue -
      - - : - } - on="click" - position="top right" - content={ + interactive={true} + hideOnClick={false} + useContext + multiple={false} + unmountHTMLWhenHide={true} + open={ showModal } + // onOpen={ this.handleOpen } + // onClose={ this.handleClose } + content = { } - /> + // trigger="click" + theme="tippy-light" + > + { + + } +
      - - - } - detailContent={ ((activeIssue && activeIssue.id) || fetchIssueLoading) && -
      - -
      - } - onClose={ () => this.setState({ showModal: false }) } - />
      ); } diff --git a/frontend/app/components/Session_/Issues/IssuesModal.js b/frontend/app/components/Session_/Issues/IssuesModal.js index 448d02486..6808858ba 100644 --- a/frontend/app/components/Session_/Issues/IssuesModal.js +++ b/frontend/app/components/Session_/Issues/IssuesModal.js @@ -1,5 +1,5 @@ import React from 'react'; -import stl from './issuesModal.css'; +import stl from './issuesModal.module.css'; import IssueForm from './IssueForm'; import { Icon } from 'UI'; diff --git a/frontend/app/components/Session_/Issues/IssuesSortDropdown.js b/frontend/app/components/Session_/Issues/IssuesSortDropdown.js index 6c71225e1..16effb366 100644 --- a/frontend/app/components/Session_/Issues/IssuesSortDropdown.js +++ b/frontend/app/components/Session_/Issues/IssuesSortDropdown.js @@ -1,8 +1,6 @@ -import { connect } from 'react-redux'; +import React from 'react'; import { Dropdown } from 'semantic-ui-react'; import { IconButton } from 'UI'; -import { sort } from 'Duck/sessions'; -import { applyFilter } from 'Duck/filters'; const sessionSortOptions = { // '': 'All', diff --git a/frontend/app/components/Session_/Issues/contentRender.css b/frontend/app/components/Session_/Issues/contentRender.module.css similarity index 100% rename from frontend/app/components/Session_/Issues/contentRender.css rename to frontend/app/components/Session_/Issues/contentRender.module.css diff --git a/frontend/app/components/Session_/Issues/issueDetails.css b/frontend/app/components/Session_/Issues/issueDetails.module.css similarity index 100% rename from frontend/app/components/Session_/Issues/issueDetails.css rename to frontend/app/components/Session_/Issues/issueDetails.module.css diff --git a/frontend/app/components/Session_/Issues/issueHeader.css b/frontend/app/components/Session_/Issues/issueHeader.module.css similarity index 100% rename from frontend/app/components/Session_/Issues/issueHeader.css rename to frontend/app/components/Session_/Issues/issueHeader.module.css diff --git a/frontend/app/components/Session_/Issues/issueListItem.css b/frontend/app/components/Session_/Issues/issueListItem.module.css similarity index 100% rename from frontend/app/components/Session_/Issues/issueListItem.css rename to frontend/app/components/Session_/Issues/issueListItem.module.css diff --git a/frontend/app/components/Session_/Issues/issues.css b/frontend/app/components/Session_/Issues/issues.module.css similarity index 100% rename from frontend/app/components/Session_/Issues/issues.css rename to frontend/app/components/Session_/Issues/issues.module.css diff --git a/frontend/app/components/Session_/Issues/issuesModal.css b/frontend/app/components/Session_/Issues/issuesModal.module.css similarity index 100% rename from frontend/app/components/Session_/Issues/issuesModal.css rename to frontend/app/components/Session_/Issues/issuesModal.module.css diff --git a/frontend/app/components/Session_/Issues/sessionIssuesPanel.css b/frontend/app/components/Session_/Issues/sessionIssuesPanel.module.css similarity index 100% rename from frontend/app/components/Session_/Issues/sessionIssuesPanel.css rename to frontend/app/components/Session_/Issues/sessionIssuesPanel.module.css diff --git a/frontend/app/components/Session_/LongTasks/LongTasks.js b/frontend/app/components/Session_/LongTasks/LongTasks.js index 1baa7a2eb..61f8b41ea 100644 --- a/frontend/app/components/Session_/LongTasks/LongTasks.js +++ b/frontend/app/components/Session_/LongTasks/LongTasks.js @@ -1,5 +1,5 @@ -//import cn from 'classnames'; -import { Icon, NoContent, Input, SlideModal, QuestionMarkHint } from 'UI'; +import React from 'react'; +import { NoContent, Input, QuestionMarkHint } from 'UI' import { getRE } from 'App/utils'; import { connectPlayer, jump } from 'Player'; import BottomBlock from '../BottomBlock'; diff --git a/frontend/app/components/Session_/Network/Network.js b/frontend/app/components/Session_/Network/Network.js index 150cadc59..2834cc501 100644 --- a/frontend/app/components/Session_/Network/Network.js +++ b/frontend/app/components/Session_/Network/Network.js @@ -1,9 +1,10 @@ +import React from 'react'; import cn from 'classnames'; import { connectPlayer, jump, pause } from 'Player'; -import { QuestionMarkHint, Popup, Tabs, Input } from 'UI'; +import { Popup } from 'UI'; import { getRE } from 'App/utils'; import { TYPES } from 'Types/session/resource'; -import stl from './network.css'; +import stl from './network.module.css'; import NetworkContent from './NetworkContent'; import { connect } from 'react-redux'; import { setTimelinePointer } from 'Duck/sessions'; @@ -28,12 +29,9 @@ const TAB_TO_TYPE_MAP = { export function renderName(r) { return (
      - { r.name }
      } - content={
      { r.url }
      } - size="mini" - position="right center" - /> + { r.url }
      } > +
      { r.name }
      +
      { @@ -62,13 +60,9 @@ export function renderDuration(r) { } return ( - { text }
      - } - /> + +
      { text }
      +
      ); } diff --git a/frontend/app/components/Session_/Network/NetworkContent.js b/frontend/app/components/Session_/Network/NetworkContent.js index e4988d3e4..136790769 100644 --- a/frontend/app/components/Session_/Network/NetworkContent.js +++ b/frontend/app/components/Session_/Network/NetworkContent.js @@ -1,3 +1,4 @@ +import React from 'react'; import cn from 'classnames'; // import { connectPlayer } from 'Player'; import { QuestionMarkHint, Popup, Tabs, Input } from 'UI'; @@ -9,7 +10,7 @@ import { formatMs } from 'App/date'; import TimeTable from '../TimeTable'; import BottomBlock from '../BottomBlock'; import InfoLine from '../BottomBlock/InfoLine'; -import stl from './network.css'; +import stl from './network.module.css'; const ALL = 'ALL'; const XHR = 'xhr'; @@ -37,23 +38,17 @@ const LOAD_TIME_COLOR = "red"; export function renderType(r) { return ( - { r.type }
      } - content={
      { r.type }
      } - size="mini" - position="right center" - /> + { r.type }
      } > +
      { r.type }
      + ); } export function renderName(r) { return ( - { r.name }
      } - content={
      { r.url }
      } - size="mini" - position="right center" - /> + { r.url }
      } > +
      { r.name }
      + ); } @@ -99,12 +94,9 @@ function renderSize(r) { } return ( - { triggerText }
      } - content={ content } - size="mini" - position="right center" - /> + +
      { triggerText }
      +
      ); } @@ -127,11 +119,9 @@ export function renderDuration(r) { return ( { text }
    - } - /> + > +
    { text }
    + ); } @@ -142,7 +132,7 @@ export default class NetworkContent extends React.PureComponent { } onTabClick = activeTab => this.setState({ activeTab }) - onFilterChange = (e, { value }) => this.setState({ filter: value }) + onFilterChange = ({ target: { value } }) => this.setState({ filter: value }) render() { const { @@ -207,7 +197,7 @@ export default class NetworkContent extends React.PureComponent { border={ false } /> { - const { startDate, endDate, rangeValue } = e; + const { startDate, endDate, rangeValue } = e.toJSON(); setInsightsFilters({ ...insightsFilters, startDate, endDate, rangeValue }) } @@ -44,7 +53,7 @@ function PageInsightsPanel({ } }, [insightsFilters]) - const onPageSelect = (e, { name, value }) => { + const onPageSelect = ({ value }: any) => { const event = events.find(item => item.url === value) Player.jump(event.time + JUMP_OFFSET) setInsightsFilters({ ...insightsFilters, url: host + value }) @@ -54,28 +63,28 @@ function PageInsightsPanel({ return (
    - + /> */} +
    In Page
    -
    @@ -92,7 +101,7 @@ export default connect(state => { host: state.getIn([ 'sessions', 'host' ]), insights: state.getIn([ 'sessions', 'insights' ]), events: events, - urlOptions: events.map(({ url, host }) => ({ text: url, value: url, host })), + urlOptions: events.map(({ url, host }: any) => ({ label: url, value: url, host })), loading: state.getIn([ 'sessions', 'fetchInsightsRequest', 'loading' ]), } }, { fetchInsights })(PageInsightsPanel); \ No newline at end of file diff --git a/frontend/app/components/Session_/PageInsightsPanel/components/SelectorCard/SelectorCard.css b/frontend/app/components/Session_/PageInsightsPanel/components/SelectorCard/SelectorCard.module.css similarity index 100% rename from frontend/app/components/Session_/PageInsightsPanel/components/SelectorCard/SelectorCard.css rename to frontend/app/components/Session_/PageInsightsPanel/components/SelectorCard/SelectorCard.module.css diff --git a/frontend/app/components/Session_/PageInsightsPanel/components/SelectorCard/SelectorCard.tsx b/frontend/app/components/Session_/PageInsightsPanel/components/SelectorCard/SelectorCard.tsx index 0899a8c79..061b85875 100644 --- a/frontend/app/components/Session_/PageInsightsPanel/components/SelectorCard/SelectorCard.tsx +++ b/frontend/app/components/Session_/PageInsightsPanel/components/SelectorCard/SelectorCard.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react' -import stl from './SelectorCard.css' +import stl from './SelectorCard.module.css' import cn from 'classnames'; import type { MarkedTarget } from 'Player/MessageDistributor/StatedScreen/StatedScreen'; import { activeTarget } from 'Player'; diff --git a/frontend/app/components/Session_/PageInsightsPanel/components/SelectorsList/SelectorsList.tsx b/frontend/app/components/Session_/PageInsightsPanel/components/SelectorsList/SelectorsList.tsx index 8f19bfad8..aceefb3b7 100644 --- a/frontend/app/components/Session_/PageInsightsPanel/components/SelectorsList/SelectorsList.tsx +++ b/frontend/app/components/Session_/PageInsightsPanel/components/SelectorsList/SelectorsList.tsx @@ -3,7 +3,7 @@ import { NoContent } from 'UI' import { connectPlayer } from 'Player/store'; import SelectorCard from '../SelectorCard/SelectorCard'; import type { MarkedTarget } from 'Player/MessageDistributor/StatedScreen/StatedScreen'; -import stl from './selectorList.css' +import stl from './selectorList.module.css' interface Props { targets: Array, diff --git a/frontend/app/components/Session_/PageInsightsPanel/components/SelectorsList/selectorList.css b/frontend/app/components/Session_/PageInsightsPanel/components/SelectorsList/selectorList.module.css similarity index 100% rename from frontend/app/components/Session_/PageInsightsPanel/components/SelectorsList/selectorList.css rename to frontend/app/components/Session_/PageInsightsPanel/components/SelectorsList/selectorList.module.css diff --git a/frontend/app/components/Session_/Performance/Performance.js b/frontend/app/components/Session_/Performance/Performance.tsx similarity index 99% rename from frontend/app/components/Session_/Performance/Performance.js rename to frontend/app/components/Session_/Performance/Performance.tsx index 3310970b3..3b9cdc70c 100644 --- a/frontend/app/components/Session_/Performance/Performance.js +++ b/frontend/app/components/Session_/Performance/Performance.tsx @@ -1,3 +1,4 @@ +import React from 'react'; import { connect } from 'react-redux'; import { Controls as PlayerControls, connectPlayer } from 'Player'; import { @@ -17,7 +18,7 @@ import { Checkbox } from 'UI'; import { durationFromMsFormatted } from 'App/date'; import { formatBytes } from 'App/utils'; -import stl from './performance.css'; +import stl from './performance.module.css'; import BottomBlock from '../BottomBlock'; import InfoLine from '../BottomBlock/InfoLine'; diff --git a/frontend/app/components/Session_/Performance/performance.css b/frontend/app/components/Session_/Performance/performance.module.css similarity index 100% rename from frontend/app/components/Session_/Performance/performance.css rename to frontend/app/components/Session_/Performance/performance.module.css diff --git a/frontend/app/components/Session_/Player/Controls/Circle.tsx b/frontend/app/components/Session_/Player/Controls/Circle.tsx index 76740c73e..274b38f8a 100644 --- a/frontend/app/components/Session_/Player/Controls/Circle.tsx +++ b/frontend/app/components/Session_/Player/Controls/Circle.tsx @@ -1,5 +1,5 @@ import React, { memo, FC } from 'react'; -import styles from './timeline.css'; +import styles from './timeline.module.css'; interface Props { preview?: boolean; diff --git a/frontend/app/components/Session_/Player/Controls/ControlButton.js b/frontend/app/components/Session_/Player/Controls/ControlButton.js index 752c68631..6f31f982c 100644 --- a/frontend/app/components/Session_/Player/Controls/ControlButton.js +++ b/frontend/app/components/Session_/Player/Controls/ControlButton.js @@ -1,6 +1,7 @@ +import React from 'react'; import cn from 'classnames'; import { Icon } from 'UI'; -import stl from './controlButton.css'; +import stl from './controlButton.module.css'; const ControlButton = ({ label, icon, disabled=false, onClick, count = 0, hasErrors=false, active=false }) => ( +
    - +
    diff --git a/frontend/app/components/Session_/Player/Overlay/ElementsMarker/Marker.css b/frontend/app/components/Session_/Player/Overlay/ElementsMarker/Marker.module.css similarity index 100% rename from frontend/app/components/Session_/Player/Overlay/ElementsMarker/Marker.css rename to frontend/app/components/Session_/Player/Overlay/ElementsMarker/Marker.module.css diff --git a/frontend/app/components/Session_/Player/Overlay/ElementsMarker/Marker.tsx b/frontend/app/components/Session_/Player/Overlay/ElementsMarker/Marker.tsx index 8149a9278..f91f1d963 100644 --- a/frontend/app/components/Session_/Player/Overlay/ElementsMarker/Marker.tsx +++ b/frontend/app/components/Session_/Player/Overlay/ElementsMarker/Marker.tsx @@ -1,10 +1,10 @@ //@ts-nocheck import React from 'react'; import type { MarkedTarget } from 'Player/MessageDistributor/StatedScreen/StatedScreen'; -import { Tooltip } from 'react-tippy'; import cn from 'classnames'; -import stl from './Marker.css'; +import stl from './Marker.module.css'; import { activeTarget } from 'Player'; +import { Popup } from 'UI'; interface Props { target: MarkedTarget; @@ -21,18 +21,17 @@ export default function Marker({ target, active }: Props) { return (
    activeTarget(target.index)}>
    {target.index + 1}
    - {target.count} Clicks
    - )} - trigger="mouseenter" + )} >
    - +
    ) } \ No newline at end of file diff --git a/frontend/app/components/Session_/Player/Overlay/LiveStatusText.css b/frontend/app/components/Session_/Player/Overlay/LiveStatusText.module.css similarity index 100% rename from frontend/app/components/Session_/Player/Overlay/LiveStatusText.css rename to frontend/app/components/Session_/Player/Overlay/LiveStatusText.module.css diff --git a/frontend/app/components/Session_/Player/Overlay/LiveStatusText.tsx b/frontend/app/components/Session_/Player/Overlay/LiveStatusText.tsx index 3f24901de..10a079ff3 100644 --- a/frontend/app/components/Session_/Player/Overlay/LiveStatusText.tsx +++ b/frontend/app/components/Session_/Player/Overlay/LiveStatusText.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import stl from './LiveStatusText.css'; -import ovStl from './overlay.css'; +import stl from './LiveStatusText.module.css'; +import ovStl from './overlay.module.css'; import { ConnectionStatus } from 'Player/MessageDistributor/managers/AssistManager'; import { Loader } from 'UI'; diff --git a/frontend/app/components/Session_/Player/Overlay/Loader.tsx b/frontend/app/components/Session_/Player/Overlay/Loader.tsx index 4fe414ef0..49c166a60 100644 --- a/frontend/app/components/Session_/Player/Overlay/Loader.tsx +++ b/frontend/app/components/Session_/Player/Overlay/Loader.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { Loader } from 'UI'; -import ovStl from './overlay.css'; +import ovStl from './overlay.module.css'; export default function OverlayLoader() { return
    diff --git a/frontend/app/components/Session_/Player/Overlay/PlayIconLayer.css b/frontend/app/components/Session_/Player/Overlay/PlayIconLayer.module.css similarity index 100% rename from frontend/app/components/Session_/Player/Overlay/PlayIconLayer.css rename to frontend/app/components/Session_/Player/Overlay/PlayIconLayer.module.css diff --git a/frontend/app/components/Session_/Player/Overlay/PlayIconLayer.tsx b/frontend/app/components/Session_/Player/Overlay/PlayIconLayer.tsx index a2a1b9e27..95549ddce 100644 --- a/frontend/app/components/Session_/Player/Overlay/PlayIconLayer.tsx +++ b/frontend/app/components/Session_/Player/Overlay/PlayIconLayer.tsx @@ -2,8 +2,8 @@ import React, { useState, useCallback, useEffect } from 'react'; import cn from 'classnames'; import { Icon } from 'UI'; -import cls from './PlayIconLayer.css'; -import clsOv from './overlay.css'; +import cls from './PlayIconLayer.module.css'; +import clsOv from './overlay.module.css'; interface Props { togglePlay: () => void, diff --git a/frontend/app/components/Session_/Player/Overlay/overlay.css b/frontend/app/components/Session_/Player/Overlay/overlay.module.css similarity index 100% rename from frontend/app/components/Session_/Player/Overlay/overlay.css rename to frontend/app/components/Session_/Player/Overlay/overlay.module.css diff --git a/frontend/app/components/Session_/Player/Player.js b/frontend/app/components/Session_/Player/Player.js index 7391c8992..8d2665645 100644 --- a/frontend/app/components/Session_/Player/Player.js +++ b/frontend/app/components/Session_/Player/Player.js @@ -1,3 +1,4 @@ +import React from 'react'; import { connect } from 'react-redux'; import { findDOMNode } from 'react-dom'; import cn from 'classnames'; @@ -7,7 +8,7 @@ import { fullscreenOff } from 'Duck/components/player'; import { attach as attachPlayer, Controls as PlayerControls, connectPlayer } from 'Player'; import Controls from './Controls'; import Overlay from './Overlay'; -import stl from './player.css'; +import stl from './player.module.css'; import EventsToggleButton from '../../Session/EventsToggleButton'; import { updateLastPlayedSession } from 'Duck/sessions'; diff --git a/frontend/app/components/Session_/Player/player.css b/frontend/app/components/Session_/Player/player.module.css similarity index 100% rename from frontend/app/components/Session_/Player/player.css rename to frontend/app/components/Session_/Player/player.module.css diff --git a/frontend/app/components/Session_/PlayerBlock.js b/frontend/app/components/Session_/PlayerBlock.js index ab95c11fd..3be8b50f2 100644 --- a/frontend/app/components/Session_/PlayerBlock.js +++ b/frontend/app/components/Session_/PlayerBlock.js @@ -1,3 +1,4 @@ +import React from 'react'; import cn from "classnames"; import { connect } from 'react-redux'; import { scale as scalePlayerScreen } from 'Player'; @@ -27,7 +28,7 @@ import Fetch from './Fetch'; import Exceptions from './Exceptions/Exceptions'; import LongTasks from './LongTasks'; import Inspector from './Inspector'; -import styles from './playerBlock.css'; +import styles from './playerBlock.module.css'; @connect(state => ({ diff --git a/frontend/app/components/Session_/PlayerBlockHeader.js b/frontend/app/components/Session_/PlayerBlockHeader.js index 4717c6329..1f493deac 100644 --- a/frontend/app/components/Session_/PlayerBlockHeader.js +++ b/frontend/app/components/Session_/PlayerBlockHeader.js @@ -1,20 +1,20 @@ +import React from 'react'; import { connect } from 'react-redux'; import { withRouter } from 'react-router-dom'; import { browserIcon, osIcon, deviceTypeIcon } from 'App/iconNames'; import { formatTimeOrDate } from 'App/date'; import { sessions as sessionsRoute, assist as assistRoute, liveSession as liveSessionRoute, withSiteId } from 'App/routes'; -import { Icon, CountryFlag, IconButton, BackLink, Popup, Link } from 'UI'; +import { Button, Icon, CountryFlag, IconButton, BackLink, Popup, Link } from 'UI'; import { toggleFavorite, setSessionPath } from 'Duck/sessions'; import cn from 'classnames'; import { connectPlayer } from 'Player'; // import HeaderInfo from './HeaderInfo'; import SharePopup from '../shared/SharePopup/SharePopup'; -import { fetchList as fetchListIntegration } from 'Duck/integrations/actions'; import { countries } from 'App/constants'; import SessionMetaList from 'Shared/SessionItem/SessionMetaList'; import Bookmark from 'Shared/Bookmark' -import stl from './playerBlockHeader.css'; +import stl from './playerBlockHeader.module.css'; import Issues from './Issues/Issues'; import Autoplay from './Autoplay'; import AssistActions from '../Assist/components/AssistActions'; @@ -38,8 +38,6 @@ const ASSIST_ROUTE = assistRoute(); sessionPath: state.getIn([ 'sessions', 'sessionPath' ]), loading: state.getIn([ 'sessions', 'toggleFavoriteRequest', 'loading' ]), disabled: state.getIn([ 'components', 'targetDefiner', 'inspectorMode' ]) || props.loading, - jiraConfig: state.getIn([ 'issues', 'list' ]).first(), - issuesFetched: state.getIn([ 'issues', 'issuesFetched' ]), local: state.getIn(['sessions', 'timezone']), funnelRef: state.getIn(['funnels', 'navRef']), siteId: state.getIn([ 'site', 'siteId' ]), @@ -47,15 +45,10 @@ const ASSIST_ROUTE = assistRoute(); closedLive: !!state.getIn([ 'sessions', 'errors' ]) || (isAssist && !session.live), } }, { - toggleFavorite, fetchListIntegration, setSessionPath + toggleFavorite, setSessionPath }) @withRouter export default class PlayerBlockHeader extends React.PureComponent { - componentDidMount() { - if (!this.props.issuesFetched) - this.props.fetchListIntegration('issues') - } - getDimension = (width, height) => { return width && height ? (
    @@ -142,9 +135,9 @@ export default class PlayerBlockHeader extends React.PureComponent { )} - )} + theme="tippy-light" + multiple={false} + unmountHTMLWhenHide={true} content={(
    } label={countries[userCountry]} value={ formatTimeOrDate(startedAt) } /> @@ -153,10 +146,11 @@ export default class PlayerBlockHeader extends React.PureComponent {
    )} - on="click" - position="top center" - hideOnScroll - /> + // trigger="click" + hideOnClick={true} + > + +
    { isAssist && } { !isAssist && ( @@ -164,34 +158,26 @@ export default class PlayerBlockHeader extends React.PureComponent {
    - {/* */}
    } /> )} - { !isAssist && jiraConfig && jiraConfig.token && } + {/* { !isAssist && jiraConfig && jiraConfig.token && } */} + { }
    diff --git a/frontend/app/components/Session_/Profiler/ProfileInfo.js b/frontend/app/components/Session_/Profiler/ProfileInfo.js index c772f2dae..b156aff57 100644 --- a/frontend/app/components/Session_/Profiler/ProfileInfo.js +++ b/frontend/app/components/Session_/Profiler/ProfileInfo.js @@ -1,6 +1,4 @@ -import { JSONTree } from 'UI' -import cn from 'classnames'; - +import React from 'react'; export default class ProfileInfo extends React.PureComponent { render() { const { @@ -11,14 +9,6 @@ export default class ProfileInfo extends React.PureComponent { } } = this.props; - // let jsonPayload = undefined; - // let jsonResponse = undefined; - // try { - // jsonPayload = JSON.parse(payload); - // } catch (e) {} - // try { - // jsonResponse = JSON.parse(response); - // } catch (e) {} return (
    {"Arguments"}
    diff --git a/frontend/app/components/Session_/Profiler/Profiler.js b/frontend/app/components/Session_/Profiler/Profiler.js index 4609a1427..83b13c89c 100644 --- a/frontend/app/components/Session_/Profiler/Profiler.js +++ b/frontend/app/components/Session_/Profiler/Profiler.js @@ -1,5 +1,6 @@ +import React from 'react'; import { connectPlayer } from 'Player'; -import { Icon, SlideModal, TextEllipsis, Input } from 'UI'; +import { SlideModal, TextEllipsis, Input } from 'UI'; import { getRE } from 'App/utils'; import ProfileInfo from './ProfileInfo'; @@ -17,7 +18,7 @@ export default class Profiler extends React.PureComponent { filter: '', modalProfile: null, } - onFilterChange = (e, { value }) => this.setState({ filter: value }) + onFilterChange = ({ target: { value } }) => this.setState({ filter: value }) onProfileClick = resource => { this.setState({ modalProfile: resource }); @@ -43,10 +44,9 @@ export default class Profiler extends React.PureComponent {

    Profiler

    diff --git a/frontend/app/components/Session_/StackEvents/StackEvents.js b/frontend/app/components/Session_/StackEvents/StackEvents.js index 79c1e9c72..9783db8b4 100644 --- a/frontend/app/components/Session_/StackEvents/StackEvents.js +++ b/frontend/app/components/Session_/StackEvents/StackEvents.js @@ -1,3 +1,4 @@ +import React from 'react'; import { connect } from 'react-redux'; import { connectPlayer, jump } from 'Player'; import { NoContent, Tabs } from 'UI'; diff --git a/frontend/app/components/Session_/StackEvents/UserEvent/JsonViewer.js b/frontend/app/components/Session_/StackEvents/UserEvent/JsonViewer.js index 9815a660f..ec4a5288d 100644 --- a/frontend/app/components/Session_/StackEvents/UserEvent/JsonViewer.js +++ b/frontend/app/components/Session_/StackEvents/UserEvent/JsonViewer.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Icon, JSONTree } from 'UI'; export default class JsonViewer extends React.PureComponent { diff --git a/frontend/app/components/Session_/StackEvents/UserEvent/Sentry.js b/frontend/app/components/Session_/StackEvents/UserEvent/Sentry.js index 859d1ce60..873b9a78f 100644 --- a/frontend/app/components/Session_/StackEvents/UserEvent/Sentry.js +++ b/frontend/app/components/Session_/StackEvents/UserEvent/Sentry.js @@ -1,9 +1,10 @@ +import React from 'react'; import { getIn, get } from 'immutable'; import cn from 'classnames'; import { withRequest } from 'HOCs'; -import { Loader, Modal, Icon, JSONTree } from 'UI'; +import { Loader, Icon, JSONTree } from 'UI'; import { Accordion } from 'semantic-ui-react' -import stl from './sentry.css'; +import stl from './sentry.module.css'; @withRequest({ endpoint: props => `/integrations/sentry/events/${ props.event.id }`, diff --git a/frontend/app/components/Session_/StackEvents/UserEvent/UserEvent.js b/frontend/app/components/Session_/StackEvents/UserEvent/UserEvent.js index 9c0e66816..a40da51f8 100644 --- a/frontend/app/components/Session_/StackEvents/UserEvent/UserEvent.js +++ b/frontend/app/components/Session_/StackEvents/UserEvent/UserEvent.js @@ -1,10 +1,11 @@ +import React from 'react'; import cn from 'classnames'; import { OPENREPLAY, SENTRY, DATADOG, STACKDRIVER } from 'Types/session/stackEvent'; -import { Modal, Icon, SlideModal, IconButton } from 'UI'; +import { Icon, SlideModal, IconButton } from 'UI'; import withToggle from 'HOCs/withToggle'; import Sentry from './Sentry'; import JsonViewer from './JsonViewer'; -import stl from './userEvent.css'; +import stl from './userEvent.module.css'; // const modalSources = [ SENTRY, DATADOG ]; diff --git a/frontend/app/components/Session_/StackEvents/UserEvent/sentry.css b/frontend/app/components/Session_/StackEvents/UserEvent/sentry.module.css similarity index 100% rename from frontend/app/components/Session_/StackEvents/UserEvent/sentry.css rename to frontend/app/components/Session_/StackEvents/UserEvent/sentry.module.css diff --git a/frontend/app/components/Session_/StackEvents/UserEvent/userEvent.css b/frontend/app/components/Session_/StackEvents/UserEvent/userEvent.module.css similarity index 100% rename from frontend/app/components/Session_/StackEvents/UserEvent/userEvent.css rename to frontend/app/components/Session_/StackEvents/UserEvent/userEvent.module.css diff --git a/frontend/app/components/Session_/StackEvents/stackEvents.css b/frontend/app/components/Session_/StackEvents/stackEvents.module.css similarity index 100% rename from frontend/app/components/Session_/StackEvents/stackEvents.css rename to frontend/app/components/Session_/StackEvents/stackEvents.module.css diff --git a/frontend/app/components/Session_/Storage/Storage.js b/frontend/app/components/Session_/Storage/Storage.js index 27162b5da..6e51bc36a 100644 --- a/frontend/app/components/Session_/Storage/Storage.js +++ b/frontend/app/components/Session_/Storage/Storage.js @@ -1,5 +1,4 @@ -//import cn from 'classnames'; -//import withEnumToggle from 'HOCs/withEnumToggle'; +import React from 'react'; import { connect } from 'react-redux'; import { hideHint } from 'Duck/components/player'; import { @@ -9,14 +8,14 @@ import { selectStorageListNow, selectStorageList, } from 'Player/store'; -import { JSONTree, IconButton, Icon, Popup, Tabs, NoContent } from 'UI'; +import { JSONTree, NoContent } from 'UI'; import { formatMs } from 'App/date'; import { jump } from 'Player'; import Autoscroll from '../Autoscroll'; import BottomBlock from '../BottomBlock/index'; -import stl from './storage.css'; +import stl from './storage.module.css'; // const STATE = 'STATE'; // const DIFF = 'DIFF'; diff --git a/frontend/app/components/Session_/Storage/storage.css b/frontend/app/components/Session_/Storage/storage.module.css similarity index 100% rename from frontend/app/components/Session_/Storage/storage.css rename to frontend/app/components/Session_/Storage/storage.module.css diff --git a/frontend/app/components/Session_/TimeTable/BarRow.js b/frontend/app/components/Session_/TimeTable/BarRow.js index 278cb9006..fcadc8961 100644 --- a/frontend/app/components/Session_/TimeTable/BarRow.js +++ b/frontend/app/components/Session_/TimeTable/BarRow.js @@ -1,7 +1,8 @@ +import React from 'react'; import { Popup } from 'UI'; import { percentOf } from 'App/utils'; -import styles from './barRow.css' -import tableStyles from './timeTable.css'; +import styles from './barRow.module.css' +import tableStyles from './timeTable.module.css'; const formatTime = time => time < 1000 ? `${ time.toFixed(2) }ms` : `${ time / 1000 }s`; @@ -38,7 +39,7 @@ const BarRow = ({ resource: { time, ttfb = 0, duration, key }, popup=false, time
    { ttfb != null && @@ -71,9 +72,9 @@ const BarRow = ({ resource: { time, ttfb = 0, duration, key }, popup=false, time
    } - size="mini" - position="top center" - /> + > + {trigger} +
    ); } diff --git a/frontend/app/components/Session_/TimeTable/TimeTable.js b/frontend/app/components/Session_/TimeTable/TimeTable.tsx similarity index 94% rename from frontend/app/components/Session_/TimeTable/TimeTable.js rename to frontend/app/components/Session_/TimeTable/TimeTable.tsx index e316dae56..413af3f61 100644 --- a/frontend/app/components/Session_/TimeTable/TimeTable.js +++ b/frontend/app/components/Session_/TimeTable/TimeTable.tsx @@ -1,23 +1,22 @@ -// @flow +import React from 'react'; import { List, AutoSizer } from "react-virtualized"; - import cn from 'classnames'; import { NoContent, IconButton } from 'UI'; -import { percentOf } from 'App/utils'; +import { percentOf } from 'App/utils'; import { formatMs } from 'App/date'; import BarRow from './BarRow'; -import stl from './timeTable.css'; +import stl from './timeTable.module.css'; -import autoscrollStl from '../autoscroll.css'; //aaa +import autoscrollStl from '../autoscroll.module.css'; //aaa type Timed = { - +time: number, + time: number, } type Durationed = { - +duration: number, + duration: number, } type CanBeRed = { @@ -30,18 +29,24 @@ type Row = Timed & Durationed & CanBeRed type Line = { color: string, // Maybe use typescript? hint?: string, - onClick?: Line => any, + onClick?: any, } & Timed type Column = { label: string, width: number, - referenceLines: ?Array, + referenceLines?: Array, style?: Object, } & RenderOrKey -type RenderOrKey = { // Disjoint? - render: Row => React.Node +// type RenderOrKey = { // Disjoint? +// render: Row => React.Node +// } | { +// dataKey: string, +// } +type RenderOrKey = { + render?: (row: Row) => React.ReactNode, + key?: string, } | { dataKey: string, } @@ -50,7 +55,6 @@ type RenderOrKey = { // Disjoint? type Props = { className?: string, rows: Array, - children: Array } @@ -123,7 +127,7 @@ export default class TimeTable extends React.PureComponent { // } // } - componentDidUpdate(prevProps, prevState) { + componentDidUpdate(prevProps: any, prevState: any) { // if (prevProps.rows.length !== this.props.rows.length && // this.autoScroll && // this.scroller.current != null) { @@ -150,7 +154,7 @@ export default class TimeTable extends React.PureComponent { } } - renderRow = ({ index, key, style: rowStyle }) => { + renderRow = ({ index, key, style: rowStyle }: any) => { const { activeIndex } = this.props; const { children: columns, diff --git a/frontend/app/components/Session_/TimeTable/barRow.css b/frontend/app/components/Session_/TimeTable/barRow.module.css similarity index 100% rename from frontend/app/components/Session_/TimeTable/barRow.css rename to frontend/app/components/Session_/TimeTable/barRow.module.css diff --git a/frontend/app/components/Session_/TimeTable/timeTable.css b/frontend/app/components/Session_/TimeTable/timeTable.module.css similarity index 100% rename from frontend/app/components/Session_/TimeTable/timeTable.css rename to frontend/app/components/Session_/TimeTable/timeTable.module.css diff --git a/frontend/app/components/Session_/autoscroll.css b/frontend/app/components/Session_/autoscroll.module.css similarity index 100% rename from frontend/app/components/Session_/autoscroll.css rename to frontend/app/components/Session_/autoscroll.module.css diff --git a/frontend/app/components/Session_/headerInfo.css b/frontend/app/components/Session_/headerInfo.module.css similarity index 100% rename from frontend/app/components/Session_/headerInfo.css rename to frontend/app/components/Session_/headerInfo.module.css diff --git a/frontend/app/components/Session_/playerBlock.css b/frontend/app/components/Session_/playerBlock.module.css similarity index 100% rename from frontend/app/components/Session_/playerBlock.css rename to frontend/app/components/Session_/playerBlock.module.css diff --git a/frontend/app/components/Session_/playerBlockHeader.css b/frontend/app/components/Session_/playerBlockHeader.module.css similarity index 100% rename from frontend/app/components/Session_/playerBlockHeader.css rename to frontend/app/components/Session_/playerBlockHeader.module.css diff --git a/frontend/app/components/Session_/session.css b/frontend/app/components/Session_/session.module.css similarity index 100% rename from frontend/app/components/Session_/session.css rename to frontend/app/components/Session_/session.module.css diff --git a/frontend/app/components/Signup/Signup.js b/frontend/app/components/Signup/Signup.js index 0c393dbc0..516d993c2 100644 --- a/frontend/app/components/Signup/Signup.js +++ b/frontend/app/components/Signup/Signup.js @@ -1,7 +1,8 @@ +import React from 'react'; import withPageTitle from 'HOCs/withPageTitle'; import { Icon } from 'UI'; -import stl from './signup.css'; +import stl from './signup.module.css'; import cn from 'classnames'; import SignupForm from './SignupForm'; @@ -21,7 +22,7 @@ export default class Signup extends React.Component {
    - +
    diff --git a/frontend/app/components/Signup/SignupForm/SignupForm.js b/frontend/app/components/Signup/SignupForm/SignupForm.js index c12c3dcc8..0e017d748 100644 --- a/frontend/app/components/Signup/SignupForm/SignupForm.js +++ b/frontend/app/components/Signup/SignupForm/SignupForm.js @@ -1,8 +1,8 @@ import React from 'react' -import { Icon, Button, Link, Dropdown, CircularLoader } from 'UI' +import { Form, Input, Icon, Button, Link, Dropdown, CircularLoader } from 'UI' import { login } from 'App/routes' import ReCAPTCHA from 'react-google-recaptcha' -import stl from './signup.css' +import stl from './signup.module.css' import { signup } from 'Duck/user'; import { connect } from 'react-redux' @@ -27,6 +27,7 @@ export default class SignupForm extends React.Component { projectName: '', organizationName: '', reload: false, + CAPTCHA_ENABLED: window.env.CAPTCHA_ENABLED === 'true', }; static getDerivedStateFromProps(props, state) { @@ -51,103 +52,95 @@ export default class SignupForm extends React.Component { onSubmit = (e) => { e.preventDefault(); - if (window.ENV.CAPTCHA_ENABLED && recaptchaRef.current) { - recaptchaRef.current.execute(); - } else if (!window.ENV.CAPTCHA_ENABLED) { + const { CAPTCHA_ENABLED } = this.state; + if (CAPTCHA_ENABLED && recaptchaRef.current) { + recaptchaRef.current.execute(); + } else if (!CAPTCHA_ENABLED) { this.handleSubmit(); } } render() { const { loading, errors, tenants } = this.props; + const { CAPTCHA_ENABLED } = this.state; return ( -
    +

    Get Started

    Already having an account? Sign in
    <> - { window.ENV.CAPTCHA_ENABLED && ( + { CAPTCHA_ENABLED && ( this.handleSubmit(token) } /> )}
    { tenants.length > 0 && ( -
    + -
    - -
    -
    + + )} -
    + -
    - -
    -
    -
    + + + -
    - -
    -
    -
    + + + -
    - -
    -
    + + -
    + -
    - -
    -
    + +
    @@ -166,14 +159,11 @@ export default class SignupForm extends React.Component {
    }
    -
    - + ) } } \ No newline at end of file diff --git a/frontend/app/components/Signup/SignupForm/signup.css b/frontend/app/components/Signup/SignupForm/signup.module.css similarity index 99% rename from frontend/app/components/Signup/SignupForm/signup.css rename to frontend/app/components/Signup/SignupForm/signup.module.css index c8d6a36e0..29ee8f0ea 100644 --- a/frontend/app/components/Signup/SignupForm/signup.css +++ b/frontend/app/components/Signup/SignupForm/signup.module.css @@ -1,4 +1,4 @@ -@import "icons.css"; +@import 'icons.css'; .form { /* position: absolute; */ /* top: 50%; */ diff --git a/frontend/app/components/Signup/signup.css b/frontend/app/components/Signup/signup.module.css similarity index 99% rename from frontend/app/components/Signup/signup.css rename to frontend/app/components/Signup/signup.module.css index a2020a8e8..8fa8a8d87 100644 --- a/frontend/app/components/Signup/signup.css +++ b/frontend/app/components/Signup/signup.module.css @@ -1,4 +1,4 @@ -@import "icons.css"; +@import 'icons.css'; .form { /* position: absolute; */ /* top: 50%; */ diff --git a/frontend/app/components/UpdatePassword/UpdatePassword.js b/frontend/app/components/UpdatePassword/UpdatePassword.js index 57385b684..cf30e2cc4 100644 --- a/frontend/app/components/UpdatePassword/UpdatePassword.js +++ b/frontend/app/components/UpdatePassword/UpdatePassword.js @@ -1,8 +1,9 @@ +import React from 'react'; import { connect } from 'react-redux'; import withPageTitle from 'HOCs/withPageTitle'; import { Loader, Button, Message } from 'UI'; import { updatePassword } from 'Duck/user'; -import styles from './updatePassword.css'; +import styles from './updatePassword.module.css'; const ERROR_DOESNT_MATCH = "Passwords doesn't match"; const MIN_LENGTH = 8; @@ -101,7 +102,7 @@ export default class UpdatePassword extends React.Component {
    }
    - +
    diff --git a/frontend/app/components/UpdatePassword/updatePassword.css b/frontend/app/components/UpdatePassword/updatePassword.module.css similarity index 98% rename from frontend/app/components/UpdatePassword/updatePassword.css rename to frontend/app/components/UpdatePassword/updatePassword.module.css index 8f79d3d79..386a99e19 100644 --- a/frontend/app/components/UpdatePassword/updatePassword.css +++ b/frontend/app/components/UpdatePassword/updatePassword.module.css @@ -1,4 +1,4 @@ -@import "icons.css"; +@import 'icons.css'; .form { position: absolute; diff --git a/frontend/app/components/hocs/withCacheState.js b/frontend/app/components/hocs/withCacheState.js index f921aaf7e..0bfe7feb1 100644 --- a/frontend/app/components/hocs/withCacheState.js +++ b/frontend/app/components/hocs/withCacheState.js @@ -1,3 +1,4 @@ +import React from 'react'; export default (propNames) => BaseComponent => class extends React.PureComponent { state = { obj: this.getObjFromProps(), diff --git a/frontend/app/components/hocs/withEnumToggle.js b/frontend/app/components/hocs/withEnumToggle.js index 746cf7585..2137335fc 100644 --- a/frontend/app/components/hocs/withEnumToggle.js +++ b/frontend/app/components/hocs/withEnumToggle.js @@ -1,3 +1,4 @@ +import React from 'react'; const withEnumToggle = (stateName = 'active', handlerName = 'setActive', initial) => BaseComponent => class extends React.Component { state = { diff --git a/frontend/app/components/hocs/withLocationHandlers.js b/frontend/app/components/hocs/withLocationHandlers.js index 4fbf15360..a202f178e 100644 --- a/frontend/app/components/hocs/withLocationHandlers.js +++ b/frontend/app/components/hocs/withLocationHandlers.js @@ -1,3 +1,4 @@ +import React from 'react'; import { withRouter } from 'react-router-dom'; import { removeQueryParams, diff --git a/frontend/app/components/hocs/withOverlay.js b/frontend/app/components/hocs/withOverlay.js index fe348e861..7108ae9a9 100644 --- a/frontend/app/components/hocs/withOverlay.js +++ b/frontend/app/components/hocs/withOverlay.js @@ -1,3 +1,4 @@ +import React from 'react'; import { findDOMNode } from 'react-dom'; let overlayedCount = 0; diff --git a/frontend/app/components/hocs/withPageTitle.js b/frontend/app/components/hocs/withPageTitle.js index 965e3c139..3edbe6b51 100644 --- a/frontend/app/components/hocs/withPageTitle.js +++ b/frontend/app/components/hocs/withPageTitle.js @@ -1,3 +1,4 @@ +import React from 'react'; export default title => BaseComponent => class extends React.Component { componentDidMount() { document.title = title diff --git a/frontend/app/components/hocs/withPermissions.js b/frontend/app/components/hocs/withPermissions.js index e2f4f0f39..fc7191ac3 100644 --- a/frontend/app/components/hocs/withPermissions.js +++ b/frontend/app/components/hocs/withPermissions.js @@ -1,3 +1,4 @@ +import React from 'react'; import { connect } from 'react-redux'; import { NoPermission, NoSessionPermission } from 'UI'; diff --git a/frontend/app/components/hocs/withReport.tsx b/frontend/app/components/hocs/withReport.tsx index be95952be..8a68aae65 100644 --- a/frontend/app/components/hocs/withReport.tsx +++ b/frontend/app/components/hocs/withReport.tsx @@ -27,7 +27,7 @@ export default function withReport

    ( doc.setFontSize(8); doc.setTextColor(136,136,136); doc.text('Page ' + String(i) + ' of ' + String(pageCount), 200,290,null,null,"right"); - doc.addImage('/logo-open-replay-grey.png', 'png', 10, 288, 20, 0); + doc.addImage('/assets/img/logo-open-replay-grey.png', 'png', 10, 288, 20, 0); } } @@ -125,7 +125,7 @@ export default function withReport

    (

    - +
    REPORT
    diff --git a/frontend/app/components/hocs/withRequest.js b/frontend/app/components/hocs/withRequest.js index 47d20e7fa..80dfaccf3 100644 --- a/frontend/app/components/hocs/withRequest.js +++ b/frontend/app/components/hocs/withRequest.js @@ -1,3 +1,4 @@ +import React from 'react'; import APIClient from 'App/api_client'; export default ({ diff --git a/frontend/app/components/hocs/withSiteIdRouter.js b/frontend/app/components/hocs/withSiteIdRouter.js index 806d3904e..4dbaf623c 100644 --- a/frontend/app/components/hocs/withSiteIdRouter.js +++ b/frontend/app/components/hocs/withSiteIdRouter.js @@ -1,3 +1,4 @@ +import React from 'react'; import { withRouter } from 'react-router-dom'; import { connect } from 'react-redux'; import { withSiteId } from 'App/routes'; diff --git a/frontend/app/components/hocs/withSiteIdUpdater.js b/frontend/app/components/hocs/withSiteIdUpdater.js index 9319474ca..3abb48c09 100644 --- a/frontend/app/components/hocs/withSiteIdUpdater.js +++ b/frontend/app/components/hocs/withSiteIdUpdater.js @@ -1,5 +1,5 @@ +import React from 'react'; import { connect } from 'react-redux'; -import { withSiteId } from 'App/routes'; import { setSiteId } from 'Duck/site'; export default BaseComponent => diff --git a/frontend/app/components/hocs/withToggle.js b/frontend/app/components/hocs/withToggle.js index 441cd6078..a23dacf8a 100644 --- a/frontend/app/components/hocs/withToggle.js +++ b/frontend/app/components/hocs/withToggle.js @@ -1,3 +1,4 @@ +import React from 'react'; const withToggle = (stateName = 'open', handlerName = 'switchOpen', initial = false) => BaseComponent => class extends React.Component { state = { diff --git a/frontend/app/components/shared/AddWidgets.js b/frontend/app/components/shared/AddWidgets.js deleted file mode 100644 index 41b5e0b7e..000000000 --- a/frontend/app/components/shared/AddWidgets.js +++ /dev/null @@ -1,83 +0,0 @@ -import { connect } from 'react-redux'; -import cn from 'classnames'; -import withToggle from 'HOCs/withToggle'; -import { IconButton, Popup } from 'UI'; -import { updateAppearance } from 'Duck/user'; -import stl from './addWidgets.css'; -import OutsideClickDetectingDiv from 'Shared/OutsideClickDetectingDiv'; -import { updateActiveState } from 'Duck/customMetrics'; - -const CUSTOM_METRICS = 'custom_metrics'; - -@connect(state => ({ - appearance: state.getIn([ 'user', 'account', 'appearance' ]), - customMetrics: state.getIn(['customMetrics', 'list']), -}), { - updateAppearance, updateActiveState, -}) -@withToggle() -export default class AddWidgets extends React.PureComponent { - makeAddHandler = widgetKey => () => { - if (this.props.type === CUSTOM_METRICS) { - this.props.updateActiveState(widgetKey, true); - } else { - const { appearance } = this.props; - const newAppearance = appearance.setIn([ 'dashboard', widgetKey ], true); - this.props.updateAppearance(newAppearance) - } - - this.props.switchOpen(false); - } - - getCustomMetricWidgets = () => { - return this.props.customMetrics.filter(i => !i.active).map(item => ({ - type: CUSTOM_METRICS, - key: item.metricId, - name: item.name, - })).toJS(); - } - - render() { - const { disabled, widgets, type } = this.props; - const filteredWidgets = type === CUSTOM_METRICS ? this.getCustomMetricWidgets() : widgets; - - return ( -
    - - } - content={ `Add a metric to this section.` } - size="tiny" - inverted - position="top center" - /> - this.props.switchOpen(false)}> - {this.props.open && -
    - {filteredWidgets.map(w => ( -
    - {w.name} -
    - ))} -
    - } -
    -
    - ); - } -} \ No newline at end of file diff --git a/frontend/app/components/shared/AlertTriggersModal/AlertTriggersModal.tsx b/frontend/app/components/shared/AlertTriggersModal/AlertTriggersModal.tsx new file mode 100644 index 000000000..5547ae750 --- /dev/null +++ b/frontend/app/components/shared/AlertTriggersModal/AlertTriggersModal.tsx @@ -0,0 +1,90 @@ +import React from 'react'; +import { Button, NoContent } from 'UI'; +import { connect } from 'react-redux'; +import { fetchList, setViewed, clearAll } from 'Duck/notifications'; +import { setLastRead } from 'Duck/announcements'; +import cn from 'classnames'; +import AnimatedSVG, { ICONS } from 'Shared/AnimatedSVG/AnimatedSVG'; +import ListItem from './ListItem' + +interface Props { + unReadNotificationsCount: number; + setLastRead: Function; + + clearingAll: boolean; + loading: boolean; + clearing: boolean; + + list: any; + clearAll: Function; + setViewed: Function; +} +function AlertTriggersModal(props: Props) { + const { list, unReadNotificationsCount, loading, clearingAll, clearing } = props; + + const onClearAll = () => { + const { list } = props; + const firstItem = list.first(); + props.clearAll({ endTimestamp: firstItem.createdAt.ts }); + } + + const onClear = (notification: any) => { + console.log('onClear', notification); + props.setViewed(notification.notificationId) + } + + return ( +
    +
    +
    Alerts
    + { unReadNotificationsCount > 0 && ( +
    + +
    + )} +
    + +
    + + +
    + } + subtext="There are no alerts to show." + show={ !loading && unReadNotificationsCount === 0 } + size="small" + > + {list.map((item: any, i: any) => ( +
    + onClear(item)} loading={false} /> +
    + ))} + +
    +
    + ); +} + +export default connect((state: any) => ({ + loading: state.getIn(['notifications', 'fetchRequest', 'loading']), + clearing: state.getIn(['notifications', 'setViewed', 'loading']), + clearingAll: state.getIn(['notifications', 'clearAll', 'loading']), + list: state.getIn(['notifications', 'list']), +}), { + fetchList, + setLastRead, + setViewed, + clearAll, +})(AlertTriggersModal); \ No newline at end of file diff --git a/frontend/app/components/shared/AlertTriggersModal/AlertTypeLabel/AlertTypeLabel.tsx b/frontend/app/components/shared/AlertTriggersModal/AlertTypeLabel/AlertTypeLabel.tsx new file mode 100644 index 000000000..1cc971b87 --- /dev/null +++ b/frontend/app/components/shared/AlertTriggersModal/AlertTypeLabel/AlertTypeLabel.tsx @@ -0,0 +1,13 @@ +import React from 'react' +import cn from 'classnames' +import stl from './alertTypeLabel.module.css' + +function AlertTypeLabel({ filterKey, type = '' }: any) { + return ( +
    + { type } +
    + ) +} + +export default AlertTypeLabel diff --git a/frontend/app/components/shared/AlertTriggersModal/AlertTypeLabel/alertTypeLabel.module.css b/frontend/app/components/shared/AlertTriggersModal/AlertTypeLabel/alertTypeLabel.module.css new file mode 100644 index 000000000..62ed31460 --- /dev/null +++ b/frontend/app/components/shared/AlertTriggersModal/AlertTypeLabel/alertTypeLabel.module.css @@ -0,0 +1,11 @@ +.wrapper { + background-color: white; + color: $gray-dark; + border: solid thin $gray-light; +} + +.alert { + background: #C3E9EA; + color: #32888C; + border: none; +} diff --git a/frontend/app/components/shared/AlertTriggersModal/AlertTypeLabel/index.ts b/frontend/app/components/shared/AlertTriggersModal/AlertTypeLabel/index.ts new file mode 100644 index 000000000..344c89f23 --- /dev/null +++ b/frontend/app/components/shared/AlertTriggersModal/AlertTypeLabel/index.ts @@ -0,0 +1 @@ +export { default } from './AlertTypeLabel'; \ No newline at end of file diff --git a/frontend/app/components/shared/AlertTriggersModal/ListItem/ListItem.tsx b/frontend/app/components/shared/AlertTriggersModal/ListItem/ListItem.tsx new file mode 100644 index 000000000..6c22df28c --- /dev/null +++ b/frontend/app/components/shared/AlertTriggersModal/ListItem/ListItem.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import { Button } from 'UI'; +import stl from './listItem.module.css'; +import cn from 'classnames'; +import AlertTypeLabel from '../AlertTypeLabel'; + +const ListItem = ({ alert, onClear, loading }: any) => { + return ( +
    +
    +
    {alert.createdAt && alert.createdAt.toFormat('LLL dd, yyyy, hh:mm a')}
    +
    + +
    +
    + + +
    +

    + {alert.title} +

    +
    {alert.description}
    +
    +
    + ) +} + +export default ListItem diff --git a/frontend/app/components/shared/AlertTriggersModal/ListItem/index.ts b/frontend/app/components/shared/AlertTriggersModal/ListItem/index.ts new file mode 100644 index 000000000..741aed270 --- /dev/null +++ b/frontend/app/components/shared/AlertTriggersModal/ListItem/index.ts @@ -0,0 +1 @@ +export { default } from './ListItem'; diff --git a/frontend/app/components/shared/AlertTriggersModal/ListItem/listItem.module.css b/frontend/app/components/shared/AlertTriggersModal/ListItem/listItem.module.css new file mode 100644 index 000000000..8472a777c --- /dev/null +++ b/frontend/app/components/shared/AlertTriggersModal/ListItem/listItem.module.css @@ -0,0 +1,7 @@ +.wrapper { + padding: 15px; +} + +.viewed { + background-color: $gray-lightest; +} \ No newline at end of file diff --git a/frontend/app/components/shared/AlertTriggersModal/index.ts b/frontend/app/components/shared/AlertTriggersModal/index.ts new file mode 100644 index 000000000..482e37416 --- /dev/null +++ b/frontend/app/components/shared/AlertTriggersModal/index.ts @@ -0,0 +1 @@ +export { default } from './AlertTriggersModal'; \ No newline at end of file diff --git a/frontend/app/components/shared/AnimatedSVG/AnimatedSVG.tsx b/frontend/app/components/shared/AnimatedSVG/AnimatedSVG.tsx new file mode 100644 index 000000000..45f4d701d --- /dev/null +++ b/frontend/app/components/shared/AnimatedSVG/AnimatedSVG.tsx @@ -0,0 +1,53 @@ +import React from 'react'; +import LogoSmall from '../../../svg/logo-small.svg'; +import NoResultsSVG from '../../../svg/no-results.svg'; +import EmptyStateSvg from '../../../svg/empty-state.svg'; +import DashboardSvg from '../../../svg/dashboard-icn.svg'; +import LoaderSVG from '../../../svg/openreplay-preloader.svg'; +import SignalGreenSvg from '../../../svg/signal-green.svg'; +import SignalRedSvg from '../../../svg/signal-red.svg'; + +export enum ICONS { + DASHBOARD_ICON = 'dashboard-icn', + EMPTY_STATE = 'empty-state', + LOGO_SMALL = 'logo-small', + NO_RESULTS = 'no-results', + LOADER = 'openreplay-preloader', + SIGNAL_GREEN = 'signal-green', + SIGNAL_RED = 'signal-red' +} + +interface Props { + name: string; + size?: number; +} +function AnimatedSVG(props: Props) { + const { name, size = 24 } = props; + const renderSvg = () => { + switch (name) { + case ICONS.LOADER: + return + case ICONS.DASHBOARD_ICON: + return + case ICONS.EMPTY_STATE: + return + case ICONS.LOGO_SMALL: + return + case ICONS.NO_RESULTS: + return + case ICONS.SIGNAL_GREEN: + return + case ICONS.SIGNAL_RED: + return + default: + return null; + } + } + return ( +
    + {renderSvg()} +
    + ); +} + +export default AnimatedSVG; \ No newline at end of file diff --git a/frontend/app/components/shared/AnimatedSVG/index.ts b/frontend/app/components/shared/AnimatedSVG/index.ts new file mode 100644 index 000000000..7ab201438 --- /dev/null +++ b/frontend/app/components/shared/AnimatedSVG/index.ts @@ -0,0 +1,2 @@ + +export { default } from './AnimatedSVG'; \ No newline at end of file diff --git a/frontend/app/components/shared/AnnouncementModal/AnnouncementModal.tsx b/frontend/app/components/shared/AnnouncementModal/AnnouncementModal.tsx new file mode 100644 index 000000000..5f69de976 --- /dev/null +++ b/frontend/app/components/shared/AnnouncementModal/AnnouncementModal.tsx @@ -0,0 +1,55 @@ +import React from 'react'; +import { Button, NoContent } from 'UI'; +import { connect } from 'react-redux'; +import { fetchList, setLastRead } from 'Duck/announcements'; +import cn from 'classnames'; +import AnimatedSVG, { ICONS } from 'Shared/AnimatedSVG/AnimatedSVG'; +import ListItem from './ListItem' + +interface Props { + unReadNotificationsCount: number; + setLastRead: Function; + list: any; +} +function AnnouncementModal(props: Props) { + const { list, unReadNotificationsCount } = props; + + // const onClear = (notification: any) => { + // console.log('onClear', notification); + // props.setViewed(notification.notificationId) + // } + + return ( +
    +
    +
    Announcements
    +
    + +
    + + +
    + } + subtext="There are no alerts to show." + // show={ !loading && unReadNotificationsCount === 0 } + size="small" + > + {list.map((item: any, i: any) => ( +
    + {/* onClear(item)} loading={false} /> */} +
    + ))} + +
    + + ); +} + +export default connect((state: any) => ({ + list: state.getIn(['announcements', 'list']), +}), { + fetchList, + setLastRead, +})(AnnouncementModal); \ No newline at end of file diff --git a/frontend/app/components/shared/AnnouncementModal/ListItem/ListItem.tsx b/frontend/app/components/shared/AnnouncementModal/ListItem/ListItem.tsx new file mode 100644 index 000000000..dd777c719 --- /dev/null +++ b/frontend/app/components/shared/AnnouncementModal/ListItem/ListItem.tsx @@ -0,0 +1,31 @@ +import React from 'react'; +import { Button, Label } from 'UI'; +import stl from './listItem.module.css'; + +const ListItem = ({ announcement, onButtonClick }) => { + return ( +
    +
    +
    {announcement.createdAt && announcement.createdAt.toFormat('LLL dd, yyyy')}
    + +
    + {announcement.imageUrl && + + } +
    +

    {announcement.title}

    +
    {announcement.description}
    + {announcement.buttonUrl && + + } +
    +
    + ) +} + +export default ListItem diff --git a/frontend/app/components/shared/AnnouncementModal/ListItem/index.ts b/frontend/app/components/shared/AnnouncementModal/ListItem/index.ts new file mode 100644 index 000000000..741aed270 --- /dev/null +++ b/frontend/app/components/shared/AnnouncementModal/ListItem/index.ts @@ -0,0 +1 @@ +export { default } from './ListItem'; diff --git a/frontend/app/components/shared/AnnouncementModal/ListItem/listItem.module.css b/frontend/app/components/shared/AnnouncementModal/ListItem/listItem.module.css new file mode 100644 index 000000000..5bc3a44c8 --- /dev/null +++ b/frontend/app/components/shared/AnnouncementModal/ListItem/listItem.module.css @@ -0,0 +1,5 @@ +.wrapper { + background-color: white; + margin-bottom: 20px; + padding: 15px; +} \ No newline at end of file diff --git a/frontend/app/components/shared/AnnouncementModal/index.ts b/frontend/app/components/shared/AnnouncementModal/index.ts new file mode 100644 index 000000000..b9af0fc52 --- /dev/null +++ b/frontend/app/components/shared/AnnouncementModal/index.ts @@ -0,0 +1 @@ +export { default } from './AnnouncementModal'; \ No newline at end of file diff --git a/frontend/app/components/shared/Bookmark/Bookmark.tsx b/frontend/app/components/shared/Bookmark/Bookmark.tsx index 9319be1c5..449c75d37 100644 --- a/frontend/app/components/shared/Bookmark/Bookmark.tsx +++ b/frontend/app/components/shared/Bookmark/Bookmark.tsx @@ -1,11 +1,8 @@ -//@ts-nocheck import React, { useEffect, useState } from 'react' -import stl from './bookmark.css' -import { Icon } from 'UI' +import { Popup, Button } from 'UI' import { toggleFavorite } from 'Duck/sessions' import { connect } from 'react-redux' import { toast } from 'react-toastify'; -import { Tooltip } from 'react-tippy'; interface Props { toggleFavorite: (sessionId: string) => Promise, @@ -37,20 +34,18 @@ function Bookmark(props : Props ) { } return ( - -
    - -
    -
    + variant="text-primary" + icon={isFavorite ? ACTIVE_ICON : INACTIVE_ICON} + /> + ) } diff --git a/frontend/app/components/shared/Bookmark/bookmark.css b/frontend/app/components/shared/Bookmark/bookmark.css deleted file mode 100644 index 9e44e8115..000000000 --- a/frontend/app/components/shared/Bookmark/bookmark.css +++ /dev/null @@ -1,14 +0,0 @@ -.favoriteWrapper { - cursor: pointer; - display: flex; - align-items: center; - /* opacity: 0; */ - margin: 0 15px; - - &[data-favourite=true] { - opacity: 1; - & svg { - fill: $teal; - } - } -} \ No newline at end of file diff --git a/frontend/app/components/shared/CustomMetrics/CustomMetricForm/CustomMetricForm.tsx b/frontend/app/components/shared/CustomMetrics/CustomMetricForm/CustomMetricForm.tsx index 89d78ea7a..06b292eb2 100644 --- a/frontend/app/components/shared/CustomMetrics/CustomMetricForm/CustomMetricForm.tsx +++ b/frontend/app/components/shared/CustomMetrics/CustomMetricForm/CustomMetricForm.tsx @@ -4,7 +4,7 @@ import FilterSeries from '../FilterSeries'; import { connect } from 'react-redux'; import { edit as editMetric, save, addSeries, removeSeries, remove } from 'Duck/customMetrics'; import CustomMetricWidgetPreview from 'App/components/Dashboard/Widgets/CustomMetricsWidgets/CustomMetricWidgetPreview'; -import { confirm } from 'UI/Confirmation'; +import { confirm } from 'UI'; import { toast } from 'react-toastify'; import cn from 'classnames'; import DropdownPlain from '../../DropdownPlain'; @@ -203,14 +203,14 @@ function CustomMetricForm(props: Props) {
    - - +
    - { metric.exists() && } + { metric.exists() && }
    diff --git a/frontend/app/components/shared/CustomMetrics/SessionListModal/SessionListModal.css b/frontend/app/components/shared/CustomMetrics/SessionListModal/SessionListModal.module.css similarity index 100% rename from frontend/app/components/shared/CustomMetrics/SessionListModal/SessionListModal.css rename to frontend/app/components/shared/CustomMetrics/SessionListModal/SessionListModal.module.css diff --git a/frontend/app/components/shared/CustomMetrics/SessionListModal/SessionListModal.tsx b/frontend/app/components/shared/CustomMetrics/SessionListModal/SessionListModal.tsx index 921795f97..66c1ccfb0 100644 --- a/frontend/app/components/shared/CustomMetrics/SessionListModal/SessionListModal.tsx +++ b/frontend/app/components/shared/CustomMetrics/SessionListModal/SessionListModal.tsx @@ -1,10 +1,11 @@ import React, { useEffect, useState } from 'react'; import { SlideModal, NoContent, Dropdown, Icon, TimezoneDropdown, Loader } from 'UI'; import SessionItem from 'Shared/SessionItem'; -import stl from './SessionListModal.css'; +import stl from './SessionListModal.module.css'; import { connect } from 'react-redux'; import { fetchSessionList, setActiveWidget } from 'Duck/customMetrics'; import { DateTime } from 'luxon'; +import AnimatedSVG, { ICONS } from 'Shared/AnimatedSVG/AnimatedSVG'; interface Props { loading: boolean; list: any; @@ -100,8 +101,13 @@ function SessionListModal(props: Props) { + +
    No recordings found!
    + + } + // animatedIcon="no-results" > { filteredSessions.map(session => ) }
    diff --git a/frontend/app/components/shared/DateRange.js b/frontend/app/components/shared/DateRange.js index 13561a412..a70003a02 100644 --- a/frontend/app/components/shared/DateRange.js +++ b/frontend/app/components/shared/DateRange.js @@ -1,4 +1,4 @@ -import { connect } from 'react-redux'; +import React from 'react'; import DateRangeDropdown from 'Shared/DateRangeDropdown'; function DateRange (props) { diff --git a/frontend/app/components/shared/DateRangeDropdown/DateOptionLabel.js b/frontend/app/components/shared/DateRangeDropdown/DateOptionLabel.js index 3949a82ad..55d0e069d 100644 --- a/frontend/app/components/shared/DateRangeDropdown/DateOptionLabel.js +++ b/frontend/app/components/shared/DateRangeDropdown/DateOptionLabel.js @@ -1,4 +1,4 @@ -import styles from './dateOptionLabel.css'; +import styles from './dateOptionLabel.module.css'; export default ({ range }) => (
    diff --git a/frontend/app/components/shared/DateRangeDropdown/DateRangeDropdown.js b/frontend/app/components/shared/DateRangeDropdown/DateRangeDropdown.js index 05a42658f..da1460362 100644 --- a/frontend/app/components/shared/DateRangeDropdown/DateRangeDropdown.js +++ b/frontend/app/components/shared/DateRangeDropdown/DateRangeDropdown.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Dropdown } from 'semantic-ui-react'; import cn from 'classnames'; import { @@ -11,7 +12,7 @@ import { import { Icon } from 'UI'; import DateRangePopup from './DateRangePopup'; import DateOptionLabel from './DateOptionLabel'; -import styles from './dateRangeDropdown.css'; +import styles from './dateRangeDropdown.module.css'; const getDateRangeOptions = (customRange = getDateRangeFromValue(CUSTOM_RANGE)) => dateRangeValues.map(value => ({ value, diff --git a/frontend/app/components/shared/DateRangeDropdown/DateRangePopup.js b/frontend/app/components/shared/DateRangeDropdown/DateRangePopup.js index 6bfe6a860..8c353419f 100644 --- a/frontend/app/components/shared/DateRangeDropdown/DateRangePopup.js +++ b/frontend/app/components/shared/DateRangeDropdown/DateRangePopup.js @@ -1,9 +1,11 @@ -import DateRangePicker from 'react-daterange-picker'; +import React from 'react'; +import DateRangePicker from 'react-daterange-picker'; // TODO replace with other date range pickers +// import { DateRangePicker } from 'react-date-range'; import TimePicker from 'rc-time-picker'; import { Button } from 'UI'; import { getDateRangeFromValue, getDateRangeLabel, dateRangeValues, CUSTOM_RANGE, moment, DATE_RANGE_VALUES } from 'App/dateRange'; -import styles from './dateRangePopup.css'; +import styles from './dateRangePopup.module.css'; export default class DateRangePopup extends React.PureComponent { state = { @@ -59,6 +61,12 @@ export default class DateRangePopup extends React.PureComponent { rangeForDisplay.start.startOf('day'); rangeForDisplay.end.startOf('day'); + const selectionRange = { + startDate: new Date(), + endDate: new Date(), + key: 'selection', + } + return (
    @@ -73,11 +81,17 @@ export default class DateRangePopup extends React.PureComponent { )) }
    + {/* console.log(e)} + showMonthAndYearPickers={false} + scroll={{ enabled: true }} + /> */}
    -
    - - +
    + +
    diff --git a/frontend/app/components/shared/DateRangeDropdown/dateOptionLabel.css b/frontend/app/components/shared/DateRangeDropdown/dateOptionLabel.module.css similarity index 100% rename from frontend/app/components/shared/DateRangeDropdown/dateOptionLabel.css rename to frontend/app/components/shared/DateRangeDropdown/dateOptionLabel.module.css diff --git a/frontend/app/components/shared/DateRangeDropdown/dateRangeDropdown.css b/frontend/app/components/shared/DateRangeDropdown/dateRangeDropdown.module.css similarity index 100% rename from frontend/app/components/shared/DateRangeDropdown/dateRangeDropdown.css rename to frontend/app/components/shared/DateRangeDropdown/dateRangeDropdown.module.css diff --git a/frontend/app/components/shared/DateRangeDropdown/dateRangePopup.css b/frontend/app/components/shared/DateRangeDropdown/dateRangePopup.module.css similarity index 100% rename from frontend/app/components/shared/DateRangeDropdown/dateRangePopup.css rename to frontend/app/components/shared/DateRangeDropdown/dateRangePopup.module.css diff --git a/frontend/app/components/shared/DocLink/DocLink.js b/frontend/app/components/shared/DocLink/DocLink.js index cab199765..004f154ef 100644 --- a/frontend/app/components/shared/DocLink/DocLink.js +++ b/frontend/app/components/shared/DocLink/DocLink.js @@ -8,11 +8,9 @@ export default function DocLink({ className = '', url, label }) { return (
    -
    ) diff --git a/frontend/app/components/shared/DropdownPlain/DropdownPlain.css b/frontend/app/components/shared/DropdownPlain/DropdownPlain.module.css similarity index 100% rename from frontend/app/components/shared/DropdownPlain/DropdownPlain.css rename to frontend/app/components/shared/DropdownPlain/DropdownPlain.module.css diff --git a/frontend/app/components/shared/DropdownPlain/DropdownPlain.tsx b/frontend/app/components/shared/DropdownPlain/DropdownPlain.tsx index 2aa1930d3..4a6877375 100644 --- a/frontend/app/components/shared/DropdownPlain/DropdownPlain.tsx +++ b/frontend/app/components/shared/DropdownPlain/DropdownPlain.tsx @@ -1,5 +1,5 @@ import React from 'react' -import stl from './DropdownPlain.css'; +import stl from './DropdownPlain.module.css'; import { Dropdown, Icon } from 'UI'; interface Props { diff --git a/frontend/app/components/shared/EmailVerificationMessage/EmailVerificationMessage.js b/frontend/app/components/shared/EmailVerificationMessage/EmailVerificationMessage.js index 6ae212645..4d548e7bc 100644 --- a/frontend/app/components/shared/EmailVerificationMessage/EmailVerificationMessage.js +++ b/frontend/app/components/shared/EmailVerificationMessage/EmailVerificationMessage.js @@ -13,21 +13,17 @@ function EmailVerificationMessage(props) { } return ( - Please, verify your email. Resend - - } content={ `We've sent a verification email to "${email}" please follow the instructions in it to use OpenReplay uninterruptedly.` } - /> + > +
    + Please, verify your email. Resend +
    +
    ) } diff --git a/frontend/app/components/shared/ErrorsBadge/ErrorsBadge.js b/frontend/app/components/shared/ErrorsBadge/ErrorsBadge.js index 74700eaf5..6b4ac0fd2 100644 --- a/frontend/app/components/shared/ErrorsBadge/ErrorsBadge.js +++ b/frontend/app/components/shared/ErrorsBadge/ErrorsBadge.js @@ -1,7 +1,7 @@ import React, { useEffect } from 'react' import { fetchNewErrorsCount } from 'Duck/errors' import { connect } from 'react-redux' -import stl from './errorsBadge.css' +import stl from './errorsBadge.module.css' import { getDateRangeFromValue, DATE_RANGE_VALUES, diff --git a/frontend/app/components/shared/ErrorsBadge/errorsBadge.css b/frontend/app/components/shared/ErrorsBadge/errorsBadge.module.css similarity index 100% rename from frontend/app/components/shared/ErrorsBadge/errorsBadge.css rename to frontend/app/components/shared/ErrorsBadge/errorsBadge.module.css diff --git a/frontend/app/components/shared/EventFilter/Attributes/ActiveLabel.js b/frontend/app/components/shared/EventFilter/Attributes/ActiveLabel.js deleted file mode 100644 index eeed1ea4c..000000000 --- a/frontend/app/components/shared/EventFilter/Attributes/ActiveLabel.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import stl from './activeLabel.css'; - -const ActiveLabel = ({ item, onRemove }) => { - return ( -
    onRemove(item) }>{ item.text }
    - ); -}; - -export default ActiveLabel; diff --git a/frontend/app/components/shared/EventFilter/Attributes/AttributeItem.js b/frontend/app/components/shared/EventFilter/Attributes/AttributeItem.js deleted file mode 100644 index 0b7b39b78..000000000 --- a/frontend/app/components/shared/EventFilter/Attributes/AttributeItem.js +++ /dev/null @@ -1,92 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import { operatorOptions } from 'Types/filter'; -import { Icon } from 'UI'; -import { editAttribute, removeAttribute, applyFilter, fetchFilterOptions } from 'Duck/funnelFilters'; -import { debounce } from 'App/utils'; -import { KEYS } from 'Types/filter/customFilter'; -import stl from './attributeItem.css' -import AttributeValueField from './AttributeValueField'; -import OperatorDropdown from './OperatorDropdown'; -import CustomFilters from '../CustomFilters'; -import FilterSelectionButton from '../FilterSelectionButton'; - -const DEFAULT = null; - -@connect(state => ({ - loadingFilterOptions: state.getIn([ 'filters', 'fetchFilterOptions', 'loading' ]), - filterOptions: state.getIn([ 'filters', 'filterOptions' ]), -}), { - editAttribute, - removeAttribute, - applyFilter, - fetchFilterOptions -}) - -class AttributeItem extends React.PureComponent { - applyFilter = debounce(this.props.applyFilter, 1000) - fetchFilterOptionsDebounce = debounce(this.props.fetchFilterOptions, 500) - - onFilterChange = (e, { name, value }) => { - const { index } = this.props; - this.props.editAttribute(index, name, value); - this.applyFilter(); - } - - removeFilter = () => { - const { index } = this.props; - this.props.removeAttribute(index) - this.applyFilter(); - } - - handleSearchChange = (e, { searchQuery }) => { - const { filter } = this.props; - this.fetchFilterOptionsDebounce(filter, searchQuery); - } - - render() { - const { filter, options, index, loadingFilterOptions, filterOptions } = this.props; - const _operatorOptions = operatorOptions(filter); - - let filterLabel = filter.label; - if (filter.type === KEYS.METADATA) - filterLabel = filter.key; - - return ( -
    - } - showFilters={ true } - filterType="filter" - /> - { filter.type !== KEYS.DURATION && - - } - { - !filter.hasNoValue && - - } - -
    - -
    -
    - ); - } -} - -export default AttributeItem; diff --git a/frontend/app/components/shared/EventFilter/Attributes/AttributeValueField.js b/frontend/app/components/shared/EventFilter/Attributes/AttributeValueField.js deleted file mode 100644 index 9fa42147c..000000000 --- a/frontend/app/components/shared/EventFilter/Attributes/AttributeValueField.js +++ /dev/null @@ -1,172 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import cn from 'classnames'; -import stl from './attributeItem.css' -import { Dropdown } from 'semantic-ui-react'; -import { LinkStyledInput, CircularLoader } from 'UI'; -import { KEYS } from 'Types/filter/customFilter'; -import Event, { TYPES } from 'Types/filter/event'; -import CustomFilter from 'Types/filter/customFilter'; -import { setActiveKey, addCustomFilter, removeCustomFilter, applyFilter } from 'Duck/funnelFilters'; -import DurationFilter from '../DurationFilter/DurationFilter'; -import AutoComplete from '../AutoComplete'; - -const DEFAULT = null; - -const getHeader = (type) => { - if (type === 'LOCATION') return 'Path'; - - return type; -} - -@connect(null, { - setActiveKey, - addCustomFilter, - removeCustomFilter, - applyFilter, -}) -class AttributeValueField extends React.PureComponent { - state = { - minDuration: this.props.filter.minDuration, - maxDuration: this.props.filter.maxDuration, - } - - onValueChange = (e, { name: key, value }) => { - this.props.addCustomFilter(key, value); - }; - - onDurationChange = (durationValues) => { - this.setState(durationValues); - } - - isAutoComplete = (type) => { - switch (type) { - case TYPES.METADATA: - case TYPES.CLICK: - case TYPES.CONSOLE: - case TYPES.GRAPHQL: - case TYPES.FETCH: - case TYPES.STATEACTION: - case TYPES.USERID: - case TYPES.USERANONYMOUSID: - case TYPES.REVID: - case TYPES.GRAPHQL: - case TYPES.CUSTOM: - case TYPES.LOCATION: - case TYPES.INPUT: - case 'metadata': - return true; - } - - return false; - } - - handleClose = (e) => { - const { filter, onChange } = this.props; - if (filter.key === KEYS.DURATION) { - const { maxDuration, minDuration, key } = filter; - if (maxDuration || minDuration) return; - if (maxDuration !== this.state.maxDuration || - minDuration !== this.state.minDuration) { - onChange(e, { name: 'value', value: [this.state.minDuration, this.state.maxDuration] }); - } - } - } - - renderField() { - const { filter, onChange } = this.props; - - if (filter.key === KEYS.DURATION) { - const { maxDuration, minDuration } = this.state; - return ( - - ); - } - - const { options = [], handleSearchChange, loading } = this.props; - return ( - 0 || options.size > 0} - onChange={ onChange } - onSearchChange={handleSearchChange} - icon={ null } - noResultsMessage={loading ?
    - -
    : 'No results found.'} - /> - ) - } - - optionMapping = (values) => { - const { filter } = this.props; - if ([KEYS.USER_DEVICE, KEYS.USER_OS, KEYS.USER_BROWSER, KEYS.REFERRER].indexOf(filter.type) !== -1) - return values.map(item => ({ type: TYPES.METADATA, value: item })).map(CustomFilter); - else { - return values.map(Event); - } - } - - getParams = filter => { - const params = {}; - - if (filter.type === TYPES.METADATA) { - params.key = filter.key - } - - params.type = filter.type - if (filter.type === TYPES.ERROR && filter.source) { - params.source = filter.source - } - return params; - } - - render() { - const { filter, onChange } = this.props; - const _showAutoComplete = this.isAutoComplete(filter.type); - const _params = _showAutoComplete ? this.getParams(filter) : {}; - let _optionsEndpoint= '/events/search'; - - return ( - - { _showAutoComplete ? - { getHeader(filter.type) } } - fullWidth={ (filter.type === TYPES.CONSOLE || filter.type === TYPES.LOCATION || filter.type === TYPES.CUSTOM) && filter.value } - // onAddOrRemove={} - /> - : this.renderField() - } - { filter.type === 'INPUT' && - - } - - ); - } -} - -export default AttributeValueField; diff --git a/frontend/app/components/shared/EventFilter/Attributes/Attributes.js b/frontend/app/components/shared/EventFilter/Attributes/Attributes.js deleted file mode 100644 index 61e80d380..000000000 --- a/frontend/app/components/shared/EventFilter/Attributes/Attributes.js +++ /dev/null @@ -1,72 +0,0 @@ -import React from 'react'; -import { List } from 'immutable'; -import { connect } from 'react-redux'; -import { countries } from 'App/constants'; -import { KEYS } from 'Types/filter/customFilter'; -import { addAttribute } from 'Duck/funnelFilters'; -import AttributeItem from './AttributeItem'; -import ListHeader from '../ListHeader'; -import logger from 'App/logger'; - -const DEFAULT = null; -const DEFAULT_OPTION = { text: 'Any', value: DEFAULT }; -const toOptions = (values, mapper) => (values ? values - .map(({value}) => ({ - text: mapper ? mapper[ value ] : value, - value, - })) - .toJS() : [ DEFAULT_OPTION ]); - -const countryOptions = Object.keys(countries).map(i => ({ text: countries[i], value: i })); - -@connect(state => ({ - filters: state.getIn([ 'funnelFilters', 'appliedFilter', 'filters' ]), - filterValues: state.get('filterValues'), - filterOptions: state.getIn([ 'funnelFilters', 'filterOptions' ]), -}), { - addAttribute, -}) -class Attributes extends React.PureComponent { - getOptions = filter => { - const { filterValues, filterOptions } = this.props; - - if (filter.key === KEYS.USER_COUNTRY) { - logger.log('Filters: country') - return countryOptions; - } - - if (filter.key === KEYS.METADATA) { - logger.log('Filters: metadata ' + filter.key) - const options = filterValues.get(filter.key); - return options && options.size ? toOptions(options) : []; - } - - logger.log('Filters: general filters ' + filter.key) - const options = filterOptions.get(filter.key) - return options && options.size ? toOptions(options.filter(i => !!i)) : [] - } - render() { - const { filters } = this.props; - return ( - <> - { filters.size > 0 && -
    -
    - { - filters.map((filter, index) => ( - - )) - } -
    - } - - ); - } -} - -export default Attributes; diff --git a/frontend/app/components/shared/EventFilter/Attributes/OperatorDropdown.js b/frontend/app/components/shared/EventFilter/Attributes/OperatorDropdown.js deleted file mode 100644 index 4d2ba0d54..000000000 --- a/frontend/app/components/shared/EventFilter/Attributes/OperatorDropdown.js +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react'; -import cn from 'classnames'; -import { Dropdown, Icon } from 'UI'; -import stl from './attributeItem.css' - -const OperatorDropdown = ({ options, value, onChange }) => { - return ( - } - /> - ); -}; - -export default OperatorDropdown; diff --git a/frontend/app/components/shared/EventFilter/Attributes/activeLabel.css b/frontend/app/components/shared/EventFilter/Attributes/activeLabel.css deleted file mode 100644 index 283fed288..000000000 --- a/frontend/app/components/shared/EventFilter/Attributes/activeLabel.css +++ /dev/null @@ -1,9 +0,0 @@ -.wrapper { - padding: 3px 8px; - background-color: $gray-lightest; - border-radius: 10px; - margin-right: 5px; - box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) inset; - font-size: 13px; - color: $gray-medium; -} \ No newline at end of file diff --git a/frontend/app/components/shared/EventFilter/Attributes/attributeItem.css b/frontend/app/components/shared/EventFilter/Attributes/attributeItem.css deleted file mode 100644 index 3f4a229ed..000000000 --- a/frontend/app/components/shared/EventFilter/Attributes/attributeItem.css +++ /dev/null @@ -1,129 +0,0 @@ -@import 'icons.css'; - -.wrapper { - display: flex; - align-items: center; - padding: 8px 15px; - background-color: white; - border-bottom: solid thin $gray-lightest; - &:last-child { - border-bottom: solid thin transparent; - } - - &:hover { - background-color: $active-blue; - & .actions { - opacity: 1; - transition: all 0.2s; - } - } - - & > div:not(:last-child) { - margin-right: 10px; - } - - & .label { - font-weight: 600; - min-width: 80px; - } - - & .filterDropdown { - padding: 0 5px !important; - min-height: 28px !important; - display: flex !important; - align-items: center !important; - font-weight: 400; - min-width: 280px !important; - max-width: 75% !important; - flex-wrap: wrap; - padding: 1.9px !important; - background-color: rgba(255, 255, 255, 0.8) !important; - padding-left: 5px !important; - - & a { - background-color: $gray-lightest !important; - box-shadow: none !important; - border-radius: 10px !important; - white-space: nowrap !important; - margin: 0 !important; - margin-right: 5px !important; - margin-bottom: 2px !important; - font-size: 13px !important; - font-weight: 400; - display: flex !important; - align-items: center !important; - padding: 3px 5px !important; - - & i::before { - display: none; - } - & i::after { - content: '' !important; - @mixin icon close, $gray-dark, 12px; - } - } - - & input { - padding: 6px !important; - margin: 0 !important; - color: $gray-medium !important; - } - - & .delete.icon { - padding: 0 !important; - display: none; - } - } -} - -.operatorDropdown { - font-weight: 400; - height: 28px; - min-width: 60px; - display: flex !important; - align-items: center; - justify-content: space-between; - padding: 0 8px !important; - font-size: 13px; - background-color: rgba(255, 255, 255, 0.8) !important; - border: solid thin rgba(34, 36, 38, 0.15) !important; - border-radius: 4px !important; - color: $gray-darkest !important; - font-size: 14px !important; - &.ui.basic.button { - box-shadow: 0 0 0 1px rgba(62, 170, 175,36,38,.35) inset, 0 0 0 0 rgba(62, 170, 175,.15) inset !important; - } -} - -.button { - width: 25px; - height: 25px; - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; - margin-left: 10px; -} - -.actions { - margin-left: auto; - opacity: 0; - transition: all 0.4s; -} - -.inputValue { - height: 28px !important; - width: 180px; - color: $gray-medium !important; -} - -.header { - margin-bottom: 10px; - font-size: 13px; - color: #596764; - white-space: nowrap; - text-transform: uppercase; - font-weight: normal; - letter-spacing: 0.1em; - text-align: left; -} \ No newline at end of file diff --git a/frontend/app/components/shared/EventFilter/Attributes/index.js b/frontend/app/components/shared/EventFilter/Attributes/index.js deleted file mode 100644 index 023362198..000000000 --- a/frontend/app/components/shared/EventFilter/Attributes/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './Attributes'; diff --git a/frontend/app/components/shared/EventFilter/AutoComplete/AutoComplete.js b/frontend/app/components/shared/EventFilter/AutoComplete/AutoComplete.js deleted file mode 100644 index c4588354b..000000000 --- a/frontend/app/components/shared/EventFilter/AutoComplete/AutoComplete.js +++ /dev/null @@ -1,193 +0,0 @@ -import React from 'react'; -import APIClient from 'App/api_client'; -import cn from 'classnames'; -import { Input } from 'UI'; -import { debounce } from 'App/utils'; -import OutsideClickDetectingDiv from 'Shared/OutsideClickDetectingDiv'; -import stl from './autoComplete.css'; -import FilterItem from '../FilterItem'; - -const TYPE_TO_SEARCH_MSG = "Start typing to search..."; -const NO_RESULTS_MSG = "No results found."; -const SOME_ERROR_MSG = "Some error occured."; -const defaultValueToText = value => value; -const defaultOptionMapping = (values, valueToText) => values.map(value => ({ text: valueToText(value), value })); - -const hiddenStyle = { - whiteSpace: 'pre-wrap', - opacity: 0, position: 'fixed', left: '-3000px' -}; - -let pasted = false; -let changed = false; - -class AutoComplete extends React.PureComponent { - static defaultProps = { - method: 'GET', - params: {}, - } - - state = { - values: [], - noResultsMessage: TYPE_TO_SEARCH_MSG, - ddOpen: false, - query: this.props.value, - loading: false, - error: false - } - - componentWillReceiveProps(newProps) { - if (this.props.value !== newProps.value) { - this.setState({ query: newProps.value}); - } - } - - onClickOutside = () => { - this.setState({ ddOpen: false }); - } - - requestValues = (q) => { - const { params, endpoint, method } = this.props; - this.setState({ - loading: true, - error: false, - }); - return new APIClient()[ method.toLowerCase() ](endpoint, { ...params, q }) - .then(response => response.json()) - .then(({ errors, data }) => { - if (errors) { - this.setError(); - } else { - this.setState({ - ddOpen: true, - values: data, - loading: false, - noResultsMessage: NO_RESULTS_MSG, - }); - } - }) - .catch(this.setError); - } - - debouncedRequestValues = debounce(this.requestValues, 1000) - - setError = () => this.setState({ - loading: false, - error: true, - noResultsMessage: SOME_ERROR_MSG, - }) - - onInputChange = ({ target: { value } }) => { - changed = true; - this.setState({ query: value, updated: true }) - const _value = value.trim(); - if (_value !== '' && _value !== ' ') { - this.debouncedRequestValues(_value) - } - } - - onBlur = ({ target: { value } }) => { - // to avoid sending unnecessary request on focus in/out without changing - if (!changed && !pasted) return; - - value = pasted ? this.hiddenInput.value : value; - const { onSelect, name } = this.props; - if (value !== this.props.value) { - const _value = value.trim(); - onSelect(null, {name, value: _value}); - } - - changed = false; - pasted = false; - } - - onItemClick = (e, item) => { - e.stopPropagation(); - e.preventDefault(); - const { onSelect, name } = this.props; - - this.setState({ query: item.value, ddOpen: false}) - onSelect(e, {name, ...item.toJS()}); - } - - render() { - const { ddOpen, query, loading, values } = this.state; - const { - // values = [], - optionMapping = defaultOptionMapping, - valueToText = defaultValueToText, - placeholder = 'Type to search...', - headerText = '', - fullWidth = false, - onAddOrRemove = () => null, - } = this.props; - - const options = optionMapping(values, valueToText) - - return ( - - {/* this.setState({ddOpen: true})} - value={ query } - icon="search" - loading={ loading } - autoFocus={ true } - type="search" - placeholder={ placeholder } - onPaste={(e) => { - const text = e.clipboardData.getData('Text'); - this.hiddenInput.value = text; - pasted = true; // to use only the hidden input - } } - /> */} -
    - this.setState({ddOpen: true})} - onChange={ this.onInputChange } - onBlur={ this.onBlur } - value={ query } - autoFocus={ true } - type="text" - placeholder={ placeholder } - onPaste={(e) => { - const text = e.clipboardData.getData('Text'); - this.hiddenInput.value = text; - pasted = true; // to use only the hidden input - } } - autocomplete="do-not-autofill-bad-chrome" - /> -
    - {/* */} - or -
    -
    - - { ddOpen && options.length > 0 && -
    - { headerText && headerText } - { - options.map(item => ( - this.onItemClick(e, item) } - /> - // this.onItemClick(e, item) } /> - )) - } -
    - } -
    - ); - } -} - -export default AutoComplete; diff --git a/frontend/app/components/shared/EventFilter/AutoComplete/DropdownItem.js b/frontend/app/components/shared/EventFilter/AutoComplete/DropdownItem.js deleted file mode 100644 index a8275a14d..000000000 --- a/frontend/app/components/shared/EventFilter/AutoComplete/DropdownItem.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import stl from './dropdownItem.css'; - -const DropdownItem = ({ value, onSelect }) => { - return ( -
    { value }
    - ); -}; - -export default DropdownItem; diff --git a/frontend/app/components/shared/EventFilter/AutoComplete/autoComplete.css b/frontend/app/components/shared/EventFilter/AutoComplete/autoComplete.css deleted file mode 100644 index b72653c42..000000000 --- a/frontend/app/components/shared/EventFilter/AutoComplete/autoComplete.css +++ /dev/null @@ -1,57 +0,0 @@ -.menu { - border-radius: 0 0 3px 3px; - box-shadow: 0 2px 10px 0 $gray-light; - padding: 20px; - background-color: white; - max-height: 350px; - overflow-y: auto; - position: absolute; - top: 28px; - left: 0; - width: 500px; - z-index: 99; -} - -.searchInput { - & input { - font-size: 13px !important; - padding: 5px !important; - color: $gray-darkest !important; - font-size: 14px !important; - background-color: rgba(255, 255, 255, 0.8) !important; - } - height: 28px !important; - width: 280px; - color: $gray-darkest !important; -} - -.fullWidth { - width: 100% !important; -} - -.inputWrapper { - border: solid thin $gray-light !important; - border-radius: 3px; - border-radius: 3px; - display: flex; - align-items: center; - & input { - height: 28px; - font-size: 13px !important; - padding: 0 5px !important; - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; - } - - & .right { - height: 28px; - display: flex; - align-items: center; - padding: 0 5px; - background-color: $gray-lightest; - border-left: solid thin $gray-light !important; - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; - cursor: pointer; - } -} \ No newline at end of file diff --git a/frontend/app/components/shared/EventFilter/AutoComplete/dropdownItem.css b/frontend/app/components/shared/EventFilter/AutoComplete/dropdownItem.css deleted file mode 100644 index f5646a470..000000000 --- a/frontend/app/components/shared/EventFilter/AutoComplete/dropdownItem.css +++ /dev/null @@ -1,11 +0,0 @@ -.wrapper { - padding: 8px; - border-bottom: solid thin rgba(0, 0, 0, 0.05); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - cursor: pointer; - &:hover { - background-color: $active-blue; - } -} \ No newline at end of file diff --git a/frontend/app/components/shared/EventFilter/AutoComplete/index.js b/frontend/app/components/shared/EventFilter/AutoComplete/index.js deleted file mode 100644 index fa63241a4..000000000 --- a/frontend/app/components/shared/EventFilter/AutoComplete/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './AutoComplete'; \ No newline at end of file diff --git a/frontend/app/components/shared/EventFilter/CustomFilters/CustomFilters.js b/frontend/app/components/shared/EventFilter/CustomFilters/CustomFilters.js deleted file mode 100644 index 81e4ed0a6..000000000 --- a/frontend/app/components/shared/EventFilter/CustomFilters/CustomFilters.js +++ /dev/null @@ -1,26 +0,0 @@ -import React, { useCallback, useState } from 'react'; -import OutsideClickDetectingDiv from 'Shared/OutsideClickDetectingDiv'; -import FilterModal from '../FilterModal'; - -export default React.memo(function CustomFilters({ - index, - buttonComponent, - filterType, -}) { - const [ displayed, setDisplayed ] = useState(false); - const close = useCallback(() => setDisplayed(false), []); - const toggle = useCallback(() => setDisplayed(d => !d), []); - - return ( - -
    { buttonComponent || 'Add Step' }
    - - -
    - ); -}) \ No newline at end of file diff --git a/frontend/app/components/shared/EventFilter/CustomFilters/index.js b/frontend/app/components/shared/EventFilter/CustomFilters/index.js deleted file mode 100644 index 29dfa472a..000000000 --- a/frontend/app/components/shared/EventFilter/CustomFilters/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './CustomFilters'; \ No newline at end of file diff --git a/frontend/app/components/shared/EventFilter/DurationFilter/DurationFilter.js b/frontend/app/components/shared/EventFilter/DurationFilter/DurationFilter.js deleted file mode 100644 index 87e9a22b8..000000000 --- a/frontend/app/components/shared/EventFilter/DurationFilter/DurationFilter.js +++ /dev/null @@ -1,65 +0,0 @@ -import { Input, Label } from 'semantic-ui-react'; -import styles from './durationFilter.css'; - -const fromMs = value => value ? `${ value / 1000 / 60 }` : '' -const toMs = value => value !== '' ? value * 1000 * 60 : null -export default class DurationFilter extends React.PureComponent { - state = { focused: false } - onChange = (e, { name, value }) => { - const { onChange } = this.props; - if (typeof onChange === 'function') { - onChange({ - [ name ]: toMs(value), - }); - } - } - - onKeyPress = e => { - const { onEnterPress } = this.props; - if (e.key === 'Enter' && typeof onEnterPress === 'function') { - onEnterPress(e); - } - } - - render() { - const { - minDuration, - maxDuration, - } = this.props; - - return ( -
    - this.setState({ focused: true })} - onBlur={this.props.onBlur} - > - - - - this.setState({ focused: true })} - onBlur={this.props.onBlur} - > - - - -
    - ); - } -} diff --git a/frontend/app/components/shared/EventFilter/DurationFilter/durationFilter.css b/frontend/app/components/shared/EventFilter/DurationFilter/durationFilter.css deleted file mode 100644 index c7a272458..000000000 --- a/frontend/app/components/shared/EventFilter/DurationFilter/durationFilter.css +++ /dev/null @@ -1,24 +0,0 @@ -.wrapper { - display: flex; - justify-content: space-between; - - & input { - max-width: 85px !important; - font-size: 13px !important; - font-weight: 400 !important; - color: $gray-medium !important; - } - - & > div { - &:first-child { - margin-right: 10px; - } - } -} - -.label { - font-size: 13px !important; - font-weight: 400 !important; - color: $gray-medium !important; -} - diff --git a/frontend/app/components/shared/EventFilter/EventDropdownItem.js b/frontend/app/components/shared/EventFilter/EventDropdownItem.js deleted file mode 100644 index 8d6d58f0a..000000000 --- a/frontend/app/components/shared/EventFilter/EventDropdownItem.js +++ /dev/null @@ -1,32 +0,0 @@ -import { TYPES } from 'Types/filter/event'; -import cn from 'classnames'; -import { Icon } from 'UI'; -import cls from './eventDropdownItem.css'; - - -const getText = (event) => { - if (event.type === TYPES.METADATA) { - return `${ event.key }: ${ event.value }`; - } - if (event.target) { - return event.target.label || event.value; - } - return event.value; // both should be? -}; - -export default function EventDropdownItem({ event }) { - return ( -
    - -
    - { getText(event) } -
    -
    - ); -} diff --git a/frontend/app/components/shared/EventFilter/EventEditor.js b/frontend/app/components/shared/EventFilter/EventEditor.js deleted file mode 100644 index 4fe2c5ee8..000000000 --- a/frontend/app/components/shared/EventFilter/EventEditor.js +++ /dev/null @@ -1,106 +0,0 @@ -import { connect } from 'react-redux'; -// import { DNDSource, DNDTarget } from 'Components/hocs/dnd'; -import Event, { TYPES } from 'Types/filter/event'; -import { operatorOptions } from 'Types/filter'; -import { editEvent, removeEvent, clearEvents, applyFilter } from 'Duck/funnelFilters'; -import { Icon } from 'UI'; -import stl from './eventEditor.css'; -import { debounce } from 'App/utils'; -import AttributeValueField from './Attributes/AttributeValueField'; -import OperatorDropdown from './Attributes/OperatorDropdown'; -import CustomFilters from './CustomFilters'; -import FilterSelectionButton from './FilterSelectionButton'; - -const getPlaceholder = ({ type }) => { - if (type === TYPES.INPUT) return "E.g. First Name"; - if (type === TYPES.LOCATION) return "Specify URL / Path"; - if (type === TYPES.CONSOLE) return "Specify Error Message"; - if (type === TYPES.CUSTOM) return "Specify Custom Event Name"; - return ''; -}; - -const getLabel = ({ type }) => { - if (type === TYPES.INPUT) return "Specify Value"; - return getPlaceholder({ type }); -}; - -// @DNDTarget('event') -// @DNDSource('event') -@connect(state => ({ - isLastEvent: state.getIn([ 'filters', 'appliedFilter', 'events' ]).size === 1, - funnel: state.getIn(['funnels', 'instance']), -}), { editEvent, removeEvent, clearEvents, applyFilter }) -export default class EventEditor extends React.PureComponent { - applyFilter = debounce(this.props.applyFilter, 1000) - - onChange = (e, { name, value }) => { - const { index, funnel } = this.props; - this.props.editEvent(index, { [name]: value }, funnel.funnelId); - this.applyFilter(); - } - - onTargetChange = (e, {target}) => { - const { index, event } = this.props; - this.props.editEvent(index, {target}); - this.applyFilter(); - } - - onCheckboxChange = ({ target: { name, checked }}) => { - this.props.editEvent(this.props.index, name, checked); - } - - remove = () => { - const { funnel } = this.props; - this.props.removeEvent(this.props.index, funnel.funnelId); - this.applyFilter() - }; - - render() { - const { - event, - index, - isDragging, - connectDragSource, - connectDropTarget, - } = this.props; - - const _operatorOptions = operatorOptions(event); - - const dndBtn = connectDragSource( - - ); - - return connectDropTarget( -
    -
    -
    { index + 1 }
    - - } - filterType="event" - /> - - - - -
    -
    - { dndBtn } - -
    -
    - ); - } -} diff --git a/frontend/app/components/shared/EventFilter/EventFilter.js b/frontend/app/components/shared/EventFilter/EventFilter.js deleted file mode 100644 index ca3db8fc5..000000000 --- a/frontend/app/components/shared/EventFilter/EventFilter.js +++ /dev/null @@ -1,133 +0,0 @@ -import { connect } from 'react-redux'; -// import { DNDContext } from 'Components/hocs/dnd'; -import { - addEvent, applyFilter, moveEvent, clearEvents, - addCustomFilter, addAttribute, setSearchQuery, setActiveFlow, setFilterOption -} from 'Duck/funnelFilters'; -import { updateFunnelFilters, refresh as refreshFunnel } from 'Duck/funnels'; -import { fetchList as fetchEventList } from 'Duck/events'; -import { debounce } from 'App/utils'; -import OutsideClickDetectingDiv from 'Shared/OutsideClickDetectingDiv'; -import EventEditor from './EventEditor'; -import ListHeader from '../../BugFinder/ListHeader'; -import { IconButton } from 'UI'; -import stl from './eventFilter.css'; -import Attributes from './Attributes'; -import CustomFilters from './CustomFilters'; - -@connect(state => ({ - funnel: state.getIn([ 'funnels', 'instance' ]), - events: state.getIn([ 'funnelFilters', 'appliedFilter', 'events' ]), - filters: state.getIn([ 'funnelFilters', 'appliedFilter', 'filters' ]), - appliedFilter: state.getIn([ 'funnelFilters', 'appliedFilter' ]), - searchQuery: state.getIn([ 'funnelFilters', 'searchQuery' ]), - appliedFilterKeys: state.getIn([ 'funnelFilters', 'appliedFilter', 'filters' ]) - .map(({type}) => type).toJS(), - searchedEvents: state.getIn([ 'events', 'list' ]), - loading: state.getIn([ 'funnels', 'updateRequest', 'loading' ]) -}), { - applyFilter, - addEvent, - moveEvent, - fetchEventList, - clearEvents, - addCustomFilter, - addAttribute, - setSearchQuery, - setActiveFlow, - setFilterOption, - updateFunnelFilters, - refreshFunnel -}) -// @DNDContext -export default class EventFilter extends React.PureComponent { - state = { search: '', showFilterModal: false, showPlacehoder: true, showSaveModal: false } - fetchEventList = debounce(this.props.fetchEventList, 500) - inputRef = React.createRef() - - onBlur = () => { - const { searchQuery } = this.props; - this.setState({ showPlacehoder: searchQuery === '' }); - } - - onFocus = () => { - this.setState({ showPlacehoder: false, showFilterModal: true }); - } - - onSearchChange = (e, { value }) => { - this.props.setSearchQuery(value) - if (value !== '') this.fetchEventList({ q: value }); - } - - closeModal = () => { - this.setState({ showPlacehoder: true, showFilterModal: false }) - } - - clearEvents = () => { - this.props.clearEvents(); - this.props.setActiveFlow(null) - } - - saveFunnel = () => { - const { funnel, filters, events } = this.props; - const _filters = { ...funnel.toData().filter }; - this.props.updateFunnelFilters(funnel.funnelId, { ..._filters, filters: filters.toJS(), events: events.toJS() }).then(function() { - this.props.refreshFunnel(funnel.funnelId); - }.bind(this)) - } - - render() { - const { - events, - loading, - onHide - } = this.props; - - return ( - -
    - { events.size > 0 && - <> -
    - { events.map((event, i) => ( - - )) } - - } - -
    - -
    -
    - - -
    - } - showFilters={ true } - /> -
    -
    -
    - -
    - -
    -
    - -
    - ); - } -} diff --git a/frontend/app/components/shared/EventFilter/FilterItem.js b/frontend/app/components/shared/EventFilter/FilterItem.js deleted file mode 100644 index 423ab47fb..000000000 --- a/frontend/app/components/shared/EventFilter/FilterItem.js +++ /dev/null @@ -1,15 +0,0 @@ -import React from 'react'; -import { Icon } from 'UI'; -import stl from './filterItem.css'; -import cn from 'classnames'; - -const FilterItem = ({ className = '', icon, label, onClick }) => { - return ( -
    - - { label } -
    - ); -}; - -export default FilterItem; diff --git a/frontend/app/components/shared/EventFilter/FilterModal/FilterModal.js b/frontend/app/components/shared/EventFilter/FilterModal/FilterModal.js deleted file mode 100644 index 2b8219894..000000000 --- a/frontend/app/components/shared/EventFilter/FilterModal/FilterModal.js +++ /dev/null @@ -1,138 +0,0 @@ -import React from 'react'; -import cn from 'classnames'; -import { connect } from 'react-redux'; -import { getRE } from 'App/utils'; -import { defaultFilters } from 'Types/filter'; -import { KEYS } from 'Types/filter/customFilter'; -import { - applyFilter, setActiveKey, addEvent, - removeEvent, setFilterOptions, - addAttribute, removeAttribute -} from 'Duck/funnelFilters'; -import { debounce } from 'App/utils'; -import FilterItem from '../FilterItem'; -import logger from 'App/logger'; - -import stl from './filterModal.css'; - -const customFilterAutoCompleteKeys = ['METADATA', KEYS.CLICK, KEYS.USER_BROWSER, KEYS.USER_OS, KEYS.USER_DEVICE, KEYS.REFERRER] - -@connect(state => ({ - filter: state.getIn([ 'funnelFilters', 'appliedFilter' ]), - customFilters: state.getIn([ 'funnelFilters', 'customFilters' ]), - variables: state.getIn([ 'customFields', 'list' ]), - sources: state.getIn([ 'customFields', 'sources' ]), - funnel: state.getIn(['funnels', 'instance']), -}), { - applyFilter, - setActiveKey, - addEvent, - removeEvent, - addAttribute, - removeAttribute, - setFilterOptions -}) -export default class FilterModal extends React.PureComponent { - state = { query: '' } - applyFilter = debounce(this.props.applyFilter, 300); - - onFilterClick = (filter, apply) => { - const { funnel } = this.props; - const key = filter.key || filter.type; - this.addFilter(filter); - if (apply || filter.hasNoValue) { - this.applyFilter(null, funnel.funnelId); - } - } - - renderFilterItem(type, filter) { - return ( - this.onFilterClick(filter) } - /> - ); - } - - addFilter = (filter) => { - const { index, filterType, filter: { filters } } = this.props; - this.props.close(); - - if (filter.isFilter || filter.type === 'METADATA') { - logger.log('Adding Filter', filter) - const _index = filterType === 'filter' ? index : undefined; // should add new one if coming from events - const _in = filters.findIndex(e => e.type === 'USERID'); - this.props.addAttribute(filter, _in >= 0 ? _in : _index); - } else { - logger.log('Adding Event', filter) - const _index = filterType === 'event' ? index : undefined; // should add new one if coming from filters - this.props.addEvent(filter, false, _index); - } - - if (filterType === 'event' && filter.isFilter) { // selected a filter from events - this.props.removeEvent(index); - } - - if (filterType === 'filter' && !filter.isFilter) { // selected an event from filters - this.props.removeAttribute(index); - } - }; - - renderList(type, list) { - const blocks = []; - for (let j = 0; j < list.length; j++) { - blocks.push( -
    - { list[ j ] && this.renderFilterItem(type, list[ j ]) } -
    - ); - } - return blocks; - } - - test = (value = '') => getRE(this.props.searchQuery, 'i').test(value); - - render() { - const { - displayed, - customFilters, - filter, - } = this.props; - const { query } = this.state; - const reg = getRE(query, 'i'); - const _appliedFilterKeys = filter.filters.map(({type}) => type).toJS(); - const filteredList = defaultFilters.map(cat => { - let _keys = []; - if (query.length === 0 && cat.type === 'custom') { // default show limited custom fields - _keys = cat.keys.slice(0, 9).filter(({key}) => reg.test(key)) - } else { - _keys = cat.keys.filter(({key}) => reg.test(key)); - } - return { - ...cat, - keys: _keys - .filter(({key, filterKey}) => !_appliedFilterKeys.includes(filterKey) && !customFilters.has(filterKey || key) && !filter.get(filterKey || key)) - } - }).filter(cat => cat.keys.length > 0); - - - return (!displayed ? null : -
    -
    - { - filteredList.map(category => ( -
    -
    { category.category }
    -
    - { this.renderList(category.type, category.keys) } -
    -
    - )) - } -
    -
    - ); - } -} diff --git a/frontend/app/components/shared/EventFilter/FilterModal/filterModal.css b/frontend/app/components/shared/EventFilter/FilterModal/filterModal.css deleted file mode 100644 index 7637bca00..000000000 --- a/frontend/app/components/shared/EventFilter/FilterModal/filterModal.css +++ /dev/null @@ -1,90 +0,0 @@ -.modal { - position: absolute; - left: 0; - background-color: white; - min-width: 705px; - max-width: calc(100vw - 500px); - border-radius: 3px; - border: solid thin $gray-light; - box-shadow: 0 2px 10px 0 $gray-light; - z-index: 99; - padding: 20px; -} - -.hint { - color: $gray-light; - font-size: 12px; - padding-bottom: 5px; -} - -h5.title { - margin: 10px 0 3px; -} - -.filterListDynamic { - max-height: 350px; - overflow-y: auto; - - &::-webkit-scrollbar { - width: 2px; - } - - &::-webkit-scrollbar-thumb { - background: transparent; - } - &::-webkit-scrollbar-track { - background: transparent; - } - &:hover { - &::-webkit-scrollbar-track { - background: #f3f3f3; - } - &::-webkit-scrollbar-thumb { - background: $gray-medium; - } - } - - - & .header { - margin-bottom: 10px; - font-size: 13px; - color: #596764; - white-space: nowrap; - text-transform: uppercase; - font-weight: 600; - letter-spacing: 0.1em; - text-align: left; - } - - & .list { - margin-left: -8px; - } -} - -.filterListStatic { - display: flex; - flex-wrap: wrap; - flex-direction: column; - max-height: 33rem; - min-height: 20px; - color: $gray-medium; - - & .header { - margin-bottom: 10px; - font-size: 13px; - color: #596764; - white-space: nowrap; - text-transform: uppercase; - font-weight: 600; - letter-spacing: 0.1em; - text-align: left; - } - - & .list { - margin-left: -8px; - } - - & .filterGroup { - width: 205px; - } -} \ No newline at end of file diff --git a/frontend/app/components/shared/EventFilter/FilterModal/index.js b/frontend/app/components/shared/EventFilter/FilterModal/index.js deleted file mode 100644 index 0b69a5e64..000000000 --- a/frontend/app/components/shared/EventFilter/FilterModal/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './FilterModal' \ No newline at end of file diff --git a/frontend/app/components/shared/EventFilter/FilterSelectionButton.js b/frontend/app/components/shared/EventFilter/FilterSelectionButton.js deleted file mode 100644 index 7779f0ebd..000000000 --- a/frontend/app/components/shared/EventFilter/FilterSelectionButton.js +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react'; -import { Icon } from 'UI'; -import stl from './filterSelectionButton.css'; - -const FilterSelectionButton = ({ label }) => { - return ( -
    - { label } - -
    - ); -}; - -export default FilterSelectionButton; diff --git a/frontend/app/components/shared/EventFilter/ListHeader.js b/frontend/app/components/shared/EventFilter/ListHeader.js deleted file mode 100644 index 0c7801ce8..000000000 --- a/frontend/app/components/shared/EventFilter/ListHeader.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import stl from './listHeader.css'; - -const ListHeader = ({ title }) => { - return ( -
    { title }
    - ); -}; - -export default ListHeader; diff --git a/frontend/app/components/shared/EventFilter/RandomPlaceholder.js b/frontend/app/components/shared/EventFilter/RandomPlaceholder.js deleted file mode 100644 index d2534bd63..000000000 --- a/frontend/app/components/shared/EventFilter/RandomPlaceholder.js +++ /dev/null @@ -1,99 +0,0 @@ -import React from 'react'; -import { RandomElement } from 'UI'; -import stl from './randomPlaceholder.css'; -import Event, { TYPES } from 'Types/filter/event'; -import CustomFilter, { KEYS } from 'Types/filter/customFilter'; -import { defaultFilters } from 'Types/filter'; - -const getLabel = (type) => { - if (type === KEYS.MISSING_RESOURCE) return 'Missing Resource'; - if (type === KEYS.SLOW_SESSION) return 'Slow Sessions'; - if (type === KEYS.USER_COUNTRY) return 'Country'; - if (type === KEYS.USER_BROWSER) return 'Browser'; - if (type === KEYS.USERID) return 'User Id'; -} - -const getObject = (type, key) => { - switch(type) { - case TYPES.CLICK: - case TYPES.INPUT: - case TYPES.ERROR: - case TYPES.LOCATION: - return Event({ type, key: type }); - case KEYS.JOURNEY: - return [ - Event({ type: TYPES.LOCATION, key: TYPES.LOCATION }), - Event({ type: TYPES.LOCATION, key: TYPES.LOCATION }), - Event({ type: TYPES.CLICK, key: TYPES.CLICK }) - ] - - case KEYS.USER_BROWSER: - return CustomFilter({type, key: type, isFilter: true, label: getLabel(type), value: ['Chrome'] }); - case TYPES.METADATA: - return CustomFilter({type, key, isFilter: true, label: key }); - case TYPES.USERID: - return CustomFilter({type, key, isFilter: true, label: key }); - case KEYS.USER_COUNTRY: - return CustomFilter({type, key: type, isFilter: true, value: ['FR'], label: getLabel(type) }); - case KEYS.SLOW_SESSION: - case KEYS.MISSING_RESOURCE: - return CustomFilter({type, key: type, hasNoValue: true, isFilter: true, label: getLabel(type) }); - } -} - -const getList = (onClick, appliedFilterKeys) => { - let list = [ - { - key: KEYS.CLICK, - element:
    Find sessions with onClick(e, getObject(TYPES.CLICK))}>Click
    - }, - { - key: KEYS.INPUT, - element:
    Find sessions with onClick(e, getObject(TYPES.INPUT))}>Input
    - }, - { - key: KEYS.ERROR, - element:
    Find sessions with onClick(e, getObject(TYPES.ERROR))}>Errors
    - }, - { - key: KEYS.LOCATION, - element:
    Find sessions with onClick(e, getObject(TYPES.LOCATION))}>URL
    - }, - { - key: TYPES.USERID, - element:
    Find sessions with onClick(e, getObject(TYPES.USERID))}>User ID
    - }, - - // { - // key: KEYS.MISSING_RESOURCE, - // element:
    Find sessions with onClick(e, getObject(KEYS.MISSING_RESOURCE))}>Missing Images
    - // }, - // { - // key: KEYS.SLOW_SESSION, - // element:
    Find onClick(e, getObject(KEYS.SLOW_SESSION))}>Slow sessions
    - // }, - - { - key: KEYS.JOURNEY, - element:
    Find sessions in a onClick(e, getObject(KEYS.JOURNEY))}>Journey
    - }, - { - key: KEYS.USER_COUNTRY, - element:
    Find sessions from onClick(e, getObject(KEYS.USER_COUNTRY))}>France
    - }, - { - key: KEYS.USER_BROWSER, - element:
    Find sessions on onClick(e, getObject(KEYS.USER_BROWSER))}>Chrome
    - }, - ] - - return list.filter(({key}) => !appliedFilterKeys.includes(key)) -} - -const RandomPlaceholder = ({ onClick, appliedFilterKeys }) => { - return ( - - ); -}; - -export default RandomPlaceholder; diff --git a/frontend/app/components/shared/EventFilter/TypeBadge.js b/frontend/app/components/shared/EventFilter/TypeBadge.js deleted file mode 100644 index 810c93da7..000000000 --- a/frontend/app/components/shared/EventFilter/TypeBadge.js +++ /dev/null @@ -1,45 +0,0 @@ -import cn from 'classnames'; -import { TYPES } from 'Types/filter/event'; -import { SENTRY, DATADOC } from 'Types/session/stackEvent'; -import { LEVEL } from 'Types/session/log'; // TODO: no types mess -import { Icon } from 'UI'; - -import styles from './typeBadge.css'; - -function getText(type, source) { - if (type === TYPES.CLICK) return 'Click'; - if (type === TYPES.LOCATION) return 'URL'; - if (type === TYPES.INPUT) return 'Input'; - if (type === TYPES.CONSOLE) return 'Console'; - if (type === TYPES.GRAPHQL) return 'GraphQL'; - if (type === TYPES.ERROR) return 'Error'; - if (type === TYPES.STATEACTION) return 'Store Action'; - if (type === TYPES.FETCH) return 'Fetch'; - if (type === TYPES.REVID) return 'Rev ID'; - if (type === TYPES.METADATA) return 'Metadata'; - if (type === TYPES.CUSTOM) { - if (!source) return 'Custom'; - return ( - - - { 'Custom' } - - ); - } - return '?'; -} - -const TypeBadge = ({ event: { type, level, source } }) => ( -
    - { getText(type, source) } -
    -); - -TypeBadge.displayName = 'TypeBadge'; - -export default TypeBadge; diff --git a/frontend/app/components/shared/EventFilter/eventDropdownItem.css b/frontend/app/components/shared/EventFilter/eventDropdownItem.css deleted file mode 100644 index a6f7dc4d1..000000000 --- a/frontend/app/components/shared/EventFilter/eventDropdownItem.css +++ /dev/null @@ -1,26 +0,0 @@ -.eventDropdownItem { - padding: 8px 0; - padding-left: 18px; - border-bottom: solid thin $gray-light; - - &:last-child { - border-bottom: solid thin transparent; - } - - & .values { - max-width: 400px; - overflow: hidden; - text-overflow: ellipsis; - - &.inputType, - &.clickType { - color: $gray-darkest !important; - font-size: 14px; - } - - &.consoleType { - font-family: 'menlo', 'monaco', 'consolas', monospace; - font-size: 12px; - } - } -} \ No newline at end of file diff --git a/frontend/app/components/shared/EventFilter/eventEditor.css b/frontend/app/components/shared/EventFilter/eventEditor.css deleted file mode 100644 index cd004795b..000000000 --- a/frontend/app/components/shared/EventFilter/eventEditor.css +++ /dev/null @@ -1,70 +0,0 @@ -@import 'mixins.css'; -@import 'icons.css'; - -.wrapper { - width: 100%; - display: flex; - padding: 8px 15px; - background-color: white; - border-bottom: solid thin $gray-lightest; - transition: all 0.4s; - - &:last-child { - border-bottom: solid thin transparent; - } - - &:hover { - background-color: $active-blue; - transition: all 0.2s; - - & .actions { - opacity: 1; - transition: all 0.2s; - } - } - - & .leftSection, - & .actions { - display: flex; - align-items: center; - } - - & .leftSection { - flex: 1; - & > div { - margin-right: 10px; - flex-shrink: 0; - } - } -} - -.index { - background: $white; - width: 24px; - height: 24px; - border-radius: 12px; - margin-right: 10px; - color: $gray-medium; - font-weight: 300; - font-size: 12px; - display: flex; - align-items: center; - justify-content: center; - user-select: none; - box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1) inset; -} - -.button { - width: 25px; - height: 25px; - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; - margin-left: 10px; -} - -.actions { - opacity: 0; - transition: all 0.4s; -} \ No newline at end of file diff --git a/frontend/app/components/shared/EventFilter/eventFilter.css b/frontend/app/components/shared/EventFilter/eventFilter.css deleted file mode 100644 index 22b7485cd..000000000 --- a/frontend/app/components/shared/EventFilter/eventFilter.css +++ /dev/null @@ -1,59 +0,0 @@ -.searchField { - box-shadow: none !important; - & input { - box-shadow: none !important; - border-radius: 3 !important; - border: solid thin $gray-light !important; - height: 46px !important; - font-size: 16px; - } -} - -.wrapper { - box-shadow: none !important; - position: relative; - - & .clearStepsButton { - position: absolute; - bottom: 10px; - right: 10x; - } -} - -.randomElement { - position: absolute; - left: 0; - top: 0; - right: 0; - z-index: 8; - padding: 15px; - padding-left: 40px; -} - -.dropdownMenu { - max-width: 100%; - border-top-left-radius: 0 !important; - border-top-right-radius: 0 !important; - - &[data-hidden=true] { - display: none !important; - } -} - - -.header { - padding: 5px 10px; - letter-spacing: 1.5px; - background-color: $gray-lightest; - color: $gray-medium; - font-size: 12px; - text-transform: uppercase; -} - -.dateRange { - color: red; - z-index: 8; - position: absolute; - right: 9px; - top: 9px; -} \ No newline at end of file diff --git a/frontend/app/components/shared/EventFilter/filterItem.css b/frontend/app/components/shared/EventFilter/filterItem.css deleted file mode 100644 index 2840f2119..000000000 --- a/frontend/app/components/shared/EventFilter/filterItem.css +++ /dev/null @@ -1,20 +0,0 @@ -.filterItem { - display: flex; - align-items: center; - padding: 8px; - cursor: pointer; - border-radius: 3px; - transition: all 0.4s; - margin-bottom: 5px; - max-width: 100%; - & .label { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - &:hover { - background-color: $gray-lightest; - transition: all 0.2s; - } -} \ No newline at end of file diff --git a/frontend/app/components/shared/EventFilter/filterModal.css b/frontend/app/components/shared/EventFilter/filterModal.css deleted file mode 100644 index 2c1ab00f0..000000000 --- a/frontend/app/components/shared/EventFilter/filterModal.css +++ /dev/null @@ -1,90 +0,0 @@ -.modal { - position: absolute; - left: 0; - background-color: white; - min-width: 705px; - max-width: calc(100vw - 500px); - border-radius: 3px; - border: solid thin $gray-light; - box-shadow: 0 2px 10px 0 $gray-light; - z-index: 99; - padding: 20px; -} - -.hint { - color: $gray-light; - font-size: 12px; - padding-bottom: 5px; -} - -h5.title { - margin: 10px 0 3px; -} - -.filterListDynamic { - max-height: 350px; - overflow-y: auto; - - &::-webkit-scrollbar { - width: 2px; - } - - &::-webkit-scrollbar-thumb { - background: transparent; - } - &::-webkit-scrollbar-track { - background: transparent; - } - &:hover { - &::-webkit-scrollbar-track { - background: #f3f3f3; - } - &::-webkit-scrollbar-thumb { - background: $gray-medium; - } - } - - - & .header { - margin-bottom: 10px; - font-size: 13px; - color: #596764; - white-space: nowrap; - text-transform: uppercase; - font-weight: 600; - letter-spacing: 0.1em; - text-align: left; - } - - & .list { - margin-left: -8px; - } -} - -.filterListStatic { - display: flex; - flex-wrap: wrap; - flex-direction: column; - max-height: 30rem; - min-height: 20px; - color: $gray-medium; - - & .header { - margin-bottom: 10px; - font-size: 13px; - color: #596764; - white-space: nowrap; - text-transform: uppercase; - font-weight: 600; - letter-spacing: 0.1em; - text-align: left; - } - - & .list { - margin-left: -8px; - } - - & .filterGroup { - width: 205px; - } -} \ No newline at end of file diff --git a/frontend/app/components/shared/EventFilter/filterSelectionButton.css b/frontend/app/components/shared/EventFilter/filterSelectionButton.css deleted file mode 100644 index 2412cbca4..000000000 --- a/frontend/app/components/shared/EventFilter/filterSelectionButton.css +++ /dev/null @@ -1,23 +0,0 @@ -.wrapper { - display: flex; - align-items: center; - justify-content: space-between; - height: 28px; - border: solid thin rgba(34, 36, 38, 0.15) !important; - border-radius: 4px; - padding: 0 10px; - width: 150px; - color: $gray-darkest; - cursor: pointer; - background-color: rgba(255, 255, 255, 0.8) !important; - &:hover { - background-color: white; - } - & span { - margin-right: 5px; - max-width: 140px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } -} \ No newline at end of file diff --git a/frontend/app/components/shared/EventFilter/index.js b/frontend/app/components/shared/EventFilter/index.js deleted file mode 100644 index 8298d268d..000000000 --- a/frontend/app/components/shared/EventFilter/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './EventFilter'; diff --git a/frontend/app/components/shared/EventFilter/listHeader.css b/frontend/app/components/shared/EventFilter/listHeader.css deleted file mode 100644 index 35b3b6001..000000000 --- a/frontend/app/components/shared/EventFilter/listHeader.css +++ /dev/null @@ -1,7 +0,0 @@ -.header { - padding: 3px 10px; - letter-spacing: 1.5px; - color: $gray-medium; - font-size: 12px; - text-transform: uppercase; -} \ No newline at end of file diff --git a/frontend/app/components/shared/EventFilter/randomPlaceholder.css b/frontend/app/components/shared/EventFilter/randomPlaceholder.css deleted file mode 100644 index c0958d2aa..000000000 --- a/frontend/app/components/shared/EventFilter/randomPlaceholder.css +++ /dev/null @@ -1,17 +0,0 @@ -.placeholder { - color: $gray-medium; - font-weight: 300; - font-size: 16px; - user-select: none; - - & span { - font-weight: 400; - color: $teal; - cursor: pointer; - border-bottom: dashed thin $teal; - - &:hover { - color: $teal-dark; - } - } -} \ No newline at end of file diff --git a/frontend/app/components/shared/EventFilter/typeBadge.css b/frontend/app/components/shared/EventFilter/typeBadge.css deleted file mode 100644 index 2ff7005e4..000000000 --- a/frontend/app/components/shared/EventFilter/typeBadge.css +++ /dev/null @@ -1,23 +0,0 @@ -.badge { - font-size: 11px; - border-radius: 3px; - background-color: white; - border: solid thin $gray-light; - padding: 2px 0; - text-align: center; - width: 66px; - margin-right: 10px; - user-select: none; - - &.red { - background-color: rgba(204, 0, 0, 0.05); - } - - &.yellow { - background-color: rgba(245, 166, 35, 0.05); - } -} - -.icon { - vertical-align: text-top; -} \ No newline at end of file diff --git a/frontend/app/components/shared/FilterDropdown/FilterDropdown.js b/frontend/app/components/shared/FilterDropdown/FilterDropdown.js index 5b8a4ac76..fa9165202 100644 --- a/frontend/app/components/shared/FilterDropdown/FilterDropdown.js +++ b/frontend/app/components/shared/FilterDropdown/FilterDropdown.js @@ -5,7 +5,7 @@ import OutsideClickDetectingDiv from 'Shared/OutsideClickDetectingDiv'; import WidgetAutoComplete from 'Shared/WidgetAutoComplete'; import { getRE } from 'App/utils'; import cn from 'classnames'; -import stl from './filterDropdown.css'; +import stl from './filterDropdown.module.css'; import { countries } from 'App/constants'; import { regionLabels } from 'Types/integrations/cloudwatchConfig'; diff --git a/frontend/app/components/shared/FilterDropdown/filterDropdown.css b/frontend/app/components/shared/FilterDropdown/filterDropdown.module.css similarity index 100% rename from frontend/app/components/shared/FilterDropdown/filterDropdown.css rename to frontend/app/components/shared/FilterDropdown/filterDropdown.module.css diff --git a/frontend/app/components/shared/Filters/FilterAutoComplete/FilterAutoComplete.css b/frontend/app/components/shared/Filters/FilterAutoComplete/FilterAutoComplete.module.css similarity index 100% rename from frontend/app/components/shared/Filters/FilterAutoComplete/FilterAutoComplete.css rename to frontend/app/components/shared/Filters/FilterAutoComplete/FilterAutoComplete.module.css diff --git a/frontend/app/components/shared/Filters/FilterAutoComplete/FilterAutoComplete.tsx b/frontend/app/components/shared/Filters/FilterAutoComplete/FilterAutoComplete.tsx index fb0eb4a6b..fcec61d6e 100644 --- a/frontend/app/components/shared/Filters/FilterAutoComplete/FilterAutoComplete.tsx +++ b/frontend/app/components/shared/Filters/FilterAutoComplete/FilterAutoComplete.tsx @@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react'; import { Icon, Loader } from 'UI'; import APIClient from 'App/api_client'; import { debounce } from 'App/utils'; -import stl from './FilterAutoComplete.css'; +import stl from './FilterAutoComplete.module.css'; import cn from 'classnames'; const hiddenStyle = { diff --git a/frontend/app/components/shared/Filters/FilterAutoCompleteLocal/FilterAutoCompleteLocal.css b/frontend/app/components/shared/Filters/FilterAutoCompleteLocal/FilterAutoCompleteLocal.module.css similarity index 100% rename from frontend/app/components/shared/Filters/FilterAutoCompleteLocal/FilterAutoCompleteLocal.css rename to frontend/app/components/shared/Filters/FilterAutoCompleteLocal/FilterAutoCompleteLocal.module.css diff --git a/frontend/app/components/shared/Filters/FilterAutoCompleteLocal/FilterAutoCompleteLocal.tsx b/frontend/app/components/shared/Filters/FilterAutoCompleteLocal/FilterAutoCompleteLocal.tsx index 2030d422a..38dabe535 100644 --- a/frontend/app/components/shared/Filters/FilterAutoCompleteLocal/FilterAutoCompleteLocal.tsx +++ b/frontend/app/components/shared/Filters/FilterAutoCompleteLocal/FilterAutoCompleteLocal.tsx @@ -1,6 +1,6 @@ import React, { useState, useEffect } from 'react'; import { Icon } from 'UI'; -import stl from './FilterAutoCompleteLocal.css'; +import stl from './FilterAutoCompleteLocal.module.css'; interface Props { showOrButton?: boolean; showCloseButton?: boolean; diff --git a/frontend/app/components/shared/Filters/FilterDuration/FilterDuration.js b/frontend/app/components/shared/Filters/FilterDuration/FilterDuration.js index 7fe5b725a..6183c6311 100644 --- a/frontend/app/components/shared/Filters/FilterDuration/FilterDuration.js +++ b/frontend/app/components/shared/Filters/FilterDuration/FilterDuration.js @@ -1,5 +1,7 @@ -import { Input, Label } from 'semantic-ui-react'; -import styles from './FilterDuration.css'; +import React from 'react'; +// import { Input, Label } from 'semantic-ui-react'; +import styles from './FilterDuration.module.css'; +import { Input } from 'UI' const fromMs = value => value ? `${ value / 1000 / 60 }` : '' const toMs = value => value !== '' ? value * 1000 * 60 : null @@ -30,36 +32,36 @@ export default class FilterDuration extends React.PureComponent { return (
    - this.setState({ focused: true })} - onBlur={this.props.onBlur} - > - - - - this.setState({ focused: true })} - onBlur={this.props.onBlur} - > - - - +
    + { 'Min' } + this.setState({ focused: true })} + onBlur={this.props.onBlur} + style={{ height: '26px' }} + /> +
    +
    + { 'Max' } + this.setState({ focused: true })} + onBlur={this.props.onBlur} + style={{ height: '26px' }} + /> +
    ); } diff --git a/frontend/app/components/shared/Filters/FilterDuration/FilterDuration.css b/frontend/app/components/shared/Filters/FilterDuration/FilterDuration.module.css similarity index 100% rename from frontend/app/components/shared/Filters/FilterDuration/FilterDuration.css rename to frontend/app/components/shared/Filters/FilterDuration/FilterDuration.module.css diff --git a/frontend/app/components/shared/Filters/FilterItem/FilterItem.tsx b/frontend/app/components/shared/Filters/FilterItem/FilterItem.tsx index 579a74231..36330db44 100644 --- a/frontend/app/components/shared/Filters/FilterItem/FilterItem.tsx +++ b/frontend/app/components/shared/Filters/FilterItem/FilterItem.tsx @@ -52,7 +52,9 @@ function FilterItem(props: Props) { return (
    - { !isFilter &&
    {filterIndex+1}
    } + { !isFilter &&
    + {filterIndex+1} +
    } {/* Filter with Source */} diff --git a/frontend/app/components/shared/Filters/FilterList/FilterList.tsx b/frontend/app/components/shared/Filters/FilterList/FilterList.tsx index 619953ec5..a75843709 100644 --- a/frontend/app/components/shared/Filters/FilterList/FilterList.tsx +++ b/frontend/app/components/shared/Filters/FilterList/FilterList.tsx @@ -37,12 +37,10 @@ function FilterList(props: Props) {
    Events Order
    } content={ `Select the operator to be applied between events in your search.` } - size="tiny" - inverted - position="top center" - /> + > +
    Events Order
    +
    ) => { diff --git a/frontend/app/components/shared/Filters/FilterOperator/FilterOperator.css b/frontend/app/components/shared/Filters/FilterOperator/FilterOperator.module.css similarity index 100% rename from frontend/app/components/shared/Filters/FilterOperator/FilterOperator.css rename to frontend/app/components/shared/Filters/FilterOperator/FilterOperator.module.css diff --git a/frontend/app/components/shared/Filters/FilterOperator/FilterOperator.tsx b/frontend/app/components/shared/Filters/FilterOperator/FilterOperator.tsx index ba2482ac8..9e91df59f 100644 --- a/frontend/app/components/shared/Filters/FilterOperator/FilterOperator.tsx +++ b/frontend/app/components/shared/Filters/FilterOperator/FilterOperator.tsx @@ -1,10 +1,58 @@ import React from 'react'; -import cn from 'classnames'; -import { Dropdown, Icon } from 'UI'; -import stl from './FilterOperator.css'; +import Select from 'Shared/Select'; +const dropdownStyles = { + control: (provided: any) => { + const obj = { + ...provided, + border: 'solid thin #ddd !important', + boxShadow: 'none !important', + cursor: 'pointer', + height: '26px', + minHeight: '26px', + backgroundColor: '#f6f6f6', + '&:hover': { + backgroundColor: '#EEEEEE', + }, + } + return obj; + }, + valueContainer: (provided: any) => ({ + ...provided, + paddingRight: '0px', + width: 'fit-content', + // height: '26px' + }), + placeholder: (provided: any) => ({ + ...provided, + }), + indicatorsContainer: (provided: any) => ({ + ...provided, + padding: '0px', + height: '26px', + }), + option: (provided: any, state: any) => ({ + ...provided, + whiteSpace: 'nowrap', + }), + menu: (provided: any, state: any) => ({ + ...provided, + top: 20, + left: 0, + minWidth: 'fit-content', + }), + container: (provided: any) => ({ + ...provided, + minWidth: "max-content", + }), + singleValue: (provided: any, state: { isDisabled: any; }) => { + const opacity = state.isDisabled ? 0.5 : 1; + const transition = 'opacity 300ms'; + + return { ...provided, opacity, transition }; + } +} interface Props { - // filter: any; // event/filter onChange: (e, { name, value }) => void; className?: string; options?: any; @@ -14,15 +62,16 @@ function FilterOperator(props: Props) { const { options, value, onChange, className = '' } = props; return ( - } - /> +
    + { savedSearch.exists() &&
    Changes in filters will be updated.
    } - -
    + +
    - +
    - { savedSearch && } - +
    ); } diff --git a/frontend/app/components/shared/SavedSearch/SavedSearch.css b/frontend/app/components/shared/SavedSearch/SavedSearch.module.css similarity index 100% rename from frontend/app/components/shared/SavedSearch/SavedSearch.css rename to frontend/app/components/shared/SavedSearch/SavedSearch.module.css diff --git a/frontend/app/components/shared/SavedSearch/SavedSearch.tsx b/frontend/app/components/shared/SavedSearch/SavedSearch.tsx index 2d9093c04..92b6585bc 100644 --- a/frontend/app/components/shared/SavedSearch/SavedSearch.tsx +++ b/frontend/app/components/shared/SavedSearch/SavedSearch.tsx @@ -1,11 +1,9 @@ -import React, { useState, useEffect } from 'react'; +import React, { useEffect } from 'react'; import { Button, Icon } from 'UI'; -import SavedSearchDropdown from './components/SavedSearchDropdown'; import { connect } from 'react-redux'; import { fetchList as fetchListSavedSearch } from 'Duck/search'; -import OutsideClickDetectingDiv from 'Shared/OutsideClickDetectingDiv'; import cn from 'classnames'; -import stl from './SavedSearch.css'; +import stl from './SavedSearch.module.css'; import { useModal } from 'App/components/Modal'; import SavedSearchModal from './components/SavedSearchModal' @@ -14,10 +12,9 @@ interface Props { list: any; savedSearch: any; } -function SavedSearch(props) { +function SavedSearch(props: Props) { const { list } = props; const { savedSearch } = props; - const [showMenu, setShowMenu] = useState(false) const { showModal } = useModal(); useEffect(() => { @@ -25,44 +22,29 @@ function SavedSearch(props) { }, []) return ( - setShowMenu(false)} - > -
    -
    - - { savedSearch.exists() && ( -
    - - Viewing: - - {savedSearch.name.length > 15 ? `${savedSearch.name.slice(0, 15)}...` : savedSearch.name} - -
    - )} +
    + + { savedSearch.exists() && ( +
    + + Viewing: + + {savedSearch.name.length > 15 ? `${savedSearch.name.slice(0, 15)}...` : savedSearch.name} +
    - - { showMenu && ( -
    - setShowMenu(false)} /> -
    - )} -
    - + )} +
    ); } -export default connect(state => ({ +export default connect((state: any) => ({ list: state.getIn([ 'search', 'list' ]), savedSearch: state.getIn([ 'search', 'savedSearch' ]) }), { fetchListSavedSearch })(SavedSearch); diff --git a/frontend/app/components/shared/SavedSearch/components/SavedSearchDropdown/SavedSearchDropdown.css b/frontend/app/components/shared/SavedSearch/components/SavedSearchDropdown/SavedSearchDropdown.css deleted file mode 100644 index d4451d0bf..000000000 --- a/frontend/app/components/shared/SavedSearch/components/SavedSearchDropdown/SavedSearchDropdown.css +++ /dev/null @@ -1,15 +0,0 @@ -.wrapper { - position: relative; - display: inline-block; - z-index: 999; - display: flex; - flex-direction: column; - max-height: 250px; - overflow-y: auto; -} - -.rowItem { - &:hover { - color: $teal; - } -} \ No newline at end of file diff --git a/frontend/app/components/shared/SavedSearch/components/SavedSearchDropdown/SavedSearchDropdown.tsx b/frontend/app/components/shared/SavedSearch/components/SavedSearchDropdown/SavedSearchDropdown.tsx deleted file mode 100644 index 61f566680..000000000 --- a/frontend/app/components/shared/SavedSearch/components/SavedSearchDropdown/SavedSearchDropdown.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import React from 'react'; -import stl from './SavedSearchDropdown.css'; -import cn from 'classnames'; -import { Icon } from 'UI'; -import { applySavedSearch, remove, edit } from 'Duck/search' -import { connect } from 'react-redux'; -import { confirm } from 'UI/Confirmation'; - -interface Props { - list: Array - applySavedSearch: (filter: any) => void - remove: (id: string) => Promise - onClose: () => void, - edit: (filter: any) => void, -} - -function Row ({ name, isPublic, onClick, onClickEdit, onDelete }) { - return ( -
    -
    {name}
    -
    - { isPublic &&
    } - {/*
    */} - {/*
    */} -
    -
    - ) -} - -function SavedSearchDropdown(props: Props) { - const [query, setQuery] = React.useState(''); - const filteredList = query ? props.list.filter(item => item.name.toLowerCase().includes(query.toLowerCase())) : props.list; - const onClick = (item) => { - props.applySavedSearch(item) - // props.edit(item.filter) - props.onClose() - } - - const onDelete = async (instance) => { - if (await confirm({ - header: 'Confirm', - confirmButton: 'Yes, delete', - confirmation: `Are you sure you want to permanently delete this search?` - })) { - props.remove(instance.alertId).then(() => { - // toggleForm(null, false); - }); - } - } - - const onClickEdit = (instance) => { - // toggleForm(instance); - } - - return ( -
    -
    - setQuery(e.target.value)} - /> -
    - {filteredList.map(item => ( - onClick(item)} - onDelete={() => onDelete(item) } - onClickEdit={() => onClickEdit(item)} - isPublic={item.isPublic} - /> - ))} -
    - ); -} - -export default connect(null, { applySavedSearch, remove, edit })(SavedSearchDropdown); \ No newline at end of file diff --git a/frontend/app/components/shared/SavedSearch/components/SavedSearchDropdown/index.ts b/frontend/app/components/shared/SavedSearch/components/SavedSearchDropdown/index.ts deleted file mode 100644 index 2fea67949..000000000 --- a/frontend/app/components/shared/SavedSearch/components/SavedSearchDropdown/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './SavedSearchDropdown'; \ No newline at end of file diff --git a/frontend/app/components/shared/SavedSearch/components/SavedSearchModal/SavedSearchModal.tsx b/frontend/app/components/shared/SavedSearch/components/SavedSearchModal/SavedSearchModal.tsx index 26d566259..3ee47d379 100644 --- a/frontend/app/components/shared/SavedSearch/components/SavedSearchModal/SavedSearchModal.tsx +++ b/frontend/app/components/shared/SavedSearch/components/SavedSearchModal/SavedSearchModal.tsx @@ -1,16 +1,14 @@ import React, { MouseEvent, useState } from 'react' import cn from 'classnames'; -import { Icon as SemIcon } from 'semantic-ui-react'; import { Icon, Input } from 'UI'; import { List } from 'immutable'; -import { Tooltip } from 'react-tippy' -import { confirm } from 'UI/Confirmation'; +import { confirm, Popup } from 'UI'; import { applySavedSearch, remove, editSavedSearch } from 'Duck/search' import { connect } from 'react-redux'; import { useModal } from 'App/components/Modal'; import { SavedSearch } from 'Types/ts/search' import SaveSearchModal from 'Shared/SaveSearchModal' -import stl from './savedSearchModal.css' +import stl from './savedSearchModal.module.css' interface ITooltipIcon { @@ -21,14 +19,12 @@ interface ITooltipIcon { function TooltipIcon(props: ITooltipIcon) { return (
    props.onClick(e)} > - {/* @ts-ignore - problem with react-tippy types TODO: remove after fix */} - - +
    ) } @@ -76,10 +72,10 @@ function SavedSearchModal(props: Props) { {props.list.size > 1 && (
    } - onChange={(_, v) => setFilterQuery(v.value)} + // className="w-full" + // iconPosition="left" + icon="search" + onChange={({ target: { value }}: any) => setFilterQuery(value)} placeholder="Filter by name" />
    diff --git a/frontend/app/components/shared/SavedSearch/components/SavedSearchModal/savedSearchModal.css b/frontend/app/components/shared/SavedSearch/components/SavedSearchModal/savedSearchModal.module.css similarity index 100% rename from frontend/app/components/shared/SavedSearch/components/SavedSearchModal/savedSearchModal.css rename to frontend/app/components/shared/SavedSearch/components/SavedSearchModal/savedSearchModal.module.css diff --git a/frontend/app/components/shared/ScheduleUpdater/ScheduleUpdater.js b/frontend/app/components/shared/ScheduleUpdater/ScheduleUpdater.js deleted file mode 100644 index 966648894..000000000 --- a/frontend/app/components/shared/ScheduleUpdater/ScheduleUpdater.js +++ /dev/null @@ -1,123 +0,0 @@ -import { connect } from 'react-redux'; -import { Modal, Button, Form, Dropdown, Icon } from 'UI'; -import { save as saveSchedule, edit as editSchedule } from 'Duck/schedules'; -import styles from './scheduleUpdater.css'; - -const HOURS = [ ...Array(24).keys() ].map(i => ({ value: i, text: `${ i > 9 ? '' : '0' }${ i }:00` })); - -const DAYS = [ - { - value: -1, - text: 'Everyday', - }, - { - value: 0, - text: 'Sunday', - }, - { - value: 1, - text: 'Monday', - }, - { - value: 2, - text: 'Tuesday', - }, - { - value: 3, - text: 'Wednesday', - }, - { - value: 4, - text: 'Thursday', - }, - { - value: 5, - text: 'Friday', - }, - { - value: 6, - text: 'Saturday', - }, - -]; - -@connect(state => ({ - loading: state.getIn([ 'schedules', 'saveRequest', 'loading' ]), - schedule: state.getIn([ 'schedules', 'instance' ]), -}), { saveSchedule, editSchedule }) -export default class ScheduleUpdater extends React.PureComponent { - onSave = () => { - const { onClose, schedule } = this.props; - this.props.saveSchedule(schedule) - .then(onClose); - } - - onSelectChanged = (event, { name, value }) => this.props.editSchedule({ [ name ]: value }); - write = ({ target: { name, value } }) => this.props.editSchedule({ [ name ]: value }); - - render() { - const { - onClose, - loading, - schedule, - isDisplayed = schedule.exists(), - } = this.props; - const { hour, day, name } = schedule; - - const isNew = !schedule.exists(); - - return ( - - -
    {'Schedule Test:'}
    - -
    - -
    - - - - - - -
    - - -
    -
    - -
    - - - - -
    - ); - } -} diff --git a/frontend/app/components/shared/ScheduleUpdater/index.js b/frontend/app/components/shared/ScheduleUpdater/index.js deleted file mode 100644 index c06f24f19..000000000 --- a/frontend/app/components/shared/ScheduleUpdater/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './ScheduleUpdater'; diff --git a/frontend/app/components/shared/ScheduleUpdater/scheduleUpdater.css b/frontend/app/components/shared/ScheduleUpdater/scheduleUpdater.css deleted file mode 100644 index be71c5427..000000000 --- a/frontend/app/components/shared/ScheduleUpdater/scheduleUpdater.css +++ /dev/null @@ -1,42 +0,0 @@ -.modalHeader { - display: flex !important; - align-items: center; - justify-content: space-between; -} - - -.title, .nameTitle, .scheduleTitle { - font-family: 'Arial-BoldMT', 'Arial Bold', 'Arial'; - font-weight: 700; -} -.title { - font-size: 14px; -} -.nameTitle, .scheduleTitle { - margin-top: 20px; - margin-bottom: 10px; -} - -.name { - display:block; - text-decoration: none; - border-color: transparent; - background: $gray-lightest; - padding: 9px; - border-radius: 3px; - width: 100%; - - &:focus { - border-color: $teal !important; - } -} - -.schedule { - padding-bottom: 30px; -} - -.scheduleControls { - display: flex; - align-items: center; - justify-content: space-between; -} \ No newline at end of file diff --git a/frontend/app/components/shared/Select/Select.tsx b/frontend/app/components/shared/Select/Select.tsx index 8d963c16b..9a49dc110 100644 --- a/frontend/app/components/shared/Select/Select.tsx +++ b/frontend/app/components/shared/Select/Select.tsx @@ -11,24 +11,29 @@ interface Props { components?: any; [x:string]: any; } -export default function({ plain = false, options, isSearchable = false, components = {}, defaultValue = '', ...rest }: Props) { +export default function({ right = false, plain = false, options, isSearchable = false, components = {}, defaultValue = '', ...rest }: Props) { const customStyles = { - option: (provided, state) => ({ + option: (provided: any, state: any) => ({ ...provided, whiteSpace: 'nowrap', }), - menu: (provided, state) => ({ + menu: (provided: any, state: any) => ({ ...provided, top: 31, + borderRadius: '3px', + right: right ? 0 : undefined, minWidth: 'fit-content', + zIndex: 99, }), - control: (provided) => { + control: (provided: any) => { const obj = { ...provided, border: 'solid thin #ddd', cursor: 'pointer', + minHeight: '36px', } if (plain) { + obj['backgroundColor'] = 'transparent'; obj['border'] = '1px solid transparent' obj['&:hover'] = { borderColor: 'transparent', @@ -43,11 +48,15 @@ export default function({ plain = false, options, isSearchable = false, componen } return obj; }, - valueContainer: (provided) => ({ + indicatorsContainer: (provided: any) => ({ + ...provided, + padding: 0, + }), + valueContainer: (provided: any) => ({ ...provided, paddingRight: '0px', }), - singleValue: (provided, state) => { + singleValue: (provided: any, state: { isDisabled: any; }) => { const opacity = state.isDisabled ? 0.5 : 1; const transition = 'opacity 300ms'; @@ -84,7 +93,7 @@ const DropdownIndicator = ( ) => { return ( - + ); }; \ No newline at end of file diff --git a/frontend/app/components/shared/SelectDateRange/SelectDateRange.tsx b/frontend/app/components/shared/SelectDateRange/SelectDateRange.tsx index 0713b2dc4..b7bfa20e2 100644 --- a/frontend/app/components/shared/SelectDateRange/SelectDateRange.tsx +++ b/frontend/app/components/shared/SelectDateRange/SelectDateRange.tsx @@ -9,11 +9,14 @@ import OutsideClickDetectingDiv from 'Shared/OutsideClickDetectingDiv'; interface Props { period: any, onChange: (data: any) => void; + disableCustom?: boolean; + [x: string]: any; } function SelectDateRange(props: Props) { const [isCustom, setIsCustom] = React.useState(false); - const { period } = props; - const selectedValue = DATE_RANGE_OPTIONS.find(obj => obj.value === period.rangeName) + const { period, disableCustom = false, ...rest } = props; + let selectedValue = DATE_RANGE_OPTIONS.find((obj: any) => obj.value === period.rangeName) + const options = DATE_RANGE_OPTIONS.filter((obj: any) => disableCustom ? obj.value !== CUSTOM_RANGE : true); const onChange = (value: any) => { if (value === CUSTOM_RANGE) { @@ -33,8 +36,8 @@ function SelectDateRange(props: Props) { setShowModal(true) } onBlur={ () => setTimeout(setShowModal, 200, false) } onChange={ onSearchChange } - icon="search" - iconPosition="left" + // icon="search" + // iconPosition="left" placeholder={ 'Search sessions using any captured event (click, input, page, error...)'} - fluid + // fluid id="search" type="search" autoComplete="off" /> { showModal && ( -
    +
    of the sessions +
    This change will impact the timestamp on session card and player.
    diff --git a/frontend/app/components/shared/SessionSettings/components/ListingVisibility.tsx b/frontend/app/components/shared/SessionSettings/components/ListingVisibility.tsx index c5741fb14..ecbbca805 100644 --- a/frontend/app/components/shared/SessionSettings/components/ListingVisibility.tsx +++ b/frontend/app/components/shared/SessionSettings/components/ListingVisibility.tsx @@ -66,7 +66,7 @@ function ListingVisibility(props) { />
    - +
    diff --git a/frontend/app/components/shared/SessionStack/SessionStack.js b/frontend/app/components/shared/SessionStack/SessionStack.js index 550ddb668..394e36ab7 100644 --- a/frontend/app/components/shared/SessionStack/SessionStack.js +++ b/frontend/app/components/shared/SessionStack/SessionStack.js @@ -1,5 +1,5 @@ import React from 'react' -import stl from './sessionStack.css' +import stl from './sessionStack.module.css' import cn from 'classnames'; import { Icon } from 'UI' import { names } from 'Types/watchdog' diff --git a/frontend/app/components/shared/SessionStack/sessionStack.css b/frontend/app/components/shared/SessionStack/sessionStack.module.css similarity index 100% rename from frontend/app/components/shared/SessionStack/sessionStack.css rename to frontend/app/components/shared/SessionStack/sessionStack.module.css diff --git a/frontend/app/components/shared/SharePopup/SharePopup.js b/frontend/app/components/shared/SharePopup/SharePopup.js index 43c960bba..81f1ece5e 100644 --- a/frontend/app/components/shared/SharePopup/SharePopup.js +++ b/frontend/app/components/shared/SharePopup/SharePopup.js @@ -1,11 +1,14 @@ +import React from 'react'; import { connect } from 'react-redux'; import { toast } from 'react-toastify'; import withRequest from 'HOCs/withRequest'; -import { Popup, Dropdown, Icon, IconButton } from 'UI'; +import { Popup, Icon } from 'UI'; import { pause } from 'Player'; -import styles from './sharePopup.css'; +import styles from './sharePopup.module.css'; import IntegrateSlackButton from '../IntegrateSlackButton/IntegrateSlackButton'; import SessionCopyLink from './SessionCopyLink'; +import Select from 'Shared/Select'; +import { Tooltip } from 'react-tippy'; @connect(state => ({ channels: state.getIn([ 'slack', 'list' ]), @@ -19,7 +22,7 @@ import SessionCopyLink from './SessionCopyLink'; export default class SharePopup extends React.PureComponent { state = { comment: '', - isOpen: false, + isOpen: true, channelId: this.props.channels.getIn([ 0, 'webhookId' ]), } @@ -44,19 +47,19 @@ export default class SharePopup extends React.PureComponent { this.handleClose(); } - changeChannel = (e, { value }) => this.setState({ channelId: value }) + changeChannel = ({ value }) => this.setState({ channelId: value }) render() { const { trigger, loading, channels, showCopyLink = false } = this.props; const { comment, isOpen, channelId } = this.state; - const options = channels.map(({ webhookId, name }) => ({ value: webhookId, text: name })).toJS(); + const options = channels.map(({ webhookId, name }) => ({ value: webhookId, label: name })).toJS(); return ( -
    @@ -89,10 +92,9 @@ export default class SharePopup extends React.PureComponent { />
    - @@ -115,11 +117,13 @@ export default class SharePopup extends React.PureComponent { }
    } - on="click" - position="top right" - className={ styles.popup } - hideOnScroll - /> + // trigger="click" + // position="top right" + // className={ styles.popup } + // hideOnScroll + > + {trigger} + ); } } diff --git a/frontend/app/components/shared/SharePopup/sharePopup.css b/frontend/app/components/shared/SharePopup/sharePopup.module.css similarity index 100% rename from frontend/app/components/shared/SharePopup/sharePopup.css rename to frontend/app/components/shared/SharePopup/sharePopup.module.css diff --git a/frontend/app/components/shared/SiteDropdown/SiteDropdown.js b/frontend/app/components/shared/SiteDropdown/SiteDropdown.js index 5fc482389..71a5086c2 100644 --- a/frontend/app/components/shared/SiteDropdown/SiteDropdown.js +++ b/frontend/app/components/shared/SiteDropdown/SiteDropdown.js @@ -1,14 +1,15 @@ +import React from 'react'; import { connect } from 'react-redux'; -import { Select } from 'UI'; +import Select from 'Shared/Select'; const SiteDropdown = ({ contextName="", sites, onChange, value }) => { - const options = sites.map(site => ({ value: site.id, text: site.host })).toJS(); + const options = sites.map(site => ({ value: site.id, label: site.host })).toJS(); return ( onChangeSelect({ name: 'defaultInputMode', value }) } placeholder="Default Input Mode" - value={ gdpr.defaultInputMode } + value={ inputModeOptions.find(o => o.value === gdpr.defaultInputMode) } /> @@ -123,7 +124,7 @@ const ProjectCodeSnippet = props => { name="maskEmails" type="checkbox" checked={ gdpr.maskEmails } - onClick={ onChangeOption } + onChange={ onChangeOption } className="mr-2" label="Do not record email addresses" /> diff --git a/frontend/app/components/shared/TrackingCodeModal/ProjectCodeSnippet/projectCodeSnippet.css b/frontend/app/components/shared/TrackingCodeModal/ProjectCodeSnippet/projectCodeSnippet.module.css similarity index 100% rename from frontend/app/components/shared/TrackingCodeModal/ProjectCodeSnippet/projectCodeSnippet.css rename to frontend/app/components/shared/TrackingCodeModal/ProjectCodeSnippet/projectCodeSnippet.module.css diff --git a/frontend/app/components/shared/TrackingCodeModal/TrackingCodeModal.js b/frontend/app/components/shared/TrackingCodeModal/TrackingCodeModal.js index a94eb5f1a..b7c65d14d 100644 --- a/frontend/app/components/shared/TrackingCodeModal/TrackingCodeModal.js +++ b/frontend/app/components/shared/TrackingCodeModal/TrackingCodeModal.js @@ -1,6 +1,6 @@ import React from 'react'; import { Modal, Icon, Tabs } from 'UI'; -import styles from './trackingCodeModal.css'; +import styles from './trackingCodeModal.module.css'; import { editGDPR, saveGDPR } from 'Duck/site'; import { connect } from 'react-redux'; import ProjectCodeSnippet from './ProjectCodeSnippet'; @@ -37,7 +37,7 @@ class TrackingCodeModal extends React.PureComponent { const { activeTab } = this.state; return ( displayed && - +
    { title } { subTitle && {subTitle}}
    diff --git a/frontend/app/components/shared/TrackingCodeModal/trackingCodeModal.css b/frontend/app/components/shared/TrackingCodeModal/trackingCodeModal.module.css similarity index 100% rename from frontend/app/components/shared/TrackingCodeModal/trackingCodeModal.css rename to frontend/app/components/shared/TrackingCodeModal/trackingCodeModal.module.css diff --git a/frontend/app/components/shared/WidgetAutoComplete/WidgetAutoComplete.js b/frontend/app/components/shared/WidgetAutoComplete/WidgetAutoComplete.js index 1b4b81daf..97fbc9b90 100644 --- a/frontend/app/components/shared/WidgetAutoComplete/WidgetAutoComplete.js +++ b/frontend/app/components/shared/WidgetAutoComplete/WidgetAutoComplete.js @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import { Icon, CircularLoader, Button, TextEllipsis } from 'UI'; import cn from 'classnames'; -import stl from './widgetAutoComplete.css'; +import stl from './widgetAutoComplete.module.css'; import { debounce } from 'App/utils'; const WidgetAutoComplete = props => { @@ -42,7 +42,7 @@ const WidgetAutoComplete = props => { { !focused && selected && (
    {selected.value} - +
    )} { (focused || !selected) && ( diff --git a/frontend/app/components/shared/WidgetAutoComplete/widgetAutoComplete.css b/frontend/app/components/shared/WidgetAutoComplete/widgetAutoComplete.module.css similarity index 100% rename from frontend/app/components/shared/WidgetAutoComplete/widgetAutoComplete.css rename to frontend/app/components/shared/WidgetAutoComplete/widgetAutoComplete.module.css diff --git a/frontend/app/components/shared/WidgetSection/WidgetSection.js b/frontend/app/components/shared/WidgetSection/WidgetSection.js deleted file mode 100644 index 45b339236..000000000 --- a/frontend/app/components/shared/WidgetSection/WidgetSection.js +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react' -import cn from 'classnames' -import AddWidgets from '../AddWidgets'; - -function WidgetSection({ className, title, children, description, type, widgets = [] }) { - return ( -
    -
    -
    -
    {title}
    - -
    - {description &&
    {description}
    } -
    - { children } -
    - ) -} - -export default WidgetSection diff --git a/frontend/app/components/shared/WidgetSection/index.js b/frontend/app/components/shared/WidgetSection/index.js deleted file mode 100644 index 13f279e4e..000000000 --- a/frontend/app/components/shared/WidgetSection/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default as WidgetSection } from './WidgetSection'; diff --git a/frontend/app/components/shared/addWidgets.css b/frontend/app/components/shared/addWidgets.css deleted file mode 100644 index 452ee92b7..000000000 --- a/frontend/app/components/shared/addWidgets.css +++ /dev/null @@ -1,48 +0,0 @@ -.widgetCard { - min-height: 110px; - padding: 15px; - width: 100%; - border: 1px solid $gray-light; - border-bottom: none; - - &:last-child { - border-bottom: 1px solid $gray-light; - } - & h4 { - margin-bottom: 10px; - } - & p { - color: $gray-medium; - font-weight: 300; - font-size: 12px; - } -} - -.thumb { - border: solid thin $gray-light; - margin-right: 10px; - width: 170px; -} - -.menuWrapper { - max-height: 300px; - overflow-y: auto; - &::-webkit-scrollbar { - width: 2px; - } -} - -.menuItem { - transition: all .2s; - border-bottom: solid thin $gray-light; - padding: 8px 10px; - overflow: hidden; - text-overflow: ellipsis; - &:last-child { - border-bottom: none; - } - &:hover { - transition: all .4s; - background-color: $gray-lightest; - } -} \ No newline at end of file diff --git a/frontend/app/components/ui/Avatar/Avatar.js b/frontend/app/components/ui/Avatar/Avatar.js index fd1ca884b..a70ae8917 100644 --- a/frontend/app/components/ui/Avatar/Avatar.js +++ b/frontend/app/components/ui/Avatar/Avatar.js @@ -1,16 +1,9 @@ import React from 'react'; import cn from 'classnames'; import { avatarIconName } from 'App/iconNames'; -import stl from './avatar.css'; +import stl from './avatar.module.css'; import { Icon } from 'UI'; -const ICON_LIST = ['icn_chameleon', 'icn_fox', 'icn_gorilla', 'icn_hippo', 'icn_horse', 'icn_hyena', -'icn_kangaroo', 'icn_lemur', 'icn_mammel', 'icn_monkey', 'icn_moose', 'icn_panda', -'icn_penguin', 'icn_porcupine', 'icn_quail', 'icn_rabbit', 'icn_rhino', 'icn_sea_horse', -'icn_sheep', 'icn_snake', 'icn_squirrel', 'icn_tapir', 'icn_turtle', 'icn_vulture', -'icn_wild1', 'icn_wild_bore'] - - const Avatar = ({ isAssist = false, className, width = "38px", height = "38px", iconSize = 26, seed }) => { var iconName = avatarIconName(seed); return ( diff --git a/frontend/app/components/ui/Avatar/avatar.css b/frontend/app/components/ui/Avatar/avatar.module.css similarity index 100% rename from frontend/app/components/ui/Avatar/avatar.css rename to frontend/app/components/ui/Avatar/avatar.module.css diff --git a/frontend/app/components/ui/BackLink/BackLink.js b/frontend/app/components/ui/BackLink/BackLink.js index c66be5d15..b44737233 100644 --- a/frontend/app/components/ui/BackLink/BackLink.js +++ b/frontend/app/components/ui/BackLink/BackLink.js @@ -1,5 +1,6 @@ +import React from 'react'; import { Link, Icon } from 'UI'; -import cls from './backLink.css'; +import cls from './backLink.module.css'; import cn from 'classnames'; export default function BackLink ({ diff --git a/frontend/app/components/ui/BackLink/backLink.css b/frontend/app/components/ui/BackLink/backLink.module.css similarity index 100% rename from frontend/app/components/ui/BackLink/backLink.css rename to frontend/app/components/ui/BackLink/backLink.module.css diff --git a/frontend/app/components/ui/Button/Button.js b/frontend/app/components/ui/Button/Button.js deleted file mode 100644 index aabaa3c99..000000000 --- a/frontend/app/components/ui/Button/Button.js +++ /dev/null @@ -1,40 +0,0 @@ -import { Button } from 'semantic-ui-react'; -import classnames from 'classnames'; -import styles from './button.css'; - -export default ({ - className, - size = '', - primary, - outline, - plain = false, - marginRight = false, - hover = false, - noPadding = false, - success = false, - error = false, - minWidth, - disabled = false, - plainText = false, - ...props -}) => ( - + ); +} diff --git a/frontend/app/components/ui/Button/button.css b/frontend/app/components/ui/Button/button.module.css similarity index 100% rename from frontend/app/components/ui/Button/button.css rename to frontend/app/components/ui/Button/button.module.css diff --git a/frontend/app/components/ui/Button/index.js b/frontend/app/components/ui/Button/index.ts similarity index 100% rename from frontend/app/components/ui/Button/index.js rename to frontend/app/components/ui/Button/index.ts diff --git a/frontend/app/components/ui/Checkbox/Checkbox.js b/frontend/app/components/ui/Checkbox/Checkbox.js deleted file mode 100644 index 93b3ff759..000000000 --- a/frontend/app/components/ui/Checkbox/Checkbox.js +++ /dev/null @@ -1,8 +0,0 @@ -import { Checkbox } from 'semantic-ui-react'; - -export default ({ className = '', ...props }) => ( - -); \ No newline at end of file diff --git a/frontend/app/components/ui/Checkbox/Checkbox.tsx b/frontend/app/components/ui/Checkbox/Checkbox.tsx new file mode 100644 index 000000000..01e3bb471 --- /dev/null +++ b/frontend/app/components/ui/Checkbox/Checkbox.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import cn from 'classnames'; + +interface Props { + classNam?: string; + label?: string; + [x: string]: any; +} +export default (props: Props) => { + const { className = '', label = '', ...rest } = props; + return ( + + ) +}; \ No newline at end of file diff --git a/frontend/app/components/ui/Checkbox/index.js b/frontend/app/components/ui/Checkbox/index.ts similarity index 100% rename from frontend/app/components/ui/Checkbox/index.js rename to frontend/app/components/ui/Checkbox/index.ts diff --git a/frontend/app/components/ui/CircularLoader/CircularLoader.js b/frontend/app/components/ui/CircularLoader/CircularLoader.js index 06d471263..74fa004f4 100644 --- a/frontend/app/components/ui/CircularLoader/CircularLoader.js +++ b/frontend/app/components/ui/CircularLoader/CircularLoader.js @@ -1,5 +1,9 @@ -import { Loader } from 'semantic-ui-react'; +import React from 'react'; +import cn from 'classnames'; export default ({ children = null, loading = true, size = 'tiny', ...props }) => (!loading ? children : - + + + + ) \ No newline at end of file diff --git a/frontend/app/components/ui/CloseButton/CloseButton.js b/frontend/app/components/ui/CloseButton/CloseButton.js index 0d33f03f2..51e760ecf 100644 --- a/frontend/app/components/ui/CloseButton/CloseButton.js +++ b/frontend/app/components/ui/CloseButton/CloseButton.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Icon } from 'UI'; export default function CloseButton({ size, onClick, className = '', style }){ diff --git a/frontend/app/components/ui/CodeEditor/CodeEditor.js b/frontend/app/components/ui/CodeEditor/CodeEditor.js deleted file mode 100644 index 43c5e579a..000000000 --- a/frontend/app/components/ui/CodeEditor/CodeEditor.js +++ /dev/null @@ -1,32 +0,0 @@ -import { Controlled as CodeMirror } from 'react-codemirror2'; - -class CodeEditor extends React.PureComponent { - onBeforeChange = (editor, data, value) => { - if (typeof this.props.onChange === 'function') { - this.props.onChange(data, { value, name: this.props.name }); - } - } - - render() { - const { lineNumbers = false, onChange, disabled = false, ...props } = this.props; - return ( - - ); - } -} - -CodeEditor.displayName = "CodeEditor"; - -export default CodeEditor; \ No newline at end of file diff --git a/frontend/app/components/ui/CodeEditor/CodeEditor.stories.js b/frontend/app/components/ui/CodeEditor/CodeEditor.stories.js deleted file mode 100644 index 1ca34d4d1..000000000 --- a/frontend/app/components/ui/CodeEditor/CodeEditor.stories.js +++ /dev/null @@ -1,8 +0,0 @@ -import { storiesOf } from '@storybook/react'; -import CodeEditor from '.'; - -storiesOf('CodeEditor', module) - .add('Pure', () => ( - - )) - diff --git a/frontend/app/components/ui/CodeEditor/index.js b/frontend/app/components/ui/CodeEditor/index.js deleted file mode 100644 index 64b3b3a38..000000000 --- a/frontend/app/components/ui/CodeEditor/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './CodeEditor'; \ No newline at end of file diff --git a/frontend/app/components/ui/Confirmation/Confirmation.js b/frontend/app/components/ui/Confirmation/Confirmation.js index 563f383eb..2af9993dc 100644 --- a/frontend/app/components/ui/Confirmation/Confirmation.js +++ b/frontend/app/components/ui/Confirmation/Confirmation.js @@ -1,8 +1,7 @@ import React from 'react'; import { Button} from 'UI'; import { confirmable } from 'react-confirm'; -import { Confirm } from 'semantic-ui-react'; -import stl from './confirmation.css'; +import { Modal } from 'UI' const Confirmation = ({ show, @@ -11,22 +10,31 @@ const Confirmation = ({ confirmation = 'Are you sure?', cancelButton = "Cancel", confirmButton = "Proceed", - options }) => { return ( - { confirmButton }} - cancelButton={} - onCancel={() => proceed(false)} - onConfirm={() => proceed(true)} - /> + > + {header} + +

    {confirmation}

    +
    + + + + + + ) } diff --git a/frontend/app/components/ui/Confirmation/confirmation.css b/frontend/app/components/ui/Confirmation/confirmation.css deleted file mode 100644 index e5525838f..000000000 --- a/frontend/app/components/ui/Confirmation/confirmation.css +++ /dev/null @@ -1,5 +0,0 @@ -@import 'mixins.css'; - -.cancelButton { - @mixin plainButton; -} \ No newline at end of file diff --git a/frontend/app/components/ui/Confirmation/index.js b/frontend/app/components/ui/Confirmation/index.ts similarity index 61% rename from frontend/app/components/ui/Confirmation/index.js rename to frontend/app/components/ui/Confirmation/index.ts index 298ef242b..53f2fea7f 100644 --- a/frontend/app/components/ui/Confirmation/index.js +++ b/frontend/app/components/ui/Confirmation/index.ts @@ -1,7 +1,5 @@ import { createConfirmation } from 'react-confirm'; import Confirmation from './Confirmation'; - -// create confirm function -export const confirm = createConfirmation(Confirmation); +export default createConfirmation(Confirmation); // export { default } from './Confirmation'; \ No newline at end of file diff --git a/frontend/app/components/ui/CountryFlag/CountryFlag.js b/frontend/app/components/ui/CountryFlag/CountryFlag.js index 2ca032048..700304dde 100644 --- a/frontend/app/components/ui/CountryFlag/CountryFlag.js +++ b/frontend/app/components/ui/CountryFlag/CountryFlag.js @@ -1,7 +1,8 @@ +import React from 'react'; import cn from 'classnames'; import { countries } from 'App/constants'; -import { Popup, Icon } from 'UI'; -import stl from './countryFlag.css'; +import { Icon } from 'UI'; +import stl from './countryFlag.module.css'; const CountryFlag = React.memo(({ country, className, style = {}, label = false }) => { const knownCountry = !!country && country !== 'UN'; diff --git a/frontend/app/components/ui/CountryFlag/countryFlag.css b/frontend/app/components/ui/CountryFlag/countryFlag.module.css similarity index 100% rename from frontend/app/components/ui/CountryFlag/countryFlag.css rename to frontend/app/components/ui/CountryFlag/countryFlag.module.css diff --git a/frontend/app/components/ui/Dropdown/Dropdown.js b/frontend/app/components/ui/Dropdown/Dropdown.js index 99150b5d1..91ec07180 100644 --- a/frontend/app/components/ui/Dropdown/Dropdown.js +++ b/frontend/app/components/ui/Dropdown/Dropdown.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Dropdown } from 'semantic-ui-react'; export default props => ( diff --git a/frontend/app/components/ui/DropdownPlain/DropdownPlain.js b/frontend/app/components/ui/DropdownPlain/DropdownPlain.js index ce1fc506d..4b6cf2fb2 100644 --- a/frontend/app/components/ui/DropdownPlain/DropdownPlain.js +++ b/frontend/app/components/ui/DropdownPlain/DropdownPlain.js @@ -1,7 +1,7 @@ import React from 'react' import { Dropdown } from 'semantic-ui-react' import { Icon } from 'UI'; -import stl from './dropdownPlain.css' +import stl from './dropdownPlain.module.css' const sessionSortOptions = { 'latest': 'Newest', diff --git a/frontend/app/components/ui/DropdownPlain/dropdownPlain.css b/frontend/app/components/ui/DropdownPlain/dropdownPlain.css deleted file mode 100644 index 87e26bc68..000000000 --- a/frontend/app/components/ui/DropdownPlain/dropdownPlain.css +++ /dev/null @@ -1,23 +0,0 @@ -.dropdown { - display: flex !important; - padding: 4px 6px; - border-radius: 3px; - color: $gray-darkest; - font-weight: 500; - &:hover { - background-color: $gray-light; - } -} - -.dropdownTrigger { - padding: 4px 8px; - border-radius: 3px; - &:hover { - background-color: $gray-light; - } -} - -.dropdownIcon { - margin-top: 2px; - margin-left: 3px; -} \ No newline at end of file diff --git a/frontend/app/components/Funnels/FunnelSessionsHeader/SortDropdown/sortDropdown.css b/frontend/app/components/ui/DropdownPlain/dropdownPlain.module.css similarity index 100% rename from frontend/app/components/Funnels/FunnelSessionsHeader/SortDropdown/sortDropdown.css rename to frontend/app/components/ui/DropdownPlain/dropdownPlain.module.css diff --git a/frontend/app/components/ui/ErrorFrame/ErrorFrame.js b/frontend/app/components/ui/ErrorFrame/ErrorFrame.js index 3f74a9444..ece2b816c 100644 --- a/frontend/app/components/ui/ErrorFrame/ErrorFrame.js +++ b/frontend/app/components/ui/ErrorFrame/ErrorFrame.js @@ -1,7 +1,7 @@ import React, { useState } from 'react' import { Icon } from 'UI'; import cn from 'classnames'; -import stl from './errorFrame.css'; +import stl from './errorFrame.module.css'; function ErrorFrame({ frame = {}, showRaw, isFirst }) { const [open, setOpen] = useState(isFirst) diff --git a/frontend/app/components/ui/ErrorFrame/errorFrame.css b/frontend/app/components/ui/ErrorFrame/errorFrame.module.css similarity index 100% rename from frontend/app/components/ui/ErrorFrame/errorFrame.css rename to frontend/app/components/ui/ErrorFrame/errorFrame.module.css diff --git a/frontend/app/components/ui/ErrorItem/ErrorItem.js b/frontend/app/components/ui/ErrorItem/ErrorItem.js index 2d1813bcf..f1145ac71 100644 --- a/frontend/app/components/ui/ErrorItem/ErrorItem.js +++ b/frontend/app/components/ui/ErrorItem/ErrorItem.js @@ -1,7 +1,7 @@ import React from 'react' import cn from 'classnames' import { IconButton } from 'UI' -import stl from './errorItem.css'; +import stl from './errorItem.module.css'; function ErrorItem({ error = {}, onErrorClick, onJump }) { return ( diff --git a/frontend/app/components/ui/ErrorItem/errorItem.css b/frontend/app/components/ui/ErrorItem/errorItem.module.css similarity index 100% rename from frontend/app/components/ui/ErrorItem/errorItem.css rename to frontend/app/components/ui/ErrorItem/errorItem.module.css diff --git a/frontend/app/components/ui/EscapeButton/EscapeButton.js b/frontend/app/components/ui/EscapeButton/EscapeButton.js index 5c06efc3d..1f9b372a0 100644 --- a/frontend/app/components/ui/EscapeButton/EscapeButton.js +++ b/frontend/app/components/ui/EscapeButton/EscapeButton.js @@ -1,6 +1,6 @@ import React from 'react' import { Icon } from 'UI'; -import stl from './escapeButton.css' +import stl from './escapeButton.module.css' function EscapeButton({ onClose = null}) { return ( diff --git a/frontend/app/components/ui/EscapeButton/escapeButton.css b/frontend/app/components/ui/EscapeButton/escapeButton.module.css similarity index 100% rename from frontend/app/components/ui/EscapeButton/escapeButton.css rename to frontend/app/components/ui/EscapeButton/escapeButton.module.css diff --git a/frontend/app/components/ui/Form/Form.tsx b/frontend/app/components/ui/Form/Form.tsx new file mode 100644 index 000000000..185ce1aaf --- /dev/null +++ b/frontend/app/components/ui/Form/Form.tsx @@ -0,0 +1,34 @@ +import React from 'react'; + +interface Props { + children: React.ReactNode; + [x: string]: any +} + + +interface FormFieldProps { + children: React.ReactNode; + [x: string]: any +} +function FormField (props: FormFieldProps) { + const { children, ...rest } = props; + return ( +
    + {children} +
    + ); +} + + +function Form(props: Props) { + const { children, ...rest } = props; + return ( +
    + {children} + + ); +} + +Form.Field = FormField; + +export default Form; \ No newline at end of file diff --git a/frontend/app/components/ui/Form/index.ts b/frontend/app/components/ui/Form/index.ts new file mode 100644 index 000000000..673cd230e --- /dev/null +++ b/frontend/app/components/ui/Form/index.ts @@ -0,0 +1 @@ +export { default } from './Form'; \ No newline at end of file diff --git a/frontend/app/components/ui/HelpText/HelpText.tsx b/frontend/app/components/ui/HelpText/HelpText.tsx index 92a06a5d0..c8e1862f8 100644 --- a/frontend/app/components/ui/HelpText/HelpText.tsx +++ b/frontend/app/components/ui/HelpText/HelpText.tsx @@ -11,12 +11,9 @@ export default function HelpText(props: Props) { const { text, className = '', position = 'top center' } = props return (
    -
    } - content={text} - inverted - position={position} - /> + +
    +
    ) } diff --git a/frontend/app/components/ui/HighlightCode/HighlightCode.js b/frontend/app/components/ui/HighlightCode/HighlightCode.js index d9f837b88..989e48979 100644 --- a/frontend/app/components/ui/HighlightCode/HighlightCode.js +++ b/frontend/app/components/ui/HighlightCode/HighlightCode.js @@ -1,6 +1,6 @@ import React from 'react' import Highlight from 'react-highlight' -import stl from './highlightCode.css' +import stl from './highlightCode.module.css' import cn from 'classnames' import { CopyButton } from 'UI' diff --git a/frontend/app/components/shared/TrackingCodeModal/InstallDocs/installDocs.css b/frontend/app/components/ui/HighlightCode/highlightCode.module.css similarity index 93% rename from frontend/app/components/shared/TrackingCodeModal/InstallDocs/installDocs.css rename to frontend/app/components/ui/HighlightCode/highlightCode.module.css index 54a935e7b..448b08f72 100644 --- a/frontend/app/components/shared/TrackingCodeModal/InstallDocs/installDocs.css +++ b/frontend/app/components/ui/HighlightCode/highlightCode.module.css @@ -4,8 +4,8 @@ position: relative; & .codeCopy { position: absolute; - right: 10px; - top: 10px; + right: 0px; + top: -3px; z-index: $codeSnippet; padding: 5px 10px; color: $teal; diff --git a/frontend/app/components/ui/Icon/Browser.js b/frontend/app/components/ui/Icon/Browser.js index 6339cf3ea..b2ede3aae 100644 --- a/frontend/app/components/ui/Icon/Browser.js +++ b/frontend/app/components/ui/Icon/Browser.js @@ -1,3 +1,4 @@ +import React from 'react'; import { browserIcon } from 'App/iconNames'; import { Icon } from 'UI'; diff --git a/frontend/app/components/ui/Icon/Icon.js b/frontend/app/components/ui/Icon/Icon.js index 431e2dbc7..8f2e3bf10 100644 --- a/frontend/app/components/ui/Icon/Icon.js +++ b/frontend/app/components/ui/Icon/Icon.js @@ -1,7 +1,7 @@ import React from 'react'; import cn from 'classnames'; import SVG from 'UI/SVG'; -import styles from './icon.css'; +import styles from './icon.module.css'; const Icon = ({ name, diff --git a/frontend/app/components/ui/Icon/icon.css b/frontend/app/components/ui/Icon/icon.module.css similarity index 100% rename from frontend/app/components/ui/Icon/icon.css rename to frontend/app/components/ui/Icon/icon.module.css diff --git a/frontend/app/components/ui/IconButton/IconButton.js b/frontend/app/components/ui/IconButton/IconButton.js index 0b62c41de..1b80bf98d 100644 --- a/frontend/app/components/ui/IconButton/IconButton.js +++ b/frontend/app/components/ui/IconButton/IconButton.js @@ -1,6 +1,7 @@ +import React from 'react'; import cn from 'classnames'; -import { CircularLoader, Icon, Tooltip } from 'UI'; -import stl from './iconButton.css'; +import { CircularLoader, Icon, Popup } from 'UI'; +import stl from './iconButton.module.css'; const IconButton = React.forwardRef(({ icon, @@ -30,11 +31,11 @@ const IconButton = React.forwardRef(({ compact = false, ...rest }, ref) => ( - + - } - /> + )); IconButton.displayName = "IconButton"; diff --git a/frontend/app/components/ui/IconButton/iconButton.css b/frontend/app/components/ui/IconButton/iconButton.module.css similarity index 100% rename from frontend/app/components/ui/IconButton/iconButton.css rename to frontend/app/components/ui/IconButton/iconButton.module.css diff --git a/frontend/app/components/ui/Information/Information.js b/frontend/app/components/ui/Information/Information.js index 882f0fa2d..1cc80623d 100644 --- a/frontend/app/components/ui/Information/Information.js +++ b/frontend/app/components/ui/Information/Information.js @@ -1,5 +1,5 @@ import React from 'react' -import stl from './information.css' +import stl from './information.module.css' import cn from 'classnames' function Information({ primary = true, content = '' }) { diff --git a/frontend/app/components/ui/Information/information.css b/frontend/app/components/ui/Information/information.module.css similarity index 100% rename from frontend/app/components/ui/Information/information.css rename to frontend/app/components/ui/Information/information.module.css diff --git a/frontend/app/components/ui/Input/Input.tsx b/frontend/app/components/ui/Input/Input.tsx new file mode 100644 index 000000000..73a610e17 --- /dev/null +++ b/frontend/app/components/ui/Input/Input.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import cn from 'classnames'; +import { Icon } from 'UI'; + +interface Props { + wrapperClassName?: string; + className: string; + icon?: string; + leadingButton?: React.ReactNode; + [x:string]: any; +} +function Input(props: Props) { + const { className, leadingButton = "", wrapperClassName = "", icon = "", ...rest } = props; + return ( +
    + {icon && } + + { leadingButton &&
    { leadingButton }
    } +
    + ); +} + +export default Input; \ No newline at end of file diff --git a/frontend/app/components/ui/Input/index.ts b/frontend/app/components/ui/Input/index.ts new file mode 100644 index 000000000..9618de9ed --- /dev/null +++ b/frontend/app/components/ui/Input/index.ts @@ -0,0 +1 @@ +export { default } from './Input'; \ No newline at end of file diff --git a/frontend/app/components/ui/InputAutocomplete/DropdownItem.js b/frontend/app/components/ui/InputAutocomplete/DropdownItem.js deleted file mode 100644 index 9467a4292..000000000 --- a/frontend/app/components/ui/InputAutocomplete/DropdownItem.js +++ /dev/null @@ -1,13 +0,0 @@ -import stl from './dropdownItem.css'; - -const DropdownItem = ({ event }) => ( -
    -
    - { event.value } -
    -
    -); - -DropdownItem.displayName = 'DropdownItem'; - -export default DropdownItem; diff --git a/frontend/app/components/ui/InputAutocomplete/InputAutocomplete.js b/frontend/app/components/ui/InputAutocomplete/InputAutocomplete.js deleted file mode 100644 index 3887c7286..000000000 --- a/frontend/app/components/ui/InputAutocomplete/InputAutocomplete.js +++ /dev/null @@ -1,56 +0,0 @@ -import { Dropdown } from 'semantic-ui-react'; - -const defaultValueToText = value => value; -const defaultOptionMapping = (values, valueToText) => values.map(value => ({ text: valueToText(value), value })); - -// TODO: get rid of semantic -export default class InputAutocomplete extends React.PureComponent { - state = { ddOpen: false } - - onSearchChange = (e, { searchQuery }) => { - const { onChange } = this.props; - if (typeof onChange === 'function') { - onChange(e, { value: searchQuery, name: this.props.name }); - } - } - - onSelect = (e, t) => { - const { onChange, onSelect } = this.props; - if (typeof onChange === 'function') { - onChange(e, t); - } - if (typeof onSelect === 'function') { - onSelect(e, t); - } - } - - render() { - const { - values = [], - valueToText = defaultValueToText, - optionMapping = defaultOptionMapping, - ...otherProps - } = this.props; - - const { ddOpen } = this.state; - - const options = optionMapping(values, valueToText) - return ( - - ); - } -} diff --git a/frontend/app/components/ui/InputAutocomplete/InputAutocomplete.stories.js b/frontend/app/components/ui/InputAutocomplete/InputAutocomplete.stories.js deleted file mode 100644 index d02fc7a62..000000000 --- a/frontend/app/components/ui/InputAutocomplete/InputAutocomplete.stories.js +++ /dev/null @@ -1,8 +0,0 @@ -import { storiesOf } from '@storybook/react'; -import InputAutocomplete from '.'; - -storiesOf('InputAutocomplete', module) - .add('Pure', () => ( - - )) - diff --git a/frontend/app/components/ui/InputAutocomplete/dropdownItem.css b/frontend/app/components/ui/InputAutocomplete/dropdownItem.css deleted file mode 100644 index aa02cbb1c..000000000 --- a/frontend/app/components/ui/InputAutocomplete/dropdownItem.css +++ /dev/null @@ -1,5 +0,0 @@ -.wrapper { - & .values { - color: red; - } -} \ No newline at end of file diff --git a/frontend/app/components/ui/InputAutocomplete/index.js b/frontend/app/components/ui/InputAutocomplete/index.js deleted file mode 100644 index a5fae14ba..000000000 --- a/frontend/app/components/ui/InputAutocomplete/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './InputAutocomplete'; \ No newline at end of file diff --git a/frontend/app/components/ui/ItemMenu/ItemMenu.js b/frontend/app/components/ui/ItemMenu/ItemMenu.js index cd1dff700..4b04f235c 100644 --- a/frontend/app/components/ui/ItemMenu/ItemMenu.js +++ b/frontend/app/components/ui/ItemMenu/ItemMenu.js @@ -1,8 +1,8 @@ -import { Icon } from 'UI'; -import styles from './itemMenu.css'; +import React from 'react'; +import { Icon, Popup } from 'UI'; +import styles from './itemMenu.module.css'; import OutsideClickDetectingDiv from 'Shared/OutsideClickDetectingDiv'; import cn from 'classnames'; -import { Tooltip } from 'react-tippy'; export default class ItemMenu extends React.PureComponent { state = { @@ -65,11 +65,10 @@ export default class ItemMenu extends React.PureComponent { tabIndex="-1" className="" > - @@ -81,7 +80,7 @@ export default class ItemMenu extends React.PureComponent { )}
    { text }
    - +
    ))}
    diff --git a/frontend/app/components/ui/ItemMenu/itemMenu.css b/frontend/app/components/ui/ItemMenu/itemMenu.module.css similarity index 98% rename from frontend/app/components/ui/ItemMenu/itemMenu.css rename to frontend/app/components/ui/ItemMenu/itemMenu.module.css index 8c892a8e1..148e7afce 100644 --- a/frontend/app/components/ui/ItemMenu/itemMenu.css +++ b/frontend/app/components/ui/ItemMenu/itemMenu.module.css @@ -1,4 +1,4 @@ -@import "icons.css"; +@import 'icons.css'; .wrapper { position: relative; diff --git a/frontend/app/components/ui/JSONTree/JSONTree.js b/frontend/app/components/ui/JSONTree/JSONTree.js index d27e082bd..dc6ab786c 100644 --- a/frontend/app/components/ui/JSONTree/JSONTree.js +++ b/frontend/app/components/ui/JSONTree/JSONTree.js @@ -1,3 +1,4 @@ +import React from 'react'; import JSONTree from 'react-json-view'; function updateObjectLink(obj) { diff --git a/frontend/app/components/ui/Label/Label.js b/frontend/app/components/ui/Label/Label.js index ffe9080fc..6b422cdc4 100644 --- a/frontend/app/components/ui/Label/Label.js +++ b/frontend/app/components/ui/Label/Label.js @@ -1,14 +1,14 @@ -import { Label } from 'semantic-ui-react'; -import styles from './label.css'; +import React from 'react'; +import styles from './label.module.css'; import cn from 'classnames'; export default ({ children, className, ...props }) => ( - +
    ); diff --git a/frontend/app/components/ui/Label/label.css b/frontend/app/components/ui/Label/label.module.css similarity index 100% rename from frontend/app/components/ui/Label/label.css rename to frontend/app/components/ui/Label/label.module.css diff --git a/frontend/app/components/ui/Link/Link.js b/frontend/app/components/ui/Link/Link.js index 2df99372f..cfc14f002 100644 --- a/frontend/app/components/ui/Link/Link.js +++ b/frontend/app/components/ui/Link/Link.js @@ -1,8 +1,9 @@ +import React from 'react'; import { Link } from 'react-router-dom'; import { connect } from 'react-redux'; import cn from 'classnames'; import { withSiteId } from 'App/routes'; -import styles from './link.css'; +import styles from './link.module.css'; const OpenReplayLink = ({ siteId, to, className="", dispatch, ...other }) => ( (!loading ? children : +const Loader = React.memo(({ className = '', loading = true, children = null, size = 30, style = { minHeight: '150px' } }) => (!loading ? children :
    -
    + {/*
    */} +
    )); diff --git a/frontend/app/components/ui/Loader/loader.css b/frontend/app/components/ui/Loader/loader.module.css similarity index 100% rename from frontend/app/components/ui/Loader/loader.css rename to frontend/app/components/ui/Loader/loader.module.css diff --git a/frontend/app/components/ui/Message/Message.js b/frontend/app/components/ui/Message/Message.js index 037ceb0c8..ec85e7a96 100644 --- a/frontend/app/components/ui/Message/Message.js +++ b/frontend/app/components/ui/Message/Message.js @@ -1,14 +1,15 @@ -import styles from './message.css'; +import React from 'react'; +import styles from './message.module.css'; +import { Icon } from 'UI'; -const Message = ({ children, inline=false, success=false, info=true, text }) => ( +const Message = ({ hidden = false, visible = false, children, inline=false, success=false, info=true, text }) => (visible || !hidden) ? (
    { text ? text : children } -
    -); +
    ) : null; Message.displayName = "Message"; diff --git a/frontend/app/components/ui/Message/message.css b/frontend/app/components/ui/Message/message.module.css similarity index 100% rename from frontend/app/components/ui/Message/message.css rename to frontend/app/components/ui/Message/message.module.css diff --git a/frontend/app/components/ui/Modal/Modal.tsx b/frontend/app/components/ui/Modal/Modal.tsx new file mode 100644 index 000000000..0d4154426 --- /dev/null +++ b/frontend/app/components/ui/Modal/Modal.tsx @@ -0,0 +1,88 @@ +import React, { useEffect } from 'react'; +import cn from 'classnames'; + +interface Props { + children: React.ReactNode; + open?: boolean; + size ?: 'tiny' | 'small' | 'large' | 'fullscreen'; +} +function Modal(props: Props) { + const { children, open = false, size = 'small' } = props; + + useEffect(() => { + if (open) { + document.body.style.overflow = 'hidden'; + } else { + document.body.style.overflow = 'auto'; + } + }, [open]); + + const style: any = {}; + if (size === 'tiny') { + style.width = '300px'; + } else if (size === 'small') { + style.width = '400px'; + } else if (size === 'large') { + style.width = '700px'; + } else if (size === 'fullscreen') { + style.width = '100%'; + } + + return open ? ( +
    +
    + {children} +
    +
    + ) : null; +} + +interface ModalContentProps { + children: React.ReactNode; + className?: string; +} + +function ModalContent (props: ModalContentProps) { + const { children, className } = props; + return ( +
    + {children} +
    + ); +} + + +interface ModalHeaderProps { + children: React.ReactNode; + className?: string; +} +function ModalHeader (props: ModalHeaderProps) { + const { children, className = '' } = props; + return ( +
    + {children} +
    + ); +} + +interface ModalFooterProps { + children: React.ReactNode; + className?: string; +} +function ModalFooter (props: ModalFooterProps) { + const { children, className = '' } = props; + return ( +
    + {children} +
    + ); +} + +Modal.Header = ModalHeader; +Modal.Footer = ModalFooter; +Modal.Content = ModalContent; + +export default Modal; \ No newline at end of file diff --git a/frontend/app/components/ui/Modal/index.ts b/frontend/app/components/ui/Modal/index.ts new file mode 100644 index 000000000..d799bd290 --- /dev/null +++ b/frontend/app/components/ui/Modal/index.ts @@ -0,0 +1 @@ +export { default } from './Modal' \ No newline at end of file diff --git a/frontend/app/components/ui/NoContent/NoContent.js b/frontend/app/components/ui/NoContent/NoContent.js index ed5d63828..395015a72 100644 --- a/frontend/app/components/ui/NoContent/NoContent.js +++ b/frontend/app/components/ui/NoContent/NoContent.js @@ -1,5 +1,6 @@ +import React from 'react'; import { Icon } from 'UI'; -import styles from './noContent.css'; +import styles from './noContent.module.css'; export default ({ title = "No data available.", diff --git a/frontend/app/components/ui/NoContent/noContent.css b/frontend/app/components/ui/NoContent/noContent.module.css similarity index 100% rename from frontend/app/components/ui/NoContent/noContent.css rename to frontend/app/components/ui/NoContent/noContent.module.css diff --git a/frontend/app/components/ui/NoPermission/NoPermission.tsx b/frontend/app/components/ui/NoPermission/NoPermission.tsx index 3ac93f8f0..cabd4607e 100644 --- a/frontend/app/components/ui/NoPermission/NoPermission.tsx +++ b/frontend/app/components/ui/NoPermission/NoPermission.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import stl from './noPermission.css' +import stl from './noPermission.module.css' import { Icon } from 'UI'; interface Props { diff --git a/frontend/app/components/ui/NoPermission/noPermission.css b/frontend/app/components/ui/NoPermission/noPermission.module.css similarity index 100% rename from frontend/app/components/ui/NoPermission/noPermission.css rename to frontend/app/components/ui/NoPermission/noPermission.module.css diff --git a/frontend/app/components/ui/NoSessionPermission/NoSessionPermission.css b/frontend/app/components/ui/NoSessionPermission/NoSessionPermission.module.css similarity index 100% rename from frontend/app/components/ui/NoSessionPermission/NoSessionPermission.css rename to frontend/app/components/ui/NoSessionPermission/NoSessionPermission.module.css diff --git a/frontend/app/components/ui/NoSessionPermission/NoSessionPermission.tsx b/frontend/app/components/ui/NoSessionPermission/NoSessionPermission.tsx index 862028ff2..7b50ab4c3 100644 --- a/frontend/app/components/ui/NoSessionPermission/NoSessionPermission.tsx +++ b/frontend/app/components/ui/NoSessionPermission/NoSessionPermission.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import stl from './NoSessionPermission.css' +import stl from './NoSessionPermission.module.css' import { Icon, Button, Link } from 'UI'; import { connect } from 'react-redux'; @@ -16,7 +16,7 @@ function NoSessionPermission({ session }: Props) { You don’t have the necessary permissions to access this feature. Please check with your admin. } - +
    ); diff --git a/frontend/app/components/ui/Notification/Notification.js b/frontend/app/components/ui/Notification/Notification.js index fb4ffb742..dc982fcd6 100644 --- a/frontend/app/components/ui/Notification/Notification.js +++ b/frontend/app/components/ui/Notification/Notification.js @@ -1,6 +1,6 @@ import React from 'react'; import { ToastContainer, Flip } from 'react-toastify'; -import styles from './notification.css' +import styles from './notification.module.css' export default ({ transition = Flip, position = 'bottom-right', autoClose = 3000, ...props }) => ( - - + Page of {numberWithCommas(totalPages)} - - + ) } diff --git a/frontend/app/components/ui/PopMenu/PopMenu.js b/frontend/app/components/ui/PopMenu/PopMenu.js index bdd43583c..e7ea9469e 100644 --- a/frontend/app/components/ui/PopMenu/PopMenu.js +++ b/frontend/app/components/ui/PopMenu/PopMenu.js @@ -2,7 +2,7 @@ import React, { useState, useCallback } from 'react'; import cn from 'classnames'; import { Icon, Popup } from 'UI'; import OutsideClickDetectingDiv from 'Shared/OutsideClickDetectingDiv'; -import cls from './popMenu.css'; +import cls from './popMenu.module.css'; export default React.memo(function PopMenu({ items }) { const [ open, setOpen ] = useState(false); diff --git a/frontend/app/components/ui/PopMenu/popMenu.css b/frontend/app/components/ui/PopMenu/popMenu.module.css similarity index 100% rename from frontend/app/components/ui/PopMenu/popMenu.css rename to frontend/app/components/ui/PopMenu/popMenu.module.css diff --git a/frontend/app/components/ui/Popup/Popup.js b/frontend/app/components/ui/Popup/Popup.js deleted file mode 100644 index 9ba5f3804..000000000 --- a/frontend/app/components/ui/Popup/Popup.js +++ /dev/null @@ -1,10 +0,0 @@ -import { Popup } from 'semantic-ui-react'; - -export default ({ - position, ...props -}) => ( - -); diff --git a/frontend/app/components/ui/Popup/Popup.tsx b/frontend/app/components/ui/Popup/Popup.tsx new file mode 100644 index 000000000..4144aa4a7 --- /dev/null +++ b/frontend/app/components/ui/Popup/Popup.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import { Tooltip } from 'react-tippy'; + +interface Props { + content?: any; + title?: any; + trigger?: any + position?: any + className?: string + [x:string]: any; +} +export default ({ + position = 'top', + title='', + className='', + trigger = 'mouseenter', + ...props +}: Props) => ( + + { props.children } + +); diff --git a/frontend/app/components/ui/Progress/Progress.js b/frontend/app/components/ui/Progress/Progress.js index 32d5426a8..27c6dc089 100644 --- a/frontend/app/components/ui/Progress/Progress.js +++ b/frontend/app/components/ui/Progress/Progress.js @@ -1,3 +1,4 @@ +import React from 'react'; import { Progress } from 'semantic-ui-react'; export default ({ diff --git a/frontend/app/components/ui/QuestionMarkHint/QuestionMarkHint.js b/frontend/app/components/ui/QuestionMarkHint/QuestionMarkHint.js index 5dc6965fb..ec906e342 100644 --- a/frontend/app/components/ui/QuestionMarkHint/QuestionMarkHint.js +++ b/frontend/app/components/ui/QuestionMarkHint/QuestionMarkHint.js @@ -1,16 +1,15 @@ +import React from 'react'; import cn from "classnames"; import { Icon, Popup } from 'UI'; export default function QuestionMarkHint({ onHover = false, content, className, ...props }) { return ( - } { ...props } - /> + > + + ); } \ No newline at end of file diff --git a/frontend/app/components/ui/SVG.tsx b/frontend/app/components/ui/SVG.tsx new file mode 100644 index 000000000..87b4b2d8a --- /dev/null +++ b/frontend/app/components/ui/SVG.tsx @@ -0,0 +1,368 @@ + +import React from 'react'; + +interface Props { + name: string; + size?: number; + width?: number; + height?: number; + fill?: string; +} + +/* Auto-generated, do not edit */ +const SVG = (props: Props) => { + const { name, size = 14, width = size, height = size, fill = '' } = props; + switch (name) { + case 'alarm-clock': return ; + case 'alarm-plus': return ; + case 'all-sessions': return ; + case 'analytics': return ; + case 'anchor': return ; + case 'arrow-alt-square-right': return ; + case 'arrow-down': return ; + case 'arrow-square-left': return ; + case 'arrow-square-right': return ; + case 'arrow-up': return ; + case 'avatar/icn_bear': return ; + case 'avatar/icn_beaver': return ; + case 'avatar/icn_bird': return ; + case 'avatar/icn_bison': return ; + case 'avatar/icn_camel': return ; + case 'avatar/icn_chameleon': return ; + case 'avatar/icn_deer': return ; + case 'avatar/icn_dog': return ; + case 'avatar/icn_dolphin': return ; + case 'avatar/icn_elephant': return ; + case 'avatar/icn_fish': return ; + case 'avatar/icn_fox': return ; + case 'avatar/icn_gorilla': return ; + case 'avatar/icn_hippo': return ; + case 'avatar/icn_horse': return ; + case 'avatar/icn_hyena': return ; + case 'avatar/icn_kangaroo': return ; + case 'avatar/icn_lemur': return ; + case 'avatar/icn_mammel': return ; + case 'avatar/icn_monkey': return ; + case 'avatar/icn_moose': return ; + case 'avatar/icn_panda': return ; + case 'avatar/icn_penguin': return ; + case 'avatar/icn_porcupine': return ; + case 'avatar/icn_quail': return ; + case 'avatar/icn_rabbit': return ; + case 'avatar/icn_rhino': return ; + case 'avatar/icn_sea_horse': return ; + case 'avatar/icn_sheep': return ; + case 'avatar/icn_snake': return ; + case 'avatar/icn_squirrel': return ; + case 'avatar/icn_tapir': return ; + case 'avatar/icn_turtle': return ; + case 'avatar/icn_vulture': return ; + case 'avatar/icn_wild1': return ; + case 'avatar/icn_wild_bore': return ; + case 'ban': return ; + case 'bar-chart-line': return ; + case 'bell-plus': return ; + case 'bell': return ; + case 'binoculars': return ; + case 'book': return ; + case 'browser/browser': return ; + case 'browser/chrome': return ; + case 'browser/edge': return ; + case 'browser/electron': return ; + case 'browser/facebook': return ; + case 'browser/firefox': return ; + case 'browser/ie': return ; + case 'browser/opera': return ; + case 'browser/safari': return ; + case 'bullhorn': return ; + case 'business-time': return ; + case 'calendar-alt': return ; + case 'calendar-check': return ; + case 'calendar-day': return ; + case 'calendar': return ; + case 'camera-alt': return ; + case 'camera-video-off': return ; + case 'camera-video': return ; + case 'camera': return ; + case 'caret-down-fill': return ; + case 'caret-left-fill': return ; + case 'caret-right-fill': return ; + case 'caret-up-fill': return ; + case 'chat-dots': return ; + case 'chat-square-quote': return ; + case 'check-circle': return ; + case 'check': return ; + case 'chevron-double-left': return ; + case 'chevron-double-right': return ; + case 'chevron-down': return ; + case 'chevron-left': return ; + case 'chevron-right': return ; + case 'chevron-up': return ; + case 'circle': return ; + case 'clipboard-list-check': return ; + case 'clock': return ; + case 'close': return ; + case 'cloud-fog2-fill': return ; + case 'code': return ; + case 'cog': return ; + case 'cogs': return ; + case 'collection': return ; + case 'columns-gap': return ; + case 'console/error': return ; + case 'console/exception': return ; + case 'console/info': return ; + case 'console/warning': return ; + case 'console': return ; + case 'controller': return ; + case 'cookies': return ; + case 'copy': return ; + case 'credit-card-front': return ; + case 'cubes': return ; + case 'dashboard-icn': return ; + case 'desktop': return ; + case 'device': return ; + case 'diagram-3': return ; + case 'dizzy': return ; + case 'doublecheck': return ; + case 'download': return ; + case 'drag': return ; + case 'edit': return ; + case 'ellipsis-v': return ; + case 'enter': return ; + case 'envelope': return ; + case 'event/click': return ; + case 'event/clickrage': return ; + case 'event/code': return ; + case 'event/i-cursor': return ; + case 'event/input': return ; + case 'event/link': return ; + case 'event/location': return ; + case 'event/resize': return ; + case 'event/view': return ; + case 'exclamation-circle': return ; + case 'expand-wide': return ; + case 'explosion': return ; + case 'external-link-alt': return ; + case 'eye-slash': return ; + case 'eye': return ; + case 'fetch': return ; + case 'file-code': return ; + case 'file-medical-alt': return ; + case 'file': return ; + case 'filter': return ; + case 'filters/arrow-return-right': return ; + case 'filters/browser': return ; + case 'filters/click': return ; + case 'filters/clickrage': return ; + case 'filters/code': return ; + case 'filters/console': return ; + case 'filters/country': return ; + case 'filters/cpu-load': return ; + case 'filters/custom': return ; + case 'filters/device': return ; + case 'filters/dom-complete': return ; + case 'filters/duration': return ; + case 'filters/error': return ; + case 'filters/fetch-failed': return ; + case 'filters/fetch': return ; + case 'filters/file-code': return ; + case 'filters/graphql': return ; + case 'filters/i-cursor': return ; + case 'filters/input': return ; + case 'filters/lcpt': return ; + case 'filters/link': return ; + case 'filters/location': return ; + case 'filters/memory-load': return ; + case 'filters/metadata': return ; + case 'filters/os': return ; + case 'filters/perfromance-network-request': return ; + case 'filters/platform': return ; + case 'filters/referrer': return ; + case 'filters/resize': return ; + case 'filters/rev-id': return ; + case 'filters/state-action': return ; + case 'filters/ttfb': return ; + case 'filters/user-alt': return ; + case 'filters/userid': return ; + case 'filters/view': return ; + case 'flag-na': return ; + case 'fullscreen': return ; + case 'funnel/cpu-fill': return ; + case 'funnel/cpu': return ; + case 'funnel/dizzy': return ; + case 'funnel/emoji-angry-fill': return ; + case 'funnel/emoji-angry': return ; + case 'funnel/emoji-dizzy-fill': return ; + case 'funnel/exclamation-circle-fill': return ; + case 'funnel/exclamation-circle': return ; + case 'funnel/file-earmark-break-fill': return ; + case 'funnel/file-earmark-break': return ; + case 'funnel/file-earmark-minus-fill': return ; + case 'funnel/file-earmark-minus': return ; + case 'funnel/file-medical-alt': return ; + case 'funnel/file-x': return ; + case 'funnel/hdd-fill': return ; + case 'funnel/hourglass-top': return ; + case 'funnel/image-fill': return ; + case 'funnel/image': return ; + case 'funnel/microchip': return ; + case 'funnel/mouse': return ; + case 'funnel/patch-exclamation-fill': return ; + case 'funnel/sd-card': return ; + case 'funnel': return ; + case 'geo-alt-fill-custom': return ; + case 'github': return ; + case 'graph-up-arrow': return ; + case 'grid-3x3': return ; + case 'grip-horizontal': return ; + case 'hash': return ; + case 'hdd-stack': return ; + case 'headset': return ; + case 'heart-rate': return ; + case 'high-engagement': return ; + case 'history': return ; + case 'hourglass-start': return ; + case 'id-card': return ; + case 'image': return ; + case 'info-circle': return ; + case 'info-square': return ; + case 'info': return ; + case 'inspect': return ; + case 'integrations/assist': return ; + case 'integrations/bugsnag-text': return ; + case 'integrations/bugsnag': return ; + case 'integrations/cloudwatch-text': return ; + case 'integrations/cloudwatch': return ; + case 'integrations/datadog': return ; + case 'integrations/elasticsearch-text': return ; + case 'integrations/elasticsearch': return ; + case 'integrations/github': return ; + case 'integrations/graphql': return ; + case 'integrations/jira-text': return ; + case 'integrations/jira': return ; + case 'integrations/mobx': return ; + case 'integrations/newrelic-text': return ; + case 'integrations/newrelic': return ; + case 'integrations/ngrx': return ; + case 'integrations/openreplay-text': return ; + case 'integrations/openreplay': return ; + case 'integrations/redux': return ; + case 'integrations/rollbar-text': return ; + case 'integrations/rollbar': return ; + case 'integrations/segment': return ; + case 'integrations/sentry-text': return ; + case 'integrations/sentry': return ; + case 'integrations/slack': return ; + case 'integrations/stackdriver': return ; + case 'integrations/sumologic-text': return ; + case 'integrations/sumologic': return ; + case 'integrations/vuejs': return ; + case 'journal-code': return ; + case 'layer-group': return ; + case 'lightbulb-on': return ; + case 'lightbulb': return ; + case 'link-45deg': return ; + case 'list-alt': return ; + case 'list-ul': return ; + case 'lock-alt': return ; + case 'map-marker-alt': return ; + case 'memory': return ; + case 'mic-mute': return ; + case 'mic': return ; + case 'minus': return ; + case 'mobile': return ; + case 'mouse-alt': return ; + case 'next1': return ; + case 'no-metrics-chart': return ; + case 'os/android': return ; + case 'os/chrome_os': return ; + case 'os/fedora': return ; + case 'os/ios': return ; + case 'os/linux': return ; + case 'os/mac_os_x': return ; + case 'os/other': return ; + case 'os/ubuntu': return ; + case 'os/windows': return ; + case 'os': return ; + case 'pause': return ; + case 'pdf-download': return ; + case 'pencil-stop': return ; + case 'pencil': return ; + case 'percent': return ; + case 'person-fill': return ; + case 'person': return ; + case 'pie-chart-fill': return ; + case 'pin-fill': return ; + case 'play-circle-light': return ; + case 'play-circle': return ; + case 'play-fill': return ; + case 'play-hover': return ; + case 'play': return ; + case 'plus-circle': return ; + case 'plus': return ; + case 'prev1': return ; + case 'puzzle-piece': return ; + case 'question-circle': return ; + case 'quote-left': return ; + case 'quote-right': return ; + case 'redo-back': return ; + case 'redo': return ; + case 'remote-control': return ; + case 'replay-10': return ; + case 'safe-fill': return ; + case 'safe': return ; + case 'sandglass': return ; + case 'search': return ; + case 'search_notification': return ; + case 'server': return ; + case 'share-alt': return ; + case 'shield-lock': return ; + case 'signup': return ; + case 'skip-forward-fill': return ; + case 'skip-forward': return ; + case 'slash-circle': return ; + case 'sliders': return ; + case 'social/slack': return ; + case 'social/trello': return ; + case 'spinner': return ; + case 'star-solid': return ; + case 'star': return ; + case 'step-forward': return ; + case 'stopwatch': return ; + case 'store': return ; + case 'sync-alt': return ; + case 'table': return ; + case 'tablet-android': return ; + case 'tachometer-slow': return ; + case 'tachometer-slowest': return ; + case 'tags': return ; + case 'team-funnel': return ; + case 'telephone-fill': return ; + case 'telephone': return ; + case 'text-paragraph': return ; + case 'tools': return ; + case 'trash': return ; + case 'turtle': return ; + case 'user-alt': return ; + case 'user-circle': return ; + case 'user-friends': return ; + case 'users': return ; + case 'vendors/graphql': return ; + case 'vendors/mobx': return ; + case 'vendors/ngrx': return ; + case 'vendors/redux': return ; + case 'vendors/vuex': return ; + case 'wifi': return ; + case 'window-alt': return ; + case 'window-restore': return ; + case 'window-x': return ; + case 'window': return ; + case 'zoom-in': return ; +default: + return ; + // if (window.ENV.PRODUCTION) return null; + // throw "unknown icon name " + name; + } +} +SVG.displayName = 'SVG'; +export default SVG; diff --git a/frontend/app/components/ui/SavedSearchList/ListItem.js b/frontend/app/components/ui/SavedSearchList/ListItem.js index 5f4e61dd0..d38762c63 100644 --- a/frontend/app/components/ui/SavedSearchList/ListItem.js +++ b/frontend/app/components/ui/SavedSearchList/ListItem.js @@ -1,7 +1,7 @@ import React from 'react'; import { Icon } from 'UI'; import cn from "classnames"; -import stl from './listItem.css'; +import stl from './listItem.module.css'; const ListItem = ({icon, label, onClick, onRemove }) => { return ( diff --git a/frontend/app/components/ui/SavedSearchList/SavedSearchList.js b/frontend/app/components/ui/SavedSearchList/SavedSearchList.js index 1e53bd2e7..98c4d5208 100644 --- a/frontend/app/components/ui/SavedSearchList/SavedSearchList.js +++ b/frontend/app/components/ui/SavedSearchList/SavedSearchList.js @@ -1,19 +1,18 @@ import React from 'react'; import { connect } from 'react-redux'; -import stl from './savedSearchList.css'; +import stl from './savedSearchList.module.css'; import cn from 'classnames'; import { Icon, IconButton, Loader, Button } from 'UI'; -import { confirm } from 'UI/Confirmation'; +import { confirm } from 'UI'; import { withRouter } from 'react-router-dom'; import { addFilterByKeyAndValue } from 'Duck/search'; import { fetchList as fetchFunnelsList, - applySavedFilter, remove as deleteSearch, - setActiveFlow, - clearEvents, + // clearEvents, init } from 'Duck/funnels'; +import { setActiveFlow, clearEvents } from 'Duck/filters'; import { setActiveTab } from 'Duck/sessions'; import { funnel as funnelRoute, withSiteId } from 'App/routes'; import Event, { TYPES } from 'Types/filter/event'; @@ -149,7 +148,6 @@ export default connect(state => ({ events: state.getIn([ 'filters', 'appliedFilter', 'events' ]), filters: state.getIn([ 'search', 'instance', 'filters' ]), }), { - applySavedFilter, deleteSearch, setActiveTab, setActiveFlow, clearEvents, addFilterByKeyAndValue, diff --git a/frontend/app/components/ui/SavedSearchList/listItem.css b/frontend/app/components/ui/SavedSearchList/listItem.module.css similarity index 100% rename from frontend/app/components/ui/SavedSearchList/listItem.css rename to frontend/app/components/ui/SavedSearchList/listItem.module.css diff --git a/frontend/app/components/ui/SavedSearchList/savedSearchList.css b/frontend/app/components/ui/SavedSearchList/savedSearchList.module.css similarity index 100% rename from frontend/app/components/ui/SavedSearchList/savedSearchList.css rename to frontend/app/components/ui/SavedSearchList/savedSearchList.module.css diff --git a/frontend/app/components/ui/SegmentSelection/SegmentSelection.js b/frontend/app/components/ui/SegmentSelection/SegmentSelection.js index 74335fddd..feebd694a 100644 --- a/frontend/app/components/ui/SegmentSelection/SegmentSelection.js +++ b/frontend/app/components/ui/SegmentSelection/SegmentSelection.js @@ -1,7 +1,7 @@ import React from 'react'; -import { Icon, Popup } from 'UI'; +import { Icon } from 'UI'; import cn from 'classnames'; -import styles from './segmentSelection.css'; +import styles from './segmentSelection.module.css'; class SegmentSelection extends React.Component { setActiveItem = (item) => { @@ -20,24 +20,15 @@ class SegmentSelection extends React.Component { }, className) } > { list.map(item => ( - !item.disabled && this.setActiveItem(item) } - > - { item.icon && } -
    { item.name }
    - - } - disabled={!item.disabled} - content={ `Coming soon` } - size="tiny" - inverted - position="top center" - /> +
    !item.disabled && this.setActiveItem(item) } + > + { item.icon && } +
    { item.name }
    +
    )) } diff --git a/frontend/app/components/ui/SegmentSelection/segmentSelection.css b/frontend/app/components/ui/SegmentSelection/segmentSelection.module.css similarity index 100% rename from frontend/app/components/ui/SegmentSelection/segmentSelection.css rename to frontend/app/components/ui/SegmentSelection/segmentSelection.module.css diff --git a/frontend/app/components/ui/Select/Select.js b/frontend/app/components/ui/Select/Select.js deleted file mode 100644 index 4a0e80709..000000000 --- a/frontend/app/components/ui/Select/Select.js +++ /dev/null @@ -1,14 +0,0 @@ -import { Select } from 'semantic-ui-react'; - -export default ({ - placeholder, options, value, onChange, ...props -}) => ( - - )) - diff --git a/frontend/app/components/ui/Select/index.js b/frontend/app/components/ui/Select/index.js deleted file mode 100644 index b56d05f24..000000000 --- a/frontend/app/components/ui/Select/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './Select'; \ No newline at end of file diff --git a/frontend/app/components/ui/SideMenuHeader/SideMenuHeader.tsx b/frontend/app/components/ui/SideMenuHeader/SideMenuHeader.tsx index 25545ba32..2f841b2a6 100644 --- a/frontend/app/components/ui/SideMenuHeader/SideMenuHeader.tsx +++ b/frontend/app/components/ui/SideMenuHeader/SideMenuHeader.tsx @@ -1,6 +1,6 @@ import React from 'react'; import cn from 'classnames'; -import stl from './sideMenuHeader.css'; +import stl from './sideMenuHeader.module.css'; function SideMenuHeader(props) { const { text, className, button } = props; diff --git a/frontend/app/components/ui/SideMenuHeader/sideMenuHeader.css b/frontend/app/components/ui/SideMenuHeader/sideMenuHeader.module.css similarity index 100% rename from frontend/app/components/ui/SideMenuHeader/sideMenuHeader.css rename to frontend/app/components/ui/SideMenuHeader/sideMenuHeader.module.css diff --git a/frontend/app/components/ui/SideMenuitem/SideMenuitem.js b/frontend/app/components/ui/SideMenuitem/SideMenuitem.js index dbeca551e..70542063e 100644 --- a/frontend/app/components/ui/SideMenuitem/SideMenuitem.js +++ b/frontend/app/components/ui/SideMenuitem/SideMenuitem.js @@ -1,7 +1,7 @@ import React from 'react'; import { Icon, Popup } from 'UI'; import cn from 'classnames'; -import stl from './sideMenuItem.css'; +import stl from './sideMenuItem.module.css'; function SideMenuitem({ iconBg = false, @@ -19,8 +19,13 @@ function SideMenuitem({ }) { return ( +
    } - } - disabled={ !disabled } - content={ 'No recordings' } - size="tiny" - inverted - position="left center" - /> +
    ) } diff --git a/frontend/app/components/ui/SideMenuitem/sideMenuItem.css b/frontend/app/components/ui/SideMenuitem/sideMenuItem.module.css similarity index 100% rename from frontend/app/components/ui/SideMenuitem/sideMenuItem.css rename to frontend/app/components/ui/SideMenuitem/sideMenuItem.module.css diff --git a/frontend/app/components/ui/SlideModal/SlideModal.js b/frontend/app/components/ui/SlideModal/SlideModal.js index 92f8ba710..23e18c265 100644 --- a/frontend/app/components/ui/SlideModal/SlideModal.js +++ b/frontend/app/components/ui/SlideModal/SlideModal.js @@ -1,4 +1,5 @@ -import styles from './slideModal.css'; +import React from 'react'; +import styles from './slideModal.module.css'; import cn from 'classnames'; export default class SlideModal extends React.PureComponent { // componentDidMount() { @@ -13,10 +14,10 @@ export default class SlideModal extends React.PureComponent { if (prevProps.isDisplayed !== this.props.isDisplayed) { if (this.props.isDisplayed) { document.addEventListener('keydown', this.keyPressHandler); - document.body.classList.add('no-scroll'); + // document.body.classList.add('no-scroll'); } else { document.removeEventListener('keydown', this.keyPressHandler); - document.body.classList.remove('no-scroll'); + // document.body.classList.remove('no-scroll'); } } } diff --git a/frontend/app/components/ui/SlideModal/slideModal.css b/frontend/app/components/ui/SlideModal/slideModal.module.css similarity index 100% rename from frontend/app/components/ui/SlideModal/slideModal.css rename to frontend/app/components/ui/SlideModal/slideModal.module.css diff --git a/frontend/app/components/ui/Slider/Slider.js b/frontend/app/components/ui/Slider/Slider.js deleted file mode 100644 index 58350b91c..000000000 --- a/frontend/app/components/ui/Slider/Slider.js +++ /dev/null @@ -1,9 +0,0 @@ -import { Checkbox } from 'semantic-ui-react'; - -export default ({ className="", ...props }) => ( - -); \ No newline at end of file diff --git a/frontend/app/components/ui/Slider/Slider.stories.js b/frontend/app/components/ui/Slider/Slider.stories.js deleted file mode 100644 index ab0c0f5dd..000000000 --- a/frontend/app/components/ui/Slider/Slider.stories.js +++ /dev/null @@ -1,8 +0,0 @@ -import { storiesOf } from '@storybook/react'; -import Slider from '.'; - -storiesOf('Slider', module) - .add('Pure', () => ( - - )) - diff --git a/frontend/app/components/ui/Slider/index.js b/frontend/app/components/ui/Slider/index.js deleted file mode 100644 index eed87a07a..000000000 --- a/frontend/app/components/ui/Slider/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './Slider'; \ No newline at end of file diff --git a/frontend/app/components/ui/SplitButton/SplitButton.js b/frontend/app/components/ui/SplitButton/SplitButton.js index bcb8cb616..80b4e57ab 100644 --- a/frontend/app/components/ui/SplitButton/SplitButton.js +++ b/frontend/app/components/ui/SplitButton/SplitButton.js @@ -1,7 +1,7 @@ import React from 'react'; import { Button, Icon } from 'UI'; import cn from 'classnames'; -import stl from './splitButton.css'; +import stl from './splitButton.module.css'; const SplitButton = ({primary, label, icon, onButtonClick, onIconClick, disabled = false }) => { return ( diff --git a/frontend/app/components/ui/SplitButton/splitButton.css b/frontend/app/components/ui/SplitButton/splitButton.module.css similarity index 100% rename from frontend/app/components/ui/SplitButton/splitButton.css rename to frontend/app/components/ui/SplitButton/splitButton.module.css diff --git a/frontend/app/components/ui/Tabs/Tabs.js b/frontend/app/components/ui/Tabs/Tabs.js index 10ee939c0..cd9921161 100644 --- a/frontend/app/components/ui/Tabs/Tabs.js +++ b/frontend/app/components/ui/Tabs/Tabs.js @@ -1,5 +1,6 @@ +import React from 'react'; import cn from 'classnames'; -import stl from './tabs.css'; +import stl from './tabs.module.css'; const Tabs = ({ tabs, active, onClick, border = true, className }) => (
    diff --git a/frontend/app/components/ui/Tabs/tabs.css b/frontend/app/components/ui/Tabs/tabs.module.css similarity index 100% rename from frontend/app/components/ui/Tabs/tabs.css rename to frontend/app/components/ui/Tabs/tabs.module.css diff --git a/frontend/app/components/ui/TagBadge/TagBadge.js b/frontend/app/components/ui/TagBadge/TagBadge.js index 40d52ada0..44f5b63a9 100644 --- a/frontend/app/components/ui/TagBadge/TagBadge.js +++ b/frontend/app/components/ui/TagBadge/TagBadge.js @@ -1,5 +1,7 @@ +import React from 'react'; import cn from 'classnames'; -import styles from './tagBadge.css'; +import styles from './tagBadge.module.css'; +import { Icon } from 'UI'; export default class TagBadge extends React.PureComponent { @@ -23,7 +25,8 @@ export default class TagBadge extends React.PureComponent { { text } { onRemove && }
    diff --git a/frontend/app/components/ui/TagBadge/tagBadge.css b/frontend/app/components/ui/TagBadge/tagBadge.module.css similarity index 100% rename from frontend/app/components/ui/TagBadge/tagBadge.css rename to frontend/app/components/ui/TagBadge/tagBadge.module.css diff --git a/frontend/app/components/ui/TagInput/TagInput.js b/frontend/app/components/ui/TagInput/TagInput.js index e3245d75f..9ecd84d0b 100644 --- a/frontend/app/components/ui/TagInput/TagInput.js +++ b/frontend/app/components/ui/TagInput/TagInput.js @@ -1,7 +1,7 @@ import React from 'react'; import { Icon, Button } from 'UI'; import { validateKeyCode } from 'App/validate'; -import styles from './tagInput.css'; +import styles from './tagInput.module.css'; class TagInput extends React.Component { constructor(props) { @@ -55,8 +55,6 @@ class TagInput extends React.Component { { tagEditorDisplayed && diff --git a/frontend/app/duck/.eslintrc b/frontend/app/duck/.eslintrc index 271db542f..c3aa9d050 100644 --- a/frontend/app/duck/.eslintrc +++ b/frontend/app/duck/.eslintrc @@ -1,5 +1,9 @@ { "rules": { "complexity": 0 + }, + "env": { + "browser": true, + "node": true } } diff --git a/frontend/app/duck/alerts.js b/frontend/app/duck/alerts.js index 3783474d4..623b34301 100644 --- a/frontend/app/duck/alerts.js +++ b/frontend/app/duck/alerts.js @@ -29,7 +29,7 @@ const reducer = (state = initialState, action = {}) => { // }) // ); case FETCH_TRIGGER_OPTIONS.SUCCESS: - return state.set('triggerOptions', action.data.map(({ name, value }) => ({ text: name, value }))); + return state.set('triggerOptions', action.data.map(({ name, value }) => ({ label: name, value }))); } return state; }; diff --git a/frontend/app/duck/assignments.js b/frontend/app/duck/assignments.js index 0612faba1..3a73c2e66 100644 --- a/frontend/app/duck/assignments.js +++ b/frontend/app/duck/assignments.js @@ -41,6 +41,7 @@ const reducer = (state = initialState, action = {}) => { case EDIT: return state.mergeIn([ 'instance' ], action.instance); case FETCH_PROJECTS.SUCCESS: + console.log('data', action.data) return state.set('projects', List(action.data)).set('projectsFetched', true); case FETCH_ASSIGNMENTS.SUCCESS: return state.set('list', List(action.data).map(Assignment)); diff --git a/frontend/app/duck/components/index.js b/frontend/app/duck/components/index.js index 5c45d0c43..faef82566 100644 --- a/frontend/app/duck/components/index.js +++ b/frontend/app/duck/components/index.js @@ -1,11 +1,9 @@ import { combineReducers } from 'redux-immutable'; import targetDefiner from './targetDefiner'; -import resultsModal from './resultsModal'; import player from './player'; export default combineReducers({ targetDefiner, - resultsModal, player, }); diff --git a/frontend/app/duck/components/resultsModal.js b/frontend/app/duck/components/resultsModal.js deleted file mode 100644 index 28b4abe72..000000000 --- a/frontend/app/duck/components/resultsModal.js +++ /dev/null @@ -1,54 +0,0 @@ -import { List, Map } from 'immutable'; -import Run from 'Types/run'; -import withRequestState, { RequestTypes } from 'Duck/requestStateCreator'; - -const OPEN = 'resultsModal/OPEN'; -const CLOSE = 'resultsModal/CLOSE'; -const FETCH = new RequestTypes('resultsModal/FETCH'); - -const initialState = Map({ - results: Run(), - open: false, -}); - -const reducer = (state = initialState, action = {}) => { - switch (action.type) { - case OPEN: - return state.set('open', true).set('results', action.results); - case CLOSE: - return state.set('open', false); - case FETCH.REQUEST: - return state.set( - 'results', - Run(), - ).set('open', true); - case FETCH.SUCCESS: - return state.set( - 'results', - Run(action.data), - ).set('open', true); - } - return state; -}; - -export default withRequestState(FETCH, reducer); - -export function open(results) { - return { - type: OPEN, - results, - }; -} - -export function close() { - return { - type: CLOSE, - }; -} - -export function fetchResults(runId) { - return { - types: FETCH.toArray(), - call: client => client.get(`/runs/${ runId }`), - }; -} diff --git a/frontend/app/duck/search.js b/frontend/app/duck/search.js index c003515a9..a5e1d89c0 100644 --- a/frontend/app/duck/search.js +++ b/frontend/app/duck/search.js @@ -65,7 +65,7 @@ function reducer(state = initialState, action = {}) { return state.set('filterList', generateFilterOptions(filtersMap)) .set('filterListLive', generateLiveFilterOptions(liveFiltersMap)); case EDIT: - return state.mergeIn(['instance'], action.instance); + return state.mergeIn(['instance'], action.instance).set('currentPage', 1); case APPLY: return action.fromUrl ? state.set('instance', Filter(action.filter)) diff --git a/frontend/app/init/codemirror.js b/frontend/app/init/codemirror.js deleted file mode 100644 index 37911ae6f..000000000 --- a/frontend/app/init/codemirror.js +++ /dev/null @@ -1,9 +0,0 @@ -import { JSHINT } from 'jshint'; -import 'codemirror/mode/javascript/javascript'; -import 'codemirror/addon/lint/lint'; -import 'codemirror/addon/lint/javascript-lint'; - -window.JSHINT = JSHINT; - -// Init with no errors -JSHINT(''); diff --git a/frontend/app/init/index.js b/frontend/app/init/index.js index 082b95b7c..e0297d974 100644 --- a/frontend/app/init/index.js +++ b/frontend/app/init/index.js @@ -1,3 +1,2 @@ -import './codemirror'; import './immutable'; import './sentry'; \ No newline at end of file diff --git a/frontend/app/init/sentry.js b/frontend/app/init/sentry.js index dabf12ec3..0742e9c84 100644 --- a/frontend/app/init/sentry.js +++ b/frontend/app/init/sentry.js @@ -1,5 +1,5 @@ import * as Sentry from '@sentry/browser'; -if (window.ENV.SENTRY_ENABLED) { - Sentry.init({ dsn: window.ENV.SENTRY_URL }); +if (window.env.SENTRY_ENABLED === 'true') { + Sentry.init({ dsn: window.env.SENTRY_URL }); } \ No newline at end of file diff --git a/frontend/app/initialize.js b/frontend/app/initialize.js index 874bd0586..27698522a 100644 --- a/frontend/app/initialize.js +++ b/frontend/app/initialize.js @@ -1,11 +1,14 @@ +// import 'semantic-ui-css/semantic.min.css'; +import './styles/index.scss'; +import React from 'react'; import './init'; import { render } from 'react-dom'; import { Provider } from 'react-redux'; import store from './store'; import Router from './Router'; import { StoreProvider, RootStore } from './mstore'; -import { HTML5Backend } from 'react-dnd-html5-backend' -import { DndProvider } from 'react-dnd' +import { HTML5Backend } from 'react-dnd-html5-backend'; +import { DndProvider } from 'react-dnd'; document.addEventListener('DOMContentLoaded', () => { render( diff --git a/frontend/app/logger/index.js b/frontend/app/logger/index.js index c698f46e1..bb97d86a7 100644 --- a/frontend/app/logger/index.js +++ b/frontend/app/logger/index.js @@ -1,19 +1,19 @@ import { options } from 'App/dev/console'; function log(...args) { - if (!window.ENV.PRODUCTION || options.logStuff) { + if (!window.env.PRODUCTION || options.logStuff) { console.log(...args); } } function warn(...args) { - if (!window.ENV.PRODUCTION || options.logStuff) { + if (!window.env.PRODUCTION || options.logStuff) { console.warn(...args); } } function error(...args) { - if (!window.ENV.PRODUCTION || options.logStuff) { + if (!window.env.PRODUCTION || options.logStuff) { console.error(...args); } } diff --git a/frontend/app/mstore/types/filterItem.ts b/frontend/app/mstore/types/filterItem.ts index 00b2a6fdc..eb484696a 100644 --- a/frontend/app/mstore/types/filterItem.ts +++ b/frontend/app/mstore/types/filterItem.ts @@ -1,4 +1,3 @@ -import { filter } from "App/components/BugFinder/ManageFilters/savedFilterList.css" import { makeAutoObservable, runInAction, observable, action, reaction } from "mobx" import { FilterKey, FilterType } from 'Types/filter/filterType' import { filtersMap } from 'Types/filter/newFilter' diff --git a/frontend/app/player/MessageDistributor/StatedScreen/Screen/BaseScreen.ts b/frontend/app/player/MessageDistributor/StatedScreen/Screen/BaseScreen.ts index fa66d5eb4..fc52660f5 100644 --- a/frontend/app/player/MessageDistributor/StatedScreen/Screen/BaseScreen.ts +++ b/frontend/app/player/MessageDistributor/StatedScreen/Screen/BaseScreen.ts @@ -1,4 +1,4 @@ -import styles from './screen.css'; +import styles from './screen.module.css'; import { getState } from '../../../store'; import type { Point } from './types'; diff --git a/frontend/app/player/MessageDistributor/StatedScreen/Screen/Cursor.ts b/frontend/app/player/MessageDistributor/StatedScreen/Screen/Cursor.ts index b030403b8..ee527677b 100644 --- a/frontend/app/player/MessageDistributor/StatedScreen/Screen/Cursor.ts +++ b/frontend/app/player/MessageDistributor/StatedScreen/Screen/Cursor.ts @@ -1,5 +1,5 @@ import type { Point } from './types'; -import styles from './cursor.css'; +import styles from './cursor.module.css'; export default class Cursor { diff --git a/frontend/app/player/MessageDistributor/StatedScreen/Screen/Marker.js b/frontend/app/player/MessageDistributor/StatedScreen/Screen/Marker.js index 68e0489a8..5461422cf 100644 --- a/frontend/app/player/MessageDistributor/StatedScreen/Screen/Marker.js +++ b/frontend/app/player/MessageDistributor/StatedScreen/Screen/Marker.js @@ -1,4 +1,4 @@ -import styles from './marker.css'; +import styles from './marker.module.css'; export default class Marker { _target = null; diff --git a/frontend/app/player/MessageDistributor/StatedScreen/Screen/Screen.ts b/frontend/app/player/MessageDistributor/StatedScreen/Screen/Screen.ts index 034e65b3a..a0ae8a800 100644 --- a/frontend/app/player/MessageDistributor/StatedScreen/Screen/Screen.ts +++ b/frontend/app/player/MessageDistributor/StatedScreen/Screen/Screen.ts @@ -1,11 +1,12 @@ import Marker from './Marker'; import Cursor from './Cursor'; import Inspector from './Inspector'; -import styles from './screen.css'; -import { getState } from '../../../store'; +// import styles from './screen.module.css'; +// import { getState } from '../../../store'; import BaseScreen from './BaseScreen'; -export { INITIAL_STATE, State } from './BaseScreen'; +export { INITIAL_STATE } from './BaseScreen'; +export type { State } from './BaseScreen'; export default class Screen extends BaseScreen { public readonly cursor: Cursor; diff --git a/frontend/app/player/MessageDistributor/StatedScreen/Screen/cursor.css b/frontend/app/player/MessageDistributor/StatedScreen/Screen/cursor.module.css similarity index 100% rename from frontend/app/player/MessageDistributor/StatedScreen/Screen/cursor.css rename to frontend/app/player/MessageDistributor/StatedScreen/Screen/cursor.module.css diff --git a/frontend/app/player/MessageDistributor/StatedScreen/Screen/marker.css b/frontend/app/player/MessageDistributor/StatedScreen/Screen/marker.module.css similarity index 100% rename from frontend/app/player/MessageDistributor/StatedScreen/Screen/marker.css rename to frontend/app/player/MessageDistributor/StatedScreen/Screen/marker.module.css diff --git a/frontend/app/player/MessageDistributor/StatedScreen/Screen/screen.css b/frontend/app/player/MessageDistributor/StatedScreen/Screen/screen.module.css similarity index 100% rename from frontend/app/player/MessageDistributor/StatedScreen/Screen/screen.css rename to frontend/app/player/MessageDistributor/StatedScreen/Screen/screen.module.css diff --git a/frontend/app/player/MessageDistributor/managers/AssistManager.ts b/frontend/app/player/MessageDistributor/managers/AssistManager.ts index d8b93fb81..f28c54617 100644 --- a/frontend/app/player/MessageDistributor/managers/AssistManager.ts +++ b/frontend/app/player/MessageDistributor/managers/AssistManager.ts @@ -124,7 +124,7 @@ export default class AssistManager { if (this.cleaned) { return } if (this.socket) { this.socket.close() } // TODO: single socket connection // @ts-ignore - const urlObject = new URL(window.ENV.API_EDP) // does it handle ssl automatically? + const urlObject = new URL(window.env.API_EDP) // does it handle ssl automatically? // @ts-ignore WTF, socket.io ??? const socket: Socket = this.socket = io(urlObject.origin, { @@ -303,7 +303,7 @@ export default class AssistManager { if (this._peer && !this._peer.disconnected) { return Promise.resolve(this._peer) } // @ts-ignore - const urlObject = new URL(window.ENV.API_EDP) + const urlObject = new URL(window.env.API_EDP) return import('peerjs').then(({ default: Peer }) => { if (this.cleaned) {return Promise.reject("Already cleaned")} const peerOpts = { diff --git a/frontend/app/player/MessageDistributor/managers/DOMManager.ts b/frontend/app/player/MessageDistributor/managers/DOMManager.ts index 6c7d5fbcf..9f1760df8 100644 --- a/frontend/app/player/MessageDistributor/managers/DOMManager.ts +++ b/frontend/app/player/MessageDistributor/managers/DOMManager.ts @@ -183,7 +183,7 @@ export default class DOMManager extends ListWalker { if (!node) { logger.error("Node not found", msg); return } if (this.isLink[ id ] && name === "href") { // @ts-ignore TODO: global ENV type - if (value.startsWith(window.ENV.ASSETS_HOST)) { // Hack for queries in rewrited urls + if (value.startsWith(window.env.ASSETS_HOST || window.location.origin + '/assets')) { // Hack for queries in rewrited urls value = value.replace("?", "%3F"); } this.stylesManager.setStyleHandlers(node, value); diff --git a/frontend/app/player/ios/ScreenList.js b/frontend/app/player/ios/ScreenList.ts similarity index 100% rename from frontend/app/player/ios/ScreenList.js rename to frontend/app/player/ios/ScreenList.ts diff --git a/frontend/app/routes.js b/frontend/app/routes.js index 4492a4b63..d1724dfd5 100644 --- a/frontend/app/routes.js +++ b/frontend/app/routes.js @@ -111,12 +111,6 @@ export const metrics = () => `/metrics`; export const metricCreate = () => `/metrics/create`; export const metricDetails = (id = ':metricId', hash) => hashed(`/metrics/${ id }`, hash); - -export const RESULTS_QUERY_KEY = 'results'; -export const METRICS_QUERY_KEY = 'metrics'; -export const SOURCE_QUERY_KEY = 'source'; -export const WIDGET_QUERY_KEY = 'widget'; - const REQUIRED_SITE_ID_ROUTES = [ liveSession(''), session(''), diff --git a/frontend/app/styles/codemirror.css b/frontend/app/styles/codemirror.css deleted file mode 100644 index 5cf5bca8a..000000000 --- a/frontend/app/styles/codemirror.css +++ /dev/null @@ -1,59 +0,0 @@ -.cm-s-yeti.CodeMirror { - background-color: #ffffff !important; - color: #d1c9c0 !important; - border: none; - border-radius: 4px; -} - -.cm-s-yeti .CodeMirror-gutters { - color: #adaba6; - background-color: #ffffff; - border: none; -} - -.cm-s-yeti span.cm-comment { color: #777; } -.cm-s-yeti span.cm-def { color: #00f; } -.cm-s-yeti span.cm-keyword { color: #708; } -.cm-s-yeti span.cm-variable { color: #00f; } -.cm-s-yeti span.cm-string { color: #0a9d0a; } -.cm-s-yeti span.cm-property { color: #607392; } - -.cm-s-custom.CodeMirror { - background-color: transparent !important; - color: #d1c9c0 !important; - border: none; - border-radius: 4px; - height: auto; -} - -.cm-s-custom span.cm-comment { color: #777; } -.cm-s-custom span.cm-def { color: #00f; } -.cm-s-custom span.cm-keyword { color: #708; } -.cm-s-custom span.cm-variable { color: #00f; } -.cm-s-custom span.cm-string { color: #0a9d0a; } -.cm-s-custom span.cm-property { color: #607392; } -.cm-s-custom .CodeMirror-hscrollbar { overflow: hidden !important; } -.cm-s-custom .CodeMirror-sizer { min-width: 100% !important; } -.cm-s-custom pre { max-width: 100% !important; overflow: hidden; } - - -.cm-s-docs.CodeMirror { - background-color: #000 !important; - color: white !important; - border: none; - border-radius: 4px; - height: auto; - padding: 10px; -} - -.cm-s-docs span.cm-comment { color: #777; } -.cm-s-docs span.cm-def { color: rgb(156, 220, 254); } -.cm-s-docs span.cm-keyword { color: rgb(86, 156, 214); } -.cm-s-docs span.cm-variable { color: rgb(156, 220, 254); } -.cm-s-docs span.cm-string { color: rgb(206, 145, 120); } -.cm-s-docs span.cm-number { color: rgb(206, 145, 120); } -.cm-s-docs span.cm-property { color: rgb(156, 220, 254); } -.cm-s-docs span.cm-operator { color: rgb(156, 220, 254); } -.cm-s-docs .CodeMirror-hscrollbar { overflow: hidden !important; } -.cm-s-docs .CodeMirror-sizer { min-width: 100% !important; } -.cm-s-docs pre { max-width: 100% !important; overflow: hidden; } \ No newline at end of file diff --git a/frontend/app/styles/flags.css b/frontend/app/styles/flags.css index e8fbcab85..478726a65 100644 --- a/frontend/app/styles/flags.css +++ b/frontend/app/styles/flags.css @@ -1 +1 @@ -span.flag{width:44px;height:30px;display:inline-block}img.flag{width:30px}.flag{background:url(/img/flags_responsive.png) no-repeat;background-size:100%}.flag-ad{background-position:0 .413223%}.flag-ae{background-position:0 .826446%}.flag-af{background-position:0 1.239669%}.flag-ag{background-position:0 1.652893%}.flag-ai{background-position:0 2.066116%}.flag-al{background-position:0 2.479339%}.flag-am{background-position:0 2.892562%}.flag-an{background-position:0 3.305785%}.flag-ao{background-position:0 3.719008%}.flag-aq{background-position:0 4.132231%}.flag-ar{background-position:0 4.545455%}.flag-as{background-position:0 4.958678%}.flag-at{background-position:0 5.371901%}.flag-au{background-position:0 5.785124%}.flag-aw{background-position:0 6.198347%}.flag-az{background-position:0 6.61157%}.flag-ba{background-position:0 7.024793%}.flag-bb{background-position:0 7.438017%}.flag-bd{background-position:0 7.85124%}.flag-be{background-position:0 8.264463%}.flag-bf{background-position:0 8.677686%}.flag-bg{background-position:0 9.090909%}.flag-bh{background-position:0 9.504132%}.flag-bi{background-position:0 9.917355%}.flag-bj{background-position:0 10.330579%}.flag-bm{background-position:0 10.743802%}.flag-bn{background-position:0 11.157025%}.flag-bo{background-position:0 11.570248%}.flag-br{background-position:0 11.983471%}.flag-bs{background-position:0 12.396694%}.flag-bt{background-position:0 12.809917%}.flag-bv{background-position:0 13.22314%}.flag-bw{background-position:0 13.636364%}.flag-by{background-position:0 14.049587%}.flag-bz{background-position:0 14.46281%}.flag-ca{background-position:0 14.876033%}.flag-cc{background-position:0 15.289256%}.flag-cd{background-position:0 15.702479%}.flag-cf{background-position:0 16.115702%}.flag-cg{background-position:0 16.528926%}.flag-ch{background-position:0 16.942149%}.flag-ci{background-position:0 17.355372%}.flag-ck{background-position:0 17.768595%}.flag-cl{background-position:0 18.181818%}.flag-cm{background-position:0 18.595041%}.flag-cn{background-position:0 19.008264%}.flag-co{background-position:0 19.421488%}.flag-cr{background-position:0 19.834711%}.flag-cu{background-position:0 20.247934%}.flag-cv{background-position:0 20.661157%}.flag-cx{background-position:0 21.07438%}.flag-cy{background-position:0 21.487603%}.flag-cz{background-position:0 21.900826%}.flag-de{background-position:0 22.31405%}.flag-dj{background-position:0 22.727273%}.flag-dk{background-position:0 23.140496%}.flag-dm{background-position:0 23.553719%}.flag-do{background-position:0 23.966942%}.flag-dz{background-position:0 24.380165%}.flag-ec{background-position:0 24.793388%}.flag-ee{background-position:0 25.206612%}.flag-eg{background-position:0 25.619835%}.flag-eh{background-position:0 26.033058%}.flag-er{background-position:0 26.446281%}.flag-es{background-position:0 26.859504%}.flag-et{background-position:0 27.272727%}.flag-fi{background-position:0 27.68595%}.flag-fj{background-position:0 28.099174%}.flag-fk{background-position:0 28.512397%}.flag-fm{background-position:0 28.92562%}.flag-fo{background-position:0 29.338843%}.flag-fr{background-position:0 29.752066%}.flag-ga{background-position:0 30.165289%}.flag-gd{background-position:0 30.578512%}.flag-ge{background-position:0 30.991736%}.flag-gf{background-position:0 31.404959%}.flag-gh{background-position:0 31.818182%}.flag-gi{background-position:0 32.231405%}.flag-gl{background-position:0 32.644628%}.flag-gm{background-position:0 33.057851%}.flag-gn{background-position:0 33.471074%}.flag-gp{background-position:0 33.884298%}.flag-gq{background-position:0 34.297521%}.flag-gr{background-position:0 34.710744%}.flag-gs{background-position:0 35.123967%}.flag-gt{background-position:0 35.53719%}.flag-gu{background-position:0 35.950413%}.flag-gw{background-position:0 36.363636%}.flag-gy{background-position:0 36.77686%}.flag-hk{background-position:0 37.190083%}.flag-hm{background-position:0 37.603306%}.flag-hn{background-position:0 38.016529%}.flag-hr{background-position:0 38.429752%}.flag-ht{background-position:0 38.842975%}.flag-hu{background-position:0 39.256198%}.flag-id{background-position:0 39.669421%}.flag-ie{background-position:0 40.082645%}.flag-il{background-position:0 40.495868%}.flag-in{background-position:0 40.909091%}.flag-io{background-position:0 41.322314%}.flag-iq{background-position:0 41.735537%}.flag-ir{background-position:0 42.14876%}.flag-is{background-position:0 42.561983%}.flag-it{background-position:0 42.975207%}.flag-jm{background-position:0 43.38843%}.flag-jo{background-position:0 43.801653%}.flag-jp{background-position:0 44.214876%}.flag-ke{background-position:0 44.628099%}.flag-kg{background-position:0 45.041322%}.flag-kh{background-position:0 45.454545%}.flag-ki{background-position:0 45.867769%}.flag-km{background-position:0 46.280992%}.flag-kn{background-position:0 46.694215%}.flag-kp{background-position:0 47.107438%}.flag-kr{background-position:0 47.520661%}.flag-kw{background-position:0 47.933884%}.flag-ky{background-position:0 48.347107%}.flag-kz{background-position:0 48.760331%}.flag-la{background-position:0 49.173554%}.flag-lb{background-position:0 49.586777%}.flag-lc{background-position:0 50%}.flag-li{background-position:0 50.413223%}.flag-lk{background-position:0 50.826446%}.flag-lr{background-position:0 51.239669%}.flag-ls{background-position:0 51.652893%}.flag-lt{background-position:0 52.066116%}.flag-lu{background-position:0 52.479339%}.flag-lv{background-position:0 52.892562%}.flag-ly{background-position:0 53.305785%}.flag-ma{background-position:0 53.719008%}.flag-mc{background-position:0 54.132231%}.flag-md{background-position:0 54.545455%}.flag-me{background-position:0 54.958678%}.flag-mg{background-position:0 55.371901%}.flag-mh{background-position:0 55.785124%}.flag-mk{background-position:0 56.198347%}.flag-ml{background-position:0 56.61157%}.flag-mm{background-position:0 57.024793%}.flag-mn{background-position:0 57.438017%}.flag-mo{background-position:0 57.85124%}.flag-mp{background-position:0 58.264463%}.flag-mq{background-position:0 58.677686%}.flag-mr{background-position:0 59.090909%}.flag-ms{background-position:0 59.504132%}.flag-mt{background-position:0 59.917355%}.flag-mu{background-position:0 60.330579%}.flag-mv{background-position:0 60.743802%}.flag-mw{background-position:0 61.157025%}.flag-mx{background-position:0 61.570248%}.flag-my{background-position:0 61.983471%}.flag-mz{background-position:0 62.396694%}.flag-na{background-position:0 62.809917%}.flag-nc{background-position:0 63.22314%}.flag-ne{background-position:0 63.636364%}.flag-nf{background-position:0 64.049587%}.flag-ng{background-position:0 64.46281%}.flag-ni{background-position:0 64.876033%}.flag-nl{background-position:0 65.289256%}.flag-no{background-position:0 65.702479%}.flag-np{background-position:0 66.115702%}.flag-nr{background-position:0 66.528926%}.flag-nu{background-position:0 66.942149%}.flag-nz{background-position:0 67.355372%}.flag-om{background-position:0 67.768595%}.flag-pa{background-position:0 68.181818%}.flag-pe{background-position:0 68.595041%}.flag-pf{background-position:0 69.008264%}.flag-pg{background-position:0 69.421488%}.flag-ph{background-position:0 69.834711%}.flag-pk{background-position:0 70.247934%}.flag-pl{background-position:0 70.661157%}.flag-pm{background-position:0 71.07438%}.flag-pn{background-position:0 71.487603%}.flag-pr{background-position:0 71.900826%}.flag-pt{background-position:0 72.31405%}.flag-pw{background-position:0 72.727273%}.flag-py{background-position:0 73.140496%}.flag-qa{background-position:0 73.553719%}.flag-re{background-position:0 73.966942%}.flag-ro{background-position:0 74.380165%}.flag-rs{background-position:0 74.793388%}.flag-ru{background-position:0 75.206612%}.flag-rw{background-position:0 75.619835%}.flag-sa{background-position:0 76.033058%}.flag-sb{background-position:0 76.446281%}.flag-sc{background-position:0 76.859504%}.flag-sd{background-position:0 77.272727%}.flag-se{background-position:0 77.68595%}.flag-sg{background-position:0 78.099174%}.flag-sh{background-position:0 78.512397%}.flag-si{background-position:0 78.92562%}.flag-sj{background-position:0 79.338843%}.flag-sk{background-position:0 79.752066%}.flag-sl{background-position:0 80.165289%}.flag-sm{background-position:0 80.578512%}.flag-sn{background-position:0 80.991736%}.flag-so{background-position:0 81.404959%}.flag-sr{background-position:0 81.818182%}.flag-ss{background-position:0 82.231405%}.flag-st{background-position:0 82.644628%}.flag-sv{background-position:0 83.057851%}.flag-sy{background-position:0 83.471074%}.flag-sz{background-position:0 83.884298%}.flag-tc{background-position:0 84.297521%}.flag-td{background-position:0 84.710744%}.flag-tf{background-position:0 85.123967%}.flag-tg{background-position:0 85.53719%}.flag-th{background-position:0 85.950413%}.flag-tj{background-position:0 86.363636%}.flag-tk{background-position:0 86.77686%}.flag-tl{background-position:0 87.190083%}.flag-tm{background-position:0 87.603306%}.flag-tn{background-position:0 88.016529%}.flag-to{background-position:0 88.429752%}.flag-tp{background-position:0 88.842975%}.flag-tr{background-position:0 89.256198%}.flag-tt{background-position:0 89.669421%}.flag-tv{background-position:0 90.082645%}.flag-tw{background-position:0 90.495868%}.flag-ty{background-position:0 90.909091%}.flag-tz{background-position:0 91.322314%}.flag-ua{background-position:0 91.735537%}.flag-ug{background-position:0 92.14876%}.flag-gb,.flag-uk{background-position:0 92.561983%}.flag-um{background-position:0 92.975207%}.flag-us{background-position:0 93.38843%}.flag-uy{background-position:0 93.801653%}.flag-uz{background-position:0 94.214876%}.flag-va{background-position:0 94.628099%}.flag-vc{background-position:0 95.041322%}.flag-ve{background-position:0 95.454545%}.flag-vg{background-position:0 95.867769%}.flag-vi{background-position:0 96.280992%}.flag-vn{background-position:0 96.694215%}.flag-vu{background-position:0 97.107438%}.flag-wf{background-position:0 97.520661%}.flag-ws{background-position:0 97.933884%}.flag-ye{background-position:0 98.347107%}.flag-za{background-position:0 98.760331%}.flag-zm{background-position:0 99.173554%}.flag-zr{background-position:0 99.586777%}.flag-zw{background-position:0 100%} \ No newline at end of file +span.flag{width:44px;height:30px;display:inline-block}img.flag{width:30px}.flag{background:url(/app/assets/img/flags_responsive.png) no-repeat;background-size:100%}.flag-ad{background-position:0 .413223%}.flag-ae{background-position:0 .826446%}.flag-af{background-position:0 1.239669%}.flag-ag{background-position:0 1.652893%}.flag-ai{background-position:0 2.066116%}.flag-al{background-position:0 2.479339%}.flag-am{background-position:0 2.892562%}.flag-an{background-position:0 3.305785%}.flag-ao{background-position:0 3.719008%}.flag-aq{background-position:0 4.132231%}.flag-ar{background-position:0 4.545455%}.flag-as{background-position:0 4.958678%}.flag-at{background-position:0 5.371901%}.flag-au{background-position:0 5.785124%}.flag-aw{background-position:0 6.198347%}.flag-az{background-position:0 6.61157%}.flag-ba{background-position:0 7.024793%}.flag-bb{background-position:0 7.438017%}.flag-bd{background-position:0 7.85124%}.flag-be{background-position:0 8.264463%}.flag-bf{background-position:0 8.677686%}.flag-bg{background-position:0 9.090909%}.flag-bh{background-position:0 9.504132%}.flag-bi{background-position:0 9.917355%}.flag-bj{background-position:0 10.330579%}.flag-bm{background-position:0 10.743802%}.flag-bn{background-position:0 11.157025%}.flag-bo{background-position:0 11.570248%}.flag-br{background-position:0 11.983471%}.flag-bs{background-position:0 12.396694%}.flag-bt{background-position:0 12.809917%}.flag-bv{background-position:0 13.22314%}.flag-bw{background-position:0 13.636364%}.flag-by{background-position:0 14.049587%}.flag-bz{background-position:0 14.46281%}.flag-ca{background-position:0 14.876033%}.flag-cc{background-position:0 15.289256%}.flag-cd{background-position:0 15.702479%}.flag-cf{background-position:0 16.115702%}.flag-cg{background-position:0 16.528926%}.flag-ch{background-position:0 16.942149%}.flag-ci{background-position:0 17.355372%}.flag-ck{background-position:0 17.768595%}.flag-cl{background-position:0 18.181818%}.flag-cm{background-position:0 18.595041%}.flag-cn{background-position:0 19.008264%}.flag-co{background-position:0 19.421488%}.flag-cr{background-position:0 19.834711%}.flag-cu{background-position:0 20.247934%}.flag-cv{background-position:0 20.661157%}.flag-cx{background-position:0 21.07438%}.flag-cy{background-position:0 21.487603%}.flag-cz{background-position:0 21.900826%}.flag-de{background-position:0 22.31405%}.flag-dj{background-position:0 22.727273%}.flag-dk{background-position:0 23.140496%}.flag-dm{background-position:0 23.553719%}.flag-do{background-position:0 23.966942%}.flag-dz{background-position:0 24.380165%}.flag-ec{background-position:0 24.793388%}.flag-ee{background-position:0 25.206612%}.flag-eg{background-position:0 25.619835%}.flag-eh{background-position:0 26.033058%}.flag-er{background-position:0 26.446281%}.flag-es{background-position:0 26.859504%}.flag-et{background-position:0 27.272727%}.flag-fi{background-position:0 27.68595%}.flag-fj{background-position:0 28.099174%}.flag-fk{background-position:0 28.512397%}.flag-fm{background-position:0 28.92562%}.flag-fo{background-position:0 29.338843%}.flag-fr{background-position:0 29.752066%}.flag-ga{background-position:0 30.165289%}.flag-gd{background-position:0 30.578512%}.flag-ge{background-position:0 30.991736%}.flag-gf{background-position:0 31.404959%}.flag-gh{background-position:0 31.818182%}.flag-gi{background-position:0 32.231405%}.flag-gl{background-position:0 32.644628%}.flag-gm{background-position:0 33.057851%}.flag-gn{background-position:0 33.471074%}.flag-gp{background-position:0 33.884298%}.flag-gq{background-position:0 34.297521%}.flag-gr{background-position:0 34.710744%}.flag-gs{background-position:0 35.123967%}.flag-gt{background-position:0 35.53719%}.flag-gu{background-position:0 35.950413%}.flag-gw{background-position:0 36.363636%}.flag-gy{background-position:0 36.77686%}.flag-hk{background-position:0 37.190083%}.flag-hm{background-position:0 37.603306%}.flag-hn{background-position:0 38.016529%}.flag-hr{background-position:0 38.429752%}.flag-ht{background-position:0 38.842975%}.flag-hu{background-position:0 39.256198%}.flag-id{background-position:0 39.669421%}.flag-ie{background-position:0 40.082645%}.flag-il{background-position:0 40.495868%}.flag-in{background-position:0 40.909091%}.flag-io{background-position:0 41.322314%}.flag-iq{background-position:0 41.735537%}.flag-ir{background-position:0 42.14876%}.flag-is{background-position:0 42.561983%}.flag-it{background-position:0 42.975207%}.flag-jm{background-position:0 43.38843%}.flag-jo{background-position:0 43.801653%}.flag-jp{background-position:0 44.214876%}.flag-ke{background-position:0 44.628099%}.flag-kg{background-position:0 45.041322%}.flag-kh{background-position:0 45.454545%}.flag-ki{background-position:0 45.867769%}.flag-km{background-position:0 46.280992%}.flag-kn{background-position:0 46.694215%}.flag-kp{background-position:0 47.107438%}.flag-kr{background-position:0 47.520661%}.flag-kw{background-position:0 47.933884%}.flag-ky{background-position:0 48.347107%}.flag-kz{background-position:0 48.760331%}.flag-la{background-position:0 49.173554%}.flag-lb{background-position:0 49.586777%}.flag-lc{background-position:0 50%}.flag-li{background-position:0 50.413223%}.flag-lk{background-position:0 50.826446%}.flag-lr{background-position:0 51.239669%}.flag-ls{background-position:0 51.652893%}.flag-lt{background-position:0 52.066116%}.flag-lu{background-position:0 52.479339%}.flag-lv{background-position:0 52.892562%}.flag-ly{background-position:0 53.305785%}.flag-ma{background-position:0 53.719008%}.flag-mc{background-position:0 54.132231%}.flag-md{background-position:0 54.545455%}.flag-me{background-position:0 54.958678%}.flag-mg{background-position:0 55.371901%}.flag-mh{background-position:0 55.785124%}.flag-mk{background-position:0 56.198347%}.flag-ml{background-position:0 56.61157%}.flag-mm{background-position:0 57.024793%}.flag-mn{background-position:0 57.438017%}.flag-mo{background-position:0 57.85124%}.flag-mp{background-position:0 58.264463%}.flag-mq{background-position:0 58.677686%}.flag-mr{background-position:0 59.090909%}.flag-ms{background-position:0 59.504132%}.flag-mt{background-position:0 59.917355%}.flag-mu{background-position:0 60.330579%}.flag-mv{background-position:0 60.743802%}.flag-mw{background-position:0 61.157025%}.flag-mx{background-position:0 61.570248%}.flag-my{background-position:0 61.983471%}.flag-mz{background-position:0 62.396694%}.flag-na{background-position:0 62.809917%}.flag-nc{background-position:0 63.22314%}.flag-ne{background-position:0 63.636364%}.flag-nf{background-position:0 64.049587%}.flag-ng{background-position:0 64.46281%}.flag-ni{background-position:0 64.876033%}.flag-nl{background-position:0 65.289256%}.flag-no{background-position:0 65.702479%}.flag-np{background-position:0 66.115702%}.flag-nr{background-position:0 66.528926%}.flag-nu{background-position:0 66.942149%}.flag-nz{background-position:0 67.355372%}.flag-om{background-position:0 67.768595%}.flag-pa{background-position:0 68.181818%}.flag-pe{background-position:0 68.595041%}.flag-pf{background-position:0 69.008264%}.flag-pg{background-position:0 69.421488%}.flag-ph{background-position:0 69.834711%}.flag-pk{background-position:0 70.247934%}.flag-pl{background-position:0 70.661157%}.flag-pm{background-position:0 71.07438%}.flag-pn{background-position:0 71.487603%}.flag-pr{background-position:0 71.900826%}.flag-pt{background-position:0 72.31405%}.flag-pw{background-position:0 72.727273%}.flag-py{background-position:0 73.140496%}.flag-qa{background-position:0 73.553719%}.flag-re{background-position:0 73.966942%}.flag-ro{background-position:0 74.380165%}.flag-rs{background-position:0 74.793388%}.flag-ru{background-position:0 75.206612%}.flag-rw{background-position:0 75.619835%}.flag-sa{background-position:0 76.033058%}.flag-sb{background-position:0 76.446281%}.flag-sc{background-position:0 76.859504%}.flag-sd{background-position:0 77.272727%}.flag-se{background-position:0 77.68595%}.flag-sg{background-position:0 78.099174%}.flag-sh{background-position:0 78.512397%}.flag-si{background-position:0 78.92562%}.flag-sj{background-position:0 79.338843%}.flag-sk{background-position:0 79.752066%}.flag-sl{background-position:0 80.165289%}.flag-sm{background-position:0 80.578512%}.flag-sn{background-position:0 80.991736%}.flag-so{background-position:0 81.404959%}.flag-sr{background-position:0 81.818182%}.flag-ss{background-position:0 82.231405%}.flag-st{background-position:0 82.644628%}.flag-sv{background-position:0 83.057851%}.flag-sy{background-position:0 83.471074%}.flag-sz{background-position:0 83.884298%}.flag-tc{background-position:0 84.297521%}.flag-td{background-position:0 84.710744%}.flag-tf{background-position:0 85.123967%}.flag-tg{background-position:0 85.53719%}.flag-th{background-position:0 85.950413%}.flag-tj{background-position:0 86.363636%}.flag-tk{background-position:0 86.77686%}.flag-tl{background-position:0 87.190083%}.flag-tm{background-position:0 87.603306%}.flag-tn{background-position:0 88.016529%}.flag-to{background-position:0 88.429752%}.flag-tp{background-position:0 88.842975%}.flag-tr{background-position:0 89.256198%}.flag-tt{background-position:0 89.669421%}.flag-tv{background-position:0 90.082645%}.flag-tw{background-position:0 90.495868%}.flag-ty{background-position:0 90.909091%}.flag-tz{background-position:0 91.322314%}.flag-ua{background-position:0 91.735537%}.flag-ug{background-position:0 92.14876%}.flag-gb,.flag-uk{background-position:0 92.561983%}.flag-um{background-position:0 92.975207%}.flag-us{background-position:0 93.38843%}.flag-uy{background-position:0 93.801653%}.flag-uz{background-position:0 94.214876%}.flag-va{background-position:0 94.628099%}.flag-vc{background-position:0 95.041322%}.flag-ve{background-position:0 95.454545%}.flag-vg{background-position:0 95.867769%}.flag-vi{background-position:0 96.280992%}.flag-vn{background-position:0 96.694215%}.flag-vu{background-position:0 97.107438%}.flag-wf{background-position:0 97.520661%}.flag-ws{background-position:0 97.933884%}.flag-ye{background-position:0 98.347107%}.flag-za{background-position:0 98.760331%}.flag-zm{background-position:0 99.173554%}.flag-zr{background-position:0 99.586777%}.flag-zw{background-position:0 100%} \ No newline at end of file diff --git a/frontend/app/styles/general.css b/frontend/app/styles/general.css index 245158049..512360c7f 100644 --- a/frontend/app/styles/general.css +++ b/frontend/app/styles/general.css @@ -43,7 +43,7 @@ display:none !important; } -.divider, +/* .divider, .divider-light { height: 1px; background-color: $gray-light; @@ -52,12 +52,12 @@ &.m5 { margin: 5px 0; } -} +} */ -.divider-light { +/* .divider-light { border-color: $gray-lightest; height: 2px; -} +} */ .font-size-10 { font-size: 10px; } .font-size-12 { font-size: 12px; } diff --git a/frontend/app/styles/global.scss b/frontend/app/styles/global.scss new file mode 100644 index 000000000..2f427259c --- /dev/null +++ b/frontend/app/styles/global.scss @@ -0,0 +1,5 @@ +.form-field label { + font-weight: 500; + margin-bottom: 5px; + color: '#888'; +} \ No newline at end of file diff --git a/frontend/app/styles/import.css b/frontend/app/styles/import.css index 772b75d6a..8a75b6eab 100644 --- a/frontend/app/styles/import.css +++ b/frontend/app/styles/import.css @@ -1,8 +1,14 @@ @import 'react-toastify/dist/ReactToastify.css'; -@import 'react-circular-progressbar/dist/styles.css'; +/* @import 'react-circular-progressbar/dist/styles.css'; */ +@import "react-daterange-picker/dist/css/react-calendar.css"; +@import 'rc-time-picker/assets/index.css'; @import 'highlight.js/styles/github-gist.css'; +@import 'react-tippy/dist/tippy.css'; +@import 'react-date-range/dist/styles.css'; +@import 'react-date-range/dist/theme/default.css'; +@import 'react-daterange-picker.css'; +@import 'rc-time-picker.css'; -@import "tailwindcss/base"; -@import "tailwindcss/components"; -@import "tailwindcss/utilities"; -@import 'react-tippy/dist/tippy.css'; \ No newline at end of file +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/frontend/app/styles/index.scss b/frontend/app/styles/index.scss new file mode 100644 index 000000000..295946757 --- /dev/null +++ b/frontend/app/styles/index.scss @@ -0,0 +1,11 @@ +@import "./global"; +@import "./react-tippy-themes"; +@import "./reset.css"; +@import "./import.css"; +@import "./main.css"; +@import "./colors-autogen.css"; +@import "./toastify.css"; +@import "./flags.css"; +@import "./general.css"; +@import "./semantic.css"; +@import "./recharts.css"; diff --git a/frontend/app/styles/main.css b/frontend/app/styles/main.css index 3b7f5fe4b..16b06542d 100644 --- a/frontend/app/styles/main.css +++ b/frontend/app/styles/main.css @@ -129,7 +129,7 @@ text-decoration: underline dotted !important; } -.divider { +/* .divider { width: 1px; margin: 0 15px; background-color: $gray-light; @@ -141,7 +141,7 @@ margin: 25px 0; background-color: $gray-light; -} +} */ .no-scroll { height: 100vh; diff --git a/frontend/app/styles/react-datepicker.css b/frontend/app/styles/react-datepicker.module.css similarity index 100% rename from frontend/app/styles/react-datepicker.css rename to frontend/app/styles/react-datepicker.module.css diff --git a/frontend/app/styles/react-json-view.css b/frontend/app/styles/react-json-view.module.css similarity index 100% rename from frontend/app/styles/react-json-view.css rename to frontend/app/styles/react-json-view.module.css diff --git a/frontend/app/styles/react-tippy-themes.scss b/frontend/app/styles/react-tippy-themes.scss new file mode 100644 index 000000000..32ce9b5e3 --- /dev/null +++ b/frontend/app/styles/react-tippy-themes.scss @@ -0,0 +1,20 @@ +.tippy-tooltip.tippy-light-theme { + background-color: white; + color: #333; + text-align: left; + border: 1px solid #ddd; + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.2); +} + +.tippy-tooltip.tippy-light-theme .arrow-regular { + // border-color: #ddd; + border-bottom-color: white; +} + +.tippy-tooltip.tippy-light-theme[data-animatefill] { + background-color: transparent; +} + +.tippy-tooltip.tippy-light-theme .tippy-backdrop { + background-color: white; +} \ No newline at end of file diff --git a/frontend/app/styles/semantic.css b/frontend/app/styles/semantic.css index 0bfa64bf4..478f7429b 100644 --- a/frontend/app/styles/semantic.css +++ b/frontend/app/styles/semantic.css @@ -1,4 +1,4 @@ -@import "icons.css"; +@import 'icons.css'; .ui.dropdown .menu { z-index: 1900; diff --git a/frontend/app/svg/dashboard-icn.svg b/frontend/app/svg/dashboard-icn.svg new file mode 100644 index 000000000..3f5809af4 --- /dev/null +++ b/frontend/app/svg/dashboard-icn.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/app/svg/icons/dashboard-icn.svg b/frontend/app/svg/icons/dashboard-icn.svg index c14996229..3f5809af4 100644 --- a/frontend/app/svg/icons/dashboard-icn.svg +++ b/frontend/app/svg/icons/dashboard-icn.svg @@ -1,4 +1,4 @@ - + diff --git a/frontend/app/svg/icons/device.svg b/frontend/app/svg/icons/device.svg index b453af4aa..d0f009921 100644 --- a/frontend/app/svg/icons/device.svg +++ b/frontend/app/svg/icons/device.svg @@ -1,6 +1,4 @@ - - Svg Vector Icons : http://www.onlinewebfonts.com/icon diff --git a/frontend/app/svg/icons/filters/device.svg b/frontend/app/svg/icons/filters/device.svg index b453af4aa..d0f009921 100644 --- a/frontend/app/svg/icons/filters/device.svg +++ b/frontend/app/svg/icons/filters/device.svg @@ -1,6 +1,4 @@ - - Svg Vector Icons : http://www.onlinewebfonts.com/icon diff --git a/frontend/app/svg/icons/grid-3x3.svg b/frontend/app/svg/icons/grid-3x3.svg index c40d98c96..152de125a 100644 --- a/frontend/app/svg/icons/grid-3x3.svg +++ b/frontend/app/svg/icons/grid-3x3.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/frontend/app/svg/icons/integrations/jira.svg b/frontend/app/svg/icons/integrations/jira.svg index 5243225f3..883f260bd 100644 --- a/frontend/app/svg/icons/integrations/jira.svg +++ b/frontend/app/svg/icons/integrations/jira.svg @@ -1,5 +1,5 @@ - + Jira Software-blue Created with Sketch. diff --git a/frontend/app/svg/icons/integrations/stackdriver.svg b/frontend/app/svg/icons/integrations/stackdriver.svg index 2c216468f..05eb29650 100644 --- a/frontend/app/svg/icons/integrations/stackdriver.svg +++ b/frontend/app/svg/icons/integrations/stackdriver.svg @@ -1 +1,7 @@ - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/frontend/app/svg/icons/integrations/sumologic.svg b/frontend/app/svg/icons/integrations/sumologic.svg index 53d0d8e67..f4569061f 100644 --- a/frontend/app/svg/icons/integrations/sumologic.svg +++ b/frontend/app/svg/icons/integrations/sumologic.svg @@ -1,32 +1,4 @@ - - - - - - - - - - + + + diff --git a/frontend/app/svg/logo-small.svg b/frontend/app/svg/logo-small.svg index 667be8f22..c2a47f1e4 100644 --- a/frontend/app/svg/logo-small.svg +++ b/frontend/app/svg/logo-small.svg @@ -1,4 +1,3 @@ - Group diff --git a/frontend/app/theme/colors.js b/frontend/app/theme/colors.js index 07aca3a8b..fd1b4864d 100644 --- a/frontend/app/theme/colors.js +++ b/frontend/app/theme/colors.js @@ -7,10 +7,10 @@ module.exports = { "gray-medium": "#888", "gray-dark": "#666", "gray-darkest": "#333", - + teal: "#394EFF", /* blue */ "teal-dark": "#2331A8", /* "blue-dark" */ - "teal-light": "#D0D4F2", + "teal-light": "rgba(57, 78, 255, 0.1)", /* "blue-light" */ tealx: "#3EAAAF", "tealx-light": "#E2F0EE", diff --git a/frontend/app/types/account/account.js b/frontend/app/types/account/account.js index 39bfe4726..2683795b4 100644 --- a/frontend/app/types/account/account.js +++ b/frontend/app/types/account/account.js @@ -15,7 +15,8 @@ export default Member.extend({ license: '', expirationDate: undefined, permissions: [], - iceServers: undefined + iceServers: undefined, + hasPassword: false, // to check if it's SSO }, { fromJS: ({ current = {}, ...account})=> ({ ...account, diff --git a/frontend/app/types/alert.js b/frontend/app/types/alert.js index 5065b735c..c16f6a87e 100644 --- a/frontend/app/types/alert.js +++ b/frontend/app/types/alert.js @@ -2,7 +2,6 @@ import Record from 'Types/Record'; import { notEmptyString, validateName, validateNumber, validateEmail } from 'App/validate'; import { List, Map } from 'immutable'; import { alertMetrics as metrics, alertConditions as conditions } from 'App/constants'; -import { ItemDescription } from 'semantic-ui-react'; // import Filter from './filter'; const metricsMap = {} diff --git a/frontend/app/types/app/period.js b/frontend/app/types/app/period.js index b4f8798c5..ddb99e1f4 100644 --- a/frontend/app/types/app/period.js +++ b/frontend/app/types/app/period.js @@ -97,6 +97,14 @@ export default Record({ } }, methods: { + toJSON() { + return { + startDate: this.start, + endDate: this.end, + rangeName: this.rangeName, + rangeValue: this.rangeName, + } + }, toTimestamps() { return { startTimestamp: this.start, @@ -104,7 +112,6 @@ export default Record({ }; }, rangeFormatted(format = 'MMM Do YY, hh:mm A') { - console.log('period', this) return this.range.start.format(format) + ' - ' + this.range.end.format(format); }, toTimestampstwo() { diff --git a/frontend/app/types/filter/newFilter.js b/frontend/app/types/filter/newFilter.js index 725b94560..9df4984b5 100644 --- a/frontend/app/types/filter/newFilter.js +++ b/frontend/app/types/filter/newFilter.js @@ -4,7 +4,7 @@ import filterOptions, { countries, platformOptions } from 'App/constants'; import { capitalize } from 'App/utils'; const countryOptions = Object.keys(countries).map(i => ({ text: countries[i], value: i })); -const containsFilters = [{ key: 'contains', text: 'contains', value: 'contains' }] +const containsFilters = [{ key: 'contains', label: 'contains', text: 'contains', value: 'contains' }] export const metaFilter = { key: FilterKey.METADATA, type: FilterType.MULTIPLE, category: FilterCategory.METADATA, label: 'Metadata', operator: 'is', operatorOptions: filterOptions.stringOperators, icon: 'filters/metadata' }; export const filtersMap = { diff --git a/frontend/app/types/session/resource.js b/frontend/app/types/session/resource.js index d480a4299..399db9337 100644 --- a/frontend/app/types/session/resource.js +++ b/frontend/app/types/session/resource.js @@ -1,7 +1,6 @@ import { List } from 'immutable'; import Record from 'Types/Record'; import { getResourceName } from 'App/utils'; -// import { List } from 'semantic-ui-react'; const XHR = 'xhr'; const JS = 'script'; diff --git a/frontend/app/types/session/session.js b/frontend/app/types/session/session.ts similarity index 100% rename from frontend/app/types/session/session.js rename to frontend/app/types/session/session.ts diff --git a/frontend/app/utils.js b/frontend/app/utils.ts similarity index 97% rename from frontend/app/utils.js rename to frontend/app/utils.ts index 029e24599..39b9cd3f7 100644 --- a/frontend/app/utils.js +++ b/frontend/app/utils.ts @@ -201,14 +201,7 @@ export const hashProjectID = (id) => { export const colorScale = (values, colors) => { - // const minValue = Math.min.apply(null, values); - // const maxValue = Math.max.apply(null, values); - // return [] return chroma.scale(colors) - - // return scale.linear() - // .domain([minValue,maxValue]) - // .range([colors[0], colors[colors.length - 1]]); } export const truncate = (input, max = 10) => input.length > max ? `${input.substring(0, max)}...` : input; diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 32a3b81fe..7d415be63 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -10,9 +10,9 @@ "dependencies": { "@sentry/browser": "^5.21.1", "@svg-maps/world": "^1.0.1", + "@svgr/webpack": "^6.2.1", "chroma-js": "^2.4.2", - "classnames": "^2.2.6", - "codemirror": "^5.62.3", + "classnames": "^2.3.1", "copy-to-clipboard": "^3.3.1", "deep-diff": "^1.0.2", "html-to-image": "^1.9.0", @@ -24,90 +24,103 @@ "mobx": "^6.3.8", "mobx-react-lite": "^3.1.6", "moment": "^2.29.2", - "moment-range": "^4.0.2", - "peerjs": "^1.3.2", + "moment-range": "^3.0.3", + "peerjs": "1.3.2", "rc-time-picker": "^3.7.3", - "react": "^16.13.1", + "react": "^16.14.0", "react-circular-progressbar": "^2.0.3", - "react-codemirror2": "^5.1.0", - "react-confirm": "^0.1.20", - "react-datepicker": "^2.16.0", + "react-confirm": "^0.1.27", + "react-date-range": "^1.4.0", "react-daterange-picker": "^2.0.1", "react-dnd": "^15.1.1", "react-dnd-html5-backend": "^15.1.2", "react-dom": "^16.13.1", - "react-draggable": "^4.4.4", + "react-draggable": "^4.4.5", "react-google-recaptcha": "^1.1.0", "react-highlight": "^0.14.0", - "react-json-view": "^1.19.1", - "react-lazyload": "^3.0.0", + "react-json-view": "^1.21.3", + "react-lazyload": "^3.2.0", "react-redux": "^5.1.2", "react-router": "^4.3.1", "react-router-dom": "^4.3.1", - "react-select": "^5.3.1", + "react-select": "^5.3.2", "react-svg-map": "^2.2.0", "react-tippy": "^1.4.0", - "react-toastify": "^8.2.0", - "react-virtualized": "^9.22.2", - "recharts": "^2.1.9", + "react-toastify": "^9.0.3", + "react-virtualized": "^9.22.3", + "recharts": "^2.1.10", "redux": "^4.0.5", "redux-immutable": "^4.0.0", "redux-thunk": "^2.3.0", - "semantic-ui-react": "^0.87.3", + "semantic-ui-css": "^2.4.1", + "semantic-ui-react": "^2.1.2", "socket.io-client": "^4.4.1", "source-map": "^0.7.3", "syncod": "^0.0.1", - "tailwindcss": "^1.5.2" + "tailwindcss": "^3.0.24" }, "devDependencies": { "@babel/cli": "^7.10.5", - "@babel/core": "^7.12.10", - "@babel/plugin-proposal-class-properties": "^7.10.4", - "@babel/plugin-proposal-decorators": "^7.10.5", + "@babel/core": "^7.17.12", + "@babel/node": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.17.12", + "@babel/plugin-proposal-decorators": "^7.17.12", "@babel/plugin-proposal-private-methods": "^7.10.4", "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/preset-env": "^7.10.4", + "@babel/plugin-transform-runtime": "^7.17.12", + "@babel/preset-env": "^7.17.12", "@babel/preset-flow": "^7.10.4", - "@babel/preset-react": "^7.10.4", + "@babel/preset-react": "^7.17.12", + "@babel/preset-typescript": "^7.17.12", + "@babel/runtime": "^7.17.9", "@openreplay/sourcemap-uploader": "^3.0.0", - "@storybook/react": "^6.4.8", - "autoprefixer": "^7.2.5", - "babel-loader": "^8.1.0", + "@types/react": "^18.0.9", + "@types/react-dom": "^18.0.4", + "@typescript-eslint/eslint-plugin": "^5.24.0", + "@typescript-eslint/parser": "^5.24.0", + "autoprefixer": "^10.4.7", + "babel-loader": "^8.2.4", "babel-plugin-recharts": "^1.2.1", + "babel-plugin-transform-decorators-legacy": "^1.3.5", "circular-dependency-plugin": "^5.2.0", - "copy-webpack-plugin": "^5.1.1", + "compression-webpack-plugin": "^10.0.0", + "copy-webpack-plugin": "^11.0.0", "country-data": "0.0.31", - "css-loader": "^3.6.0", + "css-loader": "^6.7.1", "cssnano": "^5.0.12", "deasync-promise": "^1.0.1", "deploy-aws-s3-cloudfront": "^3.6.0", "dotenv": "^6.2.0", - "eslint-config-airbnb": "^16.1.0", - "eslint-import-resolver-babel-module": "^4.0.0", - "eslint-plugin-import": "^2.22.0", - "eslint-plugin-jsx-a11y": "^6.3.1", - "eslint-plugin-react": "^7.20.6", + "eslint": "^8.15.0", + "eslint-plugin-react": "^7.29.4", + "eslint-plugin-react-hooks": "^4.5.0", "faker": "^5.5.3", + "file-loader": "^6.2.0", "flow-bin": "^0.115.0", - "html-webpack-plugin": "^3.2.0", - "mini-css-extract-plugin": "^0.7.0", + "html-webpack-plugin": "^5.5.0", + "mini-css-extract-plugin": "^2.6.0", "minio": "^7.0.18", "moment-locales-webpack-plugin": "^1.2.0", - "postcss-import": "^12.0.1", - "postcss-inline-svg": "^3.1.1", - "postcss-loader": "^3.0.0", - "postcss-mixins": "^6.2.3", - "postcss-nesting": "^4.2.1", - "postcss-simple-vars": "^4.1.0", - "style-loader": "^0.23.1", - "svgo": "^1.3.2", - "ts-loader": "^8.3.0", - "typed-css-modules": "^0.7.0", - "typescript": "^3.9.9", - "webpack": "^4.46.0", - "webpack-bundle-analyzer": "^3.8.0", - "webpack-cli": "^3.3.12", - "webpack-dev-server": "^3.11.0" + "postcss": "^8.4.14", + "postcss-import": "^14.1.0", + "postcss-loader": "^7.0.0", + "postcss-mixins": "^9.0.2", + "postcss-nesting": "^10.1.6", + "postcss-simple-vars": "^6.0.3", + "prettier": "^2.6.2", + "sass": "^1.51.0", + "sass-loader": "^13.0.0", + "style-loader": "^3.3.1", + "svg-inline-loader": "^0.8.2", + "svgo": "^2.8.0", + "tailwindcss": "^3.0.23", + "ts-node": "^10.7.0", + "typescript": "^4.6.4", + "webpack": "^5.72.1", + "webpack-bundle-analyzer": "^4.5.0", + "webpack-cli": "^4.9.2", + "webpack-dev-server": "^4.9.0", + "workbox-webpack-plugin": "^6.5.1" }, "engines": { "node": ">=10.14.1" @@ -117,7 +130,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.1.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -170,27 +182,25 @@ "version": "7.17.10", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", - "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.10.tgz", - "integrity": "sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA==", - "dev": true, + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", + "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.10", - "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.10", + "@babel/generator": "^7.18.2", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.2", + "@babel/parser": "^7.18.0", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.10", - "@babel/types": "^7.17.10", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -206,24 +216,35 @@ } }, "node_modules/@babel/generator": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.10.tgz", - "integrity": "sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg==", - "dev": true, + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", "dependencies": { - "@babel/types": "^7.17.10", - "@jridgewell/gen-mapping": "^0.1.0", + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, "dependencies": { "@babel/types": "^7.16.7" }, @@ -235,7 +256,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", - "dev": true, "dependencies": { "@babel/helper-explode-assignable-expression": "^7.16.7", "@babel/types": "^7.16.7" @@ -245,10 +265,9 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz", - "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==", - "dev": true, + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", + "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", "dependencies": { "@babel/compat-data": "^7.17.10", "@babel/helper-validator-option": "^7.16.7", @@ -263,10 +282,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", - "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz", + "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", @@ -284,10 +302,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", - "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz", + "integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "regexpu-core": "^5.0.1" @@ -303,7 +320,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", - "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", @@ -319,13 +335,9 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", + "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", "engines": { "node": ">=6.9.0" } @@ -334,7 +346,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", - "dev": true, "dependencies": { "@babel/types": "^7.16.7" }, @@ -346,7 +357,6 @@ "version": "7.17.9", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", - "dev": true, "dependencies": { "@babel/template": "^7.16.7", "@babel/types": "^7.17.0" @@ -359,7 +369,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, "dependencies": { "@babel/types": "^7.16.7" }, @@ -371,7 +380,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", - "dev": true, "dependencies": { "@babel/types": "^7.17.0" }, @@ -391,10 +399,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", + "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", "dependencies": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", @@ -402,8 +409,8 @@ "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" }, "engines": { "node": ">=6.9.0" @@ -413,7 +420,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", - "dev": true, "dependencies": { "@babel/types": "^7.16.7" }, @@ -422,9 +428,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", "engines": { "node": ">=6.9.0" } @@ -433,7 +439,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", - "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-wrap-function": "^7.16.8", @@ -444,28 +449,26 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "dev": true, + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz", + "integrity": "sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q==", "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-member-expression-to-functions": "^7.17.7", "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "dev": true, + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", + "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", "dependencies": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.18.2" }, "engines": { "node": ">=6.9.0" @@ -475,7 +478,6 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", - "dev": true, "dependencies": { "@babel/types": "^7.16.0" }, @@ -487,7 +489,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, "dependencies": { "@babel/types": "^7.16.7" }, @@ -507,7 +508,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -516,7 +516,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", - "dev": true, "dependencies": { "@babel/helper-function-name": "^7.16.7", "@babel/template": "^7.16.7", @@ -528,23 +527,22 @@ } }, "node_modules/@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", - "dev": true, + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", + "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", "dependencies": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", - "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", + "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -554,11 +552,33 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { + "node_modules/@babel/node": { "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.10.tgz", - "integrity": "sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ==", + "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.17.10.tgz", + "integrity": "sha512-sFFMyvw23U8QOcTnLJnw2/Myr01e4+iLVy7rHAHrNSnXAfnwS3j2NqihpmZm7TotyNKKf/y8cJ96T5asY46eyw==", "dev": true, + "dependencies": { + "@babel/register": "^7.17.7", + "commander": "^4.0.1", + "core-js": "^3.22.1", + "node-environment-flags": "^1.0.5", + "regenerator-runtime": "^0.13.4", + "v8flags": "^3.1.1" + }, + "bin": { + "babel-node": "bin/babel-node.js" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", "bin": { "parser": "bin/babel-parser.js" }, @@ -567,12 +587,11 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", - "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz", + "integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -582,14 +601,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", - "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz", + "integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.7" + "@babel/plugin-proposal-optional-chaining": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -599,12 +617,11 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", - "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz", + "integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-remap-async-to-generator": "^7.16.8", "@babel/plugin-syntax-async-generators": "^7.8.4" }, @@ -616,13 +633,12 @@ } }, "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz", + "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -632,13 +648,12 @@ } }, "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", - "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz", + "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.6", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -649,16 +664,16 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.9.tgz", - "integrity": "sha512-EfH2LZ/vPa2wuPwJ26j+kYRkaubf89UlwxKXtxqEm57HrgSEYDB8t4swFP+p8LcI9yiP9ZRJJjo/58hS6BnaDA==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.2.tgz", + "integrity": "sha512-kbDISufFOxeczi0v4NQP3p5kIeW6izn/6klfWBrIIdGZZe4UpHR+QU03FAoWjGGd9SUXAwbw2pup1kaL4OQsJQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.9", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-replace-supers": "^7.18.2", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/plugin-syntax-decorators": "^7.17.0", + "@babel/plugin-syntax-decorators": "^7.17.12", "charcodes": "^0.2.0" }, "engines": { @@ -672,7 +687,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -684,29 +698,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-export-default-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.16.7.tgz", - "integrity": "sha512-+cENpW1rgIjExn+o5c8Jw/4BuH4eGKKYvkMB8/0ZxFQ9mC0t4z09VsPIwNg6waF69QYC81zxGeAsREGuqQoKeg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-export-default-from": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz", + "integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -717,12 +714,11 @@ } }, "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", - "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz", + "integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -733,12 +729,11 @@ } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz", + "integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -749,12 +744,11 @@ } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz", + "integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -768,7 +762,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -781,16 +774,15 @@ } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", - "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz", + "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==", "dependencies": { - "@babel/compat-data": "^7.17.0", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.7" + "@babel/plugin-transform-parameters": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -803,7 +795,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -816,12 +807,11 @@ } }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz", + "integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -833,13 +823,12 @@ } }, "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz", + "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -849,14 +838,13 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz", + "integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -867,13 +855,12 @@ } }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", - "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz", + "integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=4" @@ -886,7 +873,6 @@ "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -910,7 +896,6 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -922,7 +907,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -934,12 +918,12 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.0.tgz", - "integrity": "sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.12.tgz", + "integrity": "sha512-D1Hz0qtGTza8K2xGyEdVNCYLdVHukAcbQr4K3/s6r/esadyEriZovpJimQOpu8ju4/jV8dW/1xdaE0UpDroidw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -952,7 +936,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -960,26 +943,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-export-default-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.16.7.tgz", - "integrity": "sha512-4C3E4NsrLOgftKaTYTULhHsuQrGv3FHrBzOMDiS7UYKIpgGBkAdawg4h+EI8zPeK9M0fiIIh72hIwsI24K7MbA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, @@ -988,12 +955,26 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz", - "integrity": "sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.17.12.tgz", + "integrity": "sha512-B8QIgBvkIG6G2jgsOHQUist7Sm0EBLDCx8sen072IwqNuzMegZNXrYnSv77cYzA8mLDZAfQYqsLIhimiP1s2HQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz", + "integrity": "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1006,7 +987,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1015,11 +995,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", - "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz", + "integrity": "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1032,7 +1012,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1044,7 +1023,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1056,7 +1034,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1068,7 +1045,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1080,7 +1056,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1092,7 +1067,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1104,7 +1078,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1119,7 +1092,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1131,12 +1103,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.10.tgz", - "integrity": "sha512-xJefea1DWXW09pW4Tm9bjwVlPDyYA2it3fWlmEjpYz6alPvTUjL0EOzNzI/FEOyI3r4/J7uVH5UqKgl1TQ5hqQ==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz", + "integrity": "sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1146,12 +1117,11 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", - "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz", + "integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1161,13 +1131,12 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", - "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz", + "integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==", "dependencies": { "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-remap-async-to-generator": "^7.16.8" }, "engines": { @@ -1181,7 +1150,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1193,12 +1161,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", - "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", - "dev": true, + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz", + "integrity": "sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1208,17 +1175,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", - "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", - "dev": true, + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz", + "integrity": "sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-function-name": "^7.17.9", "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-replace-supers": "^7.18.2", "@babel/helper-split-export-declaration": "^7.16.7", "globals": "^11.1.0" }, @@ -1230,12 +1196,11 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", - "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz", + "integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1245,12 +1210,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", - "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz", + "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1263,7 +1227,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", - "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7" @@ -1276,12 +1239,11 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", - "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz", + "integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1294,7 +1256,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", - "dev": true, "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7" @@ -1307,13 +1268,13 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz", - "integrity": "sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.17.12.tgz", + "integrity": "sha512-g8cSNt+cHCpG/uunPQELdq/TeV3eg1OLJYwxypwHtAWo9+nErH3lQx9CSO2uI9lF74A0mR0t4KoMjs1snSgnTw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-flow": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-flow": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1323,12 +1284,11 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", - "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", - "dev": true, + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz", + "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1341,7 +1301,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", - "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-function-name": "^7.16.7", @@ -1355,12 +1314,11 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", - "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz", + "integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1373,7 +1331,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1385,13 +1342,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", - "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz", + "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==", "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { @@ -1402,14 +1358,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", - "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", - "dev": true, + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz", + "integrity": "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-simple-access": "^7.18.2", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { @@ -1420,14 +1375,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", - "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", - "dev": true, + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.4.tgz", + "integrity": "sha512-lH2UaQaHVOAeYrUUuZ8i38o76J/FnO8vu21OE+tD1MyP9lxdZoSfz+pDbWkq46GogUrdrMz3tiz/FYGB+bVThg==", "dependencies": { "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" }, @@ -1439,13 +1393,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", - "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz", + "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==", "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1455,12 +1408,12 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.10.tgz", - "integrity": "sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz", + "integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.17.0" + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1470,12 +1423,11 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", - "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz", + "integrity": "sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1488,7 +1440,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-replace-supers": "^7.16.7" @@ -1501,12 +1452,11 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", - "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz", + "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1519,7 +1469,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1530,11 +1479,24 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.12.tgz", + "integrity": "sha512-maEkX2xs2STuv2Px8QuqxqjhV2LsFobT1elCgyU5704fcyTu9DyD/bJXxD/mrRiVyhpHweOQ00OJ5FKhHq9oEw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-react-display-name": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1546,16 +1508,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz", - "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz", + "integrity": "sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-jsx": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-jsx": "^7.17.12", + "@babel/types": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1568,7 +1529,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", - "dev": true, "dependencies": { "@babel/plugin-transform-react-jsx": "^7.16.7" }, @@ -1580,13 +1540,12 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", - "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.0.tgz", + "integrity": "sha512-6+0IK6ouvqDn9bmEG7mEyF/pwlJXVj5lwydybpyyH3D0A7Hftk+NCTdYjnLNZksn261xaOV5ksmp20pQEmc2RQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1596,11 +1555,11 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", - "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz", + "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==", "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", "regenerator-transform": "^0.15.0" }, "engines": { @@ -1611,12 +1570,31 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", - "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz", + "integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.2.tgz", + "integrity": "sha512-mr1ufuRMfS52ttq+1G1PD8OJNqgcTFjq3hwn8SZ5n1x1pBhi0E36rYMdTK0TsKtApJ4lDEdfXJwtGobQMHSMPg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -1629,7 +1607,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1641,12 +1618,11 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", - "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz", + "integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" }, "engines": { @@ -1660,7 +1636,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1672,12 +1647,11 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", - "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", - "dev": true, + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz", + "integrity": "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1687,12 +1661,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", - "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz", + "integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1702,14 +1675,13 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", - "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", - "dev": true, + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.4.tgz", + "integrity": "sha512-l4vHuSLUajptpHNEOUDEGsnpl9pfRLsN1XUoDQDD/YBuXTM+v37SHGS+c6n4jdcZy96QtuUuSvZYMLSSsjH8Mw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-typescript": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-typescript": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1722,7 +1694,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1737,7 +1708,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", - "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7" @@ -1750,37 +1720,37 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.17.10.tgz", - "integrity": "sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g==", - "dev": true, + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz", + "integrity": "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==", "dependencies": { "@babel/compat-data": "^7.17.10", - "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-async-generator-functions": "^7.16.8", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-class-static-block": "^7.17.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-async-generator-functions": "^7.17.12", + "@babel/plugin-proposal-class-properties": "^7.17.12", + "@babel/plugin-proposal-class-static-block": "^7.18.0", "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.16.7", - "@babel/plugin-proposal-json-strings": "^7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.17.12", + "@babel/plugin-proposal-json-strings": "^7.17.12", + "@babel/plugin-proposal-logical-assignment-operators": "^7.17.12", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12", "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.17.3", + "@babel/plugin-proposal-object-rest-spread": "^7.18.0", "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.11", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-private-methods": "^7.17.12", + "@babel/plugin-proposal-private-property-in-object": "^7.17.12", + "@babel/plugin-proposal-unicode-property-regex": "^7.17.12", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.17.12", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -1790,40 +1760,40 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.7", - "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-arrow-functions": "^7.17.12", + "@babel/plugin-transform-async-to-generator": "^7.17.12", "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.16.7", - "@babel/plugin-transform-classes": "^7.16.7", - "@babel/plugin-transform-computed-properties": "^7.16.7", - "@babel/plugin-transform-destructuring": "^7.17.7", + "@babel/plugin-transform-block-scoping": "^7.17.12", + "@babel/plugin-transform-classes": "^7.17.12", + "@babel/plugin-transform-computed-properties": "^7.17.12", + "@babel/plugin-transform-destructuring": "^7.18.0", "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.17.12", "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.18.1", "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-literals": "^7.17.12", "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.17.9", - "@babel/plugin-transform-modules-systemjs": "^7.17.8", - "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.10", - "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.18.0", + "@babel/plugin-transform-modules-commonjs": "^7.18.2", + "@babel/plugin-transform-modules-systemjs": "^7.18.0", + "@babel/plugin-transform-modules-umd": "^7.18.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", + "@babel/plugin-transform-new-target": "^7.17.12", "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.17.12", "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.17.9", - "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.18.0", + "@babel/plugin-transform-reserved-words": "^7.17.12", "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-spread": "^7.17.12", "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.16.7", - "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.18.2", + "@babel/plugin-transform-typeof-symbol": "^7.17.12", "@babel/plugin-transform-unicode-escapes": "^7.16.7", "@babel/plugin-transform-unicode-regex": "^7.16.7", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.17.10", + "@babel/types": "^7.18.2", "babel-plugin-polyfill-corejs2": "^0.3.0", "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", @@ -1838,14 +1808,14 @@ } }, "node_modules/@babel/preset-flow": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.16.7.tgz", - "integrity": "sha512-6ceP7IyZdUYQ3wUVqyRSQXztd1YmFHWI4Xv11MIqAlE4WqxBSd/FZ61V9k+TS5Gd4mkHOtQtPp9ymRpxH4y1Ug==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.17.12.tgz", + "integrity": "sha512-7QDz7k4uiaBdu7N89VKjUn807pJRXmdirQu0KyR9LXnQrr5Jt41eIMKTS7ljej+H29erwmMrwq9Io9mJHLI3Lw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-flow-strip-types": "^7.16.7" + "@babel/plugin-transform-flow-strip-types": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1858,7 +1828,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -1871,15 +1840,14 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz", - "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.17.12.tgz", + "integrity": "sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", "@babel/plugin-transform-react-display-name": "^7.16.7", - "@babel/plugin-transform-react-jsx": "^7.16.7", + "@babel/plugin-transform-react-jsx": "^7.17.12", "@babel/plugin-transform-react-jsx-development": "^7.16.7", "@babel/plugin-transform-react-pure-annotations": "^7.16.7" }, @@ -1891,14 +1859,13 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", - "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz", + "integrity": "sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.16.7" + "@babel/plugin-transform-typescript": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1927,9 +1894,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz", + "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -1937,24 +1904,10 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.9.tgz", - "integrity": "sha512-WxYHHUWF2uZ7Hp1K+D1xQgbgkGUfA+5UPOegEXGt2Y5SMog/rYCVaifLZDbw8UkNXozEqqrZTy6bglL7xTaCOw==", - "dev": true, - "dependencies": { - "core-js-pure": "^3.20.2", - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/template": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", "@babel/parser": "^7.16.7", @@ -1965,19 +1918,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.10.tgz", - "integrity": "sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw==", - "dev": true, + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", + "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", "dependencies": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.10", - "@babel/helper-environment-visitor": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-environment-visitor": "^7.18.2", "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.10", - "@babel/types": "^7.17.10", + "@babel/parser": "^7.18.0", + "@babel/types": "^7.18.2", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1986,9 +1938,9 @@ } }, "node_modules/@babel/types": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.10.tgz", - "integrity": "sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -1997,12 +1949,6 @@ "node": ">=6.9.0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -2012,6 +1958,45 @@ "node": ">=0.1.90" } }, + "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/@cspotcode/source-map-support/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/@csstools/selector-specificity": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-1.0.0.tgz", + "integrity": "sha512-RkYG5KiGNX0fJ5YoI0f4Wfq2Yo74D25Hru4fxTOioYdQvHBxcrrtTTyT5Ozzh2ejcNrhFy7IEts2WyEY7yi5yw==", + "dev": true, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3", + "postcss-selector-parser": "^6.0.10" + } + }, "node_modules/@dabh/diagnostics": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", @@ -2054,58 +2039,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@emotion/babel-plugin/node_modules/@emotion/memoize": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", - "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" - }, - "node_modules/@emotion/babel-plugin/node_modules/@emotion/serialize": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.3.tgz", - "integrity": "sha512-2mSSvgLfyV3q+iVh3YWgNlUc2a9ZlDU7DjuP5MjK3AXRR0dYigCrP99aeFtaB2L/hjfEZdSThn5dsZ0ufqbvsA==", - "dependencies": { - "@emotion/hash": "^0.8.0", - "@emotion/memoize": "^0.7.4", - "@emotion/unitless": "^0.7.5", - "@emotion/utils": "^1.0.0", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/@emotion/utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", - "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" - }, - "node_modules/@emotion/babel-plugin/node_modules/babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "dependencies": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" - }, "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2126,43 +2059,15 @@ } }, "node_modules/@emotion/cache": { - "version": "10.0.29", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz", - "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", - "dev": true, + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", + "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", "dependencies": { - "@emotion/sheet": "0.9.4", - "@emotion/stylis": "0.8.5", - "@emotion/utils": "0.11.3", - "@emotion/weak-memoize": "0.2.5" - } - }, - "node_modules/@emotion/core": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.3.1.tgz", - "integrity": "sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.5.5", - "@emotion/cache": "^10.0.27", - "@emotion/css": "^10.0.27", - "@emotion/serialize": "^0.11.15", - "@emotion/sheet": "0.9.4", - "@emotion/utils": "0.11.3" - }, - "peerDependencies": { - "react": ">=16.3.0" - } - }, - "node_modules/@emotion/css": { - "version": "10.0.27", - "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.27.tgz", - "integrity": "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==", - "dev": true, - "dependencies": { - "@emotion/serialize": "^0.11.15", - "@emotion/utils": "0.11.3", - "babel-plugin-emotion": "^10.0.27" + "@emotion/memoize": "^0.7.4", + "@emotion/sheet": "^1.1.0", + "@emotion/utils": "^1.0.0", + "@emotion/weak-memoize": "^0.2.5", + "stylis": "4.0.13" } }, "node_modules/@emotion/hash": { @@ -2170,19 +2075,10 @@ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, - "node_modules/@emotion/is-prop-valid": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", - "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", - "dev": true, - "dependencies": { - "@emotion/memoize": "0.7.4" - } - }, "node_modules/@emotion/memoize": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", + "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" }, "node_modules/@emotion/react": { "version": "11.9.0", @@ -2210,19 +2106,7 @@ } } }, - "node_modules/@emotion/react/node_modules/@emotion/cache": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", - "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", - "dependencies": { - "@emotion/memoize": "^0.7.4", - "@emotion/sheet": "^1.1.0", - "@emotion/utils": "^1.0.0", - "@emotion/weak-memoize": "^0.2.5", - "stylis": "4.0.13" - } - }, - "node_modules/@emotion/react/node_modules/@emotion/serialize": { + "node_modules/@emotion/serialize": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.3.tgz", "integrity": "sha512-2mSSvgLfyV3q+iVh3YWgNlUc2a9ZlDU7DjuP5MjK3AXRR0dYigCrP99aeFtaB2L/hjfEZdSThn5dsZ0ufqbvsA==", @@ -2234,170 +2118,122 @@ "csstype": "^3.0.2" } }, - "node_modules/@emotion/react/node_modules/@emotion/sheet": { + "node_modules/@emotion/sheet": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" }, - "node_modules/@emotion/react/node_modules/@emotion/utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", - "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" - }, - "node_modules/@emotion/react/node_modules/csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" - }, - "node_modules/@emotion/serialize": { - "version": "0.11.16", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", - "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", - "dev": true, - "dependencies": { - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/unitless": "0.7.5", - "@emotion/utils": "0.11.3", - "csstype": "^2.5.7" - } - }, - "node_modules/@emotion/sheet": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz", - "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==", - "dev": true - }, - "node_modules/@emotion/styled": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-10.3.0.tgz", - "integrity": "sha512-GgcUpXBBEU5ido+/p/mCT2/Xx+Oqmp9JzQRuC+a4lYM4i4LBBn/dWvc0rQ19N9ObA8/T4NWMrPNe79kMBDJqoQ==", - "dev": true, - "dependencies": { - "@emotion/styled-base": "^10.3.0", - "babel-plugin-emotion": "^10.0.27" - }, - "peerDependencies": { - "@emotion/core": "^10.0.27", - "react": ">=16.3.0" - } - }, - "node_modules/@emotion/styled-base": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@emotion/styled-base/-/styled-base-10.3.0.tgz", - "integrity": "sha512-PBRqsVKR7QRNkmfH78hTSSwHWcwDpecH9W6heujWAcyp2wdz/64PP73s7fWS1dIPm8/Exc8JAzYS8dEWXjv60w==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.5.5", - "@emotion/is-prop-valid": "0.8.8", - "@emotion/serialize": "^0.11.15", - "@emotion/utils": "0.11.3" - }, - "peerDependencies": { - "@emotion/core": "^10.0.28", - "react": ">=16.3.0" - } - }, - "node_modules/@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==", - "dev": true - }, "node_modules/@emotion/unitless": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, "node_modules/@emotion/utils": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", - "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", + "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" }, "node_modules/@emotion/weak-memoize": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, - "node_modules/@fullhuman/postcss-purgecss": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.3.0.tgz", - "integrity": "sha512-qnKm5dIOyPGJ70kPZ5jiz0I9foVOic0j+cOzNDoo8KoCf6HjicIZ99UfO2OmE7vCYSKAAepEwJtNzpiiZAh9xw==", - "dependencies": { - "postcss": "7.0.32", - "purgecss": "^2.3.0" - } - }, - "node_modules/@fullhuman/postcss-purgecss/node_modules/postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - }, - "node_modules/@fullhuman/postcss-purgecss/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@fullhuman/postcss-purgecss/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, - "node_modules/@hypnosphi/create-react-context": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz", - "integrity": "sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A==", - "dependencies": { - "gud": "^1.0.0", - "warning": "^4.0.3" - }, - "peerDependencies": { - "prop-types": "^15.0.0", - "react": ">=0.14.0" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@fluentui/react-component-event-listener": { + "version": "0.63.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-component-event-listener/-/react-component-event-listener-0.63.0.tgz", + "integrity": "sha512-3OfmzM4rXf8yeB1GaDBKcdkO0UQN8rafygsp9CeC1x85gO6uv/TgnjC3co6kcxZ8GtVqU1YyH5SjJQgNOmKvXw==", + "dependencies": { + "@babel/runtime": "^7.10.4" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18", + "react-dom": "^16.8.0 || ^17 || ^18" + } + }, + "node_modules/@fluentui/react-component-ref": { + "version": "0.63.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-component-ref/-/react-component-ref-0.63.0.tgz", + "integrity": "sha512-s4Wawk3Jp/cLRu3QlCtRMm1jYMi8fq7PLd6I2VYb397NgpLdMbO4/edqDHbDhKiVWRIulrOqWlRLR5YXjkXQ7A==", + "dependencies": { + "@babel/runtime": "^7.10.4", + "react-is": "^16.6.3" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18", + "react-dom": "^16.8.0 || ^17 || ^18" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.0", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -2407,158 +2243,63 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz", - "integrity": "sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw==", - "dev": true, + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", + "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.0.tgz", - "integrity": "sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", + "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", - "dev": true + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", + "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==" }, "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, + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", + "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@mdx-js/mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", - "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", - "dev": true, - "dependencies": { - "@babel/core": "7.12.9", - "@babel/plugin-syntax-jsx": "7.12.1", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "1.6.22", - "babel-plugin-apply-mdx-type-prop": "1.6.22", - "babel-plugin-extract-import-names": "1.6.22", - "camelcase-css": "2.0.1", - "detab": "2.0.4", - "hast-util-raw": "6.0.1", - "lodash.uniq": "4.5.0", - "mdast-util-to-hast": "10.0.1", - "remark-footnotes": "2.0.0", - "remark-mdx": "1.6.22", - "remark-parse": "8.0.3", - "remark-squeeze-paragraphs": "4.0.0", - "style-to-object": "0.3.0", - "unified": "9.2.0", - "unist-builder": "2.0.3", - "unist-util-visit": "2.0.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@mdx-js/mdx/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@mdx-js/util": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "dependencies": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@mrmlnc/readdir-enhanced/node_modules/glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true }, "node_modules/@nicolo-ribaudo/chokidar-2": { @@ -2603,89 +2344,6 @@ "node": ">= 8" } }, - "node_modules/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "dev": true, - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "node_modules/@npmcli/fs/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/@npmcli/fs/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/fs/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/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/move-file/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/move-file/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@openreplay/sourcemap-uploader": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@openreplay/sourcemap-uploader/-/sourcemap-uploader-3.0.6.tgz", @@ -2699,61 +2357,16 @@ "sourcemap-uploader": "cli.js" } }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.5.tgz", - "integrity": "sha512-RbG7h6TuP6nFFYKJwbcToA1rjC1FyPg25NR2noAZ0vKI+la01KTSRPkuVPE+U88jXv7javx2JHglUcL1MHcshQ==", - "dev": true, - "dependencies": { - "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", - "core-js-pure": "^3.8.1", - "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", - "html-entities": "^2.1.0", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">= 10.13" - }, - "peerDependencies": { - "@types/webpack": "4.x || 5.x", - "react-refresh": ">=0.10.0 <1.0.0", - "sockjs-client": "^1.4.0", - "type-fest": ">=0.17.0 <3.0.0", - "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x", - "webpack-hot-middleware": "2.x", - "webpack-plugin-serve": "0.x || 1.x" - }, - "peerDependenciesMeta": { - "@types/webpack": { - "optional": true - }, - "sockjs-client": { - "optional": true - }, - "type-fest": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - }, - "webpack-hot-middleware": { - "optional": true - }, - "webpack-plugin-serve": { - "optional": true - } - } + "node_modules/@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "dev": true }, "node_modules/@popperjs/core": { "version": "2.11.5", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==", - "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -2774,17 +2387,96 @@ "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-3.0.1.tgz", "integrity": "sha512-XjDVbs3ZU16CO1h5Q3Ew2RPJqmZBDE/EVf1LYp6ePEffs3V/MX9ZbL5bJr8qiK5SbGmUMuDoaFgyKacYz8prRA==" }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, "node_modules/@semantic-ui-react/event-stack": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@semantic-ui-react/event-stack/-/event-stack-3.1.2.tgz", - "integrity": "sha512-Yd0Qf7lPCIjzJ9bZYfurlNu2RDXT6KKSyubHfYK3WjRauhxCsq6Fk2LMRI9DEvShoEU+AsLSv3NGkqXAcVp0zg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@semantic-ui-react/event-stack/-/event-stack-3.1.3.tgz", + "integrity": "sha512-FdTmJyWvJaYinHrKRsMLDrz4tTMGdFfds299Qory53hBugiDvGC0tEJf+cHsi5igDwWb/CLOgOiChInHwq8URQ==", "dependencies": { "exenv": "^1.2.2", "prop-types": "^15.6.2" }, "peerDependencies": { - "react": "^16.0.0 || ^17.0.0", - "react-dom": "^16.0.0 || ^17.0.0" + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/@sentry/browser": { @@ -2867,149 +2559,581 @@ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" }, - "node_modules/@storybook/addons": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.22.tgz", - "integrity": "sha512-P/R+Jsxh7pawKLYo8MtE3QU/ilRFKbtCewV/T1o5U/gm8v7hKQdFz3YdRMAra4QuCY8bQIp7MKd2HrB5aH5a1A==", + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", "dev": true, "dependencies": { - "@storybook/api": "6.4.22", - "@storybook/channels": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/router": "6.4.22", - "@storybook/theming": "6.4.22", - "@types/webpack-env": "^1.16.0", - "core-js": "^3.8.2", - "global": "^4.4.0", - "regenerator-runtime": "^0.13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" } }, - "node_modules/@storybook/api": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.22.tgz", - "integrity": "sha512-lAVI3o2hKupYHXFTt+1nqFct942up5dHH6YD7SZZJGyW21dwKC3HK1IzCsTawq3fZAKkgWFgmOO649hKk60yKg==", - "dev": true, - "dependencies": { - "@storybook/channels": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/router": "6.4.22", - "@storybook/semver": "^7.3.2", - "@storybook/theming": "6.4.22", - "core-js": "^3.8.2", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "regenerator-runtime": "^0.13.7", - "store2": "^2.12.0", - "telejson": "^5.3.2", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" + "node_modules/@svg-maps/world": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@svg-maps/world/-/world-1.0.1.tgz", + "integrity": "sha512-Mawh/jEYBBHnug9S17PyePLYKJ+Xd0Bbh96mCePebpbvcbJu5YKpfKhpyMeLFmmdWPrSFxl0f0MTsJfXU0gSaQ==" + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz", + "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==", + "engines": { + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "type": "github", + "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@storybook/builder-webpack4": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/builder-webpack4/-/builder-webpack4-6.4.22.tgz", - "integrity": "sha512-A+GgGtKGnBneRFSFkDarUIgUTI8pYFdLmUVKEAGdh2hL+vLXAz9A46sEY7C8LQ85XWa8TKy3OTDxqR4+4iWj3A==", + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz", + "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz", + "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz", + "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz", + "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz", + "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz", + "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz", + "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.2.0.tgz", + "integrity": "sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ==", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^6.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^6.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^6.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "^6.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "^6.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "^6.0.0", + "@svgr/babel-plugin-transform-svg-component": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.2.1.tgz", + "integrity": "sha512-NWufjGI2WUyrg46mKuySfviEJ6IxHUOm/8a3Ph38VCWSp+83HBraCQrpEM3F3dB6LBs5x8OElS8h3C0oOJaJAA==", + "dependencies": { + "@svgr/plugin-jsx": "^6.2.1", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz", + "integrity": "sha512-pt7MMkQFDlWJVy9ULJ1h+hZBDGFfSCwlBNW1HkLnVi7jUhyEXUaGYWi1x6bM2IXuAR9l265khBT4Av4lPmaNLQ==", + "dependencies": { + "@babel/types": "^7.15.6", + "entities": "^3.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz", + "integrity": "sha512-u+MpjTsLaKo6r3pHeeSVsh9hmGRag2L7VzApWIaS8imNguqoUwDq/u6U/NDmYs/KAsrmtBjOEaAAPbwNGXXp1g==", + "dependencies": { + "@babel/core": "^7.15.5", + "@svgr/babel-preset": "^6.2.0", + "@svgr/hast-util-to-babel-ast": "^6.2.1", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "^6.0.0" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.2.0.tgz", + "integrity": "sha512-oDdMQONKOJEbuKwuy4Np6VdV6qoaLLvoY86hjvQEgU82Vx1MSWRyYms6Sl0f+NtqxLI/rDVufATbP/ev996k3Q==", + "dependencies": { + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "svgo": "^2.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "^6.0.0" + } + }, + "node_modules/@svgr/webpack": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.2.1.tgz", + "integrity": "sha512-h09ngMNd13hnePwgXa+Y5CgOjzlCvfWLHg+MBnydEedAnuLRzUHUJmGS3o2OsrhxTOOqEsPOFt5v/f6C5Qulcw==", + "dependencies": { + "@babel/core": "^7.15.5", + "@babel/plugin-transform-react-constant-elements": "^7.14.5", + "@babel/preset-env": "^7.15.6", + "@babel/preset-react": "^7.14.5", + "@babel/preset-typescript": "^7.15.0", + "@svgr/core": "^6.2.1", + "@svgr/plugin-jsx": "^6.2.1", + "@svgr/plugin-svgo": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", "dev": true, "dependencies": { - "@babel/core": "^7.12.10", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-decorators": "^7.12.12", - "@babel/plugin-proposal-export-default-from": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.7", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.12", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/preset-env": "^7.12.11", - "@babel/preset-react": "^7.12.10", - "@babel/preset-typescript": "^7.12.7", - "@storybook/addons": "6.4.22", - "@storybook/api": "6.4.22", - "@storybook/channel-postmessage": "6.4.22", - "@storybook/channels": "6.4.22", - "@storybook/client-api": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/components": "6.4.22", - "@storybook/core-common": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/node-logger": "6.4.22", - "@storybook/preview-web": "6.4.22", - "@storybook/router": "6.4.22", - "@storybook/semver": "^7.3.2", - "@storybook/store": "6.4.22", - "@storybook/theming": "6.4.22", - "@storybook/ui": "6.4.22", - "@types/node": "^14.0.10", - "@types/webpack": "^4.41.26", - "autoprefixer": "^9.8.6", - "babel-loader": "^8.0.0", - "babel-plugin-macros": "^2.8.0", - "babel-plugin-polyfill-corejs3": "^0.1.0", - "case-sensitive-paths-webpack-plugin": "^2.3.0", - "core-js": "^3.8.2", - "css-loader": "^3.6.0", - "file-loader": "^6.2.0", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^4.1.6", - "glob": "^7.1.6", - "glob-promise": "^3.4.0", - "global": "^4.4.0", - "html-webpack-plugin": "^4.0.0", - "pnp-webpack-plugin": "1.6.4", - "postcss": "^7.0.36", - "postcss-flexbugs-fixes": "^4.2.1", - "postcss-loader": "^4.2.0", - "raw-loader": "^4.0.2", - "stable": "^0.1.8", - "style-loader": "^1.3.0", - "terser-webpack-plugin": "^4.2.3", - "ts-dedent": "^2.0.0", - "url-loader": "^4.1.1", - "util-deprecate": "^1.0.2", - "webpack": "4", - "webpack-dev-middleware": "^3.7.3", - "webpack-filter-warnings-plugin": "^1.2.1", - "webpack-hot-middleware": "^2.25.1", - "webpack-virtual-modules": "^0.2.2" + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.2.tgz", + "integrity": "sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "17.0.38", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.38.tgz", + "integrity": "sha512-5jY9RhV7c0Z4Jy09G+NIDTsCZ5G0L5n+Z+p+Y7t5VJHM30bgwzSjVtlcBxqAj+6L/swIlvtOSzr8rBk/aNyV2g==", + "devOptional": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/raf": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.0.tgz", + "integrity": "sha512-taW5/WYqo36N7V39oYyHP9Ipfd5pNFvGTIQsNGj86xV88YQ7GnI30/yMfKDF7Zgin0m3e+ikX88FvImnK4RjGw==", + "optional": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.0.10", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.10.tgz", + "integrity": "sha512-dIugadZuIPrRzvIEevIu7A1smqOAjkSMv8qOfwPt9Ve6i6JT/FQcCHyk2qIAxwsQNKZt5/oGR0T4z9h2dXRAkg==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.5.tgz", + "integrity": "sha512-OWPWTUrY/NIrjsAPkAk1wW9LZeIjSvkXRhclsFO8CZcZGCOg2G0YZy4ft+rOyYxy8B7ui5iZzi9OkDebZ7/QSA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz", + "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/resize-observer-browser": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz", + "integrity": "sha512-G9eN0Sn0ii9PWQ3Vl72jDPgeJwRWhv2Qk/nQkJuWmRmOB4HX3/BhD5SE1dZs/hzPZL/WKnvF0RHdTSG54QJFyg==" + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", + "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==", + "dev": true + }, + "node_modules/@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.27.0.tgz", + "integrity": "sha512-DDrIA7GXtmHXr1VCcx9HivA39eprYBIFxbQEHI6NyraRDxCGpxAFiYQAT/1Y0vh1C+o2vfBiy4IuPoXxtTZCAQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.27.0", + "@typescript-eslint/type-utils": "5.27.0", + "@typescript-eslint/utils": "5.27.0", + "debug": "^4.3.4", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/storybook" + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -3017,330 +3141,7 @@ } } }, - "node_modules/@storybook/builder-webpack4/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz", - "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/autoprefixer": { - "version": "9.8.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", - "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", - "dev": true, - "dependencies": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "picocolors": "^0.2.1", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/babel-plugin-macros/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", - "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.1.5", - "core-js-compat": "^3.8.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/fork-ts-checker-webpack-plugin": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", - "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.5.5", - "chalk": "^2.4.1", - "micromatch": "^3.1.10", - "minimatch": "^3.0.4", - "semver": "^5.6.0", - "tapable": "^1.0.0", - "worker-rpc": "^0.1.0" - }, - "engines": { - "node": ">=6.11.5", - "yarn": ">=1.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/html-webpack-plugin": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz", - "integrity": "sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==", - "dev": true, - "dependencies": { - "@types/html-minifier-terser": "^5.0.0", - "@types/tapable": "^1.0.5", - "@types/webpack": "^4.41.8", - "html-minifier-terser": "^5.0.1", - "loader-utils": "^1.2.3", - "lodash": "^4.17.20", - "pretty-error": "^2.1.1", - "tapable": "^1.1.3", - "util.promisify": "1.0.0" - }, - "engines": { - "node": ">=6.9" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/html-webpack-plugin/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/@storybook/builder-webpack4/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/@storybook/builder-webpack4/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/@storybook/builder-webpack4/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "node_modules/@storybook/builder-webpack4/node_modules/postcss-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz", - "integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==", - "dev": true, - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.4" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/postcss-loader/node_modules/semver": { + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", @@ -3355,273 +3156,26 @@ "node": ">=10" } }, - "node_modules/@storybook/builder-webpack4/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/@storybook/builder-webpack4/node_modules/style-loader": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", - "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", + "node_modules/@typescript-eslint/parser": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.27.0.tgz", + "integrity": "sha512-8oGjQF46c52l7fMiPPvX4It3u3V3JipssqDfHQ2hcR0AeR8Zge+OYyKUCm5b70X72N1qXt0qgHenwN6Gc2SXZA==", "dev": true, "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^2.7.0" + "@typescript-eslint/scope-manager": "5.27.0", + "@typescript-eslint/types": "5.27.0", + "@typescript-eslint/typescript-estree": "5.27.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 8.9.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/style-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/builder-webpack4/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/@storybook/channel-postmessage": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-6.4.22.tgz", - "integrity": "sha512-gt+0VZLszt2XZyQMh8E94TqjHZ8ZFXZ+Lv/Mmzl0Yogsc2H+6VzTTQO4sv0IIx6xLbpgG72g5cr8VHsxW5kuDQ==", - "dev": true, - "dependencies": { - "@storybook/channels": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/core-events": "6.4.22", - "core-js": "^3.8.2", - "global": "^4.4.0", - "qs": "^6.10.0", - "telejson": "^5.3.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/channel-websocket": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-6.4.22.tgz", - "integrity": "sha512-Bm/FcZ4Su4SAK5DmhyKKfHkr7HiHBui6PNutmFkASJInrL9wBduBfN8YQYaV7ztr8ezoHqnYRx8sj28jpwa6NA==", - "dev": true, - "dependencies": { - "@storybook/channels": "6.4.22", - "@storybook/client-logger": "6.4.22", - "core-js": "^3.8.2", - "global": "^4.4.0", - "telejson": "^5.3.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/channels": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.22.tgz", - "integrity": "sha512-cfR74tu7MLah1A8Rru5sak71I+kH2e/sY6gkpVmlvBj4hEmdZp4Puj9PTeaKcMXh9DgIDPNA5mb8yvQH6VcyxQ==", - "dev": true, - "dependencies": { - "core-js": "^3.8.2", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/client-api": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-6.4.22.tgz", - "integrity": "sha512-sO6HJNtrrdit7dNXQcZMdlmmZG1k6TswH3gAyP/DoYajycrTwSJ6ovkarzkO+0QcJ+etgra4TEdTIXiGHBMe/A==", - "dev": true, - "dependencies": { - "@storybook/addons": "6.4.22", - "@storybook/channel-postmessage": "6.4.22", - "@storybook/channels": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/store": "6.4.22", - "@types/qs": "^6.9.5", - "@types/webpack-env": "^1.16.0", - "core-js": "^3.8.2", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7", - "store2": "^2.12.0", - "synchronous-promise": "^2.0.15", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/@storybook/client-logger": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.22.tgz", - "integrity": "sha512-LXhxh/lcDsdGnK8kimqfhu3C0+D2ylCSPPQNbU0IsLRmTfbpQYMdyl0XBjPdHiRVwlL7Gkw5OMjYemQgJ02zlw==", - "dev": true, - "dependencies": { - "core-js": "^3.8.2", - "global": "^4.4.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/components": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-6.4.22.tgz", - "integrity": "sha512-dCbXIJF9orMvH72VtAfCQsYbe57OP7fAADtR6YTwfCw9Sm1jFuZr8JbblQ1HcrXEoJG21nOyad3Hm5EYVb/sBw==", - "dev": true, - "dependencies": { - "@popperjs/core": "^2.6.0", - "@storybook/client-logger": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/theming": "6.4.22", - "@types/color-convert": "^2.0.0", - "@types/overlayscrollbars": "^1.12.0", - "@types/react-syntax-highlighter": "11.0.5", - "color-convert": "^2.0.1", - "core-js": "^3.8.2", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "lodash": "^4.17.21", - "markdown-to-jsx": "^7.1.3", - "memoizerific": "^1.11.3", - "overlayscrollbars": "^1.13.1", - "polished": "^4.0.5", - "prop-types": "^15.7.2", - "react-colorful": "^5.1.2", - "react-popper-tooltip": "^3.1.1", - "react-syntax-highlighter": "^13.5.3", - "react-textarea-autosize": "^8.3.0", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/@storybook/core": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-6.4.22.tgz", - "integrity": "sha512-KZYJt7GM5NgKFXbPRZZZPEONZ5u/tE/cRbMdkn/zWN3He8+VP+65/tz8hbriI/6m91AWVWkBKrODSkeq59NgRA==", - "dev": true, - "dependencies": { - "@storybook/core-client": "6.4.22", - "@storybook/core-server": "6.4.22" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "@storybook/builder-webpack5": "6.4.22", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0", - "webpack": "*" - }, - "peerDependenciesMeta": { - "@storybook/builder-webpack5": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/@storybook/core-client": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-6.4.22.tgz", - "integrity": "sha512-uHg4yfCBeM6eASSVxStWRVTZrAnb4FT6X6v/xDqr4uXCpCttZLlBzrSDwPBLNNLtCa7ntRicHM8eGKIOD5lMYQ==", - "dev": true, - "dependencies": { - "@storybook/addons": "6.4.22", - "@storybook/channel-postmessage": "6.4.22", - "@storybook/channel-websocket": "6.4.22", - "@storybook/client-api": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/preview-web": "6.4.22", - "@storybook/store": "6.4.22", - "@storybook/ui": "6.4.22", - "airbnb-js-shims": "^2.2.1", - "ansi-to-html": "^0.6.11", - "core-js": "^3.8.2", - "global": "^4.4.0", - "lodash": "^4.17.21", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0", - "unfetch": "^4.2.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0", - "webpack": "*" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -3629,69 +3183,42 @@ } } }, - "node_modules/@storybook/core-common": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-6.4.22.tgz", - "integrity": "sha512-PD3N/FJXPNRHeQS2zdgzYFtqPLdi3MLwAicbnw+U3SokcsspfsAuyYHZOYZgwO8IAEKy6iCc7TpBdiSJZ/vAKQ==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.27.0.tgz", + "integrity": "sha512-VnykheBQ/sHd1Vt0LJ1JLrMH1GzHO+SzX6VTXuStISIsvRiurue/eRkTqSrG0CexHQgKG8shyJfR4o5VYioB9g==", "dev": true, "dependencies": { - "@babel/core": "^7.12.10", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-decorators": "^7.12.12", - "@babel/plugin-proposal-export-default-from": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.7", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.12", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/preset-env": "^7.12.11", - "@babel/preset-react": "^7.12.10", - "@babel/preset-typescript": "^7.12.7", - "@babel/register": "^7.12.1", - "@storybook/node-logger": "6.4.22", - "@storybook/semver": "^7.3.2", - "@types/node": "^14.0.10", - "@types/pretty-hrtime": "^1.0.0", - "babel-loader": "^8.0.0", - "babel-plugin-macros": "^3.0.1", - "babel-plugin-polyfill-corejs3": "^0.1.0", - "chalk": "^4.1.0", - "core-js": "^3.8.2", - "express": "^4.17.1", - "file-system-cache": "^1.0.5", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.0.4", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "handlebars": "^4.7.7", - "interpret": "^2.2.0", - "json5": "^2.1.3", - "lazy-universal-dotenv": "^3.0.1", - "picomatch": "^2.3.0", - "pkg-dir": "^5.0.0", - "pretty-hrtime": "^1.0.3", - "resolve-from": "^5.0.0", - "slash": "^3.0.0", - "telejson": "^5.3.2", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2", - "webpack": "4" + "@typescript-eslint/types": "5.27.0", + "@typescript-eslint/visitor-keys": "5.27.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/storybook" + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.27.0.tgz", + "integrity": "sha512-vpTvRRchaf628Hb/Xzfek+85o//zEUotr1SmexKvTfs7czXfYjXVT/a5yDbpzLBX1rhbqxjDdr1Gyo0x1Fc64g==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "5.27.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "eslint": "*" }, "peerDependenciesMeta": { "typescript": { @@ -3699,341 +3226,39 @@ } } }, - "node_modules/@storybook/core-common/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz", - "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@storybook/core-common/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/@storybook/core-common/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", - "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.1.5", - "core-js-compat": "^3.8.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@storybook/core-common/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/@storybook/core-common/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==", + "node_modules/@typescript-eslint/types": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.27.0.tgz", + "integrity": "sha512-lY6C7oGm9a/GWhmUDOs3xAVRz4ty/XKlQ2fOLr8GAIryGn0+UBOoJDWyHer3UgrHkenorwvBnphhP+zPmzmw0A==", "dev": true, "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/core-common/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/core-common/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/@storybook/core-events": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.22.tgz", - "integrity": "sha512-5GYY5+1gd58Gxjqex27RVaX6qbfIQmJxcbzbNpXGNSqwqAuIIepcV1rdCVm6I4C3Yb7/AQ3cN5dVbf33QxRIwA==", - "dev": true, - "dependencies": { - "core-js": "^3.8.2" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/storybook" + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@storybook/core-server": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-6.4.22.tgz", - "integrity": "sha512-wFh3e2fa0un1d4+BJP+nd3FVWUO7uHTqv3OGBfOmzQMKp4NU1zaBNdSQG7Hz6mw0fYPBPZgBjPfsJRwIYLLZyw==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.27.0.tgz", + "integrity": "sha512-QywPMFvgZ+MHSLRofLI7BDL+UczFFHyj0vF5ibeChDAJgdTV8k4xgEwF0geFhVlPc1p8r70eYewzpo6ps+9LJQ==", "dev": true, "dependencies": { - "@discoveryjs/json-ext": "^0.5.3", - "@storybook/builder-webpack4": "6.4.22", - "@storybook/core-client": "6.4.22", - "@storybook/core-common": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/csf-tools": "6.4.22", - "@storybook/manager-webpack4": "6.4.22", - "@storybook/node-logger": "6.4.22", - "@storybook/semver": "^7.3.2", - "@storybook/store": "6.4.22", - "@types/node": "^14.0.10", - "@types/node-fetch": "^2.5.7", - "@types/pretty-hrtime": "^1.0.0", - "@types/webpack": "^4.41.26", - "better-opn": "^2.1.1", - "boxen": "^5.1.2", - "chalk": "^4.1.0", - "cli-table3": "^0.6.1", - "commander": "^6.2.1", - "compression": "^1.7.4", - "core-js": "^3.8.2", - "cpy": "^8.1.2", - "detect-port": "^1.3.0", - "express": "^4.17.1", - "file-system-cache": "^1.0.5", - "fs-extra": "^9.0.1", - "globby": "^11.0.2", - "ip": "^1.1.5", - "lodash": "^4.17.21", - "node-fetch": "^2.6.1", - "pretty-hrtime": "^1.0.3", - "prompts": "^2.4.0", - "regenerator-runtime": "^0.13.7", - "serve-favicon": "^2.5.0", - "slash": "^3.0.0", - "telejson": "^5.3.3", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2", - "watchpack": "^2.2.0", - "webpack": "4", - "ws": "^8.2.3" + "@typescript-eslint/types": "5.27.0", + "@typescript-eslint/visitor-keys": "5.27.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "@storybook/builder-webpack5": "6.4.22", - "@storybook/manager-webpack5": "6.4.22", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@storybook/builder-webpack5": { - "optional": true - }, - "@storybook/manager-webpack5": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/@storybook/core-server/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/@storybook/core-server/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/@storybook/core-server/node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@storybook/core-server/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/@storybook/core-server/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/core-server/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/@storybook/csf": { - "version": "0.0.2--canary.87bc651.0", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.2--canary.87bc651.0.tgz", - "integrity": "sha512-ajk1Uxa+rBpFQHKrCcTmJyQBXZ5slfwHVEaKlkuFaW77it8RgbPJp/ccna3sgoi8oZ7FkkOyvv1Ve4SmwFqRqw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/@storybook/csf-tools": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-6.4.22.tgz", - "integrity": "sha512-LMu8MZAiQspJAtMBLU2zitsIkqQv7jOwX7ih5JrXlyaDticH7l2j6Q+1mCZNWUOiMTizj0ivulmUsSaYbpToSw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.10", - "@babel/generator": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/plugin-transform-react-jsx": "^7.12.12", - "@babel/preset-env": "^7.12.11", - "@babel/traverse": "^7.12.11", - "@babel/types": "^7.12.11", - "@mdx-js/mdx": "^1.6.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "core-js": "^3.8.2", - "fs-extra": "^9.0.1", - "global": "^4.4.0", - "js-string-escape": "^1.0.1", - "lodash": "^4.17.21", - "prettier": ">=2.2.1 <=2.3.0", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/manager-webpack4": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/manager-webpack4/-/manager-webpack4-6.4.22.tgz", - "integrity": "sha512-nzhDMJYg0vXdcG0ctwE6YFZBX71+5NYaTGkxg3xT7gbgnP1YFXn9gVODvgq3tPb3gcRapjyOIxUa20rV+r8edA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.10", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/preset-react": "^7.12.10", - "@storybook/addons": "6.4.22", - "@storybook/core-client": "6.4.22", - "@storybook/core-common": "6.4.22", - "@storybook/node-logger": "6.4.22", - "@storybook/theming": "6.4.22", - "@storybook/ui": "6.4.22", - "@types/node": "^14.0.10", - "@types/webpack": "^4.41.26", - "babel-loader": "^8.0.0", - "case-sensitive-paths-webpack-plugin": "^2.3.0", - "chalk": "^4.1.0", - "core-js": "^3.8.2", - "css-loader": "^3.6.0", - "express": "^4.17.1", - "file-loader": "^6.2.0", - "file-system-cache": "^1.0.5", - "find-up": "^5.0.0", - "fs-extra": "^9.0.1", - "html-webpack-plugin": "^4.0.0", - "node-fetch": "^2.6.1", - "pnp-webpack-plugin": "1.6.4", - "read-pkg-up": "^7.0.1", - "regenerator-runtime": "^0.13.7", - "resolve-from": "^5.0.0", - "style-loader": "^1.3.0", - "telejson": "^5.3.2", - "terser-webpack-plugin": "^4.2.3", - "ts-dedent": "^2.0.0", - "url-loader": "^4.1.1", - "util-deprecate": "^1.0.2", - "webpack": "4", - "webpack-dev-middleware": "^3.7.3", - "webpack-virtual-modules": "^0.2.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "url": "https://opencollective.com/typescript-eslint" }, "peerDependenciesMeta": { "typescript": { @@ -4041,488 +3266,13 @@ } } }, - "node_modules/@storybook/manager-webpack4/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==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@storybook/manager-webpack4/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/@storybook/manager-webpack4/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/@storybook/manager-webpack4/node_modules/html-webpack-plugin": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz", - "integrity": "sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==", - "dev": true, - "dependencies": { - "@types/html-minifier-terser": "^5.0.0", - "@types/tapable": "^1.0.5", - "@types/webpack": "^4.41.8", - "html-minifier-terser": "^5.0.1", - "loader-utils": "^1.2.3", - "lodash": "^4.17.20", - "pretty-error": "^2.1.1", - "tapable": "^1.1.3", - "util.promisify": "1.0.0" - }, - "engines": { - "node": ">=6.9" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/html-webpack-plugin/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/style-loader": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", - "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^2.7.0" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/@storybook/manager-webpack4/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/@storybook/node-logger": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-6.4.22.tgz", - "integrity": "sha512-sUXYFqPxiqM7gGH7gBXvO89YEO42nA4gBicJKZjj9e+W4QQLrftjF9l+mAw2K0mVE10Bn7r4pfs5oEZ0aruyyA==", - "dev": true, - "dependencies": { - "@types/npmlog": "^4.1.2", - "chalk": "^4.1.0", - "core-js": "^3.8.2", - "npmlog": "^5.0.1", - "pretty-hrtime": "^1.0.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/node-logger/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/@storybook/node-logger/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/@storybook/node-logger/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/@storybook/node-logger/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/@storybook/preview-web": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/preview-web/-/preview-web-6.4.22.tgz", - "integrity": "sha512-sWS+sgvwSvcNY83hDtWUUL75O2l2LY/GTAS0Zp2dh3WkObhtuJ/UehftzPZlZmmv7PCwhb4Q3+tZDKzMlFxnKQ==", - "dev": true, - "dependencies": { - "@storybook/addons": "6.4.22", - "@storybook/channel-postmessage": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/store": "6.4.22", - "ansi-to-html": "^0.6.11", - "core-js": "^3.8.2", - "global": "^4.4.0", - "lodash": "^4.17.21", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7", - "synchronous-promise": "^2.0.15", - "ts-dedent": "^2.0.0", - "unfetch": "^4.2.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/@storybook/react": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-6.4.22.tgz", - "integrity": "sha512-5BFxtiguOcePS5Ty/UoH7C6odmvBYIZutfiy4R3Ua6FYmtxac5vP9r5KjCz1IzZKT8mCf4X+PuK1YvDrPPROgQ==", - "dev": true, - "dependencies": { - "@babel/preset-flow": "^7.12.1", - "@babel/preset-react": "^7.12.10", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.1", - "@storybook/addons": "6.4.22", - "@storybook/core": "6.4.22", - "@storybook/core-common": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/node-logger": "6.4.22", - "@storybook/react-docgen-typescript-plugin": "1.0.2-canary.253f8c1.0", - "@storybook/semver": "^7.3.2", - "@storybook/store": "6.4.22", - "@types/webpack-env": "^1.16.0", - "babel-plugin-add-react-displayname": "^0.0.5", - "babel-plugin-named-asset-import": "^0.3.1", - "babel-plugin-react-docgen": "^4.2.1", - "core-js": "^3.8.2", - "global": "^4.4.0", - "lodash": "^4.17.21", - "prop-types": "^15.7.2", - "react-refresh": "^0.11.0", - "read-pkg-up": "^7.0.1", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0", - "webpack": "4" - }, - "bin": { - "build-storybook": "bin/build.js", - "start-storybook": "bin/index.js", - "storybook-server": "bin/index.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "@babel/core": "^7.11.5", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/@storybook/react-docgen-typescript-plugin": { - "version": "1.0.2-canary.253f8c1.0", - "resolved": "https://registry.npmjs.org/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.2-canary.253f8c1.0.tgz", - "integrity": "sha512-mmoRG/rNzAiTbh+vGP8d57dfcR2aP+5/Ll03KKFyfy5FqWFm/Gh7u27ikx1I3LmVMI8n6jh5SdWMkMKon7/tDw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "endent": "^2.0.1", - "find-cache-dir": "^3.3.1", - "flat-cache": "^3.0.4", - "micromatch": "^4.0.2", - "react-docgen-typescript": "^2.0.0", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "typescript": ">= 3.x", - "webpack": ">= 4" - } - }, - "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/@storybook/react-docgen-typescript-plugin/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/@storybook/react-docgen-typescript-plugin/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/@storybook/react-docgen-typescript-plugin/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/react-docgen-typescript-plugin/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/@storybook/react-docgen-typescript-plugin/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/@storybook/router": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.22.tgz", - "integrity": "sha512-zeuE8ZgFhNerQX8sICQYNYL65QEi3okyzw7ynF58Ud6nRw4fMxSOHcj2T+nZCIU5ufozRL4QWD/Rg9P2s/HtLw==", - "dev": true, - "dependencies": { - "@storybook/client-logger": "6.4.22", - "core-js": "^3.8.2", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "history": "5.0.0", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "react-router": "^6.0.0", - "react-router-dom": "^6.0.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/@storybook/router/node_modules/react-router": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz", - "integrity": "sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==", - "dev": true, - "dependencies": { - "history": "^5.2.0" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/@storybook/router/node_modules/react-router-dom": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz", - "integrity": "sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==", - "dev": true, - "dependencies": { - "history": "^5.2.0", - "react-router": "6.3.0" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/@storybook/router/node_modules/react-router-dom/node_modules/history": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", - "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.6" - } - }, - "node_modules/@storybook/router/node_modules/react-router/node_modules/history": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", - "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.6" - } - }, - "node_modules/@storybook/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", - "dev": true, - "dependencies": { - "core-js": "^3.6.5", - "find-up": "^4.1.0" + "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" @@ -4531,663 +3281,229 @@ "node": ">=10" } }, - "node_modules/@storybook/semver/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==", + "node_modules/@typescript-eslint/utils": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.27.0.tgz", + "integrity": "sha512-nZvCrkIJppym7cIbP3pOwIkAefXOmfGPnCM0LQfzNaKxJHI6VjI8NC662uoiPlaf5f6ymkTy9C3NQXev2mdXmA==", "dev": true, "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.27.0", + "@typescript-eslint/types": "5.27.0", + "@typescript-eslint/typescript-estree": "5.27.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/semver/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/@storybook/semver/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/@storybook/store": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/store/-/store-6.4.22.tgz", - "integrity": "sha512-lrmcZtYJLc2emO+1l6AG4Txm9445K6Pyv9cGAuhOJ9Kks0aYe0YtvMkZVVry0RNNAIv6Ypz72zyKc/QK+tZLAQ==", - "dev": true, - "dependencies": { - "@storybook/addons": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "core-js": "^3.8.2", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "regenerator-runtime": "^0.13.7", - "slash": "^3.0.0", - "stable": "^0.1.8", - "synchronous-promise": "^2.0.15", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/storybook" + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@storybook/store/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/theming": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.22.tgz", - "integrity": "sha512-NVMKH/jxSPtnMTO4VCN1k47uztq+u9fWv4GSnzq/eezxdGg9ceGL4/lCrNGoNajht9xbrsZ4QvsJ/V2sVGM8wA==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.27.0.tgz", + "integrity": "sha512-46cYrteA2MrIAjv9ai44OQDUoCZyHeGIc4lsjCUX2WT6r4C+kidz1bNiR4017wHOPUythYeH+Sc7/cFP97KEAA==", "dev": true, "dependencies": { - "@emotion/core": "^10.1.1", - "@emotion/is-prop-valid": "^0.8.6", - "@emotion/styled": "^10.0.27", - "@storybook/client-logger": "6.4.22", - "core-js": "^3.8.2", - "deep-object-diff": "^1.1.0", - "emotion-theming": "^10.0.27", - "global": "^4.4.0", - "memoizerific": "^1.11.3", - "polished": "^4.0.5", - "resolve-from": "^5.0.0", - "ts-dedent": "^2.0.0" + "@typescript-eslint/types": "5.27.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/@storybook/ui": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-6.4.22.tgz", - "integrity": "sha512-UVjMoyVsqPr+mkS1L7m30O/xrdIEgZ5SCWsvqhmyMUok3F3tRB+6M+OA5Yy+cIVfvObpA7MhxirUT1elCGXsWQ==", - "dev": true, - "dependencies": { - "@emotion/core": "^10.1.1", - "@storybook/addons": "6.4.22", - "@storybook/api": "6.4.22", - "@storybook/channels": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/components": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/router": "6.4.22", - "@storybook/semver": "^7.3.2", - "@storybook/theming": "6.4.22", - "copy-to-clipboard": "^3.3.1", - "core-js": "^3.8.2", - "core-js-pure": "^3.8.2", - "downshift": "^6.0.15", - "emotion-theming": "^10.0.27", - "fuse.js": "^3.6.1", - "global": "^4.4.0", - "lodash": "^4.17.21", - "markdown-to-jsx": "^7.1.3", - "memoizerific": "^1.11.3", - "polished": "^4.0.5", - "qs": "^6.10.0", - "react-draggable": "^4.4.3", - "react-helmet-async": "^1.0.7", - "react-sizeme": "^3.0.1", - "regenerator-runtime": "^0.13.7", - "resolve-from": "^5.0.0", - "store2": "^2.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/@svg-maps/world": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@svg-maps/world/-/world-1.0.1.tgz", - "integrity": "sha512-Mawh/jEYBBHnug9S17PyePLYKJ+Xd0Bbh96mCePebpbvcbJu5YKpfKhpyMeLFmmdWPrSFxl0f0MTsJfXU0gSaQ==" - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/color-convert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/color-convert/-/color-convert-2.0.0.tgz", - "integrity": "sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ==", - "dev": true, - "dependencies": { - "@types/color-name": "*" - } - }, - "node_modules/@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "node_modules/@types/css-modules-loader-core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@types/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz", - "integrity": "sha512-LMbyf7THPqLCPHIXAj79v9Pa193MeOHgp1fBFRR6s6VvEVHUFIcM5bc/WttslOf+lao4TURNN1X1zfW5wr2CHQ==", - "dev": true, - "dependencies": { - "postcss": "7.x.x" - } - }, - "node_modules/@types/d3-color": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-2.0.3.tgz", - "integrity": "sha512-+0EtEjBfKEDtH9Rk3u3kLOUXM5F+iZK+WvASPb0MhIZl8J8NUvGeZRwKCXl+P3HkYx5TdU4YtcibpqHkSR9n7w==" - }, - "node_modules/@types/d3-interpolate": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-2.0.2.tgz", - "integrity": "sha512-lElyqlUfIPyWG/cD475vl6msPL4aMU7eJvx1//Q177L8mdXoVPFl1djIESF2FKnc0NyaHvQlJpWwKJYwAhUoCw==", - "dependencies": { - "@types/d3-color": "^2" - } - }, - "node_modules/@types/d3-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-2.0.2.tgz", - "integrity": "sha512-3YHpvDw9LzONaJzejXLOwZ3LqwwkoXb9LI2YN7Hbd6pkGo5nIlJ09ul4bQhBN4hQZJKmUpX8HkVqbzgUKY48cg==" - }, - "node_modules/@types/d3-scale": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-3.3.2.tgz", - "integrity": "sha512-gGqr7x1ost9px3FvIfUMi5XA/F/yAf4UkUDtdQhpH92XCT0Oa7zkkRzY61gPVJq+DxpHn/btouw5ohWkbBsCzQ==", - "dependencies": { - "@types/d3-time": "^2" - } - }, - "node_modules/@types/d3-shape": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-2.1.3.tgz", - "integrity": "sha512-HAhCel3wP93kh4/rq+7atLdybcESZ5bRHDEZUojClyZWsRuEMo3A52NGYJSh48SxfxEU6RZIVbZL2YFZ2OAlzQ==", - "dependencies": { - "@types/d3-path": "^2" - } - }, - "node_modules/@types/d3-time": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-2.1.1.tgz", - "integrity": "sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg==" - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/hast": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", - "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", - "dev": true, - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/html-minifier-terser": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", - "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==", - "dev": true - }, - "node_modules/@types/is-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha512-A79HEEiwXTFtfY+Bcbo58M2GRYzCr9itHWzbzHVFNEYCcoU/MMGwYYf721gBrnhpj1s6RGVVha/IgNFnR0Iw/Q==", - "dev": true - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "node_modules/@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", - "dev": true, - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "14.18.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.16.tgz", - "integrity": "sha512-X3bUMdK/VmvrWdoTkz+VCn6nwKwrKCFTHtqwBIaQJNx4RUIBBUFXM00bqPz/DsDd+Icjmzm6/tyYZzeGVqb6/Q==", - "dev": true - }, - "node_modules/@types/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", - "dev": true, - "dependencies": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "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/@types/npmlog": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@types/npmlog/-/npmlog-4.1.4.tgz", - "integrity": "sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ==", - "dev": true - }, - "node_modules/@types/overlayscrollbars": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@types/overlayscrollbars/-/overlayscrollbars-1.12.1.tgz", - "integrity": "sha512-V25YHbSoKQN35UasHf0EKD9U2vcmexRSp78qa8UglxFH8H3D+adEa9zGZwrqpH4TdvqeMrgMqVqsLB4woAryrQ==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "node_modules/@types/parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", - "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==", - "dev": true - }, - "node_modules/@types/pretty-hrtime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz", - "integrity": "sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==", - "dev": true - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - }, - "node_modules/@types/q": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", - "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", - "dev": true - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "node_modules/@types/raf": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.0.tgz", - "integrity": "sha512-taW5/WYqo36N7V39oYyHP9Ipfd5pNFvGTIQsNGj86xV88YQ7GnI30/yMfKDF7Zgin0m3e+ikX88FvImnK4RjGw==", - "optional": true - }, - "node_modules/@types/react": { - "version": "18.0.8", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.8.tgz", - "integrity": "sha512-+j2hk9BzCOrrOSJASi5XiOyBbERk9jG5O73Ya4M0env5Ixi6vUNli4qy994AINcEF+1IEHISYFfIT4zwr++LKw==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-syntax-highlighter": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.5.tgz", - "integrity": "sha512-VIOi9i2Oj5XsmWWoB72p3KlZoEbdRAcechJa8Ztebw7bDl2YmR+odxIqhtJGp1q2EozHs02US+gzxJ9nuf56qg==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz", - "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react/node_modules/csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" - }, - "node_modules/@types/resize-observer-browser": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz", - "integrity": "sha512-G9eN0Sn0ii9PWQ3Vl72jDPgeJwRWhv2Qk/nQkJuWmRmOB4HX3/BhD5SE1dZs/hzPZL/WKnvF0RHdTSG54QJFyg==" - }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, - "node_modules/@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", - "dev": true - }, - "node_modules/@types/tapable": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", - "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==", - "dev": true - }, - "node_modules/@types/uglify-js": { - "version": "3.13.2", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.2.tgz", - "integrity": "sha512-/xFrPIo+4zOeNGtVMbf9rUm0N+i4pDf1ynExomqtokIJmVzR3962lJ1UE+MmexMkA0cmN9oTzg5Xcbwge0Ij2Q==", - "dev": true, - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/@types/uglify-js/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", - "dev": true - }, - "node_modules/@types/webpack": { - "version": "4.41.32", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.32.tgz", - "integrity": "sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/tapable": "^1", - "@types/uglify-js": "*", - "@types/webpack-sources": "*", - "anymatch": "^3.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/@types/webpack-env": { - "version": "1.16.4", - "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.16.4.tgz", - "integrity": "sha512-llS8qveOUX3wxHnSykP5hlYFFuMfJ9p5JvIyCiBgp7WTfl6K5ZcyHj8r8JsN/J6QODkAsRRCLIcTuOCu8etkUw==", - "dev": true - }, - "node_modules/@types/webpack-sources": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", - "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.7.3" - } - }, - "node_modules/@types/webpack/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dev": true, "dependencies": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", "dev": true }, - "node_modules/@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dev": true, "dependencies": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "node_modules/@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.9.0" + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "node_modules/@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", + "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, + "node_modules/@webpack-cli/configtest": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", + "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", + "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", + "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -5221,9 +3537,10 @@ } }, "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -5231,20 +3548,52 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/acorn-node": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, "dependencies": { "acorn": "^7.0.0", "acorn-walk": "^7.0.0", "xtend": "^4.0.2" } }, + "node_modules/acorn-node/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -5257,53 +3606,6 @@ "object-assign": "4.x" } }, - "node_modules/address": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.0.tgz", - "integrity": "sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/airbnb-js-shims": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/airbnb-js-shims/-/airbnb-js-shims-2.2.1.tgz", - "integrity": "sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", - "array.prototype.flatmap": "^1.2.1", - "es5-shim": "^4.5.13", - "es6-shim": "^0.35.5", - "function.prototype.name": "^1.1.0", - "globalthis": "^1.0.0", - "object.entries": "^1.1.0", - "object.fromentries": "^2.0.0 || ^1.0.0", - "object.getownpropertydescriptors": "^2.0.3", - "object.values": "^1.1.0", - "promise.allsettled": "^1.0.0", - "promise.prototype.finally": "^3.1.0", - "string.prototype.matchall": "^4.0.0 || ^3.0.1", - "string.prototype.padend": "^3.0.0", - "string.prototype.padstart": "^3.0.0", - "symbol.prototype.description": "^1.0.0" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -5320,15 +3622,45 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, "peerDependencies": { - "ajv": ">=5.0.0" + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "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/ajv-formats/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/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -5338,19 +3670,10 @@ "ajv": "^6.9.1" } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, "engines": { "node": ">=6" @@ -5388,34 +3711,6 @@ "node": ">=4" } }, - "node_modules/ansi-styles/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==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/ansi-styles/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/ansi-to-html": { - "version": "0.6.15", - "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.15.tgz", - "integrity": "sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ==", - "dev": true, - "dependencies": { - "entities": "^2.0.0" - }, - "bin": { - "ansi-to-html": "bin/ansi-to-html" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -5429,74 +3724,12 @@ "node": ">= 8" } }, - "node_modules/app-root-dir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", - "integrity": "sha1-OBh+wt6nV3//Az/8sSFyaS/24Rg=", + "node_modules/arg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==", "dev": true }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/are-we-there-yet/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/are-we-there-yet/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/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -5506,61 +3739,21 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, "node_modules/array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", "get-intrinsic": "^1.1.1", "is-string": "^1.0.7" }, @@ -5580,42 +3773,6 @@ "node": ">=8" } }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.flatmap": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", @@ -5634,15 +3791,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.map": { + "node_modules/array.prototype.reduce": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.4.tgz", - "integrity": "sha512-Qds9QnX7A0qISY7JT5WuJO0NJPE9CMlC6JzHQfhpqAAQQzufVRoeH7EzUY5GcPTx72voG8LV/5eo+b8Qi8hmhA==", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", + "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", + "es-abstract": "^1.19.2", "es-array-method-boxes-properly": "^1.0.0", "is-string": "^1.0.7" }, @@ -5653,19 +3810,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "node_modules/asn1.js": { "version": "5.4.1", @@ -5685,88 +3833,12 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, - "node_modules/assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" - } - }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "dependencies": { - "inherits": "2.0.1" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ast-types": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", - "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", - "dev": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", - "dev": true - }, - "node_modules/ast-types/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, "node_modules/async": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", "dev": true }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -5788,57 +3860,36 @@ } }, "node_modules/autoprefixer": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", - "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", + "version": "10.4.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", + "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], "dependencies": { - "browserslist": "^2.11.3", - "caniuse-lite": "^1.0.30000805", + "browserslist": "^4.20.3", + "caniuse-lite": "^1.0.30001335", + "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^6.0.17", - "postcss-value-parser": "^3.2.3" + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" }, "bin": { - "autoprefixer-info": "bin/autoprefixer-info" - } - }, - "node_modules/autoprefixer/node_modules/browserslist": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", - "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", - "deprecated": "Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30000792", - "electron-to-chromium": "^1.3.30" - }, - "bin": { - "browserslist": "cli.js" - } - }, - "node_modules/autoprefixer/node_modules/postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "autoprefixer": "bin/autoprefixer" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/autoprefixer/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, "node_modules/available-typed-arrays": { @@ -5854,9 +3905,9 @@ } }, "node_modules/aws-sdk": { - "version": "2.1125.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1125.0.tgz", - "integrity": "sha512-2syNkKDqDcDmB/chc61a5xx+KYzaarLs1/KshE0b1Opp2oSq2FARyUBbk59HgwKaDUB61uPF33ZG9sHiIVx2hQ==", + "version": "2.1146.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1146.0.tgz", + "integrity": "sha512-lg83hvrK2oiJVnklUVMXIJkeYX2nlqhvxIFlZ2wfoaJyvdGsEcOUdZ/EMDgiS0V2jwGS8CtTUypcW/t2S6gdcQ==", "dev": true, "dependencies": { "buffer": "4.9.2", @@ -5866,28 +3917,85 @@ "querystring": "0.2.0", "sax": "1.2.1", "url": "0.10.3", - "uuid": "3.3.2", + "uuid": "8.0.0", "xml2js": "0.4.19" }, "engines": { "node": ">= 10.0.0" } }, - "node_modules/axe-core": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz", - "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==", + "node_modules/babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, - "node_modules/axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "node_modules/babel-code-frame/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==", "dev": true }, + "node_modules/babel-code-frame/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/babel-loader": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", @@ -5976,6 +4084,15 @@ "node": ">=8" } }, + "node_modules/babel-loader/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/babel-loader/node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -5988,96 +4105,37 @@ "node": ">=8" } }, - "node_modules/babel-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "node_modules/babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "babel-runtime": "^6.22.0" } }, - "node_modules/babel-plugin-add-react-displayname": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz", - "integrity": "sha1-M51M3be2X9YtHfnbn+BN4TQSK9U=", - "dev": true - }, - "node_modules/babel-plugin-apply-mdx-type-prop": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", - "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "7.10.4", - "@mdx-js/util": "1.6.22" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@babel/core": "^7.11.6" - } - }, - "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - }, "node_modules/babel-plugin-dynamic-import-node": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, "dependencies": { "object.assign": "^4.1.0" } }, - "node_modules/babel-plugin-emotion": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.2.2.tgz", - "integrity": "sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/serialize": "^0.11.16", - "babel-plugin-macros": "^2.0.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^1.0.5", - "find-root": "^1.1.0", - "source-map": "^0.5.7" - } - }, - "node_modules/babel-plugin-emotion/node_modules/babel-plugin-macros": { + "node_modules/babel-plugin-macros": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "dev": true, "dependencies": { "@babel/runtime": "^7.7.2", "cosmiconfig": "^6.0.0", "resolve": "^1.12.0" } }, - "node_modules/babel-plugin-emotion/node_modules/cosmiconfig": { + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", @@ -6089,63 +4147,10 @@ "node": ">=8" } }, - "node_modules/babel-plugin-emotion/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-plugin-extract-import-names": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", - "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "7.10.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/babel-plugin-named-asset-import": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", - "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", - "dev": true, - "peerDependencies": { - "@babel/core": "^7.1.0" - } - }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", - "dev": true, "dependencies": { "@babel/compat-data": "^7.13.11", "@babel/helper-define-polyfill-provider": "^0.3.1", @@ -6159,7 +4164,6 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", - "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.1", "core-js-compat": "^3.21.0" @@ -6172,7 +4176,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", - "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.1" }, @@ -6180,17 +4183,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-react-docgen": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.2.1.tgz", - "integrity": "sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ==", - "dev": true, - "dependencies": { - "ast-types": "^0.14.2", - "lodash": "^4.17.15", - "react-docgen": "^5.0.0" - } - }, "node_modules/babel-plugin-recharts": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/babel-plugin-recharts/-/babel-plugin-recharts-1.2.1.tgz", @@ -6202,16 +4194,27 @@ "babylon": "^6.18.0" } }, - "node_modules/babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "node_modules/babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha512-AWj19x2aDm8qFQ5O2JcD6pwJDW1YdcnO+1b81t7gxrGjz5VHiUqeYWAR4h7zueWMalRelrQDXprv2FrY1dbpbw==", "dev": true }, + "node_modules/babel-plugin-transform-decorators-legacy": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.5.tgz", + "integrity": "sha512-jYHwjzRXRelYQ1uGm353zNzf3QmtdCfvJbuYTZ4gKveK7M9H1fs3a5AKdY1JUDl0z97E30ukORW1dzhWvsabtA==", + "dev": true, + "dependencies": { + "babel-plugin-syntax-decorators": "^6.1.18", + "babel-runtime": "^6.2.0", + "babel-template": "^6.3.0" + } + }, "node_modules/babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", "dependencies": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" @@ -6229,6 +4232,81 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, + "node_modules/babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-traverse/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/babel-traverse/node_modules/globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-traverse/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "node_modules/babel-types/node_modules/to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", @@ -6238,55 +4316,15 @@ "babylon": "bin/babylon.js" } }, - "node_modules/bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/base16": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", - "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=" + "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" }, "node_modules/base64-arraybuffer": { "version": "1.0.2", @@ -6320,42 +4358,9 @@ "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, - "node_modules/batch-processor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/batch-processor/-/batch-processor-1.0.0.tgz", - "integrity": "sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg=", - "dev": true - }, - "node_modules/better-opn": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-2.1.1.tgz", - "integrity": "sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==", - "dev": true, - "dependencies": { - "open": "^7.0.3" - }, - "engines": { - "node": ">8.0.0" - } - }, - "node_modules/bfj": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", - "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.5", - "check-types": "^8.0.3", - "hoopy": "^0.1.4", - "tryer": "^1.0.1" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -6435,16 +4440,10 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, "node_modules/bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, "node_modules/body-parser": { @@ -6492,108 +4491,25 @@ "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "node_modules/bonjour-service": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.12.tgz", + "integrity": "sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw==", "dev": true, "dependencies": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", + "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.4" } }, - "node_modules/bonjour/node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/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/boxen/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/boxen/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/boxen/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" - } + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -6619,7 +4535,7 @@ "node_modules/brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true }, "node_modules/browser-or-node": { @@ -6735,15 +4651,6 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "dependencies": { - "pako": "~1.0.5" - } - }, "node_modules/browserslist": { "version": "4.20.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", @@ -6797,7 +4704,7 @@ "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true, "engines": { "node": "*" @@ -6809,143 +4716,33 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, "node_modules/buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", "dev": true }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, "engines": { "node": ">= 0.8" } }, - "node_modules/c8": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.11.2.tgz", - "integrity": "sha512-6ahJSrhS6TqSghHm+HnWt/8Y2+z0hM/FQyB1ybKhAR30+NYL9CTQ1uwHxuWw6U7BHlHv6wvhgOrH81I+lfCkxg==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - }, - "bin": { - "c8": "bin/c8.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/c8/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/c8/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/c8/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/calendar": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/calendar/-/calendar-0.1.1.tgz", @@ -6963,45 +4760,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "node_modules/caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "dependencies": { - "callsites": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-callsite/node_modules/callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "dependencies": { - "caller-callsite": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -7011,20 +4769,25 @@ } }, "node_modules/camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" } }, + "node_modules/camel-case/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, "engines": { "node": ">=10" }, @@ -7036,6 +4799,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, "engines": { "node": ">= 6" } @@ -7053,9 +4817,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001335", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001335.tgz", - "integrity": "sha512-ddP1Tgm7z2iIxu6QTtbZUv6HJxSaV/PZeSrWFZtbY4JZ69tOeNhBCl3HyRQgeNZKE5AOn1kpV7fhljigy0Ty3w==", + "version": "1.0.30001344", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001344.tgz", + "integrity": "sha512-0ZFjnlCaXNOAYcV7i+TtdKBp0L/3XEU2MF/x6Du1lrh+SRX4IfzIVL4HNJg5pB2PmFb8rszIGyOvsZnqqRoc2g==", "funding": [ { "type": "opencollective", @@ -7086,25 +4850,6 @@ "node": ">=10.0.0" } }, - "node_modules/case-sensitive-paths-webpack-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", - "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ccount": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", - "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -7118,36 +4863,6 @@ "node": ">=4" } }, - "node_modules/character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/charcodes": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/charcodes/-/charcodes-0.2.0.tgz", @@ -7157,12 +4872,6 @@ "node": ">=6" } }, - "node_modules/check-types": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", - "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", - "dev": true - }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -7190,12 +4899,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, "node_modules/chroma-js": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz", @@ -7232,125 +4935,21 @@ "webpack": ">=4.0.1" } }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/classnames": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" }, "node_modules/clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", - "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", + "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", "dev": true, "dependencies": { "source-map": "~0.6.0" }, "engines": { - "node": ">= 4.0" + "node": ">= 10.0" } }, "node_modules/clean-css/node_modules/source-map": { @@ -7362,19 +4961,10 @@ "node": ">=0.10.0" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/cli": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "integrity": "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==", "dependencies": { "exit": "0.1.2", "glob": "^7.1.1" @@ -7383,33 +4973,6 @@ "node": ">=0.2.5" } }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", - "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -7443,92 +5006,17 @@ "node": ">=6" } }, - "node_modules/coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "dependencies": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/codemirror": { - "version": "5.65.3", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.3.tgz", - "integrity": "sha512-kCC0iwGZOVZXHEKW3NDTObvM7pTIyowjty4BUqeREROc/3I6bWbgZDA3fGDwlA+rbgRjvnRnfqs9SfXynel1AQ==" - }, - "node_modules/collapse-white-space": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/color": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dev": true, "dependencies": { "color-convert": "^1.9.3", "color-string": "^1.6.0" } }, "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==", - "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==" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/color/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==", @@ -7536,10 +5024,20 @@ "color-name": "1.1.3" } }, - "node_modules/color/node_modules/color-name": { + "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } }, "node_modules/colord": { "version": "2.9.2", @@ -7547,6 +5045,12 @@ "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==", "dev": true }, + "node_modules/colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, "node_modules/colorspace": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", @@ -7557,28 +5061,6 @@ "text-hex": "1.0.x" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -7588,36 +5070,33 @@ "node": ">= 6" } }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, "node_modules/component-classes": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/component-classes/-/component-classes-1.2.6.tgz", - "integrity": "sha1-xkI5TDYYpNiwuJGe/Mu9kw5c1pE=", + "integrity": "sha512-hPFGULxdwugu1QWW3SvVOCUHLzO34+a2J6Wqy0c5ASQkfi9/8nZcBB0ZohaEbXOQlCflMAEMmEWk7u7BVs4koA==", "dependencies": { "component-indexof": "0.0.3" } }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "node_modules/component-indexof": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz", - "integrity": "sha1-EdCRMSI5648yyPJa6csAL/6NPCQ=" + "integrity": "sha512-puDQKvx/64HZXb4hBwIcvQLaLgux8o1CbWl39s41hrIIZDl1lJiD5jc22gj3RBeGK0ovxALDYpIbyjqDUUl0rw==" }, "node_modules/compressible": { "version": "2.0.18", @@ -7649,6 +5128,79 @@ "node": ">= 0.8.0" } }, + "node_modules/compression-webpack-plugin": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-10.0.0.tgz", + "integrity": "sha512-wLXLIBwpul/ALcm7Aj+69X0pYT3BYt6DdPn3qrgBIh9YejV9Bju9ShhlAsjujLyWMo6SAweFIWaUoFmXZNuNrg==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/compression-webpack-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "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/compression-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/compression-webpack-plugin/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/compression-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -7661,58 +5213,13 @@ "node_modules/compression/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/compute-scroll-into-view": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz", - "integrity": "sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/connect-history-api-fallback": { "version": "1.6.0", @@ -7726,23 +5233,11 @@ "node_modules/console-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "integrity": "sha512-duS7VP5pvfsNLDvL1O4VOEbw37AI3A4ZUQYemvDlnpGrNu9tprR7BYWpDYwC0Xia0Zxz5ZupdiIrUp0GH1aXfg==", "dependencies": { "date-now": "^0.1.4" } }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -7804,32 +5299,9 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, - "node_modules/copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "dependencies": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/copy-to-clipboard": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", @@ -7839,178 +5311,129 @@ } }, "node_modules/copy-webpack-plugin": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", - "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, "dependencies": { - "cacache": "^12.0.3", - "find-cache-dir": "^2.1.0", - "glob-parent": "^3.1.0", - "globby": "^7.1.1", - "is-glob": "^4.0.1", - "loader-utils": "^1.2.3", - "minimatch": "^3.0.4", + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", "normalize-path": "^3.0.0", - "p-limit": "^2.2.1", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "webpack-log": "^2.0.0" + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" }, "engines": { - "node": ">= 6.9.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "webpack": "^5.1.0" } }, - "node_modules/copy-webpack-plugin/node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "node_modules/copy-webpack-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { - "array-uniq": "^1.0.1" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/copy-webpack-plugin/node_modules/dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "dependencies": { - "path-type": "^3.0.0" + "fast-deep-equal": "^3.1.3" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "ajv": "^8.8.2" } }, "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.0" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.13.0" } }, "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.1.tgz", + "integrity": "sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q==", "dev": true, "dependencies": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" }, "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/copy-webpack-plugin/node_modules/ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "node_modules/copy-webpack-plugin/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/copy-webpack-plugin/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/copy-webpack-plugin/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/copy-webpack-plugin/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" }, "engines": { - "node": ">= 4" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/core-js": { - "version": "3.22.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.3.tgz", - "integrity": "sha512-1t+2a/d2lppW1gkLXx3pKPVGbBdxXAkqztvWb1EJ8oF8O2gIGiytzflNiFEehYwVK/t2ryUsGBoOFFvNx95mbg==", + "version": "3.22.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.7.tgz", + "integrity": "sha512-Jt8SReuDKVNZnZEzyEQT5eK6T2RRCXkfTq7Lo09kpm+fHjgGewSbNjV+Wt4yZMhPDdzz2x1ulI5z/w4nxpBseg==", "devOptional": true, "hasInstallScript": true, "funding": { @@ -8019,10 +5442,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.22.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.3.tgz", - "integrity": "sha512-wliMbvPI2idgFWpFe7UEyHMvu6HWgW8WA+HnDRtgzoSDYvXFMpoGX1H3tPDDXrcfUSyXafCLDd7hOeMQHEZxGw==", - "dev": true, + "version": "3.22.7", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.7.tgz", + "integrity": "sha512-uI9DAQKKiiE/mclIC5g4AjRpio27g+VMRhe6rQoz+q4Wm4L6A/fJhiLtBw+sfOpDG9wZ3O0pxIw7GbfOlBgjOA==", "dependencies": { "browserslist": "^4.20.3", "semver": "7.0.0" @@ -8036,22 +5458,10 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, "bin": { "semver": "bin/semver.js" } }, - "node_modules/core-js-pure": { - "version": "3.22.3", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.3.tgz", - "integrity": "sha512-oN88zz7nmKROMy8GOjs+LN+0LedIvbMdnB5XsTlhcOg1WGARt9l0LFg0zohdoFmCsEZ1h2ZbSQ6azj3M+vhzwQ==", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -8061,7 +5471,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -8076,323 +5485,13 @@ "node_modules/country-data": { "version": "0.0.31", "resolved": "https://registry.npmjs.org/country-data/-/country-data-0.0.31.tgz", - "integrity": "sha1-gJZrjh0Uf6bWpYnTKTP4eTd0lW0=", + "integrity": "sha512-YqlY/i6ikZwoBFfdjK+hJTGaBdTgDpXLI15MCj2UsXZ2cPBb+Kx86AXmDH7PRGt0LUleck0cCgNdWeIhfbcxkQ==", "dev": true, "dependencies": { "currency-symbol-map": "~2", "underscore": ">1.4.4" } }, - "node_modules/cp-file": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-7.0.0.tgz", - "integrity": "sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "nested-error-stacks": "^2.0.0", - "p-event": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cp-file/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cpy": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/cpy/-/cpy-8.1.2.tgz", - "integrity": "sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg==", - "dev": true, - "dependencies": { - "arrify": "^2.0.1", - "cp-file": "^7.0.0", - "globby": "^9.2.0", - "has-glob": "^1.0.0", - "junk": "^3.1.0", - "nested-error-stacks": "^2.1.0", - "p-all": "^2.1.0", - "p-filter": "^2.1.0", - "p-map": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cpy/node_modules/@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/cpy/node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cpy/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cpy/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cpy/node_modules/dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, - "dependencies": { - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cpy/node_modules/fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "dependencies": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/cpy/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cpy/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cpy/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/cpy/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cpy/node_modules/globby": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", - "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cpy/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/cpy/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/cpy/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cpy/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cpy/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cpy/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cpy/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cpy/node_modules/path-type/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/cpy/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", @@ -8445,6 +5544,12 @@ "object-assign": "^4.1.1" } }, + "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-fetch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", @@ -8489,6 +5594,15 @@ "node": "*" } }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/css-animation": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/css-animation/-/css-animation-1.6.1.tgz", @@ -8520,282 +5634,126 @@ } }, "node_modules/css-loader": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", - "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", "dev": true, "dependencies": { - "camelcase": "^5.3.1", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.32", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.2.0", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^2.7.0", - "semver": "^6.3.0" + "icss-utils": "^5.1.0", + "postcss": "^8.4.7", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.5" }, "engines": { - "node": ">= 8.9.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "webpack": "^5.0.0" } }, - "node_modules/css-loader/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/css-loader/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "node_modules/css-loader/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { - "minimist": "^1.2.0" + "lru-cache": "^6.0.0" }, "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/css-loader/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "semver": "bin/semver.js" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/css-loader/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/css-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/css-modules-loader-core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz", - "integrity": "sha1-WQhmgpShvs0mGuCkziGwtVHyHRY=", - "dev": true, - "dependencies": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.1", - "postcss-modules-extract-imports": "1.1.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0" - } - }, - "node_modules/css-modules-loader-core/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-modules-loader-core/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-modules-loader-core/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-modules-loader-core/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/css-modules-loader-core/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-modules-loader-core/node_modules/postcss": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz", - "integrity": "sha1-AA29H47vIXqjaLmiEsX8QLKo8/I=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/css-modules-loader-core/node_modules/postcss-modules-extract-imports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", - "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", - "dev": true, - "dependencies": { - "postcss": "^6.0.1" - } - }, - "node_modules/css-modules-loader-core/node_modules/postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "dev": true, - "dependencies": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "node_modules/css-modules-loader-core/node_modules/postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "dev": true, - "dependencies": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "node_modules/css-modules-loader-core/node_modules/postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "dev": true, - "dependencies": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - } - }, - "node_modules/css-modules-loader-core/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-modules-loader-core/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-modules-loader-core/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" + "node": ">=10" } }, "node_modules/css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dependencies": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "node_modules/css-selector-tokenizer": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", - "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", - "dev": true, + "node_modules/css-select/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dependencies": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/css-select/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/css-select/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dev": true, + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "dependencies": { - "mdn-data": "2.0.4", + "mdn-data": "2.0.14", "source-map": "^0.6.1" }, "engines": { @@ -8806,7 +5764,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -8817,18 +5774,21 @@ "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==" }, "node_modules/css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "dev": true, + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "engines": { - "node": "*" + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -8837,12 +5797,12 @@ } }, "node_modules/cssnano": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.7.tgz", - "integrity": "sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.10.tgz", + "integrity": "sha512-ACpnRgDg4m6CZD/+8SgnLcGCgy6DDGdkMbOawwdvVxNietTNLe/MtWcenp6qT0PRt5wzhGl6/cjMWCdhKXC9QA==", "dev": true, "dependencies": { - "cssnano-preset-default": "^5.2.7", + "cssnano-preset-default": "^5.2.10", "lilconfig": "^2.0.3", "yaml": "^1.10.2" }, @@ -8858,26 +5818,26 @@ } }, "node_modules/cssnano-preset-default": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz", - "integrity": "sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==", + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.10.tgz", + "integrity": "sha512-H8TJRhTjBKVOPltp9vr9El9I+IfYsOMhmXdK0LwdvwJcxYX9oWkY7ctacWusgPWAgQq1vt/WO8v+uqpfLnM7QA==", "dev": true, "dependencies": { "css-declaration-sorter": "^6.2.2", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.0", - "postcss-discard-comments": "^5.1.1", + "postcss-convert-values": "^5.1.2", + "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.4", - "postcss-merge-rules": "^5.1.1", + "postcss-merge-longhand": "^5.1.5", + "postcss-merge-rules": "^5.1.2", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.2", - "postcss-minify-selectors": "^5.2.0", + "postcss-minify-params": "^5.1.3", + "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", "postcss-normalize-positions": "^5.1.0", @@ -8916,7 +5876,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, "dependencies": { "css-tree": "^1.1.2" }, @@ -8924,50 +5883,15 @@ "node": ">=8.0.0" } }, - "node_modules/csso/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "node_modules/csso/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/csstype": { - "version": "2.6.20", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", - "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==", - "dev": true + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" }, "node_modules/currency-symbol-map": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/currency-symbol-map/-/currency-symbol-map-2.2.0.tgz", - "integrity": "sha1-KzwYcv8aws5ZXYJz5Y4f/wJyrqI=", - "dev": true - }, - "node_modules/cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "integrity": "sha512-fPZJ3jqM68+AAgqQ7UaGbgHL/39rp6l7GyqS2k1HJPu/kpS8D07x/+Uup6a9tCUKIlOFcRrDCf1qxSt8jnI5BA==", "dev": true }, "node_modules/d": { @@ -9046,16 +5970,11 @@ "d3-time": "1 - 2" } }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, "node_modules/date-fns": { "version": "2.28.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz", "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==", + "peer": true, "engines": { "node": ">=0.11" }, @@ -9067,7 +5986,7 @@ "node_modules/date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + "integrity": "sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw==" }, "node_modules/deasync": { "version": "0.1.26", @@ -9086,7 +6005,7 @@ "node_modules/deasync-promise": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deasync-promise/-/deasync-promise-1.0.1.tgz", - "integrity": "sha1-KyfeR4Fnr07zS6mYecUuwM7dYcI=", + "integrity": "sha512-VzJ6J6beJcSXM7SMVhug3JNZzLiPGUNJWDuevXcFeXQCa+zlnP7ZrByI+8DZQZ3AoZJj9W32ceqF6JBKmsTdgg==", "dev": true, "dependencies": { "deasync": "^0.1.7" @@ -9108,82 +6027,49 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/decimal.js-light": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, "node_modules/deep-diff": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-1.0.2.tgz", "integrity": "sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg==" }, - "node_modules/deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-object-diff": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.7.tgz", - "integrity": "sha512-QkgBca0mL08P6HiOjoqvmm6xOAl2W6CT2+34Ljhg0OeFan8cwlcdq8jrLKsBBuUFAZLsN5b6y491KdKEoSo9lg==", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "node_modules/deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, "dependencies": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" + "execa": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">= 10" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/define-properties": { @@ -9201,101 +6087,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/defined": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "node_modules/del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/del/node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "dependencies": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/globby/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", "dev": true }, "node_modules/depd": { @@ -9346,74 +6141,21 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/detab": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", - "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", - "dev": true, - "dependencies": { - "repeat-string": "^1.5.4" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, - "node_modules/detect-port": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", - "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", - "dev": true, - "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" - } - }, - "node_modules/detect-port/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/detect-port/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "node_modules/detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dev": true, "dependencies": { - "acorn-node": "^1.6.1", + "acorn-node": "^1.8.2", "defined": "^1.0.0", - "minimist": "^1.1.1" + "minimist": "^1.2.6" }, "bin": { "detective": "bin/detective.js" @@ -9422,6 +6164,21 @@ "node": ">=0.8.0" } }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "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/diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -9451,6 +6208,12 @@ "node": ">=8" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, "node_modules/dnd-core": { "version": "15.1.2", "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-15.1.2.tgz", @@ -9464,38 +6227,31 @@ "node_modules/dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", "dev": true }, "node_modules/dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz", + "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==", "dev": true, "dependencies": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "dependencies": { - "buffer-indexof": "^1.0.0" + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" } }, "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, "node_modules/dom-align": { @@ -9521,11 +6277,6 @@ "csstype": "^3.0.2" } }, - "node_modules/dom-helpers/node_modules/csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" - }, "node_modules/dom-serializer": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", @@ -9546,20 +6297,12 @@ } ] }, - "node_modules/dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", - "dev": true - }, - "node_modules/domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true, - "engines": { - "node": ">=0.4", - "npm": ">=1.2" + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/domelementtype": { @@ -9570,21 +6313,21 @@ "node_modules/domhandler": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==", "dependencies": { "domelementtype": "1" } }, "node_modules/dompurify": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.6.tgz", - "integrity": "sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.8.tgz", + "integrity": "sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw==", "optional": true }, "node_modules/domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", "dependencies": { "dom-serializer": "0", "domelementtype": "1" @@ -9600,25 +6343,6 @@ "tslib": "^2.0.3" } }, - "node_modules/dot-case/node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/dot-case/node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "node_modules/dot-case/node_modules/tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", @@ -9634,105 +6358,37 @@ "node": ">=6" } }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "node_modules/downshift": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/downshift/-/downshift-6.1.7.tgz", - "integrity": "sha512-cVprZg/9Lvj/uhYRxELzlu1aezRcgPWBjTvspiGTVEU64gF5pRdSRKFVLcxqsZC637cLAGMbL40JavEfWnqgNg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.14.8", - "compute-scroll-into-view": "^1.0.17", - "prop-types": "^15.7.2", - "react-is": "^17.0.2", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "react": ">=16.12.0" - } - }, - "node_modules/downshift/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/duplexify/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/duplexify/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, "node_modules/ejs": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", "dev": true, - "hasInstallScript": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, "engines": { "node": ">=0.10.0" } }, "node_modules/electron-to-chromium": { - "version": "1.4.129", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.129.tgz", - "integrity": "sha512-GgtN6bsDtHdtXJtlMYZWGB/uOyjZWjmRDumXTas7dGBaB9zUyCjzHet1DY2KhyHN8R0GLbzZWqm4efeddqqyRQ==" - }, - "node_modules/element-resize-detector": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/element-resize-detector/-/element-resize-detector-1.2.4.tgz", - "integrity": "sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==", - "dev": true, - "dependencies": { - "batch-processor": "1.0.0" - } + "version": "1.4.143", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.143.tgz", + "integrity": "sha512-2hIgvu0+pDfXIqmVmV5X6iwMjQ2KxDsWKwM+oI1fABEOy/Dqmll0QJRmIQ3rm+XaoUa/qKrmy5h7LSTFQ6Ldzg==" }, "node_modules/elliptic": { "version": "6.5.4", @@ -9756,9 +6412,9 @@ "dev": true }, "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "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/emojis-list": { @@ -9770,21 +6426,6 @@ "node": ">= 4" } }, - "node_modules/emotion-theming": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emotion-theming/-/emotion-theming-10.3.0.tgz", - "integrity": "sha512-mXiD2Oj7N9b6+h/dC6oLf9hwxbtKHQjoIqtodEyL8CpkN4F3V4IK/BT4D0C7zSs4BBFOu4UlPJbvvBLa88SGEA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.5.5", - "@emotion/weak-memoize": "0.2.5", - "hoist-non-react-statics": "^3.3.0" - }, - "peerDependencies": { - "@emotion/core": "^10.0.27", - "react": ">=16.3.0" - } - }, "node_modules/enabled": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", @@ -9794,32 +6435,12 @@ "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, "engines": { "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/endent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz", - "integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==", - "dev": true, - "dependencies": { - "dedent": "^0.7.0", - "fast-json-parse": "^1.0.3", - "objectorarray": "^1.0.5" - } - }, "node_modules/engine.io-client": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.2.tgz", @@ -9832,26 +6453,6 @@ "xmlhttprequest-ssl": "~2.0.0" } }, - "node_modules/engine.io-client/node_modules/ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/engine.io-parser": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", @@ -9861,17 +6462,16 @@ } }, "node_modules/enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", + "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=10.13.0" } }, "node_modules/enquirer": { @@ -9887,23 +6487,26 @@ } }, "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "engines": { + "node": ">=0.12" + }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", "dev": true, - "dependencies": { - "prr": "~1.0.1" - }, "bin": { - "errno": "cli.js" + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" } }, "node_modules/error-ex": { @@ -9914,27 +6517,20 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/error-stack-parser": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.7.tgz", - "integrity": "sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA==", - "dev": true, - "dependencies": { - "stackframe": "^1.1.1" - } - }, "node_modules/es-abstract": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz", - "integrity": "sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.1", "get-symbol-description": "^1.0.0", "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "is-callable": "^1.2.4", @@ -9946,9 +6542,10 @@ "object-inspect": "^1.12.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9963,29 +6560,10 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", "dev": true }, - "node_modules/es-get-iterator": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", - "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.0", - "has-symbols": "^1.0.1", - "is-arguments": "^1.1.0", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.5", - "isarray": "^2.0.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-get-iterator/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, "node_modules/es-shim-unscopables": { @@ -10028,15 +6606,6 @@ "node": ">=0.10" } }, - "node_modules/es5-shim": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.6.6.tgz", - "integrity": "sha512-Ay5QQE78I2WKUoZVZjL0AIuiIjsmXwZGkyCTH9+n6J1anPbb0ymDA27ASa2Lt0rhOpAlEKy2W0d17gJ1XOQ5eQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -10046,19 +6615,13 @@ "node_modules/es6-iterator": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", "dependencies": { "d": "1", "es5-ext": "^0.10.35", "es6-symbol": "^3.1.1" } }, - "node_modules/es6-shim": { - "version": "0.35.6", - "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.6.tgz", - "integrity": "sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA==", - "dev": true - }, "node_modules/es6-symbol": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", @@ -10079,264 +6642,89 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, "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": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { "node": ">=0.8.0" } }, - "node_modules/eslint-config-airbnb": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-16.1.0.tgz", - "integrity": "sha512-zLyOhVWhzB/jwbz7IPSbkUuj7X2ox4PHXTcZkEmDqTvd0baJmJyuxlFPDlZOE/Y5bC+HQRaEkT3FoHo9wIdRiw==", + "node_modules/eslint": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz", + "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==", "dev": true, "dependencies": { - "eslint-config-airbnb-base": "^12.1.0" - }, - "engines": { - "node": ">= 4" - }, - "peerDependencies": { - "eslint": "^4.9.0", - "eslint-plugin-import": "^2.7.0", - "eslint-plugin-jsx-a11y": "^6.0.2", - "eslint-plugin-react": "^7.4.0" - } - }, - "node_modules/eslint-config-airbnb-base": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz", - "integrity": "sha512-/vjm0Px5ZCpmJqnjIzcFb9TKZrKWz0gnuG/7Gfkt0Db1ELJR51xkZth+t14rYdqWgX836XbuxtArbIHlVhbLBA==", - "dev": true, - "dependencies": { - "eslint-restricted-globals": "^0.1.1" - }, - "engines": { - "node": ">= 4" - }, - "peerDependencies": { - "eslint": "^4.9.0", - "eslint-plugin-import": "^2.7.0" - } - }, - "node_modules/eslint-import-resolver-babel-module": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-babel-module/-/eslint-import-resolver-babel-module-4.0.0.tgz", - "integrity": "sha512-aPj0+pG0H3HCaMD9eRDYEzPdMyKrLE2oNhAzTXd2w86ZBe3s7drSrrPwVTfzO1CBp13FGk8S84oRmZHZvSo0mA==", - "dev": true, - "dependencies": { - "pkg-up": "^2.0.0", - "resolve": "^1.4.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "babel-core": "^6.0.0", - "babel-plugin-module-resolver": "^3.0.0-beta" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.2", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz", - "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.16.3", - "aria-query": "^4.2.2", - "array-includes": "^3.1.4", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.3.5", - "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.7", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.2.1", - "language-tags": "^1.0.5", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-plugin-react": { - "version": "7.29.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz", - "integrity": "sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==", + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz", + "integrity": "sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A==", "dev": true, "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flatmap": "^1.2.5", + "array-includes": "^3.1.5", + "array.prototype.flatmap": "^1.3.0", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.5", "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.0", + "object.hasown": "^1.1.1", "object.values": "^1.1.5", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.3", "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.6" + "string.prototype.matchall": "^4.0.7" }, "engines": { "node": ">=4" @@ -10345,6 +6733,30 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz", + "integrity": "sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eslint-plugin-react/node_modules/resolve": { "version": "2.0.0-next.3", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", @@ -10358,23 +6770,17 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-restricted-globals": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", - "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", - "dev": true - }, "node_modules/eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "dependencies": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" }, "engines": { - "node": ">=4.0.0" + "node": ">=8.0.0" } }, "node_modules/eslint-scope/node_modules/estraverse": { @@ -10386,17 +6792,200 @@ "node": ">=4.0" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "dependencies": { + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">=4" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/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/eslint/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/eslint/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/eslint/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/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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/eslint/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/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", + "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", + "dev": true, + "dependencies": { + "acorn": "^8.7.1", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/esrecurse": { @@ -10420,25 +7009,16 @@ "node": ">=4.0" } }, - "node_modules/estree-to-babel": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/estree-to-babel/-/estree-to-babel-3.2.1.tgz", - "integrity": "sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.1.6", - "@babel/types": "^7.2.0", - "c8": "^7.6.0" - }, - "engines": { - "node": ">=8.3.0" - } + "node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -10446,7 +7026,7 @@ "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, "engines": { "node": ">= 0.6" @@ -10460,24 +7040,12 @@ "node_modules/events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", "dev": true, "engines": { "node": ">=0.4.x" } }, - "node_modules/eventsource": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", - "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", - "dev": true, - "dependencies": { - "original": "^1.0.0" - }, - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -10489,258 +7057,41 @@ } }, "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "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": ">=6" - } - }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "node": ">=10" }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/execa/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/execa/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "node_modules/exenv": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", - "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=" + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "engines": { "node": ">= 0.8.0" } }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/express": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", @@ -10783,6 +7134,12 @@ "node": ">= 0.10.0" } }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -10795,7 +7152,13 @@ "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, "node_modules/express/node_modules/safe-buffer": { @@ -10831,77 +7194,6 @@ "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz", "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==" }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/faker": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", @@ -10934,18 +7226,18 @@ "node": ">=8.6.0" } }, - "node_modules/fast-json-parse": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", - "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==", - "dev": true - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, "node_modules/fast-xml-parser": { "version": "3.21.1", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz", @@ -10962,10 +7254,10 @@ "url": "https://paypal.me/naturalintelligence" } }, - "node_modules/fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "node_modules/fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", "dev": true }, "node_modules/fastq": { @@ -10977,19 +7269,6 @@ "reusify": "^1.0.4" } }, - "node_modules/fault": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", - "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", - "dev": true, - "dependencies": { - "format": "^0.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/faye-websocket": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", @@ -11040,11 +7319,17 @@ "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==" }, - "node_modules/figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } }, "node_modules/file-loader": { "version": "6.2.0", @@ -11066,37 +7351,22 @@ "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/file-system-cache": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-1.0.5.tgz", - "integrity": "sha1-hCWbNqK7uNPW6xAh0xMv/mTP/08=", + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "dependencies": { - "bluebird": "^3.3.5", - "fs-extra": "^0.30.0", - "ramda": "^0.21.0" - } - }, - "node_modules/file-system-cache/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "node_modules/file-system-cache/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/file-uri-to-path": { @@ -11105,13 +7375,34 @@ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "dev": true }, - "node_modules/filesize": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", - "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">= 0.4.0" + "node": ">=10" } }, "node_modules/fill-range": { @@ -11156,7 +7447,7 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/find-cache-dir": { @@ -11173,7 +7464,12 @@ "node": ">=6" } }, - "node_modules/find-cache-dir/node_modules/find-up": { + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "node_modules/find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", @@ -11185,224 +7481,6 @@ "node": ">=6" } }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, - "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/findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/findup-sync/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/findup-sync/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -11416,21 +7494,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/flatted": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", @@ -11449,40 +7512,6 @@ "node": ">=0.10.0" } }, - "node_modules/flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "node_modules/flush-write-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/flush-write-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/flux": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz", @@ -11502,9 +7531,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", "dev": true, "funding": [ { @@ -11521,213 +7550,13 @@ } } }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", - "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/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/fork-ts-checker-webpack-plugin/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/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/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/fork-ts-checker-webpack-plugin/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/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/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/fork-ts-checker-webpack-plugin/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/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=", - "dev": true, - "engines": { - "node": ">=0.4.x" + "is-callable": "^1.1.3" } }, "node_modules/forwarded": { @@ -11739,61 +7568,28 @@ "node": ">= 0.6" } }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, "engines": { - "node": ">=0.10.0" + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" } }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, "engines": { "node": ">= 0.6" } }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/from2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/from2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -11809,18 +7605,6 @@ "node": ">=10" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/fs-monkey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", @@ -11833,22 +7617,10 @@ "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", "dev": true }, - "node_modules/fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.2", @@ -11887,48 +7659,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fuse.js": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.6.1.tgz", - "integrity": "sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -11955,16 +7704,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "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, - "dependencies": { - "pump": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-symbol-description": { @@ -11983,24 +7738,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -12044,78 +7790,14 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "node_modules/global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "dev": true, - "dependencies": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, "engines": { "node": ">=4" } }, - "node_modules/globalthis": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz", - "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -12148,24 +7830,22 @@ "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "node_modules/gud": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true }, "node_modules/gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "dev": true, "dependencies": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" + "duplexer": "^0.1.2" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/handle-thing": { @@ -12174,36 +7854,6 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -12218,7 +7868,7 @@ "node_modules/has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "dev": true, "dependencies": { "ansi-regex": "^2.0.0" @@ -12230,7 +7880,7 @@ "node_modules/has-ansi/node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -12248,35 +7898,11 @@ "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { "node": ">=4" } }, - "node_modules/has-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-1.0.0.tgz", - "integrity": "sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc=", - "dev": true, - "dependencies": { - "is-glob": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-glob/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/has-property-descriptors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", @@ -12303,6 +7929,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -12313,81 +7940,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -12455,109 +8007,6 @@ "minimalistic-assert": "^1.0.1" } }, - "node_modules/hast-to-hyperscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", - "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.3", - "comma-separated-tokens": "^1.0.0", - "property-information": "^5.3.0", - "space-separated-tokens": "^1.0.0", - "style-to-object": "^0.3.0", - "unist-util-is": "^4.0.0", - "web-namespaces": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", - "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", - "dev": true, - "dependencies": { - "@types/parse5": "^5.0.0", - "hastscript": "^6.0.0", - "property-information": "^5.0.0", - "vfile": "^4.0.0", - "vfile-location": "^3.2.0", - "web-namespaces": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", - "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", - "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^6.0.0", - "hast-util-to-parse5": "^6.0.0", - "html-void-elements": "^1.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^3.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-parse5": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", - "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", - "dev": true, - "dependencies": { - "hast-to-hyperscript": "^9.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", - "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -12576,18 +8025,22 @@ } }, "node_modules/history": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/history/-/history-5.0.0.tgz", - "integrity": "sha512-3NyRMKIiFSJmIPdq7FxkNMJkQ7ZEtVblOQ38VtKaA0zZMW1Eo6Q6W8oDKEflr1kNNTItSnk4JMCO1deeSgbLLg==", - "dev": true, + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", "dependencies": { - "@babel/runtime": "^7.7.6" + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" } }, "node_modules/hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "dev": true, "dependencies": { "hash.js": "^1.0.3", @@ -12603,11 +8056,6 @@ "react-is": "^16.7.0" } }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -12620,25 +8068,10 @@ "node": ">=0.10.0" } }, - "node_modules/hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", - "dev": true, - "engines": { - "node": ">= 6.0.0" - } - }, - "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/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, "dependencies": { "inherits": "^2.0.1", @@ -12677,158 +8110,34 @@ "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "dev": true }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", - "dev": true, - "dependencies": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - }, - "bin": { - "html-minifier": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", "dev": true, "dependencies": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", "he": "^1.2.0", - "param-case": "^3.0.3", + "param-case": "^3.0.4", "relateurl": "^0.2.7", - "terser": "^4.6.3" + "terser": "^5.10.0" }, "bin": { "html-minifier-terser": "cli.js" }, "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/html-minifier-terser/node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/html-minifier-terser/node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/html-minifier-terser/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/html-minifier-terser/node_modules/terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/html-minifier-terser/node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/html-minifier-terser/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/html-minifier/node_modules/commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, - "node_modules/html-minifier/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/html-minifier/node_modules/uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", - "dev": true, - "dependencies": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/html-minifier/node_modules/uglify-js/node_modules/commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - }, - "node_modules/html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 12" } }, "node_modules/html-to-image": { @@ -12836,75 +8145,27 @@ "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.9.0.tgz", "integrity": "sha512-9gaDCIYg62Ek07F2pBk76AHgYZ2gxq2YALU7rK3gNCqXuhu6cWzsOQqM7qGbjZiOzxGzrU1deDqZpAod2NEwbA==" }, - "node_modules/html-void-elements": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", - "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/html-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", - "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", - "deprecated": "3.x is no longer supported", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", "dev": true, "dependencies": { - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "tapable": "^1.0.0", - "toposort": "^1.0.0", - "util.promisify": "1.0.0" + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" }, "engines": { - "node": ">=6.9" + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" }, "peerDependencies": { - "webpack": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" - } - }, - "node_modules/html-webpack-plugin/node_modules/big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/html-webpack-plugin/node_modules/emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/html-webpack-plugin/node_modules/json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/html-webpack-plugin/node_modules/loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "dependencies": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" + "webpack": "^5.20.0" } }, "node_modules/html2canvas": { @@ -12923,7 +8184,7 @@ "node_modules/htmlparser2": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==", "dependencies": { "domelementtype": "1", "domhandler": "2.3", @@ -12935,12 +8196,12 @@ "node_modules/htmlparser2/node_modules/entities": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" + "integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==" }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "dev": true }, "node_modules/http-errors": { @@ -12980,154 +8241,27 @@ } }, "node_modules/http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, "dependencies": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "node": ">=12.0.0" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" + "peerDependencies": { + "@types/express": "^4.17.13" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/http-proxy-middleware/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, "node_modules/http-proxy/node_modules/eventemitter3": { @@ -13136,11 +8270,14 @@ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true + "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/iconv-lite": { "version": "0.4.24", @@ -13154,36 +8291,30 @@ "node": ">=0.10.0" } }, - "node_modules/icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, "node_modules/icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, - "dependencies": { - "postcss": "^7.0.14" - }, "engines": { - "node": ">= 6" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, + "node_modules/idb": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/idb/-/idb-6.1.5.tgz", + "integrity": "sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==", + "dev": true + }, "node_modules/ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, - "node_modules/iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, "node_modules/ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -13194,21 +8325,9 @@ } }, "node_modules/immutable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", - "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==" - }, - "node_modules/import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "dependencies": { - "import-from": "^2.1.0" - }, - "engines": { - "node": ">=4" - } + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -13225,137 +8344,96 @@ "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==", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "dependencies": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/import-local/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "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": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/import-local/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "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": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/import-local/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "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.0.0" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/import-local/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "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==", + "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/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true + "node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -13366,40 +8444,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "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/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", - "dev": true - }, - "node_modules/internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "dependencies": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/internal-ip/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -13436,21 +8480,6 @@ "loose-envify": "^1.0.0" } }, - "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "node_modules/ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", @@ -13460,55 +8489,11 @@ "node": ">= 10" } }, - "node_modules/is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "dev": true, - "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -13523,7 +8508,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-bigint": { "version": "1.0.4", @@ -13565,29 +8550,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "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" - } - ], - "engines": { - "node": ">=4" - } - }, "node_modules/is-callable": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", @@ -13611,22 +8573,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -13637,39 +8588,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -13685,22 +8603,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -13715,12 +8621,6 @@ "node": ">=8" } }, - "node_modules/is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", - "dev": true - }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -13748,24 +8648,11 @@ "node": ">=0.10.0" } }, - "node_modules/is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true }, "node_modules/is-negative-zero": { "version": "2.0.2", @@ -13803,48 +8690,27 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "dependencies": { - "is-path-inside": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "dependencies": { - "path-is-inside": "^1.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "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": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -13861,6 +8727,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -13872,13 +8739,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, "node_modules/is-shared-array-buffer": { @@ -13894,12 +8761,15 @@ } }, "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "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": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-string": { @@ -13932,22 +8802,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-there": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/is-there/-/is-there-4.5.1.tgz", - "integrity": "sha512-vIZ7HTXAoRoIwYSsTnxb0sg9L6rth+JOulNcavsbskQkCIWoSM2cjFOWZs4wGziGZER+Xgs/HXiCQZgiL8ppxQ==", - "dev": true - }, "node_modules/is-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", - "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", + "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.18.5", - "foreach": "^2.0.5", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", "has-tostringtag": "^1.0.0" }, "engines": { @@ -13969,35 +8833,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-whitespace-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", - "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-word-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", - "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -14013,48 +8848,92 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "node_modules/jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", "dev": true, "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/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/istanbul-lib-report/node_modules/has-flag": { + "node_modules/jake/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/jake/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/jake/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/jake/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==", @@ -14063,22 +8942,7 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { + "node_modules/jake/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==", @@ -14090,50 +8954,15 @@ "node": ">=8" } }, - "node_modules/istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/iterate-iterator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", - "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/iterate-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", - "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", - "dev": true, - "dependencies": { - "es-get-iterator": "^1.0.2", - "iterate-iterator": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "supports-color": "^8.0.0" }, "engines": { "node": ">= 10.13.0" @@ -14149,15 +8978,18 @@ } }, "node_modules/jest-worker/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==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/jmespath": { @@ -14169,14 +9001,10 @@ "node": ">= 0.6.0" } }, - "node_modules/js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", - "dev": true, - "engines": { - "node": ">= 0.8" - } + "node_modules/jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" }, "node_modules/js-tokens": { "version": "4.0.0", @@ -14184,18 +9012,23 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "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": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, + "node_modules/js-yaml/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/jsbi": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-4.3.0.tgz", @@ -14205,7 +9038,6 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, "bin": { "jsesc": "bin/jsesc" }, @@ -14241,34 +9073,50 @@ "node": "*" } }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "node_modules/jshint/node_modules/strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "bin": { + "strip-json-comments": "cli.js" + }, + "engines": { + "node": ">=0.8.0" + } }, "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==" }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "node_modules/json-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-stream/-/json-stream-1.0.0.tgz", - "integrity": "sha1-GjhU4o0rvuqzHMfd9oPS3cVlJwg=", + "integrity": "sha512-H/ZGY0nIAg3QcOwE1QN/rK/Fa7gJn7Ii5obwp6zyPO4xiPNwpIMjqy2gwjBEGqzkF/vSWEIBQCBuN19hYiL6Qg==", "dev": true }, "node_modules/json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true, "bin": { "json5": "lib/cli.js" }, @@ -14288,6 +9136,15 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonpointer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz", + "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/jspdf": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.1.tgz", @@ -14318,26 +9175,11 @@ "node": ">=4.0" } }, - "node_modules/junk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", - "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/keyboard-key": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/keyboard-key/-/keyboard-key-1.1.0.tgz", "integrity": "sha512-qkBzPTi3rlAKvX7k0/ub44sqOfXeLc/jcnGGmj5c7BJpU8eDrEVPyhCvNYAaoubbsLm9uGWwQJO1ytQK1a9/dQ==" }, - "node_modules/killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -14347,24 +9189,6 @@ "node": ">=0.10.0" } }, - "node_modules/klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.9" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/klona": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", @@ -14380,46 +9204,26 @@ "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", "dev": true }, - "node_modules/language-subtag-registry": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", - "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, - "dependencies": { - "language-subtag-registry": "~0.3.2" + "engines": { + "node": ">=6" } }, - "node_modules/lazy-universal-dotenv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-3.0.1.tgz", - "integrity": "sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ==", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "dependencies": { - "@babel/runtime": "^7.5.0", - "app-root-dir": "^1.0.2", - "core-js": "^3.0.4", - "dotenv": "^8.0.0", - "dotenv-expand": "^5.1.0" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">=6.0.0", - "npm": ">=6.0.0", - "yarn": ">=1.0.0" - } - }, - "node_modules/lazy-universal-dotenv/node_modules/dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", - "dev": true, - "engines": { - "node": ">=10" + "node": ">= 0.8.0" } }, "node_modules/lilconfig": { @@ -14437,12 +9241,12 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" + "node": ">=6.11.5" } }, "node_modules/loader-utils": { @@ -14460,18 +9264,16 @@ } }, "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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "dependencies": { - "p-locate": "^5.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/lodash": { @@ -14479,44 +9281,54 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, "node_modules/lodash.curry": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=" + "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "node_modules/lodash.difference": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", "dev": true }, "node_modules/lodash.flow": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", - "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" + "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "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.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", "dev": true }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true }, "node_modules/logform": { @@ -14532,19 +9344,6 @@ "triple-beam": "^1.3.0" } }, - "node_modules/loglevel": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", - "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" - } - }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -14557,32 +9356,30 @@ } }, "node_modules/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "node_modules/lowlight": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", - "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, "dependencies": { - "fault": "^1.0.0", - "highlight.js": "~10.7.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "tslib": "^2.0.3" } }, + "node_modules/lower-case/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "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": "^3.0.2" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/luxon": { @@ -14593,6 +9390,15 @@ "node": "*" } }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, "node_modules/make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -14615,55 +9421,12 @@ "semver": "bin/semver" } }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-or-similar": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", - "integrity": "sha1-beJlMXSt+12e3DPGnT6Sobdvrwg=", + "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-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/markdown-escapes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", - "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/markdown-to-jsx": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.7.tgz", - "integrity": "sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w==", - "dev": true, - "engines": { - "node": ">= 10" - }, - "peerDependencies": { - "react": ">= 0.14.0" - } - }, "node_modules/md5-file": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-5.0.0.tgz", @@ -14687,77 +9450,24 @@ "safe-buffer": "^5.1.2" } }, - "node_modules/mdast-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", - "dev": true, - "dependencies": { - "unist-util-remove": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-definitions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", - "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", - "dev": true, - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", - "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "mdast-util-definitions": "^4.0.0", - "mdurl": "^1.0.0", - "unist-builder": "^2.0.0", - "unist-util-generated": "^1.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", - "dev": true + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/memfs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", - "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.4.tgz", + "integrity": "sha512-W4gHNUE++1oSJVn8Y68jPXi+mkx3fXR5ITE/Ubz6EQ3xRpCN5k2CQ4AUR8094Z7211F876TyoBACGsIveqgiGA==", "dev": true, "dependencies": { "fs-monkey": "1.0.3" @@ -14771,56 +9481,10 @@ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" }, - "node_modules/memoizerific": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", - "integrity": "sha1-fIekZGREwy11Q4VwkF8tvRsagFo=", - "dev": true, - "dependencies": { - "map-or-similar": "^1.5.0" - } - }, - "node_modules/memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/memory-fs/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/memory-fs/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "dev": true }, "node_modules/merge-stream": { @@ -14841,18 +9505,12 @@ "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, "engines": { "node": ">= 0.6" } }, - "node_modules/microevent.ts": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", - "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==", - "dev": true - }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -14918,80 +9576,85 @@ "node": ">= 0.6" } }, - "node_modules/min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true, - "dependencies": { - "dom-walk": "^0.1.0" - } - }, - "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==", + "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": ">=4" + "node": ">=6" } }, "node_modules/mini-css-extract-plugin": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.7.0.tgz", - "integrity": "sha512-RQIw6+7utTYn8DBGsf/LpRgZCJMpZt+kuawJ/fju0KiOL6nAaTBNmCJwS7HtwSCXfS47gCkmtBFS7HdsquhdxQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz", + "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==", "dev": true, "dependencies": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" + "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 6.9.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.4.0" + "webpack": "^5.0.0" } }, - "node_modules/mini-css-extract-plugin/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { - "minimist": "^1.2.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, - "bin": { - "json5": "lib/cli.js" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/mini-css-extract-plugin/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "fast-deep-equal": "^3.1.3" }, - "engines": { - "node": ">=4.0.0" + "peerDependencies": { + "ajv": "^8.8.2" } }, + "node_modules/mini-css-extract-plugin/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/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" }, "engines": { - "node": ">= 4" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/minimalistic-assert": { @@ -15003,7 +9666,7 @@ "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", "dev": true }, "node_modules/minimatch": { @@ -15020,7 +9683,8 @@ "node_modules/minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true }, "node_modules/minio": { "version": "7.0.28", @@ -15050,147 +9714,6 @@ "node": ">8 <=18" } }, - "node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass/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/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/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/mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "dependencies": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mississippi/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/mississippi/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/mississippi/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -15204,25 +9727,25 @@ } }, "node_modules/mobx": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.5.0.tgz", - "integrity": "sha512-pHZ/cySF00FVENDWIDzJyoObFahK6Eg4d0papqm6d7yMkxWTZ/S/csqJX1A3PsYy4t5k3z2QnlwuCfMW5lSEwA==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.6.0.tgz", + "integrity": "sha512-MNTKevLH/6DShLZcmSL351+JgiJPO56A4GUpoiDQ3/yZ0mAtclNLdHK9q4BcQhibx8/JSDupfTpbX2NZPemlRg==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mobx" } }, "node_modules/mobx-react-lite": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.3.0.tgz", - "integrity": "sha512-U/kMSFtV/bNVgY01FuiGWpRkaQVHozBq5CEBZltFvPt4FcV111hEWkgwqVg9GPPZSEuEdV438PEz8mk8mKpYlA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.4.0.tgz", + "integrity": "sha512-bRuZp3C0itgLKHu/VNxi66DN/XVkQG7xtoBVWxpvC5FhAqbOCP21+nPhULjnzEqd7xBMybp6KwytdUpZKEgpIQ==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mobx" }, "peerDependencies": { "mobx": "^6.1.0", - "react": "^16.8.0 || ^17" + "react": "^16.8.0 || ^17 || ^18" }, "peerDependenciesMeta": { "react-dom": { @@ -15255,9 +9778,9 @@ } }, "node_modules/moment-range": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/moment-range/-/moment-range-4.0.2.tgz", - "integrity": "sha512-n8sceWwSTjmz++nFHzeNEUsYtDqjgXgcOBzsHi+BoXQU2FW+eU92LUaK8gqOiSu5PG57Q9sYj1Fz4LRDj4FtKA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/moment-range/-/moment-range-3.1.1.tgz", + "integrity": "sha512-VqJIVDs6wUzCjTkSmkOwqRseqAo3+En2rdsKEKIWtPxzo+uJdRQGjU2HWJr6/zL3fZJdNtpddyDkB4Pfyg8KLQ==", "dependencies": { "es6-symbol": "^3.1.0" }, @@ -15268,18 +9791,13 @@ "moment": ">= 2" } }, - "node_modules/move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "node_modules/mrmime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.0.tgz", + "integrity": "sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ==", "dev": true, - "dependencies": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" + "engines": { + "node": ">=10" } }, "node_modules/ms": { @@ -15288,53 +9806,36 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, "dependencies": { - "dns-packet": "^1.3.1", + "dns-packet": "^5.2.2", "thunky": "^1.0.2" }, "bin": { "multicast-dns": "cli.js" } }, - "node_modules/multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "node_modules/nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", "dev": true, - "optional": true - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -15350,56 +9851,50 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node_modules/nested-error-stacks": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", - "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", - "dev": true - }, "node_modules/next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, "dependencies": { - "lower-case": "^1.1.1" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, + "node_modules/no-case/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, "node_modules/node-addon-api": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", "dev": true }, - "node_modules/node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", + "node_modules/node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", "dev": true, "dependencies": { - "minimatch": "^3.0.2" - }, - "engines": { - "node": ">= 0.10.5" + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" } }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dependencies": { - "lodash": "^4.17.21" + "node_modules/node-environment-flags/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" } }, "node_modules/node-fetch": { @@ -15422,169 +9917,18 @@ } }, "node_modules/node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true, "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "dependencies": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - } - }, - "node_modules/node-libs-browser/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/node-libs-browser/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "node_modules/node-libs-browser/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "node_modules/node-libs-browser/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/node-libs-browser/node_modules/readable-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/node-libs-browser/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/node-libs-browser/node_modules/string_decoder/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/node-libs-browser/node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/node-libs-browser/node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - }, - "node_modules/node-libs-browser/node_modules/util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "dependencies": { - "inherits": "2.0.3" + "node": ">= 6.13.0" } }, "node_modules/node-releases": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", - "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==" - }, - "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/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", + "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -15598,209 +9942,73 @@ "node_modules/normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true, - "dependencies": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/normalize.css": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", - "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==" - }, "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "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": "^2.0.0" + "path-key": "^3.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" + "node": ">=8" } }, "node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dependencies": { - "boolbase": "~1.0.0" + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { "node": ">=0.10.0" } }, "node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, "engines": { "node": ">= 6" } }, "node_modules/object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -15809,23 +10017,10 @@ "node": ">= 0.4" } }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", @@ -15871,14 +10066,15 @@ } }, "node_modules/object.getownpropertydescriptors": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", - "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", + "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", "dev": true, "dependencies": { + "array.prototype.reduce": "^1.0.4", "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.1" }, "engines": { "node": ">= 0.8" @@ -15888,30 +10084,18 @@ } }, "node_modules/object.hasown": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", - "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", "dev": true, "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object.values": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", @@ -15929,12 +10113,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/objectorarray": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz", - "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==", - "dev": true - }, "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -15965,7 +10143,7 @@ "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { "wrappy": "1" } @@ -15979,17 +10157,33 @@ "fn.name": "1.x.x" } }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "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": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -16004,112 +10198,21 @@ "opener": "bin/opener-bin.js" } }, - "node_modules/opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "dependencies": { - "is-wsl": "^1.1.0" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" }, "engines": { - "node": ">=4" - } - }, - "node_modules/opn/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "dependencies": { - "url-parse": "^1.4.3" - } - }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "node_modules/overlayscrollbars": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/overlayscrollbars/-/overlayscrollbars-1.13.1.tgz", - "integrity": "sha512-gIQfzgGgu1wy80EB4/6DaJGHMEGmizq27xHIESrzXq0Y/J0Ay1P3DWk6tuVmEPIZH15zaBlxeEJOqdJKmowHCQ==", - "dev": true - }, - "node_modules/p-all": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-all/-/p-all-2.1.0.tgz", - "integrity": "sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA==", - "dev": true, - "dependencies": { - "p-map": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-all/node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", - "dev": true, - "dependencies": { - "p-timeout": "^3.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dev": true, - "dependencies": { - "p-map": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-filter/node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true, - "engines": { - "node": ">=4" + "node": ">= 0.8.0" } }, "node_modules/p-limit": { @@ -16128,66 +10231,25 @@ } }, "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-locate/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-map": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "dependencies": { - "retry": "^0.12.0" + "p-limit": "^2.0.0" }, "engines": { "node": ">=6" } }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dev": true, "dependencies": { - "p-finally": "^1.0.0" + "@types/retry": "0.12.0", + "retry": "^0.13.1" }, "engines": { "node": ">=8" @@ -16202,56 +10264,22 @@ "node": ">=6" } }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "node_modules/parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "dependencies": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "node_modules/parallel-transform/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/parallel-transform/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, "dependencies": { - "no-case": "^2.2.0" + "dot-case": "^3.0.4", + "tslib": "^2.0.3" } }, + "node_modules/param-case/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -16276,24 +10304,6 @@ "safe-buffer": "^5.1.1" } }, - "node_modules/parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "dev": true, - "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -16314,18 +10324,12 @@ "node_modules/parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -16345,75 +10349,29 @@ "tslib": "^2.0.3" } }, - "node_modules/pascal-case/node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/pascal-case/node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "node_modules/pascal-case/node_modules/tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, "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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "engines": { "node": ">=0.10.0" } }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -16429,10 +10387,17 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-to-regexp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, "node_modules/path-type": { "version": "4.0.0", @@ -16510,27 +10475,6 @@ "node": ">=6" } }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -16541,120 +10485,17 @@ } }, "node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "dev": true, - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pnp-webpack-plugin": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", - "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "dependencies": { - "ts-pnp": "^1.1.6" + "find-up": "^3.0.0" }, "engines": { "node": ">=6" } }, - "node_modules/polished": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz", - "integrity": "sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.17.8" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/popper.js": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", @@ -16665,61 +10506,28 @@ "url": "https://opencollective.com/popperjs" } }, - "node_modules/portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dev": true, - "dependencies": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/portfinder/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-calc": { @@ -16735,12 +10543,6 @@ "postcss": "^8.2.2" } }, - "node_modules/postcss-calc/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, "node_modules/postcss-colormin": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", @@ -16759,18 +10561,13 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-colormin/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, "node_modules/postcss-convert-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz", - "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", + "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", "dev": true, "dependencies": { + "browserslist": "^4.20.3", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -16780,16 +10577,10 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-convert-values/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, "node_modules/postcss-discard-comments": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", - "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", "dev": true, "engines": { "node": "^10 || ^12 || >=14.0" @@ -16834,306 +10625,112 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-flexbugs-fixes": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz", - "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", - "dev": true, - "dependencies": { - "postcss": "^7.0.26" - } - }, - "node_modules/postcss-functions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-functions/-/postcss-functions-3.0.0.tgz", - "integrity": "sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4=", - "dependencies": { - "glob": "^7.1.2", - "object-assign": "^4.1.1", - "postcss": "^6.0.9", - "postcss-value-parser": "^3.3.0" - } - }, - "node_modules/postcss-functions/node_modules/postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dependencies": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/postcss-functions/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/postcss-import": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", - "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", "dev": true, "dependencies": { - "postcss": "^7.0.1", - "postcss-value-parser": "^3.2.3", + "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-inline-svg": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-inline-svg/-/postcss-inline-svg-3.1.1.tgz", - "integrity": "sha512-G2BkarW6gGpGFGAiKzW7aiulUS0/6QuCgq1riZEiX4oMaUTpU1pdW7BU6UFRDrdKkwS0r4icK2pU0bg6sCSOjw==", - "dev": true, - "dependencies": { - "css-select": "^1.2.0", - "dom-serializer": "^0.1.0", - "htmlparser2": "^3.9.0", - "postcss": "^6.0.1", - "postcss-value-parser": "^3.2.3" - } - }, - "node_modules/postcss-inline-svg/node_modules/dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dev": true, - "dependencies": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "node_modules/postcss-inline-svg/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "node_modules/postcss-inline-svg/node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "node_modules/postcss-inline-svg/node_modules/postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "node": ">=10.0.0" }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/postcss-inline-svg/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-inline-svg/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/postcss-inline-svg/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-inline-svg/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" + "peerDependencies": { + "postcss": "^8.0.0" } }, "node_modules/postcss-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-2.0.3.tgz", - "integrity": "sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w==", - "dependencies": { - "camelcase-css": "^2.0.1", - "postcss": "^7.0.18" - } - }, - "node_modules/postcss-load-config": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", - "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", "dev": true, "dependencies": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" + "camelcase-css": "^2.0.1" }, "engines": { - "node": ">= 4" + "node": "^12 || ^14 || >= 16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" } }, - "node_modules/postcss-load-config/node_modules/cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", "dev": true, "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" }, "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-load-config/node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "node": ">= 10" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-load-config/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-load-config/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true, - "engines": { - "node": ">=4" + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, "node_modules/postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.0.tgz", + "integrity": "sha512-IDyttebFzTSY6DI24KuHUcBjbAev1i+RyICoPEWcAstZsj03r533uMXtDn506l6/wlsRYiS5XBdx7TpccCsyUg==", "dev": true, "dependencies": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.7" }, "engines": { - "node": ">= 6" + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" } }, - "node_modules/postcss-loader/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "node_modules/postcss-loader/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { - "minimist": "^1.2.0" + "lru-cache": "^6.0.0" }, "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/postcss-loader/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "semver": "bin/semver.js" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/postcss-loader/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" + "node": ">=10" } }, "node_modules/postcss-merge-longhand": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz", - "integrity": "sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz", + "integrity": "sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0", @@ -17146,16 +10743,10 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, "node_modules/postcss-merge-rules": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz", - "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", + "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", "dev": true, "dependencies": { "browserslist": "^4.16.6", @@ -17185,12 +10776,6 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, "node_modules/postcss-minify-gradients": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", @@ -17208,16 +10793,10 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, "node_modules/postcss-minify-params": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz", - "integrity": "sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", + "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", "dev": true, "dependencies": { "browserslist": "^4.16.6", @@ -17231,16 +10810,10 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, "node_modules/postcss-minify-selectors": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", - "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.5" @@ -17253,397 +10826,123 @@ } }, "node_modules/postcss-mixins": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/postcss-mixins/-/postcss-mixins-6.2.3.tgz", - "integrity": "sha512-gfH5d09YilzDn/CLGFA9Lwv7GTezuyHgnAyXC8AfvhUMpl67ZTewhcpNuOgawClCOD+76XePE2IHO1xMgsOlvA==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/postcss-mixins/-/postcss-mixins-9.0.2.tgz", + "integrity": "sha512-LaFjXcR+7LRji+Sc6DRn1mUw43+Y9Lyh5JjFTQDedlIi4W6REAesRXRJLlms5424vb0zerBfCVZzS2ZHRxGZOA==", "dev": true, "dependencies": { - "globby": "^8.0.1", - "postcss": "^7.0.21", - "postcss-js": "^2.0.3", - "postcss-simple-vars": "^5.0.2", - "sugarss": "^2.0.0" - } - }, - "node_modules/postcss-mixins/node_modules/@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-mixins/node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" + "fast-glob": "^3.2.11", + "postcss-js": "^4.0.0", + "postcss-simple-vars": "^6.0.3", + "sugarss": "^4.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-mixins/node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-mixins/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "node": ">=12.0" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-mixins/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-mixins/node_modules/dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-mixins/node_modules/fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "dependencies": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/postcss-mixins/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-mixins/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-mixins/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/postcss-mixins/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-mixins/node_modules/globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", - "dev": true, - "dependencies": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-mixins/node_modules/ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "node_modules/postcss-mixins/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/postcss-mixins/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-mixins/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-mixins/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-mixins/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-mixins/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-mixins/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-mixins/node_modules/postcss-simple-vars": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-5.0.2.tgz", - "integrity": "sha512-xWIufxBoINJv6JiLb7jl5oElgp+6puJwvT5zZHliUSydoLz4DADRB3NDDsYgfKVwojn4TDLiseoC65MuS8oGGg==", - "dev": true, - "dependencies": { - "postcss": "^7.0.14" - } - }, - "node_modules/postcss-mixins/node_modules/slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-mixins/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "postcss": "^8.2.14" } }, "node_modules/postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", "dev": true, - "dependencies": { - "postcss": "^7.0.5" - }, "engines": { - "node": ">= 6" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, "node_modules/postcss-modules-local-by-default": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", - "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", "dev": true, "dependencies": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.32", + "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.1.0" }, "engines": { - "node": ">= 6" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/postcss-modules-local-by-default/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, "node_modules/postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "dev": true, "dependencies": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" + "postcss-selector-parser": "^6.0.4" }, "engines": { - "node": ">= 6" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, "node_modules/postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, "dependencies": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, "node_modules/postcss-nested": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-4.2.3.tgz", - "integrity": "sha512-rOv0W1HquRCamWy2kFl3QazJMMe1ku6rCFoAAH+9AcxdbpDeBr6k968MLWuLjvjMcGEip01ak09hKOEgpK9hvw==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "dev": true, "dependencies": { - "postcss": "^7.0.32", - "postcss-selector-parser": "^6.0.2" + "postcss-selector-parser": "^6.0.6" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" } }, "node_modules/postcss-nesting": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-4.2.1.tgz", - "integrity": "sha512-IkyWXICwagCnlaviRexi7qOdwPw3+xVVjgFfGsxmztvRVaNxAlrypOIKqDE5mxY+BVxnId1rnUKBRQoNE2VDaA==", + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.7.tgz", + "integrity": "sha512-Btho5XzDTpl117SmB3tvUHP8txg5n7Ayv7vQ5m4b1zXkfs1Y52C67uZjZ746h7QvOJ+rLRg50OlhhjFW+IQY6A==", "dev": true, "dependencies": { - "postcss": "^6.0.11" + "@csstools/selector-specificity": "1.0.0", + "postcss-selector-parser": "^6.0.10" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/postcss-nesting/node_modules/postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "node": "^12 || ^14 || >=16" }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/postcss-nesting/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" } }, "node_modules/postcss-normalize-charset": { @@ -17673,12 +10972,6 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, "node_modules/postcss-normalize-positions": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", @@ -17694,12 +10987,6 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, "node_modules/postcss-normalize-repeat-style": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", @@ -17715,12 +11002,6 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, "node_modules/postcss-normalize-string": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", @@ -17736,12 +11017,6 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, "node_modules/postcss-normalize-timing-functions": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", @@ -17757,12 +11032,6 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, "node_modules/postcss-normalize-unicode": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", @@ -17779,12 +11048,6 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, "node_modules/postcss-normalize-url": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", @@ -17801,24 +11064,6 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-normalize-url/node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, "node_modules/postcss-normalize-whitespace": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", @@ -17834,12 +11079,6 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, "node_modules/postcss-ordered-values": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", @@ -17856,12 +11095,6 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, "node_modules/postcss-reduce-initial": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", @@ -17893,16 +11126,11 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, "node_modules/postcss-selector-parser": { "version": "6.0.10", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -17912,35 +11140,19 @@ } }, "node_modules/postcss-simple-vars": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-4.1.0.tgz", - "integrity": "sha512-J/TRomA8EqXhS4VjQJsPCYTFIa9FYN/dkJK/8oZ0BYeVIPx91goqM8T+ljsP57+4bwSEywFOuB7EZ8n1gjjxZw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-6.0.3.tgz", + "integrity": "sha512-fkNn4Zio8vN4vIig9IFdb8lVlxWnYR769RgvxCM6YWlFKie/nQaOcaMMMFz/s4gsfHW4/5bJW+i57zD67mQU7g==", "dev": true, - "dependencies": { - "postcss": "^6.0.9" - } - }, - "node_modules/postcss-simple-vars/node_modules/postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "engines": { + "node": ">=10.0" }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/postcss-simple-vars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.1" } }, "node_modules/postcss-svgo": { @@ -17959,165 +11171,6 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/postcss-svgo/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/postcss-svgo/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/postcss-svgo/node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/postcss-svgo/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/postcss-svgo/node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/postcss-svgo/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/postcss-svgo/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/postcss-svgo/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "node_modules/postcss-svgo/node_modules/nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/postcss-svgo/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/postcss-svgo/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-svgo/node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/postcss-unique-selectors": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", @@ -18134,78 +11187,55 @@ } }, "node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true }, - "node_modules/postcss/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "node_modules/postcss/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, "node_modules/prettier": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.0.tgz", - "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", + "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/pretty-error": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^2.0.4" - } - }, - "node_modules/pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/prismjs": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", - "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "dev": true, - "engines": { - "node": ">= 0.6.0" + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" } }, "node_modules/process-nextick-args": { @@ -18222,62 +11252,6 @@ "asap": "~2.0.3" } }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "node_modules/promise.allsettled": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.5.tgz", - "integrity": "sha512-tVDqeZPoBC0SlzJHzWGZ2NKAguVq2oiYj7gbggbiTvH2itHohijTp7njOUA0aQ/nl+0lr/r6egmhoYu63UZ/pQ==", - "dev": true, - "dependencies": { - "array.prototype.map": "^1.0.4", - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "iterate-value": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/promise.prototype.finally": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/promise.prototype.finally/-/promise.prototype.finally-3.1.3.tgz", - "integrity": "sha512-EXRF3fC9/0gz4qkt/f5EP5iW4kj9oFpBICNpCNOb/52+8nlHIX07FPLbi/q4qYBQ1xZqivMzTpNQSnArVASolQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -18288,24 +11262,6 @@ "react-is": "^16.13.1" } }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "dev": true, - "dependencies": { - "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -18328,12 +11284,6 @@ "node": ">= 0.10" } }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, "node_modules/public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -18354,37 +11304,6 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -18399,74 +11318,6 @@ "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", "integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=" }, - "node_modules/purgecss": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-2.3.0.tgz", - "integrity": "sha512-BE5CROfVGsx2XIhxGuZAT7rTH9lLeQx/6M0P7DTXQH4IUc3BBzs9JUzt4yzGf3JrH9enkeq6YJBe9CTtkm1WmQ==", - "dependencies": { - "commander": "^5.0.0", - "glob": "^7.0.0", - "postcss": "7.0.32", - "postcss-selector-parser": "^6.0.2" - }, - "bin": { - "purgecss": "bin/purgecss" - } - }, - "node_modules/purgecss/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/purgecss/node_modules/postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - }, - "node_modules/purgecss/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/purgecss/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, "node_modules/qs": { "version": "6.10.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", @@ -18482,19 +11333,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "dependencies": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -18505,21 +11343,6 @@ "node": ">=0.4.x" } }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -18540,6 +11363,18 @@ } ] }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/raf": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", @@ -18548,12 +11383,6 @@ "performance-now": "^2.1.0" } }, - "node_modules/ramda": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.21.0.tgz", - "integrity": "sha1-oAGr7bP/YQd9T/HVd9RN536NCjU=", - "dev": true - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -18606,26 +11435,6 @@ "node": ">= 0.8" } }, - "node_modules/raw-loader": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", - "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, "node_modules/rc-align": { "version": "2.4.5", "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-2.4.5.tgz", @@ -18690,11 +11499,6 @@ "shallowequal": "^1.1.0" } }, - "node_modules/rc-util/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/react": { "version": "16.14.0", "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", @@ -18747,48 +11551,28 @@ "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/react-codemirror2": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/react-codemirror2/-/react-codemirror2-5.1.0.tgz", - "integrity": "sha512-Cksbgbviuf2mJfMyrKmcu7ycK6zX/ukuQO8dvRZdFWqATf5joalhjFc6etnBdGCcPA2LbhIwz+OPnQxLN/j1Fw==", - "peerDependencies": { - "codemirror": "5.x", - "react": ">=15.5 <=16.x" - } - }, - "node_modules/react-colorful": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.5.1.tgz", - "integrity": "sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==", - "dev": true, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, "node_modules/react-confirm": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/react-confirm/-/react-confirm-0.1.24.tgz", - "integrity": "sha512-96qA+mbZyBRmh/3Y5aDgrYLwLndbaRjkP3GlXQtPEQbIH0P66xGcHJ7ui6y/MN85AZWq/V3drA1fJOiEcVkAVA==", + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/react-confirm/-/react-confirm-0.1.27.tgz", + "integrity": "sha512-CWrPjCXqYXIRnnmDbGezN+4Umz+yZnaxFQWqjhz8fJQLTgNC47stON8NK5NjXioXfcfVawCrLj757ztBBNBZFQ==", "peerDependencies": { "react": "^0.14.7 || 15.x || 16.x || 17.x", "react-dom": "^0.14.7 || 15.x || 16.x || 17.x" } }, - "node_modules/react-datepicker": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-2.16.0.tgz", - "integrity": "sha512-TvcmSY27rn0JKvuJuIXNNS+niGQNdgtuG/CsBttVYhPOA9KmSw7c2PvQBPVEvzkyV+QPNJ8jN/KVJNj9uvopqA==", + "node_modules/react-date-range": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/react-date-range/-/react-date-range-1.4.0.tgz", + "integrity": "sha512-+9t0HyClbCqw1IhYbpWecjsiaftCeRN5cdhsi9v06YdimwyMR2yYHWcgVn3URwtN/txhqKpEZB6UX1fHpvK76w==", "dependencies": { "classnames": "^2.2.6", - "date-fns": "^2.0.1", "prop-types": "^15.7.2", - "react-onclickoutside": "^6.9.0", - "react-popper": "^1.3.4" + "react-list": "^0.8.13", + "shallow-equal": "^1.2.1" }, "peerDependencies": { - "react": "^16.9.0", - "react-dom": "^16.9.0" + "date-fns": "2.0.0-alpha.7 || >=2.0.0", + "react": "^0.14 || ^15.0.0-rc || >=15.0" } }, "node_modules/react-daterange-picker": { @@ -18816,7 +11600,7 @@ "node_modules/react-daterange-picker/node_modules/immutable": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", "engines": { "node": ">=0.10.0" } @@ -18858,57 +11642,6 @@ "dnd-core": "15.1.2" } }, - "node_modules/react-docgen": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-5.4.0.tgz", - "integrity": "sha512-JBjVQ9cahmNlfjMGxWUxJg919xBBKAoy3hgDgKERbR+BcF4ANpDuzWAScC7j27hZfd8sJNmMPOLWo9+vB/XJEQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@babel/generator": "^7.12.11", - "@babel/runtime": "^7.7.6", - "ast-types": "^0.14.2", - "commander": "^2.19.0", - "doctrine": "^3.0.0", - "estree-to-babel": "^3.1.0", - "neo-async": "^2.6.1", - "node-dir": "^0.1.10", - "strip-indent": "^3.0.0" - }, - "bin": { - "react-docgen": "bin/react-docgen.js" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/react-docgen-typescript": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz", - "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==", - "dev": true, - "peerDependencies": { - "typescript": ">= 4.3.x" - } - }, - "node_modules/react-docgen/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/react-docgen/node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/react-dom": { "version": "16.14.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", @@ -18939,8 +11672,7 @@ "node_modules/react-fast-compare": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", - "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==", - "dev": true + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" }, "node_modules/react-google-recaptcha": { "version": "1.1.0", @@ -18954,23 +11686,6 @@ "react": ">=16.4.1" } }, - "node_modules/react-helmet-async": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.12.5", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.2.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/react-highlight": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-highlight/-/react-highlight-0.14.0.tgz", @@ -18984,10 +11699,9 @@ } }, "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-json-view": { "version": "1.21.3", @@ -19018,56 +11732,21 @@ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, - "node_modules/react-onclickoutside": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.12.1.tgz", - "integrity": "sha512-a5Q7CkWznBRUWPmocCvE8b6lEYw1s6+opp/60dCunhO+G6E4tDTO2Sd2jKE+leEnnrLAE2Wj5DlDHNqj5wPv1Q==", - "funding": { - "type": "individual", - "url": "https://github.com/Pomax/react-onclickoutside/blob/master/FUNDING.md" + "node_modules/react-list": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/react-list/-/react-list-0.8.17.tgz", + "integrity": "sha512-pgmzGi0G5uGrdHzMhgO7KR1wx5ZXVvI3SsJUmkblSAKtewIhMwbQiMuQiTE83ozo04BQJbe0r3WIWzSO0dR1xg==", + "dependencies": { + "prop-types": "15" }, "peerDependencies": { - "react": "^15.5.x || ^16.x || ^17.x", - "react-dom": "^15.5.x || ^16.x || ^17.x" + "react": "0.14 || 15 - 18" } }, "node_modules/react-popper": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.11.tgz", - "integrity": "sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "@hypnosphi/create-react-context": "^0.3.1", - "deep-equal": "^1.1.1", - "popper.js": "^1.14.4", - "prop-types": "^15.6.1", - "typed-styles": "^0.0.7", - "warning": "^4.0.2" - }, - "peerDependencies": { - "react": "0.14.x || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/react-popper-tooltip": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/react-popper-tooltip/-/react-popper-tooltip-3.1.1.tgz", - "integrity": "sha512-EnERAnnKRptQBJyaee5GJScWNUKQPDD2ywvzZyUjst/wj5U64C8/CnSYLNEmP2hG0IJ3ZhtDxE8oDN+KOyavXQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.12.5", - "@popperjs/core": "^2.5.4", - "react-popper": "^2.2.4" - }, - "peerDependencies": { - "react": "^16.6.0 || ^17.0.0", - "react-dom": "^16.6.0 || ^17.0.0" - } - }, - "node_modules/react-popper-tooltip/node_modules/react-popper": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", - "dev": true, "dependencies": { "react-fast-compare": "^3.0.1", "warning": "^4.0.2" @@ -19096,20 +11775,6 @@ "redux": "^2.0.0 || ^3.0.0 || ^4.0.0-0" } }, - "node_modules/react-redux/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-refresh": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", - "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react-resize-detector": { "version": "6.7.8", "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-6.7.8.tgz", @@ -19157,54 +11822,15 @@ "react": ">=15" } }, - "node_modules/react-router-dom/node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/react-router/node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, "node_modules/react-router/node_modules/hoist-non-react-statics": { "version": "2.5.5", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" }, - "node_modules/react-router/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/react-router/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dependencies": { - "isarray": "0.0.1" - } - }, "node_modules/react-select": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.3.1.tgz", - "integrity": "sha512-Y195MmhDoDAj/8gTDyYZU1Raf7tmZd81wxM6RkFko4pqJ4Xv0/ilqUMtSn+GYkwmSlTWeMlzh+e+t7PJgtuXPw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.3.2.tgz", + "integrity": "sha512-W6Irh7U6Ha7p5uQQ2ZnemoCQ8mcfgOtHfw3wuMzG6FAu0P+CYicgofSLOq97BhjMx8jS+h+wwWdCBeVVZ9VqlQ==", "dependencies": { "@babel/runtime": "^7.12.0", "@emotion/cache": "^11.4.0", @@ -19219,40 +11845,6 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/react-select/node_modules/@emotion/cache": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", - "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", - "dependencies": { - "@emotion/memoize": "^0.7.4", - "@emotion/sheet": "^1.1.0", - "@emotion/utils": "^1.0.0", - "@emotion/weak-memoize": "^0.2.5", - "stylis": "4.0.13" - } - }, - "node_modules/react-select/node_modules/@emotion/sheet": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", - "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" - }, - "node_modules/react-select/node_modules/@emotion/utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", - "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" - }, - "node_modules/react-sizeme": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/react-sizeme/-/react-sizeme-3.0.2.tgz", - "integrity": "sha512-xOIAOqqSSmKlKFJLO3inBQBdymzDuXx4iuwkNcJmC96jeiOg5ojByvL+g3MW9LPEsojLbC6pf68zOfobK8IPlw==", - "dev": true, - "dependencies": { - "element-resize-detector": "^1.2.2", - "invariant": "^2.2.4", - "shallowequal": "^1.1.0", - "throttle-debounce": "^3.0.1" - } - }, "node_modules/react-smooth": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.0.tgz", @@ -19303,36 +11895,20 @@ "react-dom": "^16.0.0" } }, - "node_modules/react-syntax-highlighter": { - "version": "13.5.3", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-13.5.3.tgz", - "integrity": "sha512-crPaF+QGPeHNIblxxCdf2Lg936NAHKhNhuMzRL3F9ct6aYXL3NcZtCL0Rms9+qVo6Y1EQLdXGypBNSbPL/r+qg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.3.1", - "highlight.js": "^10.1.1", - "lowlight": "^1.14.0", - "prismjs": "^1.21.0", - "refractor": "^3.1.0" - }, - "peerDependencies": { - "react": ">= 0.14.0" - } - }, "node_modules/react-textarea-autosize": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz", - "integrity": "sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz", + "integrity": "sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==", "dependencies": { "@babel/runtime": "^7.10.2", - "use-composed-ref": "^1.0.0", - "use-latest": "^1.0.0" + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" }, "engines": { "node": ">=10" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/react-tippy": { @@ -19344,9 +11920,9 @@ } }, "node_modules/react-toastify": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-8.2.0.tgz", - "integrity": "sha512-Pg2Ju7NngAamarFvLwqrFomJ57u/Ay6i6zfLurt/qPynWkAkOthu6vxfqYpJCyNhHRhR4hu7+bySSeWWJu6PAg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.0.3.tgz", + "integrity": "sha512-0QZJk0SqYBxouRBGCFU3ymvjlwimRRhVH7SzqGRiVrQ001KSoUNbGKx9Yq42aoPv18n45yJzEFG82zqv3HnASg==", "dependencies": { "clsx": "^1.1.1" }, @@ -19405,93 +11981,6 @@ "node": ">=0.10.0" } }, - "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-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/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": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", @@ -19506,7 +11995,7 @@ "node_modules/readable-stream/node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, "node_modules/readdirp": { "version": "3.6.0", @@ -19521,13 +12010,10 @@ } }, "node_modules/recharts": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.1.9.tgz", - "integrity": "sha512-VozH5uznUvGqD7n224FGj7cmMAenlS0HPCs+7r2HeeHiQK6un6z0CTZfWVAB860xbcr4m+BN/EGMPZmYWd34Rg==", + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.1.10.tgz", + "integrity": "sha512-me6c8m2Gs88X/nuM2gDSTDIhpSLNMbiTrlE4Cu53hjZNegT3g3xLlTrbYSAQuBCFWuWJAZXCmEuMr6AwizLyaA==", "dependencies": { - "@types/d3-interpolate": "^2.0.0", - "@types/d3-scale": "^3.0.0", - "@types/d3-shape": "^2.0.0", "classnames": "^2.2.5", "d3-interpolate": "^2.0.0", "d3-scale": "^3.0.0", @@ -19561,10 +12047,17 @@ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, - "node_modules/recharts/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } }, "node_modules/reduce-css-calc": { "version": "2.1.8", @@ -19575,6 +12068,11 @@ "postcss-value-parser": "^3.3.0" } }, + "node_modules/reduce-css-calc/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, "node_modules/redux": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", @@ -19599,41 +12097,15 @@ "redux": "^4" } }, - "node_modules/refractor": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", - "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", - "dev": true, - "dependencies": { - "hastscript": "^6.0.0", - "parse-entities": "^2.0.0", - "prismjs": "~1.27.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/refractor/node_modules/prismjs": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", - "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "node_modules/regenerate-unicode-properties": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "dev": true, "dependencies": { "regenerate": "^1.4.2" }, @@ -19650,28 +12122,15 @@ "version": "0.15.0", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" } }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -19684,11 +12143,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, "node_modules/regexpu-core": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", - "dev": true, "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.0.1", @@ -19704,14 +12174,12 @@ "node_modules/regjsgen": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" }, "node_modules/regjsparser": { "version": "0.8.4", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "dev": true, "dependencies": { "jsesc": "~0.5.0" }, @@ -19722,8 +12190,7 @@ "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true, + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "bin": { "jsesc": "bin/jsesc" } @@ -19737,212 +12204,17 @@ "node": ">= 0.10" } }, - "node_modules/remark-footnotes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", - "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", - "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", - "dev": true, - "dependencies": { - "@babel/core": "7.12.9", - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-object-rest-spread": "7.12.1", - "@babel/plugin-syntax-jsx": "7.12.1", - "@mdx-js/util": "1.6.22", - "is-alphabetical": "1.0.4", - "remark-parse": "8.0.3", - "unified": "9.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx/node_modules/@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - }, - "node_modules/remark-mdx/node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/remark-mdx/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/remark-mdx/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remark-parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", - "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", - "dev": true, - "dependencies": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", - "dev": true, - "dependencies": { - "mdast-squeeze-paragraphs": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, "node_modules/renderkid": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", - "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "dev": true, "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", "htmlparser2": "^6.1.0", "lodash": "^4.17.21", - "strip-ansi": "^3.0.1" - } - }, - "node_modules/renderkid/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/renderkid/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/renderkid/node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "strip-ansi": "^6.0.1" } }, "node_modules/renderkid/node_modules/dom-serializer": { @@ -20000,6 +12272,15 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/renderkid/node_modules/htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", @@ -20019,48 +12300,6 @@ "entities": "^2.0.0" } }, - "node_modules/renderkid/node_modules/nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -20070,11 +12309,14 @@ "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true + "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/requires-port": { "version": "1.0.0", @@ -20104,82 +12346,18 @@ } }, "node_modules/resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "dependencies": { - "resolve-from": "^3.0.0" + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-dir/node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-dir/node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-dir/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "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==", @@ -20188,31 +12366,23 @@ "node": ">=8" } }, + "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==", + "engines": { + "node": ">=4" + } + }, "node_modules/resolve-pathname": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, "engines": { "node": ">= 4" @@ -20238,15 +12408,18 @@ } }, "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/ripemd160": { @@ -20259,6 +12432,80 @@ "inherits": "^2.0.1" } }, + "node_modules/rollup": { + "version": "2.75.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.4.tgz", + "integrity": "sha512-JgZiJMJkKImMZJ8ZY1zU80Z2bA/TvrL/7D9qcBCrfl2bP+HUaIw0QHUroB4E3gBpFl6CRFM1YxGbuYGtdAswbQ==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/rollup-plugin-terser/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/rollup-plugin-terser/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/rollup-plugin-terser/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/rtcpeerconnection-shim": { "version": "1.2.15", "resolved": "https://registry.npmjs.org/rtcpeerconnection-shim/-/rtcpeerconnection-shim-1.2.15.tgz", @@ -20294,29 +12541,11 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "dependencies": { - "aproba": "^1.1.1" - } - }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, "node_modules/safe-stable-stringify": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", @@ -20332,6 +12561,61 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "node_modules/sass": { + "version": "1.52.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.1.tgz", + "integrity": "sha512-fSzYTbr7z8oQnVJ3Acp9hV80dM1fkMN7mSD/25mpcct9F7FPBMOI8krEYALgU1aZoqGhQNhTPsuSmxjnIvAm4Q==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/sass-loader": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.0.tgz", + "integrity": "sha512-IHCFecI+rbPvXE2zO/mqdVFe8MU7ElGrwga9hh2H65Ru4iaBJAMRteum1c4Gsxi9Cq1FOtTEDd6+/AEYuQDM4Q==", + "dev": true, + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, "node_modules/sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", @@ -20348,17 +12632,17 @@ } }, "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 8.9.0" }, "funding": { "type": "opencollective", @@ -20377,44 +12661,53 @@ "dev": true }, "node_modules/selfsigned": { - "version": "1.10.14", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", - "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", "dev": true, "dependencies": { - "node-forge": "^0.10.0" + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semantic-ui-css": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/semantic-ui-css/-/semantic-ui-css-2.4.1.tgz", + "integrity": "sha512-Pkp0p9oWOxlH0kODx7qFpIRYpK1T4WJOO4lNnpNPOoWKCrYsfHqYSKgk5fHfQtnWnsAKy7nLJMW02bgDWWFZFg==", + "dependencies": { + "jquery": "x.*" } }, "node_modules/semantic-ui-react": { - "version": "0.87.3", - "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-0.87.3.tgz", - "integrity": "sha512-YJgFYEheeFBMm/epZpIpWKF9glgSShdLPiY8zoUi+KJ0IKtLtbI8RbMD/ELbZkY+SO/IWbK/f/86pWt3PVvMVA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-2.1.3.tgz", + "integrity": "sha512-dd2pqalMk0ycJoHf7hn4mYd0xohg0NMk7ohlpPVOigCfMLrKk2e3NZdRk0yBetvD+qJXPqZ04jA43bDwqOM5OA==", "dependencies": { - "@babel/runtime": "^7.1.2", - "@semantic-ui-react/event-stack": "^3.1.0", - "classnames": "^2.2.6", - "keyboard-key": "^1.0.4", - "lodash": "^4.17.11", - "prop-types": "^15.6.2", - "react-is": "^16.7.0", - "react-popper": "^1.3.3", + "@babel/runtime": "^7.10.5", + "@fluentui/react-component-event-listener": "~0.63.0", + "@fluentui/react-component-ref": "~0.63.0", + "@popperjs/core": "^2.6.0", + "@semantic-ui-react/event-stack": "^3.1.3", + "clsx": "^1.1.1", + "keyboard-key": "^1.1.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "prop-types": "^15.7.2", + "react-is": "^16.8.6 || ^17.0.0 || ^18.0.0", + "react-popper": "^2.3.0", "shallowequal": "^1.1.0" }, "peerDependencies": { - "react": "^16.3.0", - "react-dom": "^16.3.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/semantic-ui-react/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -20455,7 +12748,7 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/send/node_modules/ms": { @@ -20465,42 +12758,14 @@ "dev": true }, "node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "dependencies": { "randombytes": "^2.1.0" } }, - "node_modules/serve-favicon": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", - "integrity": "sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=", - "dev": true, - "dependencies": { - "etag": "~1.8.1", - "fresh": "0.5.2", - "ms": "2.1.1", - "parseurl": "~1.3.2", - "safe-buffer": "5.1.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-favicon/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "node_modules/serve-favicon/node_modules/safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, "node_modules/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", @@ -20531,7 +12796,7 @@ "node_modules/serve-index/node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, "engines": { "node": ">= 0.6" @@ -20540,7 +12805,7 @@ "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, "dependencies": { "depd": "~1.1.2", @@ -20555,13 +12820,13 @@ "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "dev": true }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/serve-index/node_modules/setprototypeof": { @@ -20594,48 +12859,6 @@ "node": ">= 0.8.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -20672,6 +12895,11 @@ "node": ">=8" } }, + "node_modules/shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" + }, "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", @@ -20718,10 +12946,17 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/simple-html-tokenizer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.1.1.tgz", + "integrity": "sha1-BcLuxXn//+FFoDCsJs/qYbmA+r4=", + "dev": true + }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, "dependencies": { "is-arrayish": "^0.3.1" } @@ -20729,14 +12964,23 @@ "node_modules/simple-swizzle/node_modules/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", "dev": true }, + "node_modules/sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", @@ -20746,219 +12990,10 @@ "node": ">=6" } }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/socket.io-client": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.0.tgz", - "integrity": "sha512-HW61c1G7OrYGxaI79WRn17+b03iBCdvhBj4iqyXHBoL5M8w2MSO/vChsjA93knG4GYEai1/vbXWJna9dzxXtSg==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.1.tgz", + "integrity": "sha512-e6nLVgiRYatS+AHXnOnGi4ocOpubvOUCGhyWw8v+/FxW8saHkinG6Dfhi9TU0Kt/8mwJIAASxvw6eujQmjdZVA==", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", @@ -20992,34 +13027,6 @@ "websocket-driver": "^0.7.4" } }, - "node_modules/sockjs-client": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.0.tgz", - "integrity": "sha512-qVHJlyfdHFht3eBFZdKEXKTlb7I4IV41xnVNo8yUKA1UHcPJwgW2SvTq9LhnjjCywSkSK7c/e4nghU0GOoMCRQ==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "eventsource": "^1.1.0", - "faye-websocket": "^0.11.4", - "inherits": "^2.0.4", - "url-parse": "^1.5.10" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://tidelift.com/funding/github/npm/sockjs-client" - } - }, - "node_modules/sockjs-client/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, "node_modules/sockjs/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -21029,18 +13036,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "dependencies": { - "is-plain-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -21055,18 +13050,13 @@ "node": ">= 8" } }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "engines": { + "node": ">=0.10.0" } }, "node_modules/source-map-support": { @@ -21088,53 +13078,10 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, - "node_modules/space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "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.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, "node_modules/spdy": { @@ -21210,38 +13157,16 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "node_modules/ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "dependencies": { - "figgy-pudding": "^3.5.1" - } - }, "node_modules/stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, "node_modules/stack-trace": { "version": "0.0.10", @@ -21261,124 +13186,6 @@ "node": ">=0.1.14" } }, - "node_modules/stackframe": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz", - "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==", - "dev": true - }, - "node_modules/state-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", - "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -21388,108 +13195,6 @@ "node": ">= 0.8" } }, - "node_modules/store2": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/store2/-/store2-2.13.2.tgz", - "integrity": "sha512-CMtO2Uneg3SAz/d6fZ/6qbqqQHi2ynq6/KzMD/26gTkiEShCcpqFfTHgOxsE0egAq6SX3FmN4CeSqn8BzXQkJg==", - "dev": true - }, - "node_modules/stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-browserify/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/stream-browserify/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/stream-http/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/stream-http/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "node_modules/strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", @@ -21509,12 +13214,6 @@ "node": ">=8" } }, - "node_modules/string-width/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/string.prototype.matchall": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", @@ -21534,66 +13233,48 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.padend": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", - "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.padstart": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/string.prototype.padstart/-/string.prototype.padstart-3.1.3.tgz", - "integrity": "sha512-NZydyOMtYxpTjGqp0VN5PYUF/tsU15yDMZnUdj16qRUIUiMJkHHSDElYyQFrMu+/WloTpA7MQSiADhBicDfaoA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -21606,45 +13287,34 @@ "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", "dev": true, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "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": ">=0.10.0" - } - }, - "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": ">=6" } }, "node_modules/strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "bin": { - "strip-json-comments": "cli.js" - }, + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, "engines": { - "node": ">=0.8.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strnum": { @@ -21654,65 +13324,19 @@ "dev": true }, "node_modules/style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", "dev": true, - "dependencies": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - }, "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/style-loader/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" + "node": ">= 12.13.0" }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/style-loader/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/style-loader/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/style-to-object": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", - "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", - "dev": true, - "dependencies": { - "inline-style-parser": "0.1.1" + "peerDependencies": { + "webpack": "^5.0.0" } }, "node_modules/stylehacks": { @@ -21737,12 +13361,19 @@ "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" }, "node_modules/sugarss": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", - "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-4.0.1.tgz", + "integrity": "sha512-WCjS5NfuVJjkQzK10s8WOBY+hhDxxNt/N6ZaGwxFZ+wN3/lKKFSaaKUNecULcTTvE4urLcKaZFQD8vO0mOZujw==", "dev": true, - "dependencies": { - "postcss": "^7.0.2" + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" } }, "node_modules/supports-color": { @@ -21767,6 +13398,48 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svg-inline-loader": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.8.2.tgz", + "integrity": "sha512-kbrcEh5n5JkypaSC152eGfGcnT4lkR0eSfvefaUJkLqgGjRQJyKDvvEE/CCv5aTSdfXuc+N98w16iAojhShI3g==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0", + "object-assign": "^4.0.1", + "simple-html-tokenizer": "^0.1.1" + } + }, + "node_modules/svg-inline-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/svg-inline-loader/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, "node_modules/svg-pathdata": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", @@ -21777,333 +13450,140 @@ } }, "node_modules/svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", - "dev": true, + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", "dependencies": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" }, "bin": { "svgo": "bin/svgo" }, "engines": { - "node": ">=4.0.0" + "node": ">=10.13.0" } }, - "node_modules/svgo/node_modules/css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "node_modules/svgo/node_modules/css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "dev": true, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "node": ">= 10" } }, - "node_modules/svgo/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/svgo/node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "node_modules/symbol.prototype.description": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/symbol.prototype.description/-/symbol.prototype.description-1.0.5.tgz", - "integrity": "sha512-x738iXRYsrAt9WBhRCVG5BtIC3B7CUkFwbHW2zOvGtwM33s7JjrCDyq8V0zgMYVb5ymsL8+qkzzpANH63CPQaQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-symbol-description": "^1.0.0", - "has-symbols": "^1.0.2", - "object.getownpropertydescriptors": "^2.1.2" - }, - "engines": { - "node": ">= 0.11.15" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/synchronous-promise": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.15.tgz", - "integrity": "sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg==", - "dev": true - }, "node_modules/syncod": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/syncod/-/syncod-0.0.1.tgz", "integrity": "sha512-KHDsGQ4UcP+wSMaqH7wjH4DHxeHKRlmEO5jlSVCS+0x9xA4ZhdKYg/ameGF7RXaFDUcsti6Zj5s5W1Z4/YsbHA==" }, "node_modules/tailwindcss": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-1.9.6.tgz", - "integrity": "sha512-nY8WYM/RLPqGsPEGEV2z63riyQPcHYZUJpAwdyBzVpxQHOHqHE+F/fvbCeXhdF1+TA5l72vSkZrtYCB9hRcwkQ==", + "version": "3.0.24", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.24.tgz", + "integrity": "sha512-H3uMmZNWzG6aqmg9q07ZIRNIawoiEcNFKDfL+YzOPuPsXuDXxJxB9icqzLgdzKNwjG3SAro2h9SYav8ewXNgig==", + "dev": true, "dependencies": { - "@fullhuman/postcss-purgecss": "^2.1.2", - "autoprefixer": "^9.4.5", - "browserslist": "^4.12.0", - "bytes": "^3.0.0", - "chalk": "^3.0.0 || ^4.0.0", - "color": "^3.1.2", + "arg": "^5.0.1", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", "detective": "^5.2.0", - "fs-extra": "^8.0.0", - "html-tags": "^3.1.0", - "lodash": "^4.17.20", - "node-emoji": "^1.8.1", - "normalize.css": "^8.0.1", - "object-hash": "^2.0.3", - "postcss": "^7.0.11", - "postcss-functions": "^3.0.0", - "postcss-js": "^2.0.0", - "postcss-nested": "^4.1.1", - "postcss-selector-parser": "^6.0.0", - "postcss-value-parser": "^4.1.0", - "pretty-hrtime": "^1.0.3", - "reduce-css-calc": "^2.1.6", - "resolve": "^1.14.2" + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.12", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" }, "engines": { - "node": ">=8.9.0" + "node": ">=12.13.0" + }, + "peerDependencies": { + "postcss": "^8.0.9" } }, - "node_modules/tailwindcss/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==", + "node_modules/tailwindcss/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/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/tailwindcss/node_modules/autoprefixer": { - "version": "9.8.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", - "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", - "dependencies": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "picocolors": "^0.2.1", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - }, - "node_modules/tailwindcss/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/tailwindcss/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/tailwindcss/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/tailwindcss/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/tailwindcss/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "node_modules/tailwindcss/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/tailwindcss/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==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tailwindcss/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" + "node": ">=10.13.0" } }, "node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, "engines": { "node": ">=6" } }, - "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/tar/node_modules/chownr": { + "node_modules/temp-dir": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" }, "engines": { "node": ">=10" - } - }, - "node_modules/tar/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/telejson": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/telejson/-/telejson-5.3.3.tgz", - "integrity": "sha512-PjqkJZpzEggA9TBpVtJi1LVptP7tYtXB6rEubwlHap76AMjzvOdKX41CxyaW7ahhzDU1aftXnMCx5kAPDZTQBA==", - "dev": true, - "dependencies": { - "@types/is-function": "^1.0.0", - "global": "^4.4.0", - "is-function": "^1.0.2", - "is-regex": "^1.1.2", - "is-symbol": "^1.0.3", - "isobject": "^4.0.0", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3" - } - }, - "node_modules/telejson/node_modules/isobject": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", - "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/terser": { - "version": "5.13.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.13.1.tgz", - "integrity": "sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.0.tgz", + "integrity": "sha512-JC6qfIEkPBd9j1SMO3Pfn+A6w2kQV54tv+ABQLgZr7dA3k/DL/OBoYSWxzVpZev3J+bUHXfr55L8Mox7AaNo6g==", "dev": true, "dependencies": { + "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.8.0-beta.0", "source-map-support": "~0.5.20" }, "bin": { @@ -22114,20 +13594,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", - "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", "dev": true, "dependencies": { - "cacache": "^15.0.5", - "find-cache-dir": "^3.3.1", - "jest-worker": "^26.5.0", - "p-limit": "^3.0.2", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", - "terser": "^5.3.4", - "webpack-sources": "^1.4.3" + "terser": "^5.7.2" }, "engines": { "node": ">= 10.13.0" @@ -22137,219 +13613,36 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, - "node_modules/terser-webpack-plugin/node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">= 10" - } - }, - "node_modules/terser-webpack-plugin/node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" + "node": ">= 10.13.0" }, "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/terser-webpack-plugin/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/terser-webpack-plugin/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/terser-webpack-plugin/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/terser-webpack-plugin/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser-webpack-plugin/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin/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/terser-webpack-plugin/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/terser-webpack-plugin/node_modules/p-locate/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/terser-webpack-plugin/node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser-webpack-plugin/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/terser-webpack-plugin/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/terser-webpack-plugin/node_modules/source-map": { @@ -22361,94 +13654,12 @@ "node": ">=0.10.0" } }, - "node_modules/terser-webpack-plugin/node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/terser-webpack-plugin/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/terser/node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "node_modules/terser/node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dev": true, - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/terser/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/terser/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "node_modules/terser/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", @@ -22464,14 +13675,11 @@ "utrie": "^1.0.2" } }, - "node_modules/throttle-debounce": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", - "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==", - "dev": true, - "engines": { - "node": ">=10" - } + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true }, "node_modules/through2": { "version": "3.0.2", @@ -22532,18 +13740,6 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "node_modules/timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/tiny-invariant": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", @@ -22554,12 +13750,6 @@ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, - "node_modules/to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -22568,51 +13758,6 @@ "node": ">=4" } }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -22639,227 +13784,125 @@ "node": ">=0.6" } }, - "node_modules/toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", - "dev": true + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true, + "engines": { + "node": ">=6" + } }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, - "node_modules/trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", - "dev": true - }, - "node_modules/trim-trailing-lines": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", - "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/triple-beam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==", "dev": true }, - "node_modules/trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/tryer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", - "dev": true - }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "dev": true, - "engines": { - "node": ">=6.10" - } - }, - "node_modules/ts-loader": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.4.0.tgz", - "integrity": "sha512-6nFY3IZ2//mrPc+ImY3hNWx1vCHyEhl6V+wLmL4CZcm6g1CqX7UKrkc6y0i4FwcfOhxyMPCfaEvh20f4r9GNpw==", + "node_modules/ts-node": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.8.0.tgz", + "integrity": "sha512-/fNd5Qh+zTt8Vt1KbYZjRHCE9sI5i7nqfD/dzBBRDeVXZXS6kToW6R7tTU6Nd4XavFs0mAVCg29Q//ML7WsZYA==", "dev": true, "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^2.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "typescript": "*", - "webpack": "*" - } - }, - "node_modules/ts-loader/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/ts-loader/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/ts-loader/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/ts-loader/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/ts-loader/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" + "@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": { - "semver": "bin/semver.js" + "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" }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-loader/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/ts-loader/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/ts-pnp": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", - "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", - "dev": true, - "engines": { - "node": ">=6" + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" }, "peerDependenciesMeta": { - "typescript": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { "optional": true } } }, - "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "node_modules/ts-node/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, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "engines": { + "node": ">=0.4.0" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } + "node_modules/ts-node/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/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } }, "node_modules/type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", "dev": true, "engines": { "node": ">=10" @@ -22881,214 +13924,10 @@ "node": ">= 0.6" } }, - "node_modules/typed-css-modules": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/typed-css-modules/-/typed-css-modules-0.7.2.tgz", - "integrity": "sha512-R3guXrQ8ry/yhlfvNmkVY4J3+FtKaEdwqrvgSvFpVY0ieYQHqhhBW0RwfE4hnG4m29Ef/4IE0tBsk/UKplmJkA==", - "dev": true, - "dependencies": { - "@types/css-modules-loader-core": "^1.1.0", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "chokidar": "^3.4.0", - "css-modules-loader-core": "^1.1.0", - "glob": "^7.1.2", - "is-there": "^4.4.2", - "mkdirp": "^1.0.0", - "yargs": "^15.4.1" - }, - "bin": { - "tcm": "lib/cli.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/typed-css-modules/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/typed-css-modules/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/typed-css-modules/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/typed-css-modules/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/typed-css-modules/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/typed-css-modules/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/typed-css-modules/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/typed-css-modules/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/typed-css-modules/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/typed-css-modules/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/typed-css-modules/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/typed-css-modules/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/typed-css-modules/node_modules/yargs-parser/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/typed-styles": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", - "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==" - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, "node_modules/typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.2.tgz", + "integrity": "sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -23116,19 +13955,6 @@ "node": "*" } }, - "node_modules/uglify-js": { - "version": "3.15.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.4.tgz", - "integrity": "sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -23150,31 +13976,10 @@ "integrity": "sha512-QvjkYpiD+dJJraRA8+dGAU4i7aBbb2s0S3jA45TFOvg2VgqvdCDd/3N6CqA8gluk1W91GLoXg5enMUx560QzuA==", "dev": true }, - "node_modules/unfetch": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", - "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==", - "dev": true - }, - "node_modules/unherit": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", - "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.0", - "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, "engines": { "node": ">=4" } @@ -23183,7 +13988,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -23196,7 +14000,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "dev": true, "engines": { "node": ">=4" } @@ -23205,188 +14008,22 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", - "dev": true, "engines": { "node": ">=4" } }, - "node_modules/unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" + "crypto-random-string": "^2.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unified/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, "engines": { "node": ">=8" } }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/union-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/unist-builder": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", - "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-generated": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", - "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", - "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", - "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", - "dev": true, - "dependencies": { - "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove-position": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", - "dev": true, - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -23405,60 +14042,6 @@ "node": ">= 0.8" } }, - "node_modules/unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", @@ -23469,12 +14052,6 @@ "yarn": "*" } }, - "node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -23484,13 +14061,6 @@ "punycode": "^2.1.0" } }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, "node_modules/url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", @@ -23501,58 +14071,12 @@ "querystring": "0.2.0" } }, - "node_modules/url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "node_modules/url/node_modules/punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", "dev": true }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/use-composed-ref": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", @@ -23607,17 +14131,8 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "node_modules/utila": { "version": "0.4.0", @@ -23644,13 +14159,12 @@ } }, "node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", "dev": true, "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache": { @@ -23659,28 +14173,22 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "node_modules/v8-to-istanbul": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz", - "integrity": "sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw==", + "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/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.7", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" + "homedir-polyfill": "^1.0.1" }, "engines": { - "node": ">=10.12.0" - } - }, - "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": ">= 0.10" } }, "node_modules/value-equal": { @@ -23697,52 +14205,6 @@ "node": ">= 0.8" } }, - "node_modules/vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", - "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, "node_modules/warning": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", @@ -23764,317 +14226,6 @@ "node": ">=10.13.0" } }, - "node_modules/watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, - "optional": true, - "dependencies": { - "chokidar": "^2.1.8" - } - }, - "node_modules/watchpack-chokidar2/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", - "dev": true, - "optional": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/watchpack-chokidar2/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true, - "optional": true - }, - "node_modules/watchpack-chokidar2/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "optional": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "optional": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/watchpack-chokidar2/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/watchpack-chokidar2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "optional": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wbuf": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", @@ -24096,56 +14247,47 @@ "@zxing/text-encoding": "0.9.0" } }, - "node_modules/web-namespaces": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", - "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" }, "node_modules/webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "version": "5.72.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", + "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" + "enhanced-resolve": "^5.9.3", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" }, "engines": { - "node": ">=6.11.5" + "node": ">=10.13.0" }, "funding": { "type": "opencollective", @@ -24154,467 +14296,312 @@ "peerDependenciesMeta": { "webpack-cli": { "optional": true - }, - "webpack-command": { - "optional": true } } }, "node_modules/webpack-bundle-analyzer": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz", - "integrity": "sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", + "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", "dev": true, "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1", - "bfj": "^6.1.1", - "chalk": "^2.4.1", - "commander": "^2.18.0", - "ejs": "^2.6.1", - "express": "^4.16.3", - "filesize": "^3.6.1", - "gzip-size": "^5.0.0", - "lodash": "^4.17.19", - "mkdirp": "^0.5.1", - "opener": "^1.5.1", - "ws": "^6.0.0" + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" }, "bin": { "webpack-bundle-analyzer": "lib/bin/analyzer.js" }, "engines": { - "node": ">= 6.14.4" + "node": ">= 10.13.0" } }, - "node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "node_modules/webpack-bundle-analyzer/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/webpack-bundle-analyzer/node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "node_modules/webpack-bundle-analyzer/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": { - "async-limiter": "~1.0.0" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/webpack-bundle-analyzer/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/webpack-bundle-analyzer/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/webpack-bundle-analyzer/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/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-bundle-analyzer/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/webpack-bundle-analyzer/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/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz", + "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/webpack-cli": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", - "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", + "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", "dev": true, "dependencies": { - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.1", - "findup-sync": "^3.0.0", - "global-modules": "^2.0.0", - "import-local": "^2.0.0", - "interpret": "^1.4.0", - "loader-utils": "^1.4.0", - "supports-color": "^6.1.0", - "v8-compile-cache": "^2.1.1", - "yargs": "^13.3.2" + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.1", + "@webpack-cli/info": "^1.4.1", + "@webpack-cli/serve": "^1.6.1", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" }, "bin": { "webpack-cli": "bin/cli.js" }, "engines": { - "node": ">=6.11.5" + "node": ">=10.13.0" }, "peerDependencies": { - "webpack": "4.x.x" - } - }, - "node_modules/webpack-cli/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/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/webpack-cli/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/webpack-cli/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "webpack": "4.x.x || 5.x.x" }, - "engines": { - "node": ">=4.8" + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } } }, - "node_modules/webpack-cli/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/webpack-cli/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "engines": { - "node": ">= 0.10" - } - }, - "node_modules/webpack-cli/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-cli/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/webpack-cli/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/webpack-cli/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-cli/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-cli/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/webpack-cli/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-cli/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-cli/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/webpack-cli/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/webpack-cli/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "node": ">= 10" } }, "node_modules/webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "dev": true, "dependencies": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" + "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/webpack-dev-middleware/node_modules/memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "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/webpack-dev-middleware/node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, - "bin": { - "mime": "cli.js" + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/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/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/webpack-dev-middleware/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/webpack-dev-server": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", - "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.1.tgz", + "integrity": "sha512-CTMfu2UMdR/4OOZVHRpdy84pNopOuigVIsRbGX3LVDMWNP8EUgC5mUBMErbwBlHTEX99ejZJpVqrir6EXAEajA==", "dev": true, "dependencies": { - "ansi-html-community": "0.0.8", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.0.1", "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", + "sockjs": "^0.3.24", "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { - "node": ">= 6.11.5" + "node": ">= 12.13.0" }, "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "webpack": "^4.37.0 || ^5.0.0" }, "peerDependenciesMeta": { "webpack-cli": { @@ -24622,946 +14609,127 @@ } } }, - "node_modules/webpack-dev-server/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/webpack-dev-server/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "fast-deep-equal": "^3.1.3" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "ajv": "^8.8.2" } }, - "node_modules/webpack-dev-server/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/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/webpack-dev-server/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", - "dev": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/webpack-dev-server/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/webpack-dev-server/node_modules/cliui/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "node_modules/webpack-dev-server/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/webpack-dev-server/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/webpack-dev-server/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-dev-server/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-dev-server/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/webpack-dev-server/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" }, "engines": { - "node": ">= 4" - } - }, - "node_modules/webpack-dev-server/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/webpack-dev-server/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "node": ">= 12.13.0" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/string-width/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/string-width/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/webpack-dev-server/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/webpack-dev-server/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/webpack-filter-warnings-plugin": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/webpack-filter-warnings-plugin/-/webpack-filter-warnings-plugin-1.2.1.tgz", - "integrity": "sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", + "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", "dev": true, "engines": { - "node": ">= 4.3 < 5.0.0 || >= 5.10" + "node": ">=10.0.0" }, "peerDependencies": { - "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/webpack-hot-middleware": { - "version": "2.25.1", - "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.1.tgz", - "integrity": "sha512-Koh0KyU/RPYwel/khxbsDz9ibDivmUbrRuKSSQvW42KSDdO4w23WI3SkHpSUKHE76LrFnnM/L7JCrpBwu8AXYw==", + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dev": true, "dependencies": { - "ansi-html-community": "0.0.8", - "html-entities": "^2.1.0", - "querystring": "^0.2.0", - "strip-ansi": "^6.0.0" - } - }, - "node_modules/webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "dependencies": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/webpack-log/node_modules/ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true, - "engines": { - "node": ">=6" + "node": ">=10.0.0" } }, "node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/webpack-sources/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=10.13.0" } }, - "node_modules/webpack-virtual-modules": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.2.2.tgz", - "integrity": "sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA==", - "dev": true, - "dependencies": { - "debug": "^3.0.0" - } - }, - "node_modules/webpack-virtual-modules/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/webpack/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/webpack/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/webpack/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/webpack/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "node_modules/webpack/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/webpack/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/webpack/node_modules/memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "node_modules/webpack/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "node": ">=0.8.x" } }, "node_modules/webpack/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">= 4" - } - }, - "node_modules/webpack/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/webpack/node_modules/terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "node": ">= 10.13.0" }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/webpack/node_modules/terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dev": true, - "dependencies": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/webpack/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "optionalDependencies": { - "chokidar": "^3.4.1", - "watchpack-chokidar2": "^2.0.1" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/webrtc-adapter": { @@ -25640,24 +14808,18 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "node_modules/which-typed-array": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", - "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", + "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.18.5", - "foreach": "^2.0.5", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.7" + "is-typed-array": "^1.1.9" }, "engines": { "node": ">= 0.4" @@ -25666,26 +14828,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true }, "node_modules/winston": { "version": "3.7.2", @@ -25765,18 +14912,6 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/winston/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/winston/node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -25820,28 +14955,319 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "node_modules/worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true, - "dependencies": { - "errno": "~0.1.7" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/worker-rpc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", - "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "node_modules/workbox-background-sync": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.3.tgz", + "integrity": "sha512-0DD/V05FAcek6tWv9XYj2w5T/plxhDSpclIcAGjA/b7t/6PdaRkQ7ZgtAX6Q/L7kV7wZ8uYRJUoH11VjNipMZw==", "dev": true, "dependencies": { - "microevent.ts": "~0.1.1" + "idb": "^6.1.4", + "workbox-core": "6.5.3" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.3.tgz", + "integrity": "sha512-4AwCIA5DiDrYhlN+Miv/fp5T3/whNmSL+KqhTwRBTZIL6pvTgE4lVuRzAt1JltmqyMcQ3SEfCdfxczuI4kwFQg==", + "dev": true, + "dependencies": { + "workbox-core": "6.5.3" + } + }, + "node_modules/workbox-build": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.3.tgz", + "integrity": "sha512-8JNHHS7u13nhwIYCDea9MNXBNPHXCs5KDZPKI/ZNTr3f4sMGoD7hgFGecbyjX1gw4z6e9bMpMsOEJNyH5htA/w==", + "dev": true, + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "6.5.3", + "workbox-broadcast-update": "6.5.3", + "workbox-cacheable-response": "6.5.3", + "workbox-core": "6.5.3", + "workbox-expiration": "6.5.3", + "workbox-google-analytics": "6.5.3", + "workbox-navigation-preload": "6.5.3", + "workbox-precaching": "6.5.3", + "workbox-range-requests": "6.5.3", + "workbox-recipes": "6.5.3", + "workbox-routing": "6.5.3", + "workbox-strategies": "6.5.3", + "workbox-streams": "6.5.3", + "workbox-sw": "6.5.3", + "workbox-window": "6.5.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.4.tgz", + "integrity": "sha512-Ic2d8ZT6HJiSikGVQvSklaFyw1OUv4g8sDOxa0PXSlbmN/3gL5IO1WYY9DOwTDqOFmjWoqG1yaaKnPDqYCE9KA==", + "dev": true, + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "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/workbox-build/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/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-build/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/workbox-build/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "node_modules/workbox-build/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.3.tgz", + "integrity": "sha512-6JE/Zm05hNasHzzAGKDkqqgYtZZL2H06ic2GxuRLStA4S/rHUfm2mnLFFXuHAaGR1XuuYyVCEey1M6H3PdZ7SQ==", + "dev": true, + "dependencies": { + "workbox-core": "6.5.3" + } + }, + "node_modules/workbox-core": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.3.tgz", + "integrity": "sha512-Bb9ey5n/M9x+l3fBTlLpHt9ASTzgSGj6vxni7pY72ilB/Pb3XtN+cZ9yueboVhD5+9cNQrC9n/E1fSrqWsUz7Q==", + "dev": true + }, + "node_modules/workbox-expiration": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.3.tgz", + "integrity": "sha512-jzYopYR1zD04ZMdlbn/R2Ik6ixiXbi15c9iX5H8CTi6RPDz7uhvMLZPKEndZTpfgmUk8mdmT9Vx/AhbuCl5Sqw==", + "dev": true, + "dependencies": { + "idb": "^6.1.4", + "workbox-core": "6.5.3" + } + }, + "node_modules/workbox-google-analytics": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.3.tgz", + "integrity": "sha512-3GLCHotz5umoRSb4aNQeTbILETcrTVEozSfLhHSBaegHs1PnqCmN0zbIy2TjTpph2AGXiNwDrWGF0AN+UgDNTw==", + "dev": true, + "dependencies": { + "workbox-background-sync": "6.5.3", + "workbox-core": "6.5.3", + "workbox-routing": "6.5.3", + "workbox-strategies": "6.5.3" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.3.tgz", + "integrity": "sha512-bK1gDFTc5iu6lH3UQ07QVo+0ovErhRNGvJJO/1ngknT0UQ702nmOUhoN9qE5mhuQSrnK+cqu7O7xeaJ+Rd9Tmg==", + "dev": true, + "dependencies": { + "workbox-core": "6.5.3" + } + }, + "node_modules/workbox-precaching": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.3.tgz", + "integrity": "sha512-sjNfgNLSsRX5zcc63H/ar/hCf+T19fRtTqvWh795gdpghWb5xsfEkecXEvZ8biEi1QD7X/ljtHphdaPvXDygMQ==", + "dev": true, + "dependencies": { + "workbox-core": "6.5.3", + "workbox-routing": "6.5.3", + "workbox-strategies": "6.5.3" + } + }, + "node_modules/workbox-range-requests": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.3.tgz", + "integrity": "sha512-pGCP80Bpn/0Q0MQsfETSfmtXsQcu3M2QCJwSFuJ6cDp8s2XmbUXkzbuQhCUzKR86ZH2Vex/VUjb2UaZBGamijA==", + "dev": true, + "dependencies": { + "workbox-core": "6.5.3" + } + }, + "node_modules/workbox-recipes": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.3.tgz", + "integrity": "sha512-IcgiKYmbGiDvvf3PMSEtmwqxwfQ5zwI7OZPio3GWu4PfehA8jI8JHI3KZj+PCfRiUPZhjQHJ3v1HbNs+SiSkig==", + "dev": true, + "dependencies": { + "workbox-cacheable-response": "6.5.3", + "workbox-core": "6.5.3", + "workbox-expiration": "6.5.3", + "workbox-precaching": "6.5.3", + "workbox-routing": "6.5.3", + "workbox-strategies": "6.5.3" + } + }, + "node_modules/workbox-routing": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.3.tgz", + "integrity": "sha512-DFjxcuRAJjjt4T34RbMm3MCn+xnd36UT/2RfPRfa8VWJGItGJIn7tG+GwVTdHmvE54i/QmVTJepyAGWtoLPTmg==", + "dev": true, + "dependencies": { + "workbox-core": "6.5.3" + } + }, + "node_modules/workbox-strategies": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.3.tgz", + "integrity": "sha512-MgmGRrDVXs7rtSCcetZgkSZyMpRGw8HqL2aguszOc3nUmzGZsT238z/NN9ZouCxSzDu3PQ3ZSKmovAacaIhu1w==", + "dev": true, + "dependencies": { + "workbox-core": "6.5.3" + } + }, + "node_modules/workbox-streams": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.3.tgz", + "integrity": "sha512-vN4Qi8o+b7zj1FDVNZ+PlmAcy1sBoV7SC956uhqYvZ9Sg1fViSbOpydULOssVJ4tOyKRifH/eoi6h99d+sJ33w==", + "dev": true, + "dependencies": { + "workbox-core": "6.5.3", + "workbox-routing": "6.5.3" + } + }, + "node_modules/workbox-sw": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.3.tgz", + "integrity": "sha512-BQBzm092w+NqdIEF2yhl32dERt9j9MDGUTa2Eaa+o3YKL4Qqw55W9yQC6f44FdAHdAJrJvp0t+HVrfh8AiGj8A==", + "dev": true + }, + "node_modules/workbox-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-Es8Xr02Gi6Kc3zaUwR691ZLy61hz3vhhs5GztcklQ7kl5k2qAusPh0s6LF3wEtlpfs9ZDErnmy5SErwoll7jBA==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "6.5.3" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.9.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/workbox-window": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.3.tgz", + "integrity": "sha512-GnJbx1kcKXDtoJBVZs/P7ddP0Yt52NNy4nocjBpYPiRhMqTpJCNrSL+fGHZ/i/oP6p/vhE8II0sA6AZGKGnssw==", + "dev": true, + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.5.3" } }, "node_modules/wrap-ansi": { @@ -25876,16 +15302,33 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/wrap-ansi/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/wrap-ansi/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/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/ws": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", - "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", - "dev": true, + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "engines": { "node": ">=10.0.0" }, @@ -25939,20 +15382,24 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, "engines": { "node": ">=0.4" } }, "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true + "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": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "node_modules/yaml": { @@ -25964,9 +15411,9 @@ } }, "node_modules/yargs": { - "version": "17.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", - "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", "dev": true, "dependencies": { "cliui": "^7.0.2", @@ -25982,24 +15429,6 @@ } }, "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/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/yargs/node_modules/yargs-parser": { "version": "21.0.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", @@ -26008,26 +15437,13 @@ "node": ">=12" } }, - "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==", + "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": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node": ">=6" } } }, @@ -26036,7 +15452,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.1.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -26070,25 +15485,23 @@ "@babel/compat-data": { "version": "7.17.10", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", - "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", - "dev": true + "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==" }, "@babel/core": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.10.tgz", - "integrity": "sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA==", - "dev": true, + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", + "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.10", - "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.10", + "@babel/generator": "^7.18.2", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.2", + "@babel/parser": "^7.18.0", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.10", - "@babel/types": "^7.17.10", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -26097,21 +15510,31 @@ } }, "@babel/generator": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.10.tgz", - "integrity": "sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg==", - "dev": true, + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", "requires": { - "@babel/types": "^7.17.10", - "@jridgewell/gen-mapping": "^0.1.0", + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } } }, "@babel/helper-annotate-as-pure": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -26120,17 +15543,15 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", - "dev": true, "requires": { "@babel/helper-explode-assignable-expression": "^7.16.7", "@babel/types": "^7.16.7" } }, "@babel/helper-compilation-targets": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz", - "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==", - "dev": true, + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", + "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", "requires": { "@babel/compat-data": "^7.17.10", "@babel/helper-validator-option": "^7.16.7", @@ -26139,10 +15560,9 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", - "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz", + "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", @@ -26154,10 +15574,9 @@ } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", - "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz", + "integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "regexpu-core": "^5.0.1" @@ -26167,7 +15586,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", - "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", @@ -26180,19 +15598,14 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", + "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==" }, "@babel/helper-explode-assignable-expression": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -26201,7 +15614,6 @@ "version": "7.17.9", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", - "dev": true, "requires": { "@babel/template": "^7.16.7", "@babel/types": "^7.17.0" @@ -26211,7 +15623,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -26220,7 +15631,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", - "dev": true, "requires": { "@babel/types": "^7.17.0" } @@ -26234,10 +15644,9 @@ } }, "@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", + "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", "requires": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", @@ -26245,29 +15654,27 @@ "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" } }, "@babel/helper-optimise-call-expression": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } }, "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" }, "@babel/helper-remap-async-to-generator": { "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-wrap-function": "^7.16.8", @@ -26275,32 +15682,29 @@ } }, "@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "dev": true, + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz", + "integrity": "sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q==", "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-member-expression-to-functions": "^7.17.7", "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" } }, "@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "dev": true, + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", + "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", "requires": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.18.2" } }, "@babel/helper-skip-transparent-expression-wrappers": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", - "dev": true, "requires": { "@babel/types": "^7.16.0" } @@ -26309,7 +15713,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -26322,14 +15725,12 @@ "@babel/helper-validator-option": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" }, "@babel/helper-wrap-function": { "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", - "dev": true, "requires": { "@babel/helper-function-name": "^7.16.7", "@babel/template": "^7.16.7", @@ -26338,95 +15739,102 @@ } }, "@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", - "dev": true, + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", + "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", "requires": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" } }, "@babel/highlight": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", - "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", + "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", "requires": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, - "@babel/parser": { + "@babel/node": { "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.10.tgz", - "integrity": "sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ==", - "dev": true - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", - "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.17.10.tgz", + "integrity": "sha512-sFFMyvw23U8QOcTnLJnw2/Myr01e4+iLVy7rHAHrNSnXAfnwS3j2NqihpmZm7TotyNKKf/y8cJ96T5asY46eyw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/register": "^7.17.7", + "commander": "^4.0.1", + "core-js": "^3.22.1", + "node-environment-flags": "^1.0.5", + "regenerator-runtime": "^0.13.4", + "v8flags": "^3.1.1" + } + }, + "@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==" + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz", + "integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==", + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", - "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz", + "integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.7" + "@babel/plugin-proposal-optional-chaining": "^7.17.12" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", - "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz", + "integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-remap-async-to-generator": "^7.16.8", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz", + "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", - "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz", + "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.6", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-decorators": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.9.tgz", - "integrity": "sha512-EfH2LZ/vPa2wuPwJ26j+kYRkaubf89UlwxKXtxqEm57HrgSEYDB8t4swFP+p8LcI9yiP9ZRJJjo/58hS6BnaDA==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.2.tgz", + "integrity": "sha512-kbDISufFOxeczi0v4NQP3p5kIeW6izn/6klfWBrIIdGZZe4UpHR+QU03FAoWjGGd9SUXAwbw2pup1kaL4OQsJQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.9", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-replace-supers": "^7.18.2", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/plugin-syntax-decorators": "^7.17.0", + "@babel/plugin-syntax-decorators": "^7.17.12", "charcodes": "^0.2.0" } }, @@ -26434,59 +15842,44 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, - "@babel/plugin-proposal-export-default-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.16.7.tgz", - "integrity": "sha512-+cENpW1rgIjExn+o5c8Jw/4BuH4eGKKYvkMB8/0ZxFQ9mC0t4z09VsPIwNg6waF69QYC81zxGeAsREGuqQoKeg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-export-default-from": "^7.16.7" - } - }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz", + "integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", - "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz", + "integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz", + "integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz", + "integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, @@ -26494,83 +15887,75 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", - "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz", + "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==", "requires": { - "@babel/compat-data": "^7.17.0", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.7" + "@babel/plugin-transform-parameters": "^7.17.12" } }, "@babel/plugin-proposal-optional-catch-binding": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz", + "integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz", + "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz", + "integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", - "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz", + "integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -26588,7 +15973,6 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } @@ -26597,78 +15981,72 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-decorators": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.0.tgz", - "integrity": "sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.12.tgz", + "integrity": "sha512-D1Hz0qtGTza8K2xGyEdVNCYLdVHukAcbQr4K3/s6r/esadyEriZovpJimQOpu8ju4/jV8dW/1xdaE0UpDroidw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-export-default-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.16.7.tgz", - "integrity": "sha512-4C3E4NsrLOgftKaTYTULhHsuQrGv3FHrBzOMDiS7UYKIpgGBkAdawg4h+EI8zPeK9M0fiIIh72hIwsI24K7MbA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, "@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-flow": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz", - "integrity": "sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.17.12.tgz", + "integrity": "sha512-B8QIgBvkIG6G2jgsOHQUist7Sm0EBLDCx8sen072IwqNuzMegZNXrYnSv77cYzA8mLDZAfQYqsLIhimiP1s2HQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz", + "integrity": "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==", + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-jsx": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", - "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz", + "integrity": "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -26677,7 +16055,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -26686,7 +16063,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -26695,7 +16071,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -26704,7 +16079,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -26713,7 +16087,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -26722,7 +16095,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -26731,37 +16103,33 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-typescript": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.10.tgz", - "integrity": "sha512-xJefea1DWXW09pW4Tm9bjwVlPDyYA2it3fWlmEjpYz6alPvTUjL0EOzNzI/FEOyI3r4/J7uVH5UqKgl1TQ5hqQ==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz", + "integrity": "sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", - "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz", + "integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", - "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz", + "integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==", "requires": { "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-remap-async-to-generator": "^7.16.8" } }, @@ -26769,107 +16137,97 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", - "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", - "dev": true, + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz", + "integrity": "sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-classes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", - "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", - "dev": true, + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz", + "integrity": "sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-function-name": "^7.17.9", "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-replace-supers": "^7.18.2", "@babel/helper-split-export-declaration": "^7.16.7", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", - "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz", + "integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-destructuring": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", - "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz", + "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-dotall-regex": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", - "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", - "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz", + "integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-exponentiation-operator": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", - "dev": true, "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz", - "integrity": "sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.17.12.tgz", + "integrity": "sha512-g8cSNt+cHCpG/uunPQELdq/TeV3eg1OLJYwxypwHtAWo9+nErH3lQx9CSO2uI9lF74A0mR0t4KoMjs1snSgnTw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-flow": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-flow": "^7.17.12" } }, "@babel/plugin-transform-for-of": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", - "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", - "dev": true, + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz", + "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-function-name": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", - "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-function-name": "^7.16.7", @@ -26877,190 +16235,195 @@ } }, "@babel/plugin-transform-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", - "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz", + "integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-member-expression-literals": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", - "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz", + "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==", "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", - "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", - "dev": true, + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz", + "integrity": "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==", "requires": { - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-simple-access": "^7.18.2", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", - "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", - "dev": true, + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.4.tgz", + "integrity": "sha512-lH2UaQaHVOAeYrUUuZ8i38o76J/FnO8vu21OE+tD1MyP9lxdZoSfz+pDbWkq46GogUrdrMz3tiz/FYGB+bVThg==", "requires": { "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", - "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz", + "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==", "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.10.tgz", - "integrity": "sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz", + "integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.17.0" + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-new-target": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", - "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz", + "integrity": "sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-object-super": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-replace-supers": "^7.16.7" } }, "@babel/plugin-transform-parameters": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", - "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz", + "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-property-literals": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.12.tgz", + "integrity": "sha512-maEkX2xs2STuv2Px8QuqxqjhV2LsFobT1elCgyU5704fcyTu9DyD/bJXxD/mrRiVyhpHweOQ00OJ5FKhHq9oEw==", + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + } + }, "@babel/plugin-transform-react-display-name": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz", - "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz", + "integrity": "sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-jsx": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-jsx": "^7.17.12", + "@babel/types": "^7.17.12" } }, "@babel/plugin-transform-react-jsx-development": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", - "dev": true, "requires": { "@babel/plugin-transform-react-jsx": "^7.16.7" } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", - "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.0.tgz", + "integrity": "sha512-6+0IK6ouvqDn9bmEG7mEyF/pwlJXVj5lwydybpyyH3D0A7Hftk+NCTdYjnLNZksn261xaOV5ksmp20pQEmc2RQ==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-regenerator": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", - "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz", + "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==", "requires": { + "@babel/helper-plugin-utils": "^7.17.12", "regenerator-transform": "^0.15.0" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", - "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz", + "integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==", + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.2.tgz", + "integrity": "sha512-mr1ufuRMfS52ttq+1G1PD8OJNqgcTFjq3hwn8SZ5n1x1pBhi0E36rYMdTK0TsKtApJ4lDEdfXJwtGobQMHSMPg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" } }, "@babel/plugin-transform-shorthand-properties": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", - "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz", + "integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" } }, @@ -27068,45 +16431,40 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-template-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", - "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", - "dev": true, + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz", + "integrity": "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", - "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz", + "integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-typescript": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", - "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", - "dev": true, + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.4.tgz", + "integrity": "sha512-l4vHuSLUajptpHNEOUDEGsnpl9pfRLsN1XUoDQDD/YBuXTM+v37SHGS+c6n4jdcZy96QtuUuSvZYMLSSsjH8Mw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-typescript": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-typescript": "^7.17.12" } }, "@babel/plugin-transform-unicode-escapes": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -27115,44 +16473,43 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", - "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/preset-env": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.17.10.tgz", - "integrity": "sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g==", - "dev": true, + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz", + "integrity": "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==", "requires": { "@babel/compat-data": "^7.17.10", - "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-async-generator-functions": "^7.16.8", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-class-static-block": "^7.17.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-async-generator-functions": "^7.17.12", + "@babel/plugin-proposal-class-properties": "^7.17.12", + "@babel/plugin-proposal-class-static-block": "^7.18.0", "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.16.7", - "@babel/plugin-proposal-json-strings": "^7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.17.12", + "@babel/plugin-proposal-json-strings": "^7.17.12", + "@babel/plugin-proposal-logical-assignment-operators": "^7.17.12", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12", "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.17.3", + "@babel/plugin-proposal-object-rest-spread": "^7.18.0", "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.11", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-private-methods": "^7.17.12", + "@babel/plugin-proposal-private-property-in-object": "^7.17.12", + "@babel/plugin-proposal-unicode-property-regex": "^7.17.12", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.17.12", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -27162,40 +16519,40 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.7", - "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-arrow-functions": "^7.17.12", + "@babel/plugin-transform-async-to-generator": "^7.17.12", "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.16.7", - "@babel/plugin-transform-classes": "^7.16.7", - "@babel/plugin-transform-computed-properties": "^7.16.7", - "@babel/plugin-transform-destructuring": "^7.17.7", + "@babel/plugin-transform-block-scoping": "^7.17.12", + "@babel/plugin-transform-classes": "^7.17.12", + "@babel/plugin-transform-computed-properties": "^7.17.12", + "@babel/plugin-transform-destructuring": "^7.18.0", "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.17.12", "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.18.1", "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-literals": "^7.17.12", "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.17.9", - "@babel/plugin-transform-modules-systemjs": "^7.17.8", - "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.10", - "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.18.0", + "@babel/plugin-transform-modules-commonjs": "^7.18.2", + "@babel/plugin-transform-modules-systemjs": "^7.18.0", + "@babel/plugin-transform-modules-umd": "^7.18.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", + "@babel/plugin-transform-new-target": "^7.17.12", "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.17.12", "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.17.9", - "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.18.0", + "@babel/plugin-transform-reserved-words": "^7.17.12", "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-spread": "^7.17.12", "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.16.7", - "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.18.2", + "@babel/plugin-transform-typeof-symbol": "^7.17.12", "@babel/plugin-transform-unicode-escapes": "^7.16.7", "@babel/plugin-transform-unicode-regex": "^7.16.7", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.17.10", + "@babel/types": "^7.18.2", "babel-plugin-polyfill-corejs2": "^0.3.0", "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", @@ -27204,21 +16561,20 @@ } }, "@babel/preset-flow": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.16.7.tgz", - "integrity": "sha512-6ceP7IyZdUYQ3wUVqyRSQXztd1YmFHWI4Xv11MIqAlE4WqxBSd/FZ61V9k+TS5Gd4mkHOtQtPp9ymRpxH4y1Ug==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.17.12.tgz", + "integrity": "sha512-7QDz7k4uiaBdu7N89VKjUn807pJRXmdirQu0KyR9LXnQrr5Jt41eIMKTS7ljej+H29erwmMrwq9Io9mJHLI3Lw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-flow-strip-types": "^7.16.7" + "@babel/plugin-transform-flow-strip-types": "^7.17.12" } }, "@babel/preset-modules": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -27228,28 +16584,26 @@ } }, "@babel/preset-react": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz", - "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.17.12.tgz", + "integrity": "sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", "@babel/plugin-transform-react-display-name": "^7.16.7", - "@babel/plugin-transform-react-jsx": "^7.16.7", + "@babel/plugin-transform-react-jsx": "^7.17.12", "@babel/plugin-transform-react-jsx-development": "^7.16.7", "@babel/plugin-transform-react-pure-annotations": "^7.16.7" } }, "@babel/preset-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", - "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", - "dev": true, + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz", + "integrity": "sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.16.7" + "@babel/plugin-transform-typescript": "^7.17.12" } }, "@babel/register": { @@ -27266,28 +16620,17 @@ } }, "@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz", + "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", "requires": { "regenerator-runtime": "^0.13.4" } }, - "@babel/runtime-corejs3": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.9.tgz", - "integrity": "sha512-WxYHHUWF2uZ7Hp1K+D1xQgbgkGUfA+5UPOegEXGt2Y5SMog/rYCVaifLZDbw8UkNXozEqqrZTy6bglL7xTaCOw==", - "dev": true, - "requires": { - "core-js-pure": "^3.20.2", - "regenerator-runtime": "^0.13.4" - } - }, "@babel/template": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/parser": "^7.16.7", @@ -27295,44 +16638,65 @@ } }, "@babel/traverse": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.10.tgz", - "integrity": "sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw==", - "dev": true, + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", + "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", "requires": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.10", - "@babel/helper-environment-visitor": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-environment-visitor": "^7.18.2", "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.10", - "@babel/types": "^7.17.10", + "@babel/parser": "^7.18.0", + "@babel/types": "^7.18.2", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.10.tgz", - "integrity": "sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, "@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true }, + "@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, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@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, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, + "@csstools/selector-specificity": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-1.0.0.tgz", + "integrity": "sha512-RkYG5KiGNX0fJ5YoI0f4Wfq2Yo74D25Hru4fxTOioYdQvHBxcrrtTTyT5Ozzh2ejcNrhFy7IEts2WyEY7yi5yw==", + "dev": true, + "requires": {} + }, "@dabh/diagnostics": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", @@ -27369,55 +16733,6 @@ "stylis": "4.0.13" }, "dependencies": { - "@emotion/memoize": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", - "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" - }, - "@emotion/serialize": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.3.tgz", - "integrity": "sha512-2mSSvgLfyV3q+iVh3YWgNlUc2a9ZlDU7DjuP5MjK3AXRR0dYigCrP99aeFtaB2L/hjfEZdSThn5dsZ0ufqbvsA==", - "requires": { - "@emotion/hash": "^0.8.0", - "@emotion/memoize": "^0.7.4", - "@emotion/unitless": "^0.7.5", - "@emotion/utils": "^1.0.0", - "csstype": "^3.0.2" - } - }, - "@emotion/utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", - "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" - }, - "babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "requires": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - } - }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" - }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -27431,40 +16746,15 @@ } }, "@emotion/cache": { - "version": "10.0.29", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz", - "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", - "dev": true, + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", + "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", "requires": { - "@emotion/sheet": "0.9.4", - "@emotion/stylis": "0.8.5", - "@emotion/utils": "0.11.3", - "@emotion/weak-memoize": "0.2.5" - } - }, - "@emotion/core": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.3.1.tgz", - "integrity": "sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww==", - "dev": true, - "requires": { - "@babel/runtime": "^7.5.5", - "@emotion/cache": "^10.0.27", - "@emotion/css": "^10.0.27", - "@emotion/serialize": "^0.11.15", - "@emotion/sheet": "0.9.4", - "@emotion/utils": "0.11.3" - } - }, - "@emotion/css": { - "version": "10.0.27", - "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.27.tgz", - "integrity": "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==", - "dev": true, - "requires": { - "@emotion/serialize": "^0.11.15", - "@emotion/utils": "0.11.3", - "babel-plugin-emotion": "^10.0.27" + "@emotion/memoize": "^0.7.4", + "@emotion/sheet": "^1.1.0", + "@emotion/utils": "^1.0.0", + "@emotion/weak-memoize": "^0.2.5", + "stylis": "4.0.13" } }, "@emotion/hash": { @@ -27472,19 +16762,10 @@ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, - "@emotion/is-prop-valid": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", - "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", - "dev": true, - "requires": { - "@emotion/memoize": "0.7.4" - } - }, "@emotion/memoize": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", + "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" }, "@emotion/react": { "version": "11.9.0", @@ -27498,95 +16779,24 @@ "@emotion/utils": "^1.1.0", "@emotion/weak-memoize": "^0.2.5", "hoist-non-react-statics": "^3.3.1" - }, - "dependencies": { - "@emotion/cache": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", - "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", - "requires": { - "@emotion/memoize": "^0.7.4", - "@emotion/sheet": "^1.1.0", - "@emotion/utils": "^1.0.0", - "@emotion/weak-memoize": "^0.2.5", - "stylis": "4.0.13" - } - }, - "@emotion/serialize": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.3.tgz", - "integrity": "sha512-2mSSvgLfyV3q+iVh3YWgNlUc2a9ZlDU7DjuP5MjK3AXRR0dYigCrP99aeFtaB2L/hjfEZdSThn5dsZ0ufqbvsA==", - "requires": { - "@emotion/hash": "^0.8.0", - "@emotion/memoize": "^0.7.4", - "@emotion/unitless": "^0.7.5", - "@emotion/utils": "^1.0.0", - "csstype": "^3.0.2" - } - }, - "@emotion/sheet": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", - "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" - }, - "@emotion/utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", - "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" - }, - "csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" - } } }, "@emotion/serialize": { - "version": "0.11.16", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", - "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", - "dev": true, + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.3.tgz", + "integrity": "sha512-2mSSvgLfyV3q+iVh3YWgNlUc2a9ZlDU7DjuP5MjK3AXRR0dYigCrP99aeFtaB2L/hjfEZdSThn5dsZ0ufqbvsA==", "requires": { - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/unitless": "0.7.5", - "@emotion/utils": "0.11.3", - "csstype": "^2.5.7" + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.4", + "@emotion/unitless": "^0.7.5", + "@emotion/utils": "^1.0.0", + "csstype": "^3.0.2" } }, "@emotion/sheet": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz", - "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==", - "dev": true - }, - "@emotion/styled": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-10.3.0.tgz", - "integrity": "sha512-GgcUpXBBEU5ido+/p/mCT2/Xx+Oqmp9JzQRuC+a4lYM4i4LBBn/dWvc0rQ19N9ObA8/T4NWMrPNe79kMBDJqoQ==", - "dev": true, - "requires": { - "@emotion/styled-base": "^10.3.0", - "babel-plugin-emotion": "^10.0.27" - } - }, - "@emotion/styled-base": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@emotion/styled-base/-/styled-base-10.3.0.tgz", - "integrity": "sha512-PBRqsVKR7QRNkmfH78hTSSwHWcwDpecH9W6heujWAcyp2wdz/64PP73s7fWS1dIPm8/Exc8JAzYS8dEWXjv60w==", - "dev": true, - "requires": { - "@babel/runtime": "^7.5.5", - "@emotion/is-prop-valid": "0.8.8", - "@emotion/serialize": "^0.11.15", - "@emotion/utils": "0.11.3" - } - }, - "@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", + "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" }, "@emotion/unitless": { "version": "0.7.5", @@ -27594,207 +16804,145 @@ "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, "@emotion/utils": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", - "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", + "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" }, "@emotion/weak-memoize": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, - "@fullhuman/postcss-purgecss": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.3.0.tgz", - "integrity": "sha512-qnKm5dIOyPGJ70kPZ5jiz0I9foVOic0j+cOzNDoo8KoCf6HjicIZ99UfO2OmE7vCYSKAAepEwJtNzpiiZAh9xw==", + "@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "dev": true, "requires": { - "postcss": "7.0.32", - "purgecss": "^2.3.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "dependencies": { - "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "globals": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "type-fest": "^0.20.2" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true } } }, - "@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, - "@hypnosphi/create-react-context": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz", - "integrity": "sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A==", + "@fluentui/react-component-event-listener": { + "version": "0.63.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-component-event-listener/-/react-component-event-listener-0.63.0.tgz", + "integrity": "sha512-3OfmzM4rXf8yeB1GaDBKcdkO0UQN8rafygsp9CeC1x85gO6uv/TgnjC3co6kcxZ8GtVqU1YyH5SjJQgNOmKvXw==", "requires": { - "gud": "^1.0.0", - "warning": "^4.0.3" + "@babel/runtime": "^7.10.4" } }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "@fluentui/react-component-ref": { + "version": "0.63.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-component-ref/-/react-component-ref-0.63.0.tgz", + "integrity": "sha512-s4Wawk3Jp/cLRu3QlCtRMm1jYMi8fq7PLd6I2VYb397NgpLdMbO4/edqDHbDhKiVWRIulrOqWlRLR5YXjkXQ7A==", + "requires": { + "@babel/runtime": "^7.10.4", + "react-is": "^16.6.3" + } + }, + "@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, "@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, "requires": { "@jridgewell/set-array": "^1.0.0", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "@jridgewell/resolve-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz", - "integrity": "sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw==", - "dev": true + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", + "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==" }, "@jridgewell/set-array": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.0.tgz", - "integrity": "sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", + "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==" + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", - "dev": true + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", + "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==" }, "@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, + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", + "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "@mdx-js/mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", - "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", - "dev": true, - "requires": { - "@babel/core": "7.12.9", - "@babel/plugin-syntax-jsx": "7.12.1", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "1.6.22", - "babel-plugin-apply-mdx-type-prop": "1.6.22", - "babel-plugin-extract-import-names": "1.6.22", - "camelcase-css": "2.0.1", - "detab": "2.0.4", - "hast-util-raw": "6.0.1", - "lodash.uniq": "4.5.0", - "mdast-util-to-hast": "10.0.1", - "remark-footnotes": "2.0.0", - "remark-mdx": "1.6.22", - "remark-parse": "8.0.3", - "remark-squeeze-paragraphs": "4.0.0", - "style-to-object": "0.3.0", - "unified": "9.2.0", - "unist-builder": "2.0.3", - "unist-util-visit": "2.0.3" - }, - "dependencies": { - "@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@mdx-js/util": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", + "@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - }, - "dependencies": { - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - } - } - }, "@nicolo-ribaudo/chokidar-2": { "version": "2.1.8-no-fsevents.3", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", @@ -27828,69 +16976,6 @@ "fastq": "^1.6.0" } }, - "@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "dev": true, - "requires": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - }, - "dependencies": { - "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, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "@openreplay/sourcemap-uploader": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@openreplay/sourcemap-uploader/-/sourcemap-uploader-3.0.6.tgz", @@ -27901,28 +16986,16 @@ "glob-promise": "^3.4.0" } }, - "@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.5.tgz", - "integrity": "sha512-RbG7h6TuP6nFFYKJwbcToA1rjC1FyPg25NR2noAZ0vKI+la01KTSRPkuVPE+U88jXv7javx2JHglUcL1MHcshQ==", - "dev": true, - "requires": { - "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", - "core-js-pure": "^3.8.1", - "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", - "html-entities": "^2.1.0", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "source-map": "^0.7.3" - } + "@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "dev": true }, "@popperjs/core": { "version": "2.11.5", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", - "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==", - "dev": true + "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==" }, "@react-dnd/asap": { "version": "4.0.1", @@ -27939,10 +17012,63 @@ "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-3.0.1.tgz", "integrity": "sha512-XjDVbs3ZU16CO1h5Q3Ew2RPJqmZBDE/EVf1LYp6ePEffs3V/MX9ZbL5bJr8qiK5SbGmUMuDoaFgyKacYz8prRA==" }, + "@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + } + }, + "@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + } + }, + "@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + } + } + }, "@semantic-ui-react/event-stack": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@semantic-ui-react/event-stack/-/event-stack-3.1.2.tgz", - "integrity": "sha512-Yd0Qf7lPCIjzJ9bZYfurlNu2RDXT6KKSyubHfYK3WjRauhxCsq6Fk2LMRI9DEvShoEU+AsLSv3NGkqXAcVp0zg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@semantic-ui-react/event-stack/-/event-stack-3.1.3.tgz", + "integrity": "sha512-FdTmJyWvJaYinHrKRsMLDrz4tTMGdFfds299Qory53hBugiDvGC0tEJf+cHsi5igDwWb/CLOgOiChInHwq8URQ==", "requires": { "exenv": "^1.2.2", "prop-types": "^15.6.2" @@ -28010,1372 +17136,16 @@ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" }, - "@storybook/addons": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.22.tgz", - "integrity": "sha512-P/R+Jsxh7pawKLYo8MtE3QU/ilRFKbtCewV/T1o5U/gm8v7hKQdFz3YdRMAra4QuCY8bQIp7MKd2HrB5aH5a1A==", + "@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", "dev": true, "requires": { - "@storybook/api": "6.4.22", - "@storybook/channels": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/router": "6.4.22", - "@storybook/theming": "6.4.22", - "@types/webpack-env": "^1.16.0", - "core-js": "^3.8.2", - "global": "^4.4.0", - "regenerator-runtime": "^0.13.7" - } - }, - "@storybook/api": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.22.tgz", - "integrity": "sha512-lAVI3o2hKupYHXFTt+1nqFct942up5dHH6YD7SZZJGyW21dwKC3HK1IzCsTawq3fZAKkgWFgmOO649hKk60yKg==", - "dev": true, - "requires": { - "@storybook/channels": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/router": "6.4.22", - "@storybook/semver": "^7.3.2", - "@storybook/theming": "6.4.22", - "core-js": "^3.8.2", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "regenerator-runtime": "^0.13.7", - "store2": "^2.12.0", - "telejson": "^5.3.2", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - } - }, - "@storybook/builder-webpack4": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/builder-webpack4/-/builder-webpack4-6.4.22.tgz", - "integrity": "sha512-A+GgGtKGnBneRFSFkDarUIgUTI8pYFdLmUVKEAGdh2hL+vLXAz9A46sEY7C8LQ85XWa8TKy3OTDxqR4+4iWj3A==", - "dev": true, - "requires": { - "@babel/core": "^7.12.10", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-decorators": "^7.12.12", - "@babel/plugin-proposal-export-default-from": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.7", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.12", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/preset-env": "^7.12.11", - "@babel/preset-react": "^7.12.10", - "@babel/preset-typescript": "^7.12.7", - "@storybook/addons": "6.4.22", - "@storybook/api": "6.4.22", - "@storybook/channel-postmessage": "6.4.22", - "@storybook/channels": "6.4.22", - "@storybook/client-api": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/components": "6.4.22", - "@storybook/core-common": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/node-logger": "6.4.22", - "@storybook/preview-web": "6.4.22", - "@storybook/router": "6.4.22", - "@storybook/semver": "^7.3.2", - "@storybook/store": "6.4.22", - "@storybook/theming": "6.4.22", - "@storybook/ui": "6.4.22", - "@types/node": "^14.0.10", - "@types/webpack": "^4.41.26", - "autoprefixer": "^9.8.6", - "babel-loader": "^8.0.0", - "babel-plugin-macros": "^2.8.0", - "babel-plugin-polyfill-corejs3": "^0.1.0", - "case-sensitive-paths-webpack-plugin": "^2.3.0", - "core-js": "^3.8.2", - "css-loader": "^3.6.0", - "file-loader": "^6.2.0", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^4.1.6", - "glob": "^7.1.6", - "glob-promise": "^3.4.0", - "global": "^4.4.0", - "html-webpack-plugin": "^4.0.0", - "pnp-webpack-plugin": "1.6.4", - "postcss": "^7.0.36", - "postcss-flexbugs-fixes": "^4.2.1", - "postcss-loader": "^4.2.0", - "raw-loader": "^4.0.2", - "stable": "^0.1.8", - "style-loader": "^1.3.0", - "terser-webpack-plugin": "^4.2.3", - "ts-dedent": "^2.0.0", - "url-loader": "^4.1.1", - "util-deprecate": "^1.0.2", - "webpack": "4", - "webpack-dev-middleware": "^3.7.3", - "webpack-filter-warnings-plugin": "^1.2.1", - "webpack-hot-middleware": "^2.25.1", - "webpack-virtual-modules": "^0.2.2" - }, - "dependencies": { - "@babel/helper-define-polyfill-provider": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz", - "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - } - }, - "autoprefixer": { - "version": "9.8.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", - "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "picocolors": "^0.2.1", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - } - }, - "babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", - "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.1.5", - "core-js-compat": "^3.8.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fork-ts-checker-webpack-plugin": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", - "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.5.5", - "chalk": "^2.4.1", - "micromatch": "^3.1.10", - "minimatch": "^3.0.4", - "semver": "^5.6.0", - "tapable": "^1.0.0", - "worker-rpc": "^0.1.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "html-webpack-plugin": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz", - "integrity": "sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==", - "dev": true, - "requires": { - "@types/html-minifier-terser": "^5.0.0", - "@types/tapable": "^1.0.5", - "@types/webpack": "^4.41.8", - "html-minifier-terser": "^5.0.1", - "loader-utils": "^1.2.3", - "lodash": "^4.17.20", - "pretty-error": "^2.1.1", - "tapable": "^1.1.3", - "util.promisify": "1.0.0" - }, - "dependencies": { - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "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, - "requires": { - "yallist": "^4.0.0" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz", - "integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==", - "dev": true, - "requires": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.4" - }, - "dependencies": { - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "style-loader": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", - "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^2.7.0" - }, - "dependencies": { - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@storybook/channel-postmessage": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-6.4.22.tgz", - "integrity": "sha512-gt+0VZLszt2XZyQMh8E94TqjHZ8ZFXZ+Lv/Mmzl0Yogsc2H+6VzTTQO4sv0IIx6xLbpgG72g5cr8VHsxW5kuDQ==", - "dev": true, - "requires": { - "@storybook/channels": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/core-events": "6.4.22", - "core-js": "^3.8.2", - "global": "^4.4.0", - "qs": "^6.10.0", - "telejson": "^5.3.2" - } - }, - "@storybook/channel-websocket": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-6.4.22.tgz", - "integrity": "sha512-Bm/FcZ4Su4SAK5DmhyKKfHkr7HiHBui6PNutmFkASJInrL9wBduBfN8YQYaV7ztr8ezoHqnYRx8sj28jpwa6NA==", - "dev": true, - "requires": { - "@storybook/channels": "6.4.22", - "@storybook/client-logger": "6.4.22", - "core-js": "^3.8.2", - "global": "^4.4.0", - "telejson": "^5.3.2" - } - }, - "@storybook/channels": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.22.tgz", - "integrity": "sha512-cfR74tu7MLah1A8Rru5sak71I+kH2e/sY6gkpVmlvBj4hEmdZp4Puj9PTeaKcMXh9DgIDPNA5mb8yvQH6VcyxQ==", - "dev": true, - "requires": { - "core-js": "^3.8.2", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - } - }, - "@storybook/client-api": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-6.4.22.tgz", - "integrity": "sha512-sO6HJNtrrdit7dNXQcZMdlmmZG1k6TswH3gAyP/DoYajycrTwSJ6ovkarzkO+0QcJ+etgra4TEdTIXiGHBMe/A==", - "dev": true, - "requires": { - "@storybook/addons": "6.4.22", - "@storybook/channel-postmessage": "6.4.22", - "@storybook/channels": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/store": "6.4.22", - "@types/qs": "^6.9.5", - "@types/webpack-env": "^1.16.0", - "core-js": "^3.8.2", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7", - "store2": "^2.12.0", - "synchronous-promise": "^2.0.15", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - } - }, - "@storybook/client-logger": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.22.tgz", - "integrity": "sha512-LXhxh/lcDsdGnK8kimqfhu3C0+D2ylCSPPQNbU0IsLRmTfbpQYMdyl0XBjPdHiRVwlL7Gkw5OMjYemQgJ02zlw==", - "dev": true, - "requires": { - "core-js": "^3.8.2", - "global": "^4.4.0" - } - }, - "@storybook/components": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-6.4.22.tgz", - "integrity": "sha512-dCbXIJF9orMvH72VtAfCQsYbe57OP7fAADtR6YTwfCw9Sm1jFuZr8JbblQ1HcrXEoJG21nOyad3Hm5EYVb/sBw==", - "dev": true, - "requires": { - "@popperjs/core": "^2.6.0", - "@storybook/client-logger": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/theming": "6.4.22", - "@types/color-convert": "^2.0.0", - "@types/overlayscrollbars": "^1.12.0", - "@types/react-syntax-highlighter": "11.0.5", - "color-convert": "^2.0.1", - "core-js": "^3.8.2", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "lodash": "^4.17.21", - "markdown-to-jsx": "^7.1.3", - "memoizerific": "^1.11.3", - "overlayscrollbars": "^1.13.1", - "polished": "^4.0.5", - "prop-types": "^15.7.2", - "react-colorful": "^5.1.2", - "react-popper-tooltip": "^3.1.1", - "react-syntax-highlighter": "^13.5.3", - "react-textarea-autosize": "^8.3.0", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - } - }, - "@storybook/core": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-6.4.22.tgz", - "integrity": "sha512-KZYJt7GM5NgKFXbPRZZZPEONZ5u/tE/cRbMdkn/zWN3He8+VP+65/tz8hbriI/6m91AWVWkBKrODSkeq59NgRA==", - "dev": true, - "requires": { - "@storybook/core-client": "6.4.22", - "@storybook/core-server": "6.4.22" - } - }, - "@storybook/core-client": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-6.4.22.tgz", - "integrity": "sha512-uHg4yfCBeM6eASSVxStWRVTZrAnb4FT6X6v/xDqr4uXCpCttZLlBzrSDwPBLNNLtCa7ntRicHM8eGKIOD5lMYQ==", - "dev": true, - "requires": { - "@storybook/addons": "6.4.22", - "@storybook/channel-postmessage": "6.4.22", - "@storybook/channel-websocket": "6.4.22", - "@storybook/client-api": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/preview-web": "6.4.22", - "@storybook/store": "6.4.22", - "@storybook/ui": "6.4.22", - "airbnb-js-shims": "^2.2.1", - "ansi-to-html": "^0.6.11", - "core-js": "^3.8.2", - "global": "^4.4.0", - "lodash": "^4.17.21", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0", - "unfetch": "^4.2.0", - "util-deprecate": "^1.0.2" - } - }, - "@storybook/core-common": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-6.4.22.tgz", - "integrity": "sha512-PD3N/FJXPNRHeQS2zdgzYFtqPLdi3MLwAicbnw+U3SokcsspfsAuyYHZOYZgwO8IAEKy6iCc7TpBdiSJZ/vAKQ==", - "dev": true, - "requires": { - "@babel/core": "^7.12.10", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-decorators": "^7.12.12", - "@babel/plugin-proposal-export-default-from": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.7", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.12", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/preset-env": "^7.12.11", - "@babel/preset-react": "^7.12.10", - "@babel/preset-typescript": "^7.12.7", - "@babel/register": "^7.12.1", - "@storybook/node-logger": "6.4.22", - "@storybook/semver": "^7.3.2", - "@types/node": "^14.0.10", - "@types/pretty-hrtime": "^1.0.0", - "babel-loader": "^8.0.0", - "babel-plugin-macros": "^3.0.1", - "babel-plugin-polyfill-corejs3": "^0.1.0", - "chalk": "^4.1.0", - "core-js": "^3.8.2", - "express": "^4.17.1", - "file-system-cache": "^1.0.5", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.0.4", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "handlebars": "^4.7.7", - "interpret": "^2.2.0", - "json5": "^2.1.3", - "lazy-universal-dotenv": "^3.0.1", - "picomatch": "^2.3.0", - "pkg-dir": "^5.0.0", - "pretty-hrtime": "^1.0.3", - "resolve-from": "^5.0.0", - "slash": "^3.0.0", - "telejson": "^5.3.2", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2", - "webpack": "4" - }, - "dependencies": { - "@babel/helper-define-polyfill-provider": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz", - "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - } - }, - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", - "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.1.5", - "core-js-compat": "^3.8.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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 - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@storybook/core-events": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.22.tgz", - "integrity": "sha512-5GYY5+1gd58Gxjqex27RVaX6qbfIQmJxcbzbNpXGNSqwqAuIIepcV1rdCVm6I4C3Yb7/AQ3cN5dVbf33QxRIwA==", - "dev": true, - "requires": { - "core-js": "^3.8.2" - } - }, - "@storybook/core-server": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-6.4.22.tgz", - "integrity": "sha512-wFh3e2fa0un1d4+BJP+nd3FVWUO7uHTqv3OGBfOmzQMKp4NU1zaBNdSQG7Hz6mw0fYPBPZgBjPfsJRwIYLLZyw==", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "^0.5.3", - "@storybook/builder-webpack4": "6.4.22", - "@storybook/core-client": "6.4.22", - "@storybook/core-common": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/csf-tools": "6.4.22", - "@storybook/manager-webpack4": "6.4.22", - "@storybook/node-logger": "6.4.22", - "@storybook/semver": "^7.3.2", - "@storybook/store": "6.4.22", - "@types/node": "^14.0.10", - "@types/node-fetch": "^2.5.7", - "@types/pretty-hrtime": "^1.0.0", - "@types/webpack": "^4.41.26", - "better-opn": "^2.1.1", - "boxen": "^5.1.2", - "chalk": "^4.1.0", - "cli-table3": "^0.6.1", - "commander": "^6.2.1", - "compression": "^1.7.4", - "core-js": "^3.8.2", - "cpy": "^8.1.2", - "detect-port": "^1.3.0", - "express": "^4.17.1", - "file-system-cache": "^1.0.5", - "fs-extra": "^9.0.1", - "globby": "^11.0.2", - "ip": "^1.1.5", - "lodash": "^4.17.21", - "node-fetch": "^2.6.1", - "pretty-hrtime": "^1.0.3", - "prompts": "^2.4.0", - "regenerator-runtime": "^0.13.7", - "serve-favicon": "^2.5.0", - "slash": "^3.0.0", - "telejson": "^5.3.3", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2", - "watchpack": "^2.2.0", - "webpack": "4", - "ws": "^8.2.3" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true - }, - "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 - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@storybook/csf": { - "version": "0.0.2--canary.87bc651.0", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.2--canary.87bc651.0.tgz", - "integrity": "sha512-ajk1Uxa+rBpFQHKrCcTmJyQBXZ5slfwHVEaKlkuFaW77it8RgbPJp/ccna3sgoi8oZ7FkkOyvv1Ve4SmwFqRqw==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "@storybook/csf-tools": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-6.4.22.tgz", - "integrity": "sha512-LMu8MZAiQspJAtMBLU2zitsIkqQv7jOwX7ih5JrXlyaDticH7l2j6Q+1mCZNWUOiMTizj0ivulmUsSaYbpToSw==", - "dev": true, - "requires": { - "@babel/core": "^7.12.10", - "@babel/generator": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/plugin-transform-react-jsx": "^7.12.12", - "@babel/preset-env": "^7.12.11", - "@babel/traverse": "^7.12.11", - "@babel/types": "^7.12.11", - "@mdx-js/mdx": "^1.6.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "core-js": "^3.8.2", - "fs-extra": "^9.0.1", - "global": "^4.4.0", - "js-string-escape": "^1.0.1", - "lodash": "^4.17.21", - "prettier": ">=2.2.1 <=2.3.0", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0" - } - }, - "@storybook/manager-webpack4": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/manager-webpack4/-/manager-webpack4-6.4.22.tgz", - "integrity": "sha512-nzhDMJYg0vXdcG0ctwE6YFZBX71+5NYaTGkxg3xT7gbgnP1YFXn9gVODvgq3tPb3gcRapjyOIxUa20rV+r8edA==", - "dev": true, - "requires": { - "@babel/core": "^7.12.10", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/preset-react": "^7.12.10", - "@storybook/addons": "6.4.22", - "@storybook/core-client": "6.4.22", - "@storybook/core-common": "6.4.22", - "@storybook/node-logger": "6.4.22", - "@storybook/theming": "6.4.22", - "@storybook/ui": "6.4.22", - "@types/node": "^14.0.10", - "@types/webpack": "^4.41.26", - "babel-loader": "^8.0.0", - "case-sensitive-paths-webpack-plugin": "^2.3.0", - "chalk": "^4.1.0", - "core-js": "^3.8.2", - "css-loader": "^3.6.0", - "express": "^4.17.1", - "file-loader": "^6.2.0", - "file-system-cache": "^1.0.5", - "find-up": "^5.0.0", - "fs-extra": "^9.0.1", - "html-webpack-plugin": "^4.0.0", - "node-fetch": "^2.6.1", - "pnp-webpack-plugin": "1.6.4", - "read-pkg-up": "^7.0.1", - "regenerator-runtime": "^0.13.7", - "resolve-from": "^5.0.0", - "style-loader": "^1.3.0", - "telejson": "^5.3.2", - "terser-webpack-plugin": "^4.2.3", - "ts-dedent": "^2.0.0", - "url-loader": "^4.1.1", - "util-deprecate": "^1.0.2", - "webpack": "4", - "webpack-dev-middleware": "^3.7.3", - "webpack-virtual-modules": "^0.2.2" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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 - }, - "html-webpack-plugin": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz", - "integrity": "sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==", - "dev": true, - "requires": { - "@types/html-minifier-terser": "^5.0.0", - "@types/tapable": "^1.0.5", - "@types/webpack": "^4.41.8", - "html-minifier-terser": "^5.0.1", - "loader-utils": "^1.2.3", - "lodash": "^4.17.20", - "pretty-error": "^2.1.1", - "tapable": "^1.1.3", - "util.promisify": "1.0.0" - }, - "dependencies": { - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - }, - "style-loader": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", - "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^2.7.0" - } - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@storybook/node-logger": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-6.4.22.tgz", - "integrity": "sha512-sUXYFqPxiqM7gGH7gBXvO89YEO42nA4gBicJKZjj9e+W4QQLrftjF9l+mAw2K0mVE10Bn7r4pfs5oEZ0aruyyA==", - "dev": true, - "requires": { - "@types/npmlog": "^4.1.2", - "chalk": "^4.1.0", - "core-js": "^3.8.2", - "npmlog": "^5.0.1", - "pretty-hrtime": "^1.0.3" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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 - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@storybook/preview-web": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/preview-web/-/preview-web-6.4.22.tgz", - "integrity": "sha512-sWS+sgvwSvcNY83hDtWUUL75O2l2LY/GTAS0Zp2dh3WkObhtuJ/UehftzPZlZmmv7PCwhb4Q3+tZDKzMlFxnKQ==", - "dev": true, - "requires": { - "@storybook/addons": "6.4.22", - "@storybook/channel-postmessage": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/store": "6.4.22", - "ansi-to-html": "^0.6.11", - "core-js": "^3.8.2", - "global": "^4.4.0", - "lodash": "^4.17.21", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7", - "synchronous-promise": "^2.0.15", - "ts-dedent": "^2.0.0", - "unfetch": "^4.2.0", - "util-deprecate": "^1.0.2" - } - }, - "@storybook/react": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-6.4.22.tgz", - "integrity": "sha512-5BFxtiguOcePS5Ty/UoH7C6odmvBYIZutfiy4R3Ua6FYmtxac5vP9r5KjCz1IzZKT8mCf4X+PuK1YvDrPPROgQ==", - "dev": true, - "requires": { - "@babel/preset-flow": "^7.12.1", - "@babel/preset-react": "^7.12.10", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.1", - "@storybook/addons": "6.4.22", - "@storybook/core": "6.4.22", - "@storybook/core-common": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/node-logger": "6.4.22", - "@storybook/react-docgen-typescript-plugin": "1.0.2-canary.253f8c1.0", - "@storybook/semver": "^7.3.2", - "@storybook/store": "6.4.22", - "@types/webpack-env": "^1.16.0", - "babel-plugin-add-react-displayname": "^0.0.5", - "babel-plugin-named-asset-import": "^0.3.1", - "babel-plugin-react-docgen": "^4.2.1", - "core-js": "^3.8.2", - "global": "^4.4.0", - "lodash": "^4.17.21", - "prop-types": "^15.7.2", - "react-refresh": "^0.11.0", - "read-pkg-up": "^7.0.1", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0", - "webpack": "4" - } - }, - "@storybook/react-docgen-typescript-plugin": { - "version": "1.0.2-canary.253f8c1.0", - "resolved": "https://registry.npmjs.org/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.2-canary.253f8c1.0.tgz", - "integrity": "sha512-mmoRG/rNzAiTbh+vGP8d57dfcR2aP+5/Ll03KKFyfy5FqWFm/Gh7u27ikx1I3LmVMI8n6jh5SdWMkMKon7/tDw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "endent": "^2.0.1", - "find-cache-dir": "^3.3.1", - "flat-cache": "^3.0.4", - "micromatch": "^4.0.2", - "react-docgen-typescript": "^2.0.0", - "tslib": "^2.0.0" - }, - "dependencies": { - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "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, - "requires": { - "p-limit": "^2.2.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - } - } - }, - "@storybook/router": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.22.tgz", - "integrity": "sha512-zeuE8ZgFhNerQX8sICQYNYL65QEi3okyzw7ynF58Ud6nRw4fMxSOHcj2T+nZCIU5ufozRL4QWD/Rg9P2s/HtLw==", - "dev": true, - "requires": { - "@storybook/client-logger": "6.4.22", - "core-js": "^3.8.2", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "history": "5.0.0", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "react-router": "^6.0.0", - "react-router-dom": "^6.0.0", - "ts-dedent": "^2.0.0" - }, - "dependencies": { - "react-router": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz", - "integrity": "sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==", - "dev": true, - "requires": { - "history": "^5.2.0" - }, - "dependencies": { - "history": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", - "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.6" - } - } - } - }, - "react-router-dom": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz", - "integrity": "sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==", - "dev": true, - "requires": { - "history": "^5.2.0", - "react-router": "6.3.0" - }, - "dependencies": { - "history": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", - "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.6" - } - } - } - } - } - }, - "@storybook/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", - "dev": true, - "requires": { - "core-js": "^3.6.5", - "find-up": "^4.1.0" - }, - "dependencies": { - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "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, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "@storybook/store": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/store/-/store-6.4.22.tgz", - "integrity": "sha512-lrmcZtYJLc2emO+1l6AG4Txm9445K6Pyv9cGAuhOJ9Kks0aYe0YtvMkZVVry0RNNAIv6Ypz72zyKc/QK+tZLAQ==", - "dev": true, - "requires": { - "@storybook/addons": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "core-js": "^3.8.2", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "regenerator-runtime": "^0.13.7", - "slash": "^3.0.0", - "stable": "^0.1.8", - "synchronous-promise": "^2.0.15", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, - "@storybook/theming": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.22.tgz", - "integrity": "sha512-NVMKH/jxSPtnMTO4VCN1k47uztq+u9fWv4GSnzq/eezxdGg9ceGL4/lCrNGoNajht9xbrsZ4QvsJ/V2sVGM8wA==", - "dev": true, - "requires": { - "@emotion/core": "^10.1.1", - "@emotion/is-prop-valid": "^0.8.6", - "@emotion/styled": "^10.0.27", - "@storybook/client-logger": "6.4.22", - "core-js": "^3.8.2", - "deep-object-diff": "^1.1.0", - "emotion-theming": "^10.0.27", - "global": "^4.4.0", - "memoizerific": "^1.11.3", - "polished": "^4.0.5", - "resolve-from": "^5.0.0", - "ts-dedent": "^2.0.0" - } - }, - "@storybook/ui": { - "version": "6.4.22", - "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-6.4.22.tgz", - "integrity": "sha512-UVjMoyVsqPr+mkS1L7m30O/xrdIEgZ5SCWsvqhmyMUok3F3tRB+6M+OA5Yy+cIVfvObpA7MhxirUT1elCGXsWQ==", - "dev": true, - "requires": { - "@emotion/core": "^10.1.1", - "@storybook/addons": "6.4.22", - "@storybook/api": "6.4.22", - "@storybook/channels": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/components": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/router": "6.4.22", - "@storybook/semver": "^7.3.2", - "@storybook/theming": "6.4.22", - "copy-to-clipboard": "^3.3.1", - "core-js": "^3.8.2", - "core-js-pure": "^3.8.2", - "downshift": "^6.0.15", - "emotion-theming": "^10.0.27", - "fuse.js": "^3.6.1", - "global": "^4.4.0", - "lodash": "^4.17.21", - "markdown-to-jsx": "^7.1.3", - "memoizerific": "^1.11.3", - "polished": "^4.0.5", - "qs": "^6.10.0", - "react-draggable": "^4.4.3", - "react-helmet-async": "^1.0.7", - "react-sizeme": "^3.0.1", - "regenerator-runtime": "^0.13.7", - "resolve-from": "^5.0.0", - "store2": "^2.12.0" + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" } }, "@svg-maps/world": { @@ -29383,74 +17153,239 @@ "resolved": "https://registry.npmjs.org/@svg-maps/world/-/world-1.0.1.tgz", "integrity": "sha512-Mawh/jEYBBHnug9S17PyePLYKJ+Xd0Bbh96mCePebpbvcbJu5YKpfKhpyMeLFmmdWPrSFxl0f0MTsJfXU0gSaQ==" }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz", + "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==", + "requires": {} + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz", + "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==", + "requires": {} + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz", + "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==", + "requires": {} + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz", + "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==", + "requires": {} + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz", + "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==", + "requires": {} + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz", + "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==", + "requires": {} + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz", + "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==", + "requires": {} + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz", + "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==", + "requires": {} + }, + "@svgr/babel-preset": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.2.0.tgz", + "integrity": "sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ==", + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^6.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^6.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^6.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "^6.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "^6.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "^6.0.0", + "@svgr/babel-plugin-transform-svg-component": "^6.2.0" + } + }, + "@svgr/core": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.2.1.tgz", + "integrity": "sha512-NWufjGI2WUyrg46mKuySfviEJ6IxHUOm/8a3Ph38VCWSp+83HBraCQrpEM3F3dB6LBs5x8OElS8h3C0oOJaJAA==", + "requires": { + "@svgr/plugin-jsx": "^6.2.1", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz", + "integrity": "sha512-pt7MMkQFDlWJVy9ULJ1h+hZBDGFfSCwlBNW1HkLnVi7jUhyEXUaGYWi1x6bM2IXuAR9l265khBT4Av4lPmaNLQ==", + "requires": { + "@babel/types": "^7.15.6", + "entities": "^3.0.1" + } + }, + "@svgr/plugin-jsx": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz", + "integrity": "sha512-u+MpjTsLaKo6r3pHeeSVsh9hmGRag2L7VzApWIaS8imNguqoUwDq/u6U/NDmYs/KAsrmtBjOEaAAPbwNGXXp1g==", + "requires": { + "@babel/core": "^7.15.5", + "@svgr/babel-preset": "^6.2.0", + "@svgr/hast-util-to-babel-ast": "^6.2.1", + "svg-parser": "^2.0.2" + } + }, + "@svgr/plugin-svgo": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.2.0.tgz", + "integrity": "sha512-oDdMQONKOJEbuKwuy4Np6VdV6qoaLLvoY86hjvQEgU82Vx1MSWRyYms6Sl0f+NtqxLI/rDVufATbP/ev996k3Q==", + "requires": { + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "svgo": "^2.5.0" + } + }, + "@svgr/webpack": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.2.1.tgz", + "integrity": "sha512-h09ngMNd13hnePwgXa+Y5CgOjzlCvfWLHg+MBnydEedAnuLRzUHUJmGS3o2OsrhxTOOqEsPOFt5v/f6C5Qulcw==", + "requires": { + "@babel/core": "^7.15.5", + "@babel/plugin-transform-react-constant-elements": "^7.14.5", + "@babel/preset-env": "^7.15.6", + "@babel/preset-react": "^7.14.5", + "@babel/preset-typescript": "^7.15.0", + "@svgr/core": "^6.2.1", + "@svgr/plugin-jsx": "^6.2.1", + "@svgr/plugin-svgo": "^6.2.0" + } + }, "@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" + }, + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", "dev": true }, - "@types/color-convert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/color-convert/-/color-convert-2.0.0.tgz", - "integrity": "sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ==", - "dev": true, - "requires": { - "@types/color-name": "*" - } - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", "dev": true }, - "@types/css-modules-loader-core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@types/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz", - "integrity": "sha512-LMbyf7THPqLCPHIXAj79v9Pa193MeOHgp1fBFRR6s6VvEVHUFIcM5bc/WttslOf+lao4TURNN1X1zfW5wr2CHQ==", + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", "dev": true, "requires": { - "postcss": "7.x.x" + "@types/connect": "*", + "@types/node": "*" } }, - "@types/d3-color": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-2.0.3.tgz", - "integrity": "sha512-+0EtEjBfKEDtH9Rk3u3kLOUXM5F+iZK+WvASPb0MhIZl8J8NUvGeZRwKCXl+P3HkYx5TdU4YtcibpqHkSR9n7w==" - }, - "@types/d3-interpolate": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-2.0.2.tgz", - "integrity": "sha512-lElyqlUfIPyWG/cD475vl6msPL4aMU7eJvx1//Q177L8mdXoVPFl1djIESF2FKnc0NyaHvQlJpWwKJYwAhUoCw==", + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, "requires": { - "@types/d3-color": "^2" + "@types/node": "*" } }, - "@types/d3-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-2.0.2.tgz", - "integrity": "sha512-3YHpvDw9LzONaJzejXLOwZ3LqwwkoXb9LI2YN7Hbd6pkGo5nIlJ09ul4bQhBN4hQZJKmUpX8HkVqbzgUKY48cg==" - }, - "@types/d3-scale": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-3.3.2.tgz", - "integrity": "sha512-gGqr7x1ost9px3FvIfUMi5XA/F/yAf4UkUDtdQhpH92XCT0Oa7zkkRzY61gPVJq+DxpHn/btouw5ohWkbBsCzQ==", + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, "requires": { - "@types/d3-time": "^2" + "@types/node": "*" } }, - "@types/d3-shape": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-2.1.3.tgz", - "integrity": "sha512-HAhCel3wP93kh4/rq+7atLdybcESZ5bRHDEZUojClyZWsRuEMo3A52NGYJSh48SxfxEU6RZIVbZL2YFZ2OAlzQ==", + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, "requires": { - "@types/d3-path": "^2" + "@types/express-serve-static-core": "*", + "@types/node": "*" } }, - "@types/d3-time": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-2.1.1.tgz", - "integrity": "sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg==" + "@types/eslint": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.2.tgz", + "integrity": "sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } }, "@types/glob": { "version": "7.2.0", @@ -29462,54 +17397,33 @@ "@types/node": "*" } }, - "@types/hast": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", - "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", "dev": true, "requires": { - "@types/unist": "*" + "@types/node": "*" } }, - "@types/html-minifier-terser": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", - "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==", - "dev": true - }, - "@types/is-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha512-A79HEEiwXTFtfY+Bcbo58M2GRYzCr9itHWzbzHVFNEYCcoU/MMGwYYf721gBrnhpj1s6RGVVha/IgNFnR0Iw/Q==", - "dev": true - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, "@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", "dev": true }, - "@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", - "dev": true, - "requires": { - "@types/unist": "*" - } - }, "@types/minimatch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", @@ -29517,67 +17431,21 @@ "dev": true }, "@types/node": { - "version": "14.18.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.16.tgz", - "integrity": "sha512-X3bUMdK/VmvrWdoTkz+VCn6nwKwrKCFTHtqwBIaQJNx4RUIBBUFXM00bqPz/DsDd+Icjmzm6/tyYZzeGVqb6/Q==", - "dev": true - }, - "@types/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", - "dev": true, - "requires": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "@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 - }, - "@types/npmlog": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@types/npmlog/-/npmlog-4.1.4.tgz", - "integrity": "sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ==", - "dev": true - }, - "@types/overlayscrollbars": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@types/overlayscrollbars/-/overlayscrollbars-1.12.1.tgz", - "integrity": "sha512-V25YHbSoKQN35UasHf0EKD9U2vcmexRSp78qa8UglxFH8H3D+adEa9zGZwrqpH4TdvqeMrgMqVqsLB4woAryrQ==", - "dev": true + "version": "17.0.38", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.38.tgz", + "integrity": "sha512-5jY9RhV7c0Z4Jy09G+NIDTsCZ5G0L5n+Z+p+Y7t5VJHM30bgwzSjVtlcBxqAj+6L/swIlvtOSzr8rBk/aNyV2g==", + "devOptional": true }, "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, - "@types/parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", - "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==", - "dev": true - }, - "@types/pretty-hrtime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz", - "integrity": "sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==", - "dev": true - }, "@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, - "@types/q": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", - "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", - "dev": true - }, "@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -29590,27 +17458,26 @@ "integrity": "sha512-taW5/WYqo36N7V39oYyHP9Ipfd5pNFvGTIQsNGj86xV88YQ7GnI30/yMfKDF7Zgin0m3e+ikX88FvImnK4RjGw==", "optional": true }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, "@types/react": { - "version": "18.0.8", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.8.tgz", - "integrity": "sha512-+j2hk9BzCOrrOSJASi5XiOyBbERk9jG5O73Ya4M0env5Ixi6vUNli4qy994AINcEF+1IEHISYFfIT4zwr++LKw==", + "version": "18.0.10", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.10.tgz", + "integrity": "sha512-dIugadZuIPrRzvIEevIu7A1smqOAjkSMv8qOfwPt9Ve6i6JT/FQcCHyk2qIAxwsQNKZt5/oGR0T4z9h2dXRAkg==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", "csstype": "^3.0.2" - }, - "dependencies": { - "csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" - } } }, - "@types/react-syntax-highlighter": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.5.tgz", - "integrity": "sha512-VIOi9i2Oj5XsmWWoB72p3KlZoEbdRAcechJa8Ztebw7bDl2YmR+odxIqhtJGp1q2EozHs02US+gzxJ9nuf56qg==", + "@types/react-dom": { + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.5.tgz", + "integrity": "sha512-OWPWTUrY/NIrjsAPkAk1wW9LZeIjSvkXRhclsFO8CZcZGCOg2G0YZy4ft+rOyYxy8B7ui5iZzi9OkDebZ7/QSA==", "dev": true, "requires": { "@types/react": "*" @@ -29629,260 +17496,355 @@ "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz", "integrity": "sha512-G9eN0Sn0ii9PWQ3Vl72jDPgeJwRWhv2Qk/nQkJuWmRmOB4HX3/BhD5SE1dZs/hzPZL/WKnvF0RHdTSG54QJFyg==" }, + "@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, "@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, - "@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", - "dev": true - }, - "@types/tapable": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", - "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==", - "dev": true - }, - "@types/uglify-js": { - "version": "3.13.2", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.2.tgz", - "integrity": "sha512-/xFrPIo+4zOeNGtVMbf9rUm0N+i4pDf1ynExomqtokIJmVzR3962lJ1UE+MmexMkA0cmN9oTzg5Xcbwge0Ij2Q==", + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", "dev": true, "requires": { - "source-map": "^0.6.1" + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/trusted-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", + "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==", + "dev": true + }, + "@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.27.0.tgz", + "integrity": "sha512-DDrIA7GXtmHXr1VCcx9HivA39eprYBIFxbQEHI6NyraRDxCGpxAFiYQAT/1Y0vh1C+o2vfBiy4IuPoXxtTZCAQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.27.0", + "@typescript-eslint/type-utils": "5.27.0", + "@typescript-eslint/utils": "5.27.0", + "debug": "^4.3.4", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, - "@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", - "dev": true - }, - "@types/webpack": { - "version": "4.41.32", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.32.tgz", - "integrity": "sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==", + "@typescript-eslint/parser": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.27.0.tgz", + "integrity": "sha512-8oGjQF46c52l7fMiPPvX4It3u3V3JipssqDfHQ2hcR0AeR8Zge+OYyKUCm5b70X72N1qXt0qgHenwN6Gc2SXZA==", "dev": true, "requires": { - "@types/node": "*", - "@types/tapable": "^1", - "@types/uglify-js": "*", - "@types/webpack-sources": "*", - "anymatch": "^3.0.0", - "source-map": "^0.6.0" + "@typescript-eslint/scope-manager": "5.27.0", + "@typescript-eslint/types": "5.27.0", + "@typescript-eslint/typescript-estree": "5.27.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.27.0.tgz", + "integrity": "sha512-VnykheBQ/sHd1Vt0LJ1JLrMH1GzHO+SzX6VTXuStISIsvRiurue/eRkTqSrG0CexHQgKG8shyJfR4o5VYioB9g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.27.0", + "@typescript-eslint/visitor-keys": "5.27.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.27.0.tgz", + "integrity": "sha512-vpTvRRchaf628Hb/Xzfek+85o//zEUotr1SmexKvTfs7czXfYjXVT/a5yDbpzLBX1rhbqxjDdr1Gyo0x1Fc64g==", + "dev": true, + "requires": { + "@typescript-eslint/utils": "5.27.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.27.0.tgz", + "integrity": "sha512-lY6C7oGm9a/GWhmUDOs3xAVRz4ty/XKlQ2fOLr8GAIryGn0+UBOoJDWyHer3UgrHkenorwvBnphhP+zPmzmw0A==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.27.0.tgz", + "integrity": "sha512-QywPMFvgZ+MHSLRofLI7BDL+UczFFHyj0vF5ibeChDAJgdTV8k4xgEwF0geFhVlPc1p8r70eYewzpo6ps+9LJQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.27.0", + "@typescript-eslint/visitor-keys": "5.27.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, - "@types/webpack-env": { - "version": "1.16.4", - "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.16.4.tgz", - "integrity": "sha512-llS8qveOUX3wxHnSykP5hlYFFuMfJ9p5JvIyCiBgp7WTfl6K5ZcyHj8r8JsN/J6QODkAsRRCLIcTuOCu8etkUw==", - "dev": true - }, - "@types/webpack-sources": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", - "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "@typescript-eslint/utils": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.27.0.tgz", + "integrity": "sha512-nZvCrkIJppym7cIbP3pOwIkAefXOmfGPnCM0LQfzNaKxJHI6VjI8NC662uoiPlaf5f6ymkTy9C3NQXev2mdXmA==", "dev": true, "requires": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.7.3" + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.27.0", + "@typescript-eslint/types": "5.27.0", + "@typescript-eslint/typescript-estree": "5.27.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.27.0.tgz", + "integrity": "sha512-46cYrteA2MrIAjv9ai44OQDUoCZyHeGIc4lsjCUX2WT6r4C+kidz1bNiR4017wHOPUythYeH+Sc7/cFP97KEAA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.27.0", + "eslint-visitor-keys": "^3.3.0" } }, "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", "dev": true }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0" + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" } }, "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", + "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, + "@webpack-cli/configtest": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", + "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", + "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", + "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", + "dev": true, + "requires": {} + }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -29913,24 +17875,49 @@ } }, "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "requires": {} + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} }, "acorn-node": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, "requires": { "acorn": "^7.0.0", "acorn-walk": "^7.0.0", "xtend": "^4.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } } }, "acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true }, "add-dom-event-listener": { "version": "1.1.0", @@ -29940,47 +17927,6 @@ "object-assign": "4.x" } }, - "address": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.0.tgz", - "integrity": "sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==", - "dev": true - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "airbnb-js-shims": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/airbnb-js-shims/-/airbnb-js-shims-2.2.1.tgz", - "integrity": "sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", - "array.prototype.flatmap": "^1.2.1", - "es5-shim": "^4.5.13", - "es6-shim": "^0.35.5", - "function.prototype.name": "^1.1.0", - "globalthis": "^1.0.0", - "object.entries": "^1.1.0", - "object.fromentries": "^2.0.0 || ^1.0.0", - "object.getownpropertydescriptors": "^2.0.3", - "object.values": "^1.1.0", - "promise.allsettled": "^1.0.0", - "promise.prototype.finally": "^3.1.0", - "string.prototype.matchall": "^4.0.0 || ^3.0.1", - "string.prototype.padend": "^3.0.0", - "string.prototype.padstart": "^3.0.0", - "symbol.prototype.description": "^1.0.0" - } - }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -29993,31 +17939,46 @@ "uri-js": "^4.2.2" } }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "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 + } + } }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, - "requires": { - "string-width": "^4.1.0" - } + "requires": {} }, "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true }, "ansi-html-community": { @@ -30038,30 +17999,6 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" - }, - "dependencies": { - "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==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - } - } - }, - "ansi-to-html": { - "version": "0.6.15", - "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.15.tgz", - "integrity": "sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ==", - "dev": true, - "requires": { - "entities": "^2.0.0" } }, "anymatch": { @@ -30074,56 +18011,12 @@ "picomatch": "^2.0.4" } }, - "app-root-dir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", - "integrity": "sha1-OBh+wt6nV3//Az/8sSFyaS/24Rg=", + "arg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==", "dev": true }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "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 - }, - "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, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -30133,49 +18026,21 @@ "sprintf-js": "~1.0.2" } }, - "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, "array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", "get-intrinsic": "^1.1.1", "is-string": "^1.0.7" } @@ -30186,30 +18051,6 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0" - } - }, "array.prototype.flatmap": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", @@ -30222,29 +18063,23 @@ "es-shim-unscopables": "^1.0.0" } }, - "array.prototype.map": { + "array.prototype.reduce": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.4.tgz", - "integrity": "sha512-Qds9QnX7A0qISY7JT5WuJO0NJPE9CMlC6JzHQfhpqAAQQzufVRoeH7EzUY5GcPTx72voG8LV/5eo+b8Qi8hmhA==", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", + "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", + "es-abstract": "^1.19.2", "es-array-method-boxes-properly": "^1.0.0", "is-string": "^1.0.7" } }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "asn1.js": { "version": "5.4.1", @@ -30266,86 +18101,12 @@ } } }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "ast-types": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", - "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", - "dev": true, - "requires": { - "tslib": "^2.0.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - } - } - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", - "dev": true - }, "async": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", "dev": true }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -30358,46 +18119,17 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "autoprefixer": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", - "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", + "version": "10.4.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", + "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", "dev": true, "requires": { - "browserslist": "^2.11.3", - "caniuse-lite": "^1.0.30000805", + "browserslist": "^4.20.3", + "caniuse-lite": "^1.0.30001335", + "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^6.0.17", - "postcss-value-parser": "^3.2.3" - }, - "dependencies": { - "browserslist": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", - "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000792", - "electron-to-chromium": "^1.3.30" - } - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" } }, "available-typed-arrays": { @@ -30407,9 +18139,9 @@ "dev": true }, "aws-sdk": { - "version": "2.1125.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1125.0.tgz", - "integrity": "sha512-2syNkKDqDcDmB/chc61a5xx+KYzaarLs1/KshE0b1Opp2oSq2FARyUBbk59HgwKaDUB61uPF33ZG9sHiIVx2hQ==", + "version": "2.1146.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1146.0.tgz", + "integrity": "sha512-lg83hvrK2oiJVnklUVMXIJkeYX2nlqhvxIFlZ2wfoaJyvdGsEcOUdZ/EMDgiS0V2jwGS8CtTUypcW/t2S6gdcQ==", "dev": true, "requires": { "buffer": "4.9.2", @@ -30419,21 +18151,68 @@ "querystring": "0.2.0", "sax": "1.2.1", "url": "0.10.3", - "uuid": "3.3.2", + "uuid": "8.0.0", "xml2js": "0.4.19" } }, - "axe-core": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz", - "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==", - "dev": true - }, - "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } }, "babel-loader": { "version": "8.2.5", @@ -30495,6 +18274,12 @@ "p-limit": "^2.2.0" } }, + "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 + }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -30503,87 +18288,40 @@ "requires": { "find-up": "^4.0.0" } - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } } } }, - "babel-plugin-add-react-displayname": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz", - "integrity": "sha1-M51M3be2X9YtHfnbn+BN4TQSK9U=", - "dev": true - }, - "babel-plugin-apply-mdx-type-prop": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", - "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.10.4", - "@mdx-js/util": "1.6.22" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } + "babel-runtime": "^6.22.0" } }, "babel-plugin-dynamic-import-node": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, "requires": { "object.assign": "^4.1.0" } }, - "babel-plugin-emotion": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.2.2.tgz", - "integrity": "sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA==", - "dev": true, + "babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/serialize": "^0.11.16", - "babel-plugin-macros": "^2.0.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^1.0.5", - "find-root": "^1.1.0", - "source-map": "^0.5.7" + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" }, "dependencies": { - "babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - } - }, "cosmiconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", @@ -30591,54 +18329,13 @@ "path-type": "^4.0.0", "yaml": "^1.7.2" } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true } } }, - "babel-plugin-extract-import-names": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", - "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } - } - }, - "babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - } - }, - "babel-plugin-named-asset-import": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", - "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", - "dev": true - }, "babel-plugin-polyfill-corejs2": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", - "dev": true, "requires": { "@babel/compat-data": "^7.13.11", "@babel/helper-define-polyfill-provider": "^0.3.1", @@ -30649,7 +18346,6 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", - "dev": true, "requires": { "@babel/helper-define-polyfill-provider": "^0.3.1", "core-js-compat": "^3.21.0" @@ -30659,22 +18355,10 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", - "dev": true, "requires": { "@babel/helper-define-polyfill-provider": "^0.3.1" } }, - "babel-plugin-react-docgen": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.2.1.tgz", - "integrity": "sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ==", - "dev": true, - "requires": { - "ast-types": "^0.14.2", - "lodash": "^4.17.15", - "react-docgen": "^5.0.0" - } - }, "babel-plugin-recharts": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/babel-plugin-recharts/-/babel-plugin-recharts-1.2.1.tgz", @@ -30686,16 +18370,27 @@ "babylon": "^6.18.0" } }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha512-AWj19x2aDm8qFQ5O2JcD6pwJDW1YdcnO+1b81t7gxrGjz5VHiUqeYWAR4h7zueWMalRelrQDXprv2FrY1dbpbw==", "dev": true }, + "babel-plugin-transform-decorators-legacy": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.5.tgz", + "integrity": "sha512-jYHwjzRXRelYQ1uGm353zNzf3QmtdCfvJbuYTZ4gKveK7M9H1fs3a5AKdY1JUDl0z97E30ukORW1dzhWvsabtA==", + "dev": true, + "requires": { + "babel-plugin-syntax-decorators": "^6.1.18", + "babel-runtime": "^6.2.0", + "babel-template": "^6.3.0" + } + }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", "requires": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" @@ -30713,53 +18408,94 @@ } } }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } + } + }, "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true }, - "bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", - "dev": true - }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, "base16": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", - "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=" + "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" }, "base64-arraybuffer": { "version": "1.0.2", @@ -30776,36 +18512,9 @@ "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, - "batch-processor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/batch-processor/-/batch-processor-1.0.0.tgz", - "integrity": "sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg=", - "dev": true - }, - "better-opn": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-2.1.1.tgz", - "integrity": "sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==", - "dev": true, - "requires": { - "open": "^7.0.3" - } - }, - "bfj": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", - "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "check-types": "^8.0.3", - "hoopy": "^0.1.4", - "tryer": "^1.0.1" - } - }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -30864,16 +18573,10 @@ } } }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, "body-parser": { @@ -30914,90 +18617,27 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "bonjour-service": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.12.tgz", + "integrity": "sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw==", "dev": true, "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", + "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - }, - "dependencies": { - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - } + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.4" } }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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 - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "brace-expansion": { "version": "1.1.11", @@ -31020,7 +18660,7 @@ "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true }, "browser-or-node": { @@ -31121,15 +18761,6 @@ } } }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, "browserslist": { "version": "4.20.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", @@ -31161,7 +18792,7 @@ "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true }, "buffer-from": { @@ -31170,120 +18801,23 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", "dev": true }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "c8": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.11.2.tgz", - "integrity": "sha512-6ahJSrhS6TqSghHm+HnWt/8Y2+z0hM/FQyB1ybKhAR30+NYL9CTQ1uwHxuWw6U7BHlHv6wvhgOrH81I+lfCkxg==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true }, "calendar": { "version": "0.1.1", @@ -31299,63 +18833,39 @@ "get-intrinsic": "^1.0.2" } }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - } - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + } } }, "camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" }, "camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true }, "caniuse-api": { "version": "3.0.0", @@ -31370,9 +18880,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001335", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001335.tgz", - "integrity": "sha512-ddP1Tgm7z2iIxu6QTtbZUv6HJxSaV/PZeSrWFZtbY4JZ69tOeNhBCl3HyRQgeNZKE5AOn1kpV7fhljigy0Ty3w==" + "version": "1.0.30001344", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001344.tgz", + "integrity": "sha512-0ZFjnlCaXNOAYcV7i+TtdKBp0L/3XEU2MF/x6Du1lrh+SRX4IfzIVL4HNJg5pB2PmFb8rszIGyOvsZnqqRoc2g==" }, "canvg": { "version": "3.0.10", @@ -31390,18 +18900,6 @@ "svg-pathdata": "^6.0.3" } }, - "case-sensitive-paths-webpack-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", - "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", - "dev": true - }, - "ccount": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", - "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", - "dev": true - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -31412,36 +18910,12 @@ "supports-color": "^5.3.0" } }, - "character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", - "dev": true - }, - "character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", - "dev": true - }, - "character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", - "dev": true - }, "charcodes": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/charcodes/-/charcodes-0.2.0.tgz", "integrity": "sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ==", "dev": true }, - "check-types": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", - "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", - "dev": true - }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -31458,12 +18932,6 @@ "readdirp": "~3.6.0" } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, "chroma-js": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz", @@ -31489,93 +18957,8 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } + "requires": {} }, "classnames": { "version": "2.3.1", @@ -31583,9 +18966,9 @@ "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" }, "clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", - "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", + "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", "dev": true, "requires": { "source-map": "~0.6.0" @@ -31599,37 +18982,15 @@ } } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, "cli": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "integrity": "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==", "requires": { "exit": "0.1.2", "glob": "^7.1.1" } }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true - }, - "cli-table3": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", - "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -31657,96 +19018,51 @@ "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, - "codemirror": { - "version": "5.65.3", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.3.tgz", - "integrity": "sha512-kCC0iwGZOVZXHEKW3NDTObvM7pTIyowjty4BUqeREROc/3I6bWbgZDA3fGDwlA+rbgRjvnRnfqs9SfXynel1AQ==" - }, - "collapse-white-space": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, "color": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dev": true, "requires": { "color-convert": "^1.9.3", "color-string": "^1.6.0" - }, - "dependencies": { - "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==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - } } }, "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==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "requires": { - "color-name": "~1.1.4" + "color-name": "1.1.3" } }, "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==" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "color-string": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, "colord": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==", "dev": true }, + "colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, "colorspace": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", @@ -31757,57 +19073,36 @@ "text-hex": "1.0.x" } }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", - "dev": true - }, "commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true }, - "common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", "dev": true }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, "component-classes": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/component-classes/-/component-classes-1.2.6.tgz", - "integrity": "sha1-xkI5TDYYpNiwuJGe/Mu9kw5c1pE=", + "integrity": "sha512-hPFGULxdwugu1QWW3SvVOCUHLzO34+a2J6Wqy0c5ASQkfi9/8nZcBB0ZohaEbXOQlCflMAEMmEWk7u7BVs4koA==", "requires": { "component-indexof": "0.0.3" } }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "component-indexof": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz", - "integrity": "sha1-EdCRMSI5648yyPJa6csAL/6NPCQ=" + "integrity": "sha512-puDQKvx/64HZXb4hBwIcvQLaLgux8o1CbWl39s41hrIIZDl1lJiD5jc22gj3RBeGK0ovxALDYpIbyjqDUUl0rw==" }, "compressible": { "version": "2.0.18", @@ -31845,59 +19140,66 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } }, - "compute-scroll-into-view": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz", - "integrity": "sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==", - "dev": true + "compression-webpack-plugin": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-10.0.0.tgz", + "integrity": "sha512-wLXLIBwpul/ALcm7Aj+69X0pYT3BYt6DdPn3qrgBIh9YejV9Bju9ShhlAsjujLyWMo6SAweFIWaUoFmXZNuNrg==", + "dev": true, + "requires": { + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "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 + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "connect-history-api-fallback": { "version": "1.6.0", @@ -31908,23 +19210,11 @@ "console-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "integrity": "sha512-duS7VP5pvfsNLDvL1O4VOEbw37AI3A4ZUQYemvDlnpGrNu9tprR7BYWpDYwC0Xia0Zxz5ZupdiIrUp0GH1aXfg==", "requires": { "date-now": "^0.1.4" } }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -31965,27 +19255,7 @@ "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, "copy-to-clipboard": { @@ -31997,149 +19267,98 @@ } }, "copy-webpack-plugin": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", - "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, "requires": { - "cacache": "^12.0.3", - "find-cache-dir": "^2.1.0", - "glob-parent": "^3.1.0", - "globby": "^7.1.1", - "is-glob": "^4.0.1", - "loader-utils": "^1.2.3", - "minimatch": "^3.0.4", + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", "normalize-path": "^3.0.0", - "p-limit": "^2.2.1", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "webpack-log": "^2.0.0" + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" }, "dependencies": { - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { - "array-uniq": "^1.0.1" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "requires": { - "path-type": "^3.0.0" + "fast-deep-equal": "^3.1.3" } }, "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } + "is-glob": "^4.0.3" } }, "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.1.tgz", + "integrity": "sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q==", "dev": true, "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" } }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "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 }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } }, "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true } } }, "core-js": { - "version": "3.22.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.3.tgz", - "integrity": "sha512-1t+2a/d2lppW1gkLXx3pKPVGbBdxXAkqztvWb1EJ8oF8O2gIGiytzflNiFEehYwVK/t2ryUsGBoOFFvNx95mbg==", + "version": "3.22.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.7.tgz", + "integrity": "sha512-Jt8SReuDKVNZnZEzyEQT5eK6T2RRCXkfTq7Lo09kpm+fHjgGewSbNjV+Wt4yZMhPDdzz2x1ulI5z/w4nxpBseg==", "devOptional": true }, "core-js-compat": { - "version": "3.22.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.3.tgz", - "integrity": "sha512-wliMbvPI2idgFWpFe7UEyHMvu6HWgW8WA+HnDRtgzoSDYvXFMpoGX1H3tPDDXrcfUSyXafCLDd7hOeMQHEZxGw==", - "dev": true, + "version": "3.22.7", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.7.tgz", + "integrity": "sha512-uI9DAQKKiiE/mclIC5g4AjRpio27g+VMRhe6rQoz+q4Wm4L6A/fJhiLtBw+sfOpDG9wZ3O0pxIw7GbfOlBgjOA==", "requires": { "browserslist": "^4.20.3", "semver": "7.0.0" @@ -32148,17 +19367,10 @@ "semver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" } } }, - "core-js-pure": { - "version": "3.22.3", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.3.tgz", - "integrity": "sha512-oN88zz7nmKROMy8GOjs+LN+0LedIvbMdnB5XsTlhcOg1WGARt9l0LFg0zohdoFmCsEZ1h2ZbSQ6azj3M+vhzwQ==", - "dev": true - }, "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -32168,7 +19380,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -32180,268 +19391,13 @@ "country-data": { "version": "0.0.31", "resolved": "https://registry.npmjs.org/country-data/-/country-data-0.0.31.tgz", - "integrity": "sha1-gJZrjh0Uf6bWpYnTKTP4eTd0lW0=", + "integrity": "sha512-YqlY/i6ikZwoBFfdjK+hJTGaBdTgDpXLI15MCj2UsXZ2cPBb+Kx86AXmDH7PRGt0LUleck0cCgNdWeIhfbcxkQ==", "dev": true, "requires": { "currency-symbol-map": "~2", "underscore": ">1.4.4" } }, - "cp-file": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-7.0.0.tgz", - "integrity": "sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "nested-error-stacks": "^2.0.0", - "p-event": "^4.1.0" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - } - } - }, - "cpy": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/cpy/-/cpy-8.1.2.tgz", - "integrity": "sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg==", - "dev": true, - "requires": { - "arrify": "^2.0.1", - "cp-file": "^7.0.0", - "globby": "^9.2.0", - "has-glob": "^1.0.0", - "junk": "^3.1.0", - "nested-error-stacks": "^2.1.0", - "p-all": "^2.1.0", - "p-filter": "^2.1.0", - "p-map": "^3.0.0" - }, - "dependencies": { - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, - "requires": { - "path-type": "^3.0.0" - } - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "globby": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, "create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", @@ -32496,6 +19452,12 @@ "object-assign": "^4.1.1" } }, + "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 + }, "cross-fetch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", @@ -32534,6 +19496,12 @@ "randomfill": "^1.0.3" } }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, "css-animation": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/css-animation/-/css-animation-1.6.1.tgz", @@ -32547,7 +19515,8 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", - "dev": true + "dev": true, + "requires": {} }, "css-line-break": { "version": "2.1.0", @@ -32559,243 +19528,97 @@ } }, "css-loader": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", - "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", "dev": true, "requires": { - "camelcase": "^5.3.1", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.32", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.2.0", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^2.7.0", - "semver": "^6.3.0" + "icss-utils": "^5.1.0", + "postcss": "^8.4.7", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.5" }, "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "css-modules-loader-core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz", - "integrity": "sha1-WQhmgpShvs0mGuCkziGwtVHyHRY=", - "dev": true, - "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.1", - "postcss-modules-extract-imports": "1.1.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz", - "integrity": "sha1-AA29H47vIXqjaLmiEsX8QLKo8/I=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-modules-extract-imports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", - "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", - "dev": true, - "requires": { - "postcss": "^6.0.1" - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "dev": true, - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" + "lru-cache": "^6.0.0" } } } }, "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "css-selector-tokenizer": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", - "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "dependencies": { + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + } } }, "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dev": true, + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "requires": { - "mdn-data": "2.0.4", + "mdn-data": "2.0.14", "source-map": "^0.6.1" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -32805,48 +19628,48 @@ "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==" }, "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "dev": true + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true }, "cssnano": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.7.tgz", - "integrity": "sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.10.tgz", + "integrity": "sha512-ACpnRgDg4m6CZD/+8SgnLcGCgy6DDGdkMbOawwdvVxNietTNLe/MtWcenp6qT0PRt5wzhGl6/cjMWCdhKXC9QA==", "dev": true, "requires": { - "cssnano-preset-default": "^5.2.7", + "cssnano-preset-default": "^5.2.10", "lilconfig": "^2.0.3", "yaml": "^1.10.2" } }, "cssnano-preset-default": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz", - "integrity": "sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==", + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.10.tgz", + "integrity": "sha512-H8TJRhTjBKVOPltp9vr9El9I+IfYsOMhmXdK0LwdvwJcxYX9oWkY7ctacWusgPWAgQq1vt/WO8v+uqpfLnM7QA==", "dev": true, "requires": { "css-declaration-sorter": "^6.2.2", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.0", - "postcss-discard-comments": "^5.1.1", + "postcss-convert-values": "^5.1.2", + "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.4", - "postcss-merge-rules": "^5.1.1", + "postcss-merge-longhand": "^5.1.5", + "postcss-merge-rules": "^5.1.2", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.2", - "postcss-minify-selectors": "^5.2.0", + "postcss-minify-params": "^5.1.3", + "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", "postcss-normalize-positions": "^5.1.0", @@ -32867,57 +19690,26 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true + "dev": true, + "requires": {} }, "csso": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, "requires": { "css-tree": "^1.1.2" - }, - "dependencies": { - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "csstype": { - "version": "2.6.20", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", - "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==", - "dev": true + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" }, "currency-symbol-map": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/currency-symbol-map/-/currency-symbol-map-2.2.0.tgz", - "integrity": "sha1-KzwYcv8aws5ZXYJz5Y4f/wJyrqI=", - "dev": true - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "integrity": "sha512-fPZJ3jqM68+AAgqQ7UaGbgHL/39rp6l7GyqS2k1HJPu/kpS8D07x/+Uup6a9tCUKIlOFcRrDCf1qxSt8jnI5BA==", "dev": true }, "d": { @@ -32996,21 +19788,16 @@ "d3-time": "1 - 2" } }, - "damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, "date-fns": { "version": "2.28.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz", - "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==" + "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==", + "peer": true }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + "integrity": "sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw==" }, "deasync": { "version": "0.1.26", @@ -33025,7 +19812,7 @@ "deasync-promise": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deasync-promise/-/deasync-promise-1.0.1.tgz", - "integrity": "sha1-KyfeR4Fnr07zS6mYecUuwM7dYcI=", + "integrity": "sha512-VzJ6J6beJcSXM7SMVhug3JNZzLiPGUNJWDuevXcFeXQCa+zlnP7ZrByI+8DZQZ3AoZJj9W32ceqF6JBKmsTdgg==", "dev": true, "requires": { "deasync": "^0.1.7" @@ -33039,69 +19826,42 @@ "ms": "2.1.2" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, "decimal.js-light": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, "deep-diff": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-1.0.2.tgz", "integrity": "sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg==" }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-object-diff": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.7.tgz", - "integrity": "sha512-QkgBca0mL08P6HiOjoqvmm6xOAl2W6CT2+34Ljhg0OeFan8cwlcdq8jrLKsBBuUFAZLsN5b6y491KdKEoSo9lg==", + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" }, "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" + "execa": "^5.0.0" } }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, "define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -33111,84 +19871,10 @@ "object-keys": "^1.1.1" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, "defined": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "dependencies": { - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", "dev": true }, "depd": { @@ -33229,63 +19915,34 @@ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, - "detab": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", - "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", - "dev": true, - "requires": { - "repeat-string": "^1.5.4" - } - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, "detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, - "detect-port": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", - "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", "dev": true, "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" } }, - "detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", - "requires": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" - } + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true }, "diffie-hellman": { "version": "5.0.3", @@ -33315,6 +19972,12 @@ "path-type": "^4.0.0" } }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, "dnd-core": { "version": "15.1.2", "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-15.1.2.tgz", @@ -33328,32 +19991,22 @@ "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", "dev": true }, "dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz", + "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==", "dev": true, "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" + "@leichtgewicht/ip-codec": "^2.0.1" } }, "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { "esutils": "^2.0.2" @@ -33380,13 +20033,6 @@ "requires": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" - }, - "dependencies": { - "csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" - } } }, "dom-serializer": { @@ -33402,21 +20048,14 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" } } }, - "dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", - "dev": true - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, "domelementtype": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", @@ -33425,21 +20064,21 @@ "domhandler": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==", "requires": { "domelementtype": "1" } }, "dompurify": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.6.tgz", - "integrity": "sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.8.tgz", + "integrity": "sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw==", "optional": true }, "domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", "requires": { "dom-serializer": "0", "domelementtype": "1" @@ -33455,25 +20094,6 @@ "tslib": "^2.0.3" }, "dependencies": { - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "requires": { - "tslib": "^2.0.3" - } - }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", @@ -33488,103 +20108,32 @@ "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==", "dev": true }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "downshift": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/downshift/-/downshift-6.1.7.tgz", - "integrity": "sha512-cVprZg/9Lvj/uhYRxELzlu1aezRcgPWBjTvspiGTVEU64gF5pRdSRKFVLcxqsZC637cLAGMbL40JavEfWnqgNg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.14.8", - "compute-scroll-into-view": "^1.0.17", - "prop-types": "^15.7.2", - "react-is": "^17.0.2", - "tslib": "^2.3.0" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - } - } - }, "duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, "ejs": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.129", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.129.tgz", - "integrity": "sha512-GgtN6bsDtHdtXJtlMYZWGB/uOyjZWjmRDumXTas7dGBaB9zUyCjzHet1DY2KhyHN8R0GLbzZWqm4efeddqqyRQ==" - }, - "element-resize-detector": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/element-resize-detector/-/element-resize-detector-1.2.4.tgz", - "integrity": "sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", "dev": true, "requires": { - "batch-processor": "1.0.0" + "jake": "^10.8.5" } }, + "electron-to-chromium": { + "version": "1.4.143", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.143.tgz", + "integrity": "sha512-2hIgvu0+pDfXIqmVmV5X6iwMjQ2KxDsWKwM+oI1fABEOy/Dqmll0QJRmIQ3rm+XaoUa/qKrmy5h7LSTFQ6Ldzg==" + }, "elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", @@ -33609,9 +20158,9 @@ } }, "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "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 }, "emojis-list": { @@ -33620,17 +20169,6 @@ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, - "emotion-theming": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emotion-theming/-/emotion-theming-10.3.0.tgz", - "integrity": "sha512-mXiD2Oj7N9b6+h/dC6oLf9hwxbtKHQjoIqtodEyL8CpkN4F3V4IK/BT4D0C7zSs4BBFOu4UlPJbvvBLa88SGEA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.5.5", - "@emotion/weak-memoize": "0.2.5", - "hoist-non-react-statics": "^3.3.0" - } - }, "enabled": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", @@ -33640,29 +20178,9 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "endent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz", - "integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==", - "dev": true, - "requires": { - "dedent": "^0.7.0", - "fast-json-parse": "^1.0.3", - "objectorarray": "^1.0.5" - } - }, "engine.io-client": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.2.tgz", @@ -33673,13 +20191,6 @@ "engine.io-parser": "~5.0.3", "ws": "~8.2.3", "xmlhttprequest-ssl": "~2.0.0" - }, - "dependencies": { - "ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==" - } } }, "engine.io-parser": { @@ -33688,14 +20199,13 @@ "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==" }, "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", + "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" } }, "enquirer": { @@ -33708,18 +20218,15 @@ } }, "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==" }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true }, "error-ex": { "version": "1.3.2", @@ -33729,27 +20236,20 @@ "is-arrayish": "^0.2.1" } }, - "error-stack-parser": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.7.tgz", - "integrity": "sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA==", - "dev": true, - "requires": { - "stackframe": "^1.1.1" - } - }, "es-abstract": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz", - "integrity": "sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.1", "get-symbol-description": "^1.0.0", "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "is-callable": "^1.2.4", @@ -33761,9 +20261,10 @@ "object-inspect": "^1.12.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" } }, "es-array-method-boxes-properly": { @@ -33772,29 +20273,11 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", "dev": true }, - "es-get-iterator": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", - "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.0", - "has-symbols": "^1.0.1", - "is-arguments": "^1.1.0", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.5", - "isarray": "^2.0.5" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - } - } + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true }, "es-shim-unscopables": { "version": "1.0.0", @@ -33826,12 +20309,6 @@ "next-tick": "^1.1.0" } }, - "es5-shim": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.6.6.tgz", - "integrity": "sha512-Ay5QQE78I2WKUoZVZjL0AIuiIjsmXwZGkyCTH9+n6J1anPbb0ymDA27ASa2Lt0rhOpAlEKy2W0d17gJ1XOQ5eQ==", - "dev": true - }, "es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -33841,19 +20318,13 @@ "es6-iterator": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", "requires": { "d": "1", "es5-ext": "^0.10.35", "es6-symbol": "^3.1.1" } }, - "es6-shim": { - "version": "0.35.6", - "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.6.tgz", - "integrity": "sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA==", - "dev": true - }, "es6-symbol": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", @@ -33871,213 +20342,179 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, - "eslint-config-airbnb": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-16.1.0.tgz", - "integrity": "sha512-zLyOhVWhzB/jwbz7IPSbkUuj7X2ox4PHXTcZkEmDqTvd0baJmJyuxlFPDlZOE/Y5bC+HQRaEkT3FoHo9wIdRiw==", + "eslint": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz", + "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==", "dev": true, "requires": { - "eslint-config-airbnb-base": "^12.1.0" - } - }, - "eslint-config-airbnb-base": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz", - "integrity": "sha512-/vjm0Px5ZCpmJqnjIzcFb9TKZrKWz0gnuG/7Gfkt0Db1ELJR51xkZth+t14rYdqWgX836XbuxtArbIHlVhbLBA==", - "dev": true, - "requires": { - "eslint-restricted-globals": "^0.1.1" - } - }, - "eslint-import-resolver-babel-module": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-babel-module/-/eslint-import-resolver-babel-module-4.0.0.tgz", - "integrity": "sha512-aPj0+pG0H3HCaMD9eRDYEzPdMyKrLE2oNhAzTXd2w86ZBe3s7drSrrPwVTfzO1CBp13FGk8S84oRmZHZvSo0mA==", - "dev": true, - "requires": { - "pkg-up": "^2.0.0", - "resolve": "^1.4.0" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "find-up": "^2.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.2", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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, "requires": { - "ms": "2.0.0" + "color-convert": "^2.0.1" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true } } }, - "eslint-plugin-jsx-a11y": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz", - "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==", - "dev": true, - "requires": { - "@babel/runtime": "^7.16.3", - "aria-query": "^4.2.2", - "array-includes": "^3.1.4", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.3.5", - "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.7", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.2.1", - "language-tags": "^1.0.5", - "minimatch": "^3.0.4" - } - }, "eslint-plugin-react": { - "version": "7.29.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz", - "integrity": "sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==", + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz", + "integrity": "sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A==", "dev": true, "requires": { - "array-includes": "^3.1.4", - "array.prototype.flatmap": "^1.2.5", + "array-includes": "^3.1.5", + "array.prototype.flatmap": "^1.3.0", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.5", "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.0", + "object.hasown": "^1.1.1", "object.values": "^1.1.5", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.3", "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.6" + "string.prototype.matchall": "^4.0.7" }, "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "resolve": { "version": "2.0.0-next.3", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", @@ -34090,19 +20527,20 @@ } } }, - "eslint-restricted-globals": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", - "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", - "dev": true + "eslint-plugin-react-hooks": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz", + "integrity": "sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==", + "dev": true, + "requires": {} }, "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" }, "dependencies": { @@ -34114,12 +20552,49 @@ } } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true }, + "espree": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", + "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", + "dev": true, + "requires": { + "acorn": "^8.7.1", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, "esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -34135,27 +20610,21 @@ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, - "estree-to-babel": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/estree-to-babel/-/estree-to-babel-3.2.1.tgz", - "integrity": "sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.6", - "@babel/types": "^7.2.0", - "c8": "^7.6.0" - } + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true }, "eventemitter3": { @@ -34166,18 +20635,9 @@ "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", "dev": true }, - "eventsource": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", - "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -34189,208 +20649,31 @@ } }, "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "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" } }, "exenv": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", - "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=" + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==" }, "express": { "version": "4.18.1", @@ -34431,6 +20714,12 @@ "vary": "~1.1.2" }, "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -34443,7 +20732,13 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, "safe-buffer": { @@ -34469,64 +20764,6 @@ } } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, "faker": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", @@ -34556,18 +20793,18 @@ "micromatch": "^4.0.4" } }, - "fast-json-parse": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", - "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==", - "dev": true - }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, "fast-xml-parser": { "version": "3.21.1", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz", @@ -34577,10 +20814,10 @@ "strnum": "^1.0.4" } }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", "dev": true }, "fastq": { @@ -34592,15 +20829,6 @@ "reusify": "^1.0.4" } }, - "fault": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", - "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", - "dev": true, - "requires": { - "format": "^0.2.0" - } - }, "faye-websocket": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", @@ -34648,11 +20876,14 @@ "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==" }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } }, "file-loader": { "version": "6.2.0", @@ -34662,39 +20893,17 @@ "requires": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" - } - }, - "file-system-cache": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-1.0.5.tgz", - "integrity": "sha1-hCWbNqK7uNPW6xAh0xMv/mTP/08=", - "dev": true, - "requires": { - "bluebird": "^3.3.5", - "fs-extra": "^0.30.0", - "ramda": "^0.21.0" }, "dependencies": { - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } } } @@ -34705,11 +20914,34 @@ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "dev": true }, - "filesize": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", - "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", - "dev": true + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } }, "fill-range": { "version": "7.0.1", @@ -34747,7 +20979,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -34761,51 +20993,6 @@ "commondir": "^1.0.1", "make-dir": "^2.0.0", "pkg-dir": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - } } }, "find-root": { @@ -34814,142 +21001,12 @@ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" }, "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, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "findup-sync": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } + "locate-path": "^3.0.0" } }, "flat-cache": { @@ -34960,17 +21017,6 @@ "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } } }, "flatted": { @@ -34985,42 +21031,6 @@ "integrity": "sha512-xW+U2SrBaAr0EeLvKmXAmsdnrH6x0Io17P6yRJTNgrrV42G8KXhBAD00s6oGbTTqRyHD0nP47kyuU34zljZpaQ==", "dev": true }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "flux": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz", @@ -35037,212 +21047,38 @@ "dev": true }, "follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", "dev": true }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" + "is-callable": "^1.1.3" } }, - "fork-ts-checker-webpack-plugin": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", - "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "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 - }, - "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, - "requires": { - "yallist": "^4.0.0" - } - }, - "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=", - "dev": true - }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -35255,15 +21091,6 @@ "universalify": "^2.0.0" } }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, "fs-monkey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", @@ -35276,22 +21103,10 @@ "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", "dev": true }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { "version": "2.3.2", @@ -35317,39 +21132,22 @@ "functions-have-names": "^1.2.2" } }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" - }, - "fuse.js": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.6.1.tgz", - "integrity": "sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw==", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, - "gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - } - }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-caller-file": { "version": "2.0.5", @@ -35367,14 +21165,17 @@ "has-symbols": "^1.0.1" } }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } + "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 }, "get-symbol-description": { "version": "1.0.0", @@ -35386,21 +21187,15 @@ "get-intrinsic": "^1.1.1" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } @@ -35429,61 +21224,10 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "dev": true, - "requires": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globalthis": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz", - "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3" - } + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globby": { "version": "11.1.0", @@ -35510,21 +21254,16 @@ "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "gud": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true }, "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "dev": true, "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" + "duplexer": "^0.1.2" } }, "handle-thing": { @@ -35533,27 +21272,6 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -35565,7 +21283,7 @@ "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -35574,7 +21292,7 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true } } @@ -35588,27 +21306,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-1.0.0.tgz", - "integrity": "sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc=", - "dev": true, - "requires": { - "is-glob": "^3.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "has-property-descriptors": { "version": "1.0.0", @@ -35627,74 +21325,11 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, "requires": { "has-symbols": "^1.0.2" } }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -35744,85 +21379,6 @@ "minimalistic-assert": "^1.0.1" } }, - "hast-to-hyperscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", - "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", - "dev": true, - "requires": { - "@types/unist": "^2.0.3", - "comma-separated-tokens": "^1.0.0", - "property-information": "^5.3.0", - "space-separated-tokens": "^1.0.0", - "style-to-object": "^0.3.0", - "unist-util-is": "^4.0.0", - "web-namespaces": "^1.0.0" - } - }, - "hast-util-from-parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", - "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", - "dev": true, - "requires": { - "@types/parse5": "^5.0.0", - "hastscript": "^6.0.0", - "property-information": "^5.0.0", - "vfile": "^4.0.0", - "vfile-location": "^3.2.0", - "web-namespaces": "^1.0.0" - } - }, - "hast-util-parse-selector": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", - "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", - "dev": true - }, - "hast-util-raw": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", - "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", - "dev": true, - "requires": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^6.0.0", - "hast-util-to-parse5": "^6.0.0", - "html-void-elements": "^1.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^3.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - } - }, - "hast-util-to-parse5": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", - "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", - "dev": true, - "requires": { - "hast-to-hyperscript": "^9.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - } - }, - "hastscript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", - "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", - "dev": true, - "requires": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - } - }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -35835,18 +21391,22 @@ "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" }, "history": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/history/-/history-5.0.0.tgz", - "integrity": "sha512-3NyRMKIiFSJmIPdq7FxkNMJkQ7ZEtVblOQ38VtKaA0zZMW1Eo6Q6W8oDKEflr1kNNTItSnk4JMCO1deeSgbLLg==", - "dev": true, + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", "requires": { - "@babel/runtime": "^7.7.6" + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" } }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "dev": true, "requires": { "hash.js": "^1.0.3", @@ -35860,13 +21420,6 @@ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "requires": { "react-is": "^16.7.0" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } } }, "homedir-polyfill": { @@ -35878,22 +21431,10 @@ "parse-passwd": "^1.0.0" } }, - "hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", - "dev": true - }, - "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 - }, "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -35934,188 +21475,45 @@ "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "dev": true }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", "dev": true, "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" }, "dependencies": { "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", - "dev": true, - "requires": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - } - } - } - } - }, - "html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", - "dev": true, - "requires": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", - "he": "^1.2.0", - "param-case": "^3.0.3", - "relateurl": "^0.2.7", - "terser": "^4.6.3" - }, - "dependencies": { - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true } } }, - "html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==" - }, "html-to-image": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.9.0.tgz", "integrity": "sha512-9gaDCIYg62Ek07F2pBk76AHgYZ2gxq2YALU7rK3gNCqXuhu6cWzsOQqM7qGbjZiOzxGzrU1deDqZpAod2NEwbA==" }, - "html-void-elements": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", - "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", - "dev": true - }, "html-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", - "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", "dev": true, "requires": { - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "tapable": "^1.0.0", - "toposort": "^1.0.0", - "util.promisify": "1.0.0" - }, - "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - } + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" } }, "html2canvas": { @@ -36131,7 +21529,7 @@ "htmlparser2": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==", "requires": { "domelementtype": "1", "domhandler": "2.3", @@ -36143,14 +21541,14 @@ "entities": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" + "integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==" } } }, "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "dev": true }, "http-errors": { @@ -36192,138 +21590,22 @@ } }, "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "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 }, "iconv-lite": { @@ -36335,20 +21617,18 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, - "requires": { - "postcss": "^7.0.14" - } + "requires": {} + }, + "idb": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/idb/-/idb-6.1.5.tgz", + "integrity": "sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==", + "dev": true }, "ieee754": { "version": "1.1.13", @@ -36356,12 +21636,6 @@ "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, "ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -36369,18 +21643,9 @@ "dev": true }, "immutable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", - "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==" - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==" }, "import-fresh": { "version": "3.3.0", @@ -36389,83 +21654,59 @@ "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" - }, - "dependencies": { - "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==" - } - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } } }, "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" }, "dependencies": { "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "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, "requires": { - "p-limit": "^2.0.0" + "p-limit": "^2.2.0" } }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "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 }, "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { - "find-up": "^3.0.0" + "find-up": "^4.0.0" } } } @@ -36473,25 +21714,13 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "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 - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "requires": { "once": "^1.3.0", "wrappy": "1" @@ -36502,36 +21731,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", - "dev": true - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - } - } - }, "internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -36562,59 +21761,17 @@ "loose-envify": "^1.0.0" } }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, "ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", "dev": true }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", - "dev": true - }, - "is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "dev": true, - "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - } - }, "is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -36623,7 +21780,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "is-bigint": { "version": "1.0.4", @@ -36653,12 +21810,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true - }, "is-callable": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", @@ -36673,65 +21824,25 @@ "has": "^1.0.3" } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, "is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, "requires": { "has-tostringtag": "^1.0.0" } }, - "is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", - "dev": true - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, "is-fullwidth-code-point": { @@ -36740,12 +21851,6 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, - "is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", - "dev": true - }, "is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -36764,16 +21869,10 @@ "is-extglob": "^2.1.1" } }, - "is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", - "dev": true - }, - "is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true }, "is-negative-zero": { @@ -36797,34 +21896,16 @@ "has-tostringtag": "^1.0.0" } }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "dev": true }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true }, "is-plain-object": { @@ -36840,15 +21921,16 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, - "is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", "dev": true }, "is-shared-array-buffer": { @@ -36861,9 +21943,9 @@ } }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "is-string": { @@ -36884,22 +21966,16 @@ "has-symbols": "^1.0.2" } }, - "is-there": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/is-there/-/is-there-4.5.1.tgz", - "integrity": "sha512-vIZ7HTXAoRoIwYSsTnxb0sg9L6rth+JOulNcavsbskQkCIWoSM2cjFOWZs4wGziGZER+Xgs/HXiCQZgiL8ppxQ==", - "dev": true - }, "is-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", - "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", + "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.18.5", - "foreach": "^2.0.5", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", "has-tostringtag": "^1.0.0" } }, @@ -36912,24 +21988,6 @@ "call-bind": "^1.0.2" } }, - "is-whitespace-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", - "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-word-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", - "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", - "dev": true - }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -36942,53 +22000,73 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", "dev": true, "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" }, "dependencies": { + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, "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 }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -37000,41 +22078,15 @@ } } }, - "istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "iterate-iterator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", - "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", - "dev": true - }, - "iterate-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", - "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", - "dev": true, - "requires": { - "es-get-iterator": "^1.0.2", - "iterate-iterator": "^1.0.1" - } - }, "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "supports-color": "^8.0.0" }, "dependencies": { "has-flag": { @@ -37044,9 +22096,9 @@ "dev": true }, "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==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -37060,11 +22112,10 @@ "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", "dev": true }, - "js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", - "dev": true + "jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" }, "js-tokens": { "version": "4.0.0", @@ -37072,13 +22123,20 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" + }, + "dependencies": { + "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 + } } }, "jsbi": { @@ -37089,8 +22147,7 @@ "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, "jshint": { "version": "2.13.4", @@ -37113,37 +22170,47 @@ "requires": { "brace-expansion": "^1.1.7" } + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=" } } }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, "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==" }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "json-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-stream/-/json-stream-1.0.0.tgz", - "integrity": "sha1-GjhU4o0rvuqzHMfd9oPS3cVlJwg=", + "integrity": "sha512-H/ZGY0nIAg3QcOwE1QN/rK/Fa7gJn7Ii5obwp6zyPO4xiPNwpIMjqy2gwjBEGqzkF/vSWEIBQCBuN19hYiL6Qg==", "dev": true }, "json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" }, "jsonfile": { "version": "6.1.0", @@ -37155,6 +22222,12 @@ "universalify": "^2.0.0" } }, + "jsonpointer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz", + "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==", + "dev": true + }, "jspdf": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.1.tgz", @@ -37180,44 +22253,17 @@ "object.assign": "^4.1.2" } }, - "junk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", - "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", - "dev": true - }, "keyboard-key": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/keyboard-key/-/keyboard-key-1.1.0.tgz", "integrity": "sha512-qkBzPTi3rlAKvX7k0/ub44sqOfXeLc/jcnGGmj5c7BJpU8eDrEVPyhCvNYAaoubbsLm9uGWwQJO1ytQK1a9/dQ==" }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, "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 }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, "klona": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", @@ -37230,40 +22276,20 @@ "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", "dev": true }, - "language-subtag-registry": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", - "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==", + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true }, - "language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { - "language-subtag-registry": "~0.3.2" - } - }, - "lazy-universal-dotenv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-3.0.1.tgz", - "integrity": "sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.5.0", - "app-root-dir": "^1.0.2", - "core-js": "^3.0.4", - "dotenv": "^8.0.0", - "dotenv-expand": "^5.1.0" - }, - "dependencies": { - "dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", - "dev": true - } + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, "lilconfig": { @@ -37278,9 +22304,9 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true }, "loader-utils": { @@ -37295,12 +22321,13 @@ } }, "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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "p-locate": "^5.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, "lodash": { @@ -37308,44 +22335,54 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, "lodash.curry": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=" + "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "lodash.difference": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", "dev": true }, "lodash.flow": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", - "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" + "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "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 }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", "dev": true }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true }, "logform": { @@ -37361,12 +22398,6 @@ "triple-beam": "^1.3.0" } }, - "loglevel": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", - "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", - "dev": true - }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -37376,28 +22407,29 @@ } }, "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "lowlight": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", - "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, "requires": { - "fault": "^1.0.0", - "highlight.js": "~10.7.0" + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + } } }, "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "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, "requires": { - "yallist": "^3.0.2" + "yallist": "^4.0.0" } }, "luxon": { @@ -37405,6 +22437,15 @@ "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz", "integrity": "sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ==" }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -37423,37 +22464,10 @@ } } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-or-similar": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", - "integrity": "sha1-beJlMXSt+12e3DPGnT6Sobdvrwg=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "markdown-escapes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", - "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", - "dev": true - }, - "markdown-to-jsx": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.7.tgz", - "integrity": "sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w==", + "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 }, "md5-file": { @@ -37473,62 +22487,21 @@ "safe-buffer": "^5.1.2" } }, - "mdast-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", - "dev": true, - "requires": { - "unist-util-remove": "^2.0.0" - } - }, - "mdast-util-definitions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", - "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", - "dev": true, - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "mdast-util-to-hast": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", - "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "mdast-util-definitions": "^4.0.0", - "mdurl": "^1.0.0", - "unist-builder": "^2.0.0", - "unist-util-generated": "^1.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0" - } - }, "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", - "dev": true + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true }, "memfs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", - "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.4.tgz", + "integrity": "sha512-W4gHNUE++1oSJVn8Y68jPXi+mkx3fXR5ITE/Ubz6EQ3xRpCN5k2CQ4AUR8094Z7211F876TyoBACGsIveqgiGA==", "dev": true, "requires": { "fs-monkey": "1.0.3" @@ -37539,55 +22512,10 @@ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" }, - "memoizerific": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", - "integrity": "sha1-fIekZGREwy11Q4VwkF8tvRsagFo=", - "dev": true, - "requires": { - "map-or-similar": "^1.5.0" - } - }, - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "dev": true }, "merge-stream": { @@ -37605,13 +22533,7 @@ "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "microevent.ts": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", - "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true }, "micromatch": { @@ -37663,62 +22585,58 @@ "mime-db": "1.52.0" } }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true, - "requires": { - "dom-walk": "^0.1.0" - } - }, - "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==", + "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 }, "mini-css-extract-plugin": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.7.0.tgz", - "integrity": "sha512-RQIw6+7utTYn8DBGsf/LpRgZCJMpZt+kuawJ/fju0KiOL6nAaTBNmCJwS7HtwSCXfS47gCkmtBFS7HdsquhdxQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz", + "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==", "dev": true, "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" + "schema-utils": "^4.0.0" }, "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { - "minimist": "^1.2.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "fast-deep-equal": "^3.1.3" } }, + "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 + }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } } } @@ -37732,7 +22650,7 @@ "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", "dev": true }, "minimatch": { @@ -37746,7 +22664,8 @@ "minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true }, "minio": { "version": "7.0.28", @@ -37773,132 +22692,6 @@ "xml2js": "^0.4.15" } }, - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - } - }, "mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -37909,14 +22702,15 @@ } }, "mobx": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.5.0.tgz", - "integrity": "sha512-pHZ/cySF00FVENDWIDzJyoObFahK6Eg4d0papqm6d7yMkxWTZ/S/csqJX1A3PsYy4t5k3z2QnlwuCfMW5lSEwA==" + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.6.0.tgz", + "integrity": "sha512-MNTKevLH/6DShLZcmSL351+JgiJPO56A4GUpoiDQ3/yZ0mAtclNLdHK9q4BcQhibx8/JSDupfTpbX2NZPemlRg==" }, "mobx-react-lite": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.3.0.tgz", - "integrity": "sha512-U/kMSFtV/bNVgY01FuiGWpRkaQVHozBq5CEBZltFvPt4FcV111hEWkgwqVg9GPPZSEuEdV438PEz8mk8mKpYlA==" + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.4.0.tgz", + "integrity": "sha512-bRuZp3C0itgLKHu/VNxi66DN/XVkQG7xtoBVWxpvC5FhAqbOCP21+nPhULjnzEqd7xBMybp6KwytdUpZKEgpIQ==", + "requires": {} }, "moment": { "version": "2.29.3", @@ -37933,26 +22727,18 @@ } }, "moment-range": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/moment-range/-/moment-range-4.0.2.tgz", - "integrity": "sha512-n8sceWwSTjmz++nFHzeNEUsYtDqjgXgcOBzsHi+BoXQU2FW+eU92LUaK8gqOiSu5PG57Q9sYj1Fz4LRDj4FtKA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/moment-range/-/moment-range-3.1.1.tgz", + "integrity": "sha512-VqJIVDs6wUzCjTkSmkOwqRseqAo3+En2rdsKEKIWtPxzo+uJdRQGjU2HWJr6/zL3fZJdNtpddyDkB4Pfyg8KLQ==", "requires": { "es6-symbol": "^3.1.0" } }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } + "mrmime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.0.tgz", + "integrity": "sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ==", + "dev": true }, "ms": { "version": "2.1.2", @@ -37960,46 +22746,26 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, "requires": { - "dns-packet": "^1.3.1", + "dns-packet": "^5.2.2", "thunky": "^1.0.2" } }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", "dev": true }, - "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true }, "negotiator": { "version": "0.6.3", @@ -38013,30 +22779,27 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "nested-error-stacks": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", - "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", - "dev": true - }, "next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, "requires": { - "lower-case": "^1.1.1" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + } } }, "node-addon-api": { @@ -38045,21 +22808,22 @@ "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", "dev": true }, - "node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", + "node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", "dev": true, "requires": { - "minimatch": "^3.0.2" - } - }, - "node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "requires": { - "lodash": "^4.17.21" + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "node-fetch": { @@ -38071,156 +22835,15 @@ } }, "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "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, - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "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 - } - } - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - } - } - }, "node-releases": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", - "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==" - }, - "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, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", + "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" }, "normalize-path": { "version": "3.0.0", @@ -38231,186 +22854,58 @@ "normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true }, "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, - "normalize.css": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", - "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true }, "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "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, "requires": { - "path-key": "^2.0.0" - }, - "dependencies": { - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - } - } - }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dev": true, - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" + "path-key": "^3.0.0" } }, "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "requires": { - "boolbase": "~1.0.0" + "boolbase": "^1.0.0" } }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" - }, - "object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "dev": true }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, "object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", @@ -38441,33 +22936,25 @@ } }, "object.getownpropertydescriptors": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", - "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", + "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", "dev": true, "requires": { + "array.prototype.reduce": "^1.0.4", "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.1" } }, "object.hasown": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", - "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" } }, "object.values": { @@ -38481,12 +22968,6 @@ "es-abstract": "^1.19.1" } }, - "objectorarray": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz", - "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==", - "dev": true - }, "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -38511,7 +22992,7 @@ "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "requires": { "wrappy": "1" } @@ -38525,14 +23006,24 @@ "fn.name": "1.x.x" } }, - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" } }, "opener": { @@ -38541,93 +23032,20 @@ "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { - "is-wsl": "^1.1.0" - }, - "dependencies": { - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - } + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" } }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "overlayscrollbars": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/overlayscrollbars/-/overlayscrollbars-1.13.1.tgz", - "integrity": "sha512-gIQfzgGgu1wy80EB4/6DaJGHMEGmizq27xHIESrzXq0Y/J0Ay1P3DWk6tuVmEPIZH15zaBlxeEJOqdJKmowHCQ==", - "dev": true - }, - "p-all": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-all/-/p-all-2.1.0.tgz", - "integrity": "sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA==", - "dev": true, - "requires": { - "p-map": "^2.0.0" - }, - "dependencies": { - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - } - } - }, - "p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", - "dev": true, - "requires": { - "p-timeout": "^3.1.0" - } - }, - "p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dev": true, - "requires": { - "p-map": "^2.0.0" - }, - "dependencies": { - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - } - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -38638,50 +23056,22 @@ } }, "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, - "requires": { - "p-limit": "^3.0.2" - }, - "dependencies": { - "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, - "requires": { - "yocto-queue": "^0.1.0" - } - } - } - }, - "p-map": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "aggregate-error": "^3.0.0" + "p-limit": "^2.0.0" } }, "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dev": true, "requires": { - "retry": "^0.12.0" - } - }, - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "requires": { - "p-finally": "^1.0.0" + "@types/retry": "0.12.0", + "retry": "^0.13.1" } }, "p-try": { @@ -38690,58 +23080,24 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" + "dot-case": "^3.0.4", + "tslib": "^2.0.3" }, "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true } } }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -38763,20 +23119,6 @@ "safe-buffer": "^5.1.1" } }, - "parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "dev": true, - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -38791,13 +23133,7 @@ "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true }, "parseurl": { @@ -38816,25 +23152,6 @@ "tslib": "^2.0.3" }, "dependencies": { - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "requires": { - "tslib": "^2.0.3" - } - }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", @@ -38843,40 +23160,16 @@ } } }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, "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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "path-key": { "version": "3.1.1", @@ -38890,10 +23183,19 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + } + } }, "path-type": { "version": "4.0.0", @@ -38958,21 +23260,6 @@ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, "pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -38980,90 +23267,12 @@ "dev": true }, "pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { - "find-up": "^5.0.0" - } - }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "pnp-webpack-plugin": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", - "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", - "dev": true, - "requires": { - "ts-pnp": "^1.1.6" - } - }, - "polished": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz", - "integrity": "sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.17.8" + "find-up": "^3.0.0" } }, "popper.js": { @@ -39071,62 +23280,15 @@ "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", "dev": true, "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" } }, "postcss-calc": { @@ -39137,14 +23299,6 @@ "requires": { "postcss-selector-parser": "^6.0.9", "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - } } }, "postcss-colormin": { @@ -39157,320 +23311,112 @@ "caniuse-api": "^3.0.0", "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - } } }, "postcss-convert-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz", - "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", + "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", "dev": true, "requires": { + "browserslist": "^4.20.3", "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - } } }, "postcss-discard-comments": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", - "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", - "dev": true + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "dev": true, + "requires": {} }, "postcss-discard-duplicates": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true + "dev": true, + "requires": {} }, "postcss-discard-empty": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true + "dev": true, + "requires": {} }, "postcss-discard-overridden": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true - }, - "postcss-flexbugs-fixes": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz", - "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", "dev": true, - "requires": { - "postcss": "^7.0.26" - } - }, - "postcss-functions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-functions/-/postcss-functions-3.0.0.tgz", - "integrity": "sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4=", - "requires": { - "glob": "^7.1.2", - "object-assign": "^4.1.1", - "postcss": "^6.0.9", - "postcss-value-parser": "^3.3.0" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } + "requires": {} }, "postcss-import": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", - "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", "dev": true, "requires": { - "postcss": "^7.0.1", - "postcss-value-parser": "^3.2.3", + "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" } }, - "postcss-inline-svg": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-inline-svg/-/postcss-inline-svg-3.1.1.tgz", - "integrity": "sha512-G2BkarW6gGpGFGAiKzW7aiulUS0/6QuCgq1riZEiX4oMaUTpU1pdW7BU6UFRDrdKkwS0r4icK2pU0bg6sCSOjw==", + "postcss-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", "dev": true, "requires": { - "css-select": "^1.2.0", - "dom-serializer": "^0.1.0", - "htmlparser2": "^3.9.0", - "postcss": "^6.0.1", - "postcss-value-parser": "^3.2.3" - }, - "dependencies": { - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "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 - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "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, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "postcss-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-2.0.3.tgz", - "integrity": "sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w==", - "requires": { - "camelcase-css": "^2.0.1", - "postcss": "^7.0.18" + "camelcase-css": "^2.0.1" } }, "postcss-load-config": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", - "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", "dev": true, "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" } }, "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.0.tgz", + "integrity": "sha512-IDyttebFzTSY6DI24KuHUcBjbAev1i+RyICoPEWcAstZsj03r533uMXtDn506l6/wlsRYiS5XBdx7TpccCsyUg==", "dev": true, "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.7" }, "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "lru-cache": "^6.0.0" } } } }, "postcss-merge-longhand": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz", - "integrity": "sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz", + "integrity": "sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0", "stylehacks": "^5.1.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - } } }, "postcss-merge-rules": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz", - "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", + "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", "dev": true, "requires": { "browserslist": "^4.16.6", @@ -39486,14 +23432,6 @@ "dev": true, "requires": { "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - } } }, "postcss-minify-gradients": { @@ -39505,382 +23443,101 @@ "colord": "^2.9.1", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - } } }, "postcss-minify-params": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz", - "integrity": "sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", + "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", "dev": true, "requires": { "browserslist": "^4.16.6", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - } } }, "postcss-minify-selectors": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", - "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", "dev": true, "requires": { "postcss-selector-parser": "^6.0.5" } }, "postcss-mixins": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/postcss-mixins/-/postcss-mixins-6.2.3.tgz", - "integrity": "sha512-gfH5d09YilzDn/CLGFA9Lwv7GTezuyHgnAyXC8AfvhUMpl67ZTewhcpNuOgawClCOD+76XePE2IHO1xMgsOlvA==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/postcss-mixins/-/postcss-mixins-9.0.2.tgz", + "integrity": "sha512-LaFjXcR+7LRji+Sc6DRn1mUw43+Y9Lyh5JjFTQDedlIi4W6REAesRXRJLlms5424vb0zerBfCVZzS2ZHRxGZOA==", "dev": true, "requires": { - "globby": "^8.0.1", - "postcss": "^7.0.21", - "postcss-js": "^2.0.3", - "postcss-simple-vars": "^5.0.2", - "sugarss": "^2.0.0" - }, - "dependencies": { - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - } - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "postcss-simple-vars": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-5.0.2.tgz", - "integrity": "sha512-xWIufxBoINJv6JiLb7jl5oElgp+6puJwvT5zZHliUSydoLz4DADRB3NDDsYgfKVwojn4TDLiseoC65MuS8oGGg==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } + "fast-glob": "^3.2.11", + "postcss-js": "^4.0.0", + "postcss-simple-vars": "^6.0.3", + "sugarss": "^4.0.1" } }, "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", "dev": true, - "requires": { - "postcss": "^7.0.5" - } + "requires": {} }, "postcss-modules-local-by-default": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", - "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", "dev": true, "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.32", + "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.1.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - } } }, "postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "dev": true, "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" + "postcss-selector-parser": "^6.0.4" } }, "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" + "icss-utils": "^5.0.0" } }, "postcss-nested": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-4.2.3.tgz", - "integrity": "sha512-rOv0W1HquRCamWy2kFl3QazJMMe1ku6rCFoAAH+9AcxdbpDeBr6k968MLWuLjvjMcGEip01ak09hKOEgpK9hvw==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "dev": true, "requires": { - "postcss": "^7.0.32", - "postcss-selector-parser": "^6.0.2" + "postcss-selector-parser": "^6.0.6" } }, "postcss-nesting": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-4.2.1.tgz", - "integrity": "sha512-IkyWXICwagCnlaviRexi7qOdwPw3+xVVjgFfGsxmztvRVaNxAlrypOIKqDE5mxY+BVxnId1rnUKBRQoNE2VDaA==", + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.7.tgz", + "integrity": "sha512-Btho5XzDTpl117SmB3tvUHP8txg5n7Ayv7vQ5m4b1zXkfs1Y52C67uZjZ746h7QvOJ+rLRg50OlhhjFW+IQY6A==", "dev": true, "requires": { - "postcss": "^6.0.11" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "@csstools/selector-specificity": "1.0.0", + "postcss-selector-parser": "^6.0.10" } }, "postcss-normalize-charset": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true + "dev": true, + "requires": {} }, "postcss-normalize-display-values": { "version": "5.1.0", @@ -39889,14 +23546,6 @@ "dev": true, "requires": { "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - } } }, "postcss-normalize-positions": { @@ -39906,14 +23555,6 @@ "dev": true, "requires": { "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - } } }, "postcss-normalize-repeat-style": { @@ -39923,14 +23564,6 @@ "dev": true, "requires": { "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - } } }, "postcss-normalize-string": { @@ -39940,14 +23573,6 @@ "dev": true, "requires": { "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - } } }, "postcss-normalize-timing-functions": { @@ -39957,14 +23582,6 @@ "dev": true, "requires": { "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - } } }, "postcss-normalize-unicode": { @@ -39975,14 +23592,6 @@ "requires": { "browserslist": "^4.16.6", "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - } } }, "postcss-normalize-url": { @@ -39993,20 +23602,6 @@ "requires": { "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - } } }, "postcss-normalize-whitespace": { @@ -40016,14 +23611,6 @@ "dev": true, "requires": { "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - } } }, "postcss-ordered-values": { @@ -40034,14 +23621,6 @@ "requires": { "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - } } }, "postcss-reduce-initial": { @@ -40061,52 +23640,24 @@ "dev": true, "requires": { "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - } } }, "postcss-selector-parser": { "version": "6.0.10", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "postcss-simple-vars": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-4.1.0.tgz", - "integrity": "sha512-J/TRomA8EqXhS4VjQJsPCYTFIa9FYN/dkJK/8oZ0BYeVIPx91goqM8T+ljsP57+4bwSEywFOuB7EZ8n1gjjxZw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-6.0.3.tgz", + "integrity": "sha512-fkNn4Zio8vN4vIig9IFdb8lVlxWnYR769RgvxCM6YWlFKie/nQaOcaMMMFz/s4gsfHW4/5bJW+i57zD67mQU7g==", "dev": true, - "requires": { - "postcss": "^6.0.9" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } + "requires": {} }, "postcss-svgo": { "version": "5.1.0", @@ -40116,122 +23667,6 @@ "requires": { "postcss-value-parser": "^4.2.0", "svgo": "^2.7.0" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - } - } } }, "postcss-unique-selectors": { @@ -40244,49 +23679,39 @@ } }, "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "prettier": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.0.tgz", - "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", + "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", + "dev": true + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true }, "pretty-error": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "dev": true, "requires": { "lodash": "^4.17.20", - "renderkid": "^2.0.4" + "renderkid": "^3.0.0" } }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" - }, - "prismjs": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", - "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -40301,47 +23726,6 @@ "asap": "~2.0.3" } }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "promise.allsettled": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.5.tgz", - "integrity": "sha512-tVDqeZPoBC0SlzJHzWGZ2NKAguVq2oiYj7gbggbiTvH2itHohijTp7njOUA0aQ/nl+0lr/r6egmhoYu63UZ/pQ==", - "dev": true, - "requires": { - "array.prototype.map": "^1.0.4", - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "iterate-value": "^1.0.2" - } - }, - "promise.prototype.finally": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/promise.prototype.finally/-/promise.prototype.finally-3.1.3.tgz", - "integrity": "sha512-EXRF3fC9/0gz4qkt/f5EP5iW4kj9oFpBICNpCNOb/52+8nlHIX07FPLbi/q4qYBQ1xZqivMzTpNQSnArVASolQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, "prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -40350,22 +23734,6 @@ "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "dev": true, - "requires": { - "xtend": "^4.0.0" } }, "proxy-addr": { @@ -40386,12 +23754,6 @@ } } }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -40414,39 +23776,6 @@ } } }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -40458,53 +23787,6 @@ "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", "integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=" }, - "purgecss": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-2.3.0.tgz", - "integrity": "sha512-BE5CROfVGsx2XIhxGuZAT7rTH9lLeQx/6M0P7DTXQH4IUc3BBzs9JUzt4yzGf3JrH9enkeq6YJBe9CTtkm1WmQ==", - "requires": { - "commander": "^5.0.0", - "glob": "^7.0.0", - "postcss": "7.0.32", - "postcss-selector-parser": "^6.0.2" - }, - "dependencies": { - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" - }, - "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, "qs": { "version": "6.10.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", @@ -40514,40 +23796,24 @@ "side-channel": "^1.0.4" } }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", "dev": true }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, "raf": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", @@ -40556,12 +23822,6 @@ "performance-now": "^2.1.0" } }, - "ramda": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.21.0.tgz", - "integrity": "sha1-oAGr7bP/YQd9T/HVd9RN536NCjU=", - "dev": true - }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -40607,16 +23867,6 @@ } } }, - "raw-loader": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", - "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - } - }, "rc-align": { "version": "2.4.5", "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-2.4.5.tgz", @@ -40679,13 +23929,6 @@ "react-is": "^16.12.0", "react-lifecycles-compat": "^3.0.4", "shallowequal": "^1.1.0" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } } }, "react": { @@ -40729,34 +23972,24 @@ "react-circular-progressbar": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/react-circular-progressbar/-/react-circular-progressbar-2.0.4.tgz", - "integrity": "sha512-OfX0ThSxRYEVGaQSt0DlXfyl5w4DbXHsXetyeivmoQrh9xA9bzVPHNf8aAhOIiwiaxX2WYWpLDB3gcpsDJ9oww==" - }, - "react-codemirror2": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/react-codemirror2/-/react-codemirror2-5.1.0.tgz", - "integrity": "sha512-Cksbgbviuf2mJfMyrKmcu7ycK6zX/ukuQO8dvRZdFWqATf5joalhjFc6etnBdGCcPA2LbhIwz+OPnQxLN/j1Fw==" - }, - "react-colorful": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.5.1.tgz", - "integrity": "sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==", - "dev": true + "integrity": "sha512-OfX0ThSxRYEVGaQSt0DlXfyl5w4DbXHsXetyeivmoQrh9xA9bzVPHNf8aAhOIiwiaxX2WYWpLDB3gcpsDJ9oww==", + "requires": {} }, "react-confirm": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/react-confirm/-/react-confirm-0.1.24.tgz", - "integrity": "sha512-96qA+mbZyBRmh/3Y5aDgrYLwLndbaRjkP3GlXQtPEQbIH0P66xGcHJ7ui6y/MN85AZWq/V3drA1fJOiEcVkAVA==" + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/react-confirm/-/react-confirm-0.1.27.tgz", + "integrity": "sha512-CWrPjCXqYXIRnnmDbGezN+4Umz+yZnaxFQWqjhz8fJQLTgNC47stON8NK5NjXioXfcfVawCrLj757ztBBNBZFQ==", + "requires": {} }, - "react-datepicker": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-2.16.0.tgz", - "integrity": "sha512-TvcmSY27rn0JKvuJuIXNNS+niGQNdgtuG/CsBttVYhPOA9KmSw7c2PvQBPVEvzkyV+QPNJ8jN/KVJNj9uvopqA==", + "react-date-range": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/react-date-range/-/react-date-range-1.4.0.tgz", + "integrity": "sha512-+9t0HyClbCqw1IhYbpWecjsiaftCeRN5cdhsi9v06YdimwyMR2yYHWcgVn3URwtN/txhqKpEZB6UX1fHpvK76w==", "requires": { "classnames": "^2.2.6", - "date-fns": "^2.0.1", "prop-types": "^15.7.2", - "react-onclickoutside": "^6.9.0", - "react-popper": "^1.3.4" + "react-list": "^0.8.13", + "shallow-equal": "^1.2.1" } }, "react-daterange-picker": { @@ -40775,7 +24008,7 @@ "immutable": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=" + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==" } } }, @@ -40799,47 +24032,6 @@ "dnd-core": "15.1.2" } }, - "react-docgen": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-5.4.0.tgz", - "integrity": "sha512-JBjVQ9cahmNlfjMGxWUxJg919xBBKAoy3hgDgKERbR+BcF4ANpDuzWAScC7j27hZfd8sJNmMPOLWo9+vB/XJEQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@babel/generator": "^7.12.11", - "@babel/runtime": "^7.7.6", - "ast-types": "^0.14.2", - "commander": "^2.19.0", - "doctrine": "^3.0.0", - "estree-to-babel": "^3.1.0", - "neo-async": "^2.6.1", - "node-dir": "^0.1.10", - "strip-indent": "^3.0.0" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - } - } - }, - "react-docgen-typescript": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz", - "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==", - "dev": true - }, "react-dom": { "version": "16.14.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", @@ -40863,8 +24055,7 @@ "react-fast-compare": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", - "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==", - "dev": true + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" }, "react-google-recaptcha": { "version": "1.1.0", @@ -40875,19 +24066,6 @@ "react-async-script": "^1.0.0" } }, - "react-helmet-async": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.12.5", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.2.0", - "shallowequal": "^1.1.0" - } - }, "react-highlight": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-highlight/-/react-highlight-0.14.0.tgz", @@ -40897,10 +24075,9 @@ } }, "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "react-json-view": { "version": "1.21.3", @@ -40916,53 +24093,29 @@ "react-lazyload": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/react-lazyload/-/react-lazyload-3.2.0.tgz", - "integrity": "sha512-zJlrG8QyVZz4+xkYZH5v1w3YaP5wEFaYSUWC4CT9UXfK75IfRAIEdnyIUF+dXr3kX2MOtL1lUaZmaQZqrETwgw==" + "integrity": "sha512-zJlrG8QyVZz4+xkYZH5v1w3YaP5wEFaYSUWC4CT9UXfK75IfRAIEdnyIUF+dXr3kX2MOtL1lUaZmaQZqrETwgw==", + "requires": {} }, "react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, - "react-onclickoutside": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.12.1.tgz", - "integrity": "sha512-a5Q7CkWznBRUWPmocCvE8b6lEYw1s6+opp/60dCunhO+G6E4tDTO2Sd2jKE+leEnnrLAE2Wj5DlDHNqj5wPv1Q==" - }, - "react-popper": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.11.tgz", - "integrity": "sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg==", + "react-list": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/react-list/-/react-list-0.8.17.tgz", + "integrity": "sha512-pgmzGi0G5uGrdHzMhgO7KR1wx5ZXVvI3SsJUmkblSAKtewIhMwbQiMuQiTE83ozo04BQJbe0r3WIWzSO0dR1xg==", "requires": { - "@babel/runtime": "^7.1.2", - "@hypnosphi/create-react-context": "^0.3.1", - "deep-equal": "^1.1.1", - "popper.js": "^1.14.4", - "prop-types": "^15.6.1", - "typed-styles": "^0.0.7", - "warning": "^4.0.2" + "prop-types": "15" } }, - "react-popper-tooltip": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/react-popper-tooltip/-/react-popper-tooltip-3.1.1.tgz", - "integrity": "sha512-EnERAnnKRptQBJyaee5GJScWNUKQPDD2ywvzZyUjst/wj5U64C8/CnSYLNEmP2hG0IJ3ZhtDxE8oDN+KOyavXQ==", - "dev": true, + "react-popper": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", + "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", "requires": { - "@babel/runtime": "^7.12.5", - "@popperjs/core": "^2.5.4", - "react-popper": "^2.2.4" - }, - "dependencies": { - "react-popper": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", - "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", - "dev": true, - "requires": { - "react-fast-compare": "^3.0.1", - "warning": "^4.0.2" - } - } + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" } }, "react-redux": { @@ -40977,21 +24130,8 @@ "prop-types": "^15.6.1", "react-is": "^16.6.0", "react-lifecycles-compat": "^3.0.0" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } } }, - "react-refresh": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", - "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", - "dev": true - }, "react-resize-detector": { "version": "6.7.8", "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-6.7.8.tgz", @@ -41016,36 +24156,10 @@ "warning": "^4.0.1" }, "dependencies": { - "history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "requires": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, "hoist-non-react-statics": { "version": "2.5.5", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "requires": { - "isarray": "0.0.1" - } } } }, @@ -41060,27 +24174,12 @@ "prop-types": "^15.6.1", "react-router": "^4.3.1", "warning": "^4.0.1" - }, - "dependencies": { - "history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "requires": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - } } }, "react-select": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.3.1.tgz", - "integrity": "sha512-Y195MmhDoDAj/8gTDyYZU1Raf7tmZd81wxM6RkFko4pqJ4Xv0/ilqUMtSn+GYkwmSlTWeMlzh+e+t7PJgtuXPw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.3.2.tgz", + "integrity": "sha512-W6Irh7U6Ha7p5uQQ2ZnemoCQ8mcfgOtHfw3wuMzG6FAu0P+CYicgofSLOq97BhjMx8jS+h+wwWdCBeVVZ9VqlQ==", "requires": { "@babel/runtime": "^7.12.0", "@emotion/cache": "^11.4.0", @@ -41089,42 +24188,6 @@ "memoize-one": "^5.0.0", "prop-types": "^15.6.0", "react-transition-group": "^4.3.0" - }, - "dependencies": { - "@emotion/cache": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", - "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", - "requires": { - "@emotion/memoize": "^0.7.4", - "@emotion/sheet": "^1.1.0", - "@emotion/utils": "^1.0.0", - "@emotion/weak-memoize": "^0.2.5", - "stylis": "4.0.13" - } - }, - "@emotion/sheet": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", - "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" - }, - "@emotion/utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", - "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" - } - } - }, - "react-sizeme": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/react-sizeme/-/react-sizeme-3.0.2.tgz", - "integrity": "sha512-xOIAOqqSSmKlKFJLO3inBQBdymzDuXx4iuwkNcJmC96jeiOg5ojByvL+g3MW9LPEsojLbC6pf68zOfobK8IPlw==", - "dev": true, - "requires": { - "element-resize-detector": "^1.2.2", - "invariant": "^2.2.4", - "shallowequal": "^1.1.0", - "throttle-debounce": "^3.0.1" } }, "react-smooth": { @@ -41166,27 +24229,14 @@ "prop-types": "^15.7.2" } }, - "react-syntax-highlighter": { - "version": "13.5.3", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-13.5.3.tgz", - "integrity": "sha512-crPaF+QGPeHNIblxxCdf2Lg936NAHKhNhuMzRL3F9ct6aYXL3NcZtCL0Rms9+qVo6Y1EQLdXGypBNSbPL/r+qg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.3.1", - "highlight.js": "^10.1.1", - "lowlight": "^1.14.0", - "prismjs": "^1.21.0", - "refractor": "^3.1.0" - } - }, "react-textarea-autosize": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz", - "integrity": "sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz", + "integrity": "sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==", "requires": { "@babel/runtime": "^7.10.2", - "use-composed-ref": "^1.0.0", - "use-latest": "^1.0.0" + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" } }, "react-tippy": { @@ -41198,9 +24248,9 @@ } }, "react-toastify": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-8.2.0.tgz", - "integrity": "sha512-Pg2Ju7NngAamarFvLwqrFomJ57u/Ay6i6zfLurt/qPynWkAkOthu6vxfqYpJCyNhHRhR4hu7+bySSeWWJu6PAg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.0.3.tgz", + "integrity": "sha512-0QZJk0SqYBxouRBGCFU3ymvjlwimRRhVH7SzqGRiVrQ001KSoUNbGKx9Yq42aoPv18n45yJzEFG82zqv3HnASg==", "requires": { "clsx": "^1.1.1" } @@ -41246,73 +24296,6 @@ } } }, - "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, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "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 - } - } - }, - "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, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "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, - "requires": { - "p-limit": "^2.2.0" - } - }, - "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 - } - } - }, "readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", @@ -41327,7 +24310,7 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" } } }, @@ -41341,13 +24324,10 @@ } }, "recharts": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.1.9.tgz", - "integrity": "sha512-VozH5uznUvGqD7n224FGj7cmMAenlS0HPCs+7r2HeeHiQK6un6z0CTZfWVAB860xbcr4m+BN/EGMPZmYWd34Rg==", + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.1.10.tgz", + "integrity": "sha512-me6c8m2Gs88X/nuM2gDSTDIhpSLNMbiTrlE4Cu53hjZNegT3g3xLlTrbYSAQuBCFWuWJAZXCmEuMr6AwizLyaA==", "requires": { - "@types/d3-interpolate": "^2.0.0", - "@types/d3-scale": "^3.0.0", - "@types/d3-shape": "^2.0.0", "classnames": "^2.2.5", "d3-interpolate": "^2.0.0", "d3-scale": "^3.0.0", @@ -41365,11 +24345,6 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" } } }, @@ -41381,6 +24356,15 @@ "decimal.js-light": "^2.4.1" } }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + }, "reduce-css-calc": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz", @@ -41388,6 +24372,13 @@ "requires": { "css-unit-converter": "^1.1.1", "postcss-value-parser": "^3.3.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } } }, "redux": { @@ -41401,43 +24392,24 @@ "redux-immutable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/redux-immutable/-/redux-immutable-4.0.0.tgz", - "integrity": "sha1-Ohoy32Y2ZGK2NpHw4dw15HK7yfM=" + "integrity": "sha1-Ohoy32Y2ZGK2NpHw4dw15HK7yfM=", + "requires": {} }, "redux-thunk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz", - "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==" - }, - "refractor": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", - "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", - "dev": true, - "requires": { - "hastscript": "^6.0.0", - "parse-entities": "^2.0.0", - "prismjs": "~1.27.0" - }, - "dependencies": { - "prismjs": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", - "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", - "dev": true - } - } + "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==", + "requires": {} }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "regenerate-unicode-properties": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "dev": true, "requires": { "regenerate": "^1.4.2" } @@ -41451,36 +24423,31 @@ "version": "0.15.0", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "dev": true, "requires": { "@babel/runtime": "^7.8.4" } }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, "regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "functions-have-names": "^1.2.2" } }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, "regexpu-core": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", - "dev": true, "requires": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.0.1", @@ -41493,14 +24460,12 @@ "regjsgen": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" }, "regjsparser": { "version": "0.8.4", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "dev": true, "requires": { "jsesc": "~0.5.0" }, @@ -41508,8 +24473,7 @@ "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" } } }, @@ -41519,169 +24483,19 @@ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "dev": true }, - "remark-footnotes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", - "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==", - "dev": true - }, - "remark-mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", - "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", - "dev": true, - "requires": { - "@babel/core": "7.12.9", - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-object-rest-spread": "7.12.1", - "@babel/plugin-syntax-jsx": "7.12.1", - "@mdx-js/util": "1.6.22", - "is-alphabetical": "1.0.4", - "remark-parse": "8.0.3", - "unified": "9.2.0" - }, - "dependencies": { - "@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "remark-parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", - "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", - "dev": true, - "requires": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" - } - }, - "remark-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", - "dev": true, - "requires": { - "mdast-squeeze-paragraphs": "^4.0.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, "renderkid": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", - "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "dev": true, "requires": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", "htmlparser2": "^6.1.0", "lodash": "^4.17.21", - "strip-ansi": "^3.0.1" + "strip-ansi": "^6.0.1" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, "dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", @@ -41719,6 +24533,12 @@ "domhandler": "^4.2.0" } }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, "htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", @@ -41730,49 +24550,19 @@ "domutils": "^2.5.2", "entities": "^2.0.0" } - }, - "nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } } } }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "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 }, "requires-port": { @@ -41797,94 +24587,36 @@ } }, "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "requires": { - "resolve-from": "^3.0.0" + "resolve-from": "^5.0.0" }, "dependencies": { "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true } } }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "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 + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, "resolve-pathname": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true }, "reusify": { @@ -41900,9 +24632,9 @@ "optional": true }, "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -41918,6 +24650,64 @@ "inherits": "^2.0.1" } }, + "rollup": { + "version": "2.75.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.4.tgz", + "integrity": "sha512-JgZiJMJkKImMZJ8ZY1zU80Z2bA/TvrL/7D9qcBCrfl2bP+HUaIw0QHUroB4E3gBpFl6CRFM1YxGbuYGtdAswbQ==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "dependencies": { + "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 + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "rtcpeerconnection-shim": { "version": "1.2.15", "resolved": "https://registry.npmjs.org/rtcpeerconnection-shim/-/rtcpeerconnection-shim-1.2.15.tgz", @@ -41935,29 +24725,11 @@ "queue-microtask": "^1.2.2" } }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, "safe-stable-stringify": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", @@ -41970,6 +24742,27 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "sass": { + "version": "1.52.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.1.tgz", + "integrity": "sha512-fSzYTbr7z8oQnVJ3Acp9hV80dM1fkMN7mSD/25mpcct9F7FPBMOI8krEYALgU1aZoqGhQNhTPsuSmxjnIvAm4Q==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "sass-loader": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.0.tgz", + "integrity": "sha512-IHCFecI+rbPvXE2zO/mqdVFe8MU7ElGrwga9hh2H65Ru4iaBJAMRteum1c4Gsxi9Cq1FOtTEDd6+/AEYuQDM4Q==", + "dev": true, + "requires": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + } + }, "sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", @@ -41986,13 +24779,13 @@ } }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", "ajv-keywords": "^3.5.2" } }, @@ -42008,42 +24801,46 @@ "dev": true }, "selfsigned": { - "version": "1.10.14", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", - "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", "dev": true, "requires": { - "node-forge": "^0.10.0" + "node-forge": "^1" + } + }, + "semantic-ui-css": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/semantic-ui-css/-/semantic-ui-css-2.4.1.tgz", + "integrity": "sha512-Pkp0p9oWOxlH0kODx7qFpIRYpK1T4WJOO4lNnpNPOoWKCrYsfHqYSKgk5fHfQtnWnsAKy7nLJMW02bgDWWFZFg==", + "requires": { + "jquery": "x.*" } }, "semantic-ui-react": { - "version": "0.87.3", - "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-0.87.3.tgz", - "integrity": "sha512-YJgFYEheeFBMm/epZpIpWKF9glgSShdLPiY8zoUi+KJ0IKtLtbI8RbMD/ELbZkY+SO/IWbK/f/86pWt3PVvMVA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-2.1.3.tgz", + "integrity": "sha512-dd2pqalMk0ycJoHf7hn4mYd0xohg0NMk7ohlpPVOigCfMLrKk2e3NZdRk0yBetvD+qJXPqZ04jA43bDwqOM5OA==", "requires": { - "@babel/runtime": "^7.1.2", - "@semantic-ui-react/event-stack": "^3.1.0", - "classnames": "^2.2.6", - "keyboard-key": "^1.0.4", - "lodash": "^4.17.11", - "prop-types": "^15.6.2", - "react-is": "^16.7.0", - "react-popper": "^1.3.3", + "@babel/runtime": "^7.10.5", + "@fluentui/react-component-event-listener": "~0.63.0", + "@fluentui/react-component-ref": "~0.63.0", + "@popperjs/core": "^2.6.0", + "@semantic-ui-react/event-stack": "^3.1.3", + "clsx": "^1.1.1", + "keyboard-key": "^1.1.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "prop-types": "^15.7.2", + "react-is": "^16.8.6 || ^17.0.0 || ^18.0.0", + "react-popper": "^2.3.0", "shallowequal": "^1.1.0" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } } }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "send": { "version": "0.18.0", @@ -42078,7 +24875,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -42092,41 +24889,14 @@ } }, "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { "randombytes": "^2.1.0" } }, - "serve-favicon": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", - "integrity": "sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=", - "dev": true, - "requires": { - "etag": "~1.8.1", - "fresh": "0.5.2", - "ms": "2.1.1", - "parseurl": "~1.3.2", - "safe-buffer": "5.1.1" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - } - } - }, "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", @@ -42154,13 +24924,13 @@ "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, "requires": { "depd": "~1.1.2", @@ -42172,13 +24942,13 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "dev": true }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "setprototypeof": { @@ -42207,41 +24977,6 @@ "send": "0.18.0" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -42272,6 +25007,11 @@ "kind-of": "^6.0.2" } }, + "shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" + }, "shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", @@ -42309,10 +25049,17 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "simple-html-tokenizer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.1.1.tgz", + "integrity": "sha1-BcLuxXn//+FFoDCsJs/qYbmA+r4=", + "dev": true + }, "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, "requires": { "is-arrayish": "^0.3.1" }, @@ -42320,15 +25067,21 @@ "is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true } } }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "dev": true, + "requires": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + } }, "slash": { "version": "2.0.0", @@ -42336,184 +25089,10 @@ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "socket.io-client": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.0.tgz", - "integrity": "sha512-HW61c1G7OrYGxaI79WRn17+b03iBCdvhBj4iqyXHBoL5M8w2MSO/vChsjA93knG4GYEai1/vbXWJna9dzxXtSg==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.1.tgz", + "integrity": "sha512-e6nLVgiRYatS+AHXnOnGi4ocOpubvOUCGhyWw8v+/FxW8saHkinG6Dfhi9TU0Kt/8mwJIAASxvw6eujQmjdZVA==", "requires": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", @@ -42549,39 +25128,6 @@ } } }, - "sockjs-client": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.0.tgz", - "integrity": "sha512-qVHJlyfdHFht3eBFZdKEXKTlb7I4IV41xnVNo8yUKA1UHcPJwgW2SvTq9LhnjjCywSkSK7c/e4nghU0GOoMCRQ==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "eventsource": "^1.1.0", - "faye-websocket": "^0.11.4", - "inherits": "^2.0.4", - "url-parse": "^1.5.10" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -42593,18 +25139,11 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true }, "source-map-support": { "version": "0.5.21", @@ -42624,48 +25163,10 @@ } } }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, - "space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "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 - }, - "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, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, "spdy": { @@ -42723,35 +25224,16 @@ } } }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, "stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, "stack-trace": { "version": "0.0.10", @@ -42765,211 +25247,12 @@ "integrity": "sha512-EeNzTVfj+1In7aSLPKDD03F/ly4RxEuF/EX0YcOG0cKoPXs+SLZxDawQbexQDBzwROs4VKLWTOaZQlZkGBFEIQ==", "optional": true }, - "stackframe": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz", - "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==", - "dev": true - }, - "state-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", - "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true }, - "store2": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/store2/-/store2-2.13.2.tgz", - "integrity": "sha512-CMtO2Uneg3SAz/d6fZ/6qbqqQHi2ynq6/KzMD/26gTkiEShCcpqFfTHgOxsE0egAq6SX3FmN4CeSqn8BzXQkJg==", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", @@ -42984,14 +25267,6 @@ "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" - }, - "dependencies": { - "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 - } } }, "string.prototype.matchall": { @@ -43010,46 +25285,37 @@ "side-channel": "^1.0.4" } }, - "string.prototype.padend": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", - "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "string.prototype.padstart": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/string.prototype.padstart/-/string.prototype.padstart-3.1.3.tgz", - "integrity": "sha512-NZydyOMtYxpTjGqp0VN5PYUF/tsU15yDMZnUdj16qRUIUiMJkHHSDElYyQFrMu+/WloTpA7MQSiADhBicDfaoA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" } }, "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" } }, "strip-ansi": { @@ -43061,31 +25327,23 @@ "ansi-regex": "^5.0.1" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", "dev": true }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "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 }, - "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, - "requires": { - "min-indent": "^1.0.0" - } - }, "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true }, "strnum": { "version": "1.0.5", @@ -43094,13 +25352,56 @@ "dev": true }, "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "dev": true, + "requires": {} + }, + "stylehacks": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", + "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "postcss-selector-parser": "^6.0.4" + } + }, + "stylis": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", + "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" + }, + "sugarss": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-4.0.1.tgz", + "integrity": "sha512-WCjS5NfuVJjkQzK10s8WOBY+hhDxxNt/N6ZaGwxFZ+wN3/lKKFSaaKUNecULcTTvE4urLcKaZFQD8vO0mOZujw==", + "dev": true, + "requires": {} + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "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==" + }, + "svg-inline-loader": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.8.2.tgz", + "integrity": "sha512-kbrcEh5n5JkypaSC152eGfGcnT4lkR0eSfvefaUJkLqgGjRQJyKDvvEE/CCv5aTSdfXuc+N98w16iAojhShI3g==", "dev": true, "requires": { "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" + "object-assign": "^4.0.1", + "simple-html-tokenizer": "^0.1.1" }, "dependencies": { "json5": { @@ -43122,65 +25423,13 @@ "emojis-list": "^3.0.0", "json5": "^1.0.1" } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } } } }, - "style-to-object": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", - "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", - "dev": true, - "requires": { - "inline-style-parser": "0.1.1" - } - }, - "stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "postcss-selector-parser": "^6.0.4" - } - }, - "stylis": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", - "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" - }, - "sugarss": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", - "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "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==" + "svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" }, "svg-pathdata": { "version": "6.0.3", @@ -43189,484 +25438,143 @@ "optional": true }, "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "dev": true, + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" }, "dependencies": { - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "dev": true - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" } } }, - "symbol.prototype.description": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/symbol.prototype.description/-/symbol.prototype.description-1.0.5.tgz", - "integrity": "sha512-x738iXRYsrAt9WBhRCVG5BtIC3B7CUkFwbHW2zOvGtwM33s7JjrCDyq8V0zgMYVb5ymsL8+qkzzpANH63CPQaQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-symbol-description": "^1.0.0", - "has-symbols": "^1.0.2", - "object.getownpropertydescriptors": "^2.1.2" - } - }, - "synchronous-promise": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.15.tgz", - "integrity": "sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg==", - "dev": true - }, "syncod": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/syncod/-/syncod-0.0.1.tgz", "integrity": "sha512-KHDsGQ4UcP+wSMaqH7wjH4DHxeHKRlmEO5jlSVCS+0x9xA4ZhdKYg/ameGF7RXaFDUcsti6Zj5s5W1Z4/YsbHA==" }, "tailwindcss": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-1.9.6.tgz", - "integrity": "sha512-nY8WYM/RLPqGsPEGEV2z63riyQPcHYZUJpAwdyBzVpxQHOHqHE+F/fvbCeXhdF1+TA5l72vSkZrtYCB9hRcwkQ==", + "version": "3.0.24", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.24.tgz", + "integrity": "sha512-H3uMmZNWzG6aqmg9q07ZIRNIawoiEcNFKDfL+YzOPuPsXuDXxJxB9icqzLgdzKNwjG3SAro2h9SYav8ewXNgig==", + "dev": true, "requires": { - "@fullhuman/postcss-purgecss": "^2.1.2", - "autoprefixer": "^9.4.5", - "browserslist": "^4.12.0", - "bytes": "^3.0.0", - "chalk": "^3.0.0 || ^4.0.0", - "color": "^3.1.2", + "arg": "^5.0.1", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", "detective": "^5.2.0", - "fs-extra": "^8.0.0", - "html-tags": "^3.1.0", - "lodash": "^4.17.20", - "node-emoji": "^1.8.1", - "normalize.css": "^8.0.1", - "object-hash": "^2.0.3", - "postcss": "^7.0.11", - "postcss-functions": "^3.0.0", - "postcss-js": "^2.0.0", - "postcss-nested": "^4.1.1", - "postcss-selector-parser": "^6.0.0", - "postcss-value-parser": "^4.1.0", - "pretty-hrtime": "^1.0.3", - "reduce-css-calc": "^2.1.6", - "resolve": "^1.14.2" + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.12", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "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 + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, "requires": { - "color-convert": "^2.0.1" + "is-glob": "^4.0.3" } - }, - "autoprefixer": { - "version": "9.8.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", - "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", - "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "picocolors": "^0.2.1", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "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==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" } } }, "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true }, - "telejson": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/telejson/-/telejson-5.3.3.tgz", - "integrity": "sha512-PjqkJZpzEggA9TBpVtJi1LVptP7tYtXB6rEubwlHap76AMjzvOdKX41CxyaW7ahhzDU1aftXnMCx5kAPDZTQBA==", + "tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", "dev": true, "requires": { - "@types/is-function": "^1.0.0", - "global": "^4.4.0", - "is-function": "^1.0.2", - "is-regex": "^1.1.2", - "is-symbol": "^1.0.3", - "isobject": "^4.0.0", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3" - }, - "dependencies": { - "isobject": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", - "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", - "dev": true - } + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" } }, "terser": { - "version": "5.13.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.13.1.tgz", - "integrity": "sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.0.tgz", + "integrity": "sha512-JC6qfIEkPBd9j1SMO3Pfn+A6w2kQV54tv+ABQLgZr7dA3k/DL/OBoYSWxzVpZev3J+bUHXfr55L8Mox7AaNo6g==", "dev": true, "requires": { + "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.8.0-beta.0", "source-map-support": "~0.5.20" }, "dependencies": { - "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true - }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true - }, - "source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dev": true, - "requires": { - "whatwg-url": "^7.0.0" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } } } }, "terser-webpack-plugin": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", - "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", "dev": true, "requires": { - "cacache": "^15.0.5", - "find-cache-dir": "^3.3.1", - "jest-worker": "^26.5.0", - "p-limit": "^3.0.2", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", - "terser": "^5.3.4", - "webpack-sources": "^1.4.3" + "terser": "^5.7.2" }, "dependencies": { - "cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "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, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "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, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "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, - "requires": { - "p-limit": "^2.2.0" - }, - "dependencies": { - "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, - "requires": { - "p-try": "^2.0.0" - } - } - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } }, "source-map": { @@ -43674,35 +25582,9 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, "text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", @@ -43718,10 +25600,10 @@ "utrie": "^1.0.2" } }, - "throttle-debounce": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", - "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==", + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, "through2": { @@ -43768,15 +25650,6 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, "tiny-invariant": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", @@ -43787,55 +25660,11 @@ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -43856,10 +25685,10 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, - "toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", "dev": true }, "tr46": { @@ -43867,164 +25696,79 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", - "dev": true - }, - "trim-trailing-lines": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", - "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", - "dev": true - }, "triple-beam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==", "dev": true }, - "trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", - "dev": true - }, - "tryer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", - "dev": true - }, - "ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "dev": true - }, - "ts-loader": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.4.0.tgz", - "integrity": "sha512-6nFY3IZ2//mrPc+ImY3hNWx1vCHyEhl6V+wLmL4CZcm6g1CqX7UKrkc6y0i4FwcfOhxyMPCfaEvh20f4r9GNpw==", + "ts-node": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.8.0.tgz", + "integrity": "sha512-/fNd5Qh+zTt8Vt1KbYZjRHCE9sI5i7nqfD/dzBBRDeVXZXS6kToW6R7tTU6Nd4XavFs0mAVCg29Q//ML7WsZYA==", "dev": true, "requires": { - "chalk": "^4.1.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^2.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4" + "@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" }, "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "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 }, - "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, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true } } }, - "ts-pnp": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", - "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", - "dev": true - }, - "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } }, "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", "dev": true }, "type-is": { @@ -44037,167 +25781,10 @@ "mime-types": "~2.1.24" } }, - "typed-css-modules": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/typed-css-modules/-/typed-css-modules-0.7.2.tgz", - "integrity": "sha512-R3guXrQ8ry/yhlfvNmkVY4J3+FtKaEdwqrvgSvFpVY0ieYQHqhhBW0RwfE4hnG4m29Ef/4IE0tBsk/UKplmJkA==", - "dev": true, - "requires": { - "@types/css-modules-loader-core": "^1.1.0", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "chokidar": "^3.4.0", - "css-modules-loader-core": "^1.1.0", - "glob": "^7.1.2", - "is-there": "^4.4.2", - "mkdirp": "^1.0.0", - "yargs": "^15.4.1" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "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 - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "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, - "requires": { - "p-limit": "^2.2.0" - } - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } - } - } - } - }, - "typed-styles": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", - "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==" - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, "typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.2.tgz", + "integrity": "sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==", "dev": true }, "ua-parser-js": { @@ -44205,13 +25792,6 @@ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==" }, - "uglify-js": { - "version": "3.15.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.4.tgz", - "integrity": "sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA==", - "dev": true, - "optional": true - }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -44230,33 +25810,15 @@ "integrity": "sha512-QvjkYpiD+dJJraRA8+dGAU4i7aBbb2s0S3jA45TFOvg2VgqvdCDd/3N6CqA8gluk1W91GLoXg5enMUx560QzuA==", "dev": true }, - "unfetch": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", - "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==", - "dev": true - }, - "unherit": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", - "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "dev": true, - "requires": { - "inherits": "^2.0.0", - "xtend": "^4.0.0" - } - }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" }, "unicode-match-property-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, "requires": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -44265,145 +25827,20 @@ "unicode-match-property-value-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "dev": true + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==" }, "unicode-property-aliases-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", - "dev": true + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" }, - "unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "dependencies": { - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - } - } - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unist-builder": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", - "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", - "dev": true - }, - "unist-util-generated": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", - "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", - "dev": true - }, - "unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", - "dev": true - }, - "unist-util-position": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", - "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", - "dev": true - }, - "unist-util-remove": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", - "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", - "dev": true, - "requires": { - "unist-util-is": "^4.0.0" - } - }, - "unist-util-remove-position": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", - "dev": true, - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "dev": true, - "requires": { - "@types/unist": "^2.0.2" - } - }, - "unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - } - }, - "unist-util-visit-parents": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" + "crypto-random-string": "^2.0.0" } }, "universalify": { @@ -44418,64 +25855,12 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -44485,12 +25870,6 @@ "punycode": "^2.1.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, "url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", @@ -44509,42 +25888,17 @@ } } }, - "url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - } - }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, "use-composed-ref": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", - "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==" + "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", + "requires": {} }, "use-isomorphic-layout-effect": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", - "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==" + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "requires": {} }, "use-latest": { "version": "1.2.1", @@ -44571,17 +25925,8 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "utila": { "version": "0.4.0", @@ -44605,9 +25950,9 @@ } }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", "dev": true }, "v8-compile-cache": { @@ -44616,25 +25961,19 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "v8-to-istanbul": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz", - "integrity": "sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.7", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - } + "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 }, - "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==", + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", "dev": true, "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "homedir-polyfill": "^1.0.1" } }, "value-equal": { @@ -44648,40 +25987,6 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, - "vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - } - }, - "vfile-location": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", - "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", - "dev": true - }, - "vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, "warning": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", @@ -44700,276 +26005,6 @@ "graceful-fs": "^4.1.2" } }, - "watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true, - "optional": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "optional": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "optional": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, "wbuf": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", @@ -44989,1204 +26024,330 @@ "util": "^0.12.3" } }, - "web-namespaces": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", - "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", - "dev": true - }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" }, "webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "version": "5.72.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", + "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" + "enhanced-resolve": "^5.9.3", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" }, "dependencies": { - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - }, - "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "dev": true, - "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.1" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } } } }, "webpack-bundle-analyzer": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz", - "integrity": "sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", + "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", "dev": true, "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1", - "bfj": "^6.1.1", - "chalk": "^2.4.1", - "commander": "^2.18.0", - "ejs": "^2.6.1", - "express": "^4.16.3", - "filesize": "^3.6.1", - "gzip-size": "^5.0.0", - "lodash": "^4.17.19", - "mkdirp": "^0.5.1", - "opener": "^1.5.1", - "ws": "^6.0.0" + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" }, "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "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 }, - "ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "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, "requires": { - "async-limiter": "~1.0.0" + "color-convert": "^2.0.1" } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + }, + "ws": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz", + "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==", + "dev": true, + "requires": {} } } }, "webpack-cli": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", - "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", + "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", "dev": true, "requires": { - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.1", - "findup-sync": "^3.0.0", - "global-modules": "^2.0.0", - "import-local": "^2.0.0", - "interpret": "^1.4.0", - "loader-utils": "^1.4.0", - "supports-color": "^6.1.0", - "v8-compile-cache": "^2.1.1", - "yargs": "^13.3.2" + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.1", + "@webpack-cli/info": "^1.4.1", + "@webpack-cli/serve": "^1.6.1", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" }, "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, "webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "dev": true, "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" + "schema-utils": "^4.0.0" }, "dependencies": { - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } }, - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "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 }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } } } }, "webpack-dev-server": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", - "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.1.tgz", + "integrity": "sha512-CTMfu2UMdR/4OOZVHRpdy84pNopOuigVIsRbGX3LVDMWNP8EUgC5mUBMErbwBlHTEX99ejZJpVqrir6EXAEajA==", "dev": true, "requires": { - "ansi-html-community": "0.0.8", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.0.1", "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", + "sockjs": "^0.3.24", "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "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 }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } }, "ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", + "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "requires": {} } } }, - "webpack-filter-warnings-plugin": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/webpack-filter-warnings-plugin/-/webpack-filter-warnings-plugin-1.2.1.tgz", - "integrity": "sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg==", - "dev": true - }, - "webpack-hot-middleware": { - "version": "2.25.1", - "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.1.tgz", - "integrity": "sha512-Koh0KyU/RPYwel/khxbsDz9ibDivmUbrRuKSSQvW42KSDdO4w23WI3SkHpSUKHE76LrFnnM/L7JCrpBwu8AXYw==", + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dev": true, "requires": { - "ansi-html-community": "0.0.8", - "html-entities": "^2.1.0", - "querystring": "^0.2.0", - "strip-ansi": "^6.0.0" - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - } + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" } }, "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "webpack-virtual-modules": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.2.2.tgz", - "integrity": "sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA==", - "dev": true, - "requires": { - "debug": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true }, "webrtc-adapter": { "version": "7.7.1", @@ -46245,43 +26406,25 @@ "is-symbol": "^1.0.3" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "which-typed-array": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", - "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", + "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.18.5", - "foreach": "^2.0.5", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.7" + "is-typed-array": "^1.1.9" } }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - } + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true }, "winston": { "version": "3.7.2", @@ -46301,12 +26444,6 @@ "winston-transport": "^4.5.0" }, "dependencies": { - "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 - }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -46374,28 +26511,295 @@ } } }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "workbox-background-sync": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.3.tgz", + "integrity": "sha512-0DD/V05FAcek6tWv9XYj2w5T/plxhDSpclIcAGjA/b7t/6PdaRkQ7ZgtAX6Q/L7kV7wZ8uYRJUoH11VjNipMZw==", "dev": true, "requires": { - "errno": "~0.1.7" + "idb": "^6.1.4", + "workbox-core": "6.5.3" } }, - "worker-rpc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", - "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "workbox-broadcast-update": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.3.tgz", + "integrity": "sha512-4AwCIA5DiDrYhlN+Miv/fp5T3/whNmSL+KqhTwRBTZIL6pvTgE4lVuRzAt1JltmqyMcQ3SEfCdfxczuI4kwFQg==", "dev": true, "requires": { - "microevent.ts": "~0.1.1" + "workbox-core": "6.5.3" + } + }, + "workbox-build": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.3.tgz", + "integrity": "sha512-8JNHHS7u13nhwIYCDea9MNXBNPHXCs5KDZPKI/ZNTr3f4sMGoD7hgFGecbyjX1gw4z6e9bMpMsOEJNyH5htA/w==", + "dev": true, + "requires": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "6.5.3", + "workbox-broadcast-update": "6.5.3", + "workbox-cacheable-response": "6.5.3", + "workbox-core": "6.5.3", + "workbox-expiration": "6.5.3", + "workbox-google-analytics": "6.5.3", + "workbox-navigation-preload": "6.5.3", + "workbox-precaching": "6.5.3", + "workbox-range-requests": "6.5.3", + "workbox-recipes": "6.5.3", + "workbox-routing": "6.5.3", + "workbox-strategies": "6.5.3", + "workbox-streams": "6.5.3", + "workbox-sw": "6.5.3", + "workbox-window": "6.5.3" + }, + "dependencies": { + "@apideck/better-ajv-errors": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.4.tgz", + "integrity": "sha512-Ic2d8ZT6HJiSikGVQvSklaFyw1OUv4g8sDOxa0PXSlbmN/3gL5IO1WYY9DOwTDqOFmjWoqG1yaaKnPDqYCE9KA==", + "dev": true, + "requires": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + } + }, + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "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 + }, + "source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "requires": { + "whatwg-url": "^7.0.0" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "workbox-cacheable-response": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.3.tgz", + "integrity": "sha512-6JE/Zm05hNasHzzAGKDkqqgYtZZL2H06ic2GxuRLStA4S/rHUfm2mnLFFXuHAaGR1XuuYyVCEey1M6H3PdZ7SQ==", + "dev": true, + "requires": { + "workbox-core": "6.5.3" + } + }, + "workbox-core": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.3.tgz", + "integrity": "sha512-Bb9ey5n/M9x+l3fBTlLpHt9ASTzgSGj6vxni7pY72ilB/Pb3XtN+cZ9yueboVhD5+9cNQrC9n/E1fSrqWsUz7Q==", + "dev": true + }, + "workbox-expiration": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.3.tgz", + "integrity": "sha512-jzYopYR1zD04ZMdlbn/R2Ik6ixiXbi15c9iX5H8CTi6RPDz7uhvMLZPKEndZTpfgmUk8mdmT9Vx/AhbuCl5Sqw==", + "dev": true, + "requires": { + "idb": "^6.1.4", + "workbox-core": "6.5.3" + } + }, + "workbox-google-analytics": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.3.tgz", + "integrity": "sha512-3GLCHotz5umoRSb4aNQeTbILETcrTVEozSfLhHSBaegHs1PnqCmN0zbIy2TjTpph2AGXiNwDrWGF0AN+UgDNTw==", + "dev": true, + "requires": { + "workbox-background-sync": "6.5.3", + "workbox-core": "6.5.3", + "workbox-routing": "6.5.3", + "workbox-strategies": "6.5.3" + } + }, + "workbox-navigation-preload": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.3.tgz", + "integrity": "sha512-bK1gDFTc5iu6lH3UQ07QVo+0ovErhRNGvJJO/1ngknT0UQ702nmOUhoN9qE5mhuQSrnK+cqu7O7xeaJ+Rd9Tmg==", + "dev": true, + "requires": { + "workbox-core": "6.5.3" + } + }, + "workbox-precaching": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.3.tgz", + "integrity": "sha512-sjNfgNLSsRX5zcc63H/ar/hCf+T19fRtTqvWh795gdpghWb5xsfEkecXEvZ8biEi1QD7X/ljtHphdaPvXDygMQ==", + "dev": true, + "requires": { + "workbox-core": "6.5.3", + "workbox-routing": "6.5.3", + "workbox-strategies": "6.5.3" + } + }, + "workbox-range-requests": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.3.tgz", + "integrity": "sha512-pGCP80Bpn/0Q0MQsfETSfmtXsQcu3M2QCJwSFuJ6cDp8s2XmbUXkzbuQhCUzKR86ZH2Vex/VUjb2UaZBGamijA==", + "dev": true, + "requires": { + "workbox-core": "6.5.3" + } + }, + "workbox-recipes": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.3.tgz", + "integrity": "sha512-IcgiKYmbGiDvvf3PMSEtmwqxwfQ5zwI7OZPio3GWu4PfehA8jI8JHI3KZj+PCfRiUPZhjQHJ3v1HbNs+SiSkig==", + "dev": true, + "requires": { + "workbox-cacheable-response": "6.5.3", + "workbox-core": "6.5.3", + "workbox-expiration": "6.5.3", + "workbox-precaching": "6.5.3", + "workbox-routing": "6.5.3", + "workbox-strategies": "6.5.3" + } + }, + "workbox-routing": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.3.tgz", + "integrity": "sha512-DFjxcuRAJjjt4T34RbMm3MCn+xnd36UT/2RfPRfa8VWJGItGJIn7tG+GwVTdHmvE54i/QmVTJepyAGWtoLPTmg==", + "dev": true, + "requires": { + "workbox-core": "6.5.3" + } + }, + "workbox-strategies": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.3.tgz", + "integrity": "sha512-MgmGRrDVXs7rtSCcetZgkSZyMpRGw8HqL2aguszOc3nUmzGZsT238z/NN9ZouCxSzDu3PQ3ZSKmovAacaIhu1w==", + "dev": true, + "requires": { + "workbox-core": "6.5.3" + } + }, + "workbox-streams": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.3.tgz", + "integrity": "sha512-vN4Qi8o+b7zj1FDVNZ+PlmAcy1sBoV7SC956uhqYvZ9Sg1fViSbOpydULOssVJ4tOyKRifH/eoi6h99d+sJ33w==", + "dev": true, + "requires": { + "workbox-core": "6.5.3", + "workbox-routing": "6.5.3" + } + }, + "workbox-sw": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.3.tgz", + "integrity": "sha512-BQBzm092w+NqdIEF2yhl32dERt9j9MDGUTa2Eaa+o3YKL4Qqw55W9yQC6f44FdAHdAJrJvp0t+HVrfh8AiGj8A==", + "dev": true + }, + "workbox-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-Es8Xr02Gi6Kc3zaUwR691ZLy61hz3vhhs5GztcklQ7kl5k2qAusPh0s6LF3wEtlpfs9ZDErnmy5SErwoll7jBA==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "6.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, + "workbox-window": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.3.tgz", + "integrity": "sha512-GnJbx1kcKXDtoJBVZs/P7ddP0Yt52NNy4nocjBpYPiRhMqTpJCNrSL+fGHZ/i/oP6p/vhE8II0sA6AZGKGnssw==", + "dev": true, + "requires": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.5.3" } }, "wrap-ansi": { @@ -46417,6 +26821,21 @@ "requires": { "color-convert": "^2.0.1" } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 } } }, @@ -46426,10 +26845,10 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", - "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", - "dev": true + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "requires": {} }, "xml": { "version": "1.0.1", @@ -46461,18 +26880,19 @@ "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true }, "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "yaml": { @@ -46481,9 +26901,9 @@ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, "yargs": { - "version": "17.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", - "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -46493,38 +26913,18 @@ "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.0.0" - }, - "dependencies": { - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", - "dev": true - } } }, "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==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", "dev": true }, - "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 - }, - "zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true } } diff --git a/frontend/package.json b/frontend/package.json index 3ad6c1505..40d682c77 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -2,14 +2,14 @@ "name": "openreplay", "version": "1.3.6", "scripts": { - "start": "webpack-dev-server --watch --env=oss", - "build:oss": "npm run gen:icons && npm run gen:css-types && rm -rf public && webpack --env=oss", + "start": "webpack serve", + "build": "npm run gen:icons && rm -rf public && webpack", "upload:minio": "node ./scripts/upload-minio.js", "deploy:minio": "npm run build:minio && npm run upload:minio", "lint": "eslint --fix app; exit 0", "gen:css-types": "tcm app/components && tcm app/player", "gen:constants": "node ./scripts/constants.js", - "gen:icons": "node ./scripts/icons.js", + "gen:icons": "node ./scripts/icons.ts", "gen:colors": "node ./scripts/colors.js", "storybook": "start-storybook", "flow": "flow" @@ -17,9 +17,9 @@ "dependencies": { "@sentry/browser": "^5.21.1", "@svg-maps/world": "^1.0.1", + "@svgr/webpack": "^6.2.1", "chroma-js": "^2.4.2", - "classnames": "^2.2.6", - "codemirror": "^5.62.3", + "classnames": "^2.3.1", "copy-to-clipboard": "^3.3.1", "deep-diff": "^1.0.2", "html-to-image": "^1.9.0", @@ -31,90 +31,103 @@ "mobx": "^6.3.8", "mobx-react-lite": "^3.1.6", "moment": "^2.29.2", - "moment-range": "^4.0.2", + "moment-range": "^3.0.3", "peerjs": "1.3.2", "rc-time-picker": "^3.7.3", - "react": "^16.13.1", + "react": "^16.14.0", "react-circular-progressbar": "^2.0.3", - "react-codemirror2": "^5.1.0", - "react-confirm": "^0.1.20", - "react-datepicker": "^2.16.0", + "react-confirm": "^0.1.27", + "react-date-range": "^1.4.0", "react-daterange-picker": "^2.0.1", "react-dnd": "^15.1.1", "react-dnd-html5-backend": "^15.1.2", "react-dom": "^16.13.1", - "react-draggable": "^4.4.4", + "react-draggable": "^4.4.5", "react-google-recaptcha": "^1.1.0", "react-highlight": "^0.14.0", - "react-json-view": "^1.19.1", - "react-lazyload": "^3.0.0", + "react-json-view": "^1.21.3", + "react-lazyload": "^3.2.0", "react-redux": "^5.1.2", "react-router": "^4.3.1", "react-router-dom": "^4.3.1", - "react-select": "^5.3.1", + "react-select": "^5.3.2", "react-svg-map": "^2.2.0", "react-tippy": "^1.4.0", - "react-toastify": "^8.2.0", - "react-virtualized": "^9.22.2", - "recharts": "^2.1.9", + "react-toastify": "^9.0.3", + "react-virtualized": "^9.22.3", + "recharts": "^2.1.10", "redux": "^4.0.5", "redux-immutable": "^4.0.0", "redux-thunk": "^2.3.0", - "semantic-ui-react": "^0.87.3", + "semantic-ui-css": "^2.4.1", + "semantic-ui-react": "^2.1.2", "socket.io-client": "^4.4.1", "source-map": "^0.7.3", "syncod": "^0.0.1", - "tailwindcss": "^1.5.2" + "tailwindcss": "^3.0.24" }, "devDependencies": { "@babel/cli": "^7.10.5", - "@babel/core": "^7.12.10", - "@babel/plugin-proposal-class-properties": "^7.10.4", - "@babel/plugin-proposal-decorators": "^7.10.5", + "@babel/core": "^7.17.12", + "@babel/node": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.17.12", + "@babel/plugin-proposal-decorators": "^7.17.12", "@babel/plugin-proposal-private-methods": "^7.10.4", "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/preset-env": "^7.10.4", + "@babel/plugin-transform-runtime": "^7.17.12", + "@babel/preset-env": "^7.17.12", "@babel/preset-flow": "^7.10.4", - "@babel/preset-react": "^7.10.4", + "@babel/preset-react": "^7.17.12", + "@babel/preset-typescript": "^7.17.12", + "@babel/runtime": "^7.17.9", "@openreplay/sourcemap-uploader": "^3.0.0", - "@storybook/react": "^6.4.8", - "autoprefixer": "^7.2.5", - "babel-loader": "^8.1.0", + "@types/react": "^18.0.9", + "@types/react-dom": "^18.0.4", + "@typescript-eslint/eslint-plugin": "^5.24.0", + "@typescript-eslint/parser": "^5.24.0", + "autoprefixer": "^10.4.7", + "babel-loader": "^8.2.4", "babel-plugin-recharts": "^1.2.1", + "babel-plugin-transform-decorators-legacy": "^1.3.5", "circular-dependency-plugin": "^5.2.0", - "copy-webpack-plugin": "^5.1.1", + "compression-webpack-plugin": "^10.0.0", + "copy-webpack-plugin": "^11.0.0", "country-data": "0.0.31", - "css-loader": "^3.6.0", + "css-loader": "^6.7.1", "cssnano": "^5.0.12", "deasync-promise": "^1.0.1", "deploy-aws-s3-cloudfront": "^3.6.0", "dotenv": "^6.2.0", - "eslint-config-airbnb": "^16.1.0", - "eslint-import-resolver-babel-module": "^4.0.0", - "eslint-plugin-import": "^2.22.0", - "eslint-plugin-jsx-a11y": "^6.3.1", - "eslint-plugin-react": "^7.20.6", + "eslint": "^8.15.0", + "eslint-plugin-react": "^7.29.4", + "eslint-plugin-react-hooks": "^4.5.0", "faker": "^5.5.3", + "file-loader": "^6.2.0", "flow-bin": "^0.115.0", - "html-webpack-plugin": "^3.2.0", - "mini-css-extract-plugin": "^0.7.0", + "html-webpack-plugin": "^5.5.0", + "mini-css-extract-plugin": "^2.6.0", "minio": "^7.0.18", "moment-locales-webpack-plugin": "^1.2.0", - "postcss-import": "^12.0.1", - "postcss-inline-svg": "^3.1.1", - "postcss-loader": "^3.0.0", - "postcss-mixins": "^6.2.3", - "postcss-nesting": "^4.2.1", - "postcss-simple-vars": "^4.1.0", - "style-loader": "^0.23.1", - "svgo": "^1.3.2", - "ts-loader": "^8.3.0", - "typed-css-modules": "^0.7.0", - "typescript": "^3.9.9", - "webpack": "^4.46.0", - "webpack-bundle-analyzer": "^3.8.0", - "webpack-cli": "^3.3.12", - "webpack-dev-server": "^3.11.0" + "postcss": "^8.4.14", + "postcss-import": "^14.1.0", + "postcss-loader": "^7.0.0", + "postcss-mixins": "^9.0.2", + "postcss-nesting": "^10.1.6", + "postcss-simple-vars": "^6.0.3", + "prettier": "^2.6.2", + "sass": "^1.51.0", + "sass-loader": "^13.0.0", + "style-loader": "^3.3.1", + "svg-inline-loader": "^0.8.2", + "svgo": "^2.8.0", + "tailwindcss": "^3.0.23", + "ts-node": "^10.7.0", + "typescript": "^4.6.4", + "webpack": "^5.72.1", + "webpack-bundle-analyzer": "^4.5.0", + "webpack-cli": "^4.9.2", + "webpack-dev-server": "^4.9.0", + "workbox-webpack-plugin": "^6.5.1" }, "engines": { "node": ">=10.14.1" diff --git a/frontend/path-alias.js b/frontend/path-alias.js index 5ac058141..c32b52dc4 100644 --- a/frontend/path-alias.js +++ b/frontend/path-alias.js @@ -1,13 +1,23 @@ const path = require('path'); module.exports = { - App: path.resolve(__dirname, './app'), - Duck: path.resolve(__dirname, './app/duck'), - Components: path.resolve(__dirname, './app/components'), - Shared: path.resolve(__dirname, './app/components/shared'), - UI: path.resolve(__dirname, './app/components/ui'), - HOCs: path.resolve(__dirname, './app/components/hocs'), - Types: path.resolve(__dirname, './app/types'), - Player: path.resolve(__dirname, './app/player'), - Issues: path.resolve(__dirname, './app/components/Session/Issues'), + "@": path.resolve(__dirname, "app"), + "App": path.resolve(__dirname, "app"), + "App/*": path.resolve(__dirname, "app/*"), + "SVG": path.resolve(__dirname, "app/svg"), + "SVG/*": path.resolve(__dirname, "app/svg/*"), + "Components": path.resolve(__dirname, "app/components"), + "Components/*": path.resolve(__dirname, "app/components/*"), + "Types": path.resolve(__dirname, "app/types" ), + "Types/*": path.resolve(__dirname, "app/types/*"), + "UI": path.resolve(__dirname, "app/components/ui"), + "UI/*": path.resolve(__dirname, "app/components/ui/*"), + "Duck": path.resolve(__dirname, "app/duck"), + "Duck/*": path.resolve(__dirname, "app/duck/*"), + "HOCs": path.resolve(__dirname, "app/components/hocs"), + "HOCs/*": path.resolve(__dirname, "app/components/hocs/*"), + "Shared": path.resolve(__dirname, "app/components/shared"), + "Shared/*": path.resolve(__dirname, "app/components/shared/*"), + "Player": path.resolve(__dirname, "app/player"), + "Player/*": path.resolve(__dirname, "app/player/*"), }; \ No newline at end of file diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js index a74b76340..80538ba6c 100644 --- a/frontend/postcss.config.js +++ b/frontend/postcss.config.js @@ -1,7 +1,5 @@ const path = require('path'); - const colors = require('./app/theme/colors'); - const cssnanoOptions = { zindex: false }; module.exports = ({ file, options, env }) => ({ @@ -13,10 +11,11 @@ module.exports = ({ file, options, env }) => ({ 'postcss-mixins': {}, 'postcss-simple-vars': { variables: colors }, 'postcss-nesting': {}, - 'postcss-inline-svg': { - path: path.join(__dirname, 'app/svg'), - }, - 'tailwindcss': true, + // 'postcss-inline-svg': { + // path: path.join(__dirname, 'app/svg'), + // }, + 'tailwindcss/nesting': {}, + tailwindcss: {}, autoprefixer: {}, //'postcss-preset-env': {}, //includes autoprefixer cssnano: env === 'production' ? cssnanoOptions : false, diff --git a/frontend/scripts/icons.js b/frontend/scripts/icons.js deleted file mode 100644 index 49c4459b9..000000000 --- a/frontend/scripts/icons.js +++ /dev/null @@ -1,54 +0,0 @@ -const fs = require('fs'); -const SVGO = require('svgo'); -const deasync = require('deasync-promise'); - -const { collectFilenames } = require('./fs'); - -const ICONS_DIRNAME = 'app/svg/icons'; -const UI_DIRNAME = 'app/components/ui'; - -const svgo = new SVGO({ plugins: [ - { removeAttrs: { attrs: [ "class", "data-name", "dataName", "svg:width", "svg:height" ] } }, - { addAttributesToSVGElement: { attributes: [ "width={ `${ width }px` }", "height={ `${ height }px` }" ] } }, - { convertPathData: true }, // ? - { removeViewBox: false }, // ? - // { removeXMLNS: true }, // ? - { inlineStyles: { onlyMatchedOnce: false } }, // ? - { replaceDashes: { - type: 'perItem', - fn: (item) => { - item.eachAttr(attr => { - attr.name = attr.name.replace(/-([a-z])/g, gr => gr[1].toUpperCase()) - }) - } - }} -]}); - -const svgRE = /\.svg$/; - -const icons = collectFilenames(ICONS_DIRNAME, n => svgRE.test(n)); - -fs.writeFileSync(`${ UI_DIRNAME }/SVG.js`, ` -/* Auto-generated, do not edit */ - -const SVG = ({ name, size, width=size, height=size }) => { - switch (name) { -${ icons.map(name => ` case '${ name.slice(0, -4) }': return ${ - deasync(svgo.optimize(fs.readFileSync( - `${ ICONS_DIRNAME }/${ name }`, - 'utf8', - ))).data - .replace(/xlink\:href/g, 'xlinkHref') - .replace(/xmlns\:xlink/g, 'xmlnsXlink') - }`).join('\n') } - default: - if (window.ENV.PRODUCTION) return null; - throw "unknown icon name " + name; - } -} - -SVG.displayName = 'SVG'; -export default SVG; -`); - -console.log('SVG.js generated') diff --git a/frontend/scripts/icons.ts b/frontend/scripts/icons.ts new file mode 100644 index 000000000..fb443424e --- /dev/null +++ b/frontend/scripts/icons.ts @@ -0,0 +1,101 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +const { optimize } = require('svgo'); +const fs = require('fs'); +const { collectFilenames } = require('./fs'); + +const svgRE = /\.svg$/; +const ICONS_DIRNAME = 'app/svg/icons'; +const UI_DIRNAME = 'app/components/ui'; +const icons = collectFilenames(ICONS_DIRNAME, n => svgRE.test(n)); +const basePlugins = { + plugins: [ + // { name: 'preset-default' }, + { + name: 'removeAttrs', + params: { + attrs: ['fill-rule', 'clip-rule', 'fill'], + }, + }, + 'removeTitle', + 'removeComments', + 'removeXMLProcInst', + 'removeXMLNS', + 'mergeStyles', + 'inlineStyles', + 'removeStyleElement', + ] +} +const plugins = (removeFill = true) => { + return { + plugins: [ + { + name: 'preset-default', + params: { + overrides: { + inlineStyles: { + onlyMatchedOnce: false, + }, + }, + }, + }, + { + name: 'removeAttrs', + params: { + attrs: ['xml', 'style', 'data-name', 'dataName', 'svg:width', 'svg:height', 'fill-rule', removeFill ? 'svg:fill' : ''], + } + }, + { + name: 'addAttributesToSVGElement', + params: { + attributes: [ "width={ `${ width }px` }", "height={ `${ height }px` }", !removeFill ? "fill={ `${ fill }` }" : '' ], + } + }, + { name: 'removeXMLNS' }, + // { name: 'replaceDashes', params: { + // type: 'perItem', + // fn: (item) => { + // item.eachAttr(attr => { + // attr.name = attr.name.replace(/-([a-z])/g, gr => gr[1].toUpperCase()) + // }) + // } + // } }, + + ] + } + } +// fs.promises.mkdir('/tmp/a/apple', { recursive: true }) +// .then(() => { + fs.writeFileSync(`${UI_DIRNAME}/SVG.tsx`, ` +import React from 'react'; + +interface Props { + name: string; + size?: number; + width?: number; + height?: number; + fill?: string; +} + +/* Auto-generated, do not edit */ +const SVG = (props: Props) => { + const { name, size = 14, width = size, height = size, fill = '' } = props; + switch (name) { +${icons.map(icon => { + const svg = fs.readFileSync(`${ICONS_DIRNAME}/${icon}`, 'utf-8'); + const canOptimize = !icon.includes('integrations'); + const { data } = optimize(svg, plugins(canOptimize)); + return ` case '${icon.slice(0, -4)}': return ${data.replace(/xlink\:href/g, 'xlinkHref') + .replace(/xmlns\:xlink/g, 'xmlnsXlink') + .replace(/xml:space="preserve"/g, '')};` +}).join('\n')} +default: + return ; + // if (window.ENV.PRODUCTION) return null; + // throw "unknown icon name " + name; + } +} +SVG.displayName = 'SVG'; +export default SVG; +`) + // }) + // .catch(console.error); \ No newline at end of file diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js index 04fbd65df..966e3cbbe 100644 --- a/frontend/tailwind.config.js +++ b/frontend/tailwind.config.js @@ -1,125 +1,142 @@ const colors = require('./app/theme/colors'); module.exports = { - important: true, - purge: [], - corePlugins: [ - 'preflight', - 'container', - // 'accessibility', - // 'alignContent', - 'alignItems', - 'alignSelf', - //'appearance', - // 'backgroundAttachment', - 'backgroundColor', - 'backgroundOpacity', - // 'backgroundPosition', - // 'backgroundRepeat', - // 'backgroundSize', - // 'borderCollapse', - 'borderColor', - 'borderOpacity', - 'borderRadius', - // 'borderStyle', - 'borderWidth', - // 'boxSizing', - 'boxShadow', - // 'clear', - 'cursor', - 'display', - // 'divideColor', - // 'divideWidth', - // 'fill', - 'flex', - 'flexDirection', - // 'flexGrow', - 'flexShrink', - 'flexWrap', - // 'float', - 'gap', - 'gridAutoFlow', - 'gridColumn', - 'gridColumnStart', - 'gridColumnEnd', - 'gridRow', - 'gridRowStart', - 'gridRowEnd', - 'gridTemplateColumns', - 'gridTemplateRows', - 'fontFamily', - 'fontSize', - //'fontSmoothing', - 'fontStyle', - 'fontWeight', - 'height', - 'inset', - 'justifyContent', - 'justifySelf', - 'letterSpacing', - 'lineHeight', - // 'listStylePosition', - // 'listStyleType', - 'margin', - // 'maxHeight', - // 'maxWidth', - // 'minHeight', - // 'minWidth', - // 'objectFit', - // 'objectPosition', - 'opacity', - // 'order', - 'outline', - 'overflow', - 'padding', - // 'placeholderColor', - // 'placeholderOpacity', - 'pointerEvents', - 'position', - // 'resize', - // 'rotate', - // 'scale', - // 'skew', - // 'space', - // 'stroke', - // 'strokeWidth', - // 'tableLayout', - 'textAlign', - // 'textColor', - // 'textOpacity', - 'textDecoration', - 'textTransform', - // 'transform', - // 'transitionDuration', - // 'transitionProperty', - // 'transitionTimingFunction', - // 'translate', - 'userSelect', - // 'verticalAlign', - 'visibility', - 'whitespace', - 'width', - 'wordBreak', - 'zIndex' - ], - theme: { + // important: true, + content: [ + './app/**/*.tsx', + './app/**/*.js', + ], +// corePlugins: [ +// 'preflight', +// 'container', +// // 'accessibility', +// // 'alignContent', +// 'alignItems', +// 'alignSelf', +// //'appearance', +// // 'backgroundAttachment', +// 'backgroundColor', +// 'backgroundOpacity', +// // 'backgroundPosition', +// // 'backgroundRepeat', +// // 'backgroundSize', +// // 'borderCollapse', +// 'borderColor', +// 'borderOpacity', +// 'borderRadius', +// // 'borderStyle', +// 'borderWidth', +// // 'boxSizing', +// // 'boxShadow', +// // 'clear', +// 'cursor', +// 'display', +// // 'divideColor', +// // 'divideWidth', +// // 'fill', +// 'flex', +// 'flexDirection', +// // 'flexGrow', +// 'flexShrink', +// 'flexWrap', +// // 'float', +// 'gap', +// 'gridAutoFlow', +// 'gridColumn', +// 'gridColumnStart', +// 'gridColumnEnd', +// 'gridRow', +// 'gridRowStart', +// 'gridRowEnd', +// 'gridTemplateColumns', +// 'gridTemplateRows', +// 'fontFamily', +// 'fontSize', +// //'fontSmoothing', +// 'fontStyle', +// 'fontWeight', +// 'height', +// 'inset', +// 'justifyContent', +// 'justifySelf', +// 'letterSpacing', +// 'lineHeight', +// // 'listStylePosition', +// // 'listStyleType', +// 'margin', +// // 'maxHeight', +// // 'maxWidth', +// // 'minHeight', +// // 'minWidth', +// // 'objectFit', +// // 'objectPosition', +// 'opacity', +// // 'order', +// 'outline', +// 'overflow', +// 'padding', +// // 'placeholderColor', +// // 'placeholderOpacity', +// 'pointerEvents', +// 'position', +// // 'resize', +// // 'rotate', +// // 'scale', +// // 'skew', +// // 'space', +// // 'stroke', +// // 'strokeWidth', +// // 'tableLayout', +// 'textAlign', +// // 'textColor', +// // 'textOpacity', +// 'textDecoration', +// 'textTransform', +// // 'transform', +// // 'transitionDuration', +// // 'transitionProperty', +// // 'transitionTimingFunction', +// // 'translate', +// 'userSelect', +// // 'verticalAlign', +// 'visibility', +// 'whitespace', +// 'width', +// 'wordBreak', +// 'zIndex' +// ], + theme: { colors, - borderColor: { - default: '#DDDDDD', - "gray-light-shade": colors["gray-light-shade"], - "blue": colors["active-blue-border"], + // borderColor: { + // default: '#DDDDDD', + // "gray-light-shade": colors["gray-light-shade"], + // "blue": colors["active-blue-border"], + // }, + extend: { + boxShadow: { + 'border-blue': `0 0 0 1px ${colors['active-blue-border']}`, + 'border-main': `0 0 0 1px ${colors['main']}`, + 'border-gray': '0 0 0 1px #999', + }, + keyframes: { + 'fade-in': { + '0%': { + opacity: '0', + // transform: 'translateY(-10px)' + }, + '100%': { + opacity: '1', + // transform: 'translateY(0)' + }, + } + }, + animation: { + 'fade-in': 'fade-in 0.2s ease-out' + } }, - extend: { - boxShadow: { - 'border-blue': `0 0 0 1px ${colors['active-blue-border']}`, - 'border-main': `0 0 0 1px ${colors['main']}`, - 'border-gray': '0 0 0 1px #999', - } - }, - }, - content: [], - variants: { + }, + variants: { visibility: ['responsive', 'hover', 'focus', 'group-hover'] }, - plugins: [], + plugins: [], } diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 63fb417f5..ec32917b1 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -1,39 +1,20 @@ { "compilerOptions": { - "target": "es5", - "module": "es2020", - "moduleResolution": "node", //? - // "allowJs": true, - "declaration": true, + "experimentalDecorators": true, "allowSyntheticDefaultImports": true, - "downlevelIteration": true, - //"sourceMap": false, - "lib": [ "es2020", "dom" ], + "noImplicitAny": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "esModuleInterop": true, + // "module": "es6", + // "target": "es5", + "allowJs": true, + "isolatedModules": true, + "moduleResolution": "node", + "noEmit": true, "jsx": "react", - "strict": true, - "noImplicitAny": false, // TODO: set true for the strict check - "incremental": true, - "baseUrl": ".", - "paths": { // TODO: one-source truth - "App": ["./app"], - "App/*": ["./app/*"], - "Types": ["./app/types" ], - "Types/*": ["./app/types/*"], // Sublime hack - "UI": ["./app/components/ui"], - "UI/*": ["./app/components/ui/*"], - "Duck": ["./app/duck"], - "Duck/*": ["./app/duck/*"], - "HOCs": ["./app/components/hocs"], - "HOCs/*": ["./app/components/hocs/*"], - "Shared": ["./app/components/shared"], - "Shared/*": ["./app/components/shared/*"], - "Player": ["./app/player"], - "Player/*": ["./app/player/*"], - } + // "baseUrl": ".", }, - "exclude": [ - "node_modules", - ".storybook", - "scripts" - ] + "include": ["app"] } \ No newline at end of file diff --git a/frontend/webpack.config.ts b/frontend/webpack.config.ts new file mode 100644 index 000000000..88080fc2c --- /dev/null +++ b/frontend/webpack.config.ts @@ -0,0 +1,133 @@ +import webpack from "webpack"; +import path from "path"; +import { Configuration as WebpackConfiguration, HotModuleReplacementPlugin } from "webpack"; +import { Configuration as WebpackDevServerConfiguration } from 'webpack-dev-server'; +import CopyWebpackPlugin from 'copy-webpack-plugin'; +import HtmlWebpackPlugin from "html-webpack-plugin"; +import MiniCssExtractPlugin from 'mini-css-extract-plugin'; +// import CompressionPlugin from "compression-webpack-plugin"; +const dotenv = require('dotenv').config({ path: __dirname + '/.env' }) +const isDevelopment = process.env.NODE_ENV !== 'production' +const stylesHandler = MiniCssExtractPlugin.loader; +const ENV_VARIABLES = JSON.stringify(dotenv.parsed); +import pathAlias from './path-alias'; + +interface Configuration extends WebpackConfiguration { + devServer?: WebpackDevServerConfiguration +} + +const config: Configuration = { + // mode: isDevelopment ? "development" : "production", + output: { + publicPath: "/", + path: path.resolve(__dirname, 'public'), + }, + entry: "./app/initialize.js", + optimization: { + splitChunks: { + chunks: 'all', + }, + }, + module: { + exprContextCritical: false, + rules: [ + { + test: /\.(ts|js)x?$/i, + exclude: /node_modules/, + use: { + loader: "babel-loader", + options: { + presets: [ + "@babel/preset-env", + "@babel/preset-react", + "@babel/preset-typescript", + ], + }, + }, + }, + { + test: /\.s[ac]ss$/i, + use: [stylesHandler, 'css-loader', 'postcss-loader', 'sass-loader'], + }, + { + test: /\.css$/i, + use: [ + stylesHandler, + { + loader: "css-loader", + options: { + url: { + filter: (url: string) => { + // Semantic-UI-CSS has an extra semi colon in one of the URL due to which CSS loader along + // with webpack 5 fails to generate a build. + // Below if condition is a hack. After Semantic-UI-CSS fixes this, one can replace use clause with just + // use: ['style-loader', 'css-loader'] + if (url.includes('charset=utf-8;;')) { + return false; + } + return true; + }, + } + }, + }, + 'postcss-loader' + ], + }, + // { + // test: /\.(eot|svg|ttf|woff|woff2|png|jpg|gif)$/i, + // exclude: /node_modules/, + // type: 'asset', + // }, + // { + // test: /\.svg/, + // use: ["@svgr/webpack"], + // }, + { + test: /\.(svg)$/i, + use: [ + { + loader: 'file-loader', + }, + ], + }, + ], + }, + resolve: { + extensions: [".tsx", ".ts", ".js"], + alias: pathAlias, + fallback: { + assert: false, + }, + }, + plugins: [ + new webpack.DefinePlugin({ + // 'process.env': ENV_VARIABLES, + 'window.env': ENV_VARIABLES, + 'window.env.PRODUCTION': isDevelopment ? false : true, + }), + new HtmlWebpackPlugin({ + template: 'app/assets/index.html' + }), + new CopyWebpackPlugin({ + patterns: [ + { from: "./app/assets", to: "assets" }, + ], + }), + new MiniCssExtractPlugin(), + new HotModuleReplacementPlugin(), + ], + devtool: isDevelopment ? "inline-source-map" : false, + performance: { + hints: false, + }, + devServer: { + // static: path.join(__dirname, "public"), + historyApiFallback: true, + host: 'localhost', + open: true, + port: 3333, + hot: true, + }, +}; + +export default config; \ No newline at end of file From a7bfbc8ff738c6a9dd90d5acf5a34a12a440b4fb Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Fri, 3 Jun 2022 17:18:17 +0200 Subject: [PATCH 260/260] change(ui) - config changes --- frontend/app/components/Announcements/Announcements.js | 2 +- frontend/app/components/Client/Integrations/Integrations.js | 2 +- frontend/app/components/Header/Discover/Discover.js | 2 +- frontend/package-lock.json | 1 + frontend/package.json | 6 +++--- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/frontend/app/components/Announcements/Announcements.js b/frontend/app/components/Announcements/Announcements.js index b61b62757..ec1e2f3ac 100644 --- a/frontend/app/components/Announcements/Announcements.js +++ b/frontend/app/components/Announcements/Announcements.js @@ -14,7 +14,7 @@ class Announcements extends React.Component { navigateToUrl = url => { if (url) { - if (url.startsWith(window.env.ORIGIN)) { + if (url.startsWith(window.env.ORIGIN || window.location.origin)) { const { history } = this.props; var path = new URL(url).pathname if (path.includes('/metrics')) { diff --git a/frontend/app/components/Client/Integrations/Integrations.js b/frontend/app/components/Client/Integrations/Integrations.js index 00bbac68b..12e3712eb 100644 --- a/frontend/app/components/Client/Integrations/Integrations.js +++ b/frontend/app/components/Client/Integrations/Integrations.js @@ -368,7 +368,7 @@ export default class Integrations extends React.PureComponent { title="Github" description="Easily share issues on GitHub directly from any session replay." icon="integrations/github" - url={ `https://auth.openreplay.com/oauth/login?provider=github&back_url=${window.env.ORIGIN}` } + url={ `https://auth.openreplay.com/oauth/login?provider=github&back_url=${window.env.ORIGIN || window.location.origin}` } onClick={ () => this.showIntegrationConfig(GITHUB) } integrated={ issuesIntegrated } deleteHandler={issuesIntegrated ? () => this.deleteHandler('issues') : null} diff --git a/frontend/app/components/Header/Discover/Discover.js b/frontend/app/components/Header/Discover/Discover.js index b3f40066f..37e00d05b 100644 --- a/frontend/app/components/Header/Discover/Discover.js +++ b/frontend/app/components/Header/Discover/Discover.js @@ -69,7 +69,7 @@ class Discover extends React.PureComponent { onClick = task => { if (task.URL) { - if (task.URL.includes(window.env.ORIGIN)) { + if (task.URL.includes(window.env.ORIGIN || window.location.origin)) { const { history } = this.props; var path = new URL(task.URL).pathname history.push(path) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 7d415be63..b0c4ad67b 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -7,6 +7,7 @@ "": { "name": "openreplay", "version": "1.3.6", + "hasInstallScript": true, "dependencies": { "@sentry/browser": "^5.21.1", "@svg-maps/world": "^1.0.1", diff --git a/frontend/package.json b/frontend/package.json index 40d682c77..f5b960c76 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -3,16 +3,16 @@ "version": "1.3.6", "scripts": { "start": "webpack serve", - "build": "npm run gen:icons && rm -rf public && webpack", + "build": "npm run gen:icons && npm run gen:colors && rm -rf public && webpack", "upload:minio": "node ./scripts/upload-minio.js", "deploy:minio": "npm run build:minio && npm run upload:minio", "lint": "eslint --fix app; exit 0", - "gen:css-types": "tcm app/components && tcm app/player", "gen:constants": "node ./scripts/constants.js", "gen:icons": "node ./scripts/icons.ts", "gen:colors": "node ./scripts/colors.js", "storybook": "start-storybook", - "flow": "flow" + "flow": "flow", + "postinstall": "npm run gen:icons && npm run gen:colors" }, "dependencies": { "@sentry/browser": "^5.21.1",