diff --git a/.circleci/config.yml b/.circleci/config.yml index f9a8e6b7a9..3d266b761e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -158,8 +158,9 @@ commands: no_output_timeout: 30m command: | cd tests-e2e - circleci tests glob "cypress/integration/**/*.js" | circleci tests split --split-by=timings > ./tests-to-run - npm run test -- --spec "$(cat ./tests-to-run | tr '\n' ',')" + SPECS=$(circleci tests glob "cypress/integration/**/*.js" | circleci tests split --split-by=timings | tr '\n' ',') + SPECS=${SPECS::-1} + npm run test -- --spec "${SPECS}" - *save_cypress_cache - store_test_results: path: tests-e2e/cypress/results/junit @@ -176,6 +177,11 @@ jobs: - *restore_go_cache - npm-dependencies - npm-e2e-dependencies + # Base image already bundle a golanci-lint but it's not updated enough (staticcheck linter needed) + - run: + name: install golangci-lint 1.46.2 + command: | + curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sudo sh -s -- -b /usr/local/bin v1.46.2 - run: name: Checking code style command: | diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 54da2a1fdd..6c63a86e5f 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -10,12 +10,12 @@ REMEMBER TO: - Run `make test` to ensure unit tests passed --> -#### Summary +## Summary -#### Ticket Link +## Ticket Link -#### Checklist +## Checklist - [ ] Telemetry updated - [ ] Gated by experimental feature flag diff --git a/.gitignore b/.gitignore index 94716b137f..5cc38b354e 100644 --- a/.gitignore +++ b/.gitignore @@ -8,9 +8,11 @@ dist tests-e2e/node_modules tests-e2e/cypress/screenshots tests-e2e/cypress/videos +tests-e2e/cypress/results .eslintcache report.xml webapp/src/manifest.js server/manifest.go server/data/ +server/e2etest.config.json diff --git a/.golangci.yml b/.golangci.yml index c0a617a171..d57f5e6ca6 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -23,10 +23,11 @@ linters: - ineffassign - exportloopref - staticcheck - - structcheck - unconvert - unused - varcheck + # disabled until is compatible with go1.18 https://github.com/golangci/golangci-lint/issues/2649 + # - structcheck linters-settings: gofmt: diff --git a/.ts-prunerc b/.ts-prunerc new file mode 100644 index 0000000000..a1a0d71e8a --- /dev/null +++ b/.ts-prunerc @@ -0,0 +1,3 @@ +{ + "ignore": "used in module|generated_types" +} diff --git a/Makefile b/Makefile index 7b25b81365..af1f596633 100644 --- a/Makefile +++ b/Makefile @@ -45,7 +45,7 @@ apply: ## Runs eslint and golangci-lint .PHONY: check-style -check-style: apply webapp/node_modules +check-style: apply webapp/node_modules check-golangci @echo Checking for style guide compliance ifneq ($(HAS_WEBAPP),) @@ -56,16 +56,20 @@ endif cd tests-e2e && npm run check ifneq ($(HAS_SERVER),) - @if ! [ -x "$$(command -v golangci-lint)" ]; then \ - echo "golangci-lint is not installed. Please see https://github.com/golangci/golangci-lint#install for installation instructions."; \ - exit 1; \ - fi; \ - @echo Running golangci-lint - golangci-lint --version - golangci-lint run ./... + $(GOBIN)/golangci-lint run ./... endif +.PHONY: check-golangci +check-golangci: +ifneq ($(HAS_SERVER),) + @echo Ckecking golangci-lint + + @# Keep the version in sync with the command in .circleci/config.yml + $(GO) install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.46.2 +endif + + ## Builds the server, if it exists, for all supported architectures, unless MM_SERVICESETTINGS_ENABLEDEVELOPER is set .PHONY: server server: diff --git a/README.md b/README.md index bb1884afe0..b51da8fc40 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,34 @@ This plugin contains both a server and web app portion. Read our documentation a For more information about contributing to Mattermost, and the different ways you can contribute, see https://www.mattermost.org/contribute-to-mattermost. +### Logging + +Logging should use the logrus package (not `pluginAPI.Log`, `mlog`, or `log`). The standard logger is automatically wired into the pluginAPI and proxied through the server: + +```go +logger := logrus.WithField("playbook_run_id", playbookRunID) + +err := findUserForPlaybookRunAndTeam(playbookRunID, userID, teamID) +if err != nil { + logrus.WithError(err).WithFields(logrus.Fields{ + "user_id": userID, + "team_id": teamID, + }).Warn("Failed to find user for playbook run and team") +} +``` + +A few guidelines when logging: +* Use the appropriate level: + * Error: an error log should require some human action to fix something upon receipt + * Warn: a warning log might require investigation if it occurs in bulk, but does not require human action + * Info: a information log provides context that will typically be logged by default + * Debug: a debug log provides context that will typically be logged only on demand +* Write static log messages (`Failed to find user for playbook run and team`) instead of interpolating parameters into the log message itself (`Failed to find user %s for playbook run %s and team %s`) +* Use snake case when naming fields. Try to name these fields consistently with other usage. +* Pass errors using `WithError`. +* Use `WithFields` when passing more than one field that is not an `err`. +* Common fields can be set once instead of being passed for every log + ## Popular searches for Help Wanted issues: * [Help wanted tickets currently up for grab](https://github.com/mattermost/mattermost-server/issues?q=is%3Aopen+is%3Aissue+label%3AArea%2FPlaybooks+label%3A%22Up+For+Grabs%22) diff --git a/assets/i18n/de.json b/assets/i18n/de.json index e84cb94ece..2ee05a820e 100644 --- a/assets/i18n/de.json +++ b/assets/i18n/de.json @@ -84,5 +84,17 @@ { "id": "app.command.execute.error", "translation": "Kann Befehl nicht ausführen." + }, + { + "id": "app.user.run.request_update", + "translation": "@here — @{{.Name}} hat eine Statusaktualisierung angefordert. \n" + }, + { + "id": "app.user.run.request_get_involved", + "translation": "@here - @{{.Name}} möchten an diesem Durchlauf teilnehmen. Um sie als Teilnehmer hinzuzufügen, füge sie bitte diesem Kanal hinzu.\n" + }, + { + "id": "app.user.run.retro_publish", + "translation": "@{{.Name}} hat eine Retrospektive veröffentlicht\n[Ganze Retrospektive ansehen]({{.URL}})\n" } ] diff --git a/assets/i18n/en.json b/assets/i18n/en.json index f1e103c45a..774c20f00c 100644 --- a/assets/i18n/en.json +++ b/assets/i18n/en.json @@ -86,11 +86,19 @@ "translation": "You have 0 assigned tasks." }, { - "id": "app.user.run.request_get_involved", - "translation": "@here — @{{.Name}} wants to get involved in this run. To let them become a member of the run, please add them to this channel.\n" + "id": "app.user.run.joined_run_channel_private_add_participant", + "translation": "@{{.Name}} has been added to the run by @{{.RequesterName}}. They haven't been automatically added to the channel because @{{.RequesterName}} isn't a channel member and the channel is private.\n" + }, + { + "id": "app.user.run.joined_run_channel_private_participate", + "translation": "@{{.Name}} has joined the run. They haven't been automatically added to this private channel but any member of the channel can invite them to join.\n" + }, + { + "id": "app.user.run.request_join_channel", + "translation": "@{{.Name}} is a run participant and wants join this channel. Any member of the channel can invite them.\n" }, { "id": "app.user.run.request_update", - "translation": "@here — @{{.Name}} requested a status update.\n" + "translation": "@here — @{{.Name}} requested a status update. \n" } ] diff --git a/assets/i18n/hr.json b/assets/i18n/hr.json index 0f68a87246..3357f1eeb6 100644 --- a/assets/i18n/hr.json +++ b/assets/i18n/hr.json @@ -102,5 +102,13 @@ "few": "Imaš **{{.Count}} dodijeljena zadatka s rokom nakon danas**.", "other": "Imaš **{{.Count}} dodijeljenih zadataka s rokom nakon danas**." } + }, + { + "id": "app.user.run.request_update", + "translation": "@here – @{{.Name}} je zatražio/la aktualiziranje stanja. \n" + }, + { + "id": "app.user.run.request_get_involved", + "translation": "@here – @{{.Name}} želi sudjelovati u ovom izvođenju. Da bi postali članovi izvođenja, dodaj ih ovom kanalu.\n" } ] diff --git a/assets/i18n/hu.json b/assets/i18n/hu.json new file mode 100644 index 0000000000..5b634886fd --- /dev/null +++ b/assets/i18n/hu.json @@ -0,0 +1,100 @@ +[ + { + "id": "app.user.digest.tasks.due_after_today", + "translation": { + "one": "Önnek van **{{.Count}} Önhöz rendelt feladat aminek a határideje ma után van**.", + "other": "Önnek van **{{.Count}} Önhöz rendelt feladat aminek a határideje ma után van**." + } + }, + { + "id": "app.user.digest.tasks.num_assigned", + "translation": { + "one": "Önhöz {{.Count}} feladat van hozzárendelve:", + "other": "Önhöz {{.Count}} feladat van hozzárendelve:" + } + }, + { + "id": "app.user.digest.tasks.due_in_x_days", + "translation": { + "one": "Határidő lejár {{.Count}} nap múlva", + "other": "Határidő lejár {{.Count}} nap múlva" + } + }, + { + "id": "app.user.digest.tasks.num_assigned_due_until_today", + "translation": { + "one": "Önnek {{.Count}} Önhöz rendelt feladata van késedelemben:", + "other": "Önnek {{.Count}} Önhöz rendelt feladata van késedelemben:" + } + }, + { + "id": "app.user.run.request_get_involved", + "translation": "@here — @{{.Name}} részt szeretne venni ebben a futásban. Ahhoz, hogy résztvevők lehessenek, adja hozzá őket ehhez a csatornához.\n" + }, + { + "id": "app.user.run.request_update", + "translation": "@here — @{{.Name}} kért egy állapot frissítést. \n" + }, + { + "id": "app.user.digest.tasks.zero_assigned", + "translation": "Önhöz 0 feladat van hozzárendelve." + }, + { + "id": "app.user.digest.tasks.heading", + "translation": "Önhöz rendelt feladatok" + }, + { + "id": "app.user.digest.tasks.due_yesterday", + "translation": "Tegnap lejárt" + }, + { + "id": "app.user.digest.tasks.due_x_days_ago", + "translation": "Határidő lejárt {{.Count}} nappal ezelőtt" + }, + { + "id": "app.user.digest.tasks.due_today", + "translation": "Határidő ma" + }, + { + "id": "app.user.digest.tasks.all_tasks_command", + "translation": "Kérem használja a `/playbook todo` parancsot az összes feladat megtekintéséhez." + }, + { + "id": "app.user.digest.runs_in_progress.zero_in_progress", + "translation": "Önnek 0 futása van éppen folyamatban." + }, + { + "id": "app.user.digest.overdue_status_updates.num_overdue", + "translation": { + "one": "Önnek {{.Count}} futása van lejárt állapot frissítéssel:", + "other": "Önnek {{.Count}} futása van lejárt állapot frissítéssel:" + } + }, + { + "id": "app.user.digest.runs_in_progress.num_in_progress", + "translation": { + "one": "Önnek {{.Count}} futása van folyamatban:", + "other": "Önnek {{.Count}} futása van folyamatban:" + } + }, + { + "id": "app.user.digest.overdue_status_updates.zero_overdue", + "translation": "Önnek 0 futása van késedelemben." + }, + { + "id": "app.user.digest.overdue_status_updates.heading", + "translation": "Késedelmes állapot frissítések" + }, + { + "id": "app.command.execute.error", + "translation": "Nem sikerült végrehajtani a parancsot." + }, + { + "id": "app.user.digest.runs_in_progress.heading", + "translation": "Futások folyamatban" + }, + { + "id": "app.user.run.retro_publish", + "translation": "@{{.Name}} közzétett egy visszatekintőt\n[A teljes visszatekintő megtekintése]({{.URL}})\n" + } +] diff --git a/assets/i18n/pl.json b/assets/i18n/pl.json index df24c50583..38bf4f4c72 100644 --- a/assets/i18n/pl.json +++ b/assets/i18n/pl.json @@ -90,5 +90,17 @@ { "id": "app.command.execute.error", "translation": "Nie można wykonać polecenia." + }, + { + "id": "app.user.run.request_update", + "translation": "@here - @{.Name}} poprosił o aktualizację statusu. \n" + }, + { + "id": "app.user.run.request_get_involved", + "translation": "@here - @{.Name}} chce wziąć udział w tym uruchomieniu. Aby uwzględnić ich jako uczestników, dodaj ich do tego kanału.\n" + }, + { + "id": "app.user.run.retro_publish", + "translation": "@{.Name}} opublikował retrospektywę\n[Zobacz pełną retrospektywę]({{.URL}}).\n" } ] diff --git a/assets/i18n/sv.json b/assets/i18n/sv.json index ca01dac132..b68b0d9b38 100644 --- a/assets/i18n/sv.json +++ b/assets/i18n/sv.json @@ -84,5 +84,13 @@ "one": "Du har {{.Count}} körning som borde ha fått en statusuppdatering:", "other": "Du har {{.Count}} körningar som borde ha fått en statusuppdatering:" } + }, + { + "id": "app.user.run.request_update", + "translation": "@here - @{{.Name}} begärde en statusuppdatering. \n" + }, + { + "id": "app.user.run.request_get_involved", + "translation": "@here - @{{.Name}} vill delta i denna körning. Om du vill inkludera dem som deltagare lägger du till dem i den här kanalen.\n" } ] diff --git a/assets/i18n/tr.json b/assets/i18n/tr.json index 6ed29b6382..986abd4d93 100644 --- a/assets/i18n/tr.json +++ b/assets/i18n/tr.json @@ -84,5 +84,17 @@ { "id": "app.command.execute.error", "translation": "Komut yürütülemedi." + }, + { + "id": "app.user.run.request_update", + "translation": "@here — @{{.Name}} bir durum güncellemesi istedi. \n" + }, + { + "id": "app.user.run.request_get_involved", + "translation": "@here — @{{.Name}} bu oyuna katılmak istiyor. Oyuna katılabilmesi için lütfen onu bu kanala ekleyin.\n" + }, + { + "id": "app.user.run.retro_publish", + "translation": "@{{.Name}} bir geçmiş değerlendirmesi yayınladı\n[Geçmiş değerlendirmesine bakın]({{.URL}})\n" } ] diff --git a/build/custom.mk b/build/custom.mk index 749cab12f1..74fce30c0e 100644 --- a/build/custom.mk +++ b/build/custom.mk @@ -4,7 +4,6 @@ GO_BUILD_FLAGS += -ldflags "-X main.rudderDataplaneURL=$(MM_RUDDER_DATAPLANE_URL ## Generate mocks. mocks: ifneq ($(HAS_SERVER),) - mockgen -destination server/bot/mocks/mock_logger.go github.com/mattermost/mattermost-plugin-playbooks/server/bot Logger mockgen -destination server/bot/mocks/mock_poster.go github.com/mattermost/mattermost-plugin-playbooks/server/bot Poster mockgen -destination server/app/mocks/mock_job_once_scheduler.go github.com/mattermost/mattermost-plugin-playbooks/server/app JobOnceScheduler mockgen -destination server/sqlstore/mocks/mock_kvapi.go github.com/mattermost/mattermost-plugin-playbooks/server/sqlstore KVAPI diff --git a/client/client.go b/client/client.go index 39c3322f60..b9c0ed970d 100644 --- a/client/client.go +++ b/client/client.go @@ -46,6 +46,10 @@ type Client struct { Actions *ActionsService // Stats is a collection of methods used to interact with stats. Stats *StatsService + // Reminders is a collection of methods used to interact with reminders. + Reminders *RemindersService + // Telemetry is a collection of methods used to interact with telemetry. + Telemetry *TelemetryService } // New creates a new instance of Client using the configuration from the given Mattermost Client. @@ -71,6 +75,8 @@ func newClient(mattermostSiteURL string, httpClient *http.Client) (*Client, erro c.Settings = &SettingsService{c} c.Actions = &ActionsService{c} c.Stats = &StatsService{c} + c.Reminders = &RemindersService{c} + c.Telemetry = &TelemetryService{c} return c, nil } diff --git a/client/playbook_runs.go b/client/playbook_runs.go index 08780c56ee..a71b88b5f7 100644 --- a/client/playbook_runs.go +++ b/client/playbook_runs.go @@ -175,21 +175,6 @@ func (s *PlaybookRunService) RequestUpdate(ctx context.Context, playbookRunID, u return err } -func (s *PlaybookRunService) RequestGetInvolved(ctx context.Context, playbookRunID, userID string) error { - requestURL := fmt.Sprintf("runs/%s/request-get-involved", playbookRunID) - req, err := s.client.newRequest(http.MethodPost, requestURL, nil) - if err != nil { - return err - } - - resp, err := s.client.do(ctx, req, nil) - if resp.StatusCode != http.StatusOK { - return fmt.Errorf("expected status code %d", http.StatusOK) - } - - return err -} - func (s *PlaybookRunService) Finish(ctx context.Context, playbookRunID string) error { finishURL := fmt.Sprintf("runs/%s/finish", playbookRunID) req, err := s.client.newRequest(http.MethodPut, finishURL, nil) diff --git a/client/reminder.go b/client/reminder.go new file mode 100644 index 0000000000..2e0460a837 --- /dev/null +++ b/client/reminder.go @@ -0,0 +1,5 @@ +package client + +type ReminderResetPayload struct { + NewReminderSeconds int `json:"new_reminder_seconds"` +} diff --git a/client/reminders.go b/client/reminders.go new file mode 100644 index 0000000000..ec4b4a00eb --- /dev/null +++ b/client/reminders.go @@ -0,0 +1,33 @@ +package client + +import ( + "context" + "fmt" + "io/ioutil" + "net/http" +) + +type RemindersService struct { + client *Client +} + +func (s *RemindersService) Reset(ctx context.Context, playbookRunID string, payload ReminderResetPayload) error { + resetURL := fmt.Sprintf("runs/%s/reminder", playbookRunID) + + req, err := s.client.newRequest(http.MethodPost, resetURL, payload) + if err != nil { + return err + } + + resp, err := s.client.do(ctx, req, ioutil.Discard) + if err != nil { + return err + } + resp.Body.Close() + + if resp.StatusCode != http.StatusNoContent { + return fmt.Errorf("expected status code %d", http.StatusNoContent) + } + + return nil +} diff --git a/client/telemetry.go b/client/telemetry.go new file mode 100644 index 0000000000..e9f4e4b77a --- /dev/null +++ b/client/telemetry.go @@ -0,0 +1,46 @@ +package client + +import ( + "context" + "fmt" + "io/ioutil" + "net/http" +) + +type TelemetryService struct { + client *Client +} + +func (s *TelemetryService) CreateEvent(ctx context.Context, name string, eventType string, properties map[string]interface{}) error { + + payload := struct { + Type string + Name string + Properties map[string]interface{} + }{ + Type: eventType, + Name: name, + Properties: properties, + } + + req, err := s.client.newRequest(http.MethodPost, "telemetry", payload) + if err != nil { + return err + } + + resp, err := s.client.do(ctx, req, nil) + if err != nil { + return err + } + resp.Body.Close() + + if resp.StatusCode != http.StatusNoContent { + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + return fmt.Errorf("expected status code %d, got %d: %s", http.StatusNoContent, resp.StatusCode, body) + } + + return nil +} diff --git a/go.mod b/go.mod index 424cf30bcb..e540878815 100644 --- a/go.mod +++ b/go.mod @@ -8,10 +8,6 @@ replace github.com/HdrHistogram/hdrhistogram-go => github.com/codahale/hdrhistog replace github.com/golang/mock => github.com/golang/mock v1.4.4 -replace github.com/mattermost/mattermost-server/v6 => github.com/mattermost/mattermost-server/v6 v6.0.0-20220512052723-ea98f9f4a9dc - -replace github.com/mattermost/mattermost-plugin-api => github.com/mattermost/mattermost-plugin-api v0.0.22-0.20211207232216-3faec618d311 - require ( github.com/Masterminds/squirrel v1.5.2 github.com/blang/semver v3.5.1+incompatible @@ -19,18 +15,18 @@ require ( github.com/golang/mock v1.6.0 github.com/gorilla/mux v1.8.0 github.com/graph-gophers/graphql-go v1.4.0 - github.com/isacikgoz/morph v0.0.0-20220406131225-b96d2fb806f1 github.com/jmoiron/sqlx v1.3.5 - github.com/lib/pq v1.10.5 - github.com/mattermost/mattermost-plugin-api v0.0.22-0.20211207232216-3faec618d311 + github.com/lib/pq v1.10.6 + github.com/mattermost/mattermost-plugin-api v0.0.29 github.com/mattermost/mattermost-plugin-playbooks/client v0.7.0 - github.com/mattermost/mattermost-server/v6 v6.0.0-20220512052723-ea98f9f4a9dc + github.com/mattermost/mattermost-server/v6 v6.0.0-20220728170913-b9d062ddfa66 + github.com/mattermost/morph v0.0.0-20220401091636-39f834798da8 github.com/mitchellh/mapstructure v1.4.3 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.12.1 github.com/rudderlabs/analytics-go v3.3.2+incompatible github.com/sirupsen/logrus v1.8.1 - github.com/stretchr/testify v1.7.1 + github.com/stretchr/testify v1.7.2 github.com/writeas/go-strip-markdown v2.0.1+incompatible gopkg.in/guregu/null.v4 v4.0.0 ) @@ -40,32 +36,32 @@ require ( github.com/JalfResi/justext v0.0.0-20170829062021-c0282dea7198 // indirect github.com/Masterminds/semver/v3 v3.1.1 // indirect github.com/PuerkitoBio/goquery v1.8.0 // indirect - github.com/RoaringBitmap/roaring v0.9.4 // indirect + github.com/RoaringBitmap/roaring v1.2.1 // indirect github.com/advancedlogic/GoOse v0.0.0-20210820140952-9d5822d4a625 // indirect github.com/andybalholm/brotli v1.0.4 // indirect github.com/andybalholm/cascadia v1.3.1 // indirect github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de // indirect github.com/avct/uasurfer v0.0.0-20191028135549-26b5daa857f1 // indirect - github.com/aws/aws-sdk-go v1.44.9 // indirect + github.com/aws/aws-sdk-go v1.44.34 // indirect github.com/aymerick/douceur v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.2.2 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/blevesearch/bleve/v2 v2.3.2 // indirect - github.com/blevesearch/bleve_index_api v1.0.1 // indirect + github.com/blevesearch/bleve_index_api v1.0.2 // indirect github.com/blevesearch/go-porterstemmer v1.0.3 // indirect github.com/blevesearch/gtreap v0.1.1 // indirect - github.com/blevesearch/mmap-go v1.0.3 // indirect + github.com/blevesearch/mmap-go v1.0.4 // indirect github.com/blevesearch/scorch_segment_api/v2 v2.1.0 // indirect github.com/blevesearch/segment v0.9.0 // indirect github.com/blevesearch/snowballstem v0.9.0 // indirect github.com/blevesearch/upsidedown_store_api v1.0.1 // indirect - github.com/blevesearch/vellum v1.0.7 // indirect - github.com/blevesearch/zapx/v11 v11.3.3 // indirect - github.com/blevesearch/zapx/v12 v12.3.3 // indirect - github.com/blevesearch/zapx/v13 v13.3.3 // indirect - github.com/blevesearch/zapx/v14 v14.3.3 // indirect - github.com/blevesearch/zapx/v15 v15.3.3 // indirect + github.com/blevesearch/vellum v1.0.8 // indirect + github.com/blevesearch/zapx/v11 v11.3.4 // indirect + github.com/blevesearch/zapx/v12 v12.3.4 // indirect + github.com/blevesearch/zapx/v13 v13.3.4 // indirect + github.com/blevesearch/zapx/v14 v14.3.4 // indirect + github.com/blevesearch/zapx/v15 v15.3.4 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect @@ -74,7 +70,7 @@ require ( github.com/disintegration/imaging v1.6.2 // indirect github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 // indirect github.com/dustin/go-humanize v1.0.0 // indirect - github.com/dyatlov/go-opengraph v0.0.0-20210112100619-dae8665a5b09 // indirect + github.com/dyatlov/go-opengraph/opengraph v0.0.0-20220524092352-606d7b1e5f8a // indirect github.com/fatih/color v1.13.0 // indirect github.com/fatih/set v0.2.1 // indirect github.com/felixge/httpsnoop v1.0.3 // indirect @@ -98,15 +94,15 @@ require ( github.com/gorilla/websocket v1.5.0 // indirect github.com/graph-gophers/dataloader/v6 v6.0.0 // indirect github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c // indirect - github.com/hashicorp/go-hclog v1.2.0 // indirect + github.com/hashicorp/go-hclog v1.2.1 // indirect github.com/hashicorp/go-plugin v1.4.4 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/yamux v0.0.0-20211028200310-0bc27b27de87 // indirect github.com/jaytaylor/html2text v0.0.0-20211105163654-bc68cce691ba // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.15.3 // indirect - github.com/klauspost/cpuid/v2 v2.0.12 // indirect + github.com/klauspost/compress v1.15.6 // indirect + github.com/klauspost/cpuid/v2 v2.0.13 // indirect github.com/klauspost/pgzip v1.2.5 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect @@ -116,7 +112,6 @@ require ( github.com/mattermost/gziphandler v0.0.1 // indirect github.com/mattermost/ldap v0.0.0-20201202150706-ee0e6284187d // indirect github.com/mattermost/logr/v2 v2.0.15 // indirect - github.com/mattermost/morph v0.0.0-20220401091636-39f834798da8 // indirect github.com/mattermost/rsc v0.0.0-20160330161541-bbaefb05eaa0 // indirect github.com/mattermost/squirrel v0.2.0 // indirect github.com/mattn/go-colorable v0.1.12 // indirect @@ -126,7 +121,7 @@ require ( github.com/mholt/archiver/v3 v3.5.1 // indirect github.com/microcosm-cc/bluemonday v1.0.18 // indirect github.com/minio/md5-simd v1.1.2 // indirect - github.com/minio/minio-go/v7 v7.0.26 // indirect + github.com/minio/minio-go/v7 v7.0.28 // indirect github.com/minio/sha256-simd v1.0.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect @@ -177,21 +172,21 @@ require ( github.com/yuin/goldmark v1.4.12 // indirect go.etcd.io/bbolt v1.3.6 // indirect go.uber.org/atomic v1.9.0 // indirect - golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122 // indirect - golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 // indirect - golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 // indirect + golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect + golang.org/x/image v0.0.0-20220601225756-64ec528b34cd // indirect + golang.org/x/net v0.0.0-20220614195744-fb05da6f9022 // indirect golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 // indirect + golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect + golang.org/x/sys v0.0.0-20220614162138-6c1b26c55098 // indirect golang.org/x/text v0.3.7 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3 // indirect - google.golang.org/grpc v1.46.0 // indirect + google.golang.org/genproto v0.0.0-20220614165028-45ed7f3ff16e // indirect + google.golang.org/grpc v1.47.0 // indirect google.golang.org/protobuf v1.28.0 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect - gopkg.in/ini.v1 v1.66.4 // indirect + gopkg.in/ini.v1 v1.66.6 // indirect gopkg.in/mail.v2 v2.3.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 9cee0ae220..45368b884d 100644 --- a/go.sum +++ b/go.sum @@ -129,8 +129,9 @@ github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbt github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/RoaringBitmap/roaring v0.9.4 h1:ckvZSX5gwCRaJYBNe7syNawCU5oruY9gQmjXlp4riwo= github.com/RoaringBitmap/roaring v0.9.4/go.mod h1:icnadbWcNyfEHlYdr+tDlOTih1Bf/h+rzPpv4sbomAA= +github.com/RoaringBitmap/roaring v1.2.1 h1:58/LJlg/81wfEHd5L9qsHduznOIhyv4qb1yWcSvVq9A= +github.com/RoaringBitmap/roaring v1.2.1/go.mod h1:icnadbWcNyfEHlYdr+tDlOTih1Bf/h+rzPpv4sbomAA= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/advancedlogic/GoOse v0.0.0-20191112112754-e742535969c1/go.mod h1:f3HCSN1fBWjcpGtXyM119MJgeQl838v6so/PQOqvE1w= @@ -170,8 +171,8 @@ github.com/avct/uasurfer v0.0.0-20191028135549-26b5daa857f1 h1:9h8f71kuF1pqovnn9 github.com/avct/uasurfer v0.0.0-20191028135549-26b5daa857f1/go.mod h1:noBAuukeYOXa0aXGqxr24tADqkwDO2KRD15FsuaZ5a8= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.44.9 h1:s3lsEFbc8i7ghQmcEpcdyvoO/WMwyCVa9pUq3Lq//Ok= -github.com/aws/aws-sdk-go v1.44.9/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go v1.44.34 h1:+ZtWIbtSGLNB99P8eBrxXfJZgiIouzUbpkf/MNxq2yQ= +github.com/aws/aws-sdk-go v1.44.34/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.8.0/go.mod h1:xEFuWz+3TYdlPRuo+CqATbeDWIWyaT5uAPwPaWtgse0= github.com/aws/aws-sdk-go-v2 v1.9.2/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= github.com/aws/aws-sdk-go-v2/config v1.6.0/go.mod h1:TNtBVmka80lRPk5+S9ZqVfFszOQAGJJ9KbT3EM3CHNU= @@ -223,8 +224,9 @@ github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/blevesearch/bleve/v2 v2.3.2 h1:BJUnMhi2nrkl+vboHmKfW+9l+tJSj39HeWa5c3BN3/Y= github.com/blevesearch/bleve/v2 v2.3.2/go.mod h1:96+xE5pZUOsr3Y4vHzV1cBC837xZCpwLlX0hrrxnvIg= -github.com/blevesearch/bleve_index_api v1.0.1 h1:nx9++0hnyiGOHJwQQYfsUGzpRdEVE5LsylmmngQvaFk= github.com/blevesearch/bleve_index_api v1.0.1/go.mod h1:fiwKS0xLEm+gBRgv5mumf0dhgFr2mDgZah1pqv1c1M4= +github.com/blevesearch/bleve_index_api v1.0.2 h1:rO736FwEPMVY1mGi7d4n7CgBB3+tB7uYN7QTjR+Ij+s= +github.com/blevesearch/bleve_index_api v1.0.2/go.mod h1:fiwKS0xLEm+gBRgv5mumf0dhgFr2mDgZah1pqv1c1M4= github.com/blevesearch/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:9eJDeqxJ3E7WnLebQUlPD7ZjSce7AnDb9vjGmMCbD0A= github.com/blevesearch/go-porterstemmer v1.0.3 h1:GtmsqID0aZdCSNiY8SkuPJ12pD4jI+DdXTAn4YRcHCo= github.com/blevesearch/go-porterstemmer v1.0.3/go.mod h1:angGc5Ht+k2xhJdZi511LtmxuEf0OVpvUUNrwmM1P7M= @@ -232,8 +234,9 @@ github.com/blevesearch/goleveldb v1.0.1/go.mod h1:WrU8ltZbIp0wAoig/MHbrPCXSOLpe7 github.com/blevesearch/gtreap v0.1.1 h1:2JWigFrzDMR+42WGIN/V2p0cUvn4UP3C4Q5nmaZGW8Y= github.com/blevesearch/gtreap v0.1.1/go.mod h1:QaQyDRAT51sotthUWAH4Sj08awFSSWzgYICSZ3w0tYk= github.com/blevesearch/mmap-go v1.0.2/go.mod h1:ol2qBqYaOUsGdm7aRMRrYGgPvnwLe6Y+7LMvAB5IbSA= -github.com/blevesearch/mmap-go v1.0.3 h1:7QkALgFNooSq3a46AE+pWeKASAZc9SiNFJhDGF1NDx4= github.com/blevesearch/mmap-go v1.0.3/go.mod h1:pYvKl/grLQrBxuaRYgoTssa4rVujYYeenDp++2E+yvs= +github.com/blevesearch/mmap-go v1.0.4 h1:OVhDhT5B/M1HNPpYPBKIEJaD0F3Si+CrEKULGCDPWmc= +github.com/blevesearch/mmap-go v1.0.4/go.mod h1:EWmEAOmdAS9z/pi/+Toxu99DnsbhG1TIxUoRmJw/pSs= github.com/blevesearch/scorch_segment_api/v2 v2.1.0 h1:NFwteOpZEvJk5Vg0H6gD0hxupsG3JYocE4DBvsA2GZI= github.com/blevesearch/scorch_segment_api/v2 v2.1.0/go.mod h1:uch7xyyO/Alxkuxa+CGs79vw0QY8BENSBjg6Mw5L5DE= github.com/blevesearch/segment v0.9.0 h1:5lG7yBCx98or7gK2cHMKPukPZ/31Kag7nONpoBt22Ac= @@ -243,18 +246,24 @@ github.com/blevesearch/snowballstem v0.9.0 h1:lMQ189YspGP6sXvZQ4WZ+MLawfV8wOmPoD github.com/blevesearch/snowballstem v0.9.0/go.mod h1:PivSj3JMc8WuaFkTSRDW2SlrulNWPl4ABg1tC/hlgLs= github.com/blevesearch/upsidedown_store_api v1.0.1 h1:1SYRwyoFLwG3sj0ed89RLtM15amfX2pXlYbFOnF8zNU= github.com/blevesearch/upsidedown_store_api v1.0.1/go.mod h1:MQDVGpHZrpe3Uy26zJBf/a8h0FZY6xJbthIMm8myH2Q= -github.com/blevesearch/vellum v1.0.7 h1:+vn8rfyCRHxKVRgDLeR0FAXej2+6mEb5Q15aQE/XESQ= github.com/blevesearch/vellum v1.0.7/go.mod h1:doBZpmRhwTsASB4QdUZANlJvqVAUdUyX0ZK7QJCTeBE= -github.com/blevesearch/zapx/v11 v11.3.3 h1:8vQMO5hdA2qPCmicIMuKS+qcvUAEh6Vcb0uve4Nh8e4= +github.com/blevesearch/vellum v1.0.8 h1:iMGh4lfxza4BnWO/UJTMPlI3HsK9YawjPv+TteVa9ck= +github.com/blevesearch/vellum v1.0.8/go.mod h1:+cpRi/tqq49xUYSQN2P7A5zNSNrS+MscLeeaZ3J46UA= github.com/blevesearch/zapx/v11 v11.3.3/go.mod h1:YzTfUm4kS3e8OmTXDHVV8OzC5MWPO/VPJZQgPNVb4Lc= -github.com/blevesearch/zapx/v12 v12.3.3 h1:MQO5YNI8MqdPz12ALCoXiJw5cl9QQamYZSp285Z/+Mo= +github.com/blevesearch/zapx/v11 v11.3.4 h1:MjYFN8fwDajRgeUsKMfW673zI6MI3twy0pCsUH/LXgc= +github.com/blevesearch/zapx/v11 v11.3.4/go.mod h1:HJ7qdfBxdziuymKvXbsBVhCK5pB98tdzQbc8pJV6tJo= github.com/blevesearch/zapx/v12 v12.3.3/go.mod h1:RMl6lOZqF+sTxKvhQDJ5yK2LT3Mu7E2p/jGdjAaiRxs= -github.com/blevesearch/zapx/v13 v13.3.3 h1:TS4xpMK1ARPYHq+1WwuEOKMOiwvKpTK3RuWOkKlI7BE= +github.com/blevesearch/zapx/v12 v12.3.4 h1:OpPoHQjsjvDImDzwKZXTXubIPJz28EaRynJGJSS6mvU= +github.com/blevesearch/zapx/v12 v12.3.4/go.mod h1:uQrKrK9XjXAAsJfAIE8ViLqIKP/keA2DQhS1XXpjkwA= github.com/blevesearch/zapx/v13 v13.3.3/go.mod h1:eppobNM35U4C22yDvTuxV9xPqo10pwfP/jugL4INWG4= -github.com/blevesearch/zapx/v14 v14.3.3 h1:dqqAzGphKl0yehHKKntDHKlEMhi9B/tJrD4OsWpY7YE= +github.com/blevesearch/zapx/v13 v13.3.4 h1:f646k6300VGRIR7eJ6lLtF8UC95NIWmF899j49o7PJA= +github.com/blevesearch/zapx/v13 v13.3.4/go.mod h1:Wl7hO1gT+IDvJb7i06g2iW5Qvw0KzncJPsBx7WGWhLA= github.com/blevesearch/zapx/v14 v14.3.3/go.mod h1:zXNcVzukh0AvG57oUtT1T0ndi09H0kELNaNmekEy0jw= -github.com/blevesearch/zapx/v15 v15.3.3 h1:60oE+qsJkveLenJmbc0eaH59GWYCbJJsPDV6Z5hEoYY= +github.com/blevesearch/zapx/v14 v14.3.4 h1:/FVzSGFG5rbVWfPEqlcaJd8lZSJMQpTdmFhz/l2QI7w= +github.com/blevesearch/zapx/v14 v14.3.4/go.mod h1:b1YhRXXhAj9i+9aOwhRKCHUmJyYieK/QbDvPJDLddUk= github.com/blevesearch/zapx/v15 v15.3.3/go.mod h1:C+f/97ZzTzK6vt/7sVlZdzZxKu+5+j4SrGCvr9dJzaY= +github.com/blevesearch/zapx/v15 v15.3.4 h1:/y6AOxRuBiZPFAItqcrKcXPPtlAwuW/jMoOFO7tc7rs= +github.com/blevesearch/zapx/v15 v15.3.4/go.mod h1:TQ/qDC2q7TSSpeC6Vgr9fDN56Ra0u49lZJQ4v30WEx4= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= @@ -484,8 +493,8 @@ github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdf github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dyatlov/go-opengraph v0.0.0-20210112100619-dae8665a5b09 h1:AQLr//nh20BzN3hIWj2+/Gt3FwSs8Nwo/nz4hMIcLPg= -github.com/dyatlov/go-opengraph v0.0.0-20210112100619-dae8665a5b09/go.mod h1:nYia/MIs9OyvXXYboPmNOj0gVWo97Wx0sde+ZuKkoM4= +github.com/dyatlov/go-opengraph/opengraph v0.0.0-20220524092352-606d7b1e5f8a h1:etIrTD8BQqzColk9nKRusM9um5+1q0iOEJLqfBMIK64= +github.com/dyatlov/go-opengraph/opengraph v0.0.0-20220524092352-606d7b1e5f8a/go.mod h1:emQhSYTXqB0xxjLITTw4EaWZ+8IIQYw+kx9GqNUKdLg= github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= @@ -807,8 +816,8 @@ github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXcJdM= -github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.1 h1:YQsLlGDJgwhXFpucSPyVbCBviQtjlHv3jLTlp8YmtEw= +github.com/hashicorp/go-hclog v1.2.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= @@ -853,8 +862,6 @@ github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/ github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= -github.com/isacikgoz/morph v0.0.0-20220406131225-b96d2fb806f1 h1:P1fsVaQxAoOq26O3VmT+bnvSupObRxaTMr1poB9W3+A= -github.com/isacikgoz/morph v0.0.0-20220406131225-b96d2fb806f1/go.mod h1:PLYQsFSO/3n3yQA4D7XgEnQySgc6BxlH1R5t1UfAGqU= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= @@ -966,16 +973,16 @@ github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8 github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.3 h1:wmfu2iqj9q22SyMINp1uQ8C2/V4M1phJdmH9fG4nba0= -github.com/klauspost/compress v1.15.3/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.15.6 h1:6D9PcO8QWu0JyaQ2zUMmu16T1T+zjjEpP91guRsvDfY= +github.com/klauspost/compress v1.15.6/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.12 h1:p9dKCg8i4gmOxtv35DvrYoWqYzQrvEVdjQ762Y0OqZE= -github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +github.com/klauspost/cpuid/v2 v2.0.13 h1:1XxvOiqXZ8SULZUKim/wncr3wZ38H4yCuVDvKdK9OGs= +github.com/klauspost/cpuid/v2 v2.0.13/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -1013,9 +1020,8 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.5 h1:J+gdV2cUmX7ZqL2B0lFcW0m+egaHC2V3lpO8nWxyYiQ= -github.com/lib/pq v1.10.5/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= +github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= @@ -1040,10 +1046,10 @@ github.com/mattermost/ldap v0.0.0-20201202150706-ee0e6284187d h1:/RJ/UV7M5c7L2TQ github.com/mattermost/ldap v0.0.0-20201202150706-ee0e6284187d/go.mod h1:HLbgMEI5K131jpxGazJ97AxfPDt31osq36YS1oxFQPQ= github.com/mattermost/logr/v2 v2.0.15 h1:+WNbGcsc3dBao65eXlceB6dTILNJRIrvubnsTl3zBew= github.com/mattermost/logr/v2 v2.0.15/go.mod h1:mpPp935r5dIkFDo2y9Q87cQWhFR/4xXpNh0k/y8Hmwg= -github.com/mattermost/mattermost-plugin-api v0.0.22-0.20211207232216-3faec618d311 h1:DWic8ADy27L5sBHQdvXfibD2VxM9d3Bc3ejmVkjFEjQ= -github.com/mattermost/mattermost-plugin-api v0.0.22-0.20211207232216-3faec618d311/go.mod h1:yfWc/q4V1RWlDGH5wvTdYcNCtBW7wZ0mrs/xVkCpdoo= -github.com/mattermost/mattermost-server/v6 v6.0.0-20220512052723-ea98f9f4a9dc h1:I31pS+5t9sUcYNb11gvDq6KQ/jUbVxAPKYNLqFhXaPE= -github.com/mattermost/mattermost-server/v6 v6.0.0-20220512052723-ea98f9f4a9dc/go.mod h1:HBSu5YC0k8TLb+7DFFB9/63/+oBZj7pgx8K07lHmzyI= +github.com/mattermost/mattermost-plugin-api v0.0.29 h1:sMM7evghZNLBm5RQOjEUfoKyXuTjnVBFFnwf+5mTqog= +github.com/mattermost/mattermost-plugin-api v0.0.29/go.mod h1:Lk2NSf63RqWGmqoZ0A7NK0p08hnAcMmi+rlkXgwGwGk= +github.com/mattermost/mattermost-server/v6 v6.0.0-20220728170913-b9d062ddfa66 h1:jVGgyRNeIRnRi45T/jPjRsK/9dvlaMoWG21O2/F2gyo= +github.com/mattermost/mattermost-server/v6 v6.0.0-20220728170913-b9d062ddfa66/go.mod h1:otnBnKY9Y0eNkUKeD161de+BUBlESwANTnrkPT/392Y= github.com/mattermost/morph v0.0.0-20220401091636-39f834798da8 h1:gwliVjCTqAC01mSCNqa5nJ/4MmGq50vrjsottIhQ4d8= github.com/mattermost/morph v0.0.0-20220401091636-39f834798da8/go.mod h1:jxM3g1bx+k2Thz7jofcHguBS8TZn5Pc+o5MGmORObhw= github.com/mattermost/rsc v0.0.0-20160330161541-bbaefb05eaa0 h1:G9tL6JXRBMzjuD1kkBtcnd42kUiT6QDwxfFYu7adM6o= @@ -1104,8 +1110,8 @@ github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WT github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.26 h1:D0HK+8793etZfRY/vHhDmFaP+vmT41K3K4JV9vmZCBQ= -github.com/minio/minio-go/v7 v7.0.26/go.mod h1:x81+AX5gHSfCSqw7jxRKHvxUXMlE5uKX0Vb75Xk5yYg= +github.com/minio/minio-go/v7 v7.0.28 h1:VMr3K5qGIEt+/KW3poopRh8mzi5RwuCjmrmstK196Fg= +github.com/minio/minio-go/v7 v7.0.28/go.mod h1:x81+AX5gHSfCSqw7jxRKHvxUXMlE5uKX0Vb75Xk5yYg= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= @@ -1361,7 +1367,6 @@ github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/rudderlabs/analytics-go v3.3.1+incompatible/go.mod h1:LF8/ty9kUX4PTY3l5c97K3nZZaX5Hwsvt+NBaRL/f30= github.com/rudderlabs/analytics-go v3.3.2+incompatible h1:bDajEJTYhfHjNYxbQFMA/2dHlOjyeSgxS7GPIdMZ52Q= github.com/rudderlabs/analytics-go v3.3.2+incompatible/go.mod h1:LF8/ty9kUX4PTY3l5c97K3nZZaX5Hwsvt+NBaRL/f30= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= @@ -1481,8 +1486,9 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -1675,8 +1681,8 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122 h1:NvGWuYG8dkDHFSKksI1P9faiVJ9rayE6l0+ouWVIDs8= -golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1702,8 +1708,8 @@ golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+o golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 h1:LRtI4W37N+KFebI/qV0OFiLUv4GLOWeEW5hn/KEJvxE= -golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220601225756-64ec528b34cd h1:9NbNcTg//wfC5JskFW4Z3sqwVnjmJKHxLAol1bW2qgw= +golang.org/x/image v0.0.0-20220601225756-64ec528b34cd/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -1730,7 +1736,7 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1809,8 +1815,9 @@ golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220111093109-d55c255bac03/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 h1:HVyaeDAYux4pnY+D/SiwmLOR36ewZ4iGQIIrtnuCjFA= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220614195744-fb05da6f9022 h1:0qjDla5xICC2suMtyRH/QqX3B1btXTfNsIt/i4LFgO0= +golang.org/x/net v0.0.0-20220614195744-fb05da6f9022/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/oauth2 v0.0.0-20180227000427-d7d64896b5ff/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1845,8 +1852,9 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f h1:Ax0t5p6N38Ga0dThY21weqDEyz2oklo4IvDkpigvkD8= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180224232135-f6cff0780e54/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1978,8 +1986,10 @@ golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220317061510-51cd9980dadf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 h1:nonptSpoQ4vQjyraW20DXPAglgQfVnM9ZC6MmNLMR60= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220614162138-6c1b26c55098 h1:PgOr27OhUx2IRqGJ2RxAWI4dJQ7bi9cSrB82uzFzfUA= +golang.org/x/sys v0.0.0-20220614162138-6c1b26c55098/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -2087,15 +2097,15 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= @@ -2225,8 +2235,8 @@ google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ6 google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3 h1:q1kiSVscqoDeqTF27eQ2NnLLDmqF0I373qQNXYMy0fo= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220614165028-45ed7f3ff16e h1:ubR4JUtqN3ffdFjpKylv8scWk/mZstGmzXbgYSkuMl0= +google.golang.org/genproto v0.0.0-20220614165028-45ed7f3ff16e/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -2264,8 +2274,8 @@ google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9K google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0 h1:oCjezcn6g6A75TGoKYBPgKmVBLexhYLM6MebdrPApP8= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -2305,8 +2315,8 @@ gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= -gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mail.v2 v2.3.1 h1:WYFn/oANrAGP2C0dcV6/pbkPzv8yGzqTjPmTeO7qoXk= gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= @@ -2333,8 +2343,9 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/postgres v1.0.8/go.mod h1:4eOzrI1MUfm6ObJU/UcmbXyiHSs8jSwH95G5P5dxcAg= gorm.io/gorm v1.20.12/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gorm.io/gorm v1.21.4/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..00e54341bf --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "mattermost-plugin-playbooks", + "lockfileVersion": 2, + "requires": true, + "packages": {} +} diff --git a/server/api/actions.go b/server/api/actions.go index 2dfcdd0fbb..25e15152e8 100644 --- a/server/api/actions.go +++ b/server/api/actions.go @@ -11,7 +11,6 @@ import ( "github.com/gorilla/mux" pluginapi "github.com/mattermost/mattermost-plugin-api" - "github.com/mattermost/mattermost-plugin-playbooks/server/bot" ) type ActionsHandler struct { @@ -21,9 +20,9 @@ type ActionsHandler struct { permissions *app.PermissionsService } -func NewActionsHandler(router *mux.Router, log bot.Logger, channelActionsService app.ChannelActionService, pluginAPI *pluginapi.Client, permissions *app.PermissionsService) *ActionsHandler { +func NewActionsHandler(router *mux.Router, channelActionsService app.ChannelActionService, pluginAPI *pluginapi.Client, permissions *app.PermissionsService) *ActionsHandler { handler := &ActionsHandler{ - ErrorHandler: &ErrorHandler{log: log}, + ErrorHandler: &ErrorHandler{}, channelActionsService: channelActionsService, pluginAPI: pluginAPI, permissions: permissions, @@ -33,48 +32,48 @@ func NewActionsHandler(router *mux.Router, log bot.Logger, channelActionsService channelsActionsRouter := actionsRouter.PathPrefix("/channels").Subrouter() channelActionsRouter := channelsActionsRouter.PathPrefix("/{channel_id:[A-Za-z0-9]+}").Subrouter() - channelActionsRouter.HandleFunc("", handler.createChannelAction).Methods(http.MethodPost) - channelActionsRouter.HandleFunc("", handler.getChannelActions).Methods(http.MethodGet) - channelActionsRouter.HandleFunc("/check-and-send-message-on-join", handler.checkAndSendMessageOnJoin).Methods(http.MethodGet) + channelActionsRouter.HandleFunc("", withContext(handler.createChannelAction)).Methods(http.MethodPost) + channelActionsRouter.HandleFunc("", withContext(handler.getChannelActions)).Methods(http.MethodGet) + channelActionsRouter.HandleFunc("/check-and-send-message-on-join", withContext(handler.checkAndSendMessageOnJoin)).Methods(http.MethodGet) channelActionRouter := channelActionsRouter.PathPrefix("/{action_id:[A-Za-z0-9]+}").Subrouter() - channelActionRouter.HandleFunc("", handler.updateChannelAction).Methods(http.MethodPut) + channelActionRouter.HandleFunc("", withContext(handler.updateChannelAction)).Methods(http.MethodPut) return handler } -func (a *ActionsHandler) createChannelAction(w http.ResponseWriter, r *http.Request) { +func (a *ActionsHandler) createChannelAction(c *Context, w http.ResponseWriter, r *http.Request) { userID := r.Header.Get("Mattermost-User-ID") vars := mux.Vars(r) channelID := vars["channel_id"] - if !a.PermissionsCheck(w, a.permissions.ChannelActionCreate(userID, channelID)) { + if !a.PermissionsCheck(w, c.logger, a.permissions.ChannelActionCreate(userID, channelID)) { return } var channelAction app.GenericChannelAction if err := json.NewDecoder(r.Body).Decode(&channelAction); err != nil { - a.HandleErrorWithCode(w, http.StatusBadRequest, "unable to parse action", err) + a.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to parse action", err) return } // Ensure that the channel ID in both the URL and the body of the request are the same; // otherwise the permission check done above no longer makes sense if channelAction.ChannelID != channelID { - a.HandleErrorWithCode(w, http.StatusBadRequest, "channel ID in request body must match channel ID in URL", nil) + a.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "channel ID in request body must match channel ID in URL", nil) return } // Validate the action type and payload if err := a.channelActionsService.Validate(channelAction); err != nil { - a.HandleErrorWithCode(w, http.StatusBadRequest, "invalid action", err) + a.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "invalid action", err) return } id, err := a.channelActionsService.Create(channelAction) if err != nil { - a.HandleErrorWithCode(w, http.StatusInternalServerError, "unable to create action", err) + a.HandleErrorWithCode(w, c.logger, http.StatusInternalServerError, "unable to create action", err) return } @@ -134,24 +133,24 @@ func parseGetChannelActionsOptions(query url.Values) (*app.GetChannelActionOptio }, nil } -func (a *ActionsHandler) getChannelActions(w http.ResponseWriter, r *http.Request) { +func (a *ActionsHandler) getChannelActions(c *Context, w http.ResponseWriter, r *http.Request) { userID := r.Header.Get("Mattermost-User-ID") vars := mux.Vars(r) channelID := vars["channel_id"] - if !a.PermissionsCheck(w, a.permissions.ChannelActionView(userID, channelID)) { + if !a.PermissionsCheck(w, c.logger, a.permissions.ChannelActionView(userID, channelID)) { return } options, err := parseGetChannelActionsOptions(r.URL.Query()) if err != nil { - a.HandleErrorWithCode(w, http.StatusBadRequest, errors.Wrapf(err, "bad options").Error(), err) + a.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, errors.Wrapf(err, "bad options").Error(), err) } actions, err := a.channelActionsService.GetChannelActions(channelID, *options) if err != nil { - a.HandleErrorWithCode(w, http.StatusInternalServerError, fmt.Sprintf("unable to retrieve actions for channel %s", channelID), err) + a.HandleErrorWithCode(w, c.logger, http.StatusInternalServerError, fmt.Sprintf("unable to retrieve actions for channel %s", channelID), err) return } @@ -159,12 +158,12 @@ func (a *ActionsHandler) getChannelActions(w http.ResponseWriter, r *http.Reques } // checkAndSendMessageOnJoin handles the GET /actions/channels/{channel_id}/check_and_send_message_on_join endpoint. -func (a *ActionsHandler) checkAndSendMessageOnJoin(w http.ResponseWriter, r *http.Request) { +func (a *ActionsHandler) checkAndSendMessageOnJoin(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) channelID := vars["channel_id"] userID := r.Header.Get("Mattermost-User-ID") - if !a.PermissionsCheck(w, a.permissions.ChannelActionView(userID, channelID)) { + if !a.PermissionsCheck(w, c.logger, a.permissions.ChannelActionView(userID, channelID)) { return } @@ -172,38 +171,38 @@ func (a *ActionsHandler) checkAndSendMessageOnJoin(w http.ResponseWriter, r *htt ReturnJSON(w, map[string]interface{}{"viewed": hasViewed}, http.StatusOK) } -func (a *ActionsHandler) updateChannelAction(w http.ResponseWriter, r *http.Request) { +func (a *ActionsHandler) updateChannelAction(c *Context, w http.ResponseWriter, r *http.Request) { userID := r.Header.Get("Mattermost-User-ID") vars := mux.Vars(r) channelID := vars["channel_id"] - if !a.PermissionsCheck(w, a.permissions.ChannelActionUpdate(userID, channelID)) { + if !a.PermissionsCheck(w, c.logger, a.permissions.ChannelActionUpdate(userID, channelID)) { return } var newChannelAction app.GenericChannelAction if err := json.NewDecoder(r.Body).Decode(&newChannelAction); err != nil { - a.HandleErrorWithCode(w, http.StatusBadRequest, "unable to parse action", err) + a.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to parse action", err) return } // Ensure that the channel ID in both the URL and the body of the request are the same; // otherwise the permission check done above no longer makes sense if newChannelAction.ChannelID != channelID { - a.HandleErrorWithCode(w, http.StatusBadRequest, "channel ID in request body must match channel ID in URL", nil) + a.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "channel ID in request body must match channel ID in URL", nil) return } // Validate the new action type and payload if err := a.channelActionsService.Validate(newChannelAction); err != nil { - a.HandleErrorWithCode(w, http.StatusBadRequest, "invalid action", err) + a.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "invalid action", err) return } err := a.channelActionsService.Update(newChannelAction, userID) if err != nil { - a.HandleErrorWithCode(w, http.StatusInternalServerError, fmt.Sprintf("unable to update action with ID %q", newChannelAction.ID), err) + a.HandleErrorWithCode(w, c.logger, http.StatusInternalServerError, fmt.Sprintf("unable to update action with ID %q", newChannelAction.ID), err) return } diff --git a/server/api/api.go b/server/api/api.go index cfad78ae53..7c3281b077 100644 --- a/server/api/api.go +++ b/server/api/api.go @@ -6,14 +6,23 @@ import ( "github.com/sirupsen/logrus" - "github.com/mattermost/mattermost-plugin-playbooks/server/bot" - "github.com/gorilla/mux" "github.com/mattermost/mattermost-plugin-playbooks/server/config" pluginapi "github.com/mattermost/mattermost-plugin-api" ) +// MaxRequestSize is the size limit for any incoming request +// The default limit set by mattermost-server is the configured max file size, and +// it sometimes isn't small enough to prevent some scenarios. +// +// This is important to prevent huge payloads from being sent +// that could end in a bigger problem. +// +// If an endpoint needs a smaller limit than this one, it could be solved by adding their +// own limit BEFORE reading the request body `r.Body = http.MaxBytesReader(w, r.Body, MaxRequestSize)` +const MaxRequestSize = 5 * 1024 * 1024 // 5MB + // Handler Root API handler. type Handler struct { *ErrorHandler @@ -24,15 +33,16 @@ type Handler struct { } // NewHandler constructs a new handler. -func NewHandler(pluginAPI *pluginapi.Client, config config.Service, log bot.Logger) *Handler { +func NewHandler(pluginAPI *pluginapi.Client, config config.Service) *Handler { handler := &Handler{ - ErrorHandler: &ErrorHandler{log: log}, + ErrorHandler: &ErrorHandler{}, pluginAPI: pluginAPI, config: config, } root := mux.NewRouter() api := root.PathPrefix("/api/v0").Subrouter() + api.Use(LogRequest) api.Use(MattermostAuthorizationRequired) api.Handle("{anything:.*}", http.NotFoundHandler()) @@ -46,35 +56,45 @@ func NewHandler(pluginAPI *pluginapi.Client, config config.Service, log bot.Logg } func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + r.Body = http.MaxBytesReader(w, r.Body, MaxRequestSize) h.root.ServeHTTP(w, r) } -// HandleErrorWithCode logs the internal error and sends the public facing error +// handleResponseWithCode logs the internal error and sends the public facing error // message as JSON in a response with the provided code. -func HandleErrorWithCode(logger bot.Logger, w http.ResponseWriter, code int, publicErrorMsg string, internalErr error) { +func handleResponseWithCode(w http.ResponseWriter, code int, publicMsg string) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(code) - details := "" - if internalErr != nil { - details = internalErr.Error() - } - - logger.Errorf("public error message: %v; internal details: %v", publicErrorMsg, details) - responseMsg, _ := json.Marshal(struct { Error string `json:"error"` // A public facing message providing details about the error. }{ - Error: publicErrorMsg, + Error: publicMsg, }) _, _ = w.Write(responseMsg) } +// HandleErrorWithCode logs the internal error and sends the public facing error +// message as JSON in a response with the provided code. +func HandleErrorWithCode(logger logrus.FieldLogger, w http.ResponseWriter, code int, publicErrorMsg string, internalErr error) { + if internalErr != nil { + logger = logger.WithError(internalErr) + } + + if code >= http.StatusInternalServerError { + logger.Error(publicErrorMsg) + } else { + logger.Warn(publicErrorMsg) + } + + handleResponseWithCode(w, code, publicErrorMsg) +} + // ReturnJSON writes the given pointerToObject as json with the provided httpStatus func ReturnJSON(w http.ResponseWriter, pointerToObject interface{}, httpStatus int) { jsonBytes, err := json.Marshal(pointerToObject) if err != nil { - logrus.Warnf("Unable to marshall JSON. Error details: %s", err.Error()) + logrus.WithError(err).Error("Unable to marshal JSON") return } @@ -82,7 +102,7 @@ func ReturnJSON(w http.ResponseWriter, pointerToObject interface{}, httpStatus i w.WriteHeader(httpStatus) if _, err = w.Write(jsonBytes); err != nil { - logrus.Warnf("Unable to write to http.ResponseWriter. Error details: %s", err.Error()) + logrus.WithError(err).Warn("Unable to write to http.ResponseWriter") return } } diff --git a/server/api/api.yaml b/server/api/api.yaml index 0877667722..7541ae930d 100644 --- a/server/api/api.yaml +++ b/server/api/api.yaml @@ -1,4 +1,5 @@ -openapi: "3.0.0" +--- +openapi: 3.0.0 info: version: 0.6.0 title: Playbooks API @@ -78,7 +79,8 @@ paths: example: InProgress schema: type: array - default: ["InProgress"] + default: + - InProgress items: type: string enum: @@ -104,7 +106,7 @@ paths: in: query description: The returned list will contain only the playbook runs whose name contains the search term. required: false - example: "server down" + example: server down schema: type: string x-codeSamples: @@ -120,11 +122,11 @@ paths: schema: $ref: "#/components/schemas/PlaybookRunList" 400: - $ref: "#/components/schemas/400" + $ref: "#/components/responses/400" 403: - $ref: "#/components/schemas/403" + $ref: "#/components/responses/403" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" post: summary: Create a new playbook run description: Create a new playbook run in a team, using a playbook as template, with a specific name and a specific owner. @@ -190,11 +192,11 @@ paths: schema: $ref: "#/components/schemas/PlaybookRun" 400: - $ref: "#/components/schemas/400" + $ref: "#/components/responses/400" 403: - $ref: "#/components/schemas/403" + $ref: "#/components/responses/403" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /runs/dialog: post: @@ -268,11 +270,11 @@ paths: schema: $ref: "#/components/schemas/PlaybookRun" 400: - $ref: "#/components/schemas/400" + $ref: "#/components/responses/400" 403: - $ref: "#/components/schemas/403" + $ref: "#/components/responses/403" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /runs/owners: get: @@ -306,11 +308,11 @@ paths: items: $ref: "#/components/schemas/OwnerInfo" 400: - $ref: "#/components/schemas/400" + $ref: "#/components/responses/400" 403: - $ref: "#/components/schemas/403" + $ref: "#/components/responses/403" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /runs/channels: get: @@ -378,7 +380,7 @@ paths: in: query description: The returned list will contain only the channels associated to a playbook run whose name contains the search term. required: false - example: "server down" + example: server down schema: type: string - name: participant_id @@ -405,11 +407,11 @@ paths: description: ID of the channel. example: v8zdc1893plelmf54vb7f0ramn 400: - $ref: "#/components/schemas/400" + $ref: "#/components/responses/400" 403: - $ref: "#/components/schemas/403" + $ref: "#/components/responses/403" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /runs/checklist-autocomplete: get: @@ -455,7 +457,7 @@ paths: description: Always the value "Check/uncheck this item". example: Check/uncheck this item 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /runs/channel/{channel_id}: get: @@ -486,9 +488,9 @@ paths: schema: $ref: "#/components/schemas/PlaybookRun" 404: - $ref: "#/components/schemas/404" + $ref: "#/components/responses/404" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /runs/{id}: get: @@ -519,9 +521,9 @@ paths: schema: $ref: "#/components/schemas/PlaybookRun" 403: - $ref: "#/components/schemas/403" + $ref: "#/components/responses/403" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" patch: summary: Update a playbook run operationId: updatePlaybookRun @@ -559,9 +561,9 @@ paths: 200: description: Playbook run successfully updated. 400: - $ref: "#/components/schemas/400" + $ref: "#/components/responses/400" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /runs/{id}/metadata: get: @@ -592,9 +594,9 @@ paths: schema: $ref: "#/components/schemas/PlaybookRunMetadata" 403: - $ref: "#/components/schemas/403" + $ref: "#/components/responses/403" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /runs/{id}/end: put: @@ -621,7 +623,7 @@ paths: 200: description: Playbook run ended 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" post: summary: End a playbook run from dialog description: This is an internal endpoint to end a playbook run via a confirmation dialog, submitted by a user in the webapp. @@ -647,7 +649,7 @@ paths: 200: description: Playbook run ended 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /runs/{id}/restart: put: @@ -674,7 +676,7 @@ paths: 200: description: Playbook run restarted. 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /runs/{id}/status: post: @@ -720,11 +722,11 @@ paths: 200: description: Playbook run updated. 400: - $ref: "#/components/schemas/400" + $ref: "#/components/responses/400" 403: - $ref: "#/components/schemas/403" + $ref: "#/components/responses/403" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /runs/{id}/finish: put: @@ -751,7 +753,7 @@ paths: 200: description: Playbook run finished. 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /runs/{id}/owner: post: @@ -792,11 +794,11 @@ paths: 200: description: Owner successfully changed. 400: - $ref: "#/components/schemas/400" + $ref: "#/components/responses/400" 403: - $ref: "#/components/schemas/403" + $ref: "#/components/responses/403" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /runs/{id}/next-stage-dialog: post: @@ -829,9 +831,9 @@ paths: 200: description: Playbook run stage update. 400: - $ref: "#/components/schemas/400" + $ref: "#/components/responses/400" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /runs/{id}/checklists/{checklist}/add: put: @@ -972,9 +974,9 @@ paths: 200: description: Item successfully reordered. 400: - $ref: "#/components/schemas/400" + $ref: "#/components/responses/400" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /runs/{id}/checklists/{checklist}/item/{item}: put: @@ -1035,9 +1037,9 @@ paths: 200: description: Item updated. 400: - $ref: "#/components/schemas/400" + $ref: "#/components/responses/400" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" delete: summary: Delete an item of a playbook run's checklist @@ -1077,9 +1079,9 @@ paths: 204: description: Item successfully deleted. 400: - $ref: "#/components/schemas/400" + $ref: "#/components/responses/400" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /runs/{id}/checklists/{checklist}/item/{item}/state: put: @@ -1139,9 +1141,9 @@ paths: 200: description: Item's state successfully updated. 400: - $ref: "#/components/schemas/400" + $ref: "#/components/responses/400" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /runs/{id}/checklists/{checklist}/item/{item}/assignee: put: @@ -1196,9 +1198,9 @@ paths: 200: description: Item's assignee successfully updated. 400: - $ref: "#/components/schemas/400" + $ref: "#/components/responses/400" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /runs/{id}/checklists/{checklist}/item/{item}/run: put: @@ -1243,9 +1245,9 @@ paths: schema: $ref: "#/components/schemas/TriggerIdReturn" 400: - $ref: "#/components/schemas/400" + $ref: "#/components/responses/400" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /runs/{id}/timeline/{event-id}/: delete: @@ -1279,9 +1281,9 @@ paths: 204: description: Item successfully deleted. 400: - $ref: "#/components/schemas/400" + $ref: "#/components/responses/400" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /playbooks: get: @@ -1362,11 +1364,11 @@ paths: schema: $ref: "#/components/schemas/PlaybookList" 400: - $ref: "#/components/schemas/400" + $ref: "#/components/responses/400" 403: - $ref: "#/components/schemas/403" + $ref: "#/components/responses/403" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" post: summary: Create a playbook operationId: createPlaybook @@ -1550,11 +1552,11 @@ paths: required: - id 400: - $ref: "#/components/schemas/400" + $ref: "#/components/responses/400" 403: - $ref: "#/components/schemas/403" + $ref: "#/components/responses/403" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /playbooks/{id}: get: @@ -1585,9 +1587,9 @@ paths: schema: $ref: "#/components/schemas/Playbook" 403: - $ref: "#/components/schemas/403" + $ref: "#/components/responses/403" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" put: summary: Update a playbook operationId: updatePlaybook @@ -1619,11 +1621,11 @@ paths: 200: description: Playbook succesfully updated. 400: - $ref: "#/components/schemas/400" + $ref: "#/components/responses/400" 403: - $ref: "#/components/schemas/403" + $ref: "#/components/responses/403" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" delete: summary: Delete a playbook operationId: deletePlaybook @@ -1648,9 +1650,9 @@ paths: 204: description: Playbook successfully deleted. 403: - $ref: "#/components/schemas/403" + $ref: "#/components/responses/403" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" /playbooks/{id}/autofollows: get: @@ -1681,16 +1683,16 @@ paths: schema: $ref: "#/components/schemas/PlaybookAutofollows" 403: - $ref: "#/components/schemas/403" + $ref: "#/components/responses/403" 500: - $ref: "#/components/schemas/500" + $ref: "#/components/responses/500" components: securitySchemes: BearerAuth: type: http scheme: bearer - schemas: + responses: 400: content: application/json: @@ -1715,6 +1717,7 @@ components: schema: $ref: "#/components/schemas/Error" description: There was an internal error in the server. + schemas: PlaybookRun: type: object properties: @@ -1840,6 +1843,7 @@ components: items: type: array description: The user IDs of who marked this playbook to auto-follow. + items: type: string OwnerInfo: type: object @@ -2025,11 +2029,11 @@ components: channel_url: type: string description: Absolute URL to the playbook run's channel. - example: http://example.com/ad-1/channels/channel-name + example: https://example.com/ad-1/channels/channel-name details_url: type: string description: Absolute URL to the playbook run's details. - example: http://example.com/ad-1/playbooks/runs/playbookRunID + example: https://example.com/ad-1/playbooks/runs/playbookRunID WebhookOnStatusUpdatePayload: allOf: - $ref: "#/components/schemas/PlaybookRun" @@ -2038,8 +2042,8 @@ components: channel_url: type: string description: Absolute URL to the playbook run's channel. - example: http://example.com/ad-1/channels/channel-name + example: https://example.com/ad-1/channels/channel-name details_url: type: string description: Absolute URL to the playbook run's details. - example: http://example.com/ad-1/playbooks/runs/playbookRunID + example: https://example.com/ad-1/playbooks/runs/playbookRunID diff --git a/server/api/bot.go b/server/api/bot.go index 502b17d555..62cdd12f81 100644 --- a/server/api/bot.go +++ b/server/api/bot.go @@ -7,6 +7,7 @@ import ( "time" "github.com/pkg/errors" + "github.com/sirupsen/logrus" "github.com/gorilla/mux" "github.com/mattermost/mattermost-plugin-playbooks/server/app" @@ -26,10 +27,9 @@ type BotHandler struct { userInfoStore app.UserInfoStore } -func NewBotHandler(router *mux.Router, api *pluginapi.Client, poster bot.Poster, logger bot.Logger, - config config.Service, playbookRunService app.PlaybookRunService, userInfoStore app.UserInfoStore) *BotHandler { +func NewBotHandler(router *mux.Router, api *pluginapi.Client, poster bot.Poster, config config.Service, playbookRunService app.PlaybookRunService, userInfoStore app.UserInfoStore) *BotHandler { handler := &BotHandler{ - ErrorHandler: &ErrorHandler{log: logger}, + ErrorHandler: &ErrorHandler{}, pluginAPI: api, poster: poster, config: config, @@ -40,11 +40,11 @@ func NewBotHandler(router *mux.Router, api *pluginapi.Client, poster bot.Poster, botRouter := router.PathPrefix("/bot").Subrouter() notifyAdminsRouter := botRouter.PathPrefix("/notify-admins").Subrouter() - notifyAdminsRouter.HandleFunc("", handler.notifyAdmins).Methods(http.MethodPost) - notifyAdminsRouter.HandleFunc("/button-start-trial", handler.startTrial).Methods(http.MethodPost) + notifyAdminsRouter.HandleFunc("", withContext(handler.notifyAdmins)).Methods(http.MethodPost) + notifyAdminsRouter.HandleFunc("/button-start-trial", withContext(handler.startTrial)).Methods(http.MethodPost) - botRouter.HandleFunc("/prompt-for-feedback", handler.promptForFeedback).Methods(http.MethodPost) - botRouter.HandleFunc("/connect", handler.connect).Methods(http.MethodGet) + botRouter.HandleFunc("/prompt-for-feedback", withContext(handler.promptForFeedback)).Methods(http.MethodPost) + botRouter.HandleFunc("/connect", withContext(handler.connect)).Methods(http.MethodGet) return handler } @@ -53,17 +53,17 @@ type messagePayload struct { MessageType string `json:"message_type"` } -func (h *BotHandler) notifyAdmins(w http.ResponseWriter, r *http.Request) { +func (h *BotHandler) notifyAdmins(c *Context, w http.ResponseWriter, r *http.Request) { userID := r.Header.Get("Mattermost-User-ID") var payload messagePayload if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "unable to decode message", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to decode message", err) return } if err := h.poster.NotifyAdmins(payload.MessageType, userID, !h.pluginAPI.System.IsEnterpriseReady()); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -78,44 +78,44 @@ func CanStartTrialLicense(userID string, pluginAPI *pluginapi.Client) error { return nil } -func (h *BotHandler) startTrial(w http.ResponseWriter, r *http.Request) { +func (h *BotHandler) startTrial(c *Context, w http.ResponseWriter, r *http.Request) { userID := r.Header.Get("Mattermost-User-ID") if err := CanStartTrialLicense(userID, h.pluginAPI); err != nil { - h.HandleErrorWithCode(w, http.StatusForbidden, "no permission to start a trial license", err) + h.HandleErrorWithCode(w, c.logger, http.StatusForbidden, "no permission to start a trial license", err) return } var requestData *model.PostActionIntegrationRequest err := json.NewDecoder(r.Body).Decode(&requestData) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "unable to parse json", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to parse json", err) } if requestData == nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "missing request data", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "missing request data", nil) return } users, ok := requestData.Context["users"].(float64) if !ok { - h.HandleErrorWithCode(w, http.StatusBadRequest, "malformed context: users is not a number", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "malformed context: users is not a number", nil) return } termsAccepted, ok := requestData.Context["termsAccepted"].(bool) if !ok { - h.HandleErrorWithCode(w, http.StatusBadRequest, "malformed context: termsAccepted is not a boolean", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "malformed context: termsAccepted is not a boolean", nil) return } receiveEmailsAccepted, ok := requestData.Context["receiveEmailsAccepted"].(bool) if !ok { - h.HandleErrorWithCode(w, http.StatusBadRequest, "malformed context: receiveEmailsAccepted is not a boolean", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "malformed context: receiveEmailsAccepted is not a boolean", nil) return } originalPost, err := h.pluginAPI.Post.GetPost(requestData.PostId) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -141,10 +141,10 @@ outer: post.Message = "Trial license could not be retrieved. Visit [https://mattermost.com/trial/](https://mattermost.com/trial/) to request a license." if postErr := h.pluginAPI.Post.UpdatePost(post); postErr != nil { - h.pluginAPI.Log.Warn("unable to edit the admin notification post", "post ID", post.Id) + logrus.WithError(postErr).WithField("post_id", post.Id).Error("unable to edit the admin notification post") } - h.HandleErrorWithCode(w, http.StatusInternalServerError, "unable to request the trial license", err) + h.HandleErrorWithCode(w, c.logger, http.StatusInternalServerError, "unable to request the trial license", err) return } @@ -158,22 +158,22 @@ outer: model.ParseSlackAttachment(post, attachments) if err := h.pluginAPI.Post.UpdatePost(post); err != nil { - h.pluginAPI.Log.Warn("unable to edit the admin notification post", "post ID", post.Id) + logrus.WithError(err).WithField("post_id", post.Id).Error("unable to edit the admin notification post") } ReturnJSON(w, post, http.StatusOK) } -func (h *BotHandler) promptForFeedback(w http.ResponseWriter, r *http.Request) { +func (h *BotHandler) promptForFeedback(c *Context, w http.ResponseWriter, r *http.Request) { userID := r.Header.Get("Mattermost-User-ID") if err := h.config.SupportsGivingFeedback(); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "giving feedback not supported", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "giving feedback not supported", err) return } if err := h.poster.PromptForFeedback(userID); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -181,7 +181,7 @@ func (h *BotHandler) promptForFeedback(w http.ResponseWriter, r *http.Request) { } // connect handles the GET /bot/connect endpoint (a notification sent when the client wakes up or reconnects) -func (h *BotHandler) connect(w http.ResponseWriter, r *http.Request) { +func (h *BotHandler) connect(c *Context, w http.ResponseWriter, r *http.Request) { userID := r.Header.Get("Mattermost-User-ID") info, err := h.userInfoStore.Get(userID) @@ -190,7 +190,7 @@ func (h *BotHandler) connect(w http.ResponseWriter, r *http.Request) { ID: userID, } } else if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -212,12 +212,12 @@ func (h *BotHandler) connect(w http.ResponseWriter, r *http.Request) { // response if there's a failure later) info.LastDailyTodoDMAt = now if err = h.userInfoStore.Upsert(info); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } if err = h.playbookRunService.DMTodoDigestToUser(userID, false); err != nil { - h.HandleError(w, errors.Wrapf(err, "failed to DMTodoDigest to userID '%s'", userID)) + h.HandleError(w, c.logger, errors.Wrapf(err, "failed to DMTodoDigest to userID '%s'", userID)) return } } diff --git a/server/api/categories.go b/server/api/categories.go index a170c7526a..e7e81b78dc 100644 --- a/server/api/categories.go +++ b/server/api/categories.go @@ -7,7 +7,7 @@ import ( "github.com/gorilla/mux" "github.com/mattermost/mattermost-plugin-playbooks/server/app" - "github.com/mattermost/mattermost-plugin-playbooks/server/bot" + "github.com/mattermost/mattermost-server/v6/model" "github.com/pkg/errors" pluginapi "github.com/mattermost/mattermost-plugin-api" @@ -23,9 +23,9 @@ type CategoryHandler struct { playbookRunService app.PlaybookRunService } -func NewCategoryHandler(router *mux.Router, api *pluginapi.Client, logger bot.Logger, categoryService app.CategoryService, playbookService app.PlaybookService, playbookRunService app.PlaybookRunService) *CategoryHandler { +func NewCategoryHandler(router *mux.Router, api *pluginapi.Client, categoryService app.CategoryService, playbookService app.PlaybookService, playbookRunService app.PlaybookRunService) *CategoryHandler { handler := &CategoryHandler{ - ErrorHandler: &ErrorHandler{log: logger}, + ErrorHandler: &ErrorHandler{}, api: api, categoryService: categoryService, playbookService: playbookService, @@ -33,33 +33,34 @@ func NewCategoryHandler(router *mux.Router, api *pluginapi.Client, logger bot.Lo } categoriesRouter := router.PathPrefix("/my_categories").Subrouter() - categoriesRouter.HandleFunc("", handler.getMyCategories).Methods(http.MethodGet) - categoriesRouter.HandleFunc("", handler.createMyCategory).Methods(http.MethodPost) - categoriesRouter.HandleFunc("/favorites", handler.addFavorite).Methods(http.MethodPost) - categoriesRouter.HandleFunc("/favorites", handler.deleteFavorite).Methods(http.MethodDelete) - categoriesRouter.HandleFunc("/favorites", handler.isFavorite).Methods(http.MethodGet) + categoriesRouter.HandleFunc("", withContext(handler.getMyCategories)).Methods(http.MethodGet) + categoriesRouter.HandleFunc("", withContext(handler.createMyCategory)).Methods(http.MethodPost) + categoriesRouter.HandleFunc("/favorites", withContext(handler.addFavorite)).Methods(http.MethodPost) + categoriesRouter.HandleFunc("/favorites", withContext(handler.deleteFavorite)).Methods(http.MethodDelete) + categoriesRouter.HandleFunc("/favorites", withContext(handler.isFavorite)).Methods(http.MethodGet) categoryRouter := categoriesRouter.PathPrefix("/{id:[A-Za-z0-9]+}").Subrouter() - categoryRouter.HandleFunc("", handler.updateMyCategory).Methods(http.MethodPut) - categoryRouter.HandleFunc("", handler.deleteMyCategory).Methods(http.MethodDelete) + categoryRouter.HandleFunc("", withContext(handler.updateMyCategory)).Methods(http.MethodPut) + categoryRouter.HandleFunc("", withContext(handler.deleteMyCategory)).Methods(http.MethodDelete) + categoryRouter.HandleFunc("/collapse", withContext(handler.collapseMyCategory)).Methods(http.MethodPut) return handler } -func (h *CategoryHandler) getMyCategories(w http.ResponseWriter, r *http.Request) { +func (h *CategoryHandler) getMyCategories(c *Context, w http.ResponseWriter, r *http.Request) { params := r.URL.Query() teamID := params.Get("team_id") userID := r.Header.Get("Mattermost-User-ID") customCategories, err := h.categoryService.GetCategories(teamID, userID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } filteredCustomCategories := filterEmptyCategories(customCategories) runsCategory, err := h.getRunsCategory(teamID, userID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } filteredRuns := filterDuplicatesFromCategory(runsCategory, filteredCustomCategories) @@ -68,7 +69,7 @@ func (h *CategoryHandler) getMyCategories(w http.ResponseWriter, r *http.Request playbooksCategory, err := h.getPlaybooksCategory(teamID, userID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } filteredPlaybooks := filterDuplicatesFromCategory(playbooksCategory, filteredCustomCategories) @@ -77,149 +78,193 @@ func (h *CategoryHandler) getMyCategories(w http.ResponseWriter, r *http.Request ReturnJSON(w, allCategories, http.StatusOK) } -func (h *CategoryHandler) createMyCategory(w http.ResponseWriter, r *http.Request) { +func (h *CategoryHandler) createMyCategory(c *Context, w http.ResponseWriter, r *http.Request) { userID := r.Header.Get("Mattermost-User-ID") var category app.Category if err := json.NewDecoder(r.Body).Decode(&category); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "unable to decode category", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to decode category", err) return } if category.ID != "" { - h.HandleErrorWithCode(w, http.StatusBadRequest, "Category given already has ID", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "Category given already has ID", nil) return } // user can only create category for themselves if category.UserID != userID { - h.HandleErrorWithCode(w, http.StatusBadRequest, fmt.Sprintf("userID %s and category userID %s mismatch", userID, category.UserID), nil) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, fmt.Sprintf("userID %s and category userID %s mismatch", userID, category.UserID), nil) return } createdCategory, err := h.categoryService.Create(category) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } ReturnJSON(w, createdCategory, http.StatusOK) } -func (h *CategoryHandler) updateMyCategory(w http.ResponseWriter, r *http.Request) { +func (h *CategoryHandler) updateMyCategory(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) categoryID := vars["id"] userID := r.Header.Get("Mattermost-User-ID") var category app.Category if err := json.NewDecoder(r.Body).Decode(&category); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "unable to decode category", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to decode category", err) return } if categoryID != category.ID { - h.HandleErrorWithCode(w, http.StatusBadRequest, "categoryID mismatch in patch and body", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "categoryID mismatch in patch and body", nil) return } // user can only update category for themselves if category.UserID != userID { - h.HandleErrorWithCode(w, http.StatusBadRequest, "user ID mismatch in session and category", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "user ID mismatch in session and category", nil) return } // verify if category belongs to the user existingCategory, err := h.categoryService.Get(category.ID) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "Can't get category", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "Can't get category", err) return } if existingCategory.DeleteAt != 0 { - h.HandleErrorWithCode(w, http.StatusBadRequest, "Category deleted", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusNotFound, "Category deleted", nil) return } if existingCategory.UserID != category.UserID { - h.HandleErrorWithCode(w, http.StatusBadRequest, "UserID mismatch", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "UserID mismatch", nil) return } if err := h.categoryService.Update(category); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusOK) } -func (h *CategoryHandler) deleteMyCategory(w http.ResponseWriter, r *http.Request) { +func (h *CategoryHandler) collapseMyCategory(c *Context, w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + categoryID := vars["id"] + userID := r.Header.Get("Mattermost-User-ID") + + var collapsed bool + if err := json.NewDecoder(r.Body).Decode(&collapsed); err != nil { + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to decode collapsed", err) + return + } + + existingCategory, err := h.categoryService.Get(categoryID) + if err != nil { + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "Can't get category", err) + return + } + + if existingCategory.DeleteAt != 0 { + h.HandleErrorWithCode(w, c.logger, http.StatusNotFound, "Category deleted", nil) + return + } + + // verify if category belongs to the user + if existingCategory.UserID != userID { + h.HandleErrorWithCode(w, c.logger, http.StatusForbidden, "UserID mismatch", nil) + return + } + + if existingCategory.Collapsed == collapsed { + w.WriteHeader(http.StatusOK) + return + } + + patchedCategory := existingCategory + patchedCategory.Collapsed = collapsed + patchedCategory.UpdateAt = model.GetMillis() + + if err := h.categoryService.Update(patchedCategory); err != nil { + h.HandleError(w, c.logger, err) + return + } + w.WriteHeader(http.StatusOK) +} + +func (h *CategoryHandler) deleteMyCategory(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) categoryID := vars["id"] userID := r.Header.Get("Mattermost-User-ID") existingCategory, err := h.categoryService.Get(categoryID) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "Can't get category", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "Can't get category", err) return } // category is already deleted. This avoids // overriding the original deleted at timestamp if existingCategory.DeleteAt != 0 { - h.HandleErrorWithCode(w, http.StatusBadRequest, "Category deleted", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusNotFound, "Category deleted", nil) return } // verify if category belongs to the user if existingCategory.UserID != userID { - h.HandleErrorWithCode(w, http.StatusBadRequest, "UserID mismatch", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "UserID mismatch", nil) return } if err := h.categoryService.Delete(categoryID); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusNoContent) } -func (h *CategoryHandler) addFavorite(w http.ResponseWriter, r *http.Request) { +func (h *CategoryHandler) addFavorite(c *Context, w http.ResponseWriter, r *http.Request) { userID := r.Header.Get("Mattermost-User-ID") params := r.URL.Query() teamID := params.Get("team_id") var item app.CategoryItem if err := json.NewDecoder(r.Body).Decode(&item); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "unable to decode category item", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to decode category item", err) return } if err := h.categoryService.AddFavorite(item, teamID, userID); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusOK) } -func (h *CategoryHandler) deleteFavorite(w http.ResponseWriter, r *http.Request) { +func (h *CategoryHandler) deleteFavorite(c *Context, w http.ResponseWriter, r *http.Request) { userID := r.Header.Get("Mattermost-User-ID") params := r.URL.Query() teamID := params.Get("team_id") var item app.CategoryItem if err := json.NewDecoder(r.Body).Decode(&item); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "unable to decode category item", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to decode category item", err) return } if err := h.categoryService.DeleteFavorite(item, teamID, userID); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusNoContent) } -func (h *CategoryHandler) isFavorite(w http.ResponseWriter, r *http.Request) { +func (h *CategoryHandler) isFavorite(c *Context, w http.ResponseWriter, r *http.Request) { userID := r.Header.Get("Mattermost-User-ID") params := r.URL.Query() teamID := params.Get("team_id") @@ -227,13 +272,13 @@ func (h *CategoryHandler) isFavorite(w http.ResponseWriter, r *http.Request) { itemType := params.Get("type") convertedItemType, err := app.StringToItemType(itemType) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } isFavorite, err := h.categoryService.IsItemFavorite(app.CategoryItem{ItemID: itemID, Type: convertedItemType}, teamID, userID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } ReturnJSON(w, isFavorite, http.StatusOK) diff --git a/server/api/context.go b/server/api/context.go new file mode 100644 index 0000000000..8131073481 --- /dev/null +++ b/server/api/context.go @@ -0,0 +1,38 @@ +package api + +import ( + "net/http" + + "github.com/sirupsen/logrus" +) + +// requestIDContextKeyType ensures requestIDContextKey can never collide with another context key +// having the same value. +type requestIDContextKeyType string + +// requestIDContextKey is the key for the incoming requestID. +var requestIDContextKey = requestIDContextKeyType("requestID") + +// getLogger builds a logger with the requestID attached to the given request. +func getLogger(r *http.Request) logrus.FieldLogger { + var logger logrus.FieldLogger = logrus.StandardLogger() + + requestID, ok := r.Context().Value(requestIDContextKey).(string) + if ok { + logger = logger.WithField("request_id", requestID) + } + + return logger +} + +type Context struct { + logger logrus.FieldLogger +} + +// withContext passes a logger to http handler functions. +func withContext(handler func(c *Context, w http.ResponseWriter, r *http.Request)) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + logger := getLogger(r) + handler(&Context{logger}, w, r) + } +} diff --git a/server/api/error_handler.go b/server/api/error_handler.go index 2ec8c692ab..c871a28265 100644 --- a/server/api/error_handler.go +++ b/server/api/error_handler.go @@ -6,30 +6,29 @@ package api import ( "net/http" - "github.com/mattermost/mattermost-plugin-playbooks/server/bot" + "github.com/sirupsen/logrus" ) type ErrorHandler struct { - log bot.Logger } // HandleError logs the internal error and sends a generic error as JSON in a 500 response. -func (h *ErrorHandler) HandleError(w http.ResponseWriter, internalErr error) { - h.HandleErrorWithCode(w, http.StatusInternalServerError, "An internal error has occurred. Check app server logs for details.", internalErr) +func (h *ErrorHandler) HandleError(w http.ResponseWriter, logger logrus.FieldLogger, internalErr error) { + h.HandleErrorWithCode(w, logger, http.StatusInternalServerError, "An internal error has occurred. Check app server logs for details.", internalErr) } // HandleErrorWithCode logs the internal error and sends the public facing error // message as JSON in a response with the provided code. -func (h *ErrorHandler) HandleErrorWithCode(w http.ResponseWriter, code int, publicErrorMsg string, internalErr error) { - HandleErrorWithCode(h.log, w, code, publicErrorMsg, internalErr) +func (h *ErrorHandler) HandleErrorWithCode(w http.ResponseWriter, logger logrus.FieldLogger, code int, publicErrorMsg string, internalErr error) { + HandleErrorWithCode(logger, w, code, publicErrorMsg, internalErr) } // PermissionsCheck handles the output of a permisions check // Automatically does the proper error handling. // Returns true if the check passed and false on failure. Correct use is: if !h.PermissionsCheck(w, check) { return } -func (h *ErrorHandler) PermissionsCheck(w http.ResponseWriter, checkOutput error) bool { +func (h *ErrorHandler) PermissionsCheck(w http.ResponseWriter, logger logrus.FieldLogger, checkOutput error) bool { if checkOutput != nil { - h.HandleErrorWithCode(w, http.StatusForbidden, "Not authorized", checkOutput) + h.HandleErrorWithCode(w, logger, http.StatusForbidden, "Not authorized", checkOutput) return false } diff --git a/server/api/graphql.go b/server/api/graphql.go index 76a9fd5e4c..7e982b6569 100644 --- a/server/api/graphql.go +++ b/server/api/graphql.go @@ -10,22 +10,21 @@ import ( graphql "github.com/graph-gophers/graphql-go" pluginapi "github.com/mattermost/mattermost-plugin-api" "github.com/mattermost/mattermost-plugin-playbooks/server/app" - "github.com/mattermost/mattermost-plugin-playbooks/server/bot" "github.com/mattermost/mattermost-plugin-playbooks/server/config" - "github.com/mattermost/mattermost-server/v6/shared/mlog" "github.com/pkg/errors" + "github.com/sirupsen/logrus" ) type GraphQLHandler struct { *ErrorHandler - playbookService app.PlaybookService - categoryService app.CategoryService - pluginAPI *pluginapi.Client - log bot.Logger - config config.Service - permissions *app.PermissionsService - playbookStore app.PlaybookStore - licenceChecker app.LicenseChecker + playbookService app.PlaybookService + playbookRunService app.PlaybookRunService + categoryService app.CategoryService + pluginAPI *pluginapi.Client + config config.Service + permissions *app.PermissionsService + playbookStore app.PlaybookStore + licenceChecker app.LicenseChecker schema *graphql.Schema } @@ -36,24 +35,24 @@ var SchemaFile string func NewGraphQLHandler( router *mux.Router, playbookService app.PlaybookService, + playbookRunService app.PlaybookRunService, categoryService app.CategoryService, api *pluginapi.Client, - log bot.Logger, configService config.Service, permissions *app.PermissionsService, playbookStore app.PlaybookStore, licenceChecker app.LicenseChecker, ) *GraphQLHandler { handler := &GraphQLHandler{ - ErrorHandler: &ErrorHandler{log: log}, - playbookService: playbookService, - categoryService: categoryService, - pluginAPI: api, - log: log, - config: configService, - permissions: permissions, - playbookStore: playbookStore, - licenceChecker: licenceChecker, + ErrorHandler: &ErrorHandler{}, + playbookService: playbookService, + playbookRunService: playbookRunService, + categoryService: categoryService, + pluginAPI: api, + config: configService, + permissions: permissions, + playbookStore: playbookStore, + licenceChecker: licenceChecker, } opts := []graphql.SchemaOpt{ @@ -72,34 +71,35 @@ func NewGraphQLHandler( var err error handler.schema, err = graphql.ParseSchema(SchemaFile, root, opts...) if err != nil { - log.Errorf("unable to parse graphql schema: %v", err.Error()) + logrus.WithError(err).Error("unable to parse graphql schema") return nil } - router.HandleFunc("/query", graphiQL).Methods("GET") - router.HandleFunc("/query", handler.graphQL).Methods("POST") + router.HandleFunc("/query", withContext(graphiQL)).Methods("GET") + router.HandleFunc("/query", withContext(handler.graphQL)).Methods("POST") return handler } type ctxKey struct{} -type Context struct { - r *http.Request - playbookService app.PlaybookService - playbookStore app.PlaybookStore - categoryService app.CategoryService - pluginAPI *pluginapi.Client - log bot.Logger - config config.Service - permissions *app.PermissionsService - licenceChecker app.LicenseChecker +type GraphQLContext struct { + r *http.Request + playbookService app.PlaybookService + playbookRunService app.PlaybookRunService + playbookStore app.PlaybookStore + categoryService app.CategoryService + pluginAPI *pluginapi.Client + logger logrus.FieldLogger + config config.Service + permissions *app.PermissionsService + licenceChecker app.LicenseChecker } // When moving over to the multi-product architecture this should be handled by the server. -func (h *GraphQLHandler) graphQL(w http.ResponseWriter, r *http.Request) { - // Limit bodies to 100KiB. - r.Body = http.MaxBytesReader(w, r.Body, 102400) +func (h *GraphQLHandler) graphQL(c *Context, w http.ResponseWriter, r *http.Request) { + // Limit bodies to 300KiB. + r.Body = http.MaxBytesReader(w, r.Body, 300*1024) var params struct { Query string `json:"query"` @@ -107,32 +107,33 @@ func (h *GraphQLHandler) graphQL(w http.ResponseWriter, r *http.Request) { Variables map[string]interface{} `json:"variables"` } if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { - h.log.Debugf("Unable to decode graphql query: %v", err) + c.logger.WithError(err).Error("Unable to decode graphql query") return } if !h.config.IsConfiguredForDevelopmentAndTesting() { if params.OperationName == "" { - h.log.Debugf("Invalid blank operation name.") + c.logger.Warn("Invalid blank operation name") return } } - c := &Context{ - r: r, - playbookService: h.playbookService, - categoryService: h.categoryService, - pluginAPI: h.pluginAPI, - log: h.log, - config: h.config, - permissions: h.permissions, - playbookStore: h.playbookStore, - licenceChecker: h.licenceChecker, + graphQLContext := &GraphQLContext{ + r: r, + playbookService: h.playbookService, + playbookRunService: h.playbookRunService, + categoryService: h.categoryService, + pluginAPI: h.pluginAPI, + logger: c.logger, + config: h.config, + permissions: h.permissions, + playbookStore: h.playbookStore, + licenceChecker: h.licenceChecker, } // Populate the context with required info. reqCtx := r.Context() - reqCtx = context.WithValue(reqCtx, ctxKey{}, c) + reqCtx = context.WithValue(reqCtx, ctxKey{}, graphQLContext) response := h.schema.Exec(reqCtx, params.Query, @@ -140,18 +141,17 @@ func (h *GraphQLHandler) graphQL(w http.ResponseWriter, r *http.Request) { params.Variables, ) - if len(response.Errors) > 0 { - mlog.Error("Error executing request", mlog.String("operation", params.OperationName), - mlog.Array("errors", response.Errors)) + for _, err := range response.Errors { + c.logger.WithError(err).WithField("operation", params.OperationName).Error("Error executing request") } if err := json.NewEncoder(w).Encode(response); err != nil { - mlog.Warn("Error while writing response", mlog.Err(err)) + c.logger.WithError(err).Warn("Error while writing response") } } -func getContext(ctx context.Context) (*Context, error) { - c, ok := ctx.Value(ctxKey{}).(*Context) +func getContext(ctx context.Context) (*GraphQLContext, error) { + c, ok := ctx.Value(ctxKey{}).(*GraphQLContext) if !ok { return nil, errors.New("custom context not found in context") } @@ -162,7 +162,7 @@ func getContext(ctx context.Context) (*Context, error) { //go:embed graphqli.html var GraphiqlPage []byte -func graphiQL(w http.ResponseWriter, r *http.Request) { +func graphiQL(c *Context, w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html") _, _ = w.Write(GraphiqlPage) } diff --git a/server/api/graphql_playbook.go b/server/api/graphql_playbook.go index 7facb1824d..69c5bd5733 100644 --- a/server/api/graphql_playbook.go +++ b/server/api/graphql_playbook.go @@ -1,12 +1,36 @@ package api import ( + "context" + "github.com/mattermost/mattermost-plugin-playbooks/server/app" + "github.com/pkg/errors" ) type PlaybookResolver struct { app.Playbook - IsFavorite bool +} + +func (r *PlaybookResolver) IsFavorite(ctx context.Context) (bool, error) { + c, err := getContext(ctx) + if err != nil { + return false, err + } + userID := c.r.Header.Get("Mattermost-User-ID") + + isFavorite, err := c.categoryService.IsItemFavorite( + app.CategoryItem{ + ItemID: r.ID, + Type: app.PlaybookItemType, + }, + r.TeamID, + userID, + ) + if err != nil { + return false, errors.Wrap(err, "can't determine if item is favorite or not") + } + + return isFavorite, nil } func (r *PlaybookResolver) DeleteAt() float64 { @@ -83,3 +107,21 @@ func (r *ChecklistItemResolver) CommandLastRun() float64 { func (r *ChecklistItemResolver) DueDate() float64 { return float64(r.ChecklistItem.DueDate) } + +type UpdateChecklist struct { + Title string `json:"title"` + Items []UpdateChecklistItem `json:"items"` +} + +type UpdateChecklistItem struct { + Title string `json:"title"` + State string `json:"state"` + StateModified float64 `json:"state_modified"` + AssigneeID string `json:"assignee_id"` + AssigneeModified float64 `json:"assignee_modified"` + Command string `json:"command"` + CommandLastRun float64 `json:"command_last_run"` + Description string `json:"description"` + LastSkipped float64 `json:"delete_at"` + DueDate float64 `json:"due_date"` +} diff --git a/server/api/graphql_root.go b/server/api/graphql_root.go index 4a0e7eb246..3ad06c0af4 100644 --- a/server/api/graphql_root.go +++ b/server/api/graphql_root.go @@ -1,373 +1,12 @@ package api import ( - "context" - "encoding/json" "strings" - - "github.com/mattermost/mattermost-plugin-playbooks/server/app" - "github.com/mattermost/mattermost-server/v6/model" - "github.com/pkg/errors" - "gopkg.in/guregu/null.v4" ) -type RootResolver struct{} - -func (r *RootResolver) Playbook(ctx context.Context, args struct { - ID string -}) (*PlaybookResolver, error) { - c, err := getContext(ctx) - if err != nil { - return nil, err - } - playbookID := args.ID - userID := c.r.Header.Get("Mattermost-User-ID") - - if err := c.permissions.PlaybookView(userID, playbookID); err != nil { - c.log.Warnf("public error message: %v; internal details: %v", "Not authorized", err) - return nil, errors.New("Not authorized") - } - - playbook, err := c.playbookService.Get(playbookID) - if err != nil { - return nil, err - } - isFavorite, err := c.categoryService.IsItemFavorite( - app.CategoryItem{ - ItemID: playbookID, - Type: app.PlaybookItemType, - }, - playbook.TeamID, - userID, - ) - if err != nil { - return nil, errors.Wrap(err, "can't determine if item is favorite or not") - } - - return &PlaybookResolver{playbook, isFavorite}, nil -} - -type UpdateChecklist struct { - Title string `json:"title"` - Items []UpdateChecklistItem `json:"items"` -} - -type UpdateChecklistItem struct { - Title string `json:"title"` - State string `json:"state"` - StateModified float64 `json:"state_modified"` - AssigneeID string `json:"assignee_id"` - AssigneeModified float64 `json:"assignee_modified"` - Command string `json:"command"` - CommandLastRun float64 `json:"command_last_run"` - Description string `json:"description"` - LastSkipped float64 `json:"delete_at"` - DueDate float64 `json:"due_date"` -} - -func (r *RootResolver) UpdatePlaybook(ctx context.Context, args struct { - ID string - Updates struct { - Title *string - Description *string - Public *bool - CreatePublicPlaybookRun *bool - ReminderMessageTemplate *string - ReminderTimerDefaultSeconds *float64 - StatusUpdateEnabled *bool - InvitedUserIDs *[]string - InvitedGroupIDs *[]string - InviteUsersEnabled *bool - DefaultOwnerID *string - DefaultOwnerEnabled *bool - BroadcastChannelIDs *[]string - BroadcastEnabled *bool - WebhookOnCreationURLs *[]string - WebhookOnCreationEnabled *bool - MessageOnJoin *string - MessageOnJoinEnabled *bool - RetrospectiveReminderIntervalSeconds *float64 - RetrospectiveTemplate *string - RetrospectiveEnabled *bool - WebhookOnStatusUpdateURLs *[]string - WebhookOnStatusUpdateEnabled *bool - SignalAnyKeywords *[]string - SignalAnyKeywordsEnabled *bool - CategorizeChannelEnabled *bool - CategoryName *string - RunSummaryTemplateEnabled *bool - RunSummaryTemplate *string - ChannelNameTemplate *string - Checklists *[]UpdateChecklist - IsFavorite *bool - } -}) (string, error) { - c, err := getContext(ctx) - if err != nil { - return "", err - } - userID := c.r.Header.Get("Mattermost-User-ID") - - currentPlaybook, err := c.playbookService.Get(args.ID) - if err != nil { - return "", err - } - - if currentPlaybook.DeleteAt != 0 { - return "", errors.New("archived playbooks can not be modified") - } - - if err := c.permissions.PlaybookManageProperties(userID, currentPlaybook); err != nil { - return "", err - } - - setmap := map[string]interface{}{} - addToSetmap(setmap, "Title", args.Updates.Title) - addToSetmap(setmap, "Description", args.Updates.Description) - if args.Updates.Public != nil { - if *args.Updates.Public { - if err := c.permissions.PlaybookMakePrivate(userID, currentPlaybook); err != nil { - return "", errors.Wrap(err, "attempted to make playbook private without permissions") - } - } else { - if err := c.permissions.PlaybookMakePublic(userID, currentPlaybook); err != nil { - return "", errors.Wrap(err, "attempted to make playbook public without permissions") - } - } - if c.licenceChecker.PlaybookAllowed(*args.Updates.Public) { - return "", errors.Wrapf(app.ErrLicensedFeature, "the playbook is not valid with the current license") - } - addToSetmap(setmap, "Public", args.Updates.Public) - } - addToSetmap(setmap, "CreatePublicIncident", args.Updates.CreatePublicPlaybookRun) - addToSetmap(setmap, "ReminderMessageTemplate", args.Updates.ReminderMessageTemplate) - addToSetmap(setmap, "ReminderTimerDefaultSeconds", args.Updates.ReminderTimerDefaultSeconds) - addToSetmap(setmap, "StatusUpdateEnabled", args.Updates.StatusUpdateEnabled) - - if args.Updates.InvitedUserIDs != nil { - filteredInvitedUserIDs := c.permissions.FilterInvitedUserIDs(*args.Updates.InvitedUserIDs, currentPlaybook.TeamID) - addConcatToSetmap(setmap, "ConcatenatedInvitedUserIDs", &filteredInvitedUserIDs) - } - - if args.Updates.InvitedGroupIDs != nil { - filteredInvitedGroupIDs := c.permissions.FilterInvitedGroupIDs(*args.Updates.InvitedGroupIDs) - addConcatToSetmap(setmap, "ConcatenatedInvitedGroupIDs", &filteredInvitedGroupIDs) - } - - addToSetmap(setmap, "InviteUsersEnabled", args.Updates.InviteUsersEnabled) - if args.Updates.DefaultOwnerID != nil { - if !c.pluginAPI.User.HasPermissionToTeam(*args.Updates.DefaultOwnerID, currentPlaybook.TeamID, model.PermissionViewTeam) { - return "", errors.Wrap(app.ErrNoPermissions, "default owner can't view team") - } - addToSetmap(setmap, "DefaultCommanderID", args.Updates.DefaultOwnerID) - } - addToSetmap(setmap, "DefaultCommanderEnabled", args.Updates.DefaultOwnerEnabled) - - if args.Updates.BroadcastChannelIDs != nil { - if err := c.permissions.NoAddedBroadcastChannelsWithoutPermission(userID, *args.Updates.BroadcastChannelIDs, currentPlaybook.BroadcastChannelIDs); err != nil { - return "", err - } - addConcatToSetmap(setmap, "ConcatenatedBroadcastChannelIDs", args.Updates.BroadcastChannelIDs) - } - - addToSetmap(setmap, "BroadcastEnabled", args.Updates.BroadcastEnabled) - if args.Updates.WebhookOnCreationURLs != nil { - if err := app.ValidateWebhookURLs(*args.Updates.WebhookOnCreationURLs); err != nil { - return "", err - } - addConcatToSetmap(setmap, "ConcatenatedWebhookOnCreationURLs", args.Updates.WebhookOnCreationURLs) - } - addToSetmap(setmap, "WebhookOnCreationEnabled", args.Updates.WebhookOnCreationEnabled) - addToSetmap(setmap, "MessageOnJoin", args.Updates.MessageOnJoin) - addToSetmap(setmap, "MessageOnJoinEnabled", args.Updates.MessageOnJoinEnabled) - addToSetmap(setmap, "RetrospectiveReminderIntervalSeconds", args.Updates.RetrospectiveReminderIntervalSeconds) - addToSetmap(setmap, "RetrospectiveTemplate", args.Updates.RetrospectiveTemplate) - addToSetmap(setmap, "RetrospectiveEnabled", args.Updates.RetrospectiveEnabled) - if args.Updates.WebhookOnStatusUpdateURLs != nil { - if err := app.ValidateWebhookURLs(*args.Updates.WebhookOnStatusUpdateURLs); err != nil { - return "", err - } - addConcatToSetmap(setmap, "ConcatenatedWebhookOnStatusUpdateURLs", args.Updates.WebhookOnStatusUpdateURLs) - } - addToSetmap(setmap, "WebhookOnStatusUpdateEnabled", args.Updates.WebhookOnStatusUpdateEnabled) - if args.Updates.SignalAnyKeywords != nil { - validSignalAnyKeywords := app.ProcessSignalAnyKeywords(*args.Updates.SignalAnyKeywords) - addConcatToSetmap(setmap, "ConcatenatedSignalAnyKeywords", &validSignalAnyKeywords) - } - addToSetmap(setmap, "SignalAnyKeywordsEnabled", args.Updates.SignalAnyKeywordsEnabled) - addToSetmap(setmap, "CategorizeChannelEnabled", args.Updates.CategorizeChannelEnabled) - if args.Updates.CategoryName != nil { - if err := app.ValidateCategoryName(*args.Updates.CategoryName); err != nil { - return "", err - } - addToSetmap(setmap, "CategoryName", args.Updates.CategoryName) - } - addToSetmap(setmap, "RunSummaryTemplateEnabled", args.Updates.RunSummaryTemplateEnabled) - addToSetmap(setmap, "RunSummaryTemplate", args.Updates.RunSummaryTemplate) - addToSetmap(setmap, "ChannelNameTemplate", args.Updates.ChannelNameTemplate) - - // Not optimal graphql. Stopgap measure. Should be updated seperately. - if args.Updates.Checklists != nil { - checklistsJSON, err := json.Marshal(args.Updates.Checklists) - if err != nil { - return "", errors.Wrapf(err, "failed to marshal checklist in graphql json for playbook id: '%s'", args.ID) - } - setmap["ChecklistsJSON"] = checklistsJSON - } - - if len(setmap) > 0 { - if err := c.playbookStore.GraphqlUpdate(args.ID, setmap); err != nil { - return "", err - } - } - - if args.Updates.IsFavorite != nil { - if *args.Updates.IsFavorite { - if err := c.categoryService.AddFavorite( - app.CategoryItem{ - ItemID: currentPlaybook.ID, - Type: app.PlaybookItemType, - }, - currentPlaybook.TeamID, - userID, - ); err != nil { - return "", err - } - } else { - if err := c.categoryService.DeleteFavorite( - app.CategoryItem{ - ItemID: currentPlaybook.ID, - Type: app.PlaybookItemType, - }, - currentPlaybook.TeamID, - userID, - ); err != nil { - return "", err - } - } - } - - return args.ID, nil -} - -func (r *RootResolver) AddMetric(ctx context.Context, args struct { - PlaybookID string - Title string - Description string - Type string - Target *float64 -}) (string, error) { - c, err := getContext(ctx) - if err != nil { - return "", err - } - userID := c.r.Header.Get("Mattermost-User-ID") - - currentPlaybook, err := c.playbookService.Get(args.PlaybookID) - if err != nil { - return "", err - } - - if currentPlaybook.DeleteAt != 0 { - return "", errors.New("archived playbooks can not be modified") - } - - if err := c.permissions.PlaybookManageProperties(userID, currentPlaybook); err != nil { - return "", err - } - - var target null.Int - if args.Target == nil { - target = null.NewInt(0, false) - } else { - target = null.IntFrom(int64(*args.Target)) - } - - if err := c.playbookStore.AddMetric(args.PlaybookID, app.PlaybookMetricConfig{ - Title: args.Title, - Description: args.Description, - Type: args.Type, - Target: target, - }); err != nil { - return "", err - } - - return args.PlaybookID, nil -} - -func (r *RootResolver) UpdateMetric(ctx context.Context, args struct { - ID string - Title *string - Description *string - Target *float64 -}) (string, error) { - c, err := getContext(ctx) - if err != nil { - return "", err - } - userID := c.r.Header.Get("Mattermost-User-ID") - - currentMetric, err := c.playbookStore.GetMetric(args.ID) - if err != nil { - return "", err - } - - currentPlaybook, err := c.playbookService.Get(currentMetric.PlaybookID) - if err != nil { - return "", err - } - - if currentPlaybook.DeleteAt != 0 { - return "", errors.New("archived playbooks can not be modified") - } - - if err := c.permissions.PlaybookManageProperties(userID, currentPlaybook); err != nil { - return "", err - } - - setmap := map[string]interface{}{} - addToSetmap(setmap, "Title", args.Title) - addToSetmap(setmap, "Description", args.Description) - if args.Target != nil { - setmap["Target"] = null.IntFrom(int64(*args.Target)) - } - if len(setmap) > 0 { - if err := c.playbookStore.UpdateMetric(args.ID, setmap); err != nil { - return "", err - } - } - - return args.ID, nil -} - -func (r *RootResolver) DeleteMetric(ctx context.Context, args struct { - ID string -}) (string, error) { - c, err := getContext(ctx) - if err != nil { - return "", err - } - userID := c.r.Header.Get("Mattermost-User-ID") - - currentMetric, err := c.playbookStore.GetMetric(args.ID) - if err != nil { - return "", err - } - - currentPlaybook, err := c.playbookService.Get(currentMetric.PlaybookID) - if err != nil { - return "", err - } - - if err := c.permissions.PlaybookManageProperties(userID, currentPlaybook); err != nil { - return "", err - } - - if err := c.playbookStore.DeleteMetric(args.ID); err != nil { - return "", err - } - - return args.ID, nil +type RootResolver struct { + RunRootResolver + PlaybookRootResolver } func addToSetmap[T any](setmap map[string]interface{}, name string, value *T) { diff --git a/server/api/graphql_root_playbook.go b/server/api/graphql_root_playbook.go new file mode 100644 index 0000000000..ed662f8a28 --- /dev/null +++ b/server/api/graphql_root_playbook.go @@ -0,0 +1,456 @@ +package api + +import ( + "context" + "encoding/json" + + "github.com/mattermost/mattermost-plugin-playbooks/server/app" + "github.com/mattermost/mattermost-server/v6/model" + "github.com/pkg/errors" + "gopkg.in/guregu/null.v4" +) + +// RunMutationCollection hold all mutation functions for a playbookRun +type PlaybookRootResolver struct { +} + +func (r *PlaybookRootResolver) Playbook(ctx context.Context, args struct { + ID string +}) (*PlaybookResolver, error) { + c, err := getContext(ctx) + if err != nil { + return nil, err + } + playbookID := args.ID + userID := c.r.Header.Get("Mattermost-User-ID") + + if err := c.permissions.PlaybookView(userID, playbookID); err != nil { + c.logger.WithError(err).Warn("Not authorized") + return nil, errors.New("Not authorized") + } + + playbook, err := c.playbookService.Get(playbookID) + if err != nil { + return nil, err + } + + return &PlaybookResolver{playbook}, nil +} + +func (r *PlaybookRootResolver) Playbooks(ctx context.Context, args struct { + TeamID string + Sort string + Direction string + SearchTerm string + WithMembershipOnly bool + WithArchived bool +}) ([]*PlaybookResolver, error) { + c, err := getContext(ctx) + if err != nil { + return nil, err + } + userID := c.r.Header.Get("Mattermost-User-ID") + + if args.TeamID != "" { + if err := c.permissions.PlaybookList(userID, args.TeamID); err != nil { + c.logger.WithError(err).Warn("Not authorized") + return nil, errors.New("Not authorized") + } + } + + requesterInfo := app.RequesterInfo{ + UserID: userID, + TeamID: args.TeamID, + IsAdmin: app.IsSystemAdmin(userID, c.pluginAPI), + } + + opts := app.PlaybookFilterOptions{ + Sort: app.SortField(args.Sort), + Direction: app.SortDirection(args.Direction), + SearchTerm: args.SearchTerm, + WithArchived: args.WithArchived, + WithMembershipOnly: args.WithMembershipOnly, + Page: 0, + PerPage: 10000, + } + + playbookResults, err := c.playbookService.GetPlaybooksForTeam(requesterInfo, args.TeamID, opts) + if err != nil { + return nil, err + } + + ret := make([]*PlaybookResolver, 0, len(playbookResults.Items)) + for _, pb := range playbookResults.Items { + ret = append(ret, &PlaybookResolver{pb}) + } + + return ret, nil +} + +func (r *PlaybookRootResolver) UpdatePlaybook(ctx context.Context, args struct { + ID string + Updates struct { + Title *string + Description *string + Public *bool + CreatePublicPlaybookRun *bool + ReminderMessageTemplate *string + ReminderTimerDefaultSeconds *float64 + StatusUpdateEnabled *bool + InvitedUserIDs *[]string + InvitedGroupIDs *[]string + InviteUsersEnabled *bool + DefaultOwnerID *string + DefaultOwnerEnabled *bool + BroadcastChannelIDs *[]string + BroadcastEnabled *bool + WebhookOnCreationURLs *[]string + WebhookOnCreationEnabled *bool + MessageOnJoin *string + MessageOnJoinEnabled *bool + RetrospectiveReminderIntervalSeconds *float64 + RetrospectiveTemplate *string + RetrospectiveEnabled *bool + WebhookOnStatusUpdateURLs *[]string + WebhookOnStatusUpdateEnabled *bool + SignalAnyKeywords *[]string + SignalAnyKeywordsEnabled *bool + CategorizeChannelEnabled *bool + CategoryName *string + RunSummaryTemplateEnabled *bool + RunSummaryTemplate *string + ChannelNameTemplate *string + Checklists *[]UpdateChecklist + IsFavorite *bool + } +}) (string, error) { + c, err := getContext(ctx) + if err != nil { + return "", err + } + userID := c.r.Header.Get("Mattermost-User-ID") + + currentPlaybook, err := c.playbookService.Get(args.ID) + if err != nil { + return "", err + } + + if currentPlaybook.DeleteAt != 0 { + return "", errors.New("archived playbooks can not be modified") + } + + if err := c.permissions.PlaybookManageProperties(userID, currentPlaybook); err != nil { + return "", err + } + + setmap := map[string]interface{}{} + addToSetmap(setmap, "Title", args.Updates.Title) + addToSetmap(setmap, "Description", args.Updates.Description) + if args.Updates.Public != nil { + if *args.Updates.Public { + if err := c.permissions.PlaybookMakePublic(userID, currentPlaybook); err != nil { + return "", errors.Wrap(err, "attempted to make playbook public without permissions") + } + } else { + if err := c.permissions.PlaybookMakePrivate(userID, currentPlaybook); err != nil { + return "", errors.Wrap(err, "attempted to make playbook private without permissions") + } + } + if !c.licenceChecker.PlaybookAllowed(*args.Updates.Public) { + return "", errors.Wrapf(app.ErrLicensedFeature, "the playbook is not valid with the current license") + } + addToSetmap(setmap, "Public", args.Updates.Public) + } + addToSetmap(setmap, "CreatePublicIncident", args.Updates.CreatePublicPlaybookRun) + addToSetmap(setmap, "ReminderMessageTemplate", args.Updates.ReminderMessageTemplate) + addToSetmap(setmap, "ReminderTimerDefaultSeconds", args.Updates.ReminderTimerDefaultSeconds) + addToSetmap(setmap, "StatusUpdateEnabled", args.Updates.StatusUpdateEnabled) + + if args.Updates.InvitedUserIDs != nil { + filteredInvitedUserIDs := c.permissions.FilterInvitedUserIDs(*args.Updates.InvitedUserIDs, currentPlaybook.TeamID) + addConcatToSetmap(setmap, "ConcatenatedInvitedUserIDs", &filteredInvitedUserIDs) + } + + if args.Updates.InvitedGroupIDs != nil { + filteredInvitedGroupIDs := c.permissions.FilterInvitedGroupIDs(*args.Updates.InvitedGroupIDs) + addConcatToSetmap(setmap, "ConcatenatedInvitedGroupIDs", &filteredInvitedGroupIDs) + } + + addToSetmap(setmap, "InviteUsersEnabled", args.Updates.InviteUsersEnabled) + if args.Updates.DefaultOwnerID != nil { + if !c.pluginAPI.User.HasPermissionToTeam(*args.Updates.DefaultOwnerID, currentPlaybook.TeamID, model.PermissionViewTeam) { + return "", errors.Wrap(app.ErrNoPermissions, "default owner can't view team") + } + addToSetmap(setmap, "DefaultCommanderID", args.Updates.DefaultOwnerID) + } + addToSetmap(setmap, "DefaultCommanderEnabled", args.Updates.DefaultOwnerEnabled) + + if args.Updates.BroadcastChannelIDs != nil { + if err := c.permissions.NoAddedBroadcastChannelsWithoutPermission(userID, *args.Updates.BroadcastChannelIDs, currentPlaybook.BroadcastChannelIDs); err != nil { + return "", err + } + addConcatToSetmap(setmap, "ConcatenatedBroadcastChannelIDs", args.Updates.BroadcastChannelIDs) + } + + addToSetmap(setmap, "BroadcastEnabled", args.Updates.BroadcastEnabled) + if args.Updates.WebhookOnCreationURLs != nil { + if err := app.ValidateWebhookURLs(*args.Updates.WebhookOnCreationURLs); err != nil { + return "", err + } + addConcatToSetmap(setmap, "ConcatenatedWebhookOnCreationURLs", args.Updates.WebhookOnCreationURLs) + } + addToSetmap(setmap, "WebhookOnCreationEnabled", args.Updates.WebhookOnCreationEnabled) + addToSetmap(setmap, "MessageOnJoin", args.Updates.MessageOnJoin) + addToSetmap(setmap, "MessageOnJoinEnabled", args.Updates.MessageOnJoinEnabled) + addToSetmap(setmap, "RetrospectiveReminderIntervalSeconds", args.Updates.RetrospectiveReminderIntervalSeconds) + addToSetmap(setmap, "RetrospectiveTemplate", args.Updates.RetrospectiveTemplate) + addToSetmap(setmap, "RetrospectiveEnabled", args.Updates.RetrospectiveEnabled) + if args.Updates.WebhookOnStatusUpdateURLs != nil { + if err := app.ValidateWebhookURLs(*args.Updates.WebhookOnStatusUpdateURLs); err != nil { + return "", err + } + addConcatToSetmap(setmap, "ConcatenatedWebhookOnStatusUpdateURLs", args.Updates.WebhookOnStatusUpdateURLs) + } + addToSetmap(setmap, "WebhookOnStatusUpdateEnabled", args.Updates.WebhookOnStatusUpdateEnabled) + if args.Updates.SignalAnyKeywords != nil { + validSignalAnyKeywords := app.ProcessSignalAnyKeywords(*args.Updates.SignalAnyKeywords) + addConcatToSetmap(setmap, "ConcatenatedSignalAnyKeywords", &validSignalAnyKeywords) + } + addToSetmap(setmap, "SignalAnyKeywordsEnabled", args.Updates.SignalAnyKeywordsEnabled) + addToSetmap(setmap, "CategorizeChannelEnabled", args.Updates.CategorizeChannelEnabled) + if args.Updates.CategoryName != nil { + if err := app.ValidateCategoryName(*args.Updates.CategoryName); err != nil { + return "", err + } + addToSetmap(setmap, "CategoryName", args.Updates.CategoryName) + } + addToSetmap(setmap, "RunSummaryTemplateEnabled", args.Updates.RunSummaryTemplateEnabled) + addToSetmap(setmap, "RunSummaryTemplate", args.Updates.RunSummaryTemplate) + addToSetmap(setmap, "ChannelNameTemplate", args.Updates.ChannelNameTemplate) + + // Not optimal graphql. Stopgap measure. Should be updated seperately. + if args.Updates.Checklists != nil { + checklistsJSON, err := json.Marshal(args.Updates.Checklists) + if err != nil { + return "", errors.Wrapf(err, "failed to marshal checklist in graphql json for playbook id: '%s'", args.ID) + } + setmap["ChecklistsJSON"] = checklistsJSON + } + + if len(setmap) > 0 { + if err := c.playbookStore.GraphqlUpdate(args.ID, setmap); err != nil { + return "", err + } + } + + if args.Updates.IsFavorite != nil { + if *args.Updates.IsFavorite { + if err := c.categoryService.AddFavorite( + app.CategoryItem{ + ItemID: currentPlaybook.ID, + Type: app.PlaybookItemType, + }, + currentPlaybook.TeamID, + userID, + ); err != nil { + return "", err + } + } else { + if err := c.categoryService.DeleteFavorite( + app.CategoryItem{ + ItemID: currentPlaybook.ID, + Type: app.PlaybookItemType, + }, + currentPlaybook.TeamID, + userID, + ); err != nil { + return "", err + } + } + } + + return args.ID, nil +} + +func (r *PlaybookRootResolver) AddPlaybookMember(ctx context.Context, args struct { + PlaybookID string + UserID string +}) (string, error) { + c, err := getContext(ctx) + if err != nil { + return "", err + } + userID := c.r.Header.Get("Mattermost-User-ID") + + currentPlaybook, err := c.playbookService.Get(args.PlaybookID) + if err != nil { + return "", err + } + + if currentPlaybook.DeleteAt != 0 { + return "", errors.New("archived playbooks can not be modified") + } + + if err := c.permissions.PlaybookManageMembers(userID, currentPlaybook); err != nil { + return "", errors.Wrap(err, "attempted to modify members without permissions") + } + + if err := c.playbookStore.AddPlaybookMember(args.PlaybookID, args.UserID); err != nil { + return "", errors.Wrap(err, "unable to add playbook member") + } + + return "", nil +} + +func (r *PlaybookRootResolver) RemovePlaybookMember(ctx context.Context, args struct { + PlaybookID string + UserID string +}) (string, error) { + c, err := getContext(ctx) + if err != nil { + return "", err + } + userID := c.r.Header.Get("Mattermost-User-ID") + + currentPlaybook, err := c.playbookService.Get(args.PlaybookID) + if err != nil { + return "", err + } + + if currentPlaybook.DeleteAt != 0 { + return "", errors.New("archived playbooks can not be modified") + } + + // do not require manageMembers permission if the user want to leave playbook + if userID != args.UserID { + if err := c.permissions.PlaybookManageMembers(userID, currentPlaybook); err != nil { + return "", errors.Wrap(err, "attempted to modify members without permissions") + } + } + + if err := c.playbookStore.RemovePlaybookMember(args.PlaybookID, args.UserID); err != nil { + return "", errors.Wrap(err, "unable to remove playbook member") + } + + return "", nil +} + +func (r *PlaybookRootResolver) AddMetric(ctx context.Context, args struct { + PlaybookID string + Title string + Description string + Type string + Target *float64 +}) (string, error) { + c, err := getContext(ctx) + if err != nil { + return "", err + } + userID := c.r.Header.Get("Mattermost-User-ID") + + currentPlaybook, err := c.playbookService.Get(args.PlaybookID) + if err != nil { + return "", err + } + + if currentPlaybook.DeleteAt != 0 { + return "", errors.New("archived playbooks can not be modified") + } + + if err := c.permissions.PlaybookManageProperties(userID, currentPlaybook); err != nil { + return "", err + } + + var target null.Int + if args.Target == nil { + target = null.NewInt(0, false) + } else { + target = null.IntFrom(int64(*args.Target)) + } + + if err := c.playbookStore.AddMetric(args.PlaybookID, app.PlaybookMetricConfig{ + Title: args.Title, + Description: args.Description, + Type: args.Type, + Target: target, + }); err != nil { + return "", err + } + + return args.PlaybookID, nil +} + +func (r *PlaybookRootResolver) UpdateMetric(ctx context.Context, args struct { + ID string + Title *string + Description *string + Target *float64 +}) (string, error) { + c, err := getContext(ctx) + if err != nil { + return "", err + } + userID := c.r.Header.Get("Mattermost-User-ID") + + currentMetric, err := c.playbookStore.GetMetric(args.ID) + if err != nil { + return "", err + } + + currentPlaybook, err := c.playbookService.Get(currentMetric.PlaybookID) + if err != nil { + return "", err + } + + if currentPlaybook.DeleteAt != 0 { + return "", errors.New("archived playbooks can not be modified") + } + + if err := c.permissions.PlaybookManageProperties(userID, currentPlaybook); err != nil { + return "", err + } + + setmap := map[string]interface{}{} + addToSetmap(setmap, "Title", args.Title) + addToSetmap(setmap, "Description", args.Description) + if args.Target != nil { + setmap["Target"] = null.IntFrom(int64(*args.Target)) + } + if len(setmap) > 0 { + if err := c.playbookStore.UpdateMetric(args.ID, setmap); err != nil { + return "", err + } + } + + return args.ID, nil +} + +func (r *PlaybookRootResolver) DeleteMetric(ctx context.Context, args struct { + ID string +}) (string, error) { + c, err := getContext(ctx) + if err != nil { + return "", err + } + userID := c.r.Header.Get("Mattermost-User-ID") + + currentMetric, err := c.playbookStore.GetMetric(args.ID) + if err != nil { + return "", err + } + + currentPlaybook, err := c.playbookService.Get(currentMetric.PlaybookID) + if err != nil { + return "", err + } + + if err := c.permissions.PlaybookManageProperties(userID, currentPlaybook); err != nil { + return "", err + } + + if err := c.playbookStore.DeleteMetric(args.ID); err != nil { + return "", err + } + + return args.ID, nil +} diff --git a/server/api/graphql_root_run.go b/server/api/graphql_root_run.go new file mode 100644 index 0000000000..66c9ad0c8b --- /dev/null +++ b/server/api/graphql_root_run.go @@ -0,0 +1,185 @@ +package api + +import ( + "context" + + "github.com/mattermost/mattermost-plugin-playbooks/client" + "github.com/mattermost/mattermost-plugin-playbooks/server/app" + "github.com/pkg/errors" +) + +// RunRootResolver hold all queries and mutations for a playbookRun +type RunRootResolver struct { +} + +func (r *RunRootResolver) Run(ctx context.Context, args struct { + ID string `url:"id,omitempty"` +}) (*RunResolver, error) { + c, err := getContext(ctx) + if err != nil { + return nil, err + } + userID := c.r.Header.Get("Mattermost-User-ID") + + if err := c.permissions.RunView(userID, args.ID); err != nil { + c.logger.WithError(err).Warn("Not authorized") + return nil, errors.New("Not authorized") + } + + run, err := c.playbookRunService.GetPlaybookRun(args.ID) + if err != nil { + return nil, err + } + + return &RunResolver{*run}, nil +} + +func (r *RunRootResolver) Runs(ctx context.Context, args struct { + TeamID string `url:"team_id,omitempty"` + Sort string + Statuses []string + ParticipantOrFollowerID string `url:"participant_or_follower,omitempty"` +}) ([]*RunResolver, error) { + c, err := getContext(ctx) + if err != nil { + return nil, err + } + userID := c.r.Header.Get("Mattermost-User-ID") + + requesterInfo := app.RequesterInfo{ + UserID: userID, + TeamID: args.TeamID, + IsAdmin: app.IsSystemAdmin(userID, c.pluginAPI), + } + + if args.ParticipantOrFollowerID == client.Me { + args.ParticipantOrFollowerID = userID + } + + filterOptions := app.PlaybookRunFilterOptions{ + Sort: app.SortField(args.Sort), + TeamID: args.TeamID, + Statuses: args.Statuses, + ParticipantOrFollowerID: args.ParticipantOrFollowerID, + IncludeFavorites: true, + Page: 0, + PerPage: 10000, + } + + runResults, err := c.playbookRunService.GetPlaybookRuns(requesterInfo, filterOptions) + if err != nil { + return nil, err + } + + ret := make([]*RunResolver, 0, len(runResults.Items)) + for _, run := range runResults.Items { + ret = append(ret, &RunResolver{run}) + } + + return ret, nil +} + +func (r *RunRootResolver) UpdateRun(ctx context.Context, args struct { + ID string + Updates struct { + IsFavorite *bool + } +}) (string, error) { + c, err := getContext(ctx) + if err != nil { + return "", err + } + userID := c.r.Header.Get("Mattermost-User-ID") + + playbookRun, err := c.playbookRunService.GetPlaybookRun(args.ID) + if err != nil { + return "", err + } + + // Enough permissions to do a fav/unfav, check if future ops need RunManageProperties + if err := c.permissions.RunView(userID, playbookRun.ID); err != nil { + return "", err + } + + if args.Updates.IsFavorite != nil { + if *args.Updates.IsFavorite { + if err := c.categoryService.AddFavorite( + app.CategoryItem{ + ItemID: playbookRun.ID, + Type: app.RunItemType, + }, + playbookRun.TeamID, + userID, + ); err != nil { + return "", err + } + } else { + if err := c.categoryService.DeleteFavorite( + app.CategoryItem{ + ItemID: playbookRun.ID, + Type: app.RunItemType, + }, + playbookRun.TeamID, + userID, + ); err != nil { + return "", err + } + } + } + + return playbookRun.ID, nil +} + +func (r *RunRootResolver) AddRunParticipants(ctx context.Context, args struct { + RunID string + UserIDs []string +}) (string, error) { + c, err := getContext(ctx) + if err != nil { + return "", err + } + userID := c.r.Header.Get("Mattermost-User-ID") + + if err := c.permissions.RunView(userID, args.RunID); err != nil { + return "", errors.Wrap(err, "attempted to modify participants without permissions") + } + + if err := c.playbookRunService.AddParticipants(args.RunID, args.UserIDs, userID); err != nil { + return "", errors.Wrap(err, "failed to add participant from run") + } + + for _, userID := range args.UserIDs { + if err := c.playbookRunService.Follow(args.RunID, userID); err != nil { + return "", errors.Wrap(err, "failed to make participant to unfollow run") + } + } + + return "", nil +} + +func (r *RunRootResolver) RemoveRunParticipants(ctx context.Context, args struct { + RunID string + UserIDs []string +}) (string, error) { + c, err := getContext(ctx) + if err != nil { + return "", err + } + userID := c.r.Header.Get("Mattermost-User-ID") + + if err := c.permissions.RunView(userID, args.RunID); err != nil { + return "", errors.Wrap(err, "attempted to modify participants without permissions") + } + + if err := c.playbookRunService.RemoveParticipants(args.RunID, args.UserIDs); err != nil { + return "", errors.Wrap(err, "failed to remove participant from run") + } + + for _, userID := range args.UserIDs { + if err := c.playbookRunService.Unfollow(args.RunID, userID); err != nil { + return "", errors.Wrap(err, "failed to make participant to unfollow run") + } + } + + return "", nil +} diff --git a/server/api/graphql_run.go b/server/api/graphql_run.go new file mode 100644 index 0000000000..22f3c5d995 --- /dev/null +++ b/server/api/graphql_run.go @@ -0,0 +1,138 @@ +package api + +import ( + "context" + + "github.com/mattermost/mattermost-plugin-playbooks/server/app" + "github.com/pkg/errors" +) + +type RunResolver struct { + app.PlaybookRun +} + +func (r *RunResolver) CreateAt() float64 { + return float64(r.PlaybookRun.CreateAt) +} + +func (r *RunResolver) EndAt() float64 { + return float64(r.PlaybookRun.EndAt) +} + +func (r *RunResolver) SummaryModifiedAt() float64 { + return float64(r.PlaybookRun.SummaryModifiedAt) +} +func (r *RunResolver) LastStatusUpdateAt() float64 { + return float64(r.PlaybookRun.LastStatusUpdateAt) +} + +func (r *RunResolver) RetrospectivePublishedAt() float64 { + return float64(r.PlaybookRun.RetrospectivePublishedAt) +} + +func (r *RunResolver) ReminderTimerDefaultSeconds() float64 { + return float64(r.PlaybookRun.ReminderTimerDefaultSeconds) +} + +func (r *RunResolver) PreviousReminder() float64 { + return float64(r.PlaybookRun.PreviousReminder) +} + +func (r *RunResolver) RetrospectiveReminderIntervalSeconds() float64 { + return float64(r.PlaybookRun.RetrospectiveReminderIntervalSeconds) +} + +func (r *RunResolver) Checklists() []*ChecklistResolver { + checklistResolvers := make([]*ChecklistResolver, 0, len(r.PlaybookRun.Checklists)) + for _, checklist := range r.PlaybookRun.Checklists { + checklistResolvers = append(checklistResolvers, &ChecklistResolver{checklist}) + } + + return checklistResolvers +} + +func (r *RunResolver) StatusPosts() []*StatusPostResolver { + statusPostResolvers := make([]*StatusPostResolver, 0, len(r.PlaybookRun.StatusPosts)) + for _, statusPost := range r.PlaybookRun.StatusPosts { + statusPostResolvers = append(statusPostResolvers, &StatusPostResolver{statusPost}) + } + + return statusPostResolvers +} + +func (r *RunResolver) TimelineEvents() []*TimelineEventResolver { + timelineEventResolvers := make([]*TimelineEventResolver, 0, len(r.PlaybookRun.StatusPosts)) + for _, event := range r.PlaybookRun.TimelineEvents { + timelineEventResolvers = append(timelineEventResolvers, &TimelineEventResolver{event}) + } + + return timelineEventResolvers +} + +func (r *RunResolver) IsFavorite(ctx context.Context) (bool, error) { + c, err := getContext(ctx) + if err != nil { + return false, err + } + userID := c.r.Header.Get("Mattermost-User-ID") + + isFavorite, err := c.categoryService.IsItemFavorite( + app.CategoryItem{ + ItemID: r.ID, + Type: app.RunItemType, + }, + r.TeamID, + userID, + ) + if err != nil { + return false, errors.Wrap(err, "can't determine if item is favorite or not") + } + + return isFavorite, nil +} + +type StatusPostResolver struct { + app.StatusPost +} + +func (r *StatusPostResolver) CreateAt() float64 { + return float64(r.StatusPost.CreateAt) +} + +func (r *StatusPostResolver) DeleteAt() float64 { + return float64(r.StatusPost.DeleteAt) +} + +type TimelineEventResolver struct { + app.TimelineEvent +} + +func (r *TimelineEventResolver) CreateAt() float64 { + return float64(r.TimelineEvent.CreateAt) +} + +func (r *TimelineEventResolver) EventType() string { + return string(r.TimelineEvent.EventType) +} + +func (r *TimelineEventResolver) DeleteAt() float64 { + return float64(r.TimelineEvent.DeleteAt) +} + +func (r *RunResolver) Metadata(ctx context.Context) (*MetadataResolver, error) { + c, err := getContext(ctx) + if err != nil { + return nil, err + } + + metadata, err := c.playbookRunService.GetPlaybookRunMetadata(r.ID) + if err != nil { + return nil, errors.Wrap(err, "can't get metadata") + } + + return &MetadataResolver{*metadata}, nil +} + +type MetadataResolver struct { + app.Metadata +} diff --git a/server/api/logger.go b/server/api/logger.go new file mode 100644 index 0000000000..814bf0f281 --- /dev/null +++ b/server/api/logger.go @@ -0,0 +1,47 @@ +package api + +import ( + "context" + "net/http" + + "github.com/mattermost/mattermost-server/v6/model" + "github.com/sirupsen/logrus" +) + +// statusRecorder intercepts and saves the status code written to an http.ResponseWriter. +type statusRecorder struct { + http.ResponseWriter + statusCode int +} + +func (r *statusRecorder) WriteHeader(code int) { + // Forward the write + r.ResponseWriter.WriteHeader(code) + + // Save the status code + r.statusCode = code +} + +// LogRequest logs each request, attaching a unique request_id to the request context to trace +// logs throughout the request lifecycle. +func LogRequest(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + recorder := statusRecorder{w, 200} + requestID := model.NewId() + + logger := logrus.WithFields(logrus.Fields{ + "method": r.Method, + "url": r.URL.String(), + "user_id": r.Header.Get("Mattermost-User-Id"), + "request_id": requestID, + "user_agent": r.Header.Get("User-Agent"), + }) + r = r.WithContext(context.WithValue(r.Context(), requestIDContextKey, requestID)) + + logger.Debug("Received HTTP request") + + next.ServeHTTP(&recorder, r) + + logger.WithField("status", recorder.statusCode).Debug("Handled HTTP request") + }) +} diff --git a/server/api/playbook_runs.go b/server/api/playbook_runs.go index 95d6515e55..3f002f5ecf 100644 --- a/server/api/playbook_runs.go +++ b/server/api/playbook_runs.go @@ -14,6 +14,7 @@ import ( "github.com/mattermost/mattermost-plugin-playbooks/client" "github.com/mattermost/mattermost-server/v6/model" "github.com/pkg/errors" + "github.com/sirupsen/logrus" pluginapi "github.com/mattermost/mattermost-plugin-api" @@ -32,7 +33,6 @@ type PlaybookRunHandler struct { licenseChecker app.LicenseChecker pluginAPI *pluginapi.Client poster bot.Poster - log bot.Logger } // NewPlaybookRunHandler Creates a new Plugin API handler. @@ -44,108 +44,107 @@ func NewPlaybookRunHandler( licenseChecker app.LicenseChecker, api *pluginapi.Client, poster bot.Poster, - log bot.Logger, configService config.Service, ) *PlaybookRunHandler { handler := &PlaybookRunHandler{ - ErrorHandler: &ErrorHandler{log: log}, + ErrorHandler: &ErrorHandler{}, playbookRunService: playbookRunService, playbookService: playbookService, pluginAPI: api, poster: poster, - log: log, config: configService, permissions: permissions, licenseChecker: licenseChecker, } playbookRunsRouter := router.PathPrefix("/runs").Subrouter() - playbookRunsRouter.HandleFunc("", handler.getPlaybookRuns).Methods(http.MethodGet) - playbookRunsRouter.HandleFunc("", handler.createPlaybookRunFromPost).Methods(http.MethodPost) + playbookRunsRouter.HandleFunc("", withContext(handler.getPlaybookRuns)).Methods(http.MethodGet) + playbookRunsRouter.HandleFunc("", withContext(handler.createPlaybookRunFromPost)).Methods(http.MethodPost) - playbookRunsRouter.HandleFunc("/dialog", handler.createPlaybookRunFromDialog).Methods(http.MethodPost) - playbookRunsRouter.HandleFunc("/add-to-timeline-dialog", handler.addToTimelineDialog).Methods(http.MethodPost) - playbookRunsRouter.HandleFunc("/owners", handler.getOwners).Methods(http.MethodGet) - playbookRunsRouter.HandleFunc("/channels", handler.getChannels).Methods(http.MethodGet) - playbookRunsRouter.HandleFunc("/checklist-autocomplete", handler.getChecklistAutocomplete).Methods(http.MethodGet) - playbookRunsRouter.HandleFunc("/checklist-autocomplete-item", handler.getChecklistAutocompleteItem).Methods(http.MethodGet) + playbookRunsRouter.HandleFunc("/dialog", withContext(handler.createPlaybookRunFromDialog)).Methods(http.MethodPost) + playbookRunsRouter.HandleFunc("/add-to-timeline-dialog", withContext(handler.addToTimelineDialog)).Methods(http.MethodPost) + playbookRunsRouter.HandleFunc("/owners", withContext(handler.getOwners)).Methods(http.MethodGet) + playbookRunsRouter.HandleFunc("/channels", withContext(handler.getChannels)).Methods(http.MethodGet) + playbookRunsRouter.HandleFunc("/checklist-autocomplete", withContext(handler.getChecklistAutocomplete)).Methods(http.MethodGet) + playbookRunsRouter.HandleFunc("/checklist-autocomplete-item", withContext(handler.getChecklistAutocompleteItem)).Methods(http.MethodGet) playbookRunRouter := playbookRunsRouter.PathPrefix("/{id:[A-Za-z0-9]+}").Subrouter() - playbookRunRouter.HandleFunc("", handler.getPlaybookRun).Methods(http.MethodGet) - playbookRunRouter.HandleFunc("/metadata", handler.getPlaybookRunMetadata).Methods(http.MethodGet) - playbookRunRouter.HandleFunc("/status-updates", handler.getStatusUpdates).Methods(http.MethodGet) - playbookRunRouter.HandleFunc("/request-update", handler.requestUpdate).Methods(http.MethodPost) - playbookRunRouter.HandleFunc("/request-get-involved", handler.requestGetInvolved).Methods(http.MethodPost) + playbookRunRouter.HandleFunc("", withContext(handler.getPlaybookRun)).Methods(http.MethodGet) + playbookRunRouter.HandleFunc("/metadata", withContext(handler.getPlaybookRunMetadata)).Methods(http.MethodGet) + playbookRunRouter.HandleFunc("/status-updates", withContext(handler.getStatusUpdates)).Methods(http.MethodGet) + playbookRunRouter.HandleFunc("/request-update", withContext(handler.requestUpdate)).Methods(http.MethodPost) + playbookRunRouter.HandleFunc("/request-join-channel", withContext(handler.requestJoinChannel)).Methods(http.MethodPost) playbookRunRouterAuthorized := playbookRunRouter.PathPrefix("").Subrouter() playbookRunRouterAuthorized.Use(handler.checkEditPermissions) - playbookRunRouterAuthorized.HandleFunc("", handler.updatePlaybookRun).Methods(http.MethodPatch) - playbookRunRouterAuthorized.HandleFunc("/owner", handler.changeOwner).Methods(http.MethodPost) - playbookRunRouterAuthorized.HandleFunc("/status", handler.status).Methods(http.MethodPost) - playbookRunRouterAuthorized.HandleFunc("/finish", handler.finish).Methods(http.MethodPut) - playbookRunRouterAuthorized.HandleFunc("/finish-dialog", handler.finishDialog).Methods(http.MethodPost) - playbookRunRouterAuthorized.HandleFunc("/update-status-dialog", handler.updateStatusDialog).Methods(http.MethodPost) - playbookRunRouterAuthorized.HandleFunc("/reminder/button-update", handler.reminderButtonUpdate).Methods(http.MethodPost) - playbookRunRouterAuthorized.HandleFunc("/reminder", handler.reminderReset).Methods(http.MethodPost) - playbookRunRouterAuthorized.HandleFunc("/no-retrospective-button", handler.noRetrospectiveButton).Methods(http.MethodPost) - playbookRunRouterAuthorized.HandleFunc("/timeline/{eventID:[A-Za-z0-9]+}", handler.removeTimelineEvent).Methods(http.MethodDelete) - playbookRunRouterAuthorized.HandleFunc("/update-description", handler.updateDescription).Methods(http.MethodPut) - playbookRunRouterAuthorized.HandleFunc("/restore", handler.restore).Methods(http.MethodPut) - playbookRunRouterAuthorized.HandleFunc("/actions", handler.updateRunActions).Methods(http.MethodPut) + playbookRunRouterAuthorized.HandleFunc("", withContext(handler.updatePlaybookRun)).Methods(http.MethodPatch) + playbookRunRouterAuthorized.HandleFunc("/owner", withContext(handler.changeOwner)).Methods(http.MethodPost) + playbookRunRouterAuthorized.HandleFunc("/status", withContext(handler.status)).Methods(http.MethodPost) + playbookRunRouterAuthorized.HandleFunc("/finish", withContext(handler.finish)).Methods(http.MethodPut) + playbookRunRouterAuthorized.HandleFunc("/finish-dialog", withContext(handler.finishDialog)).Methods(http.MethodPost) + playbookRunRouterAuthorized.HandleFunc("/update-status-dialog", withContext(handler.updateStatusDialog)).Methods(http.MethodPost) + playbookRunRouterAuthorized.HandleFunc("/reminder/button-update", withContext(handler.reminderButtonUpdate)).Methods(http.MethodPost) + playbookRunRouterAuthorized.HandleFunc("/reminder", withContext(handler.reminderReset)).Methods(http.MethodPost) + playbookRunRouterAuthorized.HandleFunc("/no-retrospective-button", withContext(handler.noRetrospectiveButton)).Methods(http.MethodPost) + playbookRunRouterAuthorized.HandleFunc("/timeline/{eventID:[A-Za-z0-9]+}", withContext(handler.removeTimelineEvent)).Methods(http.MethodDelete) + playbookRunRouterAuthorized.HandleFunc("/update-description", withContext(handler.updateDescription)).Methods(http.MethodPut) + playbookRunRouterAuthorized.HandleFunc("/restore", withContext(handler.restore)).Methods(http.MethodPut) + playbookRunRouterAuthorized.HandleFunc("/actions", withContext(handler.updateRunActions)).Methods(http.MethodPut) channelRouter := playbookRunsRouter.PathPrefix("/channel").Subrouter() - channelRouter.HandleFunc("/{channel_id:[A-Za-z0-9]+}", handler.getPlaybookRunByChannel).Methods(http.MethodGet) + channelRouter.HandleFunc("/{channel_id:[A-Za-z0-9]+}", withContext(handler.getPlaybookRunByChannel)).Methods(http.MethodGet) checklistsRouter := playbookRunRouterAuthorized.PathPrefix("/checklists").Subrouter() - checklistsRouter.HandleFunc("", handler.addChecklist).Methods(http.MethodPost) - checklistsRouter.HandleFunc("/move", handler.moveChecklist).Methods(http.MethodPost) - checklistsRouter.HandleFunc("/move-item", handler.moveChecklistItem).Methods(http.MethodPost) + checklistsRouter.HandleFunc("", withContext(handler.addChecklist)).Methods(http.MethodPost) + checklistsRouter.HandleFunc("/move", withContext(handler.moveChecklist)).Methods(http.MethodPost) + checklistsRouter.HandleFunc("/move-item", withContext(handler.moveChecklistItem)).Methods(http.MethodPost) checklistRouter := checklistsRouter.PathPrefix("/{checklist:[0-9]+}").Subrouter() - checklistRouter.HandleFunc("", handler.removeChecklist).Methods(http.MethodDelete) - checklistRouter.HandleFunc("/add", handler.addChecklistItem).Methods(http.MethodPost) - checklistRouter.HandleFunc("/rename", handler.renameChecklist).Methods(http.MethodPut) - checklistRouter.HandleFunc("/add-dialog", handler.addChecklistItemDialog).Methods(http.MethodPost) - checklistRouter.HandleFunc("/skip", handler.checklistSkip).Methods(http.MethodPut) - checklistRouter.HandleFunc("/restore", handler.checklistRestore).Methods(http.MethodPut) - checklistRouter.HandleFunc("/duplicate", handler.duplicateChecklist).Methods(http.MethodPost) + checklistRouter.HandleFunc("", withContext(handler.removeChecklist)).Methods(http.MethodDelete) + checklistRouter.HandleFunc("/add", withContext(handler.addChecklistItem)).Methods(http.MethodPost) + checklistRouter.HandleFunc("/rename", withContext(handler.renameChecklist)).Methods(http.MethodPut) + checklistRouter.HandleFunc("/add-dialog", withContext(handler.addChecklistItemDialog)).Methods(http.MethodPost) + checklistRouter.HandleFunc("/skip", withContext(handler.checklistSkip)).Methods(http.MethodPut) + checklistRouter.HandleFunc("/restore", withContext(handler.checklistRestore)).Methods(http.MethodPut) + checklistRouter.HandleFunc("/duplicate", withContext(handler.duplicateChecklist)).Methods(http.MethodPost) checklistItem := checklistRouter.PathPrefix("/item/{item:[0-9]+}").Subrouter() - checklistItem.HandleFunc("", handler.itemDelete).Methods(http.MethodDelete) - checklistItem.HandleFunc("", handler.itemEdit).Methods(http.MethodPut) - checklistItem.HandleFunc("/skip", handler.itemSkip).Methods(http.MethodPut) - checklistItem.HandleFunc("/restore", handler.itemRestore).Methods(http.MethodPut) - checklistItem.HandleFunc("/state", handler.itemSetState).Methods(http.MethodPut) - checklistItem.HandleFunc("/assignee", handler.itemSetAssignee).Methods(http.MethodPut) - checklistItem.HandleFunc("/command", handler.itemSetCommand).Methods(http.MethodPut) - checklistItem.HandleFunc("/run", handler.itemRun).Methods(http.MethodPost) - checklistItem.HandleFunc("/duplicate", handler.itemDuplicate).Methods(http.MethodPost) - checklistItem.HandleFunc("/duedate", handler.itemSetDueDate).Methods(http.MethodPut) + checklistItem.HandleFunc("", withContext(handler.itemDelete)).Methods(http.MethodDelete) + checklistItem.HandleFunc("", withContext(handler.itemEdit)).Methods(http.MethodPut) + checklistItem.HandleFunc("/skip", withContext(handler.itemSkip)).Methods(http.MethodPut) + checklistItem.HandleFunc("/restore", withContext(handler.itemRestore)).Methods(http.MethodPut) + checklistItem.HandleFunc("/state", withContext(handler.itemSetState)).Methods(http.MethodPut) + checklistItem.HandleFunc("/assignee", withContext(handler.itemSetAssignee)).Methods(http.MethodPut) + checklistItem.HandleFunc("/command", withContext(handler.itemSetCommand)).Methods(http.MethodPut) + checklistItem.HandleFunc("/run", withContext(handler.itemRun)).Methods(http.MethodPost) + checklistItem.HandleFunc("/duplicate", withContext(handler.itemDuplicate)).Methods(http.MethodPost) + checklistItem.HandleFunc("/duedate", withContext(handler.itemSetDueDate)).Methods(http.MethodPut) retrospectiveRouter := playbookRunRouterAuthorized.PathPrefix("/retrospective").Subrouter() - retrospectiveRouter.HandleFunc("", handler.updateRetrospective).Methods(http.MethodPost) - retrospectiveRouter.HandleFunc("/publish", handler.publishRetrospective).Methods(http.MethodPost) + retrospectiveRouter.HandleFunc("", withContext(handler.updateRetrospective)).Methods(http.MethodPost) + retrospectiveRouter.HandleFunc("/publish", withContext(handler.publishRetrospective)).Methods(http.MethodPost) followersRouter := playbookRunRouter.PathPrefix("/followers").Subrouter() - followersRouter.HandleFunc("", handler.follow).Methods(http.MethodPut) - followersRouter.HandleFunc("", handler.unfollow).Methods(http.MethodDelete) - followersRouter.HandleFunc("", handler.getFollowers).Methods(http.MethodGet) + followersRouter.HandleFunc("", withContext(handler.follow)).Methods(http.MethodPut) + followersRouter.HandleFunc("", withContext(handler.unfollow)).Methods(http.MethodDelete) + followersRouter.HandleFunc("", withContext(handler.getFollowers)).Methods(http.MethodGet) return handler } func (h *PlaybookRunHandler) checkEditPermissions(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + logger := getLogger(r) vars := mux.Vars(r) userID := r.Header.Get("Mattermost-User-ID") playbookRun, err := h.playbookRunService.GetPlaybookRun(vars["id"]) if err != nil { - h.HandleError(w, err) + h.HandleError(w, logger, err) return } - if !h.PermissionsCheck(w, h.permissions.RunManageProperties(userID, playbookRun.ID)) { + if !h.PermissionsCheck(w, logger, h.permissions.RunManageProperties(userID, playbookRun.ID)) { return } @@ -154,12 +153,12 @@ func (h *PlaybookRunHandler) checkEditPermissions(next http.Handler) http.Handle } // createPlaybookRunFromPost handles the POST /runs endpoint -func (h *PlaybookRunHandler) createPlaybookRunFromPost(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) createPlaybookRunFromPost(c *Context, w http.ResponseWriter, r *http.Request) { userID := r.Header.Get("Mattermost-User-ID") var playbookRunCreateOptions client.PlaybookRunCreateOptions if err := json.NewDecoder(r.Body).Decode(&playbookRunCreateOptions); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "unable to decode playbook run create options", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to decode playbook run create options", err) return } @@ -177,17 +176,17 @@ func (h *PlaybookRunHandler) createPlaybookRunFromPost(w http.ResponseWriter, r ) if errors.Is(err, app.ErrNoPermissions) { - h.HandleErrorWithCode(w, http.StatusForbidden, "unable to create playbook run", err) + h.HandleErrorWithCode(w, c.logger, http.StatusForbidden, "unable to create playbook run", err) return } if errors.Is(err, app.ErrMalformedPlaybookRun) { - h.HandleErrorWithCode(w, http.StatusBadRequest, "unable to create playbook run", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to create playbook run", err) return } if err != nil { - h.HandleError(w, errors.Wrapf(err, "unable to create playbook run")) + h.HandleError(w, c.logger, errors.Wrapf(err, "unable to create playbook run")) return } @@ -200,20 +199,19 @@ func (h *PlaybookRunHandler) createPlaybookRunFromPost(w http.ResponseWriter, r } // Note that this currently does nothing. This is temporary given the removal of stages. Will be used by status. -func (h *PlaybookRunHandler) updatePlaybookRun(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) updatePlaybookRun(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) playbookRunID := vars["id"] - //userID := r.Header.Get("Mattermost-User-ID") oldPlaybookRun, err := h.playbookRunService.GetPlaybookRun(playbookRunID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } var updates app.UpdateOptions if err = json.NewDecoder(r.Body).Decode(&updates); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "unable to decode payload", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to decode payload", err) return } @@ -224,25 +222,25 @@ func (h *PlaybookRunHandler) updatePlaybookRun(w http.ResponseWriter, r *http.Re // createPlaybookRunFromDialog handles the interactive dialog submission when a user presses confirm on // the create playbook run dialog. -func (h *PlaybookRunHandler) createPlaybookRunFromDialog(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) createPlaybookRunFromDialog(c *Context, w http.ResponseWriter, r *http.Request) { userID := r.Header.Get("Mattermost-User-ID") var request *model.SubmitDialogRequest err := json.NewDecoder(r.Body).Decode(&request) if err != nil || request == nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to decode SubmitDialogRequest", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to decode SubmitDialogRequest", err) return } if userID != request.UserId { - h.HandleErrorWithCode(w, http.StatusBadRequest, "interactive dialog's userID must be the same as the requester's userID", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "interactive dialog's userID must be the same as the requester's userID", nil) return } var state app.DialogState err = json.Unmarshal([]byte(request.State), &state) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to unmarshal dialog state", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to unmarshal dialog state", err) return } @@ -266,12 +264,12 @@ func (h *PlaybookRunHandler) createPlaybookRunFromDialog(w http.ResponseWriter, ) if err != nil { if errors.Is(err, app.ErrMalformedPlaybookRun) { - h.HandleErrorWithCode(w, http.StatusBadRequest, "unable to create playbook run", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to create playbook run", err) return } if errors.Is(err, app.ErrNoPermissions) { - h.HandleErrorWithCode(w, http.StatusForbidden, "not authorized to make runs from this playbook", err) + h.HandleErrorWithCode(w, c.logger, http.StatusForbidden, "not authorized to make runs from this playbook", err) return } @@ -292,7 +290,7 @@ func (h *PlaybookRunHandler) createPlaybookRunFromDialog(w http.ResponseWriter, return } - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -300,13 +298,13 @@ func (h *PlaybookRunHandler) createPlaybookRunFromDialog(w http.ResponseWriter, // certain keywords are posted in a channel), then we need to edit that original post if state.PromptPostID != "" { if err := h.editPromptPost(state.PromptPostID, playbookID, playbookRun.ID, userID, name); err != nil { - h.log.Warnf("failed editing the prompt post; error: %s", err.Error()) + c.logger.WithError(err).Error("failed editing the prompt post") } } channel, err := h.pluginAPI.Channel.Get(playbookRun.ChannelID) if err != nil { - h.HandleErrorWithCode(w, http.StatusInternalServerError, "unable to get new channel", err) + h.HandleErrorWithCode(w, c.logger, http.StatusInternalServerError, "unable to get new channel", err) return } @@ -324,7 +322,7 @@ func (h *PlaybookRunHandler) createPlaybookRunFromDialog(w http.ResponseWriter, }() if err := h.postPlaybookRunCreatedMessage(playbookRun, request.ChannelId); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -361,9 +359,9 @@ func (h *PlaybookRunHandler) editPromptPost(promptPostID string, playbookID stri // addToTimelineDialog handles the interactive dialog submission when a user clicks the // corresponding post action. -func (h *PlaybookRunHandler) addToTimelineDialog(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) addToTimelineDialog(c *Context, w http.ResponseWriter, r *http.Request) { if !h.licenseChecker.TimelineAllowed() { - h.HandleErrorWithCode(w, http.StatusForbidden, "timeline feature is not covered by current server license", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusForbidden, "timeline feature is not covered by current server license", nil) return } @@ -372,12 +370,12 @@ func (h *PlaybookRunHandler) addToTimelineDialog(w http.ResponseWriter, r *http. var request *model.SubmitDialogRequest err := json.NewDecoder(r.Body).Decode(&request) if err != nil || request == nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to decode SubmitDialogRequest", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to decode SubmitDialogRequest", err) return } if userID != request.UserId { - h.HandleErrorWithCode(w, http.StatusBadRequest, "interactive dialog's userID must be the same as the requester's userID", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "interactive dialog's userID must be the same as the requester's userID", nil) return } @@ -391,23 +389,23 @@ func (h *PlaybookRunHandler) addToTimelineDialog(w http.ResponseWriter, r *http. playbookRun, incErr := h.playbookRunService.GetPlaybookRun(playbookRunID) if incErr != nil { - h.HandleError(w, incErr) + h.HandleError(w, c.logger, incErr) return } - if !h.PermissionsCheck(w, h.permissions.RunManageProperties(userID, playbookRun.ID)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.RunManageProperties(userID, playbookRun.ID)) { return } var state app.DialogStateAddToTimeline err = json.Unmarshal([]byte(request.State), &state) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to unmarshal dialog state", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to unmarshal dialog state", err) return } if err = h.playbookRunService.AddPostToTimeline(playbookRunID, userID, state.PostID, summary); err != nil { - h.HandleError(w, errors.Wrap(err, "failed to add post to timeline")) + h.HandleError(w, c.logger, errors.Wrap(err, "failed to add post to timeline")) return } @@ -532,24 +530,24 @@ func (h *PlaybookRunHandler) getRequesterInfo(userID string) (app.RequesterInfo, } // getPlaybookRuns handles the GET /runs endpoint. -func (h *PlaybookRunHandler) getPlaybookRuns(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) getPlaybookRuns(c *Context, w http.ResponseWriter, r *http.Request) { userID := r.Header.Get("Mattermost-User-ID") filterOptions, err := parsePlaybookRunsFilterOptions(r.URL, userID) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "Bad parameter", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "Bad parameter", err) return } requesterInfo, err := h.getRequesterInfo(userID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } results, err := h.playbookRunService.GetPlaybookRuns(requesterInfo, *filterOptions) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -557,18 +555,18 @@ func (h *PlaybookRunHandler) getPlaybookRuns(w http.ResponseWriter, r *http.Requ } // getPlaybookRun handles the /runs/{id} endpoint. -func (h *PlaybookRunHandler) getPlaybookRun(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) getPlaybookRun(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) playbookRunID := vars["id"] userID := r.Header.Get("Mattermost-User-ID") - if !h.PermissionsCheck(w, h.permissions.RunView(userID, playbookRunID)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.RunView(userID, playbookRunID)) { return } playbookRunToGet, err := h.playbookRunService.GetPlaybookRun(playbookRunID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -576,18 +574,18 @@ func (h *PlaybookRunHandler) getPlaybookRun(w http.ResponseWriter, r *http.Reque } // getPlaybookRunMetadata handles the /runs/{id}/metadata endpoint. -func (h *PlaybookRunHandler) getPlaybookRunMetadata(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) getPlaybookRunMetadata(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) playbookRunID := vars["id"] userID := r.Header.Get("Mattermost-User-ID") - if !h.PermissionsCheck(w, h.permissions.RunView(userID, playbookRunID)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.RunView(userID, playbookRunID)) { return } playbookRunMetadata, err := h.playbookRunService.GetPlaybookRunMetadata(playbookRunID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -595,7 +593,7 @@ func (h *PlaybookRunHandler) getPlaybookRunMetadata(w http.ResponseWriter, r *ht } // getPlaybookRunByChannel handles the /runs/channel/{channel_id} endpoint. -func (h *PlaybookRunHandler) getPlaybookRunByChannel(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) getPlaybookRunByChannel(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) channelID := vars["channel_id"] userID := r.Header.Get("Mattermost-User-ID") @@ -603,25 +601,29 @@ func (h *PlaybookRunHandler) getPlaybookRunByChannel(w http.ResponseWriter, r *h playbookRunID, err := h.playbookRunService.GetPlaybookRunIDForChannel(channelID) if err != nil { if errors.Is(err, app.ErrNotFound) { - h.HandleErrorWithCode(w, http.StatusNotFound, "Not found", + h.HandleErrorWithCode(w, c.logger, http.StatusNotFound, "Not found", errors.Errorf("playbook run for channel id %s not found", channelID)) return } - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } if err := h.permissions.RunView(userID, playbookRunID); err != nil { - h.log.Warnf("User %s does not have permissions to get playbook run %s for channel %s", userID, playbookRunID, channelID) - h.HandleErrorWithCode(w, http.StatusNotFound, "Not found", + c.logger.WithFields(logrus.Fields{ + "user_id": userID, + "playbook_run_id": playbookRunID, + "channel_id": channelID, + }).Warn("User does not have permissions to get playbook run for channel") + h.HandleErrorWithCode(w, c.logger, http.StatusNotFound, "Not found", errors.Errorf("playbook run for channel id %s not found", channelID)) return } playbookRunToGet, err := h.playbookRunService.GetPlaybookRun(playbookRunID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -629,7 +631,7 @@ func (h *PlaybookRunHandler) getPlaybookRunByChannel(w http.ResponseWriter, r *h } // getOwners handles the /runs/owners api endpoint. -func (h *PlaybookRunHandler) getOwners(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) getOwners(c *Context, w http.ResponseWriter, r *http.Request) { teamID := r.URL.Query().Get("team_id") userID := r.Header.Get("Mattermost-User-ID") @@ -639,13 +641,13 @@ func (h *PlaybookRunHandler) getOwners(w http.ResponseWriter, r *http.Request) { requesterInfo, err := h.getRequesterInfo(userID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } owners, err := h.playbookRunService.GetOwners(requesterInfo, options) if err != nil { - h.HandleError(w, errors.Wrapf(err, "failed to get owners")) + h.HandleError(w, c.logger, errors.Wrapf(err, "failed to get owners")) return } @@ -656,24 +658,24 @@ func (h *PlaybookRunHandler) getOwners(w http.ResponseWriter, r *http.Request) { ReturnJSON(w, owners, http.StatusOK) } -func (h *PlaybookRunHandler) getChannels(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) getChannels(c *Context, w http.ResponseWriter, r *http.Request) { userID := r.Header.Get("Mattermost-User-ID") filterOptions, err := parsePlaybookRunsFilterOptions(r.URL, userID) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "Bad parameter", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "Bad parameter", err) return } requesterInfo, err := h.getRequesterInfo(userID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } playbookRuns, err := h.playbookRunService.GetPlaybookRuns(requesterInfo, *filterOptions) if err != nil { - h.HandleError(w, errors.Wrapf(err, "failed to get owners")) + h.HandleError(w, c.logger, errors.Wrapf(err, "failed to get owners")) return } @@ -686,7 +688,7 @@ func (h *PlaybookRunHandler) getChannels(w http.ResponseWriter, r *http.Request) } // changeOwner handles the /runs/{id}/change-owner api endpoint. -func (h *PlaybookRunHandler) changeOwner(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) changeOwner(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) userID := r.Header.Get("Mattermost-User-ID") @@ -694,23 +696,23 @@ func (h *PlaybookRunHandler) changeOwner(w http.ResponseWriter, r *http.Request) OwnerID string `json:"owner_id"` } if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "could not decode request body", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "could not decode request body", err) return } playbookRun, err := h.playbookRunService.GetPlaybookRun(vars["id"]) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } // Check if the target user (params.OwnerID) has permissions - if !h.PermissionsCheck(w, h.permissions.RunManageProperties(params.OwnerID, playbookRun.ID)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.RunManageProperties(params.OwnerID, playbookRun.ID)) { return } if err := h.playbookRunService.ChangeOwner(vars["id"], userID, params.OwnerID); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -718,29 +720,29 @@ func (h *PlaybookRunHandler) changeOwner(w http.ResponseWriter, r *http.Request) } // updateStatusD handles the POST /runs/{id}/status endpoint, user has edit permissions -func (h *PlaybookRunHandler) status(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) status(c *Context, w http.ResponseWriter, r *http.Request) { playbookRunID := mux.Vars(r)["id"] userID := r.Header.Get("Mattermost-User-ID") playbookRunToModify, err := h.playbookRunService.GetPlaybookRun(playbookRunID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } if !app.CanPostToChannel(userID, playbookRunToModify.ChannelID, h.pluginAPI) { - h.HandleErrorWithCode(w, http.StatusForbidden, "Not authorized", fmt.Errorf("user %s cannot post to playbook run channel %s", userID, playbookRunToModify.ChannelID)) + h.HandleErrorWithCode(w, c.logger, http.StatusForbidden, "Not authorized", fmt.Errorf("user %s cannot post to playbook run channel %s", userID, playbookRunToModify.ChannelID)) return } var options app.StatusUpdateOptions if err = json.NewDecoder(r.Body).Decode(&options); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "unable to decode body into StatusUpdateOptions", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to decode body into StatusUpdateOptions", err) return } if publicMsg, internalErr := h.updateStatus(playbookRunID, userID, options); internalErr != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, publicMsg, internalErr) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, publicMsg, internalErr) return } @@ -777,12 +779,12 @@ func (h *PlaybookRunHandler) updateStatus(playbookRunID, userID string, options } // updateStatusD handles the POST /runs/{id}/finish endpoint, user has edit permissions -func (h *PlaybookRunHandler) finish(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) finish(c *Context, w http.ResponseWriter, r *http.Request) { playbookRunID := mux.Vars(r)["id"] userID := r.Header.Get("Mattermost-User-ID") if err := h.playbookRunService.FinishPlaybookRun(playbookRunID, userID); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -797,18 +799,18 @@ func (h *PlaybookRunHandler) finish(w http.ResponseWriter, r *http.Request) { // permissions system and avoid checking channel membership. // // This approach will be deprecated as a step towards channel-playbook decoupling. -func (h *PlaybookRunHandler) getStatusUpdates(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) getStatusUpdates(c *Context, w http.ResponseWriter, r *http.Request) { playbookRunID := mux.Vars(r)["id"] userID := r.Header.Get("Mattermost-User-ID") - if !h.PermissionsCheck(w, h.permissions.RunView(userID, playbookRunID)) { - h.HandleErrorWithCode(w, http.StatusForbidden, "not authorized to get status updates", nil) + if !h.PermissionsCheck(w, c.logger, h.permissions.RunView(userID, playbookRunID)) { + h.HandleErrorWithCode(w, c.logger, http.StatusForbidden, "not authorized to get status updates", nil) return } playbookRun, err := h.playbookRunService.GetPlaybookRun(playbookRunID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -816,7 +818,8 @@ func (h *PlaybookRunHandler) getStatusUpdates(w http.ResponseWriter, r *http.Req for _, p := range playbookRun.StatusPosts { post, err := h.pluginAPI.Post.GetPost(p.ID) if err != nil { - h.log.Warnf("statusUpdates: can not retrieve post %s: %v ", p.ID, err) + c.logger.WithError(err).WithField("post_id", p.ID).Error("statusUpdates: can not retrieve post") + continue } // Given the fact that we are bypassing some permissions, @@ -835,12 +838,12 @@ func (h *PlaybookRunHandler) getStatusUpdates(w http.ResponseWriter, r *http.Req } // restore "un-finishes" a playbook run -func (h *PlaybookRunHandler) restore(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) restore(c *Context, w http.ResponseWriter, r *http.Request) { playbookRunID := mux.Vars(r)["id"] userID := r.Header.Get("Mattermost-User-ID") if err := h.playbookRunService.RestorePlaybookRun(playbookRunID, userID); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -849,97 +852,98 @@ func (h *PlaybookRunHandler) restore(w http.ResponseWriter, r *http.Request) { } // updateRunActions modifies status update broadcast settings. -func (h *PlaybookRunHandler) updateRunActions(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) updateRunActions(c *Context, w http.ResponseWriter, r *http.Request) { playbookRunID := mux.Vars(r)["id"] userID := r.Header.Get("Mattermost-User-ID") var params app.RunAction if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to unmarshal status update broadcast settings params state", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to unmarshal status update broadcast settings params state", err) return } if err := h.playbookRunService.UpdateRunActions(playbookRunID, userID, params); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } } -// RequestUpdate posts a status update request message in the run's channel -func (h *PlaybookRunHandler) requestUpdate(w http.ResponseWriter, r *http.Request) { +// requestUpdate posts a status update request message in the run's channel +func (h *PlaybookRunHandler) requestUpdate(c *Context, w http.ResponseWriter, r *http.Request) { playbookRunID := mux.Vars(r)["id"] userID := r.Header.Get("Mattermost-User-ID") - if !h.PermissionsCheck(w, h.permissions.RunView(userID, playbookRunID)) { - h.HandleErrorWithCode(w, http.StatusForbidden, "not authorized to post update request", nil) + if !h.PermissionsCheck(w, c.logger, h.permissions.RunView(userID, playbookRunID)) { + h.HandleErrorWithCode(w, c.logger, http.StatusForbidden, "not authorized to post update request", nil) return } if err := h.playbookRunService.RequestUpdate(playbookRunID, userID); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } } -// requestGetInvolved handles the request of a user who does not participate actively in a run -func (h *PlaybookRunHandler) requestGetInvolved(w http.ResponseWriter, r *http.Request) { +// requestJoinChannel posts a channel-join request message in the run's channel +func (h *PlaybookRunHandler) requestJoinChannel(c *Context, w http.ResponseWriter, r *http.Request) { playbookRunID := mux.Vars(r)["id"] userID := r.Header.Get("Mattermost-User-ID") - if !h.PermissionsCheck(w, h.permissions.RunView(userID, playbookRunID)) { - h.HandleErrorWithCode(w, http.StatusForbidden, "not authorized to post get-involved request", nil) + // user must be a participant to be able to request to join the channel + if !h.PermissionsCheck(w, c.logger, h.permissions.RunManageProperties(userID, playbookRunID)) { + h.HandleErrorWithCode(w, c.logger, http.StatusForbidden, "not authorized to request join channel", nil) return } - if err := h.playbookRunService.RequestGetInvolved(playbookRunID, userID); err != nil { - h.HandleError(w, err) + if err := h.playbookRunService.RequestJoinChannel(playbookRunID, userID); err != nil { + h.HandleError(w, c.logger, err) return } } // updateStatusDialog handles the POST /runs/{id}/finish-dialog endpoint, called when a // user submits the Finish Run dialog. -func (h *PlaybookRunHandler) finishDialog(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) finishDialog(c *Context, w http.ResponseWriter, r *http.Request) { playbookRunID := mux.Vars(r)["id"] userID := r.Header.Get("Mattermost-User-ID") playbookRun, incErr := h.playbookRunService.GetPlaybookRun(playbookRunID) if incErr != nil { - h.HandleError(w, incErr) + h.HandleError(w, c.logger, incErr) return } - if !h.PermissionsCheck(w, h.permissions.RunManageProperties(userID, playbookRun.ID)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.RunManageProperties(userID, playbookRun.ID)) { return } if err := h.playbookRunService.FinishPlaybookRun(playbookRunID, userID); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } } // updateStatusDialog handles the POST /runs/{id}/update-status-dialog endpoint, called when a // user submits the Update Status dialog. -func (h *PlaybookRunHandler) updateStatusDialog(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) updateStatusDialog(c *Context, w http.ResponseWriter, r *http.Request) { playbookRunID := mux.Vars(r)["id"] userID := r.Header.Get("Mattermost-User-ID") playbookRunToModify, err := h.playbookRunService.GetPlaybookRun(playbookRunID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } if !app.CanPostToChannel(userID, playbookRunToModify.ChannelID, h.pluginAPI) { - h.HandleErrorWithCode(w, http.StatusForbidden, "Not authorized", fmt.Errorf("user %s cannot post to playbook run channel %s", userID, playbookRunToModify.ChannelID)) + h.HandleErrorWithCode(w, c.logger, http.StatusForbidden, "Not authorized", fmt.Errorf("user %s cannot post to playbook run channel %s", userID, playbookRunToModify.ChannelID)) return } var request *model.SubmitDialogRequest err = json.NewDecoder(r.Body).Decode(&request) if err != nil || request == nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to decode SubmitDialogRequest", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to decode SubmitDialogRequest", err) return } @@ -952,7 +956,7 @@ func (h *PlaybookRunHandler) updateStatusDialog(w http.ResponseWriter, r *http.R var reminder int reminder, err = strconv.Atoi(reminderI.(string)) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } options.Reminder = time.Duration(reminder) @@ -966,7 +970,7 @@ func (h *PlaybookRunHandler) updateStatusDialog(w http.ResponseWriter, r *http.R } if publicMsg, internalErr := h.updateStatus(playbookRunID, userID, options); internalErr != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, publicMsg, internalErr) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, publicMsg, internalErr) return } @@ -975,27 +979,27 @@ func (h *PlaybookRunHandler) updateStatusDialog(w http.ResponseWriter, r *http.R // reminderButtonUpdate handles the POST /runs/{id}/reminder/button-update endpoint, called when a // user clicks on the reminder interactive button -func (h *PlaybookRunHandler) reminderButtonUpdate(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) reminderButtonUpdate(c *Context, w http.ResponseWriter, r *http.Request) { var requestData *model.PostActionIntegrationRequest err := json.NewDecoder(r.Body).Decode(&requestData) if err != nil || requestData == nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "missing request data", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "missing request data", nil) return } playbookRunID, err := h.playbookRunService.GetPlaybookRunIDForChannel(requestData.ChannelId) if err != nil { - h.HandleErrorWithCode(w, http.StatusInternalServerError, "error getting playbook run", + h.HandleErrorWithCode(w, c.logger, http.StatusInternalServerError, "error getting playbook run", errors.Wrapf(err, "reminderButtonUpdate failed to find playbookRunID for channelID: %s", requestData.ChannelId)) return } - if !h.PermissionsCheck(w, h.permissions.RunManageProperties(requestData.UserId, playbookRunID)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.RunManageProperties(requestData.UserId, playbookRunID)) { return } if err = h.playbookRunService.OpenUpdateStatusDialog(playbookRunID, requestData.TriggerId); err != nil { - h.HandleError(w, errors.New("reminderButtonUpdate failed to open update status dialog")) + h.HandleError(w, c.logger, errors.New("reminderButtonUpdate failed to open update status dialog")) return } @@ -1004,58 +1008,58 @@ func (h *PlaybookRunHandler) reminderButtonUpdate(w http.ResponseWriter, r *http // reminderButtonDismiss handles the POST /runs/{id}/reminder endpoint, called when a // user clicks on the reminder custom_update_status time selector -func (h *PlaybookRunHandler) reminderReset(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) reminderReset(c *Context, w http.ResponseWriter, r *http.Request) { playbookRunID := mux.Vars(r)["id"] userID := r.Header.Get("Mattermost-User-ID") var payload struct { NewReminderSeconds int `json:"new_reminder_seconds"` } if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } if payload.NewReminderSeconds <= 0 { - h.HandleErrorWithCode(w, http.StatusBadRequest, "new_reminder_seconds must be > 0", errors.New("new_reminder_seconds was <= 0")) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "new_reminder_seconds must be > 0", errors.New("new_reminder_seconds was <= 0")) return } storedPlaybookRun, err := h.playbookRunService.GetPlaybookRun(playbookRunID) if err != nil { err = errors.Wrapf(err, "reminderReset: no playbook run for path's playbookRunID: %s", playbookRunID) - h.HandleErrorWithCode(w, http.StatusBadRequest, "no playbook run for path's playbookRunID", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "no playbook run for path's playbookRunID", err) return } - if !h.PermissionsCheck(w, h.permissions.RunManageProperties(userID, storedPlaybookRun.ID)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.RunManageProperties(userID, storedPlaybookRun.ID)) { return } - if err = h.playbookRunService.SetNewReminder(playbookRunID, time.Duration(payload.NewReminderSeconds)*time.Second); err != nil { + if err = h.playbookRunService.ResetReminder(playbookRunID, time.Duration(payload.NewReminderSeconds)*time.Second); err != nil { err = errors.Wrapf(err, "reminderReset: error setting new reminder for playbookRunID %s", playbookRunID) - h.HandleErrorWithCode(w, http.StatusBadRequest, "error removing reminder post", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "error removing reminder post", err) return } w.WriteHeader(http.StatusNoContent) } -func (h *PlaybookRunHandler) noRetrospectiveButton(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) noRetrospectiveButton(c *Context, w http.ResponseWriter, r *http.Request) { playbookRunID := mux.Vars(r)["id"] userID := r.Header.Get("Mattermost-User-ID") playbookRunToCancelRetro, err := h.playbookRunService.GetPlaybookRun(playbookRunID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } - if !h.PermissionsCheck(w, h.permissions.RunManageProperties(userID, playbookRunToCancelRetro.ID)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.RunManageProperties(userID, playbookRunToCancelRetro.ID)) { return } if err := h.playbookRunService.CancelRetrospective(playbookRunToCancelRetro.ID, userID); err != nil { - h.HandleErrorWithCode(w, http.StatusInternalServerError, "unable to cancel retrospective", err) + h.HandleErrorWithCode(w, c.logger, http.StatusInternalServerError, "unable to cancel retrospective", err) return } @@ -1064,27 +1068,27 @@ func (h *PlaybookRunHandler) noRetrospectiveButton(w http.ResponseWriter, r *htt // removeTimelineEvent handles the DELETE /runs/{id}/timeline/{eventID} endpoint. // User has been authenticated to edit the playbook run. -func (h *PlaybookRunHandler) removeTimelineEvent(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) removeTimelineEvent(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id := vars["id"] userID := r.Header.Get("Mattermost-User-ID") eventID := vars["eventID"] if err := h.playbookRunService.RemoveTimelineEvent(id, userID, eventID); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusNoContent) } -func (h *PlaybookRunHandler) updateDescription(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) updateDescription(c *Context, w http.ResponseWriter, r *http.Request) { playbookRunID := mux.Vars(r)["id"] userID := r.Header.Get("Mattermost-User-ID") playbookRun, err := h.playbookRunService.GetPlaybookRun(playbookRunID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -1093,81 +1097,81 @@ func (h *PlaybookRunHandler) updateDescription(w http.ResponseWriter, r *http.Re } if err2 := json.NewDecoder(r.Body).Decode(&requestBody); err2 != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "unable to decode playbook run description", err2) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to decode playbook run description", err2) return } - if !h.PermissionsCheck(w, h.permissions.RunManageProperties(userID, playbookRun.ID)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.RunManageProperties(userID, playbookRun.ID)) { return } if err := h.playbookRunService.UpdateDescription(playbookRunID, requestBody.Description); err != nil { - h.HandleErrorWithCode(w, http.StatusInternalServerError, "unable to update description", err) + h.HandleErrorWithCode(w, c.logger, http.StatusInternalServerError, "unable to update description", err) return } ReturnJSON(w, nil, http.StatusOK) } -func (h *PlaybookRunHandler) getChecklistAutocompleteItem(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) getChecklistAutocompleteItem(c *Context, w http.ResponseWriter, r *http.Request) { query := r.URL.Query() channelID := query.Get("channel_id") userID := r.Header.Get("Mattermost-User-ID") - if !h.PermissionsCheck(w, h.permissions.RunViewByChannel(userID, channelID)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.RunViewByChannel(userID, channelID)) { return } playbookRunID, err := h.playbookRunService.GetPlaybookRunIDForChannel(channelID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } data, err := h.playbookRunService.GetChecklistItemAutocomplete(playbookRunID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } ReturnJSON(w, data, http.StatusOK) } -func (h *PlaybookRunHandler) getChecklistAutocomplete(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) getChecklistAutocomplete(c *Context, w http.ResponseWriter, r *http.Request) { query := r.URL.Query() channelID := query.Get("channel_id") userID := r.Header.Get("Mattermost-User-ID") - if !h.PermissionsCheck(w, h.permissions.RunViewByChannel(userID, channelID)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.RunViewByChannel(userID, channelID)) { return } playbookRunID, err := h.playbookRunService.GetPlaybookRunIDForChannel(channelID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } data, err := h.playbookRunService.GetChecklistAutocomplete(playbookRunID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } ReturnJSON(w, data, http.StatusOK) } -func (h *PlaybookRunHandler) itemSetState(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) itemSetState(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id := vars["id"] checklistNum, err := strconv.Atoi(vars["checklist"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse checklist", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse checklist", err) return } itemNum, err := strconv.Atoi(vars["item"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse item", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse item", err) return } userID := r.Header.Get("Mattermost-User-ID") @@ -1176,34 +1180,34 @@ func (h *PlaybookRunHandler) itemSetState(w http.ResponseWriter, r *http.Request NewState string `json:"new_state"` } if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to unmarshal", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to unmarshal", err) return } if !app.IsValidChecklistItemState(params.NewState) { - h.HandleErrorWithCode(w, http.StatusBadRequest, "bad parameter new state", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "bad parameter new state", nil) return } if err := h.playbookRunService.ModifyCheckedState(id, userID, params.NewState, checklistNum, itemNum); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } ReturnJSON(w, map[string]interface{}{}, http.StatusOK) } -func (h *PlaybookRunHandler) itemSetAssignee(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) itemSetAssignee(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id := vars["id"] checklistNum, err := strconv.Atoi(vars["checklist"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse checklist", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse checklist", err) return } itemNum, err := strconv.Atoi(vars["item"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse item", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse item", err) return } userID := r.Header.Get("Mattermost-User-ID") @@ -1212,21 +1216,21 @@ func (h *PlaybookRunHandler) itemSetAssignee(w http.ResponseWriter, r *http.Requ AssigneeID string `json:"assignee_id"` } if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to unmarshal", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to unmarshal", err) return } if err := h.playbookRunService.SetAssignee(id, userID, params.AssigneeID, checklistNum, itemNum); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } ReturnJSON(w, map[string]interface{}{}, http.StatusOK) } -func (h *PlaybookRunHandler) itemSetDueDate(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) itemSetDueDate(c *Context, w http.ResponseWriter, r *http.Request) { if !h.licenseChecker.ChecklistItemDueDateAllowed() { - h.HandleErrorWithCode(w, http.StatusForbidden, "checklist item due date feature is not covered by current server license", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusForbidden, "checklist item due date feature is not covered by current server license", nil) return } @@ -1234,12 +1238,12 @@ func (h *PlaybookRunHandler) itemSetDueDate(w http.ResponseWriter, r *http.Reque id := vars["id"] checklistNum, err := strconv.Atoi(vars["checklist"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse checklist", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse checklist", err) return } itemNum, err := strconv.Atoi(vars["item"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse item", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse item", err) return } userID := r.Header.Get("Mattermost-User-ID") @@ -1248,29 +1252,29 @@ func (h *PlaybookRunHandler) itemSetDueDate(w http.ResponseWriter, r *http.Reque DueDate int64 `json:"due_date"` } if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to unmarshal", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to unmarshal", err) return } if err := h.playbookRunService.SetDueDate(id, userID, params.DueDate, checklistNum, itemNum); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } ReturnJSON(w, map[string]interface{}{}, http.StatusOK) } -func (h *PlaybookRunHandler) itemSetCommand(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) itemSetCommand(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id := vars["id"] checklistNum, err := strconv.Atoi(vars["checklist"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse checklist", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse checklist", err) return } itemNum, err := strconv.Atoi(vars["item"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse item", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse item", err) return } userID := r.Header.Get("Mattermost-User-ID") @@ -1279,152 +1283,152 @@ func (h *PlaybookRunHandler) itemSetCommand(w http.ResponseWriter, r *http.Reque Command string `json:"command"` } if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to unmarshal", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to unmarshal", err) return } if err := h.playbookRunService.SetCommandToChecklistItem(id, userID, checklistNum, itemNum, params.Command); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } ReturnJSON(w, map[string]interface{}{}, http.StatusOK) } -func (h *PlaybookRunHandler) itemRun(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) itemRun(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) playbookRunID := vars["id"] checklistNum, err := strconv.Atoi(vars["checklist"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse checklist", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse checklist", err) return } itemNum, err := strconv.Atoi(vars["item"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse item", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse item", err) return } userID := r.Header.Get("Mattermost-User-ID") triggerID, err := h.playbookRunService.RunChecklistItemSlashCommand(playbookRunID, userID, checklistNum, itemNum) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } ReturnJSON(w, map[string]interface{}{"trigger_id": triggerID}, http.StatusOK) } -func (h *PlaybookRunHandler) itemDuplicate(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) itemDuplicate(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) playbookRunID := vars["id"] checklistNum, err := strconv.Atoi(vars["checklist"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse checklist", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse checklist", err) return } itemNum, err := strconv.Atoi(vars["item"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse item", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse item", err) return } userID := r.Header.Get("Mattermost-User-ID") if err := h.playbookRunService.DuplicateChecklistItem(playbookRunID, userID, checklistNum, itemNum); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusCreated) } -func (h *PlaybookRunHandler) addChecklist(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) addChecklist(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id := vars["id"] userID := r.Header.Get("Mattermost-User-ID") var checklist app.Checklist if err := json.NewDecoder(r.Body).Decode(&checklist); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to decode Checklist", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to decode Checklist", err) return } checklist.Title = strings.TrimSpace(checklist.Title) if checklist.Title == "" { - h.HandleErrorWithCode(w, http.StatusBadRequest, "bad parameter: checklist title", + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "bad parameter: checklist title", errors.New("checklist title must not be blank")) return } if err := h.playbookRunService.AddChecklist(id, userID, checklist); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusCreated) } -func (h *PlaybookRunHandler) removeChecklist(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) removeChecklist(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id := vars["id"] checklistNum, err := strconv.Atoi(vars["checklist"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse checklist", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse checklist", err) return } userID := r.Header.Get("Mattermost-User-ID") if err := h.playbookRunService.RemoveChecklist(id, userID, checklistNum); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusCreated) } -func (h *PlaybookRunHandler) duplicateChecklist(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) duplicateChecklist(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) playbookRunID := vars["id"] checklistNum, err := strconv.Atoi(vars["checklist"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse checklist", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse checklist", err) return } userID := r.Header.Get("Mattermost-User-ID") if err := h.playbookRunService.DuplicateChecklist(playbookRunID, userID, checklistNum); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusCreated) } -func (h *PlaybookRunHandler) addChecklistItem(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) addChecklistItem(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id := vars["id"] checklistNum, err := strconv.Atoi(vars["checklist"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse checklist", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse checklist", err) return } userID := r.Header.Get("Mattermost-User-ID") var checklistItem app.ChecklistItem if err := json.NewDecoder(r.Body).Decode(&checklistItem); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to decode ChecklistItem", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to decode ChecklistItem", err) return } checklistItem.Title = strings.TrimSpace(checklistItem.Title) if checklistItem.Title == "" { - h.HandleErrorWithCode(w, http.StatusBadRequest, "bad parameter: checklist item title", + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "bad parameter: checklist item title", errors.New("checklist item title must not be blank")) return } if err := h.playbookRunService.AddChecklistItem(id, userID, checklistNum, checklistItem); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -1432,25 +1436,25 @@ func (h *PlaybookRunHandler) addChecklistItem(w http.ResponseWriter, r *http.Req } // addChecklistItemDialog handles the interactive dialog submission when a user clicks add new task -func (h *PlaybookRunHandler) addChecklistItemDialog(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) addChecklistItemDialog(c *Context, w http.ResponseWriter, r *http.Request) { userID := r.Header.Get("Mattermost-User-ID") vars := mux.Vars(r) playbookRunID := vars["id"] checklistNum, err := strconv.Atoi(vars["checklist"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse checklist", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse checklist", err) return } var request *model.SubmitDialogRequest err = json.NewDecoder(r.Body).Decode(&request) if err != nil || request == nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to decode SubmitDialogRequest", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to decode SubmitDialogRequest", err) return } if userID != request.UserId { - h.HandleErrorWithCode(w, http.StatusBadRequest, "interactive dialog's userID must be the same as the requester's userID", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "interactive dialog's userID must be the same as the requester's userID", nil) return } @@ -1469,13 +1473,13 @@ func (h *PlaybookRunHandler) addChecklistItemDialog(w http.ResponseWriter, r *ht checklistItem.Title = strings.TrimSpace(checklistItem.Title) if checklistItem.Title == "" { - h.HandleErrorWithCode(w, http.StatusBadRequest, "bad parameter: checklist item title", + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "bad parameter: checklist item title", errors.New("checklist item title must not be blank")) return } if err := h.playbookRunService.AddChecklistItem(playbookRunID, userID, checklistNum, checklistItem); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -1483,122 +1487,122 @@ func (h *PlaybookRunHandler) addChecklistItemDialog(w http.ResponseWriter, r *ht } -func (h *PlaybookRunHandler) itemDelete(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) itemDelete(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id := vars["id"] checklistNum, err := strconv.Atoi(vars["checklist"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse checklist", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse checklist", err) return } itemNum, err := strconv.Atoi(vars["item"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse item", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse item", err) return } userID := r.Header.Get("Mattermost-User-ID") if err := h.playbookRunService.RemoveChecklistItem(id, userID, checklistNum, itemNum); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusNoContent) } -func (h *PlaybookRunHandler) checklistSkip(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) checklistSkip(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id := vars["id"] checklistNum, err := strconv.Atoi(vars["checklist"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse checklist", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse checklist", err) return } userID := r.Header.Get("Mattermost-User-ID") if err := h.playbookRunService.SkipChecklist(id, userID, checklistNum); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusNoContent) } -func (h *PlaybookRunHandler) checklistRestore(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) checklistRestore(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id := vars["id"] checklistNum, err := strconv.Atoi(vars["checklist"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse checklist", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse checklist", err) return } userID := r.Header.Get("Mattermost-User-ID") if err := h.playbookRunService.RestoreChecklist(id, userID, checklistNum); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusNoContent) } -func (h *PlaybookRunHandler) itemSkip(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) itemSkip(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id := vars["id"] checklistNum, err := strconv.Atoi(vars["checklist"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse checklist", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse checklist", err) return } itemNum, err := strconv.Atoi(vars["item"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse item", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse item", err) return } userID := r.Header.Get("Mattermost-User-ID") if err := h.playbookRunService.SkipChecklistItem(id, userID, checklistNum, itemNum); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusNoContent) } -func (h *PlaybookRunHandler) itemRestore(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) itemRestore(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id := vars["id"] checklistNum, err := strconv.Atoi(vars["checklist"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse checklist", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse checklist", err) return } itemNum, err := strconv.Atoi(vars["item"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse item", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse item", err) return } userID := r.Header.Get("Mattermost-User-ID") if err := h.playbookRunService.RestoreChecklistItem(id, userID, checklistNum, itemNum); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusNoContent) } -func (h *PlaybookRunHandler) itemEdit(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) itemEdit(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id := vars["id"] checklistNum, err := strconv.Atoi(vars["checklist"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse checklist", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse checklist", err) return } itemNum, err := strconv.Atoi(vars["item"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse item", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse item", err) return } userID := r.Header.Get("Mattermost-User-ID") @@ -1609,24 +1613,24 @@ func (h *PlaybookRunHandler) itemEdit(w http.ResponseWriter, r *http.Request) { Description string `json:"description"` } if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to unmarshal edit params state", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to unmarshal edit params state", err) return } if err := h.playbookRunService.EditChecklistItem(id, userID, checklistNum, itemNum, params.Title, params.Command, params.Description); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusOK) } -func (h *PlaybookRunHandler) renameChecklist(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) renameChecklist(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id := vars["id"] checklistNum, err := strconv.Atoi(vars["checklist"]) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to parse checklist", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to parse checklist", err) return } userID := r.Header.Get("Mattermost-User-ID") @@ -1635,25 +1639,25 @@ func (h *PlaybookRunHandler) renameChecklist(w http.ResponseWriter, r *http.Requ NewTitle string `json:"title"` } if err := json.NewDecoder(r.Body).Decode(&modificationParams); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to unmarshal new title", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to unmarshal new title", err) return } if modificationParams.NewTitle == "" { - h.HandleErrorWithCode(w, http.StatusBadRequest, "bad parameter: checklist title", + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "bad parameter: checklist title", errors.New("checklist title must not be blank")) return } if err := h.playbookRunService.RenameChecklist(id, userID, checklistNum, modificationParams.NewTitle); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusOK) } -func (h *PlaybookRunHandler) moveChecklist(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) moveChecklist(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id := vars["id"] userID := r.Header.Get("Mattermost-User-ID") @@ -1663,19 +1667,19 @@ func (h *PlaybookRunHandler) moveChecklist(w http.ResponseWriter, r *http.Reques DestChecklistIdx int `json:"dest_checklist_idx"` } if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to unmarshal edit params", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to unmarshal edit params", err) return } if err := h.playbookRunService.MoveChecklist(id, userID, params.SourceChecklistIdx, params.DestChecklistIdx); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusOK) } -func (h *PlaybookRunHandler) moveChecklistItem(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) moveChecklistItem(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id := vars["id"] userID := r.Header.Get("Mattermost-User-ID") @@ -1687,12 +1691,12 @@ func (h *PlaybookRunHandler) moveChecklistItem(w http.ResponseWriter, r *http.Re DestItemIdx int `json:"dest_item_idx"` } if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "failed to unmarshal edit params", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "failed to unmarshal edit params", err) return } if err := h.playbookRunService.MoveChecklistItem(id, userID, params.SourceChecklistIdx, params.SourceItemIdx, params.DestChecklistIdx, params.DestItemIdx); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -1713,7 +1717,7 @@ func (h *PlaybookRunHandler) postPlaybookRunCreatedMessage(playbookRun *app.Play return nil } -func (h *PlaybookRunHandler) updateRetrospective(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) updateRetrospective(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) playbookRunID := vars["id"] userID := r.Header.Get("Mattermost-User-ID") @@ -1721,19 +1725,19 @@ func (h *PlaybookRunHandler) updateRetrospective(w http.ResponseWriter, r *http. var retroUpdate app.RetrospectiveUpdate if err := json.NewDecoder(r.Body).Decode(&retroUpdate); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "unable to decode payload", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to decode payload", err) return } if err := h.playbookRunService.UpdateRetrospective(playbookRunID, userID, retroUpdate); err != nil { - h.HandleErrorWithCode(w, http.StatusInternalServerError, "unable to update retrospective", err) + h.HandleErrorWithCode(w, c.logger, http.StatusInternalServerError, "unable to update retrospective", err) return } w.WriteHeader(http.StatusOK) } -func (h *PlaybookRunHandler) publishRetrospective(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) publishRetrospective(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) playbookRunID := vars["id"] userID := r.Header.Get("Mattermost-User-ID") @@ -1741,58 +1745,58 @@ func (h *PlaybookRunHandler) publishRetrospective(w http.ResponseWriter, r *http var retroUpdate app.RetrospectiveUpdate if err := json.NewDecoder(r.Body).Decode(&retroUpdate); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "unable to decode payload", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to decode payload", err) return } if err := h.playbookRunService.PublishRetrospective(playbookRunID, userID, retroUpdate); err != nil { - h.HandleErrorWithCode(w, http.StatusInternalServerError, "unable to publish retrospective", err) + h.HandleErrorWithCode(w, c.logger, http.StatusInternalServerError, "unable to publish retrospective", err) return } w.WriteHeader(http.StatusOK) } -func (h *PlaybookRunHandler) follow(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) follow(c *Context, w http.ResponseWriter, r *http.Request) { playbookRunID := mux.Vars(r)["id"] userID := r.Header.Get("Mattermost-User-ID") - if !h.PermissionsCheck(w, h.permissions.RunView(userID, playbookRunID)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.RunView(userID, playbookRunID)) { return } if err := h.playbookRunService.Follow(playbookRunID, userID); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusOK) } -func (h *PlaybookRunHandler) unfollow(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) unfollow(c *Context, w http.ResponseWriter, r *http.Request) { playbookRunID := mux.Vars(r)["id"] userID := r.Header.Get("Mattermost-User-ID") if err := h.playbookRunService.Unfollow(playbookRunID, userID); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusOK) } -func (h *PlaybookRunHandler) getFollowers(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookRunHandler) getFollowers(c *Context, w http.ResponseWriter, r *http.Request) { playbookRunID := mux.Vars(r)["id"] userID := r.Header.Get("Mattermost-User-ID") - if !h.PermissionsCheck(w, h.permissions.RunView(userID, playbookRunID)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.RunView(userID, playbookRunID)) { return } var followers []string var err error if followers, err = h.playbookRunService.GetFollowers(playbookRunID); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } diff --git a/server/api/playbooks.go b/server/api/playbooks.go index 3781213e5e..0f0dd371f2 100644 --- a/server/api/playbooks.go +++ b/server/api/playbooks.go @@ -7,13 +7,15 @@ import ( "net/url" "strconv" "strings" + "time" "github.com/gorilla/mux" "github.com/mattermost/mattermost-plugin-playbooks/server/app" - "github.com/mattermost/mattermost-plugin-playbooks/server/bot" "github.com/mattermost/mattermost-plugin-playbooks/server/config" + "github.com/mattermost/mattermost-plugin-playbooks/server/timeutils" "github.com/mattermost/mattermost-server/v6/model" "github.com/pkg/errors" + "github.com/sirupsen/logrus" pluginapi "github.com/mattermost/mattermost-plugin-api" ) @@ -23,7 +25,6 @@ type PlaybookHandler struct { *ErrorHandler playbookService app.PlaybookService pluginAPI *pluginapi.Client - log bot.Logger config config.Service permissions *app.PermissionsService } @@ -32,59 +33,62 @@ const SettingsKey = "global_settings" const maxPlaybooksToAutocomplete = 15 // NewPlaybookHandler returns a new playbook api handler -func NewPlaybookHandler(router *mux.Router, playbookService app.PlaybookService, api *pluginapi.Client, log bot.Logger, configService config.Service, permissions *app.PermissionsService) *PlaybookHandler { +func NewPlaybookHandler(router *mux.Router, playbookService app.PlaybookService, api *pluginapi.Client, configService config.Service, permissions *app.PermissionsService) *PlaybookHandler { handler := &PlaybookHandler{ - ErrorHandler: &ErrorHandler{log: log}, + ErrorHandler: &ErrorHandler{}, playbookService: playbookService, pluginAPI: api, - log: log, config: configService, permissions: permissions, } playbooksRouter := router.PathPrefix("/playbooks").Subrouter() - playbooksRouter.HandleFunc("", handler.createPlaybook).Methods(http.MethodPost) + playbooksRouter.HandleFunc("", withContext(handler.createPlaybook)).Methods(http.MethodPost) - playbooksRouter.HandleFunc("", handler.getPlaybooks).Methods(http.MethodGet) - playbooksRouter.HandleFunc("/autocomplete", handler.getPlaybooksAutoComplete).Methods(http.MethodGet) - playbooksRouter.HandleFunc("/import", handler.importPlaybook).Methods(http.MethodPost) + playbooksRouter.HandleFunc("", withContext(handler.getPlaybooks)).Methods(http.MethodGet) + playbooksRouter.HandleFunc("/autocomplete", withContext(handler.getPlaybooksAutoComplete)).Methods(http.MethodGet) + playbooksRouter.HandleFunc("/import", withContext(handler.importPlaybook)).Methods(http.MethodPost) playbookRouter := playbooksRouter.PathPrefix("/{id:[A-Za-z0-9]+}").Subrouter() - playbookRouter.HandleFunc("", handler.getPlaybook).Methods(http.MethodGet) - playbookRouter.HandleFunc("", handler.updatePlaybook).Methods(http.MethodPut) - playbookRouter.HandleFunc("", handler.archivePlaybook).Methods(http.MethodDelete) - playbookRouter.HandleFunc("/restore", handler.restorePlaybook).Methods(http.MethodPut) - playbookRouter.HandleFunc("/export", handler.exportPlaybook).Methods(http.MethodGet) - playbookRouter.HandleFunc("/duplicate", handler.duplicatePlaybook).Methods(http.MethodPost) + playbookRouter.HandleFunc("", withContext(handler.getPlaybook)).Methods(http.MethodGet) + playbookRouter.HandleFunc("", withContext(handler.updatePlaybook)).Methods(http.MethodPut) + playbookRouter.HandleFunc("", withContext(handler.archivePlaybook)).Methods(http.MethodDelete) + playbookRouter.HandleFunc("/restore", withContext(handler.restorePlaybook)).Methods(http.MethodPut) + playbookRouter.HandleFunc("/export", withContext(handler.exportPlaybook)).Methods(http.MethodGet) + playbookRouter.HandleFunc("/duplicate", withContext(handler.duplicatePlaybook)).Methods(http.MethodPost) autoFollowsRouter := playbookRouter.PathPrefix("/autofollows").Subrouter() - autoFollowsRouter.HandleFunc("", handler.getAutoFollows).Methods(http.MethodGet) + autoFollowsRouter.HandleFunc("", withContext(handler.getAutoFollows)).Methods(http.MethodGet) autoFollowRouter := autoFollowsRouter.PathPrefix("/{userID:[A-Za-z0-9]+}").Subrouter() - autoFollowRouter.HandleFunc("", handler.autoFollow).Methods(http.MethodPut) - autoFollowRouter.HandleFunc("", handler.autoUnfollow).Methods(http.MethodDelete) + autoFollowRouter.HandleFunc("", withContext(handler.autoFollow)).Methods(http.MethodPut) + autoFollowRouter.HandleFunc("", withContext(handler.autoUnfollow)).Methods(http.MethodDelete) + + insightsRouter := playbooksRouter.PathPrefix("/insights").Subrouter() + insightsRouter.HandleFunc("/user/me", withContext(handler.getTopPlaybooksForUser)).Methods(http.MethodGet) + insightsRouter.HandleFunc("/teams/{teamID}", withContext(handler.getTopPlaybooksForTeam)).Methods(http.MethodGet) return handler } -func (h *PlaybookHandler) validPlaybook(w http.ResponseWriter, playbook *app.Playbook) bool { +func (h *PlaybookHandler) validPlaybook(w http.ResponseWriter, logger logrus.FieldLogger, playbook *app.Playbook) bool { if playbook.WebhookOnCreationEnabled { if err := app.ValidateWebhookURLs(playbook.WebhookOnCreationURLs); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, err.Error(), err) + h.HandleErrorWithCode(w, logger, http.StatusBadRequest, err.Error(), err) return false } } if playbook.WebhookOnStatusUpdateEnabled { if err := app.ValidateWebhookURLs(playbook.WebhookOnStatusUpdateURLs); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, err.Error(), err) + h.HandleErrorWithCode(w, logger, http.StatusBadRequest, err.Error(), err) return false } } if playbook.CategorizeChannelEnabled { if err := app.ValidateCategoryName(playbook.CategoryName); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "invalid category name", err) + h.HandleErrorWithCode(w, logger, http.StatusBadRequest, "invalid category name", err) return false } } @@ -93,16 +97,16 @@ func (h *PlaybookHandler) validPlaybook(w http.ResponseWriter, playbook *app.Pla playbook.SignalAnyKeywords = app.ProcessSignalAnyKeywords(playbook.SignalAnyKeywords) } - if playbook.BroadcastEnabled { + if playbook.BroadcastEnabled { //nolint for _, channelID := range playbook.BroadcastChannelIDs { channel, err := h.pluginAPI.Channel.Get(channelID) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "broadcasting to invalid channel ID", err) + h.HandleErrorWithCode(w, logger, http.StatusBadRequest, "broadcasting to invalid channel ID", err) return false } // check if channel is archived if channel.DeleteAt != 0 { - h.HandleErrorWithCode(w, http.StatusBadRequest, "broadcasting to archived channel", err) + h.HandleErrorWithCode(w, logger, http.StatusBadRequest, "broadcasting to archived channel", err) return false } } @@ -111,25 +115,25 @@ func (h *PlaybookHandler) validPlaybook(w http.ResponseWriter, playbook *app.Pla return true } -func (h *PlaybookHandler) createPlaybook(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookHandler) createPlaybook(c *Context, w http.ResponseWriter, r *http.Request) { userID := r.Header.Get("Mattermost-User-ID") var playbook app.Playbook if err := json.NewDecoder(r.Body).Decode(&playbook); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "unable to decode playbook", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to decode playbook", err) return } if playbook.ID != "" { - h.HandleErrorWithCode(w, http.StatusBadRequest, "Playbook given already has ID", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "Playbook given already has ID", nil) return } if playbook.ReminderTimerDefaultSeconds <= 0 { - h.HandleErrorWithCode(w, http.StatusBadRequest, "playbook ReminderTimerDefaultSeconds must be > 0", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "playbook ReminderTimerDefaultSeconds must be > 0", nil) return } - if !h.PermissionsCheck(w, h.permissions.PlaybookCreate(userID, playbook)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.PlaybookCreate(userID, playbook)) { return } @@ -143,18 +147,18 @@ func (h *PlaybookHandler) createPlaybook(w http.ResponseWriter, r *http.Request) } } - if !h.validPlaybook(w, &playbook) { + if !h.validPlaybook(w, c.logger, &playbook) { return } if err := h.validateMetrics(playbook); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "invalid metrics configs", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "invalid metrics configs", err) return } id, err := h.playbookService.Create(playbook, userID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -168,30 +172,30 @@ func (h *PlaybookHandler) createPlaybook(w http.ResponseWriter, r *http.Request) ReturnJSON(w, &result, http.StatusCreated) } -func (h *PlaybookHandler) getPlaybook(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookHandler) getPlaybook(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) playbookID := vars["id"] userID := r.Header.Get("Mattermost-User-ID") - if !h.PermissionsCheck(w, h.permissions.PlaybookView(userID, playbookID)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.PlaybookView(userID, playbookID)) { return } playbook, err := h.playbookService.Get(playbookID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } ReturnJSON(w, &playbook, http.StatusOK) } -func (h *PlaybookHandler) updatePlaybook(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookHandler) updatePlaybook(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) userID := r.Header.Get("Mattermost-User-ID") var playbook app.Playbook if err := json.NewDecoder(r.Body).Decode(&playbook); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "unable to decode playbook", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to decode playbook", err) return } @@ -199,96 +203,96 @@ func (h *PlaybookHandler) updatePlaybook(w http.ResponseWriter, r *http.Request) playbook.ID = vars["id"] oldPlaybook, err := h.playbookService.Get(playbook.ID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } if err := h.validateMetrics(playbook); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "invalid metrics configs", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "invalid metrics configs", err) return } - if !h.PermissionsCheck(w, h.permissions.PlaybookModifyWithFixes(userID, &playbook, oldPlaybook)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.PlaybookModifyWithFixes(userID, &playbook, oldPlaybook)) { return } if oldPlaybook.DeleteAt != 0 { - h.HandleErrorWithCode(w, http.StatusBadRequest, "Playbook cannot be modified", fmt.Errorf("playbook with id '%s' cannot be modified because it is archived", playbook.ID)) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "Playbook cannot be modified", fmt.Errorf("playbook with id '%s' cannot be modified because it is archived", playbook.ID)) return } - if !h.validPlaybook(w, &playbook) { + if !h.validPlaybook(w, c.logger, &playbook) { return } err = h.playbookService.Update(playbook, userID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusOK) } -func (h *PlaybookHandler) archivePlaybook(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookHandler) archivePlaybook(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) playbookID := vars["id"] userID := r.Header.Get("Mattermost-User-ID") playbookToArchive, err := h.playbookService.Get(playbookID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } - if !h.PermissionsCheck(w, h.permissions.DeletePlaybook(userID, playbookToArchive)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.DeletePlaybook(userID, playbookToArchive)) { return } err = h.playbookService.Archive(playbookToArchive, userID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusNoContent) } -func (h *PlaybookHandler) restorePlaybook(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookHandler) restorePlaybook(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) playbookID := vars["id"] userID := r.Header.Get("Mattermost-User-ID") playbookToRestore, err := h.playbookService.Get(playbookID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } - if !h.PermissionsCheck(w, h.permissions.DeletePlaybook(userID, playbookToRestore)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.DeletePlaybook(userID, playbookToRestore)) { return } err = h.playbookService.Restore(playbookToRestore, userID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusNoContent) } -func (h *PlaybookHandler) getPlaybooks(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookHandler) getPlaybooks(c *Context, w http.ResponseWriter, r *http.Request) { params := r.URL.Query() teamID := params.Get("team_id") userID := r.Header.Get("Mattermost-User-ID") opts, err := parseGetPlaybooksOptions(r.URL) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, fmt.Sprintf("failed to get playbooks: %s", err.Error()), nil) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, fmt.Sprintf("failed to get playbooks: %s", err.Error()), nil) return } - if teamID != "" && !h.PermissionsCheck(w, h.permissions.PlaybookList(userID, teamID)) { + if teamID != "" && !h.PermissionsCheck(w, c.logger, h.permissions.PlaybookList(userID, teamID)) { return } @@ -300,19 +304,19 @@ func (h *PlaybookHandler) getPlaybooks(w http.ResponseWriter, r *http.Request) { playbookResults, err := h.playbookService.GetPlaybooksForTeam(requesterInfo, teamID, opts) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } ReturnJSON(w, playbookResults, http.StatusOK) } -func (h *PlaybookHandler) getPlaybooksAutoComplete(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookHandler) getPlaybooksAutoComplete(c *Context, w http.ResponseWriter, r *http.Request) { query := r.URL.Query() teamID := query.Get("team_id") userID := r.Header.Get("Mattermost-User-ID") - if !h.PermissionsCheck(w, h.permissions.PlaybookList(userID, teamID)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.PlaybookList(userID, teamID)) { return } @@ -328,7 +332,7 @@ func (h *PlaybookHandler) getPlaybooksAutoComplete(w http.ResponseWriter, r *htt WithArchived: query.Get("with_archived") == "true", }) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -358,8 +362,12 @@ func parseGetPlaybooksOptions(u *url.URL) (app.PlaybookFilterOptions, error) { sortField = app.SortBySteps case "runs": sortField = app.SortByRuns + case "last_run_at": + sortField = app.SortByLastRunAt + case "active_runs": + sortField = app.SortByActiveRuns default: - return app.PlaybookFilterOptions{}, errors.Errorf("bad parameter 'sort' (%s): it should be empty or one of 'title', 'stages' or 'steps'", param) + return app.PlaybookFilterOptions{}, errors.Errorf("bad parameter 'sort' (%s): it should be empty or one of 'title', 'stages', 'steps', 'runs', 'last_run_at'", param) } var sortDirection app.SortDirection @@ -411,44 +419,44 @@ func parseGetPlaybooksOptions(u *url.URL) (app.PlaybookFilterOptions, error) { }, nil } -func (h *PlaybookHandler) autoFollow(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookHandler) autoFollow(c *Context, w http.ResponseWriter, r *http.Request) { playbookID := mux.Vars(r)["id"] currentUserID := r.Header.Get("Mattermost-User-ID") userID := mux.Vars(r)["userID"] if currentUserID != userID && !app.IsSystemAdmin(currentUserID, h.pluginAPI) { - h.HandleErrorWithCode(w, http.StatusForbidden, "User doesn't have permissions to make another user autofollow the playbook.", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusForbidden, "User doesn't have permissions to make another user autofollow the playbook.", nil) return } - if !h.PermissionsCheck(w, h.permissions.PlaybookView(userID, playbookID)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.PlaybookView(userID, playbookID)) { return } if err := h.playbookService.AutoFollow(playbookID, userID); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } w.WriteHeader(http.StatusOK) } -func (h *PlaybookHandler) autoUnfollow(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookHandler) autoUnfollow(c *Context, w http.ResponseWriter, r *http.Request) { playbookID := mux.Vars(r)["id"] currentUserID := r.Header.Get("Mattermost-User-ID") userID := mux.Vars(r)["userID"] if currentUserID != userID && !app.IsSystemAdmin(currentUserID, h.pluginAPI) { - h.HandleErrorWithCode(w, http.StatusForbidden, "User doesn't have permissions to make another user autofollow the playbook.", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusForbidden, "User doesn't have permissions to make another user autofollow the playbook.", nil) return } - if !h.PermissionsCheck(w, h.permissions.PlaybookView(userID, playbookID)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.PlaybookView(userID, playbookID)) { return } if err := h.playbookService.AutoUnfollow(playbookID, userID); err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -456,40 +464,40 @@ func (h *PlaybookHandler) autoUnfollow(w http.ResponseWriter, r *http.Request) { } // getAutoFollows returns the list of users that have marked this playbook for auto-following runs -func (h *PlaybookHandler) getAutoFollows(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookHandler) getAutoFollows(c *Context, w http.ResponseWriter, r *http.Request) { playbookID := mux.Vars(r)["id"] currentUserID := r.Header.Get("Mattermost-User-ID") - if !h.PermissionsCheck(w, h.permissions.PlaybookView(currentUserID, playbookID)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.PlaybookView(currentUserID, playbookID)) { return } autoFollowers, err := h.playbookService.GetAutoFollows(playbookID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } ReturnJSON(w, autoFollowers, http.StatusOK) } -func (h *PlaybookHandler) exportPlaybook(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookHandler) exportPlaybook(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) playbookID := vars["id"] userID := r.Header.Get("Mattermost-User-ID") playbook, err := h.playbookService.Get(playbookID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } - if !h.PermissionsCheck(w, h.permissions.PlaybookViewWithPlaybook(userID, playbook)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.PlaybookViewWithPlaybook(userID, playbook)) { return } export, err := app.GeneratePlaybookExport(playbook) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -498,28 +506,28 @@ func (h *PlaybookHandler) exportPlaybook(w http.ResponseWriter, r *http.Request) _, _ = w.Write(export) } -func (h *PlaybookHandler) duplicatePlaybook(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookHandler) duplicatePlaybook(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) playbookID := vars["id"] userID := r.Header.Get("Mattermost-User-ID") playbook, err := h.playbookService.Get(playbookID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } - if !h.PermissionsCheck(w, h.permissions.PlaybookViewWithPlaybook(userID, playbook)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.PlaybookViewWithPlaybook(userID, playbook)) { return } - if !h.PermissionsCheck(w, h.permissions.PlaybookCreate(userID, playbook)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.PlaybookCreate(userID, playbook)) { return } newPlaybookID, err := h.playbookService.Duplicate(playbook, userID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -531,7 +539,7 @@ func (h *PlaybookHandler) duplicatePlaybook(w http.ResponseWriter, r *http.Reque ReturnJSON(w, &result, http.StatusCreated) } -func (h *PlaybookHandler) importPlaybook(w http.ResponseWriter, r *http.Request) { +func (h *PlaybookHandler) importPlaybook(c *Context, w http.ResponseWriter, r *http.Request) { params := r.URL.Query() teamID := params.Get("team_id") userID := r.Header.Get("Mattermost-User-ID") @@ -540,18 +548,18 @@ func (h *PlaybookHandler) importPlaybook(w http.ResponseWriter, r *http.Request) Version int `json:"version"` } if err := json.NewDecoder(r.Body).Decode(&importBlock); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "unable to decode playbook import", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to decode playbook import", err) return } playbook := importBlock.Playbook if playbook.ID != "" { - h.HandleErrorWithCode(w, http.StatusBadRequest, "playbook import should not have ID field", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "playbook import should not have ID field", nil) return } if importBlock.Version != app.CurrentPlaybookExportVersion { - h.HandleErrorWithCode(w, http.StatusBadRequest, "Unsupported import version", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "Unsupported import version", nil) return } @@ -570,17 +578,17 @@ func (h *PlaybookHandler) importPlaybook(w http.ResponseWriter, r *http.Request) playbook.TeamID = teamID } - if !h.PermissionsCheck(w, h.permissions.PlaybookCreate(userID, playbook)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.PlaybookCreate(userID, playbook)) { return } - if !h.validPlaybook(w, &playbook) { + if !h.validPlaybook(w, c.logger, &playbook) { return } id, err := h.playbookService.Import(playbook, userID) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -609,3 +617,109 @@ func (h *PlaybookHandler) validateMetrics(pb app.Playbook) error { } return nil } + +func (h *PlaybookHandler) getTopPlaybooksForUser(c *Context, w http.ResponseWriter, r *http.Request) { + userID := r.Header.Get("Mattermost-User-ID") + params := r.URL.Query() + timeRange := params.Get("time_range") + teamID := params.Get("team_id") + if teamID == "" { + h.HandleErrorWithCode(w, c.logger, http.StatusNotImplemented, "invalid team_id parameter", errors.New("teamID cannot be empty")) + return + } + if !h.PermissionsCheck(w, c.logger, h.permissions.PlaybookList(userID, teamID)) { + return + } + + page, err := strconv.Atoi(params.Get("page")) + if err != nil { + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "error converting page parameter to integer", err) + return + } + perPage, err := strconv.Atoi(params.Get("per_page")) + if err != nil { + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "error converting per_page parameter to integer", err) + return + } + + // setting startTime as per user's location + user, err := h.pluginAPI.User.Get(userID) + if err != nil { + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to get user", err) + return + } + timezone, err := timeutils.GetUserTimezone(user) + if err != nil { + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to get user timezone", err) + return + } + if timezone == nil { + timezone = time.Now().UTC().Location() + } + // get unix time for duration + startTime := model.StartOfDayForTimeRange(timeRange, timezone) + + topPlaybooks, err := h.playbookService.GetTopPlaybooksForUser(teamID, userID, &model.InsightsOpts{ + StartUnixMilli: model.GetMillisForTime(*startTime), + Page: page, + PerPage: perPage, + }) + if err != nil { + h.HandleError(w, c.logger, err) + return + } + ReturnJSON(w, &topPlaybooks, http.StatusOK) +} + +func (h *PlaybookHandler) getTopPlaybooksForTeam(c *Context, w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + teamID := vars["teamID"] + userID := r.Header.Get("Mattermost-User-ID") + params := r.URL.Query() + timeRange := params.Get("time_range") + if teamID == "" { + h.HandleErrorWithCode(w, c.logger, http.StatusNotImplemented, "invalid team_id parameter", errors.New("teamID cannot be empty")) + return + } + if !h.PermissionsCheck(w, c.logger, h.permissions.PlaybookList(userID, teamID)) { + return + } + page, err := strconv.Atoi(params.Get("page")) + if err != nil { + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "error converting page parameter to integer", err) + return + } + perPage, err := strconv.Atoi(params.Get("per_page")) + if err != nil { + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "error converting per_page parameter to integer", err) + return + } + + // setting startTime as per user's location + user, err := h.pluginAPI.User.Get(userID) + if err != nil { + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to get user", err) + return + } + timezone, err := timeutils.GetUserTimezone(user) + if err != nil { + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to get user timezone", err) + return + } + if timezone == nil { + timezone = time.Now().UTC().Location() + } + // get unix time for duration + startTime := model.StartOfDayForTimeRange(timeRange, timezone) + + topPlaybooks, err := h.playbookService.GetTopPlaybooksForTeam(teamID, userID, &model.InsightsOpts{ + StartUnixMilli: model.GetMillisForTime(*startTime), + Page: page, + PerPage: perPage, + }) + if err != nil { + h.HandleError(w, c.logger, err) + return + } + ReturnJSON(w, &topPlaybooks, http.StatusOK) +} diff --git a/server/api/schema.graphqls b/server/api/schema.graphqls index b33b5be18c..b6651a2c5e 100644 --- a/server/api/schema.graphqls +++ b/server/api/schema.graphqls @@ -1,5 +1,21 @@ type Query { playbook(id: String!): Playbook + playbooks( + teamID: String = "", + sort: String = "title", + direction: String = "ASC", + searchTerm: String = "", + withArchived: Boolean = false, + withMembershipOnly: Boolean = false, + ): [Playbook!]! + + run(id: String!): Run + runs( + teamID: String = "", + sort: String = "", + statuses: [String!] = [], + participantOrFollowerID: String = "", + ): [Run!]! } type Mutation { @@ -8,6 +24,13 @@ type Mutation { addMetric(playbookID: String!, title: String!, description: String!, type: String!, target: Int): String! updateMetric(id: String!, title: String, description: String, target: Int): String! deleteMetric(id: String!): String! + + addPlaybookMember(playbookID: String!, userID: String!): String! + removePlaybookMember(playbookID: String!, userID: String!): String! + + updateRun(id: String!, updates: RunUpdates!): String! + addRunParticipants(runID: String!, userIDs: [String!]!): String! + removeRunParticipants(runID: String!, userIDs: [String!]!): String! } input PlaybookUpdates { @@ -144,3 +167,71 @@ type PlaybookMetricConfig { type: MetricType! target: Int } + +type Run { + id: String! + playbookID: String! + name: String! + ownerUserID: String! + channelID: String! + postID: String! + teamID: String! + isFavorite: Boolean! + currentStatus: String! + createAt: Float! + endAt: Float! + participantIDs: [String!]! + + summary: String! + summaryModifiedAt: Float! + checklists: [Checklist!]! + + retrospective: String! + retrospectivePublishedAt: Float! + retrospectiveReminderIntervalSeconds: Float! + retrospectiveEnabled: Boolean! + retrospectiveWasCanceled: Boolean! + + statusUpdateEnabled: Boolean! + statusUpdateBroadcastWebhooksEnabled: Boolean! + lastStatusUpdateAt: Float! + statusPosts: [StatusPost!]! + reminderPostId: String! + reminderMessageTemplate: String! + reminderTimerDefaultSeconds: Float! + previousReminder: Float! + + statusUpdateBroadcastChannelsEnabled: Boolean! + statusUpdateBroadcastWebhooksEnabled: Boolean! + broadcastChannelIDs: [String!]! + webhookOnStatusUpdateURLs: [String!]! + + timelineEvents: [TimelineEvent!]! + metadata: Metadata! +} + +type StatusPost { + id: String! + createAt: Float! + deleteAt: Float! +} + +type TimelineEvent { + id: String! + createAt: Float! + deleteAt: Float! + eventType: String! + details: String! + postID: String! + summary: String! + subjectUserID: String! + creatorUserID: String! +} + +input RunUpdates { + isFavorite: Boolean +} + +type Metadata { + followers: [String!]! +} diff --git a/server/api/settings.go b/server/api/settings.go index 64c1dfc575..f52d606ab8 100644 --- a/server/api/settings.go +++ b/server/api/settings.go @@ -5,7 +5,6 @@ import ( "github.com/gorilla/mux" "github.com/mattermost/mattermost-plugin-playbooks/client" - "github.com/mattermost/mattermost-plugin-playbooks/server/bot" "github.com/mattermost/mattermost-plugin-playbooks/server/config" pluginapi "github.com/mattermost/mattermost-plugin-api" @@ -15,16 +14,14 @@ import ( type SettingsHandler struct { *ErrorHandler pluginAPI *pluginapi.Client - log bot.Logger config config.Service } // NewSettingsHandler returns a new settings api handler -func NewSettingsHandler(router *mux.Router, api *pluginapi.Client, log bot.Logger, configService config.Service) *SettingsHandler { +func NewSettingsHandler(router *mux.Router, api *pluginapi.Client, configService config.Service) *SettingsHandler { handler := &SettingsHandler{ - ErrorHandler: &ErrorHandler{log: log}, + ErrorHandler: &ErrorHandler{}, pluginAPI: api, - log: log, config: configService, } diff --git a/server/api/signal.go b/server/api/signal.go index 45b38dbf20..d883696035 100644 --- a/server/api/signal.go +++ b/server/api/signal.go @@ -7,9 +7,9 @@ import ( "github.com/gorilla/mux" "github.com/mattermost/mattermost-plugin-playbooks/server/app" - "github.com/mattermost/mattermost-plugin-playbooks/server/bot" "github.com/mattermost/mattermost-server/v6/model" "github.com/pkg/errors" + "github.com/sirupsen/logrus" pluginapi "github.com/mattermost/mattermost-plugin-api" ) @@ -22,9 +22,9 @@ type SignalHandler struct { keywordsThreadIgnorer app.KeywordsThreadIgnorer } -func NewSignalHandler(router *mux.Router, api *pluginapi.Client, logger bot.Logger, playbookRunService app.PlaybookRunService, playbookService app.PlaybookService, keywordsThreadIgnorer app.KeywordsThreadIgnorer) *SignalHandler { +func NewSignalHandler(router *mux.Router, api *pluginapi.Client, playbookRunService app.PlaybookRunService, playbookService app.PlaybookService, keywordsThreadIgnorer app.KeywordsThreadIgnorer) *SignalHandler { handler := &SignalHandler{ - ErrorHandler: &ErrorHandler{log: logger}, + ErrorHandler: &ErrorHandler{}, api: api, playbookRunService: playbookRunService, playbookService: playbookService, @@ -34,82 +34,82 @@ func NewSignalHandler(router *mux.Router, api *pluginapi.Client, logger bot.Logg signalRouter := router.PathPrefix("/signal").Subrouter() keywordsRouter := signalRouter.PathPrefix("/keywords").Subrouter() - keywordsRouter.HandleFunc("/run-playbook", handler.playbookRun).Methods(http.MethodPost) - keywordsRouter.HandleFunc("/ignore-thread", handler.ignoreKeywords).Methods(http.MethodPost) + keywordsRouter.HandleFunc("/run-playbook", withContext(handler.playbookRun)).Methods(http.MethodPost) + keywordsRouter.HandleFunc("/ignore-thread", withContext(handler.ignoreKeywords)).Methods(http.MethodPost) return handler } -func (h *SignalHandler) playbookRun(w http.ResponseWriter, r *http.Request) { +func (h *SignalHandler) playbookRun(c *Context, w http.ResponseWriter, r *http.Request) { publicErrorMessage := "unable to decode post action integration request" var req *model.PostActionIntegrationRequest err := json.NewDecoder(r.Body).Decode(&req) if err != nil { - h.returnError(publicErrorMessage, err, w) + h.returnError(publicErrorMessage, err, c.logger, w) return } if req == nil { - h.returnError(publicErrorMessage, errors.New("nil request"), w) + h.returnError(publicErrorMessage, errors.New("nil request"), c.logger, w) return } id, err := getStringField("selected_option", req.Context, w) if err != nil { - h.returnError(publicErrorMessage, err, w) + h.returnError(publicErrorMessage, err, c.logger, w) return } isMobile, err := getBoolField("isMobile", req.Context, w) if err != nil { - h.returnError(publicErrorMessage, err, w) + h.returnError(publicErrorMessage, err, c.logger, w) return } postID, err := getStringField("postID", req.Context, w) if err != nil { - h.returnError(publicErrorMessage, err, w) + h.returnError(publicErrorMessage, err, c.logger, w) return } post, err := h.api.Post.GetPost(req.PostId) if err != nil { - h.returnError(fmt.Sprintf("unable to get original post with ID %q", postID), err, w) + h.returnError(fmt.Sprintf("unable to get original post with ID %q", postID), err, c.logger, w) return } pbook, err := h.playbookService.Get(id) if err != nil { - h.returnError("can't get chosen playbook", errors.Wrapf(err, "can't get chosen playbook, id - %s", id), w) + h.returnError("can't get chosen playbook", errors.Wrapf(err, "can't get chosen playbook, id - %s", id), c.logger, w) return } if err := h.playbookRunService.OpenCreatePlaybookRunDialog(req.TeamId, req.UserId, req.TriggerId, postID, "", []app.Playbook{pbook}, isMobile, post.Id); err != nil { - h.returnError("can't open dialog", errors.Wrap(err, "can't open a dialog"), w) + h.returnError("can't open dialog", errors.Wrap(err, "can't open a dialog"), c.logger, w) return } ReturnJSON(w, &model.PostActionIntegrationResponse{}, http.StatusOK) } -func (h *SignalHandler) ignoreKeywords(w http.ResponseWriter, r *http.Request) { +func (h *SignalHandler) ignoreKeywords(c *Context, w http.ResponseWriter, r *http.Request) { publicErrorMessage := "unable to decode post action integration request" var req *model.PostActionIntegrationRequest err := json.NewDecoder(r.Body).Decode(&req) if err != nil || req == nil { - h.returnError(publicErrorMessage, err, w) + h.returnError(publicErrorMessage, err, c.logger, w) return } postID, err := getStringField("postID", req.Context, w) if err != nil { - h.returnError(publicErrorMessage, err, w) + h.returnError(publicErrorMessage, err, c.logger, w) return } post, err := h.api.Post.GetPost(postID) if err != nil { - h.returnError(publicErrorMessage, err, w) + h.returnError(publicErrorMessage, err, c.logger, w) return } @@ -120,16 +120,16 @@ func (h *SignalHandler) ignoreKeywords(w http.ResponseWriter, r *http.Request) { ReturnJSON(w, &model.PostActionIntegrationResponse{}, http.StatusOK) if err := h.api.Post.DeletePost(req.PostId); err != nil { - h.returnError("unable to delete original post", err, w) + h.returnError("unable to delete original post", err, c.logger, w) return } } -func (h *SignalHandler) returnError(returnMessage string, err error, w http.ResponseWriter) { +func (h *SignalHandler) returnError(returnMessage string, err error, logger logrus.FieldLogger, w http.ResponseWriter) { resp := model.PostActionIntegrationResponse{ EphemeralText: fmt.Sprintf("Error: %s", returnMessage), } - h.log.Errorf(err.Error()) + logger.WithError(err).Warn(returnMessage) ReturnJSON(w, &resp, http.StatusOK) } diff --git a/server/api/stats.go b/server/api/stats.go index c1d31b3e83..f9fb3f3ee3 100644 --- a/server/api/stats.go +++ b/server/api/stats.go @@ -10,7 +10,6 @@ import ( "gopkg.in/guregu/null.v4" "github.com/gorilla/mux" - "github.com/mattermost/mattermost-plugin-playbooks/server/bot" "github.com/mattermost/mattermost-plugin-playbooks/server/sqlstore" "github.com/pkg/errors" @@ -20,18 +19,16 @@ import ( type StatsHandler struct { *ErrorHandler pluginAPI *pluginapi.Client - log bot.Logger statsStore *sqlstore.StatsStore playbookService app.PlaybookService permissions *app.PermissionsService licenseChecker app.LicenseChecker } -func NewStatsHandler(router *mux.Router, api *pluginapi.Client, log bot.Logger, statsStore *sqlstore.StatsStore, playbookService app.PlaybookService, permissions *app.PermissionsService, licenseChecker app.LicenseChecker) *StatsHandler { +func NewStatsHandler(router *mux.Router, api *pluginapi.Client, statsStore *sqlstore.StatsStore, playbookService app.PlaybookService, permissions *app.PermissionsService, licenseChecker app.LicenseChecker) *StatsHandler { handler := &StatsHandler{ - ErrorHandler: &ErrorHandler{log: log}, + ErrorHandler: &ErrorHandler{}, pluginAPI: api, - log: log, statsStore: statsStore, playbookService: playbookService, permissions: permissions, @@ -39,8 +36,8 @@ func NewStatsHandler(router *mux.Router, api *pluginapi.Client, log bot.Logger, } statsRouter := router.PathPrefix("/stats").Subrouter() - statsRouter.HandleFunc("/site", handler.playbookSiteStats).Methods(http.MethodGet) - statsRouter.HandleFunc("/playbook", handler.playbookStats).Methods(http.MethodGet) + statsRouter.HandleFunc("/site", withContext(handler.playbookSiteStats)).Methods(http.MethodGet) + statsRouter.HandleFunc("/playbook", withContext(handler.playbookStats)).Methods(http.MethodGet) return handler } @@ -81,9 +78,9 @@ func parsePlaybookStatsFilters(u *url.URL) (*sqlstore.StatsFilters, error) { } // playbookStats handles the internal plugin stats -func (h *StatsHandler) playbookStats(w http.ResponseWriter, r *http.Request) { +func (h *StatsHandler) playbookStats(c *Context, w http.ResponseWriter, r *http.Request) { if !h.licenseChecker.StatsAllowed() { - h.HandleErrorWithCode(w, http.StatusForbidden, "timeline feature is not covered by current server license", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusForbidden, "timeline feature is not covered by current server license", nil) return } @@ -91,11 +88,11 @@ func (h *StatsHandler) playbookStats(w http.ResponseWriter, r *http.Request) { filters, err := parsePlaybookStatsFilters(r.URL) if err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "Bad filters", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "Bad filters", err) return } - if !h.PermissionsCheck(w, h.permissions.PlaybookView(userID, filters.PlaybookID)) { + if !h.PermissionsCheck(w, c.logger, h.permissions.PlaybookView(userID, filters.PlaybookID)) { return } @@ -146,21 +143,21 @@ type PlaybookSiteStats struct { // Response 200: PlaybookSiteStats // Response 401: when user is not authenticated // Response 403: when user has no permissions to see stats -func (h *StatsHandler) playbookSiteStats(w http.ResponseWriter, r *http.Request) { +func (h *StatsHandler) playbookSiteStats(c *Context, w http.ResponseWriter, r *http.Request) { userID := r.Header.Get("Mattermost-User-ID") // user must have right to access analytics if !h.pluginAPI.User.HasPermissionTo(userID, model.PermissionGetAnalytics) { - h.HandleErrorWithCode(w, http.StatusForbidden, "user is not allowed to get site stats", nil) + h.HandleErrorWithCode(w, c.logger, http.StatusForbidden, "user is not allowed to get site stats", nil) return } totalPlaybooks, err := h.statsStore.TotalPlaybooks() if err != nil { - h.log.Warnf("playbookSiteStats failed: %w", err) + c.logger.WithError(err).Warn("playbookSiteStats failed fetching total playbooks") } totalRuns, err := h.statsStore.TotalPlaybookRuns() if err != nil { - h.log.Warnf("playbookSiteStats failed: %w", err) + c.logger.WithError(err).Warn("playbookSiteStats failed fetching total playbook runs") } ReturnJSON(w, &PlaybookSiteStats{ TotalPlaybooks: totalPlaybooks, diff --git a/server/api/telemetry.go b/server/api/telemetry.go index 055123b2d9..1e87cae203 100644 --- a/server/api/telemetry.go +++ b/server/api/telemetry.go @@ -21,6 +21,7 @@ type TelemetryHandler struct { playbookService app.PlaybookService permissions *app.PermissionsService playbookTelemetry app.PlaybookTelemetry + genericTelemetry app.GenericTelemetry botTelemetry bot.Telemetry pluginAPI *pluginapi.Client } @@ -30,43 +31,86 @@ func NewTelemetryHandler( router *mux.Router, playbookRunService app.PlaybookRunService, api *pluginapi.Client, - log bot.Logger, playbookRunTelemetry app.PlaybookRunTelemetry, playbookService app.PlaybookService, playbookTelemetry app.PlaybookTelemetry, + genericTelemetry app.GenericTelemetry, botTelemetry bot.Telemetry, permissions *app.PermissionsService, ) *TelemetryHandler { handler := &TelemetryHandler{ - ErrorHandler: &ErrorHandler{log: log}, + ErrorHandler: &ErrorHandler{}, playbookRunService: playbookRunService, playbookRunTelemetry: playbookRunTelemetry, playbookService: playbookService, playbookTelemetry: playbookTelemetry, + genericTelemetry: genericTelemetry, botTelemetry: botTelemetry, pluginAPI: api, permissions: permissions, } telemetryRouter := router.PathPrefix("/telemetry").Subrouter() + telemetryRouter.HandleFunc("", withContext(handler.createEvent)).Methods(http.MethodPost) startTrialRouter := telemetryRouter.PathPrefix("/start-trial").Subrouter() - startTrialRouter.HandleFunc("", handler.startTrial).Methods(http.MethodPost) + startTrialRouter.HandleFunc("", withContext(handler.startTrial)).Methods(http.MethodPost) playbookRunTelemetryRouterAuthorized := telemetryRouter.PathPrefix("/run").Subrouter() playbookRunTelemetryRouterAuthorized.Use(handler.checkPlaybookRunViewPermissions) - playbookRunTelemetryRouterAuthorized.HandleFunc("/{id:[A-Za-z0-9]+}", handler.telemetryForPlaybookRun).Methods(http.MethodPost) + playbookRunTelemetryRouterAuthorized.HandleFunc("/{id:[A-Za-z0-9]+}", withContext(handler.telemetryForPlaybookRun)).Methods(http.MethodPost) playbookTelemetryRouterAuthorized := telemetryRouter.PathPrefix("/playbook").Subrouter() playbookTelemetryRouterAuthorized.Use(handler.checkPlaybookViewPermissions) - playbookTelemetryRouterAuthorized.HandleFunc("/{id:[A-Za-z0-9]+}", handler.telemetryForPlaybook).Methods(http.MethodPost) + playbookTelemetryRouterAuthorized.HandleFunc("/{id:[A-Za-z0-9]+}", withContext(handler.telemetryForPlaybook)).Methods(http.MethodPost) templateRouter := telemetryRouter.PathPrefix("/template").Subrouter() - templateRouter.HandleFunc("", handler.telemetryForTemplate) + templateRouter.HandleFunc("", withContext(handler.telemetryForTemplate)) return handler } +type EventData struct { + Name string + Type app.TelemetryType + Properties map[string]interface{} +} + +func (h *TelemetryHandler) createEvent(c *Context, w http.ResponseWriter, r *http.Request) { + var event EventData + if err := json.NewDecoder(r.Body).Decode(&event); err != nil { + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to decode post body", err) + return + } + + if event.Properties == nil { + event.Properties = map[string]interface{}{} + } + event.Properties["UserActualID"] = r.Header.Get("Mattermost-User-ID") + + switch event.Type { + case app.TelemetryTypePage: + name, err := app.NewTelemetryPage(event.Name) + if err != nil { + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "invalid page tracking", err) + return + } + h.genericTelemetry.Page(name, event.Properties) + case app.TelemetryTypeTrack: + name, err := app.NewTelemetryTrack(event.Name) + if err != nil { + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "invalid event tracking", err) + return + } + h.genericTelemetry.Track(name, event.Properties) + default: + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "invalid type to be tracked", nil) + return + } + + w.WriteHeader(http.StatusNoContent) +} + func (h *TelemetryHandler) checkPlaybookRunViewPermissions(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) @@ -74,11 +118,12 @@ func (h *TelemetryHandler) checkPlaybookRunViewPermissions(next http.Handler) ht runID := vars["id"] if err := h.permissions.RunView(userID, runID); err != nil { + logger := getLogger(r) if errors.Is(err, app.ErrNoPermissions) { - h.HandleErrorWithCode(w, http.StatusForbidden, "Not authorized", err) + h.HandleErrorWithCode(w, logger, http.StatusForbidden, "Not authorized", err) return } - h.HandleError(w, err) + h.HandleError(w, logger, err) return } @@ -93,11 +138,12 @@ func (h *TelemetryHandler) checkPlaybookViewPermissions(next http.Handler) http. playbookID := vars["id"] if err := h.permissions.PlaybookView(userID, playbookID); err != nil { + logger := getLogger(r) if errors.Is(err, app.ErrNoPermissions) { - h.HandleErrorWithCode(w, http.StatusForbidden, "Not authorized", err) + h.HandleErrorWithCode(w, logger, http.StatusForbidden, "Not authorized", err) return } - h.HandleError(w, err) + h.HandleError(w, logger, err) return } @@ -111,25 +157,25 @@ type TrackerPayload struct { // telemetryForPlaybookRun handles the /telemetry/run/{id}?action=the_action endpoint. The frontend // can use this endpoint to track events that occur in the context of a playbook run. -func (h *TelemetryHandler) telemetryForPlaybookRun(w http.ResponseWriter, r *http.Request) { +func (h *TelemetryHandler) telemetryForPlaybookRun(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id := vars["id"] userID := r.Header.Get("Mattermost-User-ID") var params TrackerPayload if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "unable to decode post body", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to decode post body", err) return } if params.Action == "" { - h.HandleError(w, errors.New("must provide action")) + h.HandleError(w, c.logger, errors.New("must provide action")) return } playbookRun, err := h.playbookRunService.GetPlaybookRun(id) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -138,12 +184,12 @@ func (h *TelemetryHandler) telemetryForPlaybookRun(w http.ResponseWriter, r *htt w.WriteHeader(http.StatusNoContent) } -func (h *TelemetryHandler) startTrial(w http.ResponseWriter, r *http.Request) { +func (h *TelemetryHandler) startTrial(c *Context, w http.ResponseWriter, r *http.Request) { userID := r.Header.Get("Mattermost-User-ID") var params TrackerPayload if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "unable to decode post body", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to decode post body", err) return } @@ -154,25 +200,25 @@ func (h *TelemetryHandler) startTrial(w http.ResponseWriter, r *http.Request) { // telemetryForPlaybook handles the /telemetry/playbook/{id}?action=the_action endpoint. The frontend // can use this endpoint to track events that occur in the context of a playbook. -func (h *TelemetryHandler) telemetryForPlaybook(w http.ResponseWriter, r *http.Request) { +func (h *TelemetryHandler) telemetryForPlaybook(c *Context, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id := vars["id"] userID := r.Header.Get("Mattermost-User-ID") var params TrackerPayload if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "unable to decode post body", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to decode post body", err) return } if params.Action == "" { - h.HandleError(w, errors.New("must provide action")) + h.HandleError(w, c.logger, errors.New("must provide action")) return } playbook, err := h.playbookService.Get(id) if err != nil { - h.HandleError(w, err) + h.HandleError(w, c.logger, err) return } @@ -181,7 +227,7 @@ func (h *TelemetryHandler) telemetryForPlaybook(w http.ResponseWriter, r *http.R w.WriteHeader(http.StatusNoContent) } -func (h *TelemetryHandler) telemetryForTemplate(w http.ResponseWriter, r *http.Request) { +func (h *TelemetryHandler) telemetryForTemplate(c *Context, w http.ResponseWriter, r *http.Request) { userID := r.Header.Get("Mattermost-User-ID") var params struct { @@ -189,16 +235,16 @@ func (h *TelemetryHandler) telemetryForTemplate(w http.ResponseWriter, r *http.R Action string `json:"action"` } if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { - h.HandleErrorWithCode(w, http.StatusBadRequest, "unable to decode post body", err) + h.HandleErrorWithCode(w, c.logger, http.StatusBadRequest, "unable to decode post body", err) return } if params.TemplateName == "" { - h.HandleError(w, errors.New("must provide template_name")) + h.HandleError(w, c.logger, errors.New("must provide template_name")) return } if params.Action == "" { - h.HandleError(w, errors.New("must provide action")) + h.HandleError(w, c.logger, errors.New("must provide action")) return } diff --git a/server/api/urls.go b/server/api/urls.go index 9ce76adab3..26aca2a26f 100644 --- a/server/api/urls.go +++ b/server/api/urls.go @@ -7,6 +7,7 @@ import ( "github.com/mattermost/mattermost-server/v6/model" "github.com/pkg/errors" + "github.com/sirupsen/logrus" pluginapi "github.com/mattermost/mattermost-plugin-api" ) @@ -30,7 +31,7 @@ func getAPIBaseURL(pluginAPI *pluginapi.Client) (string, error) { func makeAPIURL(pluginAPI *pluginapi.Client, apiPath string, args ...interface{}) string { apiBaseURL, err := getAPIBaseURL(pluginAPI) if err != nil { - pluginAPI.Log.Warn("failed to build api base url", "err", err) + logrus.WithError(err).Error("failed to build api base url") apiBaseURL = defaultBaseAPIURL } diff --git a/server/api_graphql_playbooks_test.go b/server/api_graphql_playbooks_test.go index 94eefe4927..9967eeccbc 100644 --- a/server/api_graphql_playbooks_test.go +++ b/server/api_graphql_playbooks_test.go @@ -3,10 +3,12 @@ package main import ( "context" "strconv" + "strings" "testing" "github.com/graph-gophers/graphql-go" "github.com/mattermost/mattermost-plugin-playbooks/client" + "github.com/mattermost/mattermost-plugin-playbooks/server/api" "github.com/mattermost/mattermost-plugin-playbooks/server/app" "github.com/pkg/errors" "github.com/stretchr/testify/assert" @@ -45,6 +47,32 @@ func TestGraphQLPlaybooks(t *testing.T) { assert.Equal(t, e.BasicPlaybook.Title, pbResultTest.Data.Playbook.Title) }) + t.Run("list", func(t *testing.T) { + var pbResultTest struct { + Data struct { + Playbooks []struct { + ID string + Title string + } + } + } + testPlaybookQuery := ` + query Playbooks { + playbooks { + id + title + } + } + ` + err := e.PlaybooksAdminClient.DoGraphql(context.Background(), &client.GraphQLInput{ + Query: testPlaybookQuery, + OperationName: "Playbooks", + }, &pbResultTest) + require.NoError(t, err) + + assert.Len(t, pbResultTest.Data.Playbooks, 3) + }) + t.Run("playbook mutate", func(t *testing.T) { newUpdatedTitle := "graphqlmutatetitle" @@ -95,6 +123,30 @@ func TestGraphQLPlaybooks(t *testing.T) { require.Error(t, err) }) } +func TestGraphQLUpdatePlaybookFails(t *testing.T) { + e := Setup(t) + e.CreateBasic() + + t.Run("update playbook fails because size constraints.", func(t *testing.T) { + e.BasicPlaybook.BroadcastChannelIDs = []string{e.BasicPrivateChannel.Id} + + err := gqlTestPlaybookUpdate(e, t, e.BasicPlaybook.ID, map[string]interface{}{ + "checklists": []api.UpdateChecklist{ + { + Title: strings.Repeat("A", (256*1024)+1), + Items: []api.UpdateChecklistItem{}, + }, + }, + }) + require.Error(t, err) + + err = gqlTestPlaybookUpdate(e, t, e.BasicPlaybook.ID, map[string]interface{}{"title": strings.Repeat("A", 1025)}) + require.Error(t, err) + + err = gqlTestPlaybookUpdate(e, t, e.BasicPlaybook.ID, map[string]interface{}{"description": strings.Repeat("A", 4097)}) + require.Error(t, err) + }) +} func gqlTestPlaybookUpdate(e *TestEnvironment, t *testing.T, playbookID string, updates map[string]interface{}) error { testPlaybookMutateQuery := @@ -110,8 +162,12 @@ mutation UpdatePlaybook($id: String!, $updates: PlaybookUpdates!) { Variables: map[string]interface{}{"id": playbookID, "updates": updates}, }, &response) + if err != nil { + return errors.Wrapf(err, "gqlTestPlaybookUpdate graphql failure") + } + if len(response.Errors) != 0 { - return errors.Errorf("graphql failure %+v", response.Errors) + return errors.Errorf("gqlTestPlaybookUpdate graphql failure %+v", response.Errors) } return err diff --git a/server/api_graphql_runs_test.go b/server/api_graphql_runs_test.go new file mode 100644 index 0000000000..8a38c533d0 --- /dev/null +++ b/server/api_graphql_runs_test.go @@ -0,0 +1,247 @@ +package main + +import ( + "context" + "testing" + + "github.com/graph-gophers/graphql-go" + "github.com/mattermost/mattermost-plugin-playbooks/client" + "github.com/mattermost/mattermost-server/v6/app/request" + "github.com/mattermost/mattermost-server/v6/model" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestGraphQLRunList(t *testing.T) { + e := Setup(t) + e.CreateBasic() + + t.Run("list by participantOrFollower", func(t *testing.T) { + var rResultTest struct { + Data struct { + Runs []struct { + ID string + Name string + IsFavorite bool + } + } + Errors []struct { + Message string + Path string + } + } + testRunsQuery := ` + query Runs($userID: String!) { + runs(participantOrFollowerID: $userID) { + id + name + isFavorite + } + } + ` + err := e.PlaybooksClient.DoGraphql(context.Background(), &client.GraphQLInput{ + Query: testRunsQuery, + OperationName: "Runs", + Variables: map[string]interface{}{"userID": "me"}, + }, &rResultTest) + require.NoError(t, err) + + assert.Len(t, rResultTest.Data.Runs, 1) + assert.Equal(t, e.BasicRun.ID, rResultTest.Data.Runs[0].ID) + assert.Equal(t, e.BasicRun.Name, rResultTest.Data.Runs[0].Name) + assert.False(t, rResultTest.Data.Runs[0].IsFavorite) + }) +} + +func TestGraphQLChangeRunParticipants(t *testing.T) { + e := Setup(t) + e.CreateBasic() + + // create a third user to test multiple add/remove + user3, _, err := e.ServerAdminClient.CreateUser(&model.User{ + Email: "thirduser@example.com", + Username: "thirduser", + Password: "Password123!", + }) + require.NoError(e.T, err) + _, _, err = e.ServerAdminClient.AddTeamMember(e.BasicTeam.Id, user3.Id) + require.NoError(e.T, err) + + t.Run("add two participants", func(t *testing.T) { + response, err := addParticipants(e.PlaybooksClient, e.BasicRun.ID, []string{e.RegularUser2.Id, user3.Id}) + require.Empty(t, response.Errors) + require.NoError(t, err) + + run, err := e.PlaybooksClient.PlaybookRuns.Get(context.TODO(), e.BasicRun.ID) + require.NoError(t, err) + require.Len(t, run.ParticipantIDs, 3) + assert.Equal(t, e.RegularUser.Id, run.ParticipantIDs[0]) + assert.Equal(t, e.RegularUser2.Id, run.ParticipantIDs[1]) + assert.Equal(t, user3.Id, run.ParticipantIDs[2]) + + meta, err := e.PlaybooksClient.PlaybookRuns.GetMetadata(context.TODO(), e.BasicRun.ID) + require.NoError(t, err) + require.Len(t, meta.Followers, 3) + assert.Equal(t, e.RegularUser.Id, meta.Followers[0]) + assert.Equal(t, e.RegularUser2.Id, meta.Followers[1]) + assert.Equal(t, user3.Id, meta.Followers[2]) + + member, err := e.A.GetChannelMember(request.EmptyContext(nil), e.BasicRun.ChannelID, e.RegularUser2.Id) + require.Nil(t, err) + assert.Equal(t, e.RegularUser2.Id, member.UserId) + + member, err = e.A.GetChannelMember(request.EmptyContext(nil), e.BasicRun.ChannelID, user3.Id) + require.Nil(t, err) + assert.Equal(t, user3.Id, member.UserId) + + }) + + t.Run("remove two participants", func(t *testing.T) { + response, err := removeParticipants(e.PlaybooksClient, e.BasicRun.ID, []string{e.RegularUser2.Id, user3.Id}) + require.Empty(t, response.Errors) + require.NoError(t, err) + + run, err := e.PlaybooksClient.PlaybookRuns.Get(context.TODO(), e.BasicRun.ID) + require.NoError(t, err) + require.Len(t, run.ParticipantIDs, 1) + assert.Equal(t, e.RegularUser.Id, run.ParticipantIDs[0]) + + meta, err := e.PlaybooksClient.PlaybookRuns.GetMetadata(context.TODO(), e.BasicRun.ID) + require.NoError(t, err) + require.Len(t, meta.Followers, 1) + assert.Equal(t, e.RegularUser.Id, meta.Followers[0]) + + member, err := e.A.GetChannelMember(request.EmptyContext(nil), e.BasicRun.ChannelID, e.RegularUser2.Id) + require.NotNil(t, err) + assert.Nil(t, member) + + member, err = e.A.GetChannelMember(request.EmptyContext(nil), e.BasicRun.ChannelID, user3.Id) + require.NotNil(t, err) + assert.Nil(t, member) + }) + + t.Run("add participant to a public run with private channel", func(t *testing.T) { + + // This flow test a user with run access (regularUser) that adds another user (regularUser2) + // to a public run with a private channel + + pbID, err := e.PlaybooksAdminClient.Playbooks.Create(context.Background(), client.PlaybookCreateOptions{ + Title: "TestPrivatePlaybookNoMembers", + TeamID: e.BasicTeam.Id, + Public: true, + CreatePublicPlaybookRun: false, + }) + require.NoError(e.T, err) + + run, err := e.PlaybooksClient.PlaybookRuns.Create(context.Background(), client.PlaybookRunCreateOptions{ + Name: "Run with private channel", + OwnerUserID: e.RegularUser.Id, + TeamID: e.BasicTeam.Id, + PlaybookID: pbID, + }) + require.NoError(e.T, err) + require.NotNil(e.T, run) + + response, err := addParticipants(e.PlaybooksClient, run.ID, []string{e.RegularUser2.Id}) + require.Empty(t, response.Errors) + require.NoError(t, err) + + run, err = e.PlaybooksClient.PlaybookRuns.Get(context.TODO(), run.ID) + require.NoError(t, err) + require.Len(t, run.ParticipantIDs, 2) + assert.Equal(t, e.RegularUser.Id, run.ParticipantIDs[0]) + assert.Equal(t, e.RegularUser2.Id, run.ParticipantIDs[1]) + + meta, err := e.PlaybooksClient.PlaybookRuns.GetMetadata(context.TODO(), run.ID) + require.NoError(t, err) + require.Len(t, meta.Followers, 2) + assert.Equal(t, e.RegularUser.Id, meta.Followers[0]) + assert.Equal(t, e.RegularUser2.Id, meta.Followers[1]) + + member, err := e.A.GetChannelMember(request.EmptyContext(nil), run.ChannelID, e.RegularUser2.Id) + require.Nil(t, err) + assert.Equal(t, e.RegularUser2.Id, member.UserId) + }) + + t.Run("join a public run with private channel", func(t *testing.T) { + + // This flow test a user (regularUser2) that wants to participate a public run with a private channel + + pbID, err := e.PlaybooksAdminClient.Playbooks.Create(context.Background(), client.PlaybookCreateOptions{ + Title: "TestPrivatePlaybookNoMembers", + TeamID: e.BasicTeam.Id, + Public: true, + CreatePublicPlaybookRun: false, + }) + require.NoError(e.T, err) + + run, err := e.PlaybooksClient.PlaybookRuns.Create(context.Background(), client.PlaybookRunCreateOptions{ + Name: "Run with private channel", + OwnerUserID: e.RegularUser.Id, + TeamID: e.BasicTeam.Id, + PlaybookID: pbID, + }) + require.NoError(e.T, err) + require.NotNil(e.T, run) + + response, err := addParticipants(e.PlaybooksClient2, run.ID, []string{e.RegularUser2.Id}) + require.Empty(t, response.Errors) + require.NoError(t, err) + + run, err = e.PlaybooksClient.PlaybookRuns.Get(context.TODO(), run.ID) + require.NoError(t, err) + require.Len(t, run.ParticipantIDs, 2) + assert.Equal(t, e.RegularUser.Id, run.ParticipantIDs[0]) + assert.Equal(t, e.RegularUser2.Id, run.ParticipantIDs[1]) + + meta, err := e.PlaybooksClient.PlaybookRuns.GetMetadata(context.TODO(), run.ID) + require.NoError(t, err) + require.Len(t, meta.Followers, 2) + assert.Equal(t, e.RegularUser.Id, meta.Followers[0]) + assert.Equal(t, e.RegularUser2.Id, meta.Followers[1]) + + member, err := e.A.GetChannelMember(request.EmptyContext(nil), run.ChannelID, e.RegularUser2.Id) + require.Nil(t, member) + require.NotNil(t, err) + }) +} + +// AddParticipants adds participants to the run +func addParticipants(c *client.Client, playbookRunID string, userIDs []string) (graphql.Response, error) { + mutation := ` + mutation AddRunParticipants($runID: String!, $userIDs: [String!]!) { + addRunParticipants(runID: $runID, userIDs: $userIDs) + } + ` + var response graphql.Response + err := c.DoGraphql(context.Background(), &client.GraphQLInput{ + Query: mutation, + OperationName: "AddRunParticipants", + Variables: map[string]interface{}{ + "runID": playbookRunID, + "userIDs": userIDs, + }, + }, &response) + + return response, err +} + +// RemoveParticipants removes participants from the run +func removeParticipants(c *client.Client, playbookRunID string, userIDs []string) (graphql.Response, error) { + mutation := ` + mutation RemoveRunParticipants($runID: String!, $userIDs: [String!]!) { + removeRunParticipants(runID: $runID, userIDs: $userIDs) + } + ` + var response graphql.Response + err := c.DoGraphql(context.Background(), &client.GraphQLInput{ + Query: mutation, + OperationName: "RemoveRunParticipants", + Variables: map[string]interface{}{ + "runID": playbookRunID, + "userIDs": userIDs, + }, + }, &response) + + return response, err +} diff --git a/server/api_playbooks_test.go b/server/api_playbooks_test.go index 625c055860..4c80a58d88 100644 --- a/server/api_playbooks_test.go +++ b/server/api_playbooks_test.go @@ -6,6 +6,7 @@ import ( "fmt" "net/http" "strconv" + "strings" "testing" "github.com/mattermost/mattermost-plugin-playbooks/client" @@ -228,6 +229,40 @@ func TestPlaybooks(t *testing.T) { }) } +func TestCreateInvalidPlaybook(t *testing.T) { + e := Setup(t) + e.CreateClients() + e.CreateBasicServer() + + t.Run("fails if json is larger than 256K", func(t *testing.T) { + id, err := e.PlaybooksClient.Playbooks.Create(context.Background(), client.PlaybookCreateOptions{ + Title: "test1", + TeamID: e.BasicTeam.Id, + Public: true, + Checklists: []client.Checklist{ + { + Title: "checklist", + Items: []client.ChecklistItem{ + {Description: strings.Repeat("A", (256*1024)+1)}, + }, + }, + }, + }) + requireErrorWithStatusCode(t, err, http.StatusInternalServerError) + assert.Empty(t, id) + }) + + t.Run("fails if title is longer than 1024", func(t *testing.T) { + id, err := e.PlaybooksClient.Playbooks.Create(context.Background(), client.PlaybookCreateOptions{ + Title: strings.Repeat("A", 1025), + TeamID: e.BasicTeam.Id, + Public: true, + }) + requireErrorWithStatusCode(t, err, http.StatusInternalServerError) + assert.Empty(t, id) + }) +} + func TestPlaybooksRetrieval(t *testing.T) { e := Setup(t) e.CreateBasic() @@ -797,6 +832,8 @@ func TestPlaybooksPermissions(t *testing.T) { }) + oldMembers := e.BasicPlaybook.Members + t.Run("update playbook members", func(t *testing.T) { e.BasicPlaybook.Members = append(e.BasicPlaybook.Members, client.PlaybookMember{UserID: "testuser", Roles: []string{model.PlaybookMemberRoleId}}) @@ -823,8 +860,25 @@ func TestPlaybooksPermissions(t *testing.T) { err := e.PlaybooksClient.Playbooks.Update(context.Background(), *e.BasicPlaybook) assert.NoError(t, err) }) + + e.BasicPlaybook.Members = []client.PlaybookMember{} + t.Run("with permissions removal", func(t *testing.T) { + defaultRolePermissions := e.Permissions.SaveDefaultRolePermissions() + defer func() { + e.Permissions.RestoreDefaultRolePermissions(defaultRolePermissions) + }() + e.Permissions.AddPermissionToRole(model.PermissionPublicPlaybookManageProperties.Id, model.PlaybookMemberRoleId) + e.Permissions.AddPermissionToRole(model.PermissionPublicPlaybookManageMembers.Id, model.PlaybookMemberRoleId) + + err := e.PlaybooksClient.Playbooks.Update(context.Background(), *e.BasicPlaybook) + assert.NoError(t, err) + }) }) + e.BasicPlaybook.Members = oldMembers + err := e.PlaybooksAdminClient.Playbooks.Update(context.Background(), *e.BasicPlaybook) + require.NoError(t, err) + t.Run("update playbook roles", func(t *testing.T) { e.BasicPlaybook.Members[len(e.BasicPlaybook.Members)-1].Roles = append(e.BasicPlaybook.Members[len(e.BasicPlaybook.Members)-1].Roles, model.PlaybookAdminRoleId) diff --git a/server/api_runs_test.go b/server/api_runs_test.go index 1c091e47cd..c5fecfb330 100644 --- a/server/api_runs_test.go +++ b/server/api_runs_test.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "net/http" + "strings" "testing" "time" @@ -171,8 +172,6 @@ func TestRunCreation(t *testing.T) { }) assert.NoError(t, err) assert.NotNil(t, run) - // assert some data has been injected - assert.Len(t, run.ParticipantIDs, 1) }) t.Run("create valid run without playbook", func(t *testing.T) { @@ -282,6 +281,23 @@ func TestRunCreation(t *testing.T) { }) } +func TestCreateInvalidRuns(t *testing.T) { + e := Setup(t) + e.CreateBasic() + + t.Run("fails if description is longer than 4096", func(t *testing.T) { + run, err := e.PlaybooksClient.PlaybookRuns.Create(context.Background(), client.PlaybookRunCreateOptions{ + Name: "test run", + OwnerUserID: e.RegularUser.Id, + TeamID: e.BasicTeam.Id, + PlaybookID: e.BasicPlaybook.ID, + Description: strings.Repeat("A", 4097), + }) + requireErrorWithStatusCode(t, err, http.StatusInternalServerError) + assert.Nil(t, run) + }) +} + func TestRunRetrieval(t *testing.T) { e := Setup(t) e.CreateBasic() @@ -965,6 +981,30 @@ func TestChecklistManagement(t *testing.T) { } } +func TestChecklisFailTooLarge(t *testing.T) { + e := Setup(t) + e.CreateBasic() + + t.Run("checklist creation - failure: too large checklist", func(t *testing.T) { + run, err := e.PlaybooksClient.PlaybookRuns.Create(context.Background(), client.PlaybookRunCreateOptions{ + Name: "Run name", + OwnerUserID: e.RegularUser.Id, + TeamID: e.BasicTeam.Id, + PlaybookID: e.BasicPlaybook.ID, + }) + require.NoError(t, err) + require.Len(t, run.Checklists, 0) + + err = e.PlaybooksClient.PlaybookRuns.CreateChecklist(context.Background(), run.ID, client.Checklist{ + Title: "My regular title", + Items: []client.ChecklistItem{ + {Title: "Item title", Description: strings.Repeat("A", (256*1024)+1)}, + }, + }) + require.Error(t, err) + }) +} + func TestRunActions(t *testing.T) { e := Setup(t) e.CreateBasic() @@ -1199,6 +1239,8 @@ func TestRequestUpdate(t *testing.T) { lastEvent := privateRun.TimelineEvents[len(privateRun.TimelineEvents)-1] assert.Equal(t, client.StatusUpdateRequested, lastEvent.EventType) assert.Equal(t, e.RegularUser2.Id, lastEvent.SubjectUserID) + assert.Equal(t, e.RegularUser2.Id, lastEvent.CreatorUserID) + assert.NotZero(t, lastEvent.PostID) assert.Equal(t, "@playbooksuser2 requested a status update", lastEvent.Summary) }) @@ -1226,5 +1268,29 @@ func TestRequestUpdate(t *testing.T) { err = e.PlaybooksClientNotInTeam.PlaybookRuns.RequestUpdate(context.Background(), publicRun.ID, e.RegularUserNotInTeam.Id) assert.Error(t, err) }) +} +func TestReminderReset(t *testing.T) { + e := Setup(t) + e.CreateBasic() + + t.Run("reminder reset - event created", func(t *testing.T) { + payload := client.ReminderResetPayload{ + NewReminderSeconds: 100, + } + err := e.PlaybooksClient.Reminders.Reset(context.Background(), e.BasicRun.ID, payload) + assert.NoError(t, err) + + pb, err := e.PlaybooksClient.PlaybookRuns.Get(context.Background(), e.BasicRun.ID) + assert.NoError(t, err) + + statusSnoozed := make([]client.TimelineEvent, 0) + for _, te := range pb.TimelineEvents { + if te.EventType == "status_update_snoozed" { + statusSnoozed = append(statusSnoozed, te) + } + } + + require.Len(t, statusSnoozed, 1) + }) } diff --git a/server/api_telemetry_test.go b/server/api_telemetry_test.go new file mode 100644 index 0000000000..7a3c9ab10f --- /dev/null +++ b/server/api_telemetry_test.go @@ -0,0 +1,40 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +package main + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestCreateEvent(t *testing.T) { + e := Setup(t) + e.CreateBasic() + + t.Run("create an event with bad type fails", func(t *testing.T) { + err := e.PlaybooksClient.Telemetry.CreateEvent(context.Background(), "run_status_update", "bad_type", nil) + require.Error(t, err) + }) + + t.Run("create an event with bad name fails", func(t *testing.T) { + err := e.PlaybooksClient.Telemetry.CreateEvent(context.Background(), "bad_name", "page", nil) + require.Error(t, err) + }) + + t.Run("create an event correctly with no extra data", func(t *testing.T) { + err := e.PlaybooksClient.Telemetry.CreateEvent(context.Background(), "run_status_update", "page", nil) + require.NoError(t, err) + }) + + t.Run("create an event correctly with extra data", func(t *testing.T) { + extra := map[string]interface{}{ + "foo": "bar", + "baz": 5, + } + err := e.PlaybooksClient.Telemetry.CreateEvent(context.Background(), "run_status_update", "page", extra) + require.NoError(t, err) + }) +} diff --git a/server/app/actions_service.go b/server/app/actions_service.go index 8bc0a7d8fe..47c0cc0f6f 100644 --- a/server/app/actions_service.go +++ b/server/app/actions_service.go @@ -12,6 +12,7 @@ import ( "github.com/mattermost/mattermost-server/v6/model" "github.com/mitchellh/mapstructure" "github.com/pkg/errors" + "github.com/sirupsen/logrus" ) type PlaybookGetter interface { @@ -19,7 +20,6 @@ type PlaybookGetter interface { } type channelActionServiceImpl struct { - logger bot.Logger poster bot.Poster configService config.Service store ChannelActionStore @@ -29,9 +29,8 @@ type channelActionServiceImpl struct { telemetry ChannelActionTelemetry } -func NewChannelActionsService(api *pluginapi.Client, logger bot.Logger, poster bot.Poster, configService config.Service, store ChannelActionStore, playbookGetter PlaybookGetter, keywordsThreadIgnorer KeywordsThreadIgnorer, telemetry ChannelActionTelemetry) ChannelActionService { +func NewChannelActionsService(api *pluginapi.Client, poster bot.Poster, configService config.Service, store ChannelActionStore, playbookGetter PlaybookGetter, keywordsThreadIgnorer KeywordsThreadIgnorer, telemetry ChannelActionTelemetry) ChannelActionService { return &channelActionServiceImpl{ - logger: logger, poster: poster, configService: configService, store: store, @@ -204,13 +203,13 @@ func (a *channelActionServiceImpl) Update(action GenericChannelAction, userID st func (a *channelActionServiceImpl) UserHasJoinedChannel(userID, channelID, actorID string) { user, err := a.api.User.Get(userID) if err != nil { - a.logger.Errorf("failed to resolve user for userID '%s'; error: %s", userID, err.Error()) + logrus.WithError(err).Errorf("failed to resolve user for userID '%s'", userID) return } channel, err := a.api.Channel.Get(channelID) if err != nil { - a.logger.Errorf("failed to resolve channel for channelID '%s'; error: %s", channelID, err.Error()) + logrus.WithError(err).Errorf("failed to resolve channel for channelID '%s'", channelID) return } @@ -223,12 +222,16 @@ func (a *channelActionServiceImpl) UserHasJoinedChannel(userID, channelID, actor TriggerType: TriggerTypeNewMemberJoins, }) if err != nil { - a.logger.Errorf("failed to get the channel actions for channelID %q; error: %s", channelID, err.Error()) + logrus.WithError(err).Errorf("failed to get the channel actions for channelID %q", channelID) return } if len(actions) > 1 { - a.logger.Errorf("only one action of action type %s and trigger type %s is expected, but %d were retrieved", ActionTypeCategorizeChannel, TriggerTypeNewMemberJoins, len(actions)) + logrus.WithFields(logrus.Fields{ + "action_type": ActionTypeCategorizeChannel, + "trigger_type": TriggerTypeNewMemberJoins, + "num_actions": len(actions), + }).Errorf("expected only one action to be retrived") } if len(actions) != 1 { @@ -242,7 +245,7 @@ func (a *channelActionServiceImpl) UserHasJoinedChannel(userID, channelID, actor var payload CategorizeChannelPayload if err := mapstructure.Decode(action.Payload, &payload); err != nil { - a.logger.Errorf("unable to decode payload of CategorizeChannelPayload") + logrus.WithError(err).Error("unable to decode payload of CategorizeChannelPayload") return } @@ -260,7 +263,7 @@ func (a *channelActionServiceImpl) UserHasJoinedChannel(userID, channelID, actor err = a.createOrUpdatePlaybookRunSidebarCategory(userID, channelID, channel.TeamId, payload.CategoryName) if err != nil { - a.logger.Errorf("failed to categorize channel; error: %s", err.Error()) + logrus.WithError(err).Error("failed to categorize channel") } a.telemetry.RunChannelAction(action, userID) @@ -347,7 +350,10 @@ func (a *channelActionServiceImpl) CheckAndSendMessageOnJoin(userID, channelID s TriggerType: TriggerTypeNewMemberJoins, }) if err != nil { - a.logger.Errorf("failed to resolve actions for channelID %q and trigger type %q; error: %q", channelID, TriggerTypeNewMemberJoins, err.Error()) + logrus.WithError(err).WithFields(logrus.Fields{ + "channel_id": channelID, + "trigger_type": TriggerTypeNewMemberJoins, + }).Error("failed to resolve actions") return false } @@ -361,7 +367,7 @@ func (a *channelActionServiceImpl) CheckAndSendMessageOnJoin(userID, channelID s if action.ActionType == ActionTypeWelcomeMessage { var payload WelcomeMessagePayload if err := mapstructure.Decode(action.Payload, &payload); err != nil { - a.logger.Errorf("payload of action of type %q is not valid", action.ActionType) + logrus.WithError(err).WithField("action_type", action.ActionType).Error("payload of action is not valid") } // Run the action @@ -386,7 +392,10 @@ func (a *channelActionServiceImpl) MessageHasBeenPosted(sessionID string, post * ActionType: ActionTypePromptRunPlaybook, }) if err != nil { - a.api.Log.Error("unable to retrieve channel actions", "channelID", post.ChannelId, "triggerType", TriggerTypeKeywordsPosted) + logrus.WithError(err).WithFields(logrus.Fields{ + "channel_id": post.ChannelId, + "trigger_type": TriggerTypeKeywordsPosted, + }).Error("unable to retrieve channel actions") return } @@ -397,7 +406,7 @@ func (a *channelActionServiceImpl) MessageHasBeenPosted(sessionID string, post * session, err := a.api.Session.Get(sessionID) if err != nil { - a.api.Log.Error("can't get session", "sessionID", sessionID, "err", err.Error()) + logrus.WithError(err).WithField("session_id", sessionID).Error("can't get session") return } @@ -410,7 +419,11 @@ func (a *channelActionServiceImpl) MessageHasBeenPosted(sessionID string, post * var payload PromptRunPlaybookFromKeywordsPayload if err := mapstructure.Decode(action.Payload, &payload); err != nil { - a.api.Log.Error("unable to decode payload from action", "payload", payload, "actionType", action.ActionType, "triggerType", action.TriggerType) + logrus.WithError(err).WithFields(logrus.Fields{ + "payload": payload, + "actionType": action.ActionType, + "triggerType": action.TriggerType, + }).Error("unable to decode payload from action") continue } @@ -420,7 +433,7 @@ func (a *channelActionServiceImpl) MessageHasBeenPosted(sessionID string, post * suggestedPlaybook, err := a.playbookGetter.Get(payload.PlaybookID) if err != nil { - a.api.Log.Error("unable to get playbook to run action", "playbookID", payload.PlaybookID) + logrus.WithError(err).WithField("playbook_id", payload.PlaybookID).Error("unable to get playbook to run action") continue } @@ -462,7 +475,7 @@ func (a *channelActionServiceImpl) MessageHasBeenPosted(sessionID string, post * } model.ParseSlackAttachment(newPost, []*model.SlackAttachment{attachment}) if err := a.poster.PostMessageToThread(rootID, newPost); err != nil { - a.api.Log.Error("unable to post message with suggestions to run playbooks", "error", err) + logrus.WithError(err).Error("unable to post message with suggestions to run playbooks") } } diff --git a/server/app/category.go b/server/app/category.go index 5441486d61..2084102dbc 100644 --- a/server/app/category.go +++ b/server/app/category.go @@ -138,3 +138,11 @@ type CategoryStore interface { // DeleteItemFromCategory adds an item to category DeleteItemFromCategory(item CategoryItem, categoryID string) error } + +type CategoryTelemetry interface { + // FavoriteItem tracks run favoriting of an item. Item can be run or a playbook + FavoriteItem(item CategoryItem, userID string) + + // UnfavoriteItem tracks run unfavoriting of an item. Item can be run or a playbook + UnfavoriteItem(item CategoryItem, userID string) +} diff --git a/server/app/category_service.go b/server/app/category_service.go index 615719235d..2477b860f7 100644 --- a/server/app/category_service.go +++ b/server/app/category_service.go @@ -9,15 +9,17 @@ import ( ) type categoryService struct { - store CategoryStore - api *pluginapi.Client + store CategoryStore + api *pluginapi.Client + telemetry CategoryTelemetry } // NewPlaybookService returns a new playbook service -func NewCategoryService(store CategoryStore, api *pluginapi.Client) CategoryService { +func NewCategoryService(store CategoryStore, api *pluginapi.Client, categoryTelemetry CategoryTelemetry) CategoryService { return &categoryService{ - store: store, - api: api, + store: store, + api: api, + telemetry: categoryTelemetry, } } @@ -89,7 +91,12 @@ func (c *categoryService) Delete(categoryID string) error { // AddFavorite favorites an item, which may be either run or playbook func (c *categoryService) AddFavorite(item CategoryItem, teamID, userID string) error { - return c.store.AddItemToFavoriteCategory(item, teamID, userID) + if err := c.store.AddItemToFavoriteCategory(item, teamID, userID); err != nil { + return errors.Wrap(err, "failed to add favorite") + } + + c.telemetry.FavoriteItem(item, userID) + return nil } func (c *categoryService) DeleteFavorite(item CategoryItem, teamID, userID string) error { @@ -110,6 +117,8 @@ func (c *categoryService) DeleteFavorite(item CategoryItem, teamID, userID strin if err := c.store.DeleteItemFromCategory(item, favoriteCategory.ID); err != nil { return errors.Wrap(err, "can't delete item from favorite category") } + + c.telemetry.UnfavoriteItem(item, userID) return nil } diff --git a/server/app/permissions_service.go b/server/app/permissions_service.go index 81522320a1..f8476d63c3 100644 --- a/server/app/permissions_service.go +++ b/server/app/permissions_service.go @@ -8,6 +8,7 @@ import ( "github.com/mattermost/mattermost-plugin-playbooks/server/config" "github.com/mattermost/mattermost-server/v6/model" "github.com/pkg/errors" + "github.com/sirupsen/logrus" ) // ErrNoPermissions if the error is caused by the user not having permissions @@ -70,15 +71,6 @@ func (p *PermissionsService) getPlaybookRole(userID string, playbook Playbook) [ return []string{} } -func (p *PermissionsService) getRunRole(userID string, run *PlaybookRun) []string { - // For now, everyone with access to the channel is a run admin - if p.pluginAPI.User.HasPermissionToChannel(userID, run.ChannelID, model.PermissionReadChannel) { - return []string{RunRoleMember, RunRoleAdmin} - } - - return []string{} -} - func (p *PermissionsService) hasPermissionsToPlaybook(userID string, playbook Playbook, permission *model.Permission) bool { // Check at playbook level if p.pluginAPI.User.RolesGrantPermission(p.getPlaybookRole(userID, playbook), permission.Id) { @@ -89,16 +81,6 @@ func (p *PermissionsService) hasPermissionsToPlaybook(userID string, playbook Pl return p.pluginAPI.User.HasPermissionToTeam(userID, playbook.TeamID, permission) } -func (p *PermissionsService) hasPermissionsToRun(userID string, run *PlaybookRun, permission *model.Permission) bool { - // Check at run level - if p.pluginAPI.User.RolesGrantPermission(p.getRunRole(userID, run), permission.Id) { - return true - } - - // Cascade normally to higher level permissions - return p.pluginAPI.User.HasPermissionToTeam(userID, run.TeamID, permission) -} - func (p *PermissionsService) canViewTeam(userID string, teamID string) bool { if teamID == "" || userID == "" { return false @@ -193,7 +175,10 @@ func (p *PermissionsService) PlaybookModifyWithFixes(userID string, playbook *Pl if playbook.DefaultOwnerID != "" { if !p.pluginAPI.User.HasPermissionToTeam(playbook.DefaultOwnerID, playbook.TeamID, model.PermissionViewTeam) { - p.pluginAPI.Log.Warn("owner is not a member of the playbook's team, disabling default owner", "teamID", playbook.TeamID, "userID", playbook.DefaultOwnerID) + logrus.WithFields(logrus.Fields{ + "team_id": playbook.TeamID, + "user_id": playbook.DefaultOwnerID, + }).Warn("owner is not a member of the playbook's team, disabling default owner") playbook.DefaultOwnerID = "" playbook.DefaultOwnerEnabled = false } @@ -248,7 +233,10 @@ func (p *PermissionsService) FilterInvitedUserIDs(invitedUserIDs []string, teamI filteredUsers := []string{} for _, userID := range invitedUserIDs { if !p.pluginAPI.User.HasPermissionToTeam(userID, teamID, model.PermissionViewTeam) { - p.pluginAPI.Log.Warn("user does not have permissions to playbook's team, removing from automated invite list", "teamID", teamID, "userID", userID) + logrus.WithFields(logrus.Fields{ + "team_id": teamID, + "user_id": userID, + }).Warn("user does not have permissions to playbook's team, removing from automated invite list") continue } filteredUsers = append(filteredUsers, userID) @@ -262,12 +250,12 @@ func (p *PermissionsService) FilterInvitedGroupIDs(invitedGroupIDs []string) []s var group *model.Group group, err := p.pluginAPI.Group.Get(groupID) if err != nil { - p.pluginAPI.Log.Warn("failed to query group", "group_id", groupID) + logrus.WithField("group_id", groupID).Error("failed to query group") continue } if !group.AllowReference { - p.pluginAPI.Log.Warn("group does not allow references, removing from automated invite list", "group_id", groupID) + logrus.WithField("group_id", groupID).Warn("group does not allow references, removing from automated invite list") continue } @@ -399,7 +387,17 @@ func (p *PermissionsService) RunManageProperties(userID, runID string) error { return errors.Wrapf(err, "Unable to get run to determine permissions, run id `%s`", runID) } - if p.hasPermissionsToRun(userID, run, model.PermissionRunManageProperties) { + if run.OwnerUserID == userID { + return nil + } + + for _, participantID := range run.ParticipantIDs { + if participantID == userID { + return nil + } + } + + if IsSystemAdmin(userID, p.pluginAPI) { return nil } @@ -421,11 +419,18 @@ func (p *PermissionsService) RunView(userID, runID string) error { return errors.Wrapf(err, "Unable to get run to determine permissions, run id `%s`", runID) } - // Has view permission if is in the channel - if p.pluginAPI.User.HasPermissionToChannel(userID, run.ChannelID, model.PermissionReadChannel) { + // Has permission if is the owner of the run + if run.OwnerUserID == userID { return nil } + // Or if is a participant of the run + for _, participantID := range run.ParticipantIDs { + if participantID == userID { + return nil + } + } + // Or has view access to the playbook that created it return p.PlaybookView(userID, run.PlaybookID) } diff --git a/server/app/playbook.go b/server/app/playbook.go index d96988f796..9abfd3df1e 100644 --- a/server/app/playbook.go +++ b/server/app/playbook.go @@ -6,6 +6,7 @@ import ( "net/url" "strings" + "github.com/mattermost/mattermost-server/v6/model" "gopkg.in/guregu/null.v4" "github.com/pkg/errors" @@ -62,6 +63,7 @@ type Playbook struct { DefaultRunAdminRole string `json:"default_run_admin_role" export:"-"` DefaultRunMemberRole string `json:"default_run_member_role" export:"-"` Metrics []PlaybookMetricConfig `json:"metrics" export:"metrics"` + ActiveRuns int64 `json:"active_runs" export:"-"` // Deprecated: preserved for backwards compatibility with v1.27 BroadcastEnabled bool `json:"broadcast_enabled" export:"-"` WebhookOnStatusUpdateEnabled bool `json:"webhook_on_status_update_enabled" export:"-"` @@ -305,6 +307,12 @@ type PlaybookService interface { // Duplicate duplicates a playbook Duplicate(playbook Playbook, userID string) (string, error) + + // Get top playbooks for teams + GetTopPlaybooksForTeam(teamID, userID string, opts *model.InsightsOpts) (*PlaybooksInsightsList, error) + + // Get top playbooks for users + GetTopPlaybooksForUser(teamID, userID string, opts *model.InsightsOpts) (*PlaybooksInsightsList, error) } // PlaybookStore is an interface for storing playbooks @@ -367,6 +375,18 @@ type PlaybookStore interface { // DeleteMetric deletes a metric DeleteMetric(id string) error + + // Get top playbooks for teams + GetTopPlaybooksForTeam(teamID, userID string, opts *model.InsightsOpts) (*PlaybooksInsightsList, error) + + // Get top playbooks for users + GetTopPlaybooksForUser(teamID, userID string, opts *model.InsightsOpts) (*PlaybooksInsightsList, error) + + // AddPlaybookMember adds a user as a member to a playbook + AddPlaybookMember(id string, memberID string) error + + // RemovePlaybookMember removes a user from a playbook + RemovePlaybookMember(id string, memberID string) error } // PlaybookTelemetry defines the methods that the Playbook service needs from the RudderTelemetry. @@ -514,3 +534,31 @@ func removeDuplicates(a []string) []string { func ProcessSignalAnyKeywords(keywords []string) []string { return removeDuplicates(keywords) } + +// models for playbooks-insights + +// PlaybooksInsightsList is a response type with pagination support. +type PlaybooksInsightsList struct { + HasNext bool `json:"has_next"` + Items []*PlaybookInsight `json:"items"` +} + +// PlaybookInsight gives insight into activities related to a playbook + +type PlaybookInsight struct { + // ID of the playbook + // required: true + PlaybookID string `json:"playbook_id"` + + // Run count of playbook + // required: true + NumRuns int `json:"num_runs"` + + // Title of playbook + // required: true + Title string `json:"title"` + + // Time the playbook was last run. + // required: false + LastRunAt int64 `json:"last_run_at"` +} diff --git a/server/app/playbook_run.go b/server/app/playbook_run.go index d1d769a473..29f1b37ad6 100644 --- a/server/app/playbook_run.go +++ b/server/app/playbook_run.go @@ -277,7 +277,8 @@ func (r *PlaybookRun) SetConfigurationFromPlaybook(playbook Playbook) { r.DefaultOwnerID = playbook.DefaultOwnerID } - r.StatusUpdateBroadcastChannelsEnabled = playbook.BroadcastEnabled + // Do not propagate StatusUpdateBroadcastChannelsEnabled as true if there are no channels in BroadcastChannelIDs + r.StatusUpdateBroadcastChannelsEnabled = playbook.BroadcastEnabled && len(playbook.BroadcastChannelIDs) > 0 r.BroadcastChannelIDs = playbook.BroadcastChannelIDs r.WebhookOnCreationURLs = []string{} @@ -285,7 +286,8 @@ func (r *PlaybookRun) SetConfigurationFromPlaybook(playbook Playbook) { r.WebhookOnCreationURLs = playbook.WebhookOnCreationURLs } - r.StatusUpdateBroadcastWebhooksEnabled = playbook.WebhookOnStatusUpdateEnabled + // Do not propagate StatusUpdateBroadcastWebhooksEnabled as true if there are no URLs + r.StatusUpdateBroadcastWebhooksEnabled = playbook.WebhookOnStatusUpdateEnabled && len(playbook.WebhookOnStatusUpdateURLs) > 0 r.WebhookOnStatusUpdateURLs = playbook.WebhookOnStatusUpdateURLs r.RetrospectiveEnabled = playbook.RetrospectiveEnabled @@ -380,6 +382,7 @@ const ( CanceledRetrospective timelineEventType = "canceled_retrospective" RunFinished timelineEventType = "run_finished" RunRestored timelineEventType = "run_restored" + StatusUpdateSnoozed timelineEventType = "status_update_snoozed" ) type TimelineEvent struct { @@ -402,7 +405,7 @@ type TimelineEvent struct { // EventType is the type of this event. It can be "incident_created", "task_state_modified", // "status_updated", "owner_changed", "assignee_changed", "ran_slash_command", - // "event_from_post", "user_joined_left", "published_retrospective", or "canceled_retrospective". + // "event_from_post", "user_joined_left", "published_retrospective", "canceled_retrospective" or "status_update_snoozed". EventType timelineEventType `json:"event_type"` // Summary is a short description of the event. @@ -675,6 +678,10 @@ type PlaybookRunService interface { // LastStatusUpdateAt (so the countdown timer to "update due" shows the correct time) SetNewReminder(playbookRunID string, newReminder time.Duration) error + // ResetReminder records an event for snoozing a reminder, then calls SetNewReminder to create + // the next reminder + ResetReminder(playbookRunID string, newReminder time.Duration) error + // ChangeCreationDate changes the creation date of the specified playbook run. ChangeCreationDate(playbookRunID string, creationTimestamp time.Time) error @@ -733,8 +740,14 @@ type PlaybookRunService interface { // RequestUpdate posts a status update request message in the run's channel RequestUpdate(playbookRunID, requesterID string) error - // RequestGetInvolved posts a join request message in the run's channel - RequestGetInvolved(playbookRunID, requesterID string) error + // RequestJoinChannel posts a channel-join request message in the run's channel + RequestJoinChannel(playbookRunID, requesterID string) error + + // RemoveParticipants removes users from the run's participants + RemoveParticipants(playbookRunID string, userIDs []string) error + + // AddParticipants adds users to the participants list + AddParticipants(playbookRunID string, userIDs []string, requesterUserID string) error } // PlaybookRunStore defines the methods the PlaybookRunServiceImpl needs from the interfaceStore. @@ -829,6 +842,18 @@ type PlaybookRunStore interface { // (i.e. members of the playbook run channel when the run is active) // if a user is member of more than one channel, it will be counted multiple times GetParticipantsActiveTotal() (int64, error) + + // AddParticipants adds particpants to the run + AddParticipants(playbookRunID string, userIDs []string) error + + // RemoveParticipants removes participants from the run + RemoveParticipants(playbookRunID string, userIDs []string) error + + // GetSchemeRolesForChannel scheme role ids for the channel + GetSchemeRolesForChannel(channelID string) (string, string, string, error) + + // GetSchemeRolesForTeam scheme role ids for the team + GetSchemeRolesForTeam(teamID string) (string, string, string, error) } // PlaybookRunTelemetry defines the methods that the PlaybookRunServiceImpl needs from the RudderTelemetry. @@ -964,6 +989,10 @@ type PlaybookRunFilterOptions struct { // ParticipantOrFollowerID filters playbook runs that have this user as member or as follower. Defaults to blank (no filter). ParticipantOrFollowerID string `url:"participant_or_follower,omitempty"` + // IncludeFavorites filters playbook runs that ParticipantOrFollowerID has marked as favorite. + // There's no impact if ParticipantOrFollowerID is empty. + IncludeFavorites bool `url:"include_favorites,omitempty"` + // SearchTerm returns results of the search term and respecting the other header filter options. // The search term acts as a filter and respects the Sort and Direction fields (i.e., results are // not returned in relevance order). diff --git a/server/app/playbook_run_service.go b/server/app/playbook_run_service.go index b16599b066..744ae86eeb 100644 --- a/server/app/playbook_run_service.go +++ b/server/app/playbook_run_service.go @@ -11,6 +11,7 @@ import ( "time" "github.com/pkg/errors" + "github.com/sirupsen/logrus" stripmd "github.com/writeas/go-strip-markdown" "github.com/mattermost/mattermost-plugin-playbooks/server/bot" @@ -41,7 +42,6 @@ type PlaybookRunServiceImpl struct { configService config.Service store PlaybookRunStore poster bot.Poster - logger bot.Logger scheduler JobOnceScheduler telemetry PlaybookRunTelemetry api plugin.API @@ -92,7 +92,6 @@ func NewPlaybookRunService( pluginAPI *pluginapi.Client, store PlaybookRunStore, poster bot.Poster, - logger bot.Logger, configService config.Service, scheduler JobOnceScheduler, telemetry PlaybookRunTelemetry, @@ -106,7 +105,6 @@ func NewPlaybookRunService( pluginAPI: pluginAPI, store: store, poster: poster, - logger: logger, configService: configService, scheduler: scheduler, telemetry: telemetry, @@ -182,19 +180,19 @@ type PlaybookRunWebhookEvent struct { func (s *PlaybookRunServiceImpl) sendWebhooksOnCreation(playbookRun PlaybookRun) { siteURL := s.pluginAPI.Configuration.GetConfig().ServiceSettings.SiteURL if siteURL == nil { - s.pluginAPI.Log.Warn("cannot send webhook on creation, please set siteURL") + logrus.Error("cannot send webhook on creation, please set siteURL") return } team, err := s.pluginAPI.Team.Get(playbookRun.TeamID) if err != nil { - s.pluginAPI.Log.Warn("cannot send webhook on creation, not able to get playbookRun.TeamID") + logrus.WithError(err).Error("cannot send webhook on creation, not able to get playbookRun.TeamID") return } channel, err := s.pluginAPI.Channel.Get(playbookRun.ChannelID) if err != nil { - s.pluginAPI.Log.Warn("cannot send webhook on creation, not able to get playbookRun.ChannelID") + logrus.WithError(err).Error("cannot send webhook on creation, not able to get playbookRun.ChannelID") return } @@ -217,7 +215,7 @@ func (s *PlaybookRunServiceImpl) sendWebhooksOnCreation(playbookRun PlaybookRun) body, err := json.Marshal(payload) if err != nil { - s.pluginAPI.Log.Warn("cannot send webhook on creation, unable to marshal payload") + logrus.WithError(err).Error("cannot send webhook on creation, unable to marshal payload") return } @@ -229,7 +227,10 @@ func (s *PlaybookRunServiceImpl) CreatePlaybookRun(playbookRun *PlaybookRun, pb if playbookRun.DefaultOwnerID != "" { // Check if the user is a member of the team to which the playbook run belongs. if !IsMemberOfTeam(playbookRun.DefaultOwnerID, playbookRun.TeamID, s.pluginAPI) { - s.pluginAPI.Log.Warn("default owner specified, but it is not a member of the playbook run's team", "userID", playbookRun.DefaultOwnerID, "teamID", playbookRun.TeamID) + logrus.WithFields(logrus.Fields{ + "user_id": playbookRun.DefaultOwnerID, + "team_id": playbookRun.TeamID, + }).Warn("default owner specified, but it is not a member of the playbook run's team") } else { playbookRun.OwnerUserID = playbookRun.DefaultOwnerID } @@ -238,6 +239,8 @@ func (s *PlaybookRunServiceImpl) CreatePlaybookRun(playbookRun *PlaybookRun, pb playbookRun.ReporterUserID = userID playbookRun.ID = model.NewId() + logger := logrus.WithField("playbook_run_id", playbookRun.ID) + var err error var channel *model.Channel @@ -290,7 +293,7 @@ func (s *PlaybookRunServiceImpl) CreatePlaybookRun(playbookRun *PlaybookRun, pb } if _, err := s.actionService.Create(welcomeAction); err != nil { - s.logger.Errorf(errors.Wrapf(err, "unable to create welcome action for new run in channel %q", playbookRun.ChannelID).Error()) + logger.WithError(err).WithField("channel_id", playbookRun.ChannelID).Error("unable to create welcome action for new run in channel") } } @@ -308,7 +311,7 @@ func (s *PlaybookRunServiceImpl) CreatePlaybookRun(playbookRun *PlaybookRun, pb } if _, err := s.actionService.Create(categorizeChannelAction); err != nil { - s.logger.Errorf(errors.Wrapf(err, "unable to create welcome action for new run in channel %q", playbookRun.ChannelID).Error()) + logger.WithError(err).WithField("channel_id", playbookRun.ChannelID).Error("unable to create welcome action for new run in channel") } } @@ -344,15 +347,17 @@ func (s *PlaybookRunServiceImpl) CreatePlaybookRun(playbookRun *PlaybookRun, pb invitedUserIDs := playbookRun.InvitedUserIDs for _, groupID := range playbookRun.InvitedGroupIDs { + groupLogger := logger.WithField("group_id", groupID) + var group *model.Group group, err = s.pluginAPI.Group.Get(groupID) if err != nil { - s.pluginAPI.Log.Warn("failed to query group", "group_id", groupID) + groupLogger.WithError(err).Error("failed to query group") continue } if !group.AllowReference { - s.pluginAPI.Log.Warn("group that does not allow references", "group_id", groupID) + groupLogger.Warn("group that does not allow references") continue } @@ -361,7 +366,7 @@ func (s *PlaybookRunServiceImpl) CreatePlaybookRun(playbookRun *PlaybookRun, pb var users []*model.User users, err = s.pluginAPI.Group.GetMemberUsers(groupID, page, perPage) if err != nil { - s.pluginAPI.Log.Warn("failed to query group", "group_id", groupID, "err", err) + groupLogger.WithError(err).Error("failed to query group") break } for _, user := range users { @@ -438,13 +443,16 @@ func (s *PlaybookRunServiceImpl) CreatePlaybookRun(playbookRun *PlaybookRun, pb } if playbookRun.StatusUpdateBroadcastChannelsEnabled { - s.broadcastPlaybookRunMessageToChannels(playbookRun.BroadcastChannelIDs, &model.Post{Message: fmt.Sprintf(messageTemplate, "")}, creationMessage, playbookRun) + s.broadcastPlaybookRunMessageToChannels(playbookRun.BroadcastChannelIDs, &model.Post{Message: fmt.Sprintf(messageTemplate, "")}, creationMessage, playbookRun, logger) s.telemetry.RunAction(playbookRun, userID, TriggerTypeStatusUpdatePosted, ActionTypeBroadcastChannels, len(playbookRun.BroadcastChannelIDs)) } // dm to users who are auto-following the playbook telemetryString := fmt.Sprintf("?telem_action=follower_clicked_run_started_dm&telem_run_id=%s", playbookRun.ID) - s.dmPostToAutoFollows(&model.Post{Message: fmt.Sprintf(messageTemplate, telemetryString)}, pb.ID, playbookRun.ID, userID) + err := s.dmPostToAutoFollows(&model.Post{Message: fmt.Sprintf(messageTemplate, telemetryString)}, pb.ID, playbookRun.ID, userID) + if err != nil { + logger.WithError(err).Error("failed to dm post to auto follows") + } } event := &TimelineEvent{ @@ -468,8 +476,10 @@ func (s *PlaybookRunServiceImpl) CreatePlaybookRun(playbookRun *PlaybookRun, pb } for _, autoFollow := range autoFollows { if err := s.Follow(playbookRun.ID, autoFollow); err != nil { - s.pluginAPI.Log.Warn("failed to follow the playbook run", - "playbookRunID", playbookRun.ID, "autoFollow", autoFollow, "error", err.Error()) + logger.WithError(err).WithFields(logrus.Fields{ + "playbook_run_id": playbookRun.ID, + "auto_follow": autoFollow, + }).Warn("failed to follow the playbook run") } } } @@ -668,7 +678,7 @@ func (s *PlaybookRunServiceImpl) AddPostToTimeline(playbookRunID, userID, postID s.telemetry.AddPostToTimeline(playbookRunModified, userID) - if err = s.sendPlaybookRunToClient(playbookRunID); err != nil { + if err = s.sendPlaybookRunToClient(playbookRunID, []string{}); err != nil { return errors.Wrap(err, "failed to send playbook run to client") } @@ -694,7 +704,7 @@ func (s *PlaybookRunServiceImpl) RemoveTimelineEvent(playbookRunID, userID, even s.telemetry.RemoveTimelineEvent(playbookRunModified, userID) - if err = s.sendPlaybookRunToClient(playbookRunID); err != nil { + if err = s.sendPlaybookRunToClient(playbookRunID, []string{}); err != nil { return errors.Wrap(err, "failed to send playbook run to client") } @@ -740,27 +750,29 @@ func (s *PlaybookRunServiceImpl) buildStatusUpdatePost(statusUpdate, playbookRun // sendWebhooksOnUpdateStatus sends a POST request to the status update webhook URL. // It blocks until a response is received. func (s *PlaybookRunServiceImpl) sendWebhooksOnUpdateStatus(playbookRunID string, event *PlaybookRunWebhookEvent) { + logger := logrus.WithField("playbook_run_id", playbookRunID) + playbookRun, err := s.store.GetPlaybookRun(playbookRunID) if err != nil { - s.pluginAPI.Log.Warn("cannot send webhook on update, not able to get playbookRun") + logger.WithError(err).Error("cannot send webhook on update, not able to get playbookRun") return } siteURL := s.pluginAPI.Configuration.GetConfig().ServiceSettings.SiteURL if siteURL == nil { - s.pluginAPI.Log.Warn("cannot send webhook on update, please set siteURL") + logger.Error("cannot send webhook on update, please set siteURL") return } team, err := s.pluginAPI.Team.Get(playbookRun.TeamID) if err != nil { - s.pluginAPI.Log.Warn("cannot send webhook on update, not able to get playbookRun.TeamID") + logger.WithField("team_id", playbookRun.TeamID).Error("cannot send webhook on update, not able to get playbookRun.TeamID") return } channel, err := s.pluginAPI.Channel.Get(playbookRun.ChannelID) if err != nil { - s.pluginAPI.Log.Warn("cannot send webhook on update, not able to get playbookRun.TeamID") + logger.WithField("channel_id", playbookRun.ChannelID).Error("cannot send webhook on update, not able to get playbookRun.ChannelID") return } @@ -777,7 +789,7 @@ func (s *PlaybookRunServiceImpl) sendWebhooksOnUpdateStatus(playbookRunID string body, err := json.Marshal(payload) if err != nil { - s.pluginAPI.Log.Warn("cannot send webhook on update, unable to marshal payload") + logger.WithError(err).Error("cannot send webhook on update, unable to marshal payload") return } @@ -786,6 +798,8 @@ func (s *PlaybookRunServiceImpl) sendWebhooksOnUpdateStatus(playbookRunID string // UpdateStatus updates a playbook run's status. func (s *PlaybookRunServiceImpl) UpdateStatus(playbookRunID, userID string, options StatusUpdateOptions) error { + logger := logrus.WithField("playbook_run_id", playbookRunID) + playbookRunToModify, err := s.store.GetPlaybookRun(playbookRunID) if err != nil { return errors.Wrap(err, "failed to retrieve playbook run") @@ -818,11 +832,14 @@ func (s *PlaybookRunServiceImpl) UpdateStatus(playbookRunID, userID string, opti } if playbookRunToModify.StatusUpdateBroadcastChannelsEnabled { - s.broadcastPlaybookRunMessageToChannels(playbookRunToModify.BroadcastChannelIDs, originalPost.Clone(), statusUpdateMessage, playbookRunToModify) + s.broadcastPlaybookRunMessageToChannels(playbookRunToModify.BroadcastChannelIDs, originalPost.Clone(), statusUpdateMessage, playbookRunToModify, logger) s.telemetry.RunAction(playbookRunToModify, userID, TriggerTypeStatusUpdatePosted, ActionTypeBroadcastChannels, len(playbookRunToModify.BroadcastChannelIDs)) } - s.dmPostToRunFollowers(originalPost.Clone(), statusUpdateMessage, playbookRunID, userID) + err = s.dmPostToRunFollowers(originalPost.Clone(), statusUpdateMessage, playbookRunID, userID) + if err != nil { + logger.WithError(err).Error("failed to dm post to run followers") + } // Remove pending reminder (if any), even if current reminder was set to "none" (0 minutes) if err = s.SetNewReminder(playbookRunID, options.Reminder); err != nil { @@ -844,7 +861,7 @@ func (s *PlaybookRunServiceImpl) UpdateStatus(playbookRunID, userID string, opti s.telemetry.UpdateStatus(playbookRunToModify, userID) - if err = s.sendPlaybookRunToClient(playbookRunID); err != nil { + if err = s.sendPlaybookRunToClient(playbookRunID, []string{}); err != nil { return err } @@ -915,6 +932,8 @@ func (s *PlaybookRunServiceImpl) buildRunFinishedMessage(playbookRun *PlaybookRu // FinishPlaybookRun changes a run's state to Finished. If run is already in Finished state, the call is a noop. func (s *PlaybookRunServiceImpl) FinishPlaybookRun(playbookRunID, userID string) error { + logger := logrus.WithField("playbook_run_id", playbookRunID) + playbookRunToModify, err := s.store.GetPlaybookRun(playbookRunID) if err != nil { return errors.Wrap(err, "failed to retrieve playbook run") @@ -938,25 +957,28 @@ func (s *PlaybookRunServiceImpl) FinishPlaybookRun(playbookRunID, userID string) postID := "" post, err := s.poster.PostMessage(playbookRunToModify.ChannelID, message) if err != nil { - s.pluginAPI.Log.Warn("failed to post the status update to channel", "ChannelID", playbookRunToModify.ChannelID) + logger.WithError(err).WithField("channel_id", playbookRunToModify.ChannelID).Error("failed to post the status update to channel") } else { postID = post.Id } if playbookRunToModify.StatusUpdateBroadcastChannelsEnabled { - s.broadcastPlaybookRunMessageToChannels(playbookRunToModify.BroadcastChannelIDs, &model.Post{Message: message}, finishMessage, playbookRunToModify) + s.broadcastPlaybookRunMessageToChannels(playbookRunToModify.BroadcastChannelIDs, &model.Post{Message: message}, finishMessage, playbookRunToModify, logger) s.telemetry.RunAction(playbookRunToModify, userID, TriggerTypeStatusUpdatePosted, ActionTypeBroadcastChannels, len(playbookRunToModify.BroadcastChannelIDs)) } runFinishedMessage := s.buildRunFinishedMessage(playbookRunToModify, user.Username) - s.dmPostToRunFollowers(&model.Post{Message: runFinishedMessage}, finishMessage, playbookRunToModify.ID, userID) + err = s.dmPostToRunFollowers(&model.Post{Message: runFinishedMessage}, finishMessage, playbookRunToModify.ID, userID) + if err != nil { + logger.WithError(err).Error("failed to dm post to run followers") + } // Remove pending reminder (if any), even if current reminder was set to "none" (0 minutes) s.RemoveReminder(playbookRunID) err = s.resetReminderTimer(playbookRunID) if err != nil { - s.pluginAPI.Log.Warn("failed to reset the reminder timer when updating status to Archived", "playbook ID", playbookRunToModify.ID, "error", err) + logger.WithError(err).Error("failed to reset the reminder timer when updating status to Archived") } // We are resolving the playbook run. Send the reminder to fill out the retrospective @@ -991,8 +1013,8 @@ func (s *PlaybookRunServiceImpl) FinishPlaybookRun(playbookRunID, userID string) s.telemetry.FinishPlaybookRun(playbookRunToModify, userID) s.metricsService.IncrementRunsFinishedCount(1) - if err = s.sendPlaybookRunToClient(playbookRunID); err != nil { - return err + if err = s.sendPlaybookRunToClient(playbookRunID, []string{}); err != nil { + return errors.Wrap(err, "failed to send playbook run to client") } if playbookRunToModify.StatusUpdateBroadcastWebhooksEnabled { @@ -1012,6 +1034,8 @@ func (s *PlaybookRunServiceImpl) FinishPlaybookRun(playbookRunID, userID string) // RestorePlaybookRun reverts a run from the Finished state. If run was not in Finished state, the call is a noop. func (s *PlaybookRunServiceImpl) RestorePlaybookRun(playbookRunID, userID string) error { + logger := logrus.WithField("playbook_run_id", playbookRunID) + playbookRunToRestore, err := s.store.GetPlaybookRun(playbookRunID) if err != nil { return errors.Wrap(err, "failed to retrieve playbook run") @@ -1035,13 +1059,13 @@ func (s *PlaybookRunServiceImpl) RestorePlaybookRun(playbookRunID, userID string postID := "" post, err := s.poster.PostMessage(playbookRunToRestore.ChannelID, message) if err != nil { - s.pluginAPI.Log.Warn("failed to post the status update to channel", "ChannelID", playbookRunToRestore.ChannelID) + logger.WithField("channel_id", playbookRunToRestore.ChannelID).Error("failed to post the status update to channel") } else { postID = post.Id } if playbookRunToRestore.StatusUpdateBroadcastChannelsEnabled { - s.broadcastPlaybookRunMessageToChannels(playbookRunToRestore.BroadcastChannelIDs, &model.Post{Message: message}, restoreMessage, playbookRunToRestore) + s.broadcastPlaybookRunMessageToChannels(playbookRunToRestore.BroadcastChannelIDs, &model.Post{Message: message}, restoreMessage, playbookRunToRestore, logger) s.telemetry.RunAction(playbookRunToRestore, userID, TriggerTypeStatusUpdatePosted, ActionTypeBroadcastChannels, len(playbookRunToRestore.BroadcastChannelIDs)) } @@ -1060,7 +1084,7 @@ func (s *PlaybookRunServiceImpl) RestorePlaybookRun(playbookRunID, userID string s.telemetry.RestorePlaybookRun(playbookRunToRestore, userID) - if err = s.sendPlaybookRunToClient(playbookRunID); err != nil { + if err = s.sendPlaybookRunToClient(playbookRunID, []string{}); err != nil { return err } @@ -1261,7 +1285,7 @@ func (s *PlaybookRunServiceImpl) ChangeOwner(playbookRunID, userID, ownerID stri s.telemetry.ChangeOwner(playbookRunToModify, userID) - if err = s.sendPlaybookRunToClient(playbookRunID); err != nil { + if err = s.sendPlaybookRunToClient(playbookRunID, []string{}); err != nil { return errors.Wrap(err, "failed to send playbook run to client") } @@ -1320,7 +1344,7 @@ func (s *PlaybookRunServiceImpl) ModifyCheckedState(playbookRunID, userID, newSt return errors.Wrap(err, "failed to create timeline event") } - if err = s.sendPlaybookRunToClient(playbookRunID); err != nil { + if err = s.sendPlaybookRunToClient(playbookRunID, []string{}); err != nil { return errors.Wrap(err, "failed to send playbook run to client") } @@ -1440,7 +1464,7 @@ func (s *PlaybookRunServiceImpl) SetAssignee(playbookRunID, userID, assigneeID s return errors.Wrap(err, "failed to create timeline event") } - if err = s.sendPlaybookRunToClient(playbookRunID); err != nil { + if err = s.sendPlaybookRunToClient(playbookRunID, []string{}); err != nil { return errors.Wrap(err, "failed to send playbook run to client") } @@ -1490,7 +1514,7 @@ func (s *PlaybookRunServiceImpl) SetDueDate(playbookRunID, userID string, duedat return errors.Wrapf(err, "failed to update playbook run; it is now in an inconsistent state") } - if err = s.sendPlaybookRunToClient(playbookRunID); err != nil { + if err = s.sendPlaybookRunToClient(playbookRunID, []string{}); err != nil { return errors.Wrap(err, "failed to send playbook run to client") } @@ -1555,7 +1579,7 @@ func (s *PlaybookRunServiceImpl) RunChecklistItemSlashCommand(playbookRunID, use return "", errors.Wrap(err, "failed to create timeline event") } - if err = s.sendPlaybookRunToClient(playbookRunID); err != nil { + if err = s.sendPlaybookRunToClient(playbookRunID, []string{}); err != nil { return "", errors.Wrap(err, "failed to send playbook run to client") } @@ -1575,7 +1599,10 @@ func (s *PlaybookRunServiceImpl) DuplicateChecklistItem(playbookRunID, userID st checklistItem := playbookRunToModify.Checklists[checklistNumber].Items[itemNumber] checklistItem.ID = "" - playbookRunToModify.Checklists[checklistNumber].Items = append(playbookRunToModify.Checklists[checklistNumber].Items, checklistItem) + playbookRunToModify.Checklists[checklistNumber].Items = append( + playbookRunToModify.Checklists[checklistNumber].Items[:itemNumber+1], + playbookRunToModify.Checklists[checklistNumber].Items[itemNumber:]...) + playbookRunToModify.Checklists[checklistNumber].Items[itemNumber+1] = checklistItem playbookRunToModify, err = s.store.UpdatePlaybookRun(playbookRunToModify) if err != nil { @@ -2115,24 +2142,45 @@ func (s *PlaybookRunServiceImpl) UserHasJoinedChannel(userID, channelID, actorID user, err := s.pluginAPI.User.Get(userID) if err != nil { - s.logger.Errorf("failed to resolve user for userID '%s'; error: %s", userID, err.Error()) + logrus.WithError(err).WithField("user_id", userID).Error("failed to resolve user") return } channel, err := s.pluginAPI.Channel.Get(channelID) if err != nil { - s.logger.Errorf("failed to resolve channel for channelID '%s'; error: %s", channelID, err.Error()) + logrus.WithError(err).WithField("channel_id", channelID).Error("failed to resolve channel") return } + if err := s.addChannelJoinTimelineEvent(user, channel, actorID, playbookRunID, userID); err != nil { + logrus.WithError(err).Error("failed to add channel join timeline event") + } + + if !user.IsBot { + if err := s.Follow(playbookRunID, user.Id); err != nil { + logrus.WithError(err).Errorf("user `%s` was not able to follow the run `%s`", user.Id, playbookRunID) + } + } + + // Automatically participate if you join the channel + // To be removed when separating members and participants is complete. + if err := s.AddParticipants(playbookRunID, []string{user.Id}, user.Id); err != nil { + logrus.WithError(err).Errorf("failed to add participant that joined channel for run '%s', user '%s'", playbookRunID, user.Id) + } + + if err := s.sendPlaybookRunToClient(playbookRunID, []string{}); err != nil { + logrus.WithError(err).Errorf("failed to to send run '%s' through ws, user '%s'", playbookRunID, user.Id) + } +} + +func (s *PlaybookRunServiceImpl) addChannelJoinTimelineEvent(user *model.User, channel *model.Channel, actorID string, playbookRunID string, userID string) error { title := fmt.Sprintf("@%s joined the channel", user.Username) summary := fmt.Sprintf("@%s joined ~%s", user.Username, channel.Name) if actorID != "" { - actor, err2 := s.pluginAPI.User.Get(actorID) - if err2 != nil { - s.logger.Errorf("failed to resolve user for userID '%s'; error: %s", actorID, err2.Error()) - return + actor, err := s.pluginAPI.User.Get(actorID) + if err != nil { + return errors.Wrapf(err, "failed to resolve user for userID '%s'", actorID) } summary = fmt.Sprintf("@%s added @%s to ~%s", actor.Username, user.Username, channel.Name) @@ -2149,24 +2197,11 @@ func (s *PlaybookRunServiceImpl) UserHasJoinedChannel(userID, channelID, actorID CreatorUserID: actorID, } - if _, err = s.store.CreateTimelineEvent(event); err != nil { - s.logger.Errorf("failed to create timeline event; error: %s", err.Error()) - } - - _ = s.sendPlaybookRunToClient(playbookRunID) - - playbookRun, err := s.store.GetPlaybookRun(playbookRunID) - if err != nil { - return - } - - if user.IsBot { - return + if _, err := s.store.CreateTimelineEvent(event); err != nil { + return errors.Wrap(err, "failed to create timeline event") } - if err := s.Follow(playbookRun.ID, userID); err != nil { - s.logger.Errorf("user `%s` was not able to follow the run `%s`; error: %s", userID, playbookRun.ID, err.Error()) - } + return nil } func (s *PlaybookRunServiceImpl) UpdateDescription(playbookRunID, description string) error { @@ -2192,7 +2227,6 @@ func (s *PlaybookRunServiceImpl) UpdateDescription(playbookRunID, description st // was removed from the channel by actorID. func (s *PlaybookRunServiceImpl) UserHasLeftChannel(userID, channelID, actorID string) { playbookRunID, err := s.store.GetPlaybookRunIDForChannel(channelID) - if err != nil { // This is not a playbook run channel return @@ -2200,24 +2234,43 @@ func (s *PlaybookRunServiceImpl) UserHasLeftChannel(userID, channelID, actorID s user, err := s.pluginAPI.User.Get(userID) if err != nil { - s.logger.Errorf("failed to resolve user for userID '%s'; error: %s", userID, err.Error()) + logrus.WithError(err).WithField("user_id", userID).Error("failed to resolve user") return } channel, err := s.pluginAPI.Channel.Get(channelID) if err != nil { - s.logger.Errorf("failed to resolve channel for channelID '%s'; error: %s", channelID, err.Error()) + logrus.WithError(err).WithField("channel_id", channelID).Error("failed to resolve channel") return } + if err := s.addChannelLeaveTimelineEvent(user, channel, actorID, playbookRunID, userID); err != nil { + logrus.WithError(err).Error("failed to add channel leave timeline event") + } + + // Automatically leave run if you leave the channel + // To be removed when separating members and participants is complete. + if err := s.RemoveParticipants(playbookRunID, []string{user.Id}); err != nil { + logrus.WithError(err).Errorf("faied to remove participant that left channel for run '%s', user '%s'", playbookRunID, user.Id) + } + + if err := s.Unfollow(playbookRunID, user.Id); err != nil { + logrus.WithError(err).Errorf("failed to make participant to unfollow the run '%s', user '%s'", playbookRunID, user.Id) + } + + if err := s.sendPlaybookRunToClient(playbookRunID, []string{}); err != nil { + logrus.WithError(err).Errorf("failed to send the run '%s' through ws, user '%s'", playbookRunID, user.Id) + } +} + +func (s *PlaybookRunServiceImpl) addChannelLeaveTimelineEvent(user *model.User, channel *model.Channel, actorID string, playbookRunID string, userID string) error { title := fmt.Sprintf("@%s left the channel", user.Username) summary := fmt.Sprintf("@%s left ~%s", user.Username, channel.Name) if actorID != "" { - actor, err2 := s.pluginAPI.User.Get(actorID) - if err2 != nil { - s.logger.Errorf("failed to resolve user for userID '%s'; error: %s", actorID, err2.Error()) - return + actor, err := s.pluginAPI.User.Get(actorID) + if err != nil { + return errors.Wrapf(err, "failed to resolve user for userID '%s'", actorID) } summary = fmt.Sprintf("@%s removed @%s from ~%s", actor.Username, user.Username, channel.Name) @@ -2234,11 +2287,10 @@ func (s *PlaybookRunServiceImpl) UserHasLeftChannel(userID, channelID, actorID s CreatorUserID: actorID, } - if _, err = s.store.CreateTimelineEvent(event); err != nil { - s.logger.Errorf("failed to create timeline event; error: %s", err.Error()) + if _, err := s.store.CreateTimelineEvent(event); err != nil { + return errors.Wrap(err, "failed to create timeline event") } - - _ = s.sendPlaybookRunToClient(playbookRunID) + return nil } func (s *PlaybookRunServiceImpl) hasPermissionToModifyPlaybookRun(playbookRun *PlaybookRun, userID string) bool { @@ -2309,13 +2361,32 @@ func (s *PlaybookRunServiceImpl) addPlaybookRunUsers(playbookRun *PlaybookRun, c } } - if _, err := s.pluginAPI.Channel.UpdateChannelMemberRoles(channel.Id, playbookRun.OwnerUserID, fmt.Sprintf("%s %s", model.ChannelAdminRoleId, model.ChannelUserRoleId)); err != nil { - s.pluginAPI.Log.Warn("failed to promote owner to admin", "ChannelID", channel.Id, "OwnerUserID", playbookRun.OwnerUserID, "err", err.Error()) + _, userRoleID, adminRoleID := s.GetSchemeRolesForChannel(channel) + if _, err := s.pluginAPI.Channel.UpdateChannelMemberRoles(channel.Id, playbookRun.OwnerUserID, fmt.Sprintf("%s %s", userRoleID, adminRoleID)); err != nil { + logrus.WithError(err).WithFields(logrus.Fields{ + "channel_id": channel.Id, + "owner_user_id": playbookRun.OwnerUserID, + }).Warn("failed to promote owner to admin") } return nil } +func (s *PlaybookRunServiceImpl) GetSchemeRolesForChannel(channel *model.Channel) (string, string, string) { + // get channel roles + if guestRole, userRole, adminRole, err := s.store.GetSchemeRolesForChannel(channel.Id); err == nil { + return guestRole, userRole, adminRole + } + + // get team roles if channel roles are not available + if guestRole, userRole, adminRole, err := s.store.GetSchemeRolesForTeam(channel.TeamId); err == nil { + return guestRole, userRole, adminRole + } + + // return default roles + return model.ChannelGuestRoleId, model.ChannelUserRoleId, model.ChannelAdminRoleId +} + func (s *PlaybookRunServiceImpl) newFinishPlaybookRunDialog(outstanding int) *model.Dialog { message := "Are you sure you want to finish the run?" if outstanding == 1 { @@ -2535,7 +2606,11 @@ func (s *PlaybookRunServiceImpl) newAddToTimelineDialog(playbookRuns []PlaybookR }, nil } -func (s *PlaybookRunServiceImpl) sendPlaybookRunToClient(playbookRunID string) error { +// sendPlaybookRunToClient send Run to users via websocket +// Two cases will be handled: +// - one message as broadcast channel-id based +// - additional messages user-id based (one per userid passed) +func (s *PlaybookRunServiceImpl) sendPlaybookRunToClient(playbookRunID string, userIDs []string) error { playbookRunToSend, err := s.store.GetPlaybookRun(playbookRunID) if err != nil { return errors.Wrap(err, "failed to retrieve playbook run") @@ -2543,6 +2618,12 @@ func (s *PlaybookRunServiceImpl) sendPlaybookRunToClient(playbookRunID string) e s.poster.PublishWebsocketEventToChannel(playbookRunUpdatedWSEvent, playbookRunToSend, playbookRunToSend.ChannelID) + // Additional explicit users (not channelid based) + // Temporary workaround until we have GQL real time mechanism + for _, userID := range userIDs { + s.poster.PublishWebsocketEventToUser(playbookRunUpdatedWSEvent, playbookRunToSend, userID) + } + return nil } @@ -2567,6 +2648,8 @@ func (s *PlaybookRunServiceImpl) UpdateRetrospective(playbookRunID, updaterID st } func (s *PlaybookRunServiceImpl) PublishRetrospective(playbookRunID, publisherID string, retrospective RetrospectiveUpdate) error { + logger := logrus.WithField("playbook_run_id", playbookRunID) + playbookRunToPublish, err := s.store.GetPlaybookRun(playbookRunID) if err != nil { return errors.Wrap(err, "failed to retrieve playbook run") @@ -2602,7 +2685,10 @@ func (s *PlaybookRunServiceImpl) PublishRetrospective(playbookRunID, publisherID telemetryString := fmt.Sprintf("?telem_action=follower_clicked_retrospective_dm&telem_run_id=%s", playbookRunToPublish.ID) retrospectivePublishedMessage := fmt.Sprintf("@%s published the retrospective report for [%s](%s%s).\n%s", publisherUser.Username, playbookRunToPublish.Name, retrospectiveURL, telemetryString, retrospective.Text) - s.dmPostToRunFollowers(&model.Post{Message: retrospectivePublishedMessage}, retroMessage, playbookRunToPublish.ID, publisherID) + err = s.dmPostToRunFollowers(&model.Post{Message: retrospectivePublishedMessage}, retroMessage, playbookRunToPublish.ID, publisherID) + if err != nil { + logger.WithError(err).Error("failed to dm post to run followers") + } event := &TimelineEvent{ PlaybookRunID: playbookRunID, @@ -2616,8 +2702,8 @@ func (s *PlaybookRunServiceImpl) PublishRetrospective(playbookRunID, publisherID return errors.Wrap(err, "failed to create timeline event") } - if err := s.sendPlaybookRunToClient(playbookRunID); err != nil { - s.logger.Errorf("failed send websocket event; error: %s", err.Error()) + if err := s.sendPlaybookRunToClient(playbookRunID, []string{}); err != nil { + logrus.WithError(err).Error("failed to send websocket event") } s.telemetry.PublishRetrospective(playbookRunToPublish, publisherID) @@ -2640,14 +2726,12 @@ func (s *PlaybookRunServiceImpl) buildRetrospectivePost(playbookRunToPublish *Pl metricsConfigs, err := json.Marshal(playbook.Metrics) if err != nil { - s.pluginAPI.Log.Warn("cannot post retro, unable to marshal metrics configs") - return nil, err + return nil, errors.Wrap(err, "unable to marshal metrics configs") } metricsData, err := json.Marshal(playbookRunToPublish.MetricsData) if err != nil { - s.pluginAPI.Log.Warn("cannot post retro, unable to marshal metrics data") - return nil, err + return nil, errors.Wrap(err, "cannot post retro, unable to marshal metrics data") } props["metricsData"] = string(metricsData) props["metricsConfigs"] = string(metricsConfigs) @@ -2700,15 +2784,46 @@ func (s *PlaybookRunServiceImpl) CancelRetrospective(playbookRunID, cancelerID s return errors.Wrap(err, "failed to create timeline event") } - if err := s.sendPlaybookRunToClient(playbookRunID); err != nil { - s.logger.Errorf("failed send websocket event; error: %s", err.Error()) + if err := s.sendPlaybookRunToClient(playbookRunID, []string{}); err != nil { + logrus.WithError(err).Error("failed send websocket event") } return nil } +// RequestJoinChannel posts a channel-join request message in the run's channel +func (s *PlaybookRunServiceImpl) RequestJoinChannel(playbookRunID, requesterID string) error { + playbookRun, err := s.store.GetPlaybookRun(playbookRunID) + if err != nil { + return errors.Wrap(err, "failed to retrieve playbook run") + } + + // avoid sending request if user is already a member of the channel + if s.pluginAPI.User.HasPermissionToChannel(requesterID, playbookRun.ChannelID, model.PermissionReadChannel) { + return fmt.Errorf("user %s is already a member of the channel %s", requesterID, playbookRunID) + } + + requesterUser, err := s.pluginAPI.User.Get(requesterID) + if err != nil { + return errors.Wrap(err, "failed to get requester user") + } + + T := i18n.GetUserTranslations(requesterUser.Locale) + data := map[string]interface{}{ + "Name": requesterUser.Username, + } + + _, err = s.poster.PostMessage(playbookRun.ChannelID, T("app.user.run.request_join_channel", data)) + if err != nil { + return errors.Wrap(err, "failed to post to channel") + } + return nil +} + // RequestUpdate posts a status update request message in the run's channel func (s *PlaybookRunServiceImpl) RequestUpdate(playbookRunID, requesterID string) error { + logger := logrus.WithField("playbook_run_id", playbookRunID) + playbookRun, err := s.store.GetPlaybookRun(playbookRunID) if err != nil { return errors.Wrap(err, "failed to retrieve playbook run") @@ -2723,18 +2838,21 @@ func (s *PlaybookRunServiceImpl) RequestUpdate(playbookRunID, requesterID string data := map[string]interface{}{ "Name": requesterUser.Username, } - if _, err = s.poster.PostMessage(playbookRun.ChannelID, T("app.user.run.request_update", data)); err != nil { + + post, err := s.poster.PostMessage(playbookRun.ChannelID, T("app.user.run.request_update", data)) + if err != nil { return errors.Wrap(err, "failed to post to channel") } // create timeline event - eventTime := model.GetMillis() event := &TimelineEvent{ PlaybookRunID: playbookRunID, - CreateAt: eventTime, - EventAt: eventTime, + CreateAt: post.CreateAt, + EventAt: post.CreateAt, EventType: StatusUpdateRequested, + PostID: post.Id, SubjectUserID: requesterID, + CreatorUserID: requesterID, Summary: fmt.Sprintf("@%s requested a status update", requesterUser.Username), } @@ -2743,42 +2861,131 @@ func (s *PlaybookRunServiceImpl) RequestUpdate(playbookRunID, requesterID string } // send updated run through websocket - if err := s.sendPlaybookRunToClient(playbookRunID); err != nil { - s.logger.Errorf("failed send websocket event; error: %s", err.Error()) + if err := s.sendPlaybookRunToClient(playbookRunID, []string{}); err != nil { + logger.WithError(err).Warn("failed send websocket event") } return nil } -// RequestUpdate posts a status update request message in the run's channel -func (s *PlaybookRunServiceImpl) RequestGetInvolved(playbookRunID, requesterID string) error { +// Leave removes user from the run's participants +func (s *PlaybookRunServiceImpl) RemoveParticipants(playbookRunID string, userIDs []string) error { playbookRun, err := s.store.GetPlaybookRun(playbookRunID) if err != nil { return errors.Wrap(err, "failed to retrieve playbook run") } - requesterUser, err := s.pluginAPI.User.Get(requesterID) + // Check if any user is the owner + for _, userID := range userIDs { + if playbookRun.OwnerUserID == userID { + return errors.New("owner user can't leave the run") + } + } + + if err := s.store.RemoveParticipants(playbookRunID, userIDs); err != nil { + return errors.Wrapf(err, "users `%+v` failed to remove participation in run `%s`", userIDs, playbookRunID) + } + + for _, userID := range userIDs { + s.leaveActions(playbookRun, userID) + } + + if err := s.sendPlaybookRunToClient(playbookRunID, userIDs); err != nil { + logrus.WithError(err).Error("failed send websocket event") + } + + return nil +} + +func (s *PlaybookRunServiceImpl) leaveActions(playbookRun *PlaybookRun, userID string) { + // Don't do anything if the user not a channel member + member, _ := s.pluginAPI.Channel.GetMember(playbookRun.ChannelID, userID) + if member == nil { + return + } + + // To be added to the UI as an optional action + if err := s.api.DeleteChannelMember(playbookRun.ChannelID, userID); err != nil { + logrus.WithError(err).Errorf("failed to remove user from linked channel, userID '%s'", userID) + } +} + +func (s *PlaybookRunServiceImpl) AddParticipants(playbookRunID string, userIDs []string, requesterUserID string) error { + if err := s.store.AddParticipants(playbookRunID, userIDs); err != nil { + return errors.Wrapf(err, "users `%+v` failed to participate the run `%s`", userIDs, playbookRunID) + } + + // TO be done, once actions are implemented + // return if action is disabled + + playbookRun, err := s.store.GetPlaybookRun(playbookRunID) if err != nil { - return errors.Wrap(err, "failed to get requester user") + return errors.Wrap(err, "failed to retrieve playbook run") } - // Check if user is already a member of the channel - member, err := s.pluginAPI.Channel.GetMember(playbookRun.ChannelID, requesterID) - if err == nil && member != nil { - return errors.New("user is already involved") + channel, err := s.pluginAPI.Channel.Get(playbookRun.ChannelID) + if err != nil { + logrus.WithError(err).Errorf("failed to get channel, channelID '%s'", playbookRun.ChannelID) } - T := i18n.GetUserTranslations(requesterUser.Locale) - data := map[string]interface{}{ - "Name": requesterUser.Username, + requesterUser, err := s.pluginAPI.User.Get(requesterUserID) + if err != nil { + return errors.Wrap(err, "failed to get requester user") } - if _, err = s.poster.PostMessage(playbookRun.ChannelID, T("app.user.run.request_get_involved", data)); err != nil { - return errors.Wrap(err, "failed to post to channel") + + for _, userID := range userIDs { + user := requesterUser + if userID != requesterUserID { + user, err = s.pluginAPI.User.Get(userID) + if err != nil { + return errors.Wrap(err, "failed to get requester user") + } + } + s.participateActions(playbookRun, channel, user, requesterUser) + } + + if err := s.sendPlaybookRunToClient(playbookRunID, userIDs); err != nil { + logrus.WithError(err).Error("failed send websocket event") } return nil } +func (s *PlaybookRunServiceImpl) participateActions(playbookRun *PlaybookRun, channel *model.Channel, user *model.User, requesterUser *model.User) { + // Don't do anything if the user is a channel member + member, _ := s.pluginAPI.Channel.GetMember(playbookRun.ChannelID, user.Id) + if member != nil { + return + } + + // Send message to channel if one the following scenarios happens: + // - channel is private and is a "participate" action ) + // - channel is private and the user adding a new participant has no access to it + requesterHasAccessToChannel := s.permissions.ChannelActionView(requesterUser.Id, playbookRun.ChannelID) == nil + isParticipateFlow := requesterUser.Id == user.Id + if channel.Type == "P" && (isParticipateFlow || !requesterHasAccessToChannel) { + T := i18n.GetUserTranslations(requesterUser.Locale) + data := map[string]interface{}{ + "Name": user.Username, + "RequesterName": requesterUser.Username, + } + msg := T("app.user.run.joined_run_channel_private_add_participant", data) + if isParticipateFlow { + msg = T("app.user.run.joined_run_channel_private_participate", data) + } + + if _, err := s.poster.PostMessage(playbookRun.ChannelID, msg); err != nil { + logrus.WithError(err).Errorf("participateActions: failed to send message to private channel, userID '%s'", user.Id) + } + return + } + + // Regular add channel member otherwise + if _, err := s.api.AddChannelMember(playbookRun.ChannelID, user.Id); err != nil { + logrus.WithError(err).Errorf("participateActions: failed to add user to linked channel, userID '%s'", user.Id) + } +} + func (s *PlaybookRunServiceImpl) postMessageToThreadAndSaveRootID(playbookRunID, channelID string, post *model.Post) error { channelIDsToRootIDs, err := s.store.GetBroadcastChannelIDsToRootIDs(playbookRunID) if err != nil { @@ -2917,7 +3124,7 @@ func triggerWebhooks(s *PlaybookRunServiceImpl, webhooks []string, body []byte) req, err := http.NewRequest("POST", url, bytes.NewReader(body)) if err != nil { - s.pluginAPI.Log.Warn("failed to create a POST request to webhook URL", "webhook URL", url, "error", err.Error()) + logrus.WithError(err).WithField("webhook_url", url).Error("failed to create a POST request to webhook URL") return } @@ -2925,7 +3132,7 @@ func triggerWebhooks(s *PlaybookRunServiceImpl, webhooks []string, body []byte) resp, err := s.httpClient.Do(req) if err != nil { - s.pluginAPI.Log.Warn("failed to send a POST request to webhook URL", "webhook URL", url, "error", err.Error()) + logrus.WithError(err).WithField("webhook_url", url).Warn("failed to send a POST request to webhook URL") return } @@ -2933,7 +3140,7 @@ func triggerWebhooks(s *PlaybookRunServiceImpl, webhooks []string, body []byte) if resp.StatusCode < 200 || resp.StatusCode > 299 { err := errors.Errorf("response code is %d; expected a status code in the 2xx range", resp.StatusCode) - s.pluginAPI.Log.Warn("failed to finish a POST request to webhook URL", "webhook URL", url, "error", err.Error()) + logrus.WithError(err).WithField("webhook_url", url).Warn("failed to finish a POST request to webhook URL") } }() } @@ -3085,14 +3292,16 @@ const ( ) // broadcasting to channels -func (s *PlaybookRunServiceImpl) broadcastPlaybookRunMessageToChannels(channelIDs []string, post *model.Post, mType messageType, playbookRun *PlaybookRun) { +func (s *PlaybookRunServiceImpl) broadcastPlaybookRunMessageToChannels(channelIDs []string, post *model.Post, mType messageType, playbookRun *PlaybookRun, logger logrus.FieldLogger) { + logger = logger.WithField("message_type", mType) + for _, broadcastChannelID := range channelIDs { post.Id = "" // Reset the ID so we avoid cloning the whole object if err := s.broadcastPlaybookRunMessage(broadcastChannelID, post, mType, playbookRun); err != nil { - s.pluginAPI.Log.Warn(fmt.Sprintf("failed to broadcast run %s to channel", mType), "error", err.Error()) + logger.WithError(err).Error("failed to broadcast run to channel") if _, err = s.poster.PostMessage(playbookRun.ChannelID, fmt.Sprintf("Failed to broadcast run %s to the configured channel.", mType)); err != nil { - s.pluginAPI.Log.Warn("failed to post failure message to the channel", "channelID", playbookRun.ChannelID, "error", err.Error()) + logger.WithError(err).WithField("channel_id", playbookRun.ChannelID).Error("failed to post failure message to the channel") } } } @@ -3113,27 +3322,29 @@ func (s *PlaybookRunServiceImpl) broadcastPlaybookRunMessage(broadcastChannelID // dm to users who follow -func (s *PlaybookRunServiceImpl) dmPostToRunFollowers(post *model.Post, mType messageType, playbookRunID, authorID string) { +func (s *PlaybookRunServiceImpl) dmPostToRunFollowers(post *model.Post, mType messageType, playbookRunID, authorID string) error { followers, err := s.GetFollowers(playbookRunID) if err != nil { - s.pluginAPI.Log.Warn(fmt.Sprintf("failed to broadcast run %s to run followers", mType)) - return + return errors.Wrap(err, "failed to get followers") } s.dmPostToUsersWithPermission(followers, post, playbookRunID, authorID) + return nil } -func (s *PlaybookRunServiceImpl) dmPostToAutoFollows(post *model.Post, playbookID, playbookRunID, authorID string) { +func (s *PlaybookRunServiceImpl) dmPostToAutoFollows(post *model.Post, playbookID, playbookRunID, authorID string) error { autoFollows, err := s.playbookService.GetAutoFollows(playbookID) if err != nil { - s.pluginAPI.Log.Warn("failed to broadcast run creation to auto-follows for the playbook", "PlaybookID", playbookID, "error", err) - return + return errors.Wrap(err, "failed to get auto follows") } s.dmPostToUsersWithPermission(autoFollows, post, playbookRunID, authorID) + return nil } func (s *PlaybookRunServiceImpl) dmPostToUsersWithPermission(users []string, post *model.Post, playbookRunID, authorID string) { + logger := logrus.WithFields(logrus.Fields{"playbook_run_id": playbookRunID}) + for _, user := range users { // Do not send update to the author if user == authorID { @@ -3148,8 +3359,7 @@ func (s *PlaybookRunServiceImpl) dmPostToUsersWithPermission(users []string, pos post.Id = "" // Reset the ID so we avoid cloning the whole object post.RootId = "" if err := s.poster.DM(user, post); err != nil { - s.pluginAPI.Log.Warn("failed to broadcast post to the user", - "user", user, "error", err.Error()) + logger.WithError(err).WithField("user_id", user).Warn("failed to broadcast post to the user") } } } diff --git a/server/app/playbook_service.go b/server/app/playbook_service.go index d1dc24a8c0..bb373f7618 100644 --- a/server/app/playbook_service.go +++ b/server/app/playbook_service.go @@ -184,3 +184,49 @@ func (s *playbookService) Duplicate(playbook Playbook, userID string) (string, e return s.Create(newPlaybook, userID) } + +// get top playbooks for teams +func (s *playbookService) GetTopPlaybooksForTeam(teamID, userID string, opts *model.InsightsOpts) (*PlaybooksInsightsList, error) { + permissionFlag, err := licenseAndGuestCheck(s, userID) + if err != nil { + return nil, err + } + if !permissionFlag { + return nil, errors.New("User cannot access playbooks insights") + } + + return s.store.GetTopPlaybooksForTeam(teamID, userID, opts) +} + +// get top playbooks for users +func (s *playbookService) GetTopPlaybooksForUser(teamID, userID string, opts *model.InsightsOpts) (*PlaybooksInsightsList, error) { + permissionFlag, err := licenseAndGuestCheck(s, userID) + if err != nil { + return nil, err + } + if !permissionFlag { + return nil, errors.New("User cannot access playbooks insights") + } + + return s.store.GetTopPlaybooksForUser(teamID, userID, opts) +} + +func licenseAndGuestCheck(s *playbookService, userID string) (bool, error) { + licenseError := errors.New("invalid license/authorization to use insights API") + guestError := errors.New("Guests aren't authorized to use insights API") + lic := s.api.System.GetLicense() + if lic == nil { + return false, licenseError + } + user, err := s.api.User.Get(userID) + if err != nil { + return false, err + } + if lic.SkuShortName != model.LicenseShortSkuProfessional && lic.SkuShortName != model.LicenseShortSkuEnterprise { + return false, licenseError + } + if user.IsGuest() { + return false, guestError + } + return true, nil +} diff --git a/server/app/reminder.go b/server/app/reminder.go index d295b7338c..fc547603bb 100644 --- a/server/app/reminder.go +++ b/server/app/reminder.go @@ -10,6 +10,7 @@ import ( "github.com/mattermost/mattermost-server/v6/model" "github.com/pkg/errors" + "github.com/sirupsen/logrus" ) const RetrospectivePrefix = "retro_" @@ -24,9 +25,11 @@ func (s *PlaybookRunServiceImpl) HandleReminder(key string) { } func (s *PlaybookRunServiceImpl) handleReminderToFillRetro(playbookRunID string) { + logger := logrus.WithField("playbook_run_id", playbookRunID) + playbookRunToRemind, err := s.GetPlaybookRun(playbookRunID) if err != nil { - s.logger.Errorf(errors.Wrapf(err, "handleReminderToFillRetro failed to get playbook run id: %s", playbookRunID).Error()) + logger.WithError(err).Errorf("handleReminderToFillRetro failed to get playbook run") return } @@ -41,7 +44,7 @@ func (s *PlaybookRunServiceImpl) handleReminderToFillRetro(playbookRunID string) } if err = s.postRetrospectiveReminder(playbookRunToRemind, false); err != nil { - s.logger.Errorf(errors.Wrapf(err, "couldn't post reminder").Error()) + logger.WithError(err).Errorf("couldn't post reminder") return } @@ -49,22 +52,24 @@ func (s *PlaybookRunServiceImpl) handleReminderToFillRetro(playbookRunID string) go func() { time.Sleep(time.Second * 2) if err = s.SetReminder(RetrospectivePrefix+playbookRunID, time.Duration(playbookRunToRemind.RetrospectiveReminderIntervalSeconds)*time.Second); err != nil { - s.logger.Errorf(errors.Wrap(err, "failed to reocurr retrospective reminder").Error()) + logger.WithError(err).Errorf("failed to reocurr retrospective reminder") return } }() } func (s *PlaybookRunServiceImpl) handleStatusUpdateReminder(playbookRunID string) { + logger := logrus.WithField("playbook_run_id", playbookRunID) + playbookRunToModify, err := s.GetPlaybookRun(playbookRunID) if err != nil { - s.logger.Errorf(errors.Wrapf(err, "HandleReminder failed to get playbook run id: %s", playbookRunID).Error()) + logger.WithError(err).Error("HandleReminder failed to get playbook run") return } owner, err := s.pluginAPI.User.Get(playbookRunToModify.OwnerUserID) if err != nil { - s.logger.Errorf(errors.Wrapf(err, "HandleReminder failed to get owner for id: %s", playbookRunToModify.OwnerUserID).Error()) + logger.WithError(err).WithField("user_id", playbookRunToModify.OwnerUserID).Error("HandleReminder failed to get owner") return } @@ -95,23 +100,24 @@ func (s *PlaybookRunServiceImpl) handleStatusUpdateReminder(playbookRunID string model.ParseSlackAttachment(post, attachments) if err := s.poster.PostMessageToThread("", post); err != nil { - s.logger.Errorf(errors.Wrap(err, "HandleReminder error posting reminder message").Error()) + logger.WithError(err).Errorf("HandleReminder error posting reminder message") return } // broadcast to followers message, err := s.buildOverdueStatusUpdateMessage(playbookRunToModify, owner.Username) if err != nil { - s.pluginAPI.Log.Warn("failed to build overdue status update message", "PlaybookRunID", playbookRunToModify.ID, "error", err) + logger.WithError(err).Error("failed to build overdue status update message") } else { - s.dmPostToRunFollowers(&model.Post{Message: message}, overdueStatusUpdateMessage, playbookRunToModify.ID, "") + err = s.dmPostToRunFollowers(&model.Post{Message: message}, overdueStatusUpdateMessage, playbookRunToModify.ID, "") + if err != nil { + logger.WithError(err).Error("failed to dm post to run followers") + } } playbookRunToModify.ReminderPostID = post.Id - - playbookRunToModify, err = s.store.UpdatePlaybookRun(playbookRunToModify) - if err != nil { - s.logger.Errorf(errors.Wrapf(err, "error updating with reminder post id, playbook run id: %s", playbookRunToModify.ID).Error()) + if _, err = s.store.UpdatePlaybookRun(playbookRunToModify); err != nil { + logger.WithError(err).Error("error updating with reminder post id") } } @@ -166,6 +172,29 @@ func (s *PlaybookRunServiceImpl) resetReminderTimer(playbookRunID string) error return nil } +// ResetReminder creates a timeline event for a reminder being reset and then creates a new reminder +func (s *PlaybookRunServiceImpl) ResetReminder(playbookRunID string, newReminder time.Duration) error { + playbookRunToModify, err := s.store.GetPlaybookRun(playbookRunID) + if err != nil { + return errors.Wrapf(err, "failed to retrieve playbook run") + } + + eventTime := model.GetMillis() + event := &TimelineEvent{ + PlaybookRunID: playbookRunToModify.ID, + CreateAt: eventTime, + EventAt: eventTime, + EventType: StatusUpdateSnoozed, + SubjectUserID: playbookRunToModify.ReporterUserID, + } + + if _, err := s.store.CreateTimelineEvent(event); err != nil { + return errors.Wrapf(err, "failed to create timeline event after resetting reminder timer") + } + + return s.SetNewReminder(playbookRunID, newReminder) +} + // SetNewReminder sets a new reminder for playbookRunID, removes any pending reminder, removes the // reminder post in the playbookRun's channel, and resets the PreviousReminder and // LastStatusUpdateAt (so the countdown timer to "update due" shows the correct time) diff --git a/server/app/sort.go b/server/app/sort.go index 7d64b27e9c..e07707df57 100644 --- a/server/app/sort.go +++ b/server/app/sort.go @@ -40,6 +40,12 @@ const ( // SortByLastStatusUpdateAt sorts by when the playbook run was last updated. SortByLastStatusUpdateAt SortField = "last_status_update_at" + // SortByLastStatusUpdateAt sorts by when the playbook was last run. + SortByLastRunAt SortField = "last_run_at" + + // SortByActiveRuns sorts by number of active runs in the playbook. + SortByActiveRuns SortField = "active_runs" + // SortByMetric0 ..3 sorts by the playbook's metric index SortByMetric0 SortField = "metric0" SortByMetric1 SortField = "metric1" diff --git a/server/app/telemetry.go b/server/app/telemetry.go new file mode 100644 index 0000000000..cf01b271e9 --- /dev/null +++ b/server/app/telemetry.go @@ -0,0 +1,61 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +package app + +import "fmt" + +// GenericTelemetry is the generic interface for telemetry. +type GenericTelemetry interface { + Page(name TelemetryPage, properties map[string]interface{}) + Track(name TelemetryTrack, properties map[string]interface{}) +} + +// TelemetryType is the type for the different kinds of tracking we have +type TelemetryType string + +const ( + // TelemetryTypeTrack is for tracking events (click, submit, etc..) + TelemetryTypeTrack TelemetryType = "track" + // TelemetryTypePage is for tracking page views + TelemetryTypePage TelemetryType = "page" +) + +type TelemetryTrack string + +// TelemetryPage is a type alias to hold all possible +// page tracking names in an enum-like +// +// Contained names should match the ones that are at webapp/src/types/telemetry.ts +// when they use generic tracking +type TelemetryPage string + +const ( + telemetryRunStatusUpdate TelemetryPage = "run_status_update" + telemetryRunDetails TelemetryPage = "run_details" +) + +// NewTelemetryPage creates an instance of TelemetryPage from a string. +// It's useful to validate that the arbitrary string has a equivalent constant +// for what pages we want to track (and avoid typos). +func NewTelemetryPage(name string) (TelemetryPage, error) { + switch name { + case string(telemetryRunStatusUpdate): + return telemetryRunStatusUpdate, nil + case string(telemetryRunDetails): + return telemetryRunDetails, nil + default: + return "", fmt.Errorf("unknown value '%s' for type TelemetryPage", name) + } +} + +// NewTelemetryTrack creates an instance of TelemetryTrack from a string. +// It's useful to validate that the arbitrary string has a equivalent constant +// for what events we want to track (and avoid typos). +func NewTelemetryTrack(name string) (TelemetryTrack, error) { + switch name { + // New events should be added here + default: + return "", fmt.Errorf("unknown value '%s' for type TelemetryTrack", name) + } +} diff --git a/server/bot/bot.go b/server/bot/bot.go index 92e5030c91..fc2847436e 100644 --- a/server/bot/bot.go +++ b/server/bot/bot.go @@ -7,26 +7,14 @@ import ( pluginapi "github.com/mattermost/mattermost-plugin-api" ) -// Bot stores the information for the plugin configuration, and implements the Poster and Logger -// interfaces. +// Bot stores the information for the plugin configuration, and implements the Poster interfaces. type Bot struct { configService config.Service pluginAPI *pluginapi.Client botUserID string - logContext LogContext telemetry Telemetry } -// Logger interface - a logging system that will tee logs to a DM channel. -type Logger interface { - With(LogContext) Logger - Timed() Logger - Debugf(format string, args ...interface{}) - Errorf(format string, args ...interface{}) - Infof(format string, args ...interface{}) - Warnf(format string, args ...interface{}) -} - // Poster interface - a small subset of the plugin posting API. type Poster interface { // Post posts a custom post, which should provide the Message and ChannelId fields @@ -84,7 +72,7 @@ type Telemetry interface { StartTrial(userID string, action string) } -// New creates a new bot poster/logger. +// New creates a new bot poster. func New(api *pluginapi.Client, botUserID string, configService config.Service, telemetry Telemetry) *Bot { return &Bot{ pluginAPI: api, @@ -93,14 +81,3 @@ func New(api *pluginapi.Client, botUserID string, configService config.Service, telemetry: telemetry, } } - -// Clone shallow copies -func (b *Bot) clone() *Bot { - return &Bot{ - configService: b.configService, - pluginAPI: b.pluginAPI, - botUserID: b.botUserID, - logContext: b.logContext.copyShallow(), - telemetry: b.telemetry, - } -} diff --git a/server/bot/logger.go b/server/bot/logger.go deleted file mode 100644 index 8666163bd6..0000000000 --- a/server/bot/logger.go +++ /dev/null @@ -1,201 +0,0 @@ -package bot - -import ( - "encoding/json" - "fmt" - "testing" - "time" -) - -const timed = "__since" -const elapsed = "Elapsed" - -// LogContext . -type LogContext map[string]interface{} - -func (l LogContext) copyShallow() LogContext { - if l == nil { - return nil - } - - ret := make(LogContext) - for k, v := range l { - ret[k] = v - } - return ret -} - -func level(l string) int { - switch l { - case "debug": - return 4 - case "info": - return 3 - case "warn": - return 2 - case "error": - return 1 - } - return 0 -} - -func toKeyValuePairs(in map[string]interface{}) (out []interface{}) { - for k, v := range in { - out = append(out, k) - out = append(out, v) - } - return out -} - -// With . -func (b *Bot) With(logContext LogContext) Logger { - newBot := b.clone() - if len(newBot.logContext) == 0 { - newBot.logContext = map[string]interface{}{} - } - for k, v := range logContext { - newBot.logContext[k] = v - } - return newBot -} - -// Timed . -func (b *Bot) Timed() Logger { - return b.With(LogContext{ - timed: time.Now(), - }) -} - -// Debugf . -func (b *Bot) Debugf(format string, args ...interface{}) { - measure(b.logContext) - message := fmt.Sprintf(format, args...) - b.pluginAPI.Log.Debug(message, toKeyValuePairs(b.logContext)...) - if level(b.configService.GetConfiguration().AdminLogLevel) >= 4 { - b.logToAdmins("DEBUG", message) - } -} - -// Errorf . -func (b *Bot) Errorf(format string, args ...interface{}) { - measure(b.logContext) - message := fmt.Sprintf(format, args...) - b.pluginAPI.Log.Error(message, toKeyValuePairs(b.logContext)...) - if level(b.configService.GetConfiguration().AdminLogLevel) >= 1 { - b.logToAdmins("ERROR", message) - } -} - -// Infof . -func (b *Bot) Infof(format string, args ...interface{}) { - measure(b.logContext) - message := fmt.Sprintf(format, args...) - b.pluginAPI.Log.Info(message, toKeyValuePairs(b.logContext)...) - if level(b.configService.GetConfiguration().AdminLogLevel) >= 3 { - b.logToAdmins("INFO", message) - } -} - -// Warnf . -func (b *Bot) Warnf(format string, args ...interface{}) { - measure(b.logContext) - message := fmt.Sprintf(format, args...) - b.pluginAPI.Log.Warn(message, toKeyValuePairs(b.logContext)...) - if level(b.configService.GetConfiguration().AdminLogLevel) >= 2 { - b.logToAdmins("WARN", message) - } -} - -func (b *Bot) logToAdmins(level, message string) { - if b.configService.GetConfiguration().AdminLogVerbose && len(b.logContext) > 0 { - message += "\n" + JSONBlock(b.logContext) - } - _ = b.dmAdmins("(log " + level + ") " + message) -} - -// NilLogger Nil logger. -type NilLogger struct{} - -// With . -func (l *NilLogger) With(logContext LogContext) Logger { return l } - -// Timed . -func (l *NilLogger) Timed() Logger { return l } - -// Debugf . -func (l *NilLogger) Debugf(format string, args ...interface{}) {} - -// Errorf . -func (l *NilLogger) Errorf(format string, args ...interface{}) {} - -// Infof . -func (l *NilLogger) Infof(format string, args ...interface{}) {} - -// Warnf . -func (l *NilLogger) Warnf(format string, args ...interface{}) {} - -// TestLogger test logger. -type TestLogger struct { - testing.TB - logContext LogContext -} - -// With . -func (l *TestLogger) With(logContext LogContext) Logger { - newl := *l - if len(newl.logContext) == 0 { - newl.logContext = map[string]interface{}{} - } - for k, v := range logContext { - newl.logContext[k] = v - } - return &newl -} - -// Timed . -func (l *TestLogger) Timed() Logger { - return l.With(LogContext{ - timed: time.Now(), - }) -} - -func (l *TestLogger) logf(prefix, format string, args ...interface{}) { - out := fmt.Sprintf(prefix+": "+format, args...) - if len(l.logContext) > 0 { - measure(l.logContext) - out += fmt.Sprintf(" -- %+v", l.logContext) - } - l.TB.Logf(out) -} - -func measure(lc LogContext) { - if lc[timed] == nil { - return - } - started := lc[timed].(time.Time) - lc[elapsed] = time.Since(started).String() - delete(lc, timed) -} - -// JSON . -func JSON(ref interface{}) string { - bb, _ := json.MarshalIndent(ref, "", " ") - return string(bb) -} - -// JSONBlock . -func JSONBlock(ref interface{}) string { - return fmt.Sprintf("\n```json\n%s\n```\n", JSON(ref)) -} - -// Debugf . -func (l *TestLogger) Debugf(format string, args ...interface{}) { l.logf("DEBUG", format, args...) } - -// Errorf . -func (l *TestLogger) Errorf(format string, args ...interface{}) { l.logf("ERROR", format, args...) } - -// Infof . -func (l *TestLogger) Infof(format string, args ...interface{}) { l.logf("INFO", format, args...) } - -// Warnf . -func (l *TestLogger) Warnf(format string, args ...interface{}) { l.logf("WARN", format, args...) } diff --git a/server/bot/mocks/mock_logger.go b/server/bot/mocks/mock_logger.go deleted file mode 100644 index 0ca9878c68..0000000000 --- a/server/bot/mocks/mock_logger.go +++ /dev/null @@ -1,130 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/mattermost/mattermost-plugin-playbooks/server/bot (interfaces: Logger) - -// Package mock_bot is a generated GoMock package. -package mock_bot - -import ( - gomock "github.com/golang/mock/gomock" - bot "github.com/mattermost/mattermost-plugin-playbooks/server/bot" - reflect "reflect" -) - -// MockLogger is a mock of Logger interface -type MockLogger struct { - ctrl *gomock.Controller - recorder *MockLoggerMockRecorder -} - -// MockLoggerMockRecorder is the mock recorder for MockLogger -type MockLoggerMockRecorder struct { - mock *MockLogger -} - -// NewMockLogger creates a new mock instance -func NewMockLogger(ctrl *gomock.Controller) *MockLogger { - mock := &MockLogger{ctrl: ctrl} - mock.recorder = &MockLoggerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use -func (m *MockLogger) EXPECT() *MockLoggerMockRecorder { - return m.recorder -} - -// Debugf mocks base method -func (m *MockLogger) Debugf(arg0 string, arg1 ...interface{}) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0} - for _, a := range arg1 { - varargs = append(varargs, a) - } - m.ctrl.Call(m, "Debugf", varargs...) -} - -// Debugf indicates an expected call of Debugf -func (mr *MockLoggerMockRecorder) Debugf(arg0 interface{}, arg1 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0}, arg1...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Debugf", reflect.TypeOf((*MockLogger)(nil).Debugf), varargs...) -} - -// Errorf mocks base method -func (m *MockLogger) Errorf(arg0 string, arg1 ...interface{}) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0} - for _, a := range arg1 { - varargs = append(varargs, a) - } - m.ctrl.Call(m, "Errorf", varargs...) -} - -// Errorf indicates an expected call of Errorf -func (mr *MockLoggerMockRecorder) Errorf(arg0 interface{}, arg1 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0}, arg1...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Errorf", reflect.TypeOf((*MockLogger)(nil).Errorf), varargs...) -} - -// Infof mocks base method -func (m *MockLogger) Infof(arg0 string, arg1 ...interface{}) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0} - for _, a := range arg1 { - varargs = append(varargs, a) - } - m.ctrl.Call(m, "Infof", varargs...) -} - -// Infof indicates an expected call of Infof -func (mr *MockLoggerMockRecorder) Infof(arg0 interface{}, arg1 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0}, arg1...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Infof", reflect.TypeOf((*MockLogger)(nil).Infof), varargs...) -} - -// Timed mocks base method -func (m *MockLogger) Timed() bot.Logger { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Timed") - ret0, _ := ret[0].(bot.Logger) - return ret0 -} - -// Timed indicates an expected call of Timed -func (mr *MockLoggerMockRecorder) Timed() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Timed", reflect.TypeOf((*MockLogger)(nil).Timed)) -} - -// Warnf mocks base method -func (m *MockLogger) Warnf(arg0 string, arg1 ...interface{}) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0} - for _, a := range arg1 { - varargs = append(varargs, a) - } - m.ctrl.Call(m, "Warnf", varargs...) -} - -// Warnf indicates an expected call of Warnf -func (mr *MockLoggerMockRecorder) Warnf(arg0 interface{}, arg1 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0}, arg1...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Warnf", reflect.TypeOf((*MockLogger)(nil).Warnf), varargs...) -} - -// With mocks base method -func (m *MockLogger) With(arg0 bot.LogContext) bot.Logger { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "With", arg0) - ret0, _ := ret[0].(bot.Logger) - return ret0 -} - -// With indicates an expected call of With -func (mr *MockLoggerMockRecorder) With(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "With", reflect.TypeOf((*MockLogger)(nil).With), arg0) -} diff --git a/server/bot/poster.go b/server/bot/poster.go index e36c40e26c..7335d31053 100644 --- a/server/bot/poster.go +++ b/server/bot/poster.go @@ -6,6 +6,7 @@ import ( "github.com/mattermost/mattermost-server/v6/model" "github.com/pkg/errors" + "github.com/sirupsen/logrus" ) const maxAdminsToQueryForNotification = 1000 @@ -90,8 +91,7 @@ func (b *Bot) PostCustomMessageWithAttachments(channelID, customType string, att func (b *Bot) DM(userID string, post *model.Post) error { channel, err := b.pluginAPI.Channel.GetDirect(userID, b.botUserID) if err != nil { - b.pluginAPI.Log.Info("Couldn't get bot's DM channel", "user_id", userID) - return err + return errors.Wrapf(err, "failed to get bot DM channel with user_id %s", userID) } post.ChannelId = channel.Id post.UserId = b.botUserID @@ -259,12 +259,15 @@ func (b *Bot) NotifyAdmins(messageType, authorUserID string, isTeamEdition bool) go func(adminID string) { channel, err := b.pluginAPI.Channel.GetDirect(adminID, b.botUserID) if err != nil { - b.pluginAPI.Log.Warn("failed to get Direct Message channel between user and bot", "user ID", adminID, "bot ID", b.botUserID, "error", err) + logrus.WithError(err).WithFields(logrus.Fields{ + "user_id": adminID, + "bot_id": b.botUserID, + }).Warn("failed to get Direct Message channel between user and bot") return } if _, err := b.PostCustomMessageWithAttachments(channel.Id, postType, attachments, message); err != nil { - b.pluginAPI.Log.Warn("failed to send a DM to user", "user ID", adminID, "error", err) + logrus.WithError(err).WithField("user_id", adminID).Error("failed to send a DM to user") } }(admin.Id) } @@ -304,23 +307,8 @@ func (b *Bot) IsFromPoster(post *model.Post) bool { func (b *Bot) makePayloadMap(payload interface{}) map[string]interface{} { payloadJSON, err := json.Marshal(payload) if err != nil { - b.With(LogContext{ - "payload": payload, - }).Errorf("could not marshall payload") + logrus.WithError(err).Error("could not marshall payload") payloadJSON = []byte("null") } return map[string]interface{}{"payload": string(payloadJSON)} } - -// DM posts a simple Direct Message to the specified user -func (b *Bot) dmAdmins(format string, args ...interface{}) error { - for _, id := range b.configService.GetConfiguration().AllowedUserIDs { - err := b.DM(id, &model.Post{ - Message: fmt.Sprintf(format, args...), - }) - if err != nil { - return err - } - } - return nil -} diff --git a/server/command/command.go b/server/command/command.go index c88afcb903..c999074f3e 100644 --- a/server/command/command.go +++ b/server/command/command.go @@ -14,6 +14,7 @@ import ( "github.com/mattermost/mattermost-server/v6/model" "github.com/mattermost/mattermost-server/v6/plugin" "github.com/pkg/errors" + "github.com/sirupsen/logrus" pluginapi "github.com/mattermost/mattermost-plugin-api" ) @@ -162,7 +163,6 @@ type Runner struct { context *plugin.Context args *model.CommandArgs pluginAPI *pluginapi.Client - logger bot.Logger poster bot.Poster playbookRunService app.PlaybookRunService playbookService app.PlaybookService @@ -176,7 +176,6 @@ type Runner struct { func NewCommandRunner(ctx *plugin.Context, args *model.CommandArgs, api *pluginapi.Client, - logger bot.Logger, poster bot.Poster, playbookRunService app.PlaybookRunService, playbookService app.PlaybookService, @@ -189,7 +188,6 @@ func NewCommandRunner(ctx *plugin.Context, context: ctx, args: args, pluginAPI: api, - logger: logger, poster: poster, playbookRunService: playbookRunService, playbookService: playbookService, @@ -215,7 +213,7 @@ func (r *Runner) postCommandResponse(text string) { } func (r *Runner) warnUserAndLogErrorf(format string, args ...interface{}) { - r.logger.Errorf(format, args...) + logrus.Errorf(format, args...) r.poster.EphemeralPost(r.args.UserId, r.args.ChannelId, &model.Post{ Message: "Your request could not be completed. Check the system logs for more information.", }) diff --git a/server/e2etest.config.json.sample b/server/e2etest.config.json.sample new file mode 100644 index 0000000000..14cdc9c428 --- /dev/null +++ b/server/e2etest.config.json.sample @@ -0,0 +1,14 @@ +// Rename this file (and remove comments) to e2etest.config.json to force some server settings to e2e engine +// +// Note that e2etest.config.json will be ignored in git. +// +// Example: you can use the following json to enable logging (disabled by default due +// to excesive noise) +{ + "LogSettings": { + "ConsoleLevel": "INFO", + "EnableConsole": true, + "ConsoleJson": true, + "EnableFile": false + } +} diff --git a/server/main_test.go b/server/main_test.go index dc5526edf8..a62f27fe13 100644 --- a/server/main_test.go +++ b/server/main_test.go @@ -66,6 +66,7 @@ type TestEnvironment struct { A *sapp.App Permissions PermissionsHelper + logger mlog.LoggerIFace ServerAdminClient *model.Client4 PlaybooksAdminClient *client.Client @@ -126,7 +127,19 @@ func Setup(t *testing.T) *TestEnvironment { config.LocalizationSettings.SetDefaults() config.SqlSettings = *sqlSettings config.ServiceSettings.SiteURL = model.NewString("http://testsiteurlplaybooks.mattermost.com/") - _, _, err := configStore.Set(config) + config.LogSettings.EnableConsole = model.NewBool(true) + config.LogSettings.EnableFile = model.NewBool(false) + + // override config with e2etest.config.json if it exists + textConfig, err := os.ReadFile("./e2etest.config.json") + if err == nil { + err := json.Unmarshal(textConfig, config) + if err != nil { + require.NoError(t, err) + } + } + + _, _, err = configStore.Set(config) require.NoError(t, err) // Copy ourselves into the correct directory so we are executed. @@ -182,6 +195,7 @@ func Setup(t *testing.T) *TestEnvironment { App: ap, }, }, + logger: testLogger, } } @@ -189,28 +203,28 @@ func (e *TestEnvironment) CreateClients() { e.T.Helper() userPassword := "Password123!" - admin, _ := e.A.CreateUser(request.EmptyContext(), &model.User{ + admin, _ := e.A.CreateUser(request.EmptyContext(e.logger), &model.User{ Email: "playbooksadmin@example.com", Username: "playbooksadmin", Password: userPassword, }) e.AdminUser = admin - user, _ := e.A.CreateUser(request.EmptyContext(), &model.User{ + user, _ := e.A.CreateUser(request.EmptyContext(e.logger), &model.User{ Email: "playbooksuser@example.com", Username: "playbooksuser", Password: userPassword, }) e.RegularUser = user - user2, _ := e.A.CreateUser(request.EmptyContext(), &model.User{ + user2, _ := e.A.CreateUser(request.EmptyContext(e.logger), &model.User{ Email: "playbooksuser2@example.com", Username: "playbooksuser2", Password: userPassword, }) e.RegularUser2 = user2 - notInTeam, _ := e.A.CreateUser(request.EmptyContext(), &model.User{ + notInTeam, _ := e.A.CreateUser(request.EmptyContext(e.logger), &model.User{ Email: "playbooksusernotinteam@example.com", Username: "playbooksusenotinteam", Password: userPassword, @@ -452,6 +466,8 @@ func (e *TestEnvironment) SetE20Licence() { } func (e *TestEnvironment) CreateBasic() { + e.T.Helper() + e.CreateClients() e.CreateBasicServer() e.SetE20Licence() diff --git a/server/metrics/service.go b/server/metrics/service.go index 7f5eb84b03..a445bfdeec 100644 --- a/server/metrics/service.go +++ b/server/metrics/service.go @@ -5,8 +5,7 @@ import ( "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus/promhttp" - - pluginapi "github.com/mattermost/mattermost-plugin-api" + "github.com/sirupsen/logrus" ) // Service prometheus to run the server. @@ -15,22 +14,19 @@ type Service struct { } type ErrorLoggerWrapper struct { - log *pluginapi.LogService } func (el *ErrorLoggerWrapper) Println(v ...interface{}) { - el.log.Error("metric server error", v) + logrus.Warn("metric server error", v) } // NewMetricsServer factory method to create a new prometheus server. -func NewMetricsServer(address string, metricsService *Metrics, logger *pluginapi.LogService) *Service { +func NewMetricsServer(address string, metricsService *Metrics) *Service { return &Service{ &http.Server{ Addr: address, Handler: promhttp.HandlerFor(metricsService.registry, promhttp.HandlerOpts{ - ErrorLog: &ErrorLoggerWrapper{ - log: logger, - }, + ErrorLog: &ErrorLoggerWrapper{}, }), }, } diff --git a/server/plugin.go b/server/plugin.go index a2f899d0d4..be1abcf165 100644 --- a/server/plugin.go +++ b/server/plugin.go @@ -43,9 +43,11 @@ var ( type TelemetryClient interface { app.PlaybookRunTelemetry app.PlaybookTelemetry + app.GenericTelemetry bot.Telemetry app.UserInfoTelemetry app.ChannelActionTelemetry + app.CategoryTelemetry Enable() error Disable() error } @@ -101,12 +103,15 @@ func (p *Plugin) OnActivate() error { p.pluginAPI = pluginAPIClient p.config = config.NewConfigService(pluginAPIClient, manifest) - pluginapi.ConfigureLogrus(logrus.New(), pluginAPIClient) + + logger := logrus.StandardLogger() + pluginapi.ConfigureLogrus(logger, pluginAPIClient) botID, err := pluginAPIClient.Bot.EnsureBot(&model.Bot{ Username: "playbooks", DisplayName: "Playbooks", Description: "Playbooks bot.", + OwnerId: "playbooks", }, pluginapi.ProfileImagePath("assets/plugin_icon.png"), ) @@ -123,7 +128,7 @@ func (p *Plugin) OnActivate() error { } if rudderDataplaneURL == "" || rudderWriteKey == "" { - pluginAPIClient.Log.Warn("Rudder credentials are not set. Disabling analytics.") + logrus.Warn("Rudder credentials are not set. Disabling analytics.") p.telemetryClient = &telemetry.NoopTelemetry{} } else { diagnosticID := pluginAPIClient.System.GetDiagnosticID() @@ -140,13 +145,13 @@ func (p *Plugin) OnActivate() error { if telemetryEnabled { if err = p.telemetryClient.Enable(); err != nil { - pluginAPIClient.Log.Warn("Telemetry could not be enabled", "Error", err) + logrus.WithError(err).Error("Telemetry could not be enabled") } return } if err = p.telemetryClient.Disable(); err != nil { - pluginAPIClient.Log.Error("Telemetry could not be disabled", "Error", err) + logrus.WithError(err).Error("Telemetry could not be disabled") } } @@ -157,25 +162,25 @@ func (p *Plugin) OnActivate() error { p.bot = bot.New(pluginAPIClient, p.config.GetConfiguration().BotUserID, p.config, p.telemetryClient) scheduler := cluster.GetJobOnceScheduler(p.API) - sqlStore, err := sqlstore.New(apiClient, p.bot, scheduler) + sqlStore, err := sqlstore.New(apiClient, scheduler) if err != nil { return errors.Wrapf(err, "failed creating the SQL store") } - playbookRunStore := sqlstore.NewPlaybookRunStore(apiClient, p.bot, sqlStore) - playbookStore := sqlstore.NewPlaybookStore(apiClient, p.bot, sqlStore) - statsStore := sqlstore.NewStatsStore(apiClient, p.bot, sqlStore) + playbookRunStore := sqlstore.NewPlaybookRunStore(apiClient, sqlStore) + playbookStore := sqlstore.NewPlaybookStore(apiClient, sqlStore) + statsStore := sqlstore.NewStatsStore(apiClient, sqlStore) p.userInfoStore = sqlstore.NewUserInfoStore(sqlStore) - channelActionStore := sqlstore.NewChannelActionStore(apiClient, p.bot, sqlStore) - categoryStore := sqlstore.NewCategoryStore(apiClient, p.bot, sqlStore) + channelActionStore := sqlstore.NewChannelActionStore(apiClient, sqlStore) + categoryStore := sqlstore.NewCategoryStore(apiClient, sqlStore) - p.handler = api.NewHandler(pluginAPIClient, p.config, p.bot) + p.handler = api.NewHandler(pluginAPIClient, p.config) p.playbookService = app.NewPlaybookService(playbookStore, p.bot, p.telemetryClient, pluginAPIClient, p.metricsService) keywordsThreadIgnorer := app.NewKeywordsThreadIgnorer() - p.channelActionService = app.NewChannelActionsService(pluginAPIClient, p.bot, p.bot, p.config, channelActionStore, p.playbookService, keywordsThreadIgnorer, p.telemetryClient) - p.categoryService = app.NewCategoryService(categoryStore, pluginAPIClient) + p.channelActionService = app.NewChannelActionsService(pluginAPIClient, p.bot, p.config, channelActionStore, p.playbookService, keywordsThreadIgnorer, p.telemetryClient) + p.categoryService = app.NewCategoryService(categoryStore, pluginAPIClient, p.telemetryClient) p.licenseChecker = enterprise.NewLicenseChecker(pluginAPIClient) @@ -183,7 +188,6 @@ func (p *Plugin) OnActivate() error { pluginAPIClient, playbookRunStore, p.bot, - p.bot, p.config, scheduler, p.telemetryClient, @@ -195,10 +199,10 @@ func (p *Plugin) OnActivate() error { ) if err = scheduler.SetCallback(p.playbookRunService.HandleReminder); err != nil { - pluginAPIClient.Log.Error("JobOnceScheduler could not add the playbookRunService's HandleReminder", "error", err.Error()) + logrus.WithError(err).Error("JobOnceScheduler could not add the playbookRunService's HandleReminder") } if err = scheduler.Start(); err != nil { - pluginAPIClient.Log.Error("JobOnceScheduler could not start", "error", err.Error()) + logrus.WithError(err).Error("JobOnceScheduler could not start") } // Migrations use the scheduler, so they have to be run after playbookRunService and scheduler have started @@ -218,9 +222,9 @@ func (p *Plugin) OnActivate() error { api.NewGraphQLHandler( p.handler.APIRouter, p.playbookService, + p.playbookRunService, p.categoryService, pluginAPIClient, - p.bot, p.config, p.permissions, playbookStore, @@ -230,7 +234,6 @@ func (p *Plugin) OnActivate() error { p.handler.APIRouter, p.playbookService, pluginAPIClient, - p.bot, p.config, p.permissions, ) @@ -242,16 +245,15 @@ func (p *Plugin) OnActivate() error { p.licenseChecker, pluginAPIClient, p.bot, - p.bot, p.config, ) - api.NewStatsHandler(p.handler.APIRouter, pluginAPIClient, p.bot, statsStore, p.playbookService, p.permissions, p.licenseChecker) - api.NewBotHandler(p.handler.APIRouter, pluginAPIClient, p.bot, p.bot, p.config, p.playbookRunService, p.userInfoStore) - api.NewTelemetryHandler(p.handler.APIRouter, p.playbookRunService, pluginAPIClient, p.bot, p.telemetryClient, p.playbookService, p.telemetryClient, p.telemetryClient, p.permissions) - api.NewSignalHandler(p.handler.APIRouter, pluginAPIClient, p.bot, p.playbookRunService, p.playbookService, keywordsThreadIgnorer) - api.NewSettingsHandler(p.handler.APIRouter, pluginAPIClient, p.bot, p.config) - api.NewActionsHandler(p.handler.APIRouter, p.bot, p.channelActionService, p.pluginAPI, p.permissions) - api.NewCategoryHandler(p.handler.APIRouter, pluginAPIClient, p.bot, p.categoryService, p.playbookService, p.playbookRunService) + api.NewStatsHandler(p.handler.APIRouter, pluginAPIClient, statsStore, p.playbookService, p.permissions, p.licenseChecker) + api.NewBotHandler(p.handler.APIRouter, pluginAPIClient, p.bot, p.config, p.playbookRunService, p.userInfoStore) + api.NewTelemetryHandler(p.handler.APIRouter, p.playbookRunService, pluginAPIClient, p.telemetryClient, p.playbookService, p.telemetryClient, p.telemetryClient, p.telemetryClient, p.permissions) + api.NewSignalHandler(p.handler.APIRouter, pluginAPIClient, p.playbookRunService, p.playbookService, keywordsThreadIgnorer) + api.NewSettingsHandler(p.handler.APIRouter, pluginAPIClient, p.config) + api.NewActionsHandler(p.handler.APIRouter, p.channelActionService, p.pluginAPI, p.permissions) + api.NewCategoryHandler(p.handler.APIRouter, pluginAPIClient, p.categoryService, p.playbookService, p.playbookRunService) isTestingEnabled := false flag := p.API.GetConfig().ServiceSettings.EnableTesting @@ -262,12 +264,15 @@ func (p *Plugin) OnActivate() error { return errors.Wrapf(err, "failed register commands") } - // run metrics server to expose data - p.runMetricsServer() - // run metrics updater recurring task - p.runMetricsUpdaterTask(playbookStore, playbookRunStore, updateMetricsTaskFrequency) - // set error counter middleware handler - p.handler.APIRouter.Use(p.getErrorCounterHandler()) + enableMetrics := p.API.GetConfig().MetricsSettings.Enable + if enableMetrics != nil && *enableMetrics { + // run metrics server to expose data + p.runMetricsServer() + // run metrics updater recurring task + p.runMetricsUpdaterTask(playbookStore, playbookRunStore, updateMetricsTaskFrequency) + // set error counter middleware handler + p.handler.APIRouter.Use(p.getErrorCounterHandler()) + } // prevent a recursive OnConfigurationChange go func() { @@ -290,7 +295,7 @@ func (p *Plugin) OnConfigurationChange() error { // ExecuteCommand executes a command that has been previously registered via the RegisterCommand. func (p *Plugin) ExecuteCommand(c *plugin.Context, args *model.CommandArgs) (*model.CommandResponse, *model.AppError) { - runner := command.NewCommandRunner(c, args, pluginapi.NewClient(p.API, p.Driver), p.bot, p.bot, + runner := command.NewCommandRunner(c, args, pluginapi.NewClient(p.API, p.Driver), p.bot, p.playbookRunService, p.playbookService, p.config, p.userInfoStore, p.telemetryClient, p.permissions) if err := runner.Execute(); err != nil { @@ -331,12 +336,14 @@ func (p *Plugin) newMetricsInstance() *metrics.Metrics { } func (p *Plugin) runMetricsServer() { - metricServer := metrics.NewMetricsServer(metricsExposePort, p.metricsService, &p.pluginAPI.Log) + logrus.WithField("port", metricsExposePort).Info("Starting Playbooks metrics server") + + metricServer := metrics.NewMetricsServer(metricsExposePort, p.metricsService) // Run server to expose metrics go func() { err := metricServer.Run() if err != nil { - p.pluginAPI.Log.Error("Metrics server could not be started", "Error", err) + logrus.WithError(err).Error("Metrics server could not be started") } }() } @@ -346,37 +353,37 @@ func (p *Plugin) runMetricsUpdaterTask(playbookStore app.PlaybookStore, playbook if playbooksActiveTotal, err := playbookStore.GetPlaybooksActiveTotal(); err == nil { p.metricsService.ObservePlaybooksActiveTotal(playbooksActiveTotal) } else { - p.pluginAPI.Log.Error("error updating metrics, playbooks_active_total", err) + logrus.WithError(err).Error("error updating metrics, playbooks_active_total") } if runsActiveTotal, err := playbookRunStore.GetRunsActiveTotal(); err == nil { p.metricsService.ObserveRunsActiveTotal(runsActiveTotal) } else { - p.pluginAPI.Log.Error("error updating metrics, runs_active_total", err) + logrus.WithError(err).Error("error updating metrics, runs_active_total") } if remindersOverdueTotal, err := playbookRunStore.GetOverdueUpdateRunsTotal(); err == nil { p.metricsService.ObserveRemindersOutstandingTotal(remindersOverdueTotal) } else { - p.pluginAPI.Log.Error("error updating metrics, reminders_outstanding_total", err) + logrus.WithError(err).Error("error updating metrics, reminders_outstanding_total") } if retrosOverdueTotal, err := playbookRunStore.GetOverdueRetroRunsTotal(); err == nil { p.metricsService.ObserveRetrosOutstandingTotal(retrosOverdueTotal) } else { - p.pluginAPI.Log.Error("error updating metrics, retros_outstanding_total", err) + logrus.WithError(err).Error("error updating metrics, retros_outstanding_total") } if followersActiveTotal, err := playbookRunStore.GetFollowersActiveTotal(); err == nil { p.metricsService.ObserveFollowersActiveTotal(followersActiveTotal) } else { - p.pluginAPI.Log.Error("error updating metrics, followers_active_total", err) + logrus.WithError(err).Error("error updating metrics, followers_active_total") } if participantsActiveTotal, err := playbookRunStore.GetParticipantsActiveTotal(); err == nil { p.metricsService.ObserveParticipantsActiveTotal(participantsActiveTotal) } else { - p.pluginAPI.Log.Error("error updating metrics, participants_active_total", err) + logrus.WithError(err).Error("error updating metrics, participants_active_total") } } diff --git a/server/sqlstore/actions.go b/server/sqlstore/actions.go index f8459cfea7..7148f4d232 100644 --- a/server/sqlstore/actions.go +++ b/server/sqlstore/actions.go @@ -9,7 +9,6 @@ import ( "github.com/go-sql-driver/mysql" "github.com/lib/pq" "github.com/mattermost/mattermost-plugin-playbooks/server/app" - "github.com/mattermost/mattermost-plugin-playbooks/server/bot" "github.com/mattermost/mattermost-server/v6/model" "github.com/pkg/errors" ) @@ -17,14 +16,13 @@ import ( // playbookStore is a sql store for playbooks. Use NewPlaybookStore to create it. type channelActionStore struct { pluginAPI PluginAPIClient - log bot.Logger store *SQLStore queryBuilder sq.StatementBuilderType channelActionSelect sq.SelectBuilder } // NewPlaybookStore creates a new store for playbook service. -func NewChannelActionStore(pluginAPI PluginAPIClient, log bot.Logger, sqlStore *SQLStore) app.ChannelActionStore { +func NewChannelActionStore(pluginAPI PluginAPIClient, sqlStore *SQLStore) app.ChannelActionStore { channelActionSelect := sqlStore.builder. Select( "c.ID", @@ -39,7 +37,6 @@ func NewChannelActionStore(pluginAPI PluginAPIClient, log bot.Logger, sqlStore * return &channelActionStore{ pluginAPI: pluginAPI, - log: log, store: sqlStore, queryBuilder: sqlStore.builder, channelActionSelect: channelActionSelect, @@ -58,6 +55,10 @@ func (c *channelActionStore) Create(action app.GenericChannelAction) (string, er return "", errors.Wrapf(err, "failed to marshal payload json for action id: %q", action.ID) } + if len(payloadJSON) > maxJSONLength { + return "", errors.Wrapf(err, "payload json for action id '%s' is too long (max %d)", action.ID, maxJSONLength) + } + _, err = c.store.execBuilder(c.store.db, sq. Insert("IR_ChannelAction"). SetMap(map[string]interface{}{ diff --git a/server/sqlstore/actions_test.go b/server/sqlstore/actions_test.go index 9793550f2b..37c45eaa98 100644 --- a/server/sqlstore/actions_test.go +++ b/server/sqlstore/actions_test.go @@ -21,15 +21,15 @@ func setupChannelActionStore(t *testing.T, db *sqlx.DB) app.ChannelActionStore { Configuration: configAPI, } - logger, sqlStore := setupSQLStore(t, db) + sqlStore := setupSQLStore(t, db) - return NewChannelActionStore(pluginAPIClient, logger, sqlStore) + return NewChannelActionStore(pluginAPIClient, sqlStore) } func TestViewedChannel(t *testing.T) { for _, driverName := range driverNames { db := setupTestDB(t, driverName) - _, _ = setupSQLStore(t, db) + _ = setupSQLStore(t, db) channelActionStore := setupChannelActionStore(t, db) t.Run("two new users get welcome messages, one old user doesn't", func(t *testing.T) { diff --git a/server/sqlstore/category.go b/server/sqlstore/category.go index 4e9879ef18..01d373eded 100644 --- a/server/sqlstore/category.go +++ b/server/sqlstore/category.go @@ -5,7 +5,6 @@ import ( sq "github.com/Masterminds/squirrel" "github.com/mattermost/mattermost-plugin-playbooks/server/app" - "github.com/mattermost/mattermost-plugin-playbooks/server/bot" "github.com/mattermost/mattermost-server/v6/model" "github.com/pkg/errors" ) @@ -13,7 +12,6 @@ import ( // playbookStore is a sql store for playbooks. Use NewPlaybookStore to create it. type categoryStore struct { pluginAPI PluginAPIClient - log bot.Logger store *SQLStore queryBuilder sq.StatementBuilderType categorySelect sq.SelectBuilder @@ -23,7 +21,7 @@ type categoryStore struct { // Ensure playbookStore implements the playbook.Store interface. var _ app.CategoryStore = (*categoryStore)(nil) -func NewCategoryStore(pluginAPI PluginAPIClient, log bot.Logger, sqlStore *SQLStore) app.CategoryStore { +func NewCategoryStore(pluginAPI PluginAPIClient, sqlStore *SQLStore) app.CategoryStore { categorySelect := sqlStore.builder. Select( "c.ID", @@ -46,7 +44,6 @@ func NewCategoryStore(pluginAPI PluginAPIClient, log bot.Logger, sqlStore *SQLSt return &categoryStore{ pluginAPI: pluginAPI, - log: log, store: sqlStore, queryBuilder: sqlStore.builder, categorySelect: categorySelect, @@ -164,6 +161,7 @@ func (c *categoryStore) Update(category app.Category) error { Update("IR_Category"). Set("Name", category.Name). Set("UpdateAt", category.UpdateAt). + Set("Collapsed", category.Collapsed). Where(sq.Eq{"ID": category.ID})); err != nil { return errors.Wrapf(err, "failed to update category with id '%s'", category.ID) } diff --git a/server/sqlstore/category_test.go b/server/sqlstore/category_test.go index 032cffab11..8601c93b87 100644 --- a/server/sqlstore/category_test.go +++ b/server/sqlstore/category_test.go @@ -21,15 +21,15 @@ func setupCategoryStore(t *testing.T, db *sqlx.DB) app.CategoryStore { Configuration: configAPI, } - logger, sqlStore := setupSQLStore(t, db) + sqlStore := setupSQLStore(t, db) - return NewCategoryStore(pluginAPIClient, logger, sqlStore) + return NewCategoryStore(pluginAPIClient, sqlStore) } func TestCategories(t *testing.T) { for _, driverName := range driverNames { db := setupTestDB(t, driverName) - _, _ = setupSQLStore(t, db) + _ = setupSQLStore(t, db) categoryStore := setupCategoryStore(t, db) t.Run("create category, add items, get category", func(t *testing.T) { diff --git a/server/sqlstore/migrate.go b/server/sqlstore/migrate.go index 79f6ef9444..9a50ec7e81 100644 --- a/server/sqlstore/migrate.go +++ b/server/sqlstore/migrate.go @@ -7,13 +7,16 @@ import ( "path/filepath" "github.com/blang/semver" + + "github.com/mattermost/morph" + "github.com/mattermost/morph/drivers" + "github.com/mattermost/morph/sources" + "github.com/mattermost/morph/sources/embedded" "github.com/pkg/errors" - "github.com/isacikgoz/morph" - "github.com/isacikgoz/morph/drivers" - ms "github.com/isacikgoz/morph/drivers/mysql" - ps "github.com/isacikgoz/morph/drivers/postgres" - "github.com/isacikgoz/morph/sources/embedded" + ms "github.com/mattermost/morph/drivers/mysql" + ps "github.com/mattermost/morph/drivers/postgres" + "github.com/mattermost/mattermost-server/v6/model" ) @@ -28,9 +31,10 @@ func (sqlStore *SQLStore) RunMigrations() error { return errors.Wrapf(err, "failed to get the current schema version") } - if err := sqlStore.runMigrationsWithMorph(); err != nil { - return fmt.Errorf("failed to complete migrations (with morph): %w", err) - } + // WARNING: Disable morph migrations until proper testing + // if err := sqlStore.runMigrationsWithMorph(); err != nil { + // return fmt.Errorf("failed to complete migrations (with morph): %w", err) + // } if currentSchemaVersion.LT(LatestVersion()) { if err := sqlStore.runMigrationsLegacy(currentSchemaVersion); err != nil { @@ -79,34 +83,15 @@ func (sqlStore *SQLStore) migrate(migration Migration) (err error) { return nil } -func (sqlStore *SQLStore) runMigrationsWithMorph() error { +func (sqlStore *SQLStore) createDriver() (drivers.Driver, error) { driverName := sqlStore.db.DriverName() - assetsList, err := assets.ReadDir(filepath.Join("migrations", driverName)) - if err != nil { - return err - } - - assetNamesForDriver := make([]string, len(assetsList)) - for i, entry := range assetsList { - assetNamesForDriver[i] = entry.Name() - } - - src, err := embedded.WithInstance(&embedded.AssetSource{ - Names: assetNamesForDriver, - AssetFunc: func(name string) ([]byte, error) { - return assets.ReadFile(filepath.Join("migrations", driverName, name)) - }, - }) - if err != nil { - return err - } - config := drivers.Config{ StatementTimeoutInSecs: 100000, MigrationsTable: "IR_db_migrations", } var driver drivers.Driver + var err error switch driverName { case model.DatabaseDriverMysql: driver, err = ms.WithInstance(sqlStore.db.DB, &ms.Config{ @@ -120,22 +105,61 @@ func (sqlStore *SQLStore) runMigrationsWithMorph() error { default: err = fmt.Errorf("unsupported database type %s for migration", driverName) } + return driver, err +} + +func (sqlStore *SQLStore) createSource() (sources.Source, error) { + driverName := sqlStore.db.DriverName() + assetsList, err := assets.ReadDir(filepath.Join("migrations", driverName)) if err != nil { - return err + return nil, err } - opts := []morph.EngineOption{ - morph.WithLock("mm-playbooks-lock-key"), + assetNamesForDriver := make([]string, len(assetsList)) + for i, entry := range assetsList { + assetNamesForDriver[i] = entry.Name() } - engine, err := morph.New(context.Background(), driver, src, opts...) + + src, err := embedded.WithInstance(&embedded.AssetSource{ + Names: assetNamesForDriver, + AssetFunc: func(name string) ([]byte, error) { + return assets.ReadFile(filepath.Join("migrations", driverName, name)) + }, + }) + + return src, err +} + +func (sqlStore *SQLStore) createMorphEngine() (*morph.Morph, error) { + src, err := sqlStore.createSource() if err != nil { - return err + return nil, err } - defer engine.Close() - if err := engine.ApplyAll(); err != nil { - return fmt.Errorf("could not apply migrations: %w", err) + driver, err := sqlStore.createDriver() + if err != nil { + return nil, err } - return nil + opts := []morph.EngineOption{ + morph.WithLock("mm-playbooks-lock-key"), + } + engine, err := morph.New(context.Background(), driver, src, opts...) + + return engine, err } + +// WARNING: We don't use morph migration until proper testing +// func (sqlStore *SQLStore) runMigrationsWithMorph() error { +// engine, err := sqlStore.createMorphEngine() +// if err != nil { +// return err +// } +// defer engine.Close() + +// if err := engine.ApplyAll(); err != nil { +// return fmt.Errorf("could not apply migrations: %w", err) +// } + +// return nil +// } diff --git a/server/sqlstore/migrations.go b/server/sqlstore/migrations.go index b1e3165d99..f672a7edd8 100644 --- a/server/sqlstore/migrations.go +++ b/server/sqlstore/migrations.go @@ -2,6 +2,8 @@ package sqlstore import ( "encoding/json" + "fmt" + "strings" "time" sq "github.com/Masterminds/squirrel" @@ -11,6 +13,7 @@ import ( "github.com/mattermost/mattermost-plugin-playbooks/server/app" "github.com/mattermost/mattermost-server/v6/model" "github.com/pkg/errors" + "github.com/sirupsen/logrus" ) type Migration struct { @@ -223,7 +226,11 @@ var migrations = []Migration{ } if playbookRun.ActiveStage < 0 || playbookRun.ActiveStage >= numChecklists { - sqlStore.log.Warnf("index %d out of bounds, playbook ru n'%s' has %d stages: setting ActiveStageTitle to the empty string", playbookRun.ActiveStage, playbookRun.ID, numChecklists) + logrus.WithFields(logrus.Fields{ + "active_stage": playbookRun.ActiveStage, + "playbook_run_id": playbookRun.ID, + "num_checklists": numChecklists, + }).Warn("index out of bounds: setting ActiveStageTitle to the empty string", playbookRun.ActiveStage, playbookRun.ID, numChecklists) continue } @@ -1233,12 +1240,12 @@ var migrations = []Migration{ // Best effort migration so we just log the error to avoid killing the plugin. if e.DriverName() == model.DatabaseDriverMysql { if _, err := e.Exec("UPDATE IGNORE PluginKeyValueStore SET PluginId='playbooks' WHERE PluginId='com.mattermost.plugin-incident-management'"); err != nil { - sqlStore.log.Debugf("%w", errors.Wrapf(err, "failed to migrate KV store plugin id")) + logrus.WithError(err).Error("failed to migrate KV store plugin id") } } else { if _, err := e.Exec("UPDATE PluginKeyValueStore k SET PluginId='playbooks' WHERE PluginId='com.mattermost.plugin-incident-management' AND NOT EXISTS ( SELECT 1 FROM PluginKeyValueStore WHERE PluginId='playbooks' AND PKey = k.PKey )"); err != nil { - sqlStore.log.Debugf("%w", errors.Wrapf(err, "failed to migrate KV store plugin id")) + logrus.WithError(err).Error("failed to migrate KV store plugin id") } } @@ -2125,7 +2132,228 @@ var migrations = []Migration{ b.UserId IS NULL `); err != nil { // Migration is optional so no failure just logging. (it will not try again) - sqlStore.log.Debugf("%w", errors.Wrapf(err, "failed to add existing users as playbook members")) + logrus.WithError(err).Warn("failed to add existing users as playbook members") + } + + return nil + }, + }, + { + fromVersion: semver.MustParse("0.56.0"), + toVersion: semver.MustParse("0.57.0"), + migrationFunc: func(e sqlx.Ext, sqlStore *SQLStore) error { + if e.DriverName() == model.DatabaseDriverMysql { + if err := addColumnToMySQLTable(e, "IR_Run_Participants", "IsParticipant", "BOOLEAN DEFAULT FALSE"); err != nil { + return errors.Wrapf(err, "failed adding column SummaryModifiedAt to table IR_Incident") + } + if _, err := e.Exec(`ALTER TABLE IR_Run_Participants ALTER IsFollower SET DEFAULT FALSE`); err != nil { + return errors.Wrapf(err, "failed to set new column default for IsFollower") + } + } else { + if err := addColumnToPGTable(e, "IR_Run_Participants", "IsParticipant", "BOOLEAN DEFAULT FALSE"); err != nil { + return errors.Wrapf(err, "failed adding column SummaryModifiedAt to table IR_Incident") + } + if _, err := e.Exec(`ALTER TABLE IR_Run_Participants ALTER COLUMN IsFollower SET DEFAULT FALSE`); err != nil { + return errors.Wrapf(err, "failed to set new column default for IsFollower") + } + } + + return nil + }, + }, + { + fromVersion: semver.MustParse("0.57.0"), + toVersion: semver.MustParse("0.58.0"), + migrationFunc: func(e sqlx.Ext, sqlStore *SQLStore) error { + // Find all users who are members of channels where runs have been created and are followers of the run. + // Update them to become members of the playbook run + var err error + if e.DriverName() == model.DatabaseDriverMysql { + _, err = e.Exec(` + UPDATE IR_Run_Participants + INNER JOIN IR_Incident ON IR_Run_Participants.IncidentID = IR_Incident.ID + INNER JOIN ChannelMembers ON ChannelMembers.ChannelID = IR_Incident.ChannelID + SET IR_Run_Participants.IsParticipant = true + WHERE + IR_Run_Participants.UserID = ChannelMembers.UserID + `) + } else { + _, err = e.Exec(` + UPDATE IR_Run_Participants + SET IsParticipant = true + FROM IR_Incident + INNER JOIN ChannelMembers ON ChannelMembers.ChannelID = IR_Incident.ChannelID + WHERE + IR_Run_Participants.UserID = ChannelMembers.UserID AND + IR_Run_Participants.IncidentID = IR_Incident.ID; + `) + } + if err != nil { + // Migration is optional so no failure just logging. (it will not try again) + logrus.WithError(err).Debug("failed to update existing users as playbook members") + } + + // Find all users who are members of channels where runs have been created. + // Add them as members of the playbook run + if _, err := e.Exec(` + INSERT INTO IR_Run_Participants (UserID, IncidentID, IsFollower, IsParticipant) + SELECT DISTINCT + cm.UserID as UserID, + run.ID as IncidentID, + false as IsFollower, + true as IsParticipant + FROM IR_Incident as run + JOIN ChannelMembers as cm on cm.ChannelID = run.ChannelID + LEFT JOIN IR_Run_Participants as rp on rp.IncidentID = run.ID AND rp.UserID = cm.UserID + WHERE + rp.IncidentID IS NULL + `); err != nil { + // Migration is optional so no failure just logging. (it will not try again) + logrus.WithError(err).Debug("failed to add existing users as playbook members") + } + + return nil + }, + }, + { + fromVersion: semver.MustParse("0.58.0"), + toVersion: semver.MustParse("0.59.0"), + migrationFunc: func(e sqlx.Ext, sqlStore *SQLStore) error { + + type ColTypeChange struct { + ColName string + Size uint32 + } + + // Migrations are only for postgres + if e.DriverName() == model.DatabaseDriverMysql { + return nil + } + + errCollected := []string{} + changes := map[string][]ColTypeChange{ + "ir_incident": { + {"id", 26}, + {"name", 1024}, + {"description", 4096}, + {"commanderuserid", 26}, + {"teamid", 26}, + {"channelid", 26}, + {"postid", 26}, + {"playbookid", 26}, + {"activestagetitle", 1024}, + {"reminderpostid", 26}, + {"broadcastchannelid", 26}, + {"remindermessagetemplate", 65535}, + {"currentstatus", 1024}, + {"reporteruserid", 26}, + {"concatenatedinviteduserids", 65535}, + {"defaultcommanderid", 26}, + {"announcementchannelid", 26}, + {"concatenatedwebhookoncreationurls", 65535}, + {"concatenatedwebhookonstatusupdateurls", 65535}, + {"concatenatedinvitedgroupids", 65535}, + {"retrospective", 65535}, + {"messageonjoin", 65535}, + {"categoryname", 65535}, + {"concatenatedbroadcastchannelids", 65535}, + {"channelidtorootid", 65535}, + }, + "ir_playbook": { + {"id", 26}, + {"title", 1024}, + {"description", 4096}, + {"teamid", 26}, + {"broadcastchannelid", 26}, + {"remindermessagetemplate", 65535}, + {"concatenatedinviteduserids", 65535}, + {"defaultcommanderid", 26}, + {"announcementchannelid", 26}, + {"concatenatedwebhookoncreationurls", 65535}, + {"concatenatedinvitedgroupids", 65535}, + {"messageonjoin", 65535}, + {"retrospectivetemplate", 65535}, + {"concatenatedwebhookonstatusupdateurls", 65535}, + {"concatenatedsignalanykeywords", 65535}, + {"categoryname", 65535}, + {"concatenatedbroadcastchannelids", 65535}, + {"runsummarytemplate", 65535}, + {"channelnametemplate", 65535}, + }, + "ir_statusposts": { + {"incidentid", 26}, + {"postid", 26}, + }, + "ir_category": { + {"id", 26}, + {"name", 512}, + {"teamid", 26}, + {"userid", 26}, + }, + "ir_category_item": { + {"type", 1}, + {"categoryid", 26}, + {"itemid", 26}, + }, + "ir_channelaction": { + {"id", 26}, + {"actiontype", 65535}, + {"triggertype", 65535}, + }, + "ir_metric": { + {"incidentid", 26}, + {"metricconfigid", 26}, + }, + "ir_metricconfig": { + {"id", 26}, + {"playbookid", 26}, + {"title", 512}, + {"description", 4096}, + {"type", 32}, + }, + "ir_playbookautofollow": { + {"playbookid", 26}, + {"userid", 26}, + }, + "ir_playbookmember": { + {"playbookid", 26}, + {"memberid", 26}, + {"roles", 65535}, + }, + "ir_run_participants": { + {"userid", 26}, + {"incidentid", 26}, + }, + "ir_viewedchannel": { + {"userid", 26}, + {"channelid", 26}, + }, + "ir_timelineevent": { + {"id", 26}, + {"incidentid", 26}, + {"eventtype", 32}, + {"summary", 256}, + {"details", 4096}, + {"postid", 26}, + {"subjectuserid", 26}, + {"creatoruserid", 26}, + }, + "ir_userinfo": { + {"id", 26}, + }, + } + + for table, cols := range changes { + for _, col := range cols { + err := changeColumnTypeToPGTable(e, table, col.ColName, fmt.Sprintf("varchar(%d)", col.Size)) + if err != nil { + errCollected = append(errCollected, err.Error()) + } + } + } + + if len(errCollected) > 0 { + return errors.New(strings.Join(errCollected, ",\n ")) } return nil diff --git a/server/sqlstore/migrations/future/mysql/0.59.down.sql b/server/sqlstore/migrations/future/mysql/0.59.down.sql new file mode 100644 index 0000000000..df2abdff5d --- /dev/null +++ b/server/sqlstore/migrations/future/mysql/0.59.down.sql @@ -0,0 +1 @@ +-- intentionally empty, 0.57 migration is only for postgres diff --git a/server/sqlstore/migrations/future/mysql/0.59.up.sql b/server/sqlstore/migrations/future/mysql/0.59.up.sql new file mode 100644 index 0000000000..df2abdff5d --- /dev/null +++ b/server/sqlstore/migrations/future/mysql/0.59.up.sql @@ -0,0 +1 @@ +-- intentionally empty, 0.57 migration is only for postgres diff --git a/server/sqlstore/migrations/future/postgres/0.59.down.sql b/server/sqlstore/migrations/future/postgres/0.59.down.sql new file mode 100644 index 0000000000..72e4ad0ca2 --- /dev/null +++ b/server/sqlstore/migrations/future/postgres/0.59.down.sql @@ -0,0 +1,96 @@ + +ALTER TABLE ir_incident ALTER COLUMN id TYPE text; +ALTER TABLE ir_incident ALTER COLUMN name TYPE text; +ALTER TABLE ir_incident ALTER COLUMN description TYPE text; +ALTER TABLE ir_incident ALTER COLUMN commanderuserid TYPE text; +ALTER TABLE ir_incident ALTER COLUMN teamid TYPE text; +ALTER TABLE ir_incident ALTER COLUMN channelid TYPE text; +ALTER TABLE ir_incident ALTER COLUMN postid TYPE text; +ALTER TABLE ir_incident ALTER COLUMN playbookid TYPE text; +ALTER TABLE ir_incident ALTER COLUMN activestagetitle TYPE text; +ALTER TABLE ir_incident ALTER COLUMN reminderpostid TYPE text; +ALTER TABLE ir_incident ALTER COLUMN broadcastchannelid TYPE text; +ALTER TABLE ir_incident ALTER COLUMN remindermessagetemplate TYPE text; +ALTER TABLE ir_incident ALTER COLUMN currentstatus TYPE text; +ALTER TABLE ir_incident ALTER COLUMN reporteruserid TYPE text; +ALTER TABLE ir_incident ALTER COLUMN concatenatedinviteduserids TYPE text; +ALTER TABLE ir_incident ALTER COLUMN defaultcommanderid TYPE text; +ALTER TABLE ir_incident ALTER COLUMN announcementchannelid TYPE text; +ALTER TABLE ir_incident ALTER COLUMN concatenatedwebhookoncreationurls TYPE text; +ALTER TABLE ir_incident ALTER COLUMN concatenatedwebhookonstatusupdateurls TYPE text; +ALTER TABLE ir_incident ALTER COLUMN concatenatedinvitedgroupids TYPE text; +ALTER TABLE ir_incident ALTER COLUMN retrospective TYPE text; +ALTER TABLE ir_incident ALTER COLUMN messageonjoin TYPE text; +ALTER TABLE ir_incident ALTER COLUMN categoryname TYPE text; +ALTER TABLE ir_incident ALTER COLUMN concatenatedbroadcastchannelids TYPE text; +ALTER TABLE ir_incident ALTER COLUMN channelidtorootid TYPE text; + +ALTER TABLE ir_playbook ALTER COLUMN id TYPE text; +ALTER TABLE ir_playbook ALTER COLUMN title TYPE text; +ALTER TABLE ir_playbook ALTER COLUMN description TYPE text; +ALTER TABLE ir_playbook ALTER COLUMN teamid TYPE text; +ALTER TABLE ir_playbook ALTER COLUMN broadcastchannelid TYPE text; +ALTER TABLE ir_playbook ALTER COLUMN remindermessagetemplate TYPE text; +ALTER TABLE ir_playbook ALTER COLUMN concatenatedinviteduserids TYPE text; +ALTER TABLE ir_playbook ALTER COLUMN defaultcommanderid TYPE text; +ALTER TABLE ir_playbook ALTER COLUMN announcementchannelid TYPE text; +ALTER TABLE ir_playbook ALTER COLUMN concatenatedwebhookoncreationurls TYPE text; +ALTER TABLE ir_playbook ALTER COLUMN concatenatedinvitedgroupids TYPE text; +ALTER TABLE ir_playbook ALTER COLUMN messageonjoin TYPE text; +ALTER TABLE ir_playbook ALTER COLUMN retrospectivetemplate TYPE text; +ALTER TABLE ir_playbook ALTER COLUMN concatenatedwebhookonstatusupdateurls TYPE text; +ALTER TABLE ir_playbook ALTER COLUMN concatenatedsignalanykeywords TYPE text; +ALTER TABLE ir_playbook ALTER COLUMN categoryname TYPE text; +ALTER TABLE ir_playbook ALTER COLUMN concatenatedbroadcastchannelids TYPE text; +ALTER TABLE ir_playbook ALTER COLUMN runsummarytemplate TYPE text; +ALTER TABLE ir_playbook ALTER COLUMN channelnametemplate TYPE text; + +ALTER TABLE ir_statusposts ALTER COLUMN incidentid TYPE text; +ALTER TABLE ir_statusposts ALTER COLUMN postid TYPE text; + +ALTER TABLE ir_category ALTER COLUMN id TYPE text; +ALTER TABLE ir_category ALTER COLUMN name TYPE text; +ALTER TABLE ir_category ALTER COLUMN teamid TYPE text; +ALTER TABLE ir_category ALTER COLUMN userid TYPE text; + + +ALTER TABLE ir_category_item ALTER COLUMN type TYPE text; +ALTER TABLE ir_category_item ALTER COLUMN categoryid TYPE text; +ALTER TABLE ir_category_item ALTER COLUMN itemid TYPE text; + +ALTER TABLE ir_channelaction ALTER COLUMN id TYPE text; +ALTER TABLE ir_channelaction ALTER COLUMN actiontype TYPE text; +ALTER TABLE ir_channelaction ALTER COLUMN triggertype TYPE text; + +ALTER TABLE ir_metric ALTER COLUMN incidentid TYPE text; +ALTER TABLE ir_metric ALTER COLUMN metricconfigid TYPE text; + +ALTER TABLE ir_metricconfig ALTER COLUMN id TYPE text; +ALTER TABLE ir_metricconfig ALTER COLUMN playbookid TYPE text; +ALTER TABLE ir_metricconfig ALTER COLUMN title TYPE text; +ALTER TABLE ir_metricconfig ALTER COLUMN description TYPE text; +ALTER TABLE ir_metricconfig ALTER COLUMN type TYPE text; + +ALTER TABLE ir_playbookautofollow ALTER COLUMN playbookid TYPE text; +ALTER TABLE ir_playbookautofollow ALTER COLUMN userid TYPE text; + +ALTER TABLE ir_playbookmember ALTER COLUMN playbookid TYPE text; +ALTER TABLE ir_playbookmember ALTER COLUMN memberid TYPE text; +ALTER TABLE ir_playbookmember ALTER COLUMN roles TYPE text; + +ALTER TABLE ir_run_participants ALTER COLUMN userid TYPE text; +ALTER TABLE ir_run_participants ALTER COLUMN incidentid TYPE text; + +ALTER TABLE ir_timelineevent ALTER COLUMN id TYPE text; +ALTER TABLE ir_timelineevent ALTER COLUMN incidentid TYPE text; +ALTER TABLE ir_timelineevent ALTER COLUMN eventtype TYPE text; +ALTER TABLE ir_timelineevent ALTER COLUMN summary TYPE text; +ALTER TABLE ir_timelineevent ALTER COLUMN details TYPE text; +ALTER TABLE ir_timelineevent ALTER COLUMN postid TYPE text; +ALTER TABLE ir_timelineevent ALTER COLUMN subjectuserid TYPE text; +ALTER TABLE ir_timelineevent ALTER COLUMN creatoruserid TYPE text; + +ALTER TABLE ir_userinfo ALTER COLUMN id TYPE text; + +ALTER TABLE ir_viewedchannel ALTER COLUMN userid TYPE text; +ALTER TABLE ir_viewedchannel ALTER COLUMN channelid TYPE text; diff --git a/server/sqlstore/migrations/future/postgres/0.59.up.sql b/server/sqlstore/migrations/future/postgres/0.59.up.sql new file mode 100644 index 0000000000..c61b17e57d --- /dev/null +++ b/server/sqlstore/migrations/future/postgres/0.59.up.sql @@ -0,0 +1,95 @@ +ALTER TABLE ir_incident ALTER COLUMN id TYPE varchar(26); +ALTER TABLE ir_incident ALTER COLUMN name TYPE varchar(1024); +ALTER TABLE ir_incident ALTER COLUMN description TYPE varchar(4096); +ALTER TABLE ir_incident ALTER COLUMN commanderuserid TYPE varchar(26); +ALTER TABLE ir_incident ALTER COLUMN teamid TYPE varchar(26); +ALTER TABLE ir_incident ALTER COLUMN channelid TYPE varchar(26); +ALTER TABLE ir_incident ALTER COLUMN postid TYPE varchar(26); +ALTER TABLE ir_incident ALTER COLUMN playbookid TYPE varchar(26); +ALTER TABLE ir_incident ALTER COLUMN activestagetitle TYPE varchar(1024); +ALTER TABLE ir_incident ALTER COLUMN reminderpostid TYPE varchar(26); +ALTER TABLE ir_incident ALTER COLUMN broadcastchannelid TYPE varchar(26); +ALTER TABLE ir_incident ALTER COLUMN remindermessagetemplate TYPE varchar(65535); +ALTER TABLE ir_incident ALTER COLUMN currentstatus TYPE varchar(1024); +ALTER TABLE ir_incident ALTER COLUMN reporteruserid TYPE varchar(26); +ALTER TABLE ir_incident ALTER COLUMN concatenatedinviteduserids TYPE varchar(65535); +ALTER TABLE ir_incident ALTER COLUMN defaultcommanderid TYPE varchar(26); +ALTER TABLE ir_incident ALTER COLUMN announcementchannelid TYPE varchar(26); +ALTER TABLE ir_incident ALTER COLUMN concatenatedwebhookoncreationurls TYPE varchar(65535); +ALTER TABLE ir_incident ALTER COLUMN concatenatedwebhookonstatusupdateurls TYPE varchar(65535); +ALTER TABLE ir_incident ALTER COLUMN concatenatedinvitedgroupids TYPE varchar(65535); +ALTER TABLE ir_incident ALTER COLUMN retrospective TYPE varchar(65535); +ALTER TABLE ir_incident ALTER COLUMN messageonjoin TYPE varchar(65535); +ALTER TABLE ir_incident ALTER COLUMN categoryname TYPE varchar(65535); +ALTER TABLE ir_incident ALTER COLUMN concatenatedbroadcastchannelids TYPE varchar(65535); +ALTER TABLE ir_incident ALTER COLUMN channelidtorootid TYPE varchar(65535); + + +ALTER TABLE ir_playbook ALTER COLUMN id TYPE varchar(26); +ALTER TABLE ir_playbook ALTER COLUMN title TYPE varchar(1024); +ALTER TABLE ir_playbook ALTER COLUMN description TYPE varchar(4096); +ALTER TABLE ir_playbook ALTER COLUMN teamid TYPE varchar(26); +ALTER TABLE ir_playbook ALTER COLUMN broadcastchannelid TYPE varchar(26); +ALTER TABLE ir_playbook ALTER COLUMN remindermessagetemplate TYPE varchar(65535); +ALTER TABLE ir_playbook ALTER COLUMN concatenatedinviteduserids TYPE varchar(65535); +ALTER TABLE ir_playbook ALTER COLUMN defaultcommanderid TYPE varchar(26); +ALTER TABLE ir_playbook ALTER COLUMN announcementchannelid TYPE varchar(26); +ALTER TABLE ir_playbook ALTER COLUMN concatenatedwebhookoncreationurls TYPE varchar(65535); +ALTER TABLE ir_playbook ALTER COLUMN concatenatedinvitedgroupids TYPE varchar(65535); +ALTER TABLE ir_playbook ALTER COLUMN messageonjoin TYPE varchar(65535); +ALTER TABLE ir_playbook ALTER COLUMN retrospectivetemplate TYPE varchar(65535); +ALTER TABLE ir_playbook ALTER COLUMN concatenatedwebhookonstatusupdateurls TYPE varchar(65535); +ALTER TABLE ir_playbook ALTER COLUMN concatenatedsignalanykeywords TYPE varchar(65535); +ALTER TABLE ir_playbook ALTER COLUMN categoryname TYPE varchar(65535); +ALTER TABLE ir_playbook ALTER COLUMN concatenatedbroadcastchannelids TYPE varchar(65535); +ALTER TABLE ir_playbook ALTER COLUMN runsummarytemplate TYPE varchar(65535); +ALTER TABLE ir_playbook ALTER COLUMN channelnametemplate TYPE varchar(65535); + +ALTER TABLE ir_statusposts ALTER COLUMN incidentid TYPE varchar(26); +ALTER TABLE ir_statusposts ALTER COLUMN postid TYPE varchar(26); + +ALTER TABLE ir_category ALTER COLUMN id TYPE varchar(26); +ALTER TABLE ir_category ALTER COLUMN name TYPE varchar(512); +ALTER TABLE ir_category ALTER COLUMN teamid TYPE varchar(26); +ALTER TABLE ir_category ALTER COLUMN userid TYPE varchar(26); + +ALTER TABLE ir_category_item ALTER COLUMN type TYPE varchar(1); +ALTER TABLE ir_category_item ALTER COLUMN categoryid TYPE varchar(26); +ALTER TABLE ir_category_item ALTER COLUMN itemid TYPE varchar(26); + +ALTER TABLE ir_channelaction ALTER COLUMN id TYPE varchar(26); +ALTER TABLE ir_channelaction ALTER COLUMN actiontype TYPE varchar(65535); +ALTER TABLE ir_channelaction ALTER COLUMN triggertype TYPE varchar(65535); + +ALTER TABLE ir_metric ALTER COLUMN incidentid TYPE varchar(26); +ALTER TABLE ir_metric ALTER COLUMN metricconfigid TYPE varchar(26); + +ALTER TABLE ir_metricconfig ALTER COLUMN id TYPE varchar(26); +ALTER TABLE ir_metricconfig ALTER COLUMN playbookid TYPE varchar(26); +ALTER TABLE ir_metricconfig ALTER COLUMN title TYPE varchar(512); +ALTER TABLE ir_metricconfig ALTER COLUMN description TYPE varchar(4096); +ALTER TABLE ir_metricconfig ALTER COLUMN type TYPE varchar(32); + +ALTER TABLE ir_playbookautofollow ALTER COLUMN playbookid TYPE varchar(26); +ALTER TABLE ir_playbookautofollow ALTER COLUMN userid TYPE varchar(26); + +ALTER TABLE ir_playbookmember ALTER COLUMN playbookid TYPE varchar(26); +ALTER TABLE ir_playbookmember ALTER COLUMN memberid TYPE varchar(26); +ALTER TABLE ir_playbookmember ALTER COLUMN roles TYPE varchar(65535); + +ALTER TABLE ir_run_participants ALTER COLUMN userid TYPE varchar(26); +ALTER TABLE ir_run_participants ALTER COLUMN incidentid TYPE varchar(26); + +ALTER TABLE ir_timelineevent ALTER COLUMN id TYPE varchar(26); +ALTER TABLE ir_timelineevent ALTER COLUMN incidentid TYPE varchar(26); +ALTER TABLE ir_timelineevent ALTER COLUMN eventtype TYPE varchar(32); +ALTER TABLE ir_timelineevent ALTER COLUMN summary TYPE varchar(256); +ALTER TABLE ir_timelineevent ALTER COLUMN details TYPE varchar(4096); +ALTER TABLE ir_timelineevent ALTER COLUMN postid TYPE varchar(26); +ALTER TABLE ir_timelineevent ALTER COLUMN subjectuserid TYPE varchar(26); +ALTER TABLE ir_timelineevent ALTER COLUMN creatoruserid TYPE varchar(26); + +ALTER TABLE ir_userinfo ALTER COLUMN id TYPE varchar(26); + +ALTER TABLE ir_viewedchannel ALTER COLUMN userid TYPE varchar(26); +ALTER TABLE ir_viewedchannel ALTER COLUMN channelid TYPE varchar(26); diff --git a/server/sqlstore/migrations/mysql/000003_create_ir_playbook.down.sql b/server/sqlstore/migrations/mysql/000003_create_ir_playbook.down.sql new file mode 100644 index 0000000000..79e50aab1a --- /dev/null +++ b/server/sqlstore/migrations/mysql/000003_create_ir_playbook.down.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS IR_Playbook; diff --git a/server/sqlstore/migrations/mysql/000003_create_ir_playbook.up.sql b/server/sqlstore/migrations/mysql/000003_create_ir_playbook.up.sql new file mode 100644 index 0000000000..6d1325d299 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000003_create_ir_playbook.up.sql @@ -0,0 +1,14 @@ +CREATE TABLE IF NOT EXISTS IR_Playbook ( + ID VARCHAR(26) PRIMARY KEY, + Title VARCHAR(1024) NOT NULL, + Description VARCHAR(4096) NOT NULL, + TeamID VARCHAR(26) NOT NULL, + CreatePublicIncident BOOLEAN NOT NULL, + CreateAt BIGINT NOT NULL, + DeleteAt BIGINT NOT NULL DEFAULT 0, + ChecklistsJSON TEXT NOT NULL, + NumStages BIGINT NOT NULL DEFAULT 0, + NumSteps BIGINT NOT NULL DEFAULT 0, + INDEX IR_Playbook_TeamID (TeamID), + INDEX IR_PlaybookMember_PlaybookID (ID) +) DEFAULT CHARACTER SET utf8mb4; diff --git a/server/sqlstore/migrations/mysql/000004_create_ir_playbook_member.down.sql b/server/sqlstore/migrations/mysql/000004_create_ir_playbook_member.down.sql new file mode 100644 index 0000000000..6edfe5ff38 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000004_create_ir_playbook_member.down.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS IR_PlaybookMember; diff --git a/server/sqlstore/migrations/mysql/000004_create_ir_playbook_member.up.sql b/server/sqlstore/migrations/mysql/000004_create_ir_playbook_member.up.sql new file mode 100644 index 0000000000..28e3951ffd --- /dev/null +++ b/server/sqlstore/migrations/mysql/000004_create_ir_playbook_member.up.sql @@ -0,0 +1,6 @@ +CREATE TABLE IF NOT EXISTS IR_PlaybookMember ( + PlaybookID VARCHAR(26) NOT NULL REFERENCES IR_Playbook(ID), + MemberID VARCHAR(26) NOT NULL, + INDEX IR_PlaybookMember_PlaybookID (PlaybookID), + INDEX IR_PlaybookMember_MemberID (MemberID) +) DEFAULT CHARACTER SET utf8mb4; diff --git a/server/sqlstore/migrations/mysql/000005_add_active_stage_title_to_ir_incident.down.sql b/server/sqlstore/migrations/mysql/000005_add_active_stage_title_to_ir_incident.down.sql new file mode 100644 index 0000000000..d98873c9ba --- /dev/null +++ b/server/sqlstore/migrations/mysql/000005_add_active_stage_title_to_ir_incident.down.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Incident' + AND table_schema = DATABASE() + AND column_name = 'ActiveStageTitle' + ), + 'ALTER TABLE IR_Incident DROP COLUMN ActiveStageTitle;', + 'SELECT 1;' +)); + +PREPARE removeColumnIfExists FROM @preparedStatement; +EXECUTE removeColumnIfExists; +DEALLOCATE PREPARE removeColumnIfExists; \ No newline at end of file diff --git a/server/sqlstore/migrations/mysql/000005_add_active_stage_title_to_ir_incident.up.sql b/server/sqlstore/migrations/mysql/000005_add_active_stage_title_to_ir_incident.up.sql new file mode 100644 index 0000000000..54fc500baf --- /dev/null +++ b/server/sqlstore/migrations/mysql/000005_add_active_stage_title_to_ir_incident.up.sql @@ -0,0 +1,22 @@ +SET @preparedStatement = (SELECT IF( + NOT EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Incident' + AND table_schema = DATABASE() + AND column_name = 'ActiveStageTitle' + ), + 'ALTER TABLE IR_Incident ADD COLUMN ActiveStageTitle VARCHAR(1024) DEFAULT "";', + 'SELECT 1;' +)); + +PREPARE addColumnIfNotExists FROM @preparedStatement; +EXECUTE addColumnIfNotExists; +DEALLOCATE PREPARE addColumnIfNotExists; + + +UPDATE IR_Incident +SET ActiveStageTitle = JSON_UNQUOTE(JSON_EXTRACT(JSON_EXTRACT(`ChecklistsJSON`, CONCAT('$[', activestage, ']')), '$.title')) +WHERE JSON_VALID(ChecklistsJSON) = 1 +AND JSON_TYPE(ChecklistsJSON) = 'ARRAY' +AND JSON_LENGTH(ChecklistsJSON) > ActiveStage +AND ActiveStage >= 0; diff --git a/server/sqlstore/migrations/mysql/000006_create_ir_status_posts.down.sql b/server/sqlstore/migrations/mysql/000006_create_ir_status_posts.down.sql new file mode 100644 index 0000000000..8fc426811d --- /dev/null +++ b/server/sqlstore/migrations/mysql/000006_create_ir_status_posts.down.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS IR_StatusPosts; diff --git a/server/sqlstore/migrations/mysql/000006_create_ir_status_posts.up.sql b/server/sqlstore/migrations/mysql/000006_create_ir_status_posts.up.sql new file mode 100644 index 0000000000..979e4124ae --- /dev/null +++ b/server/sqlstore/migrations/mysql/000006_create_ir_status_posts.up.sql @@ -0,0 +1,7 @@ +CREATE TABLE IF NOT EXISTS IR_StatusPosts ( + IncidentID VARCHAR(26) NOT NULL REFERENCES IR_Incident(ID), + PostID VARCHAR(26) NOT NULL, + CONSTRAINT posts_unique UNIQUE (IncidentID, PostID), + INDEX IR_StatusPosts_IncidentID (IncidentID), + INDEX IR_StatusPosts_PostID (PostID) +) DEFAULT CHARACTER SET utf8mb4; diff --git a/server/sqlstore/migrations/mysql/000007_add_reminder_post_id_to_ir_incident.down.sql b/server/sqlstore/migrations/mysql/000007_add_reminder_post_id_to_ir_incident.down.sql new file mode 100644 index 0000000000..e30e5e17e1 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000007_add_reminder_post_id_to_ir_incident.down.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Incident' + AND table_schema = DATABASE() + AND column_name = 'ReminderPostID' + ), + 'ALTER TABLE IR_Incident DROP COLUMN ReminderPostID;', + 'SELECT 1;' +)); + +PREPARE removeColumnIfExists FROM @preparedStatement; +EXECUTE removeColumnIfExists; +DEALLOCATE PREPARE removeColumnIfExists; diff --git a/server/sqlstore/migrations/mysql/000007_add_reminder_post_id_to_ir_incident.up.sql b/server/sqlstore/migrations/mysql/000007_add_reminder_post_id_to_ir_incident.up.sql new file mode 100644 index 0000000000..f187bca335 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000007_add_reminder_post_id_to_ir_incident.up.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + NOT EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Incident' + AND table_schema = DATABASE() + AND column_name = 'ReminderPostID' + ), + 'ALTER TABLE IR_Incident ADD COLUMN ReminderPostID VARCHAR(26);', + 'SELECT 1;' +)); + +PREPARE addColumnIfNotExists FROM @preparedStatement; +EXECUTE addColumnIfNotExists; +DEALLOCATE PREPARE addColumnIfNotExists; diff --git a/server/sqlstore/migrations/mysql/000008_add_broadcast_channel_id_to_ir_incident.down.sql b/server/sqlstore/migrations/mysql/000008_add_broadcast_channel_id_to_ir_incident.down.sql new file mode 100644 index 0000000000..7b00a9ff30 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000008_add_broadcast_channel_id_to_ir_incident.down.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Incident' + AND table_schema = DATABASE() + AND column_name = 'BroadcastChannelID' + ), + 'ALTER TABLE IR_Incident DROP COLUMN BroadcastChannelID;', + 'SELECT 1;' +)); + +PREPARE removeColumnIfExists FROM @preparedStatement; +EXECUTE removeColumnIfExists; +DEALLOCATE PREPARE removeColumnIfExists; diff --git a/server/sqlstore/migrations/mysql/000008_add_broadcast_channel_id_to_ir_incident.up.sql b/server/sqlstore/migrations/mysql/000008_add_broadcast_channel_id_to_ir_incident.up.sql new file mode 100644 index 0000000000..af26b4a844 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000008_add_broadcast_channel_id_to_ir_incident.up.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + NOT EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Incident' + AND table_schema = DATABASE() + AND column_name = 'BroadcastChannelID' + ), + 'ALTER TABLE IR_Incident ADD COLUMN BroadcastChannelID VARCHAR(26) DEFAULT "";', + 'SELECT 1;' +)); + +PREPARE addColumnIfNotExists FROM @preparedStatement; +EXECUTE addColumnIfNotExists; +DEALLOCATE PREPARE addColumnIfNotExists; diff --git a/server/sqlstore/migrations/mysql/000009_add_broadcast_channel_id_to_ir_playbook.down.sql b/server/sqlstore/migrations/mysql/000009_add_broadcast_channel_id_to_ir_playbook.down.sql new file mode 100644 index 0000000000..f67b800212 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000009_add_broadcast_channel_id_to_ir_playbook.down.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Playbook' + AND table_schema = DATABASE() + AND column_name = 'BroadcastChannelID' + ), + 'ALTER TABLE IR_Playbook DROP COLUMN BroadcastChannelID;', + 'SELECT 1;' +)); + +PREPARE removeColumnIfExists FROM @preparedStatement; +EXECUTE removeColumnIfExists; +DEALLOCATE PREPARE removeColumnIfExists; diff --git a/server/sqlstore/migrations/mysql/000009_add_broadcast_channel_id_to_ir_playbook.up.sql b/server/sqlstore/migrations/mysql/000009_add_broadcast_channel_id_to_ir_playbook.up.sql new file mode 100644 index 0000000000..4027455f39 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000009_add_broadcast_channel_id_to_ir_playbook.up.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + NOT EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Playbook' + AND table_schema = DATABASE() + AND column_name = 'BroadcastChannelID' + ), + 'ALTER TABLE IR_Playbook ADD COLUMN BroadcastChannelID VARCHAR(26) DEFAULT "";', + 'SELECT 1;' +)); + +PREPARE addColumnIfNotExists FROM @preparedStatement; +EXECUTE addColumnIfNotExists; +DEALLOCATE PREPARE addColumnIfNotExists; diff --git a/server/sqlstore/migrations/mysql/000010_add_previous_reminder_to_ir_incident.down.sql b/server/sqlstore/migrations/mysql/000010_add_previous_reminder_to_ir_incident.down.sql new file mode 100644 index 0000000000..d371a2bb33 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000010_add_previous_reminder_to_ir_incident.down.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Incident' + AND table_schema = DATABASE() + AND column_name = 'PreviousReminder' + ), + 'ALTER TABLE IR_Incident DROP COLUMN PreviousReminder;', + 'SELECT 1;' +)); + +PREPARE removeColumnIfExists FROM @preparedStatement; +EXECUTE removeColumnIfExists; +DEALLOCATE PREPARE removeColumnIfExists; diff --git a/server/sqlstore/migrations/mysql/000010_add_previous_reminder_to_ir_incident.up.sql b/server/sqlstore/migrations/mysql/000010_add_previous_reminder_to_ir_incident.up.sql new file mode 100644 index 0000000000..8e40e4ed85 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000010_add_previous_reminder_to_ir_incident.up.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + NOT EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Incident' + AND table_schema = DATABASE() + AND column_name = 'PreviousReminder' + ), + 'ALTER TABLE IR_Incident ADD COLUMN PreviousReminder BIGINT NOT NULL DEFAULT 0;', + 'SELECT 1;' +)); + +PREPARE addColumnIfNotExists FROM @preparedStatement; +EXECUTE addColumnIfNotExists; +DEALLOCATE PREPARE addColumnIfNotExists; diff --git a/server/sqlstore/migrations/mysql/000011_add_reminder_message_template_to_ir_playbook.down.sql b/server/sqlstore/migrations/mysql/000011_add_reminder_message_template_to_ir_playbook.down.sql new file mode 100644 index 0000000000..46360ddefc --- /dev/null +++ b/server/sqlstore/migrations/mysql/000011_add_reminder_message_template_to_ir_playbook.down.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Playbook' + AND table_schema = DATABASE() + AND column_name = 'ReminderMessageTemplate' + ), + 'ALTER TABLE IR_Playbook DROP COLUMN ReminderMessageTemplate;', + 'SELECT 1;' +)); + +PREPARE removeColumnIfExists FROM @preparedStatement; +EXECUTE removeColumnIfExists; +DEALLOCATE PREPARE removeColumnIfExists; diff --git a/server/sqlstore/migrations/mysql/000011_add_reminder_message_template_to_ir_playbook.up.sql b/server/sqlstore/migrations/mysql/000011_add_reminder_message_template_to_ir_playbook.up.sql new file mode 100644 index 0000000000..e205f45f18 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000011_add_reminder_message_template_to_ir_playbook.up.sql @@ -0,0 +1,18 @@ +SET @preparedStatement = (SELECT IF( + NOT EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Playbook' + AND table_schema = DATABASE() + AND column_name = 'ReminderMessageTemplate' + ), + 'ALTER TABLE IR_Playbook ADD COLUMN ReminderMessageTemplate TEXT;', + 'SELECT 1;' +)); + +PREPARE addColumnIfNotExists FROM @preparedStatement; +EXECUTE addColumnIfNotExists; +DEALLOCATE PREPARE addColumnIfNotExists; + +UPDATE IR_Playbook +SET ReminderMessageTemplate = '' +WHERE ReminderMessageTemplate IS NULL diff --git a/server/sqlstore/migrations/mysql/000012_add_reminder_message_template_to_ir_incident.down.sql b/server/sqlstore/migrations/mysql/000012_add_reminder_message_template_to_ir_incident.down.sql new file mode 100644 index 0000000000..7e967bbc19 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000012_add_reminder_message_template_to_ir_incident.down.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Incident' + AND table_schema = DATABASE() + AND column_name = 'ReminderMessageTemplate' + ), + 'ALTER TABLE IR_Incident DROP COLUMN ReminderMessageTemplate;', + 'SELECT 1;' +)); + +PREPARE removeColumnIfExists FROM @preparedStatement; +EXECUTE removeColumnIfExists; +DEALLOCATE PREPARE removeColumnIfExists; diff --git a/server/sqlstore/migrations/mysql/000012_add_reminder_message_template_to_ir_incident.up.sql b/server/sqlstore/migrations/mysql/000012_add_reminder_message_template_to_ir_incident.up.sql new file mode 100644 index 0000000000..771e3156d3 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000012_add_reminder_message_template_to_ir_incident.up.sql @@ -0,0 +1,18 @@ +SET @preparedStatement = (SELECT IF( + NOT EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Incident' + AND table_schema = DATABASE() + AND column_name = 'ReminderMessageTemplate' + ), + 'ALTER TABLE IR_Incident ADD COLUMN ReminderMessageTemplate TEXT;', + 'SELECT 1;' +)); + +PREPARE addColumnIfNotExists FROM @preparedStatement; +EXECUTE addColumnIfNotExists; +DEALLOCATE PREPARE addColumnIfNotExists; + +UPDATE IR_Incident +SET ReminderMessageTemplate = '' +WHERE ReminderMessageTemplate IS NULL diff --git a/server/sqlstore/migrations/mysql/000013_add_reminder_timer_default_seconds_to_ir_playbook.down.sql b/server/sqlstore/migrations/mysql/000013_add_reminder_timer_default_seconds_to_ir_playbook.down.sql new file mode 100644 index 0000000000..1c7e5710ae --- /dev/null +++ b/server/sqlstore/migrations/mysql/000013_add_reminder_timer_default_seconds_to_ir_playbook.down.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Playbook' + AND table_schema = DATABASE() + AND column_name = 'ReminderTimerDefaultSeconds' + ), + 'ALTER TABLE IR_Playbook DROP COLUMN ReminderTimerDefaultSeconds;', + 'SELECT 1;' +)); + +PREPARE removeColumnIfExists FROM @preparedStatement; +EXECUTE removeColumnIfExists; +DEALLOCATE PREPARE removeColumnIfExists; diff --git a/server/sqlstore/migrations/mysql/000013_add_reminder_timer_default_seconds_to_ir_playbook.up.sql b/server/sqlstore/migrations/mysql/000013_add_reminder_timer_default_seconds_to_ir_playbook.up.sql new file mode 100644 index 0000000000..d544b0ad69 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000013_add_reminder_timer_default_seconds_to_ir_playbook.up.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + NOT EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Playbook' + AND table_schema = DATABASE() + AND column_name = 'ReminderTimerDefaultSeconds' + ), + 'ALTER TABLE IR_Playbook ADD COLUMN ReminderTimerDefaultSeconds BIGINT NOT NULL DEFAULT 0;', + 'SELECT 1;' +)); + +PREPARE addColumnIfNotExists FROM @preparedStatement; +EXECUTE addColumnIfNotExists; +DEALLOCATE PREPARE addColumnIfNotExists; diff --git a/server/sqlstore/migrations/mysql/000014_add_current_status_to_ir_incident.down.sql b/server/sqlstore/migrations/mysql/000014_add_current_status_to_ir_incident.down.sql new file mode 100644 index 0000000000..d918035fd0 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000014_add_current_status_to_ir_incident.down.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Incident' + AND table_schema = DATABASE() + AND column_name = 'CurrentStatus' + ), + 'ALTER TABLE IR_Incident DROP COLUMN CurrentStatus;', + 'SELECT 1;' +)); + +PREPARE removeColumnIfExists FROM @preparedStatement; +EXECUTE removeColumnIfExists; +DEALLOCATE PREPARE removeColumnIfExists; diff --git a/server/sqlstore/migrations/mysql/000014_add_current_status_to_ir_incident.up.sql b/server/sqlstore/migrations/mysql/000014_add_current_status_to_ir_incident.up.sql new file mode 100644 index 0000000000..0c06974dac --- /dev/null +++ b/server/sqlstore/migrations/mysql/000014_add_current_status_to_ir_incident.up.sql @@ -0,0 +1,18 @@ +SET @preparedStatement = (SELECT IF( + NOT EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Incident' + AND table_schema = DATABASE() + AND column_name = 'CurrentStatus' + ), + 'ALTER TABLE IR_Incident ADD COLUMN CurrentStatus VARCHAR(1024) NOT NULL DEFAULT "Active";', + 'SELECT 1;' +)); + +PREPARE addColumnIfNotExists FROM @preparedStatement; +EXECUTE addColumnIfNotExists; +DEALLOCATE PREPARE addColumnIfNotExists; + +UPDATE IR_Incident +SET CurrentStatus = 'Resolved' +WHERE EndAt != 0 diff --git a/server/sqlstore/migrations/mysql/000015_add_status_to_ir_status_posts.down.sql b/server/sqlstore/migrations/mysql/000015_add_status_to_ir_status_posts.down.sql new file mode 100644 index 0000000000..2099192fce --- /dev/null +++ b/server/sqlstore/migrations/mysql/000015_add_status_to_ir_status_posts.down.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_StatusPosts' + AND table_schema = DATABASE() + AND column_name = 'Status' + ), + 'ALTER TABLE IR_StatusPosts DROP COLUMN Status;', + 'SELECT 1;' +)); + +PREPARE removeColumnIfExists FROM @preparedStatement; +EXECUTE removeColumnIfExists; +DEALLOCATE PREPARE removeColumnIfExists; diff --git a/server/sqlstore/migrations/mysql/000015_add_status_to_ir_status_posts.up.sql b/server/sqlstore/migrations/mysql/000015_add_status_to_ir_status_posts.up.sql new file mode 100644 index 0000000000..4d719ebdcf --- /dev/null +++ b/server/sqlstore/migrations/mysql/000015_add_status_to_ir_status_posts.up.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + NOT EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_StatusPosts' + AND table_schema = DATABASE() + AND column_name = 'Status' + ), + 'ALTER TABLE IR_StatusPosts ADD COLUMN Status VARCHAR(1024) NOT NULL DEFAULT "";', + 'SELECT 1;' +)); + +PREPARE addColumnIfNotExists FROM @preparedStatement; +EXECUTE addColumnIfNotExists; +DEALLOCATE PREPARE addColumnIfNotExists; diff --git a/server/sqlstore/migrations/mysql/000016_create_ir_timeline_event.down.sql b/server/sqlstore/migrations/mysql/000016_create_ir_timeline_event.down.sql new file mode 100644 index 0000000000..d218e43a0b --- /dev/null +++ b/server/sqlstore/migrations/mysql/000016_create_ir_timeline_event.down.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS IR_TimelineEvent; diff --git a/server/sqlstore/migrations/mysql/000016_create_ir_timeline_event.up.sql b/server/sqlstore/migrations/mysql/000016_create_ir_timeline_event.up.sql new file mode 100644 index 0000000000..0891c88ede --- /dev/null +++ b/server/sqlstore/migrations/mysql/000016_create_ir_timeline_event.up.sql @@ -0,0 +1,15 @@ +CREATE TABLE IF NOT EXISTS IR_TimelineEvent ( + ID VARCHAR(26) NOT NULL, + IncidentID VARCHAR(26) NOT NULL REFERENCES IR_Incident(ID), + CreateAt BIGINT NOT NULL, + DeleteAt BIGINT NOT NULL DEFAULT 0, + EventAt BIGINT NOT NULL, + EventType VARCHAR(32) NOT NULL DEFAULT '', + Summary VARCHAR(256) NOT NULL DEFAULT '', + Details VARCHAR(4096) NOT NULL DEFAULT '', + PostID VARCHAR(26) NOT NULL DEFAULT '', + SubjectUserID VARCHAR(26) NOT NULL DEFAULT '', + CreatorUserID VARCHAR(26) NOT NULL DEFAULT '', + INDEX IR_TimelineEvent_ID (ID), + INDEX IR_TimelineEvent_IncidentID (IncidentID) +) DEFAULT CHARACTER SET utf8mb4; diff --git a/server/sqlstore/migrations/mysql/000017_add_reporter_user_id_to_ir_incident.down.sql b/server/sqlstore/migrations/mysql/000017_add_reporter_user_id_to_ir_incident.down.sql new file mode 100644 index 0000000000..ee746a6082 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000017_add_reporter_user_id_to_ir_incident.down.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Incident' + AND table_schema = DATABASE() + AND column_name = 'ReporterUserID' + ), + 'ALTER TABLE IR_Incident DROP COLUMN ReporterUserID;', + 'SELECT 1;' +)); + +PREPARE removeColumnIfExists FROM @preparedStatement; +EXECUTE removeColumnIfExists; +DEALLOCATE PREPARE removeColumnIfExists; diff --git a/server/sqlstore/migrations/mysql/000017_add_reporter_user_id_to_ir_incident.up.sql b/server/sqlstore/migrations/mysql/000017_add_reporter_user_id_to_ir_incident.up.sql new file mode 100644 index 0000000000..81c4d56277 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000017_add_reporter_user_id_to_ir_incident.up.sql @@ -0,0 +1,18 @@ +SET @preparedStatement = (SELECT IF( + NOT EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Incident' + AND table_schema = DATABASE() + AND column_name = 'ReporterUserID' + ), + 'ALTER TABLE IR_Incident ADD COLUMN ReporterUserID VARCHAR(26) NOT NULL DEFAULT "";', + 'SELECT 1;' +)); + +PREPARE addColumnIfNotExists FROM @preparedStatement; +EXECUTE addColumnIfNotExists; +DEALLOCATE PREPARE addColumnIfNotExists; + +UPDATE IR_Incident +SET ReporterUserID = CommanderUserID +WHERE ReporterUserID = '' diff --git a/server/sqlstore/migrations/mysql/000018_add_concatenated_invited_user_ids_to_ir_incident.down.sql b/server/sqlstore/migrations/mysql/000018_add_concatenated_invited_user_ids_to_ir_incident.down.sql new file mode 100644 index 0000000000..9c4564e69a --- /dev/null +++ b/server/sqlstore/migrations/mysql/000018_add_concatenated_invited_user_ids_to_ir_incident.down.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Incident' + AND table_schema = DATABASE() + AND column_name = 'ConcatenatedInvitedUserIDs' + ), + 'ALTER TABLE IR_Incident DROP COLUMN ConcatenatedInvitedUserIDs;', + 'SELECT 1;' +)); + +PREPARE removeColumnIfExists FROM @preparedStatement; +EXECUTE removeColumnIfExists; +DEALLOCATE PREPARE removeColumnIfExists; diff --git a/server/sqlstore/migrations/mysql/000018_add_concatenated_invited_user_ids_to_ir_incident.up.sql b/server/sqlstore/migrations/mysql/000018_add_concatenated_invited_user_ids_to_ir_incident.up.sql new file mode 100644 index 0000000000..e3b876d9ad --- /dev/null +++ b/server/sqlstore/migrations/mysql/000018_add_concatenated_invited_user_ids_to_ir_incident.up.sql @@ -0,0 +1,18 @@ +SET @preparedStatement = (SELECT IF( + NOT EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Incident' + AND table_schema = DATABASE() + AND column_name = 'ConcatenatedInvitedUserIDs' + ), + 'ALTER TABLE IR_Incident ADD COLUMN ConcatenatedInvitedUserIDs TEXT;', + 'SELECT 1;' +)); + +PREPARE addColumnIfNotExists FROM @preparedStatement; +EXECUTE addColumnIfNotExists; +DEALLOCATE PREPARE addColumnIfNotExists; + +UPDATE IR_Incident +SET ConcatenatedInvitedUserIDs = '' +WHERE ConcatenatedInvitedUserIDs IS NULL diff --git a/server/sqlstore/migrations/mysql/000019_add_concatenated_invited_useri_ds_to_ir_playbook.down.sql b/server/sqlstore/migrations/mysql/000019_add_concatenated_invited_useri_ds_to_ir_playbook.down.sql new file mode 100644 index 0000000000..ece6b291d9 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000019_add_concatenated_invited_useri_ds_to_ir_playbook.down.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Playbook' + AND table_schema = DATABASE() + AND column_name = 'ConcatenatedInvitedUserIDs' + ), + 'ALTER TABLE IR_Playbook DROP COLUMN ConcatenatedInvitedUserIDs;', + 'SELECT 1;' +)); + +PREPARE removeColumnIfExists FROM @preparedStatement; +EXECUTE removeColumnIfExists; +DEALLOCATE PREPARE removeColumnIfExists; diff --git a/server/sqlstore/migrations/mysql/000019_add_concatenated_invited_useri_ds_to_ir_playbook.up.sql b/server/sqlstore/migrations/mysql/000019_add_concatenated_invited_useri_ds_to_ir_playbook.up.sql new file mode 100644 index 0000000000..d30b4e91ee --- /dev/null +++ b/server/sqlstore/migrations/mysql/000019_add_concatenated_invited_useri_ds_to_ir_playbook.up.sql @@ -0,0 +1,18 @@ +SET @preparedStatement = (SELECT IF( + NOT EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Playbook' + AND table_schema = DATABASE() + AND column_name = 'ConcatenatedInvitedUserIDs' + ), + 'ALTER TABLE IR_Playbook ADD COLUMN ConcatenatedInvitedUserIDs TEXT;', + 'SELECT 1;' +)); + +PREPARE addColumnIfNotExists FROM @preparedStatement; +EXECUTE addColumnIfNotExists; +DEALLOCATE PREPARE addColumnIfNotExists; + +UPDATE IR_Playbook +SET ConcatenatedInvitedUserIDs = '' +WHERE ConcatenatedInvitedUserIDs IS NULL diff --git a/server/sqlstore/migrations/mysql/000020_add_invite_users_enabled_to_ir_playbook.down.sql b/server/sqlstore/migrations/mysql/000020_add_invite_users_enabled_to_ir_playbook.down.sql new file mode 100644 index 0000000000..224fcf16fb --- /dev/null +++ b/server/sqlstore/migrations/mysql/000020_add_invite_users_enabled_to_ir_playbook.down.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Playbook' + AND table_schema = DATABASE() + AND column_name = 'InviteUsersEnabled' + ), + 'ALTER TABLE IR_Playbook DROP COLUMN InviteUsersEnabled;', + 'SELECT 1;' +)); + +PREPARE removeColumnIfExists FROM @preparedStatement; +EXECUTE removeColumnIfExists; +DEALLOCATE PREPARE removeColumnIfExists; diff --git a/server/sqlstore/migrations/mysql/000020_add_invite_users_enabled_to_ir_playbook.up.sql b/server/sqlstore/migrations/mysql/000020_add_invite_users_enabled_to_ir_playbook.up.sql new file mode 100644 index 0000000000..b4725e0b54 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000020_add_invite_users_enabled_to_ir_playbook.up.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + NOT EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Playbook' + AND table_schema = DATABASE() + AND column_name = 'InviteUsersEnabled' + ), + 'ALTER TABLE IR_Playbook ADD COLUMN InviteUsersEnabled BOOLEAN DEFAULT FALSE;', + 'SELECT 1;' +)); + +PREPARE addColumnIfNotExists FROM @preparedStatement; +EXECUTE addColumnIfNotExists; +DEALLOCATE PREPARE addColumnIfNotExists; diff --git a/server/sqlstore/migrations/mysql/000021_add_default_commander_id_to_ir_incident.down.sql b/server/sqlstore/migrations/mysql/000021_add_default_commander_id_to_ir_incident.down.sql new file mode 100644 index 0000000000..e3de29fd20 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000021_add_default_commander_id_to_ir_incident.down.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Incident' + AND table_schema = DATABASE() + AND column_name = 'DefaultCommanderID' + ), + 'ALTER TABLE IR_Incident DROP COLUMN DefaultCommanderID;', + 'SELECT 1;' +)); + +PREPARE removeColumnIfExists FROM @preparedStatement; +EXECUTE removeColumnIfExists; +DEALLOCATE PREPARE removeColumnIfExists; diff --git a/server/sqlstore/migrations/mysql/000021_add_default_commander_id_to_ir_incident.up.sql b/server/sqlstore/migrations/mysql/000021_add_default_commander_id_to_ir_incident.up.sql new file mode 100644 index 0000000000..a9854a3736 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000021_add_default_commander_id_to_ir_incident.up.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + NOT EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Incident' + AND table_schema = DATABASE() + AND column_name = 'DefaultCommanderID' + ), + 'ALTER TABLE IR_Incident ADD COLUMN DefaultCommanderID VARCHAR(26) DEFAULT "";', + 'SELECT 1;' +)); + +PREPARE addColumnIfNotExists FROM @preparedStatement; +EXECUTE addColumnIfNotExists; +DEALLOCATE PREPARE addColumnIfNotExists; diff --git a/server/sqlstore/migrations/mysql/000022_add_default_commander_id_to_ir_playbook.down.sql b/server/sqlstore/migrations/mysql/000022_add_default_commander_id_to_ir_playbook.down.sql new file mode 100644 index 0000000000..43c3882cf3 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000022_add_default_commander_id_to_ir_playbook.down.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Playbook' + AND table_schema = DATABASE() + AND column_name = 'DefaultCommanderID' + ), + 'ALTER TABLE IR_Playbook DROP COLUMN DefaultCommanderID;', + 'SELECT 1;' +)); + +PREPARE removeColumnIfExists FROM @preparedStatement; +EXECUTE removeColumnIfExists; +DEALLOCATE PREPARE removeColumnIfExists; diff --git a/server/sqlstore/migrations/mysql/000022_add_default_commander_id_to_ir_playbook.up.sql b/server/sqlstore/migrations/mysql/000022_add_default_commander_id_to_ir_playbook.up.sql new file mode 100644 index 0000000000..b126c64c14 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000022_add_default_commander_id_to_ir_playbook.up.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + NOT EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Playbook' + AND table_schema = DATABASE() + AND column_name = 'DefaultCommanderID' + ), + 'ALTER TABLE IR_Playbook ADD COLUMN DefaultCommanderID VARCHAR(26) DEFAULT "";', + 'SELECT 1;' +)); + +PREPARE addColumnIfNotExists FROM @preparedStatement; +EXECUTE addColumnIfNotExists; +DEALLOCATE PREPARE addColumnIfNotExists; diff --git a/server/sqlstore/migrations/mysql/000023_add_default_commander_enabled_to_ir_playbook.down.sql b/server/sqlstore/migrations/mysql/000023_add_default_commander_enabled_to_ir_playbook.down.sql new file mode 100644 index 0000000000..3cadcc48b9 --- /dev/null +++ b/server/sqlstore/migrations/mysql/000023_add_default_commander_enabled_to_ir_playbook.down.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Playbook' + AND table_schema = DATABASE() + AND column_name = 'DefaultCommanderEnabled' + ), + 'ALTER TABLE IR_Playbook DROP COLUMN DefaultCommanderEnabled;', + 'SELECT 1;' +)); + +PREPARE removeColumnIfExists FROM @preparedStatement; +EXECUTE removeColumnIfExists; +DEALLOCATE PREPARE removeColumnIfExists; diff --git a/server/sqlstore/migrations/mysql/000023_add_default_commander_enabled_to_ir_playbook.up.sql b/server/sqlstore/migrations/mysql/000023_add_default_commander_enabled_to_ir_playbook.up.sql new file mode 100644 index 0000000000..9219754dec --- /dev/null +++ b/server/sqlstore/migrations/mysql/000023_add_default_commander_enabled_to_ir_playbook.up.sql @@ -0,0 +1,14 @@ +SET @preparedStatement = (SELECT IF( + NOT EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'IR_Playbook' + AND table_schema = DATABASE() + AND column_name = 'DefaultCommanderEnabled' + ), + 'ALTER TABLE IR_Playbook ADD COLUMN DefaultCommanderEnabled BOOLEAN DEFAULT FALSE;', + 'SELECT 1;' +)); + +PREPARE addColumnIfNotExists FROM @preparedStatement; +EXECUTE addColumnIfNotExists; +DEALLOCATE PREPARE addColumnIfNotExists; diff --git a/server/sqlstore/migrations/postgres/000003_create_ir_playbook.down.sql b/server/sqlstore/migrations/postgres/000003_create_ir_playbook.down.sql new file mode 100644 index 0000000000..79e50aab1a --- /dev/null +++ b/server/sqlstore/migrations/postgres/000003_create_ir_playbook.down.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS IR_Playbook; diff --git a/server/sqlstore/migrations/postgres/000003_create_ir_playbook.up.sql b/server/sqlstore/migrations/postgres/000003_create_ir_playbook.up.sql new file mode 100644 index 0000000000..37d5e562f5 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000003_create_ir_playbook.up.sql @@ -0,0 +1,14 @@ +CREATE TABLE IF NOT EXISTS IR_Playbook ( + ID TEXT PRIMARY KEY, + Title TEXT NOT NULL, + Description TEXT NOT NULL, + TeamID TEXT NOT NULL, + CreatePublicIncident BOOLEAN NOT NULL, + CreateAt BIGINT NOT NULL, + DeleteAt BIGINT NOT NULL DEFAULT 0, + ChecklistsJSON JSON NOT NULL, + NumStages BIGINT NOT NULL DEFAULT 0, + NumSteps BIGINT NOT NULL DEFAULT 0 +); + +CREATE INDEX IF NOT EXISTS IR_Playbook_TeamID ON IR_Playbook (TeamID); diff --git a/server/sqlstore/migrations/postgres/000004_create_ir_playbookmember.down.sql b/server/sqlstore/migrations/postgres/000004_create_ir_playbookmember.down.sql new file mode 100644 index 0000000000..6edfe5ff38 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000004_create_ir_playbookmember.down.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS IR_PlaybookMember; diff --git a/server/sqlstore/migrations/postgres/000004_create_ir_playbookmember.up.sql b/server/sqlstore/migrations/postgres/000004_create_ir_playbookmember.up.sql new file mode 100644 index 0000000000..ae48fb5056 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000004_create_ir_playbookmember.up.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS IR_PlaybookMember ( + PlaybookID TEXT NOT NULL REFERENCES IR_Playbook(ID), + MemberID TEXT NOT NULL, + UNIQUE (PlaybookID, MemberID) +); + +CREATE INDEX IF NOT EXISTS IR_PlaybookMember_PlaybookID ON IR_PlaybookMember (PlaybookID); +CREATE INDEX IF NOT EXISTS IR_PlaybookMember_MemberID ON IR_PlaybookMember (MemberID); diff --git a/server/sqlstore/migrations/postgres/000005_add_active_stage_title_to_ir_incident.down.sql b/server/sqlstore/migrations/postgres/000005_add_active_stage_title_to_ir_incident.down.sql new file mode 100644 index 0000000000..c3e29d1311 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000005_add_active_stage_title_to_ir_incident.down.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Incident DROP COLUMN IF EXISTS ActiveStageTitle; diff --git a/server/sqlstore/migrations/postgres/000005_add_active_stage_title_to_ir_incident.up.sql b/server/sqlstore/migrations/postgres/000005_add_active_stage_title_to_ir_incident.up.sql new file mode 100644 index 0000000000..44a6ecdf5d --- /dev/null +++ b/server/sqlstore/migrations/postgres/000005_add_active_stage_title_to_ir_incident.up.sql @@ -0,0 +1,22 @@ +ALTER TABLE IR_Incident ADD COLUMN IF NOT EXISTS ActiveStageTitle TEXT DEFAULT ''; + +CREATE OR REPLACE function json_array_length_safe(p_json text) +RETURNS integer +LANGUAGE plpgsql +AS +' +BEGIN + RETURN json_array_length(p_json::json); +EXCEPTION + WHEN OTHERS THEN + RETURN -1; +END; +' +IMMUTABLE; + +UPDATE ir_incident +SET activestagetitle = checklistsjson::json->(activestage::INTEGER)->>'title' +WHERE json_array_length_safe(checklistsjson::text) > activestage +AND activestage >= 0; + +DROP FUNCTION IF EXISTS json_array_length_safe; \ No newline at end of file diff --git a/server/sqlstore/migrations/postgres/000006_create_ir_status_posts.down.sql b/server/sqlstore/migrations/postgres/000006_create_ir_status_posts.down.sql new file mode 100644 index 0000000000..8fc426811d --- /dev/null +++ b/server/sqlstore/migrations/postgres/000006_create_ir_status_posts.down.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS IR_StatusPosts; diff --git a/server/sqlstore/migrations/postgres/000006_create_ir_status_posts.up.sql b/server/sqlstore/migrations/postgres/000006_create_ir_status_posts.up.sql new file mode 100644 index 0000000000..0e92923589 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000006_create_ir_status_posts.up.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS IR_StatusPosts ( + IncidentID TEXT NOT NULL REFERENCES IR_Incident(ID), + PostID TEXT NOT NULL, + UNIQUE (IncidentID, PostID) +); + +CREATE INDEX IF NOT EXISTS IR_StatusPosts_IncidentID ON IR_StatusPosts (IncidentID); +CREATE INDEX IF NOT EXISTS IR_StatusPosts_PostID ON IR_StatusPosts (PostID); diff --git a/server/sqlstore/migrations/postgres/000007_add_reminder_post_id_to_ir_incident.down.sql b/server/sqlstore/migrations/postgres/000007_add_reminder_post_id_to_ir_incident.down.sql new file mode 100644 index 0000000000..0f4ac419a1 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000007_add_reminder_post_id_to_ir_incident.down.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Incident DROP COLUMN IF EXISTS ReminderPostID; diff --git a/server/sqlstore/migrations/postgres/000007_add_reminder_post_id_to_ir_incident.up.sql b/server/sqlstore/migrations/postgres/000007_add_reminder_post_id_to_ir_incident.up.sql new file mode 100644 index 0000000000..9222ffacf1 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000007_add_reminder_post_id_to_ir_incident.up.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Incident ADD COLUMN IF NOT EXISTS ReminderPostID TEXT; diff --git a/server/sqlstore/migrations/postgres/000008_add_broadcast_channel_id_to_ir_incident.down.sql b/server/sqlstore/migrations/postgres/000008_add_broadcast_channel_id_to_ir_incident.down.sql new file mode 100644 index 0000000000..6e56cdf972 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000008_add_broadcast_channel_id_to_ir_incident.down.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Incident DROP COLUMN IF EXISTS BroadcastChannelID; diff --git a/server/sqlstore/migrations/postgres/000008_add_broadcast_channel_id_to_ir_incident.up.sql b/server/sqlstore/migrations/postgres/000008_add_broadcast_channel_id_to_ir_incident.up.sql new file mode 100644 index 0000000000..a43aed7909 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000008_add_broadcast_channel_id_to_ir_incident.up.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Incident ADD COLUMN IF NOT EXISTS BroadcastChannelID TEXT DEFAULT ''; diff --git a/server/sqlstore/migrations/postgres/000009_add_broadcast_channel_id_to_ir_playbook.down.sql b/server/sqlstore/migrations/postgres/000009_add_broadcast_channel_id_to_ir_playbook.down.sql new file mode 100644 index 0000000000..e393812c44 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000009_add_broadcast_channel_id_to_ir_playbook.down.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Playbook DROP COLUMN IF EXISTS BroadcastChannelID; diff --git a/server/sqlstore/migrations/postgres/000009_add_broadcast_channel_id_to_ir_playbook.up.sql b/server/sqlstore/migrations/postgres/000009_add_broadcast_channel_id_to_ir_playbook.up.sql new file mode 100644 index 0000000000..1747d6acf3 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000009_add_broadcast_channel_id_to_ir_playbook.up.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Playbook ADD COLUMN IF NOT EXISTS BroadcastChannelID TEXT DEFAULT ''; diff --git a/server/sqlstore/migrations/postgres/000010_add_previous_reminder_to_ir_incident.down.sql b/server/sqlstore/migrations/postgres/000010_add_previous_reminder_to_ir_incident.down.sql new file mode 100644 index 0000000000..2bb89a8b6c --- /dev/null +++ b/server/sqlstore/migrations/postgres/000010_add_previous_reminder_to_ir_incident.down.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Incident DROP COLUMN IF EXISTS PreviousReminder; diff --git a/server/sqlstore/migrations/postgres/000010_add_previous_reminder_to_ir_incident.up.sql b/server/sqlstore/migrations/postgres/000010_add_previous_reminder_to_ir_incident.up.sql new file mode 100644 index 0000000000..58157c376d --- /dev/null +++ b/server/sqlstore/migrations/postgres/000010_add_previous_reminder_to_ir_incident.up.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Incident ADD COLUMN IF NOT EXISTS PreviousReminder BIGINT NOT NULL DEFAULT 0; diff --git a/server/sqlstore/migrations/postgres/000011_add_reminder_message_template_to_ir_playbook.down.sql b/server/sqlstore/migrations/postgres/000011_add_reminder_message_template_to_ir_playbook.down.sql new file mode 100644 index 0000000000..abba3ec705 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000011_add_reminder_message_template_to_ir_playbook.down.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Playbook DROP COLUMN IF EXISTS ReminderMessageTemplate; diff --git a/server/sqlstore/migrations/postgres/000011_add_reminder_message_template_to_ir_playbook.up.sql b/server/sqlstore/migrations/postgres/000011_add_reminder_message_template_to_ir_playbook.up.sql new file mode 100644 index 0000000000..f7629f4e5d --- /dev/null +++ b/server/sqlstore/migrations/postgres/000011_add_reminder_message_template_to_ir_playbook.up.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Playbook ADD COLUMN IF NOT EXISTS ReminderMessageTemplate TEXT DEFAULT ''; diff --git a/server/sqlstore/migrations/postgres/000012_add_reminder_message_template_to_ir_incident.down.sql b/server/sqlstore/migrations/postgres/000012_add_reminder_message_template_to_ir_incident.down.sql new file mode 100644 index 0000000000..84bef57931 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000012_add_reminder_message_template_to_ir_incident.down.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Incident DROP COLUMN IF EXISTS ReminderMessageTemplate; diff --git a/server/sqlstore/migrations/postgres/000012_add_reminder_message_template_to_ir_incident.up.sql b/server/sqlstore/migrations/postgres/000012_add_reminder_message_template_to_ir_incident.up.sql new file mode 100644 index 0000000000..95262270ab --- /dev/null +++ b/server/sqlstore/migrations/postgres/000012_add_reminder_message_template_to_ir_incident.up.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Incident ADD COLUMN IF NOT EXISTS ReminderMessageTemplate TEXT DEFAULT ''; diff --git a/server/sqlstore/migrations/postgres/000013_add_reminder_timer_default_seconds_to_ir_playbook.down.sql b/server/sqlstore/migrations/postgres/000013_add_reminder_timer_default_seconds_to_ir_playbook.down.sql new file mode 100644 index 0000000000..73febaa808 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000013_add_reminder_timer_default_seconds_to_ir_playbook.down.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Playbook DROP COLUMN IF EXISTS ReminderTimerDefaultSeconds; diff --git a/server/sqlstore/migrations/postgres/000013_add_reminder_timer_default_seconds_to_ir_playbook.up.sql b/server/sqlstore/migrations/postgres/000013_add_reminder_timer_default_seconds_to_ir_playbook.up.sql new file mode 100644 index 0000000000..3840003c9d --- /dev/null +++ b/server/sqlstore/migrations/postgres/000013_add_reminder_timer_default_seconds_to_ir_playbook.up.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Playbook ADD COLUMN IF NOT EXISTS ReminderTimerDefaultSeconds BIGINT NOT NULL DEFAULT 0; diff --git a/server/sqlstore/migrations/postgres/000014_add_current_status_to_ir_incident.down.sql b/server/sqlstore/migrations/postgres/000014_add_current_status_to_ir_incident.down.sql new file mode 100644 index 0000000000..56dacd7884 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000014_add_current_status_to_ir_incident.down.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Incident DROP COLUMN IF EXISTS CurrentStatus; diff --git a/server/sqlstore/migrations/postgres/000014_add_current_status_to_ir_incident.up.sql b/server/sqlstore/migrations/postgres/000014_add_current_status_to_ir_incident.up.sql new file mode 100644 index 0000000000..1511fe8a05 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000014_add_current_status_to_ir_incident.up.sql @@ -0,0 +1,5 @@ +ALTER TABLE IR_Incident ADD COLUMN IF NOT EXISTS CurrentStatus TEXT NOT NULL DEFAULT 'Active'; + +UPDATE IR_Incident +SET CurrentStatus = 'Resolved' +WHERE EndAt != 0; diff --git a/server/sqlstore/migrations/postgres/000015_add_status_to_ir_status_posts.down.sql b/server/sqlstore/migrations/postgres/000015_add_status_to_ir_status_posts.down.sql new file mode 100644 index 0000000000..f1178910aa --- /dev/null +++ b/server/sqlstore/migrations/postgres/000015_add_status_to_ir_status_posts.down.sql @@ -0,0 +1 @@ +ALTER TABLE IR_StatusPosts DROP COLUMN IF EXISTS Status; diff --git a/server/sqlstore/migrations/postgres/000015_add_status_to_ir_status_posts.up.sql b/server/sqlstore/migrations/postgres/000015_add_status_to_ir_status_posts.up.sql new file mode 100644 index 0000000000..7f52703447 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000015_add_status_to_ir_status_posts.up.sql @@ -0,0 +1 @@ +ALTER TABLE IR_StatusPosts ADD COLUMN IF NOT EXISTS Status TEXT NOT NULL DEFAULT ''; diff --git a/server/sqlstore/migrations/postgres/000016_create_ir_timeline_event.down.sql b/server/sqlstore/migrations/postgres/000016_create_ir_timeline_event.down.sql new file mode 100644 index 0000000000..d218e43a0b --- /dev/null +++ b/server/sqlstore/migrations/postgres/000016_create_ir_timeline_event.down.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS IR_TimelineEvent; diff --git a/server/sqlstore/migrations/postgres/000016_create_ir_timeline_event.up.sql b/server/sqlstore/migrations/postgres/000016_create_ir_timeline_event.up.sql new file mode 100644 index 0000000000..fe745d1a59 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000016_create_ir_timeline_event.up.sql @@ -0,0 +1,16 @@ +CREATE TABLE IF NOT EXISTS IR_TimelineEvent ( + ID TEXT NOT NULL, + IncidentID TEXT NOT NULL REFERENCES IR_Incident(ID), + CreateAt BIGINT NOT NULL, + DeleteAt BIGINT NOT NULL DEFAULT 0, + EventAt BIGINT NOT NULL, + EventType TEXT NOT NULL DEFAULT '', + Summary TEXT NOT NULL DEFAULT '', + Details TEXT NOT NULL DEFAULT '', + PostID TEXT NOT NULL DEFAULT '', + SubjectUserID TEXT NOT NULL DEFAULT '', + CreatorUserID TEXT NOT NULL DEFAULT '' +); + +CREATE INDEX IF NOT EXISTS IR_TimelineEvent_ID ON IR_TimelineEvent (ID); +CREATE INDEX IF NOT EXISTS IR_TimelineEvent_IncidentID ON IR_TimelineEvent (IncidentID); diff --git a/server/sqlstore/migrations/postgres/000017_add_reporter_user_id_to_ir_incident.down.sql b/server/sqlstore/migrations/postgres/000017_add_reporter_user_id_to_ir_incident.down.sql new file mode 100644 index 0000000000..10528c2837 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000017_add_reporter_user_id_to_ir_incident.down.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Incident DROP COLUMN IF EXISTS ReporterUserID; diff --git a/server/sqlstore/migrations/postgres/000017_add_reporter_user_id_to_ir_incident.up.sql b/server/sqlstore/migrations/postgres/000017_add_reporter_user_id_to_ir_incident.up.sql new file mode 100644 index 0000000000..81d67f5367 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000017_add_reporter_user_id_to_ir_incident.up.sql @@ -0,0 +1,5 @@ +ALTER TABLE IR_Incident ADD COLUMN IF NOT EXISTS ReporterUserID TEXT NOT NULL DEFAULT ''; + +UPDATE IR_Incident +SET ReporterUserID = CommanderUserID +WHERE ReporterUserID = '' diff --git a/server/sqlstore/migrations/postgres/000018_add_concatenated_invited_user_ids_to_ir_incident.down.sql b/server/sqlstore/migrations/postgres/000018_add_concatenated_invited_user_ids_to_ir_incident.down.sql new file mode 100644 index 0000000000..16bc36a9f7 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000018_add_concatenated_invited_user_ids_to_ir_incident.down.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Incident DROP COLUMN IF EXISTS ConcatenatedInvitedUserIDs; diff --git a/server/sqlstore/migrations/postgres/000018_add_concatenated_invited_user_ids_to_ir_incident.up.sql b/server/sqlstore/migrations/postgres/000018_add_concatenated_invited_user_ids_to_ir_incident.up.sql new file mode 100644 index 0000000000..5df47836b9 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000018_add_concatenated_invited_user_ids_to_ir_incident.up.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Incident ADD COLUMN IF NOT EXISTS ConcatenatedInvitedUserIDs TEXT DEFAULT ''; diff --git a/server/sqlstore/migrations/postgres/000019_add_concatenated_invited_useri_ds_to_ir_playbook.down.sql b/server/sqlstore/migrations/postgres/000019_add_concatenated_invited_useri_ds_to_ir_playbook.down.sql new file mode 100644 index 0000000000..78be99543c --- /dev/null +++ b/server/sqlstore/migrations/postgres/000019_add_concatenated_invited_useri_ds_to_ir_playbook.down.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Playbook DROP COLUMN IF EXISTS ConcatenatedInvitedUserIDs; diff --git a/server/sqlstore/migrations/postgres/000019_add_concatenated_invited_useri_ds_to_ir_playbook.up.sql b/server/sqlstore/migrations/postgres/000019_add_concatenated_invited_useri_ds_to_ir_playbook.up.sql new file mode 100644 index 0000000000..1bab4380d2 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000019_add_concatenated_invited_useri_ds_to_ir_playbook.up.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Playbook ADD COLUMN IF NOT EXISTS ConcatenatedInvitedUserIDs TEXT DEFAULT ''; diff --git a/server/sqlstore/migrations/postgres/000020_add_invite_users_enabled_to_ir_playbook.down.sql b/server/sqlstore/migrations/postgres/000020_add_invite_users_enabled_to_ir_playbook.down.sql new file mode 100644 index 0000000000..b7cb847a42 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000020_add_invite_users_enabled_to_ir_playbook.down.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Playbook DROP COLUMN IF EXISTS InviteUsersEnabled; diff --git a/server/sqlstore/migrations/postgres/000020_add_invite_users_enabled_to_ir_playbook.up.sql b/server/sqlstore/migrations/postgres/000020_add_invite_users_enabled_to_ir_playbook.up.sql new file mode 100644 index 0000000000..d187798a09 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000020_add_invite_users_enabled_to_ir_playbook.up.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Playbook ADD COLUMN IF NOT EXISTS InviteUsersEnabled BOOLEAN DEFAULT FALSE; diff --git a/server/sqlstore/migrations/postgres/000021_add_default_commander_id_to_ir_incident.down.sql b/server/sqlstore/migrations/postgres/000021_add_default_commander_id_to_ir_incident.down.sql new file mode 100644 index 0000000000..243c84ccd7 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000021_add_default_commander_id_to_ir_incident.down.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Incident DROP COLUMN IF EXISTS DefaultCommanderID; diff --git a/server/sqlstore/migrations/postgres/000021_add_default_commander_id_to_ir_incident.up.sql b/server/sqlstore/migrations/postgres/000021_add_default_commander_id_to_ir_incident.up.sql new file mode 100644 index 0000000000..c8df14fba2 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000021_add_default_commander_id_to_ir_incident.up.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Incident ADD COLUMN IF NOT EXISTS DefaultCommanderID TEXT DEFAULT ''; diff --git a/server/sqlstore/migrations/postgres/000022_add_default_commander_id_to_ir_playbook.down.sql b/server/sqlstore/migrations/postgres/000022_add_default_commander_id_to_ir_playbook.down.sql new file mode 100644 index 0000000000..23285a2ba8 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000022_add_default_commander_id_to_ir_playbook.down.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Playbook DROP COLUMN IF EXISTS DefaultCommanderID; diff --git a/server/sqlstore/migrations/postgres/000022_add_default_commander_id_to_ir_playbook.up.sql b/server/sqlstore/migrations/postgres/000022_add_default_commander_id_to_ir_playbook.up.sql new file mode 100644 index 0000000000..7613a2057f --- /dev/null +++ b/server/sqlstore/migrations/postgres/000022_add_default_commander_id_to_ir_playbook.up.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Playbook ADD COLUMN IF NOT EXISTS DefaultCommanderID TEXT DEFAULT ''; diff --git a/server/sqlstore/migrations/postgres/000023_add_default_commander_enabled_to_ir_playbook.down.sql b/server/sqlstore/migrations/postgres/000023_add_default_commander_enabled_to_ir_playbook.down.sql new file mode 100644 index 0000000000..3ee611defd --- /dev/null +++ b/server/sqlstore/migrations/postgres/000023_add_default_commander_enabled_to_ir_playbook.down.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Playbook DROP COLUMN IF EXISTS DefaultCommanderEnabled; diff --git a/server/sqlstore/migrations/postgres/000023_add_default_commander_enabled_to_ir_playbook.up.sql b/server/sqlstore/migrations/postgres/000023_add_default_commander_enabled_to_ir_playbook.up.sql new file mode 100644 index 0000000000..49bc632743 --- /dev/null +++ b/server/sqlstore/migrations/postgres/000023_add_default_commander_enabled_to_ir_playbook.up.sql @@ -0,0 +1 @@ +ALTER TABLE IR_Playbook ADD COLUMN IF NOT EXISTS DefaultCommanderEnabled BOOLEAN DEFAULT FALSE; diff --git a/server/sqlstore/migrations_test.go b/server/sqlstore/migrations_test.go new file mode 100644 index 0000000000..15e2600f77 --- /dev/null +++ b/server/sqlstore/migrations_test.go @@ -0,0 +1,408 @@ +package sqlstore + +import ( + "fmt" + "testing" + + sq "github.com/Masterminds/squirrel" + "github.com/mattermost/mattermost-server/v6/model" + "github.com/mattermost/morph" + "github.com/stretchr/testify/require" +) + +type MigrationMapping struct { + Name string + LegacyMigrationIndex int + MorphMigrationLimit int +} + +func TestDBSchema(t *testing.T) { + migrationsMapping := []MigrationMapping{ + { + Name: "0.0.0", + LegacyMigrationIndex: 0, + MorphMigrationLimit: 4, // 000001 <> 000004 + }, + { + Name: "0.2.0", + LegacyMigrationIndex: 2, + MorphMigrationLimit: 1, // 000005 + }, + { + Name: "0.3.0", + LegacyMigrationIndex: 3, + MorphMigrationLimit: 4, // 000006 <> 000009 + }, + { + Name: "0.4.0", + LegacyMigrationIndex: 4, + MorphMigrationLimit: 4, // 000010 <> 000013 + }, + { + Name: "0.5.0", + LegacyMigrationIndex: 5, + MorphMigrationLimit: 2, // 000014 <> 000015 + }, + { + Name: "0.6.0", + LegacyMigrationIndex: 6, + MorphMigrationLimit: 1, // 000016 + }, + { + Name: "0.7.0", + LegacyMigrationIndex: 7, + MorphMigrationLimit: 1, // 000017 + }, + { + Name: "0.8.0", + LegacyMigrationIndex: 8, + MorphMigrationLimit: 3, // 000018 <> 000020 + }, + { + Name: "0.9.0", + LegacyMigrationIndex: 9, + MorphMigrationLimit: 3, // 000021 <> 000023 + }, + } + + for _, driverName := range driverNames { + tableInfoList := tableInfoAfterEachLegacyMigration(t, driverName, migrationsMapping) + indexInfoList := indexInfoAfterEachLegacyMigration(t, driverName, migrationsMapping) + + // create database for morph migration + db := setupTestDB(t, driverName) + store := setupTables(t, db) + + engine, err := store.createMorphEngine() + require.NoError(t, err) + defer engine.Close() + + for i, migration := range migrationsMapping { + t.Run(fmt.Sprintf("validate migration up: %s", migration.Name), func(t *testing.T) { + runMigrationUp(t, store, engine, migration.MorphMigrationLimit) + // compare table schemas + dbSchemaMorph, err := getDBSchemaInfo(store) + require.NoError(t, err) + require.Equal(t, dbSchemaMorph, tableInfoList[i+1]) + + // compare indexes + dbIndexesMorph, err := getDBIndexesInfo(store) + require.NoError(t, err) + require.Equal(t, dbIndexesMorph, indexInfoList[i+1]) + }) + } + + for i := range migrationsMapping { + migrationIndex := len(migrationsMapping) - i - 1 + migration := migrationsMapping[migrationIndex] + t.Run(fmt.Sprintf("validate migration down: %s", migration.Name), func(t *testing.T) { + runMigrationDown(t, store, engine, migration.MorphMigrationLimit) + // compare table schemas + dbSchemaMorph, err := getDBSchemaInfo(store) + require.NoError(t, err) + require.Equal(t, dbSchemaMorph, tableInfoList[migrationIndex]) + + // compare indexes + dbIndexesMorph, err := getDBIndexesInfo(store) + require.NoError(t, err) + require.Equal(t, dbIndexesMorph, indexInfoList[migrationIndex]) + }) + } + } +} + +func TestMigration_000005(t *testing.T) { + testData := []struct { + Name string + ActiveStage int + ChecklistJSON string + }{ + { + Name: "0", + ActiveStage: 0, + ChecklistJSON: "{][", + }, + { + Name: "1", + ActiveStage: 0, + ChecklistJSON: "{}", + }, + { + Name: "2", + ActiveStage: 0, + ChecklistJSON: "\"key\"", + }, + { + Name: "3", + ActiveStage: -1, + ChecklistJSON: "[]", + }, + { + Name: "4", + ActiveStage: 0, + ChecklistJSON: "", + }, + { + Name: "5", + ActiveStage: 1, + ChecklistJSON: `[{"title":"title50"}, {"title":"title51"}, {"title":"title52"}]`, + }, + { + Name: "6", + ActiveStage: 3, + ChecklistJSON: `[{"title":"title60"}, {"title":"title61"}, {"title":"title62"}]`, + }, + { + Name: "7", + ActiveStage: 2, + ChecklistJSON: `[{"title":"title70"}, {"title":"title71"}, {"title":"title72"}]`, + }, + } + + insertData := func(store *SQLStore) int { + numRuns := 0 + for _, d := range testData { + _, err := insertRun(store, NewRunMapBuilder(). + WithName(d.Name). + WithActiveStage(d.ActiveStage). + WithChecklists(d.ChecklistJSON).ToRunAsMap()) + if err == nil { + numRuns++ + } + } + + return numRuns + } + + type Run struct { + ID string + Name string + ChecklistsJSON string + ActiveStage int + ActiveStageTitle string + } + + validateAfter := func(t *testing.T, store *SQLStore, numRuns int) { + var runs []Run + err := store.selectBuilder(store.db, &runs, store.builder. + Select("ID", "Name", "ChecklistsJSON", "ActiveStage", "ActiveStageTitle"). + From("IR_Incident")) + + require.NoError(t, err) + require.Len(t, runs, numRuns) + expectedStageTitles := map[string]string{ + "5": "title51", + "7": "title72", + } + for _, r := range runs { + require.Equal(t, expectedStageTitles[r.Name], r.ActiveStageTitle) + } + } + + validateBefore := func(t *testing.T, store *SQLStore, numRuns int) { + activeStageTitleExist, err := columnExists(store, "IR_Incident", "ActiveStageTitle") + require.NoError(t, err) + require.False(t, activeStageTitleExist) + } + + for _, driverName := range driverNames { + t.Run("run migration up", func(t *testing.T) { + db := setupTestDB(t, driverName) + store := setupTables(t, db) + engine, err := store.createMorphEngine() + require.NoError(t, err) + defer engine.Close() + + runMigrationUp(t, store, engine, 4) + numRuns := insertData(store) + runMigrationUp(t, store, engine, 1) + validateAfter(t, store, numRuns) + }) + + t.Run("run migration down", func(t *testing.T) { + db := setupTestDB(t, driverName) + store := setupTables(t, db) + engine, err := store.createMorphEngine() + require.NoError(t, err) + defer engine.Close() + + runMigrationUp(t, store, engine, 4) + numRuns := insertData(store) + runMigrationUp(t, store, engine, 1) + validateAfter(t, store, numRuns) + runMigrationDown(t, store, engine, 1) + validateBefore(t, store, numRuns) + }) + } +} + +func TestMigration_000014(t *testing.T) { + insertData := func(t *testing.T, store *SQLStore) { + _, err := insertRun(store, NewRunMapBuilder().WithName("0").ToRunAsMap()) + require.NoError(t, err) + _, err = insertRun(store, NewRunMapBuilder().WithName("1").WithEndAt(100000000000).ToRunAsMap()) + require.NoError(t, err) + _, err = insertRun(store, NewRunMapBuilder().WithName("2").WithEndAt(0).ToRunAsMap()) + require.NoError(t, err) + _, err = insertRun(store, NewRunMapBuilder().WithName("3").WithEndAt(123861298332).ToRunAsMap()) + require.NoError(t, err) + } + + type Run struct { + Name string + CurrentStatus string + EndAt int64 + } + + validateAfter := func(t *testing.T, store *SQLStore) { + var runs []Run + err := store.selectBuilder(store.db, &runs, store.builder. + Select("Name", "CurrentStatus", "EndAt"). + From("IR_Incident")) + + require.NoError(t, err) + require.Len(t, runs, 4) + + runsStatuses := map[string]string{ + "0": "Active", + "2": "Active", + "1": "Resolved", + "3": "Resolved", + } + for _, r := range runs { + require.Equal(t, runsStatuses[r.Name], r.CurrentStatus) + } + } + + for _, driverName := range driverNames { + t.Run("run migration up", func(t *testing.T) { + db := setupTestDB(t, driverName) + store := setupTables(t, db) + engine, err := store.createMorphEngine() + require.NoError(t, err) + defer engine.Close() + + runMigrationUp(t, store, engine, 13) + insertData(t, store) + runMigrationUp(t, store, engine, 1) + validateAfter(t, store) + }) + } +} + +func runMigrationUp(t *testing.T, store *SQLStore, engine *morph.Morph, limit int) { + applied, err := engine.Apply(limit) + require.NoError(t, err) + require.Equal(t, applied, limit) +} + +func runMigrationDown(t *testing.T, store *SQLStore, engine *morph.Morph, limit int) { + applied, err := engine.ApplyDown(limit) + require.NoError(t, err) + require.Equal(t, applied, limit) +} + +func runLegacyMigration(t *testing.T, store *SQLStore, index int) { + err := store.migrate(migrations[index]) + require.NoError(t, err) +} + +func insertRun(sqlStore *SQLStore, run map[string]interface{}) (string, error) { + id := model.NewId() + _, err := sqlStore.execBuilder(sqlStore.db, sq. + Insert("IR_Incident"). + SetMap(run)) + + return id, err +} + +// tableInfoAfterEachLegacyMigration runs legacy migrations, extracts database schema after each migration +// and returns the list. The first and last elements in the list describe DB before and after running all migrations. +func tableInfoAfterEachLegacyMigration(t *testing.T, driverName string, migrationsToRun []MigrationMapping) [][]TableInfo { + // create database for legacy migration + db := setupTestDB(t, driverName) + store := setupTables(t, db) + + list := make([][]TableInfo, len(migrationsToRun)+1) + schema, err := getDBSchemaInfo(store) + require.NoError(t, err) + list[0] = schema + + for i, mm := range migrationsToRun { + runLegacyMigration(t, store, mm.LegacyMigrationIndex) + + schema, err = getDBSchemaInfo(store) + require.NoError(t, err) + list[i+1] = schema + } + + return list +} + +// indexInfoAfterEachLegacyMigration runs legacy migrations, extracts database indexes info after each migration +// and returns the list. The first and last elements in the list describe DB before and after running all migrations. +func indexInfoAfterEachLegacyMigration(t *testing.T, driverName string, migrationsToRun []MigrationMapping) [][]IndexInfo { + // create database for legacy migration + db := setupTestDB(t, driverName) + store := setupTables(t, db) + + list := make([][]IndexInfo, len(migrationsToRun)+1) + indexes, err := getDBIndexesInfo(store) + require.NoError(t, err) + list[0] = indexes + + for i, mm := range migrationsToRun { + runLegacyMigration(t, store, mm.LegacyMigrationIndex) + + indexes, err = getDBIndexesInfo(store) + require.NoError(t, err) + list[i+1] = indexes + } + + return list +} + +type RunMapBuilder struct { + runAsMap map[string]interface{} +} + +func NewRunMapBuilder() *RunMapBuilder { + return &RunMapBuilder{ + runAsMap: map[string]interface{}{ + "ID": model.NewId(), + "CreateAt": model.GetMillis(), + "Description": "test description", + "Name": fmt.Sprintf("run- %v", model.GetMillis()), + "IsActive": true, + "CommanderUserID": "commander", + "TeamID": "testTeam", + "ChannelID": model.NewId(), + "ActiveStage": 0, + "ChecklistsJSON": "[]", + }, + } +} + +func (b *RunMapBuilder) WithName(name string) *RunMapBuilder { + b.runAsMap["Name"] = name + return b +} + +func (b *RunMapBuilder) WithActiveStage(activeStage int) *RunMapBuilder { + b.runAsMap["ActiveStage"] = activeStage + return b +} + +func (b *RunMapBuilder) WithChecklists(checklistJSON string) *RunMapBuilder { + b.runAsMap["ChecklistsJSON"] = checklistJSON + return b +} + +func (b *RunMapBuilder) WithEndAt(endAt int64) *RunMapBuilder { + b.runAsMap["EndAt"] = endAt + return b +} + +func (b *RunMapBuilder) ToRunAsMap() map[string]interface{} { + return b.runAsMap +} diff --git a/server/sqlstore/migrations_utils.go b/server/sqlstore/migrations_utils.go index c33c3b26f4..b79a119577 100644 --- a/server/sqlstore/migrations_utils.go +++ b/server/sqlstore/migrations_utils.go @@ -3,6 +3,7 @@ package sqlstore import ( "database/sql" "fmt" + "strings" "github.com/mattermost/mattermost-server/v6/model" "github.com/pkg/errors" @@ -56,6 +57,22 @@ var addColumnToPGTable = func(e sqlx.Ext, tableName, columnName, columnType stri return err } +var changeColumnTypeToPGTable = func(e sqlx.Ext, tableName, columnName, columnType string) error { + _, err := e.Exec(fmt.Sprintf(` + DO + $$ + BEGIN + ALTER TABLE %s ALTER COLUMN %s TYPE %s; + EXCEPTION + WHEN others THEN + RAISE NOTICE 'Ignoring ALTER TABLE statement. Column "%s" can not be changed to type %s in table "%s".'; + END + $$; + `, tableName, columnName, columnType, columnName, columnType, tableName)) + + return err +} + var addColumnToMySQLTable = func(e sqlx.Ext, tableName, columnName, columnType string) error { var result int err := e.QueryRowx( @@ -194,3 +211,111 @@ func dropIndexIfExists(e sqlx.Ext, sqlStore *SQLStore, tableName, indexName stri return nil } + +func columnExists(sqlStore *SQLStore, tableName, columnName string) (bool, error) { + results := []string{} + var err error + if sqlStore.db.DriverName() == model.DatabaseDriverMysql { + err = sqlStore.db.Select(&results, ` + SELECT COLUMN_NAME + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = ? + AND COLUMN_NAME = ? + `, tableName, columnName) + } else if sqlStore.db.DriverName() == model.DatabaseDriverPostgres { + err = sqlStore.db.Select(&results, ` + SELECT COLUMN_NAME + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_NAME = $1 + AND COLUMN_NAME = $2 + `, strings.ToLower(tableName), strings.ToLower(columnName)) + } + + return len(results) > 0, err +} + +type TableInfo struct { + TableName string + ColumnName string + DataType string + IsNullable string + ColumnKey string + ColumnDefault *string + Extra string + CharacterMaximumLength *string +} + +// getDBSchemaInfo returns info for each table created by Playbook plugin +func getDBSchemaInfo(store *SQLStore) ([]TableInfo, error) { + var results []TableInfo + var err error + + if store.db.DriverName() == model.DatabaseDriverMysql { + err = store.db.Select(&results, ` + SELECT + TABLE_NAME as TableName, COLUMN_NAME as ColumnName, DATA_TYPE as DataType, + IS_NULLABLE as IsNullable, COLUMN_KEY as ColumnKey, COLUMN_DEFAULT as ColumnDefault, + EXTRA as Extra, CHARACTER_MAXIMUM_LENGTH as CharacterMaximumLength + + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME LIKE 'IR_%' + AND TABLE_NAME != 'IR_db_migrations' + ORDER BY TABLE_NAME ASC, ORDINAL_POSITION ASC + `) + } else if store.db.DriverName() == model.DatabaseDriverPostgres { + err = store.db.Select(&results, ` + SELECT + TABLE_NAME as TableName, COLUMN_NAME as ColumnName, DATA_TYPE as DataType, + IS_NULLABLE as IsNullable, COLUMN_DEFAULT as ColumnDefault, CHARACTER_MAXIMUM_LENGTH as CharacterMaximumLength + + FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_schema = 'public' + AND TABLE_NAME LIKE 'ir_%' + AND TABLE_NAME != 'ir_db_migrations' + ORDER BY TABLE_NAME ASC, ORDINAL_POSITION ASC + `) + } + + return results, err +} + +type IndexInfo struct { + TableName string + IndexName string + + // Postgres specific field + IndexDef string + + // MySQL specific fields + ColumnName string +} + +// getDBIndexesInfo returns index info for each table created by Playbook plugin +func getDBIndexesInfo(store *SQLStore) ([]IndexInfo, error) { + var results []IndexInfo + var err error + + if store.db.DriverName() == model.DatabaseDriverMysql { + err = store.db.Select(&results, ` + SELECT TABLE_NAME as TableName, INDEX_NAME as IndexName, COLUMN_NAME as ColumnName + FROM INFORMATION_SCHEMA.STATISTICS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME LIKE 'ir_%' + AND TABLE_NAME != 'ir_db_migrations' + ORDER BY TABLE_NAME ASC, COLUMN_NAME ASC, INDEX_NAME ASC; + `) + } else if store.db.DriverName() == model.DatabaseDriverPostgres { + err = store.db.Select(&results, ` + SELECT TABLENAME as TableName, INDEXNAME as IndexName, INDEXDEF as IndexDef + FROM pg_indexes + WHERE SCHEMANAME = 'public' + AND TABLENAME LIKE 'ir_%' + AND TABLENAME != 'ir_db_migrations' + ORDER BY TABLENAME ASC, INDEXNAME ASC; + `) + } + + return results, err +} diff --git a/server/sqlstore/playbook.go b/server/sqlstore/playbook.go index 31100c937b..1b0d2c29a6 100644 --- a/server/sqlstore/playbook.go +++ b/server/sqlstore/playbook.go @@ -9,7 +9,6 @@ import ( sq "github.com/Masterminds/squirrel" "github.com/mattermost/mattermost-plugin-playbooks/server/app" - "github.com/mattermost/mattermost-plugin-playbooks/server/bot" "github.com/mattermost/mattermost-server/v6/model" "github.com/pkg/errors" ) @@ -28,7 +27,6 @@ type sqlPlaybook struct { // playbookStore is a sql store for playbooks. Use NewPlaybookStore to create it. type playbookStore struct { pluginAPI PluginAPIClient - log bot.Logger store *SQLStore queryBuilder sq.StatementBuilderType playbookSelect sq.SelectBuilder @@ -45,6 +43,10 @@ type playbookMember struct { Roles string } +// definied to call a common insights query builder for both user and team insights +const insightsQueryTypeUser = "insights_query_type_user" +const insightsQueryTypeTeam = "insights_query_type_team" + func applyPlaybookFilterOptionsSort(builder sq.SelectBuilder, options app.PlaybookFilterOptions) (sq.SelectBuilder, error) { var sort string switch options.Sort { @@ -60,6 +62,10 @@ func applyPlaybookFilterOptionsSort(builder sq.SelectBuilder, options app.Playbo sort = "NumRuns" case app.SortByCreateAt: sort = "CreateAt" + case app.SortByLastRunAt: + sort = "LastRunAt" + case app.SortByActiveRuns: + sort = "ActiveRuns" case "": // Default to a stable sort if none explicitly provided. sort = "ID" @@ -99,7 +105,7 @@ func applyPlaybookFilterOptionsSort(builder sq.SelectBuilder, options app.Playbo } // NewPlaybookStore creates a new store for playbook service. -func NewPlaybookStore(pluginAPI PluginAPIClient, log bot.Logger, sqlStore *SQLStore) app.PlaybookStore { +func NewPlaybookStore(pluginAPI PluginAPIClient, sqlStore *SQLStore) app.PlaybookStore { playbookSelect := sqlStore.builder. Select( "p.ID", @@ -184,7 +190,6 @@ func NewPlaybookStore(pluginAPI PluginAPIClient, log bot.Logger, sqlStore *SQLSt newStore := &playbookStore{ pluginAPI: pluginAPI, - log: log, store: sqlStore, queryBuilder: sqlStore.builder, playbookSelect: playbookSelect, @@ -236,7 +241,7 @@ func (p *playbookStore) Create(playbook app.Playbook) (id string, err error) { "DefaultCommanderID": rawPlaybook.DefaultOwnerID, "DefaultCommanderEnabled": rawPlaybook.DefaultOwnerEnabled, "ConcatenatedBroadcastChannelIDs": rawPlaybook.ConcatenatedBroadcastChannelIDs, - "BroadcastEnabled": rawPlaybook.BroadcastEnabled, + "BroadcastEnabled": rawPlaybook.BroadcastEnabled, //nolint "ConcatenatedWebhookOnCreationURLs": rawPlaybook.ConcatenatedWebhookOnCreationURLs, "WebhookOnCreationEnabled": rawPlaybook.WebhookOnCreationEnabled, "MessageOnJoin": rawPlaybook.MessageOnJoin, @@ -404,7 +409,10 @@ func (p *playbookStore) GetPlaybooksForTeam(requesterInfo app.RequesterInfo, tea "p.DeleteAt", "p.NumStages", "p.NumSteps", + "p.DefaultCommanderEnabled AS DefaultOwnerEnabled", + "p.DefaultCommanderID AS DefaultOwnerID", "COUNT(i.ID) AS NumRuns", + "COUNT(CASE WHEN i.CurrentStatus='InProgress' THEN 1 END) AS ActiveRuns", "COALESCE(MAX(i.CreateAt), 0) AS LastRunAt", `( 1 + -- Channel creation is hard-coded @@ -593,6 +601,13 @@ func (p *playbookStore) GraphqlUpdate(id string, setmap map[string]interface{}) return errors.New("id should not be empty") } + // if checklists are passed and len (as string) is bigger than limit -> fails + if _, exists := setmap["ChecklistsJSON"]; exists { + if len(string(setmap["ChecklistsJSON"].([]uint8))) > maxJSONLength { + return fmt.Errorf("failed update playbook with id '%s': json too long (max %d)", id, maxJSONLength) + } + } + _, err := p.store.execBuilder(p.store.db, sq. Update("IR_Playbook"). SetMap(setmap). @@ -644,7 +659,7 @@ func (p *playbookStore) Update(playbook app.Playbook) (err error) { "DefaultCommanderID": rawPlaybook.DefaultOwnerID, "DefaultCommanderEnabled": rawPlaybook.DefaultOwnerEnabled, "ConcatenatedBroadcastChannelIDs": rawPlaybook.ConcatenatedBroadcastChannelIDs, - "BroadcastEnabled": rawPlaybook.BroadcastEnabled, + "BroadcastEnabled": rawPlaybook.BroadcastEnabled, //nolint "ConcatenatedWebhookOnCreationURLs": rawPlaybook.ConcatenatedWebhookOnCreationURLs, "WebhookOnCreationEnabled": rawPlaybook.WebhookOnCreationEnabled, "MessageOnJoin": rawPlaybook.MessageOnJoin, @@ -751,6 +766,40 @@ func (p *playbookStore) GetNumMetrics(playbookID string) (int64, error) { return count, nil } +func (p *playbookStore) AddPlaybookMember(id string, memberID string) error { + if id == "" || memberID == "" { + return errors.New("ids should not be empty") + } + + _, err := p.store.execBuilder(p.store.db, sq. + Insert("IR_PlaybookMember"). + Columns("PlaybookID", "MemberID", "Roles"). + Values(id, memberID, app.PlaybookRoleMember)) + + if err != nil { + return errors.Wrapf(err, "failed to update playbook with id '%s'", id) + } + + return nil +} + +func (p *playbookStore) RemovePlaybookMember(id string, memberID string) error { + if id == "" || memberID == "" { + return errors.New("ids should not be empty") + } + + _, err := p.store.execBuilder(p.store.db, sq. + Delete("IR_PlaybookMember"). + Where(sq.Eq{"PlaybookID": id}). + Where(sq.Eq{"MemberID": memberID})) + + if err != nil { + return errors.Wrapf(err, "failed to update playbook with id '%s'", id) + } + + return nil +} + // replacePlaybookMembers replaces the members of a playbook func (p *playbookStore) replacePlaybookMembers(q queryExecer, playbook app.Playbook) error { // Delete existing members who are not in the new playbook.MemberIDs list @@ -1010,6 +1059,10 @@ func toSQLPlaybook(playbook app.Playbook) (*sqlPlaybook, error) { return nil, errors.Wrapf(err, "failed to marshal checklist json for playbook id: '%s'", playbook.ID) } + if len(checklistsJSON) > maxJSONLength { + return nil, errors.Wrapf(err, "checklist json for playbook id '%s' is too long (max %d)", playbook.ID, maxJSONLength) + } + return &sqlPlaybook{ Playbook: playbook, ChecklistsJSON: checklistsJSON, @@ -1062,3 +1115,95 @@ func toPlaybook(rawPlaybook sqlPlaybook) (app.Playbook, error) { return p, nil } + +// insights - store manager functions + +func (p *playbookStore) GetTopPlaybooksForTeam(teamID, userID string, opts *model.InsightsOpts) (*app.PlaybooksInsightsList, error) { + + query := insightsQueryBuilder(p, teamID, userID, opts, insightsQueryTypeTeam) + + topPlaybooksList := make([]*app.PlaybookInsight, 0) + err := p.store.selectBuilder(p.store.db, &topPlaybooksList, query) + if err != nil { + return nil, errors.Wrapf(err, "failed to get top team playbooks for for user: %s", userID) + } + + topPlaybooks := GetTopPlaybooksInsightsListWithPagination(topPlaybooksList, opts.PerPage) + + return topPlaybooks, nil +} + +func (p *playbookStore) GetTopPlaybooksForUser(teamID, userID string, opts *model.InsightsOpts) (*app.PlaybooksInsightsList, error) { + + query := insightsQueryBuilder(p, teamID, userID, opts, insightsQueryTypeUser) + + topPlaybooksList := make([]*app.PlaybookInsight, 0) + err := p.store.selectBuilder(p.store.db, &topPlaybooksList, query) + if err != nil { + return nil, errors.Wrapf(err, "failed to get top user playbooks for for user: %s", userID) + } + + topPlaybooks := GetTopPlaybooksInsightsListWithPagination(topPlaybooksList, opts.PerPage) + + return topPlaybooks, nil +} + +func insightsQueryBuilder(p *playbookStore, teamID, userID string, opts *model.InsightsOpts, queryType string) sq.SelectBuilder { + permissionsAndFilter := sq.Expr(`( + EXISTS(SELECT 1 + FROM IR_PlaybookMember as pm + WHERE pm.PlaybookID = p.ID + AND pm.MemberID = ?) + )`, userID) + + var whereCondition sq.And + if queryType == insightsQueryTypeUser { + whereCondition = sq.And{ + permissionsAndFilter, + sq.Eq{"p.TeamID": teamID}, + sq.GtOrEq{"i.CreateAt": opts.StartUnixMilli}, + } + } else if queryType == insightsQueryTypeTeam { + whereCondition = sq.And{ + sq.GtOrEq{"i.CreateAt": opts.StartUnixMilli}, + sq.Or{ + permissionsAndFilter, + sq.Eq{"p.Public": true}, + }, + sq.Eq{"p.TeamID": teamID}, + } + } else { + whereCondition = sq.And{} + } + offset := opts.Page * opts.PerPage + limit := opts.PerPage + query := p.queryBuilder. + Select( + "p.ID as PlaybookID", + "p.Title", + "COUNT(i.ID) AS NumRuns", + "COALESCE(MAX(i.CreateAt), 0) AS LastRunAt", + ). + From("IR_Playbook as p"). + LeftJoin("IR_Incident AS i ON p.ID = i.PlaybookID"). + Where(whereCondition). + GroupBy("p.ID"). + OrderBy("NumRuns desc"). + Offset(uint64(offset)). + Limit(uint64(limit + 1)) + + return query +} + +// GetTopPlaybooksInsightsListWithPagination returns a page given a list of PlaybooksInsight assumed to be +// sorted by Runs(score). Returns a PlaybooksInsightsList. +func GetTopPlaybooksInsightsListWithPagination(playbooks []*app.PlaybookInsight, limit int) *app.PlaybooksInsightsList { + // Add pagination support + var hasNext bool + if (limit != 0) && (len(playbooks) == limit+1) { + hasNext = true + playbooks = playbooks[:len(playbooks)-1] + } + + return &app.PlaybooksInsightsList{HasNext: hasNext, Items: playbooks} +} diff --git a/server/sqlstore/playbook_run.go b/server/sqlstore/playbook_run.go index 98de35428c..e12b9d6e95 100644 --- a/server/sqlstore/playbook_run.go +++ b/server/sqlstore/playbook_run.go @@ -14,7 +14,6 @@ import ( sq "github.com/Masterminds/squirrel" "github.com/mattermost/mattermost-plugin-playbooks/server/app" - "github.com/mattermost/mattermost-plugin-playbooks/server/bot" "github.com/mattermost/mattermost-server/v6/model" "github.com/pkg/errors" ) @@ -44,7 +43,6 @@ type sqlRunMetricData struct { // playbookRunStore holds the information needed to fulfill the methods in the store interface. type playbookRunStore struct { pluginAPI PluginAPIClient - log bot.Logger store *SQLStore queryBuilder sq.StatementBuilderType playbookRunSelect sq.SelectBuilder @@ -153,26 +151,28 @@ func applyPlaybookRunFilterOptionsSort(builder sq.SelectBuilder, options app.Pla } // NewPlaybookRunStore creates a new store for playbook run ServiceImpl. -func NewPlaybookRunStore(pluginAPI PluginAPIClient, log bot.Logger, sqlStore *SQLStore) app.PlaybookRunStore { +func NewPlaybookRunStore(pluginAPI PluginAPIClient, sqlStore *SQLStore) app.PlaybookRunStore { // construct the participants list so that the frontend doesn't have to query the server, bc if // the user is not a member of the channel they won't have permissions to get the user list participantsCol := ` COALESCE( - (SELECT string_agg(cm.UserId, ',') + (SELECT string_agg(rp.UserId, ',') FROM IR_Incident as i2 - JOIN ChannelMembers as cm on cm.ChannelId = i2.ChannelId + JOIN IR_Run_Participants as rp on rp.IncidentID = i2.ID WHERE i2.Id = i.Id - AND cm.UserId NOT IN (SELECT UserId FROM Bots) + AND rp.IsParticipant = true + AND rp.UserId NOT IN (SELECT UserId FROM Bots) ), '' ) AS ConcatenatedParticipantIDs` if sqlStore.db.DriverName() == model.DatabaseDriverMysql { participantsCol = ` COALESCE( - (SELECT group_concat(cm.UserId separator ',') + (SELECT group_concat(rp.UserId separator ',') FROM IR_Incident as i2 - JOIN ChannelMembers as cm on cm.ChannelId = i2.ChannelId + JOIN IR_Run_Participants as rp on rp.IncidentID = i2.ID WHERE i2.Id = i.Id - AND cm.UserId NOT IN (SELECT UserId FROM Bots) + AND rp.IsParticipant = true + AND rp.UserId NOT IN (SELECT UserId FROM Bots) ), '' ) AS ConcatenatedParticipantIDs` } @@ -238,7 +238,6 @@ func NewPlaybookRunStore(pluginAPI PluginAPIClient, log bot.Logger, sqlStore *SQ return &playbookRunStore{ pluginAPI: pluginAPI, - log: log, store: sqlStore, queryBuilder: sqlStore.builder, playbookRunSelect: playbookRunSelect, @@ -279,9 +278,10 @@ func (s *playbookRunStore) GetPlaybookRuns(requesterInfo app.RequesterInfo, opti membershipClause := s.queryBuilder. Select("1"). Prefix("EXISTS("). - From("ChannelMembers AS cm"). - Where("cm.ChannelId = i.ChannelID"). - Where(sq.Eq{"cm.UserId": strings.ToLower(options.ParticipantID)}). + From("IR_Run_Participants AS p"). + Where("p.IncidentID = i.ID"). + Where("p.IsParticipant = true"). + Where(sq.Eq{"p.UserID": strings.ToLower(options.ParticipantID)}). Suffix(")") queryForResults = queryForResults.Where(membershipClause) @@ -301,6 +301,17 @@ func (s *playbookRunStore) GetPlaybookRuns(requesterInfo app.RequesterInfo, opti AND cm.UserId = ?)`, userIDFilter) myRunsClause := sq.Or{followerFilterExpr, participantFilterExpr} + if options.IncludeFavorites { + favoriteFilterExpr := sq.Expr(`EXISTS(SELECT 1 + FROM IR_Category AS cat + INNER JOIN IR_Category_Item it ON cat.ID = it.CategoryID + WHERE cat.Name = 'Favorite' + AND it.Type = 'r' + AND it.ItemID = i.ID + AND cat.UserID = ?)`, userIDFilter) + myRunsClause = append(myRunsClause, favoriteFilterExpr) + } + queryForResults = queryForResults.Where(myRunsClause) queryForTotal = queryForTotal.Where(myRunsClause) } @@ -935,26 +946,30 @@ func (s *playbookRunStore) buildPermissionsExpr(info app.RequesterInfo) sq.Sqliz return nil } - // Guests must be channel members + // Guests must be participants if info.IsGuest { return sq.Expr(` EXISTS(SELECT 1 - FROM ChannelMembers as cm - WHERE cm.ChannelId = i.ChannelID - AND cm.UserId = ?) + FROM IR_Run_Participants as rp + WHERE rp.IncidentID = i.ID + AND rp.UserId = ? + AND rp.IsParticipant = true + ) `, info.UserID) } - // 1. Is the user a channel member? If so, they have permission to view the run. + // 1. Is the user a participant of the run? // 2. Is the playbook open to everyone on the team, or is the user a member of the playbook? // If so, they have permission to view the run. return sq.Expr(` (( EXISTS ( SELECT 1 - FROM ChannelMembers as cm - WHERE cm.ChannelId = i.ChannelId - AND cm.UserId = ?) + FROM IR_Run_Participants as rp + WHERE rp.IncidentID = i.ID + AND rp.UserId = ? + AND rp.IsParticipant = true + ) ) OR ( (SELECT Public FROM IR_Playbook @@ -1017,6 +1032,14 @@ func (s *playbookRunStore) toPlaybookRun(rawPlaybookRun sqlPlaybookRun) (*app.Pl playbookRun.WebhookOnStatusUpdateURLs = strings.Split(rawPlaybookRun.ConcatenatedWebhookOnStatusUpdateURLs, ",") } + // force false bradcast-on-status-update flags if they have no destinations + if len(playbookRun.WebhookOnStatusUpdateURLs) == 0 { + playbookRun.StatusUpdateBroadcastWebhooksEnabled = false + } + if len(playbookRun.BroadcastChannelIDs) == 0 { + playbookRun.StatusUpdateBroadcastChannelsEnabled = false + } + return &playbookRun, nil } @@ -1083,9 +1106,10 @@ func (s *playbookRunStore) GetParticipatingRuns(userID string) ([]app.RunLink, e membershipClause := s.queryBuilder. Select("1"). Prefix("EXISTS("). - From("ChannelMembers AS cm"). - Where("cm.ChannelId = i.ChannelID"). - Where(sq.Eq{"cm.UserId": userID}). + From("IR_Run_Participants AS rp"). + Where("rp.IncidentID = i.ID"). + Where(sq.Eq{"rp.UserId": userID}). + Where(sq.Eq{"rp.IsParticipant": true}). Suffix(")") query := s.store.builder. @@ -1108,14 +1132,15 @@ func (s *playbookRunStore) GetParticipatingRuns(userID string) ([]app.RunLink, e // GetOverdueUpdateRuns returns runs owned by userID and that have overdue status updates. func (s *playbookRunStore) GetOverdueUpdateRuns(userID string) ([]app.RunLink, error) { - // only notify if the user is a current member of the run's channel - // in other words: don't notify the commander of an overdue run if they have left the run's channel + // only notify if the user is still a participant + // in other words: don't notify the commander of an overdue run if they have left the run membershipClause := s.queryBuilder. Select("1"). Prefix("EXISTS("). - From("ChannelMembers AS cm"). - Where("cm.ChannelId = i.ChannelID"). - Where(sq.Eq{"cm.UserId": userID}). + From("IR_Run_Participants AS rp"). + Where("rp.IncidentID = i.ID"). + Where(sq.Eq{"rp.UserId": userID}). + Where(sq.Eq{"rp.IsParticipant": true}). Suffix(")") query := s.store.builder. @@ -1146,27 +1171,27 @@ func (s *playbookRunStore) GetOverdueUpdateRuns(userID string) ([]app.RunLink, e } func (s *playbookRunStore) Follow(playbookRunID, userID string) error { - return s.followHelper(playbookRunID, userID, true) + return s.updateFollowing(playbookRunID, userID, true) } func (s *playbookRunStore) Unfollow(playbookRunID, userID string) error { - return s.followHelper(playbookRunID, userID, false) + return s.updateFollowing(playbookRunID, userID, false) } -func (s *playbookRunStore) followHelper(playbookRunID, userID string, value bool) error { +func (s *playbookRunStore) updateFollowing(playbookRunID, userID string, isFollowing bool) error { var err error if s.store.db.DriverName() == model.DatabaseDriverMysql { _, err = s.store.execBuilder(s.store.db, sq. Insert("IR_Run_Participants"). Columns("IncidentID", "UserID", "IsFollower"). - Values(playbookRunID, userID, value). - Suffix("ON DUPLICATE KEY UPDATE IsFollower = ?", value)) + Values(playbookRunID, userID, isFollowing). + Suffix("ON DUPLICATE KEY UPDATE IsFollower = ?", isFollowing)) } else { _, err = s.store.execBuilder(s.store.db, sq. Insert("IR_Run_Participants"). Columns("IncidentID", "UserID", "IsFollower"). - Values(playbookRunID, userID, value). - Suffix("ON CONFLICT (IncidentID,UserID) DO UPDATE SET IsFollower = ?", value)) + Values(playbookRunID, userID, isFollowing). + Suffix("ON CONFLICT (IncidentID,UserID) DO UPDATE SET IsFollower = ?", isFollowing)) } if err != nil { @@ -1270,17 +1295,17 @@ func (s *playbookRunStore) GetFollowersActiveTotal() (int64, error) { } // GetParticipantsActiveTotal returns number of active participants -// (i.e. members of the playbook run channel when the run is active) -// if a user is member of more than one channel, it will be counted multiple times +// if a user is a participant in more than one run they will be counted multiple times func (s *playbookRunStore) GetParticipantsActiveTotal() (int64, error) { var count int64 query := s.store.builder. Select("COUNT(*)"). - From("ChannelMembers as cm"). - Join("IR_Incident AS i ON i.ChannelId = cm.ChannelId"). + From("IR_Run_Participants as rp"). + Join("IR_Incident AS i ON i.ID = rp.IncidentID"). Where(sq.Eq{"i.CurrentStatus": app.StatusInProgress}). - Where(sq.Expr("cm.UserId NOT IN (SELECT UserId FROM Bots)")) + Where(sq.Eq{"rp.IsParticipant": true}). + Where(sq.Expr("rp.UserId NOT IN (SELECT UserId FROM Bots)")) if err := s.store.getBuilder(s.store.db, &count, query); err != nil { return 0, errors.Wrap(err, "failed to count active participants") @@ -1289,6 +1314,38 @@ func (s *playbookRunStore) GetParticipantsActiveTotal() (int64, error) { return count, nil } +// GetSchemeRolesForChannel scheme role ids for the channel +func (s *playbookRunStore) GetSchemeRolesForChannel(channelID string) (string, string, string, error) { + query := s.queryBuilder. + Select("COALESCE(s.DefaultChannelGuestRole, 'channel_guest') DefaultChannelGuestRole", + "COALESCE(s.DefaultChannelUserRole, 'channel_user') DefaultChannelUserRole", + "COALESCE(s.DefaultChannelAdminRole, 'channel_admin') DefaultChannelAdminRole"). + From("Schemes as s"). + Join("Channels AS c ON (c.SchemeId = s.Id)"). + Where(sq.Eq{"c.Id": channelID}) + + var scheme model.Scheme + err := s.store.getBuilder(s.store.db, &scheme, query) + + return scheme.DefaultChannelGuestRole, scheme.DefaultChannelUserRole, scheme.DefaultChannelAdminRole, err +} + +// GetSchemeRolesForTeam scheme role ids for the team +func (s *playbookRunStore) GetSchemeRolesForTeam(teamID string) (string, string, string, error) { + query := s.queryBuilder. + Select("COALESCE(s.DefaultChannelGuestRole, 'channel_guest') DefaultChannelGuestRole", + "COALESCE(s.DefaultChannelUserRole, 'channel_user') DefaultChannelUserRole", + "COALESCE(s.DefaultChannelAdminRole, 'channel_admin') DefaultChannelAdminRole"). + From("Schemes as s"). + Join("Teams AS t ON (t.SchemeId = s.Id)"). + Where(sq.Eq{"t.Id": teamID}) + + var scheme model.Scheme + err := s.store.getBuilder(s.store.db, &scheme, query) + + return scheme.DefaultChannelGuestRole, scheme.DefaultChannelUserRole, scheme.DefaultChannelAdminRole, err +} + // updateRunMetrics updates run metrics values. func (s *playbookRunStore) updateRunMetrics(q queryExecer, playbookRun app.PlaybookRun) error { if len(playbookRun.MetricsData) == 0 { @@ -1339,12 +1396,53 @@ func (s *playbookRunStore) updateRunMetrics(q queryExecer, playbookRun app.Playb return nil } +func (s *playbookRunStore) AddParticipants(playbookRunID string, userIDs []string) error { + return s.updateParticipating(playbookRunID, userIDs, true) +} + +func (s *playbookRunStore) RemoveParticipants(playbookRunID string, userIDs []string) error { + return s.updateParticipating(playbookRunID, userIDs, false) +} + +func (s *playbookRunStore) updateParticipating(playbookRunID string, userIDs []string, isParticipating bool) error { + query := sq. + Insert("IR_Run_Participants"). + Columns("IncidentID", "UserID", "IsParticipant") + + for _, userID := range userIDs { + query = query.Values(playbookRunID, userID, isParticipating) + } + + var err error + if s.store.db.DriverName() == model.DatabaseDriverMysql { + _, err = s.store.execBuilder( + s.store.db, + query.Suffix("ON DUPLICATE KEY UPDATE IsParticipant = ?", isParticipating), + ) + } else { + _, err = s.store.execBuilder( + s.store.db, + query.Suffix("ON CONFLICT (IncidentID,UserID) DO UPDATE SET IsParticipant = ?", isParticipating), + ) + } + + if err != nil { + return errors.Wrapf(err, "failed to upsert participants '%+v' for run '%s'", userIDs, playbookRunID) + } + + return nil +} + func toSQLPlaybookRun(playbookRun app.PlaybookRun) (*sqlPlaybookRun, error) { checklistsJSON, err := checklistsToJSON(playbookRun.Checklists) if err != nil { return nil, errors.Wrapf(err, "failed to marshal checklist json for playbook run id '%s'", playbookRun.ID) } + if len(checklistsJSON) > maxJSONLength { + return nil, errors.Wrapf(err, "checklist json for playbook run id '%s' is too long (max %d)", playbookRun.ID, maxJSONLength) + } + return &sqlPlaybookRun{ PlaybookRun: playbookRun, ChecklistsJSON: checklistsJSON, diff --git a/server/sqlstore/playbook_run_test.go b/server/sqlstore/playbook_run_test.go index 642b7bd95a..aee14a15e2 100644 --- a/server/sqlstore/playbook_run_test.go +++ b/server/sqlstore/playbook_run_test.go @@ -10,6 +10,7 @@ import ( "gopkg.in/guregu/null.v4" + sq "github.com/Masterminds/squirrel" "github.com/golang/mock/gomock" "github.com/jmoiron/sqlx" "github.com/mattermost/mattermost-plugin-playbooks/server/app" @@ -23,7 +24,7 @@ import ( func TestCreateAndGetPlaybookRun(t *testing.T) { for _, driverName := range driverNames { db := setupTestDB(t, driverName) - _, store := setupSQLStore(t, db) + store := setupSQLStore(t, db) playbookRunStore := setupPlaybookRunStore(t, db) setupChannelsTable(t, db) setupPostsTable(t, db) @@ -182,7 +183,7 @@ func TestUpdatePlaybookRun(t *testing.T) { for _, driverName := range driverNames { db := setupTestDB(t, driverName) playbookRunStore := setupPlaybookRunStore(t, db) - _, store := setupSQLStore(t, db) + store := setupSQLStore(t, db) setupChannelsTable(t, db) setupPostsTable(t, db) @@ -315,7 +316,7 @@ func TestIfDeletedMetricsAreOmitted(t *testing.T) { for _, driverName := range driverNames { db := setupTestDB(t, driverName) playbookRunStore := setupPlaybookRunStore(t, db) - _, store := setupSQLStore(t, db) + store := setupSQLStore(t, db) setupChannelsTable(t, db) setupPostsTable(t, db) @@ -359,7 +360,7 @@ func TestRestorePlaybookRun(t *testing.T) { for _, driverName := range driverNames { db := setupTestDB(t, driverName) playbookRunStore := setupPlaybookRunStore(t, db) - _, store := setupSQLStore(t, db) + store := setupSQLStore(t, db) now := model.GetMillis() initialPlaybookRun := NewBuilder(t). @@ -398,7 +399,7 @@ func TestStressTestGetPlaybookRuns(t *testing.T) { for _, driverName := range driverNames { db := setupTestDB(t, driverName) playbookRunStore := setupPlaybookRunStore(t, db) - _, store := setupSQLStore(t, db) + store := setupSQLStore(t, db) setupChannelsTable(t, db) setupPostsTable(t, db) @@ -454,7 +455,7 @@ func TestStressTestGetPlaybookRunsStats(t *testing.T) { for _, driverName := range driverNames { db := setupTestDB(t, driverName) playbookRunStore := setupPlaybookRunStore(t, db) - _, store := setupSQLStore(t, db) + store := setupSQLStore(t, db) setupChannelsTable(t, db) setupPostsTable(t, db) @@ -527,7 +528,7 @@ func newPost(deleted bool) *model.Post { func TestGetPlaybookRunIDForChannel(t *testing.T) { for _, driverName := range driverNames { db := setupTestDB(t, driverName) - _, store := setupSQLStore(t, db) + store := setupSQLStore(t, db) playbookRunStore := setupPlaybookRunStore(t, db) setupChannelsTable(t, db) @@ -575,7 +576,7 @@ func TestNukeDB(t *testing.T) { for _, driverName := range driverNames { db := setupTestDB(t, driverName) - _, store := setupSQLStore(t, db) + store := setupSQLStore(t, db) setupChannelsTable(t, db) setupTeamMembersTable(t, db) @@ -642,7 +643,7 @@ func TestNukeDB(t *testing.T) { func TestTasksAndRunsDigest(t *testing.T) { for _, driverName := range driverNames { db := setupTestDB(t, driverName) - _, store := setupSQLStore(t, db) + store := setupSQLStore(t, db) playbookRunStore := setupPlaybookRunStore(t, db) setupTeamsTable(t, db) @@ -669,7 +670,6 @@ func TestTasksAndRunsDigest(t *testing.T) { channel05 := model.Channel{Id: model.NewId(), Type: "O", Name: "channel-05"} channel06 := model.Channel{Id: model.NewId(), Type: "O", Name: "channel-06"} channels := []model.Channel{channel01, channel02, channel03, channel04, channel05, channel06} - addUsersToChannels(t, store, []userInfo{testUser}, []string{channel01.Id, channel02.Id, channel03.Id, channel04.Id, channel06.Id}) // three assigned tasks for inc01, and an overdue update inc01 := *NewBuilder(nil). @@ -755,10 +755,13 @@ func TestTasksAndRunsDigest(t *testing.T) { playbookRuns := []app.PlaybookRun{inc01, inc02, inc03, inc04, inc05, inc06} for i := range playbookRuns { - _, err := playbookRunStore.CreatePlaybookRun(&playbookRuns[i]) + created, err := playbookRunStore.CreatePlaybookRun(&playbookRuns[i]) + playbookRuns[i] = *created require.NoError(t, err) } + addUsersToRuns(t, store, []userInfo{testUser}, []string{playbookRuns[0].ID, playbookRuns[1].ID, playbookRuns[2].ID, playbookRuns[3].ID, playbookRuns[5].ID}) + createChannels(t, store, channels) t.Run("gets assigned tasks only", func(t *testing.T) { @@ -853,7 +856,7 @@ func TestGetRunsActiveTotal(t *testing.T) { for _, driverName := range driverNames { db := setupTestDB(t, driverName) playbookRunStore := setupPlaybookRunStore(t, db) - _, store := setupSQLStore(t, db) + store := setupSQLStore(t, db) t.Run("zero runs", func(t *testing.T) { actual, err := playbookRunStore.GetRunsActiveTotal() @@ -901,7 +904,7 @@ func TestGetOverdueUpdateRunsTotal(t *testing.T) { for _, driverName := range driverNames { db := setupTestDB(t, driverName) playbookRunStore := setupPlaybookRunStore(t, db) - _, store := setupSQLStore(t, db) + store := setupSQLStore(t, db) t.Run("zero runs", func(t *testing.T) { actual, err := playbookRunStore.GetOverdueUpdateRunsTotal() @@ -973,7 +976,7 @@ func TestGetOverdueRetroRunsTotal(t *testing.T) { for _, driverName := range driverNames { db := setupTestDB(t, driverName) playbookRunStore := setupPlaybookRunStore(t, db) - _, store := setupSQLStore(t, db) + store := setupSQLStore(t, db) t.Run("zero runs", func(t *testing.T) { actual, err := playbookRunStore.GetOverdueRetroRunsTotal() @@ -1096,7 +1099,7 @@ func TestGetParticipantsActiveTotal(t *testing.T) { returned, err := playbookRunStore.CreatePlaybookRun(run) require.NoError(t, err) if len(participants) > 0 { - addUsersToChannels(t, store, participants, []string{run.ChannelID}) + addUsersToRuns(t, store, participants, []string{returned.ID}) } createPlaybookRunChannel(t, store, returned) @@ -1134,7 +1137,7 @@ func TestGetParticipantsActiveTotal(t *testing.T) { db := setupTestDB(t, driverName) playbookRunStore := setupPlaybookRunStore(t, db) playbookStore := setupPlaybookStore(t, db) - _, store := setupSQLStore(t, db) + store := setupSQLStore(t, db) setupTeamMembersTable(t, db) setupChannelMembersTable(t, db) setupChannelMemberHistoryTable(t, db) @@ -1186,9 +1189,65 @@ func setupPlaybookRunStore(t *testing.T, db *sqlx.DB) app.PlaybookRunStore { Configuration: configAPI, } - logger, sqlStore := setupSQLStore(t, db) + sqlStore := setupSQLStore(t, db) + + return NewPlaybookRunStore(pluginAPIClient, sqlStore) +} + +func TestGetSchemeRolesForChannel(t *testing.T) { + for _, driverName := range driverNames { + db := setupTestDB(t, driverName) + playbookRunStore := setupPlaybookRunStore(t, db) + store := setupSQLStore(t, db) + + t.Run("channel with no scheme", func(t *testing.T) { + _, err := store.execBuilder(store.db, sq. + Insert("Schemes"). + SetMap(map[string]interface{}{ + "ID": "scheme_0", + "DefaultChannelGuestRole": "guest0", + "DefaultChannelUserRole": "user0", + "DefaultChannelAdminRole": "admin0", + })) + require.NoError(t, err) + + _, err = store.execBuilder(store.db, sq. + Insert("Channels"). + SetMap(map[string]interface{}{ + "ID": "channel_0", + })) + require.NoError(t, err) + + _, _, _, err = playbookRunStore.GetSchemeRolesForChannel("channel_0") + require.Error(t, err) + }) + + t.Run("channel with scheme", func(t *testing.T) { + _, err := store.execBuilder(store.db, sq. + Insert("Schemes"). + SetMap(map[string]interface{}{ + "ID": "scheme_1", + "DefaultChannelGuestRole": nil, + "DefaultChannelUserRole": "user1", + "DefaultChannelAdminRole": "admin1", + })) + require.NoError(t, err) + + _, err = store.execBuilder(store.db, sq. + Insert("Channels"). + SetMap(map[string]interface{}{ + "ID": "channel_1", + "SchemeId": "scheme_1", + })) + require.NoError(t, err) - return NewPlaybookRunStore(pluginAPIClient, logger, sqlStore) + guest, user, admin, err := playbookRunStore.GetSchemeRolesForChannel("channel_1") + require.NoError(t, err) + require.Equal(t, guest, model.ChannelGuestRoleId) + require.Equal(t, user, "user1") + require.Equal(t, admin, "admin1") + }) + } } // PlaybookRunBuilder is a utility to build playbook runs with a default base. diff --git a/server/sqlstore/playbook_test.go b/server/sqlstore/playbook_test.go index 96f9e842f2..c05e8e4870 100644 --- a/server/sqlstore/playbook_test.go +++ b/server/sqlstore/playbook_test.go @@ -886,7 +886,7 @@ func TestGetPlaybooksForTeam(t *testing.T) { require.ElementsMatch(t, []app.Playbook{}, result) }) - _, store := setupSQLStore(t, db) + store := setupSQLStore(t, db) setupTeamMembersTable(t, db) addUsers(t, store, users) addUsersToTeam(t, store, users, team1id) @@ -1546,7 +1546,7 @@ func TestGetPlaybookIDsForUser(t *testing.T) { require.ElementsMatch(t, []app.Playbook{}, result) }) - _, store := setupSQLStore(t, db) + store := setupSQLStore(t, db) setupTeamMembersTable(t, db) addUsers(t, store, users) @@ -1880,7 +1880,170 @@ func setupPlaybookStore(t *testing.T, db *sqlx.DB) app.PlaybookStore { Configuration: configAPI, } - logger, sqlStore := setupSQLStore(t, db) + sqlStore := setupSQLStore(t, db) - return NewPlaybookStore(pluginAPIClient, logger, sqlStore) + return NewPlaybookStore(pluginAPIClient, sqlStore) +} + +func TestGetTopPlaybooks(t *testing.T) { + for _, driverName := range driverNames { + team1id := model.NewId() + team2id := model.NewId() + + jon := userInfo{ + ID: model.NewId(), + Name: "jon", + } + + matt := userInfo{ + ID: model.NewId(), + Name: "Matt", + } + + desmond := userInfo{ + ID: model.NewId(), + Name: "Desmond", + } + + pb01 := NewPBBuilder(). + WithTitle("playbook 1"). + WithDescription("this is a description, not very long, but it can be up to 4096 bytes"). + WithTeamID(team1id). + WithCreateAt(500). + WithChecklists([]int{1, 2}). + WithMembers([]userInfo{jon, matt, desmond}). + ToPlaybook() + + pb02 := NewPBBuilder(). + WithTitle("playbook 2"). + WithTeamID(team1id). + WithCreateAt(600). + WithChecklists([]int{1, 4, 6, 7, 1}). // 19 + WithMembers([]userInfo{matt}). + WithMetrics([]string{"name11", "name12"}). + ToPlaybook() + + pb03 := NewPBBuilder(). + WithTitle("playbook 3"). + WithTeamID(team2id). + WithChecklists([]int{1, 2, 3}). + WithCreateAt(700). + WithMembers([]userInfo{jon, matt}). + WithMetrics([]string{"name14", "name12", "name13", "name11"}). + ToPlaybook() + + pb04 := NewPBBuilder(). + WithTitle("playbook 4"). + WithDescription("this is a description, not very long, but it can be up to 2048 bytes"). + WithTeamID(team1id). + WithCreateAt(800). + WithChecklists([]int{20}). + WithMembers([]userInfo{matt}). + WithCreatePublicPlaybook(true). + WithMetrics([]string{"name17"}). + ToPlaybook() + + playbooks := []app.Playbook{pb01, pb02, pb03, pb04} + + db := setupTestDB(t, driverName) + playbookStore := setupPlaybookStore(t, db) + playbookRunStore := setupPlaybookRunStore(t, db) + + // create playbooks + createPlaybooks := func(store app.PlaybookStore) { + t.Helper() + + for index, p := range playbooks { + p.ID = "" + playbookCreatedID, err := store.Create(p) + playbooks[index].ID = playbookCreatedID + require.NoError(t, err) + } + } + createPlaybooks(playbookStore) + playbookRuns := []*app.PlaybookRun{ + NewBuilder(t).WithName("pb01-0").WithPlaybookID(playbooks[0].ID).WithCreateAt(200).ToPlaybookRun(), + NewBuilder(t).WithName("pb01-1").WithPlaybookID(playbooks[0].ID).WithCreateAt(200).ToPlaybookRun(), + NewBuilder(t).WithName("pb01-2").WithPlaybookID(playbooks[0].ID).WithCreateAt(200).ToPlaybookRun(), + NewBuilder(t).WithName("pb01-3").WithPlaybookID(playbooks[0].ID).WithCreateAt(200).ToPlaybookRun(), + NewBuilder(t).WithName("pb02-0").WithPlaybookID(playbooks[1].ID).WithCreateAt(200).ToPlaybookRun(), + NewBuilder(t).WithName("pb02-1").WithPlaybookID(playbooks[1].ID).WithCreateAt(200).ToPlaybookRun(), + NewBuilder(t).WithName("pb02-2").WithPlaybookID(playbooks[1].ID).WithCreateAt(200).ToPlaybookRun(), + NewBuilder(t).WithName("pb02-3").WithPlaybookID(playbooks[1].ID).WithCreateAt(200).ToPlaybookRun(), + NewBuilder(t).WithName("pb02-4").WithPlaybookID(playbooks[1].ID).WithCreateAt(200).ToPlaybookRun(), + NewBuilder(t).WithName("pb02-5").WithPlaybookID(playbooks[1].ID).WithCreateAt(200).ToPlaybookRun(), + NewBuilder(t).WithName("pb03-0").WithPlaybookID(playbooks[2].ID).WithCreateAt(200).ToPlaybookRun(), + NewBuilder(t).WithName("pb03-1").WithPlaybookID(playbooks[2].ID).WithCreateAt(200).ToPlaybookRun(), + NewBuilder(t).WithName("pb03-2").WithPlaybookID(playbooks[2].ID).WithCreateAt(200).ToPlaybookRun(), + NewBuilder(t).WithName("pb04-0").WithPlaybookID(playbooks[3].ID).WithCreateAt(400).ToPlaybookRun(), + NewBuilder(t).WithName("pb04-1").WithPlaybookID(playbooks[3].ID).WithCreateAt(400).ToPlaybookRun(), + } + // create playbook runs + for _, playbookRun := range playbookRuns { + _, err := playbookRunStore.CreatePlaybookRun(playbookRun) + require.NoError(t, err) + } + + t.Run(driverName+" - get top team playbooks", func(t *testing.T) { + // for jon + topPlaybooks, err := playbookStore.GetTopPlaybooksForTeam(team1id, jon.ID, &model.InsightsOpts{StartUnixMilli: 0, Page: 0, PerPage: 100}) + require.NoError(t, err) + // should get top playbooks as pb01.ID, and pb04.ID + // implicitly means there's no playbooks from other team + require.Len(t, topPlaybooks.Items, 2) + + require.Equal(t, topPlaybooks.Items[0].NumRuns, 4) + require.Equal(t, topPlaybooks.Items[0].PlaybookID, playbooks[0].ID) + require.Equal(t, topPlaybooks.Items[1].NumRuns, 2) + require.Equal(t, topPlaybooks.Items[1].PlaybookID, playbooks[3].ID) + + // for matt + topPlaybooks, err = playbookStore.GetTopPlaybooksForTeam(team1id, matt.ID, &model.InsightsOpts{StartUnixMilli: 0, Page: 0, PerPage: 100}) + require.NoError(t, err) + // should get top playbooks as pb01.ID, pb02.ID and pb04.ID + // implicitly means there's no playbooks from other team + require.Len(t, topPlaybooks.Items, 3) + require.Equal(t, topPlaybooks.Items[0].NumRuns, 6) + require.Equal(t, topPlaybooks.Items[0].PlaybookID, playbooks[1].ID) + require.Equal(t, topPlaybooks.Items[1].NumRuns, 4) + require.Equal(t, topPlaybooks.Items[1].PlaybookID, playbooks[0].ID) + require.Equal(t, topPlaybooks.Items[2].NumRuns, 2) + require.Equal(t, topPlaybooks.Items[2].PlaybookID, playbooks[3].ID) + }) + + t.Run(driverName+" - get top user playbooks", func(t *testing.T) { + // for jon + topPlaybooks, err := playbookStore.GetTopPlaybooksForUser(team1id, jon.ID, &model.InsightsOpts{StartUnixMilli: 0, Page: 0, PerPage: 100}) + require.NoError(t, err) + // should get top playbooks as pb01.ID, and pb04.ID + // implicitly means there's no playbooks from other team + require.Len(t, topPlaybooks.Items, 1) + // fmt.Println(topPlaybooks.Items) + require.Equal(t, topPlaybooks.Items[0].NumRuns, 4) + require.Equal(t, topPlaybooks.Items[0].PlaybookID, playbooks[0].ID) + + // for team 2 + topPlaybooks, err = playbookStore.GetTopPlaybooksForUser(team2id, jon.ID, &model.InsightsOpts{StartUnixMilli: 0, Page: 0, PerPage: 100}) + require.NoError(t, err) + // should get top playbooks as pb01.ID, and pb04.ID + // implicitly means there's no playbooks from other team + require.Len(t, topPlaybooks.Items, 1) + // fmt.Println(topPlaybooks.Items) + require.Equal(t, topPlaybooks.Items[0].NumRuns, 3) + require.Equal(t, topPlaybooks.Items[0].PlaybookID, playbooks[2].ID) + + // for matt + topPlaybooks, err = playbookStore.GetTopPlaybooksForUser(team1id, matt.ID, &model.InsightsOpts{StartUnixMilli: 0, Page: 0, PerPage: 100}) + require.NoError(t, err) + // should get top playbooks as pb01.ID, and pb04.ID + // implicitly means there's no playbooks from other team + require.Len(t, topPlaybooks.Items, 3) + require.Equal(t, topPlaybooks.Items[0].NumRuns, 6) + require.Equal(t, topPlaybooks.Items[0].PlaybookID, playbooks[1].ID) + require.Equal(t, topPlaybooks.Items[1].NumRuns, 4) + require.Equal(t, topPlaybooks.Items[1].PlaybookID, playbooks[0].ID) + require.Equal(t, topPlaybooks.Items[2].NumRuns, 2) + require.Equal(t, topPlaybooks.Items[2].PlaybookID, playbooks[3].ID) + }) + } } diff --git a/server/sqlstore/stats.go b/server/sqlstore/stats.go index d25faac893..42e93deab4 100644 --- a/server/sqlstore/stats.go +++ b/server/sqlstore/stats.go @@ -8,23 +8,21 @@ import ( "time" "github.com/pkg/errors" + "github.com/sirupsen/logrus" "gopkg.in/guregu/null.v4" sq "github.com/Masterminds/squirrel" - "github.com/mattermost/mattermost-plugin-playbooks/server/bot" "github.com/mattermost/mattermost-server/v6/model" ) type StatsStore struct { pluginAPI PluginAPIClient - log bot.Logger store *SQLStore } -func NewStatsStore(pluginAPI PluginAPIClient, log bot.Logger, sqlStore *SQLStore) *StatsStore { +func NewStatsStore(pluginAPI PluginAPIClient, sqlStore *SQLStore) *StatsStore { return &StatsStore{ pluginAPI: pluginAPI, - log: log, store: sqlStore, } } @@ -57,7 +55,7 @@ func (s *StatsStore) TotalInProgressPlaybookRuns(filters *StatsFilters) int { var total int if err := s.store.getBuilder(s.store.db, &total, query); err != nil { - s.log.Warnf("Error retrieving stat total in progress %w", err) + logrus.WithError(err).Error("failed to query total in progress playbook runs") return -1 } @@ -94,17 +92,18 @@ func (s *StatsStore) TotalPlaybookRuns() (int, error) { func (s *StatsStore) TotalActiveParticipants(filters *StatsFilters) int { query := s.store.builder. - Select("COUNT(DISTINCT cm.UserId)"). - From("ChannelMembers as cm"). - Join("IR_Incident AS i ON i.ChannelId = cm.ChannelId"). + Select("COUNT(DISTINCT rp.UserId)"). + From("IR_Run_Participants as rp"). + Join("IR_Incident AS i ON i.ID = rp.IncidentID"). Where("i.EndAt = 0"). - Where(sq.Expr("cm.UserId NOT IN (SELECT UserId FROM Bots)")) + Where("rp.IsParticipant = true"). + Where(sq.Expr("rp.UserId NOT IN (SELECT UserId FROM Bots)")) query = applyFilters(query, filters) var total int if err := s.store.getBuilder(s.store.db, &total, query); err != nil { - s.log.Warnf("Error retrieving stat total active participants %w", err) + logrus.WithError(err).Error("failed to query total active participants") return -1 } @@ -130,7 +129,7 @@ func (s *StatsStore) RunsFinishedBetweenDays(filters *StatsFilters, startDay, en var total int if err := s.store.getBuilder(s.store.db, &total, query); err != nil { - s.log.Warnf("Error retrieving stat total in progress %w", err) + logrus.WithError(err).Error("failed to query runs finished between days") return -1 } @@ -210,7 +209,7 @@ func (s *StatsStore) RunsStartedPerWeekLastXWeeks(x int, filters *StatsFilters) counts, err := s.performQueryForXCols(q, x) if err != nil { - s.log.Warnf("failed to perform query: %v", err) + logrus.WithError(err).WithField("x", x).Error("failed to query runs started per week last x weeks") return []int{}, [][]int64{} } @@ -268,7 +267,7 @@ func (s *StatsStore) ActiveRunsPerDayLastXDays(x int, filters *StatsFilters) ([] counts, err := s.performQueryForXCols(q, x) if err != nil { - s.log.Warnf("failed to perform query: %v", err) + logrus.WithError(err).WithField("x", x).Error("failed to query active runs per day last x days") return []int{}, [][]int64{} } @@ -323,7 +322,7 @@ func (s *StatsStore) ActiveParticipantsPerDayLastXDays(x int, filters *StatsFilt counts, err := s.performQueryForXCols(q, x) if err != nil { - s.log.Warnf("failed to perform query: %v", err) + logrus.WithError(err).WithField("x", x).Error("failed to query active participants per day last x days") return []int{}, [][]int64{} } @@ -355,13 +354,13 @@ func (s *StatsStore) MetricOverallAverage(filters StatsFilters) []null.Int { } var averages []Average if err := s.store.selectBuilder(s.store.db, &averages, query); err != nil { - s.log.Warnf("Error retrieving stat total active participants %w", err) + logrus.WithError(err).Error("failed to query metric averages") return []null.Int{} } configs, err := s.retrieveMetricConfigs(filters.PlaybookID) if err != nil { - s.log.Warnf("Error retrieving metrics configs ids for playbook %w", err) + logrus.WithError(err).WithField("playbook_id", filters.PlaybookID).Error("Error retrieving metrics configs ids for playbook") return []null.Int{} } @@ -403,13 +402,13 @@ func (s *StatsStore) MetricValueRange(filters StatsFilters) [][]int64 { OrderBy("mc.Ordering ASC") var res []MinMax if err := s.store.selectBuilder(s.store.db, &res, q); err != nil { - s.log.Warnf("Error retrieving metric min and max values %w", err) + logrus.WithError(err).Error("Error retrieving metric min and max values") return [][]int64{} } configs, err := s.retrieveMetricConfigs(filters.PlaybookID) if err != nil { - s.log.Warnf("Error retrieving metrics configs ids for playbook %w", err) + logrus.WithError(err).WithField("playbook_id", filters.PlaybookID).Error("Error retrieving metrics configs ids for playbook") return [][]int64{} } @@ -433,10 +432,12 @@ func (s *StatsStore) MetricValueRange(filters StatsFilters) [][]int64 { // Returns empty list if Playbook doesn't have metrics. // If for some metrics there are no published values, the corresponding slice will be nil in the resulting slice func (s *StatsStore) MetricRollingValuesLastXRuns(x int, offset int, filters StatsFilters) ([][]int64, []string) { + logger := logrus.WithField("playbook_id", filters.PlaybookID) + // retrieve metric configs metricsConfigsIDs for playbook metricsConfigsIDs, err := s.retrieveMetricConfigs(filters.PlaybookID) if err != nil { - s.log.Warnf("Error retrieving metrics configs ids for playbook %w", err) + logger.WithError(err).Error("failed to retrieve metrics configs") return [][]int64{}, []string{} } @@ -463,7 +464,7 @@ func (s *StatsStore) MetricRollingValuesLastXRuns(x int, offset int, filters Sta Name string } if err := s.store.selectBuilder(s.store.db, &rows, query); err != nil { - s.log.Warnf("Error retrieving metrics values %w", err) + logger.WithError(err).WithField("metric_config_id", id).Error("failed to query metrics") return [][]int64{}, []string{} } @@ -563,9 +564,9 @@ func (s *StatsStore) retrieveMetricConfigs(playbookID string) ([]string, error) OrderBy("Ordering ASC") var ids []string if err := s.store.selectBuilder(s.store.db, &ids, query); err != nil { - s.log.Warnf("Error retrieving metrics configs ids for playbook %s ", playbookID) return nil, err } + return ids, nil } diff --git a/server/sqlstore/stats_test.go b/server/sqlstore/stats_test.go index 0d817994fd..ec0a1ed5a0 100644 --- a/server/sqlstore/stats_test.go +++ b/server/sqlstore/stats_test.go @@ -24,9 +24,9 @@ func setupStatsStore(t *testing.T, db *sqlx.DB) *StatsStore { Configuration: configAPI, } - logger, sqlStore := setupSQLStore(t, db) + sqlStore := setupSQLStore(t, db) - return NewStatsStore(pluginAPIClient, logger, sqlStore) + return NewStatsStore(pluginAPIClient, sqlStore) } func TestTotalInProgressPlaybookRuns(t *testing.T) { @@ -93,7 +93,7 @@ func TestTotalInProgressPlaybookRuns(t *testing.T) { playbookRunStore := setupPlaybookRunStore(t, db) statsStore := setupStatsStore(t, db) - _, store := setupSQLStore(t, db) + store := setupSQLStore(t, db) setupTeamMembersTable(t, db) setupChannelMembersTable(t, db) setupChannelMemberHistoryTable(t, db) @@ -104,10 +104,6 @@ func TestTotalInProgressPlaybookRuns(t *testing.T) { addUsersToTeam(t, store, []userInfo{lucy, bob, john, jane, notInvolved, phil, quincy, bot1, bot2}, team1id) addUsersToTeam(t, store, []userInfo{lucy, bob, john, jane, notInvolved, phil, quincy, bot1, bot2}, team2id) createChannels(t, store, []model.Channel{channel01, channel02, channel03, channel04, channel05, channel06, channel07, channel08, channel09}) - addUsersToChannels(t, store, []userInfo{bob, lucy, phil, bot1, bot2}, []string{channel01.Id, channel02.Id, channel03.Id, channel04.Id, channel06.Id, channel07.Id, channel08.Id, channel09.Id}) - addUsersToChannels(t, store, []userInfo{bob, quincy}, []string{channel05.Id}) - addUsersToChannels(t, store, []userInfo{john}, []string{channel01.Id}) - addUsersToChannels(t, store, []userInfo{jane}, []string{channel01.Id, channel02.Id}) makeAdmin(t, store, bob) inc01 := *NewBuilder(nil). @@ -194,10 +190,16 @@ func TestTotalInProgressPlaybookRuns(t *testing.T) { playbookRuns := []app.PlaybookRun{inc01, inc02, inc03, inc04, inc05, inc06, inc07, inc08, inc09} for i := range playbookRuns { - _, err := playbookRunStore.CreatePlaybookRun(&playbookRuns[i]) + created, err := playbookRunStore.CreatePlaybookRun(&playbookRuns[i]) require.NoError(t, err) + playbookRuns[i] = *created } + addUsersToRuns(t, store, []userInfo{bob, lucy, phil}, []string{playbookRuns[0].ID, playbookRuns[1].ID, playbookRuns[2].ID, playbookRuns[3].ID, playbookRuns[5].ID, playbookRuns[6].ID, playbookRuns[7].ID, playbookRuns[8].ID}) + addUsersToRuns(t, store, []userInfo{bob, quincy}, []string{playbookRuns[4].ID}) + addUsersToRuns(t, store, []userInfo{john}, []string{playbookRuns[0].ID}) + addUsersToRuns(t, store, []userInfo{jane}, []string{playbookRuns[0].ID, playbookRuns[1].ID}) + t.Run(driverName+" Active Participants - team1", func(t *testing.T) { result := statsStore.TotalActiveParticipants(&StatsFilters{ TeamID: team1id, @@ -337,7 +339,7 @@ func TestTotalPlaybookRuns(t *testing.T) { playbookRunStore := setupPlaybookRunStore(t, db) statsStore := setupStatsStore(t, db) - _, store := setupSQLStore(t, db) + store := setupSQLStore(t, db) setupTeamMembersTable(t, db) setupChannelMembersTable(t, db) setupChannelMemberHistoryTable(t, db) @@ -348,9 +350,6 @@ func TestTotalPlaybookRuns(t *testing.T) { addUsersToTeam(t, store, []userInfo{lucy, bob, john, bot2}, team1id) addUsersToTeam(t, store, []userInfo{lucy, bob, bot1, bot2}, team2id) createChannels(t, store, []model.Channel{chanOpen01, chanOpen02, chanOpen03, chanPrivate01, chanPrivate02, chanPrivate03, chanPrivate04, chanPrivate05, chanPrivate06}) - addUsersToChannels(t, store, []userInfo{bob, lucy, bot1, bot2}, []string{chanOpen01.Id, chanOpen02.Id, chanOpen03.Id, chanPrivate01.Id, chanPrivate03.Id, chanPrivate04.Id, chanPrivate05.Id, chanPrivate06.Id}) - addUsersToChannels(t, store, []userInfo{bob}, []string{chanPrivate02.Id}) - addUsersToChannels(t, store, []userInfo{john}, []string{chanOpen01.Id}) makeAdmin(t, store, bob) // create run with different statuses, channels, teams and playbooks @@ -411,10 +410,15 @@ func TestTotalPlaybookRuns(t *testing.T) { playbookRuns := []app.PlaybookRun{run01, run02, run03, run04, run05, run06} for i := range playbookRuns { - _, err := playbookRunStore.CreatePlaybookRun(&playbookRuns[i]) + created, err := playbookRunStore.CreatePlaybookRun(&playbookRuns[i]) + playbookRuns[i] = *created require.NoError(t, err) } + addUsersToRuns(t, store, []userInfo{bob, lucy, bot1, bot2}, []string{playbookRuns[0].ID, playbookRuns[1].ID, playbookRuns[2].ID, playbookRuns[3].ID, playbookRuns[5].ID}) + addUsersToRuns(t, store, []userInfo{bob}, []string{playbookRuns[4].ID}) + addUsersToRuns(t, store, []userInfo{john}, []string{playbookRuns[0].ID}) + t.Run(driverName+" TotalPlaybookRuns", func(t *testing.T) { result, err := statsStore.TotalPlaybookRuns() assert.NoError(t, err) @@ -455,7 +459,7 @@ func TestTotalPlaybooks(t *testing.T) { playbookRunStore := setupPlaybookRunStore(t, db) statsStore := setupStatsStore(t, db) - _, store := setupSQLStore(t, db) + store := setupSQLStore(t, db) setupTeamMembersTable(t, db) setupChannelMembersTable(t, db) setupChannelMemberHistoryTable(t, db) @@ -511,7 +515,7 @@ func TestMetricsStats(t *testing.T) { playbookRunStore := setupPlaybookRunStore(t, db) playbookStore := setupPlaybookStore(t, db) statsStore := setupStatsStore(t, db) - _, store := setupSQLStore(t, db) + store := setupSQLStore(t, db) setupChannelsTable(t, db) setupPostsTable(t, db) diff --git a/server/sqlstore/store.go b/server/sqlstore/store.go index f1f3dd791e..0bd9356a76 100644 --- a/server/sqlstore/store.go +++ b/server/sqlstore/store.go @@ -4,23 +4,27 @@ import ( "database/sql" "github.com/mattermost/mattermost-plugin-playbooks/server/app" + "github.com/sirupsen/logrus" sq "github.com/Masterminds/squirrel" "github.com/jmoiron/sqlx" - "github.com/mattermost/mattermost-plugin-playbooks/server/bot" "github.com/mattermost/mattermost-server/v6/model" "github.com/pkg/errors" ) +// maxJSONLength holds the limit we set for JSON data in postgres +// Since JSON data type is unboounded, we need to set a limit +// that we'll control manually. +const maxJSONLength = 256 * 1024 // 256KB + type SQLStore struct { - log bot.Logger db *sqlx.DB builder sq.StatementBuilderType scheduler app.JobOnceScheduler } // New constructs a new instance of SQLStore. -func New(pluginAPI PluginAPIClient, log bot.Logger, scheduler app.JobOnceScheduler) (*SQLStore, error) { +func New(pluginAPI PluginAPIClient, scheduler app.JobOnceScheduler) (*SQLStore, error) { var db *sqlx.DB origDB, err := pluginAPI.Store.GetMasterDB() @@ -39,7 +43,6 @@ func New(pluginAPI PluginAPIClient, log bot.Logger, scheduler app.JobOnceSchedul } return &SQLStore{ - log, db, builder, scheduler, @@ -123,6 +126,6 @@ func (sqlStore *SQLStore) execBuilder(e execer, b builder) (sql.Result, error) { func (sqlStore *SQLStore) finalizeTransaction(tx *sqlx.Tx) { // Rollback returns sql.ErrTxDone if the transaction was already closed. if err := tx.Rollback(); err != nil && err != sql.ErrTxDone { - sqlStore.log.Errorf("Failed to rollback transaction; err: %v", err) + logrus.WithError(err).Error("Failed to rollback transaction") } } diff --git a/server/sqlstore/store_test.go b/server/sqlstore/store_test.go index 5982eebb20..5c06bc0f2d 100644 --- a/server/sqlstore/store_test.go +++ b/server/sqlstore/store_test.go @@ -12,7 +12,6 @@ import ( sq "github.com/Masterminds/squirrel" "github.com/blang/semver" "github.com/golang/mock/gomock" - mock_bot "github.com/mattermost/mattermost-plugin-playbooks/server/bot/mocks" "github.com/mattermost/mattermost-server/v6/model" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -20,8 +19,6 @@ import ( func TestMigrations(t *testing.T) { mockCtrl := gomock.NewController(t) - logger := mock_bot.NewMockLogger(mockCtrl) - logger.EXPECT().Debugf(gomock.AssignableToTypeOf("string")).Times(2) scheduler := mock_app.NewMockJobOnceScheduler(mockCtrl) for _, driver := range driverNames { @@ -33,7 +30,6 @@ func TestMigrations(t *testing.T) { t.Run("Run every migration twice", func(t *testing.T) { db := setupTestDB(t, driver) sqlStore := &SQLStore{ - logger, db, builder, scheduler, @@ -73,7 +69,6 @@ func TestMigrations(t *testing.T) { t.Run("Run the whole set of migrations twice", func(t *testing.T) { db := setupTestDB(t, driver) sqlStore := &SQLStore{ - logger, db, builder, scheduler, @@ -113,7 +108,6 @@ func TestMigrations(t *testing.T) { t.Run("force incidents to have a reminder set", func(t *testing.T) { db := setupTestDB(t, driver) sqlStore := &SQLStore{ - logger, db, builder, scheduler, @@ -223,7 +217,6 @@ func TestMigrations(t *testing.T) { t.Run("copy Description column into new RunSummaryTemplate", func(t *testing.T) { db := setupTestDB(t, driver) sqlStore := &SQLStore{ - logger, db, builder, scheduler, @@ -330,7 +323,6 @@ func TestMigrations(t *testing.T) { t.Run("playbook member migration", func(t *testing.T) { db := setupTestDB(t, driver) sqlStore := &SQLStore{ - logger, db, builder, scheduler, @@ -494,6 +486,165 @@ func TestMigrations(t *testing.T) { Where(sq.Eq{"MemberID": user2ID})) require.ErrorIs(t, err, sql.ErrNoRows) }) + + t.Run("run participants migration", func(t *testing.T) { + db := setupTestDB(t, driver) + sqlStore := &SQLStore{ + db, + builder, + scheduler, + } + + // Make sure we start from scratch + currentSchemaVersion, err := sqlStore.GetCurrentVersion() + require.NoError(t, err) + require.Equal(t, currentSchemaVersion, semver.Version{}) + + // Migration to 0.10.0 needs the Channels table to work + setupChannelsTable(t, db) + // Migration to 0.21.0 need the Posts table + setupPostsTable(t, db) + // Migration to 0.31.0 needs the PluginKeyValueStore + setupKVStoreTable(t, db) + // Migration to 0.55.0 needs the TeamMembers table + setupTeamMembersTable(t, db) + // Migration to 0.56.0 needs ChannelMembers table + setupChannelMembersTable(t, db) + // Migration to 0.56.0 needs ChannelMembers table + setupBotsTable(t, db) + + // Apply the migrations up to and including 0.57.0 + migrateUpTo(t, sqlStore, semver.MustParse("0.57.0")) + + bot1 := userInfo{ + ID: model.NewId(), + Name: "Mr. Bot", + } + bot2 := userInfo{ + ID: model.NewId(), + Name: "Mrs. Bot", + } + // Add two bots + addBots(t, sqlStore, []userInfo{bot1, bot2}) + + userIDs := []string{model.NewId(), model.NewId(), model.NewId(), model.NewId()} + runs := []struct { + ID string + ChannelID string + ChannelMemberIDs []string + }{ + {ID: model.NewId(), ChannelID: model.NewId(), ChannelMemberIDs: []string{userIDs[0], userIDs[1], userIDs[2], bot1.ID}}, + {ID: model.NewId(), ChannelID: model.NewId(), ChannelMemberIDs: []string{userIDs[0], userIDs[1], bot2.ID}}, + {ID: model.NewId(), ChannelID: model.NewId(), ChannelMemberIDs: []string{userIDs[0]}}, + {ID: model.NewId(), ChannelID: model.NewId(), ChannelMemberIDs: []string{bot1.ID, bot2.ID}}, + } + for _, run := range runs { + // Insert runs + _, err := sqlStore.execBuilder(sqlStore.db, sq. + Insert("IR_Incident"). + SetMap(map[string]interface{}{ + "ID": run.ID, + "CreateAt": model.GetMillis(), + "CurrentStatus": app.StatusInProgress, + // have to be set: + "Name": "test", + "Description": "test", + "IsActive": true, + "CommanderUserID": "commander", + "TeamID": "testTeam", + "ChannelID": run.ChannelID, + "ActiveStage": 0, + "ChecklistsJSON": "{}", + })) + require.NoError(t, err) + + // Insert channel members + for _, userID := range run.ChannelMemberIDs { + _, err = sqlStore.execBuilder(sqlStore.db, sq. + Insert("ChannelMembers"). + SetMap(map[string]interface{}{ + "UserID": userID, + "ChannelID": run.ChannelID, + })) + require.NoError(t, err) + } + } + + // Add users to IR_Run_Participants + // Channel member and follower + _, err = sqlStore.execBuilder(sqlStore.db, sq. + Insert("IR_Run_Participants"). + SetMap(map[string]interface{}{ + "UserID": userIDs[0], + "IncidentID": runs[0].ID, + "IsFollower": true, + })) + require.NoError(t, err) + // Channel member, not follower + _, err = sqlStore.execBuilder(sqlStore.db, sq. + Insert("IR_Run_Participants"). + SetMap(map[string]interface{}{ + "UserID": userIDs[0], + "IncidentID": runs[1].ID, + "IsFollower": false, + })) + require.NoError(t, err) + // Not channel member, follower + _, err = sqlStore.execBuilder(sqlStore.db, sq. + Insert("IR_Run_Participants"). + SetMap(map[string]interface{}{ + "UserID": userIDs[3], + "IncidentID": runs[3].ID, + "IsFollower": false, + })) + require.NoError(t, err) + + type RunParticipant struct { + UserID string + IncidentID string + } + + var runMembers1 []RunParticipant + err = sqlStore.selectBuilder(sqlStore.db, &runMembers1, sqlStore.builder. + Select("UserID", "IncidentID"). + From("IR_Run_Participants"). + OrderBy("UserID ASC")) + require.NoError(t, err) + + // Apply the migrations from 0.57.0-on + migrateFrom(t, sqlStore, semver.MustParse("0.57.0")) + + // Compare run members list and channel members list + var runMembers []RunParticipant + err = sqlStore.selectBuilder(sqlStore.db, &runMembers, sqlStore.builder. + Select("UserID", "IncidentID"). + From("IR_Run_Participants"). + Where(sq.Eq{"IsParticipant": true}). + OrderBy("UserID ASC"). + OrderBy("IncidentID ASC")) + require.NoError(t, err) + + var channelMembers []RunParticipant + err = sqlStore.selectBuilder(sqlStore.db, &channelMembers, sqlStore.builder. + Select("cm.UserID as UserID", "i.ID as IncidentID"). + From("ChannelMembers as cm"). + Join("IR_Incident AS i ON i.ChannelID = cm.ChannelID"). + OrderBy("UserID ASC"). + OrderBy("IncidentID ASC")) + require.NoError(t, err) + require.Len(t, runMembers, 10) + require.Equal(t, runMembers, channelMembers) + + var count int64 + + // Verify followers number + err = sqlStore.getBuilder(sqlStore.db, &count, sqlStore.builder. + Select("COUNT(*)"). + From("IR_Run_Participants"). + Where(sq.Eq{"IsFollower": true})) + require.NoError(t, err) + require.Equal(t, int64(1), count) + }) } } diff --git a/server/sqlstore/support_for_test.go b/server/sqlstore/support_for_test.go index 22ff17f027..b61c292ba9 100644 --- a/server/sqlstore/support_for_test.go +++ b/server/sqlstore/support_for_test.go @@ -11,8 +11,6 @@ import ( "github.com/golang/mock/gomock" "github.com/jmoiron/sqlx" "github.com/mattermost/mattermost-plugin-playbooks/server/app" - "github.com/mattermost/mattermost-plugin-playbooks/server/bot" - mock_bot "github.com/mattermost/mattermost-plugin-playbooks/server/bot/mocks" "github.com/mattermost/mattermost-server/v6/model" "github.com/mattermost/mattermost-server/v6/store/storetest" "github.com/stretchr/testify/require" @@ -42,11 +40,10 @@ func setupTestDB(t testing.TB, driverName string) *sqlx.DB { return db } -func setupSQLStore(t *testing.T, db *sqlx.DB) (bot.Logger, *SQLStore) { +func setupTables(t *testing.T, db *sqlx.DB) *SQLStore { t.Helper() mockCtrl := gomock.NewController(t) - logger := mock_bot.NewMockLogger(mockCtrl) scheduler := mock_app.NewMockJobOnceScheduler(mockCtrl) driverName := db.DriverName() @@ -57,14 +54,11 @@ func setupSQLStore(t *testing.T, db *sqlx.DB) (bot.Logger, *SQLStore) { } sqlStore := &SQLStore{ - logger, db, builder, scheduler, } - logger.EXPECT().Debugf(gomock.AssignableToTypeOf("string")).AnyTimes() - setupChannelsTable(t, db) setupPostsTable(t, db) setupBotsTable(t, db) @@ -76,10 +70,16 @@ func setupSQLStore(t *testing.T, db *sqlx.DB) (bot.Logger, *SQLStore) { setupSchemesTable(t, db) setupTeamMembersTable(t, db) + return sqlStore +} + +func setupSQLStore(t *testing.T, db *sqlx.DB) *SQLStore { + sqlStore := setupTables(t, db) + err := sqlStore.RunMigrations() require.NoError(t, err) - return logger, sqlStore + return sqlStore } func setupUsersTable(t *testing.T, db *sqlx.DB) { @@ -706,6 +706,21 @@ func addUsersToChannels(t *testing.T, store *SQLStore, users []userInfo, channel require.NoError(t, err) } +func addUsersToRuns(t *testing.T, store *SQLStore, users []userInfo, runIDs []string) { + t.Helper() + + insertBuilder := store.builder.Insert("IR_Run_Participants").Columns("IncidentID", "UserId", "IsParticipant", "IsFollower") + + for _, u := range users { + for _, runID := range runIDs { + insertBuilder = insertBuilder.Values(runID, u.ID, true, false) + } + } + + _, err := store.execBuilder(store.db, insertBuilder) + require.NoError(t, err) +} + func createChannels(t testing.TB, store *SQLStore, channels []model.Channel) { t.Helper() diff --git a/server/sqlstore/timeline_event_test.go b/server/sqlstore/timeline_event_test.go index 6446e5c9f2..60cb65584d 100644 --- a/server/sqlstore/timeline_event_test.go +++ b/server/sqlstore/timeline_event_test.go @@ -15,7 +15,7 @@ func TestPlaybookRunStore_CreateTimelineEvent(t *testing.T) { for _, driverName := range driverNames { db := setupTestDB(t, driverName) iStore := setupPlaybookRunStore(t, db) - _, store := setupSQLStore(t, db) + store := setupSQLStore(t, db) setupChannelsTable(t, db) setupPostsTable(t, db) @@ -104,7 +104,7 @@ func TestPlaybookRunStore_UpdateTimelineEvent(t *testing.T) { for _, driverName := range driverNames { db := setupTestDB(t, driverName) iStore := setupPlaybookRunStore(t, db) - _, store := setupSQLStore(t, db) + store := setupSQLStore(t, db) setupChannelsTable(t, db) setupPostsTable(t, db) diff --git a/server/sqlstore/user_info.go b/server/sqlstore/user_info.go index 76a1676c18..44b18e4a48 100644 --- a/server/sqlstore/user_info.go +++ b/server/sqlstore/user_info.go @@ -106,6 +106,10 @@ func toSQLUserInfo(userInfo app.UserInfo) (*sqlUserInfo, error) { return nil, errors.Wrapf(err, "failed to marshal DigestNotificationSettings for userid: %s", userInfo.ID) } + if len(digestNotificationSettingsJSON) > maxJSONLength { + return nil, errors.Wrapf(err, "digestNotificationSettings json for user id '%s' is too long (max %d)", userInfo.ID, maxJSONLength) + } + return &sqlUserInfo{ UserInfo: userInfo, DigestNotificationSettingsJSON: digestNotificationSettingsJSON, diff --git a/server/sqlstore/user_info_test.go b/server/sqlstore/user_info_test.go index 525955e8be..edc06541be 100644 --- a/server/sqlstore/user_info_test.go +++ b/server/sqlstore/user_info_test.go @@ -11,8 +11,6 @@ import ( "github.com/pkg/errors" - mock_bot "github.com/mattermost/mattermost-plugin-playbooks/server/bot/mocks" - sq "github.com/Masterminds/squirrel" "github.com/golang/mock/gomock" "github.com/jmoiron/sqlx" @@ -165,7 +163,6 @@ func setupSQLStoreForUserInfo(t *testing.T, db *sqlx.DB) *SQLStore { t.Helper() mockCtrl := gomock.NewController(t) - logger := mock_bot.NewMockLogger(mockCtrl) scheduler := mock_app.NewMockJobOnceScheduler(mockCtrl) driverName := db.DriverName() @@ -176,14 +173,11 @@ func setupSQLStoreForUserInfo(t *testing.T, db *sqlx.DB) *SQLStore { } sqlStore := &SQLStore{ - logger, db, builder, scheduler, } - logger.EXPECT().Debugf(gomock.AssignableToTypeOf("string")).AnyTimes() - setupChannelsTable(t, db) setupPostsTable(t, db) setupKVStoreTable(t, db) diff --git a/server/telemetry/noop.go b/server/telemetry/noop.go index 8668da8572..e96706a0dd 100644 --- a/server/telemetry/noop.go +++ b/server/telemetry/noop.go @@ -1,9 +1,12 @@ package telemetry -import "github.com/mattermost/mattermost-plugin-playbooks/server/app" +import ( + "github.com/mattermost/mattermost-plugin-playbooks/server/app" +) // NoopTelemetry satisfies the Telemetry interface with no-op implementations. -type NoopTelemetry struct{} +type NoopTelemetry struct { +} // Enable does nothing, returning always nil. func (t *NoopTelemetry) Enable() error { @@ -15,6 +18,14 @@ func (t *NoopTelemetry) Disable() error { return nil } +// Page does nothing +func (t *NoopTelemetry) Page(name app.TelemetryPage, properties map[string]interface{}) { +} + +// Track does nothing +func (t *NoopTelemetry) Track(name app.TelemetryTrack, properties map[string]interface{}) { +} + // CreatePlaybookRun does nothing func (t *NoopTelemetry) CreatePlaybookRun(*app.PlaybookRun, string, bool) { } @@ -188,3 +199,11 @@ func (t *NoopTelemetry) RunAction(playbookRun *app.PlaybookRun, userID, triggerT // UpdateRunActions does nothing func (t *NoopTelemetry) UpdateRunActions(playbookRun *app.PlaybookRun, userID string) { } + +// FavoriteItem does nothing +func (t *NoopTelemetry) FavoriteItem(item app.CategoryItem, userID string) { +} + +// UnfavoriteItem does nothing +func (t *NoopTelemetry) UnfavoriteItem(item app.CategoryItem, userID string) { +} diff --git a/server/telemetry/rudder.go b/server/telemetry/rudder.go index 5b92840a96..2ffb8483be 100644 --- a/server/telemetry/rudder.go +++ b/server/telemetry/rudder.go @@ -82,6 +82,12 @@ const ( eventRunAction = "playbookrun_action" actionRunAction = "run_playbookrun_action" actionRunActionsUpdate = "update_playbookrun_actions" + + eventSidebarCategory = "lhs_category" + actionFavoriteRun = "favorite_run" + actionUnfavoriteRun = "unfavorite_run" + actionFavoritePlaybook = "favorite_playbook" + actionUnfavoritePlaybook = "unfavorite_playbook" ) // NewRudder builds a new RudderTelemetry client that will send the events to @@ -117,7 +123,8 @@ func NewRudder(dataPlaneURL, writeKey, diagnosticID, pluginVersion, serverVersio }, nil } -func (t *RudderTelemetry) track(event string, properties map[string]interface{}) { +// Track is the generic tracker for events to rudderstack +func (t *RudderTelemetry) Track(name app.TelemetryTrack, properties map[string]interface{}) { t.mutex.RLock() defer t.mutex.RUnlock() @@ -130,7 +137,26 @@ func (t *RudderTelemetry) track(event string, properties map[string]interface{}) _ = t.client.Enqueue(rudder.Track{ UserId: t.diagnosticID, - Event: event, + Event: string(name), + Properties: properties, + }) +} + +// Page is the generic tracker for pageviews to rudderstack +func (t *RudderTelemetry) Page(name app.TelemetryPage, properties map[string]interface{}) { + t.mutex.RLock() + defer t.mutex.RUnlock() + + if !t.enabled { + return + } + + properties["PluginVersion"] = t.pluginVersion + properties["ServerVersion"] = t.serverVersion + + _ = t.client.Enqueue(rudder.Page{ + UserId: t.diagnosticID, + Name: string(name), Properties: properties, }) } @@ -192,76 +218,76 @@ func (t *RudderTelemetry) CreatePlaybookRun(playbookRun *app.PlaybookRun, userID properties := playbookRunProperties(playbookRun, userID) properties["Action"] = actionCreate properties["Public"] = public - t.track(eventPlaybookRun, properties) + t.Track(eventPlaybookRun, properties) } // FinishPlaybookRun tracks the end of the playbook run passed. func (t *RudderTelemetry) FinishPlaybookRun(playbookRun *app.PlaybookRun, userID string) { properties := playbookRunProperties(playbookRun, userID) properties["Action"] = actionEnd - t.track(eventPlaybookRun, properties) + t.Track(eventPlaybookRun, properties) } // RestorePlaybookRun tracks the restoration of the playbook run. func (t *RudderTelemetry) RestorePlaybookRun(playbookRun *app.PlaybookRun, userID string) { properties := playbookRunProperties(playbookRun, userID) properties["Action"] = actionRestore - t.track(eventPlaybookRun, properties) + t.Track(eventPlaybookRun, properties) } // RestartPlaybookRun tracks the restart of the playbook run. func (t *RudderTelemetry) RestartPlaybookRun(playbookRun *app.PlaybookRun, userID string) { properties := playbookRunProperties(playbookRun, userID) properties["Action"] = actionRestart - t.track(eventPlaybookRun, properties) + t.Track(eventPlaybookRun, properties) } // ChangeOwner tracks changes in owner func (t *RudderTelemetry) ChangeOwner(playbookRun *app.PlaybookRun, userID string) { properties := playbookRunProperties(playbookRun, userID) properties["Action"] = actionChangeOwner - t.track(eventPlaybookRun, properties) + t.Track(eventPlaybookRun, properties) } func (t *RudderTelemetry) UpdateStatus(playbookRun *app.PlaybookRun, userID string) { properties := playbookRunProperties(playbookRun, userID) properties["Action"] = actionUpdateStatus properties["ReminderTimerSeconds"] = int(playbookRun.PreviousReminder) - t.track(eventPlaybookRun, properties) + t.Track(eventPlaybookRun, properties) } func (t *RudderTelemetry) FrontendTelemetryForPlaybookRun(playbookRun *app.PlaybookRun, userID, action string) { properties := playbookRunProperties(playbookRun, userID) properties["Action"] = action - t.track(eventFrontend, properties) + t.Track(eventFrontend, properties) } // AddPostToTimeline tracks userID creating a timeline event from a post. func (t *RudderTelemetry) AddPostToTimeline(playbookRun *app.PlaybookRun, userID string) { properties := playbookRunProperties(playbookRun, userID) properties["Action"] = actionAddTimelineEventFromPost - t.track(eventPlaybookRun, properties) + t.Track(eventPlaybookRun, properties) } // RemoveTimelineEvent tracks userID removing a timeline event. func (t *RudderTelemetry) RemoveTimelineEvent(playbookRun *app.PlaybookRun, userID string) { properties := playbookRunProperties(playbookRun, userID) properties["Action"] = actionRemoveTimelineEvent - t.track(eventPlaybookRun, properties) + t.Track(eventPlaybookRun, properties) } // Follow tracks userID following a playbook run. func (t *RudderTelemetry) Follow(playbookRun *app.PlaybookRun, userID string) { properties := playbookRunProperties(playbookRun, userID) properties["Action"] = actionFollow - t.track(eventPlaybookRun, properties) + t.Track(eventPlaybookRun, properties) } // Unfollow tracks userID following a playbook run. func (t *RudderTelemetry) Unfollow(playbookRun *app.PlaybookRun, userID string) { properties := playbookRunProperties(playbookRun, userID) properties["Action"] = actionUnfollow - t.track(eventPlaybookRun, properties) + t.Track(eventPlaybookRun, properties) } func taskProperties(playbookRunID, userID string, task app.ChecklistItem) map[string]interface{} { @@ -283,7 +309,7 @@ func taskProperties(playbookRunID, userID string, task app.ChecklistItem) map[st func (t *RudderTelemetry) AddTask(playbookRunID, userID string, task app.ChecklistItem) { properties := taskProperties(playbookRunID, userID, task) properties["Action"] = actionAddTask - t.track(eventTasks, properties) + t.Track(eventTasks, properties) } // RemoveTask tracks the removal of a checklist item by the user @@ -291,7 +317,7 @@ func (t *RudderTelemetry) AddTask(playbookRunID, userID string, task app.Checkli func (t *RudderTelemetry) RemoveTask(playbookRunID, userID string, task app.ChecklistItem) { properties := taskProperties(playbookRunID, userID, task) properties["Action"] = actionRemoveTask - t.track(eventTasks, properties) + t.Track(eventTasks, properties) } // RenameTask tracks the update of a checklist item by the user @@ -299,7 +325,7 @@ func (t *RudderTelemetry) RemoveTask(playbookRunID, userID string, task app.Chec func (t *RudderTelemetry) RenameTask(playbookRunID, userID string, task app.ChecklistItem) { properties := taskProperties(playbookRunID, userID, task) properties["Action"] = actionRenameTask - t.track(eventTasks, properties) + t.Track(eventTasks, properties) } // SkipChecklist tracks the skipping of a checklist by the user @@ -307,7 +333,7 @@ func (t *RudderTelemetry) RenameTask(playbookRunID, userID string, task app.Chec func (t *RudderTelemetry) SkipChecklist(playbookRunID, userID string, checklist app.Checklist) { properties := checklistProperties(playbookRunID, userID, checklist) properties["Action"] = actionSkipChecklist - t.track(eventChecklists, properties) + t.Track(eventChecklists, properties) } // RestoreChecklist tracks the restoring of a checklist by the user @@ -315,7 +341,7 @@ func (t *RudderTelemetry) SkipChecklist(playbookRunID, userID string, checklist func (t *RudderTelemetry) RestoreChecklist(playbookRunID, userID string, checklist app.Checklist) { properties := checklistProperties(playbookRunID, userID, checklist) properties["Action"] = actionRestoreChecklist - t.track(eventChecklists, properties) + t.Track(eventChecklists, properties) } // SkipTask tracks the skipping of a checklist item by the user @@ -323,7 +349,7 @@ func (t *RudderTelemetry) RestoreChecklist(playbookRunID, userID string, checkli func (t *RudderTelemetry) SkipTask(playbookRunID, userID string, task app.ChecklistItem) { properties := taskProperties(playbookRunID, userID, task) properties["Action"] = actionSkipTask - t.track(eventTasks, properties) + t.Track(eventTasks, properties) } // RestoreTask tracks the restoring of a checklist item by the user @@ -331,7 +357,7 @@ func (t *RudderTelemetry) SkipTask(playbookRunID, userID string, task app.Checkl func (t *RudderTelemetry) RestoreTask(playbookRunID, userID string, task app.ChecklistItem) { properties := taskProperties(playbookRunID, userID, task) properties["Action"] = actionRestoreTask - t.track(eventTasks, properties) + t.Track(eventTasks, properties) } // ModifyCheckedState tracks the checking and unchecking of items by the user @@ -342,7 +368,7 @@ func (t *RudderTelemetry) ModifyCheckedState(playbookRunID, userID string, task properties["NewState"] = task.State properties["WasCommander"] = wasOwner properties["WasAssignee"] = task.AssigneeID == userID - t.track(eventTasks, properties) + t.Track(eventTasks, properties) } // SetAssignee tracks the changing of an assignee on an item by the user @@ -350,7 +376,7 @@ func (t *RudderTelemetry) ModifyCheckedState(playbookRunID, userID string, task func (t *RudderTelemetry) SetAssignee(playbookRunID, userID string, task app.ChecklistItem) { properties := taskProperties(playbookRunID, userID, task) properties["Action"] = actionSetAssigneeForTask - t.track(eventTasks, properties) + t.Track(eventTasks, properties) } // MoveTask tracks the movement of checklist items by the user @@ -358,14 +384,14 @@ func (t *RudderTelemetry) SetAssignee(playbookRunID, userID string, task app.Che func (t *RudderTelemetry) MoveTask(playbookRunID, userID string, task app.ChecklistItem) { properties := taskProperties(playbookRunID, userID, task) properties["Action"] = actionMoveTask - t.track(eventTasks, properties) + t.Track(eventTasks, properties) } // RunTaskSlashCommand tracks the execution of a slash command on a checklist item. func (t *RudderTelemetry) RunTaskSlashCommand(playbookRunID, userID string, task app.ChecklistItem) { properties := taskProperties(playbookRunID, userID, task) properties["Action"] = actionRunTaskSlashCommand - t.track(eventTasks, properties) + t.Track(eventTasks, properties) } func checklistProperties(playbookRunID, userID string, checklist app.Checklist) map[string]interface{} { @@ -381,41 +407,41 @@ func checklistProperties(playbookRunID, userID string, checklist app.Checklist) func (t *RudderTelemetry) AddChecklist(playbookRunID, userID string, checklist app.Checklist) { properties := checklistProperties(playbookRunID, userID, checklist) properties["Action"] = actionAddChecklist - t.track(eventChecklists, properties) + t.Track(eventChecklists, properties) } // RemoveChecklist tracks the removal of a checklist. func (t *RudderTelemetry) RemoveChecklist(playbookRunID, userID string, checklist app.Checklist) { properties := checklistProperties(playbookRunID, userID, checklist) properties["Action"] = actionRemoveChecklist - t.track(eventChecklists, properties) + t.Track(eventChecklists, properties) } // RenameChecklist tracks the renaming of a checklist func (t *RudderTelemetry) RenameChecklist(playbookRunID, userID string, checklist app.Checklist) { properties := checklistProperties(playbookRunID, userID, checklist) properties["Action"] = actionRenameChecklist - t.track(eventChecklists, properties) + t.Track(eventChecklists, properties) } // MoveChecklist tracks the movement of a checklist func (t *RudderTelemetry) MoveChecklist(playbookRunID, userID string, checklist app.Checklist) { properties := checklistProperties(playbookRunID, userID, checklist) properties["Action"] = actionMoveChecklist - t.track(eventChecklists, properties) + t.Track(eventChecklists, properties) } func (t *RudderTelemetry) UpdateRetrospective(playbookRun *app.PlaybookRun, userID string) { properties := playbookRunProperties(playbookRun, userID) properties["Action"] = actionUpdateRetrospective - t.track(eventTasks, properties) + t.Track(eventTasks, properties) } func (t *RudderTelemetry) PublishRetrospective(playbookRun *app.PlaybookRun, userID string) { properties := playbookRunProperties(playbookRun, userID) properties["Action"] = actionPublishRetrospective properties["NumMetrics"] = len(playbookRun.MetricsData) - t.track(eventTasks, properties) + t.Track(eventTasks, properties) } func playbookProperties(playbook app.Playbook, userID string) map[string]interface{} { @@ -450,7 +476,7 @@ func playbookProperties(playbook app.Playbook, userID string) map[string]interfa "DefaultCommanderID": playbook.DefaultOwnerID, "DefaultCommanderEnabled": playbook.DefaultOwnerEnabled, "BroadcastChannelIDs": playbook.BroadcastChannelIDs, - "BroadcastEnabled": playbook.BroadcastEnabled, + "BroadcastEnabled": playbook.BroadcastEnabled, //nolint "NumWebhookOnCreationURLs": len(playbook.WebhookOnCreationURLs), "WebhookOnCreationEnabled": playbook.WebhookOnCreationEnabled, "SignalAnyKeywordsEnabled": playbook.SignalAnyKeywordsEnabled, @@ -471,63 +497,63 @@ func playbookTemplateProperties(templateName string, userID string) map[string]i func (t *RudderTelemetry) CreatePlaybook(playbook app.Playbook, userID string) { properties := playbookProperties(playbook, userID) properties["Action"] = actionCreate - t.track(eventPlaybook, properties) + t.Track(eventPlaybook, properties) } // ImportPlaybook tracks the import of a playbook. func (t *RudderTelemetry) ImportPlaybook(playbook app.Playbook, userID string) { properties := playbookProperties(playbook, userID) properties["Action"] = actionImport - t.track(eventPlaybook, properties) + t.Track(eventPlaybook, properties) } // UpdatePlaybook tracks the update of a playbook. func (t *RudderTelemetry) UpdatePlaybook(playbook app.Playbook, userID string) { properties := playbookProperties(playbook, userID) properties["Action"] = actionUpdate - t.track(eventPlaybook, properties) + t.Track(eventPlaybook, properties) } // DeletePlaybook tracks the deletion of a playbook. func (t *RudderTelemetry) DeletePlaybook(playbook app.Playbook, userID string) { properties := playbookProperties(playbook, userID) properties["Action"] = actionDelete - t.track(eventPlaybook, properties) + t.Track(eventPlaybook, properties) } // RestorePlaybook tracks the deletion of a playbook. func (t *RudderTelemetry) RestorePlaybook(playbook app.Playbook, userID string) { properties := playbookProperties(playbook, userID) properties["Action"] = actionRestore - t.track(eventPlaybook, properties) + t.Track(eventPlaybook, properties) } // AutoFollowPlaybook tracks the auto-follow of a playbook. func (t *RudderTelemetry) AutoFollowPlaybook(playbook app.Playbook, userID string) { properties := playbookProperties(playbook, userID) properties["Action"] = actionAutoFollow - t.track(eventPlaybook, properties) + t.Track(eventPlaybook, properties) } // AutoUnfollowPlaybook tracks the auto-unfollow of a playbook. func (t *RudderTelemetry) AutoUnfollowPlaybook(playbook app.Playbook, userID string) { properties := playbookProperties(playbook, userID) properties["Action"] = actionAutoUnfollow - t.track(eventPlaybook, properties) + t.Track(eventPlaybook, properties) } // FrontendTelemetryForPlaybook tracks an event originating from the frontend func (t *RudderTelemetry) FrontendTelemetryForPlaybook(playbook app.Playbook, userID, action string) { properties := playbookProperties(playbook, userID) properties["Action"] = action - t.track(eventFrontend, properties) + t.Track(eventFrontend, properties) } // FrontendTelemetryForPlaybookTemplate tracks a playbook template event originating from the frontend func (t *RudderTelemetry) FrontendTelemetryForPlaybookTemplate(templateName string, userID, action string) { properties := playbookTemplateProperties(templateName, userID) properties["Action"] = action - t.track(eventFrontend, properties) + t.Track(eventFrontend, properties) } func commonProperties(userID string) map[string]interface{} { @@ -539,13 +565,13 @@ func commonProperties(userID string) map[string]interface{} { func (t *RudderTelemetry) StartTrial(userID string, action string) { properties := commonProperties(userID) properties["Action"] = action - t.track(eventStartTrial, properties) + t.Track(eventStartTrial, properties) } func (t *RudderTelemetry) NotifyAdmins(userID string, action string) { properties := commonProperties(userID) properties["Action"] = action - t.track(eventNotifyAdmins, properties) + t.Track(eventNotifyAdmins, properties) } // Enable creates a new client to track all future events. It does nothing if @@ -598,7 +624,7 @@ func (t *RudderTelemetry) ChangeDigestSettings(userID string, old app.DigestNoti properties["Action"] = actionDigest properties["OldDisableDailyDigest"] = old.DisableDailyDigest properties["NewDisableDailyDigest"] = new.DisableDailyDigest - t.track(eventSettings, properties) + t.Track(eventSettings, properties) } func channelActionProperties(action app.GenericChannelAction, userID string) map[string]interface{} { @@ -613,14 +639,14 @@ func channelActionProperties(action app.GenericChannelAction, userID string) map func (t *RudderTelemetry) RunChannelAction(action app.GenericChannelAction, userID string) { properties := channelActionProperties(action, userID) properties["Action"] = actionRunChannelAction - t.track(eventChannelAction, properties) + t.Track(eventChannelAction, properties) } // UpdateRunActions tracks actions settings update func (t *RudderTelemetry) UpdateChannelAction(action app.GenericChannelAction, userID string) { properties := channelActionProperties(action, userID) properties["Action"] = actionChannelActionUpdate - t.track(eventChannelAction, properties) + t.Track(eventChannelAction, properties) } func runActionProperties(playbookRun *app.PlaybookRun, userID, triggerType, actionType string, numBroadcasts int) map[string]interface{} { @@ -638,12 +664,42 @@ func runActionProperties(playbookRun *app.PlaybookRun, userID, triggerType, acti func (t *RudderTelemetry) RunAction(playbookRun *app.PlaybookRun, userID, triggerType, actionType string, numBroadcasts int) { properties := runActionProperties(playbookRun, userID, triggerType, actionType, numBroadcasts) properties["Action"] = actionRunAction - t.track(eventRunAction, properties) + t.Track(eventRunAction, properties) } // UpdateRunActions tracks actions settings update func (t *RudderTelemetry) UpdateRunActions(playbookRun *app.PlaybookRun, userID string) { properties := playbookRunProperties(playbookRun, userID) properties["Action"] = actionRunActionsUpdate - t.track(eventRunAction, properties) + t.Track(eventRunAction, properties) +} + +// FavoriteItem tracks run favoriting of an item. Item can be run or a playbook +func (t *RudderTelemetry) FavoriteItem(item app.CategoryItem, userID string) { + properties := map[string]interface{}{} + properties["UserActualID"] = userID + switch item.Type { + case app.PlaybookItemType: + properties["PlaybookID"] = item.ItemID + properties["Action"] = actionFavoritePlaybook + case app.RunItemType: + properties["PlaybookRunID"] = item.ItemID + properties["Action"] = actionFavoriteRun + } + t.Track(eventSidebarCategory, properties) +} + +// UnfavoriteItem tracks run unfavoriting of an item. Item can be run or a playbook +func (t *RudderTelemetry) UnfavoriteItem(item app.CategoryItem, userID string) { + properties := map[string]interface{}{} + properties["UserActualID"] = userID + switch item.Type { + case app.PlaybookItemType: + properties["PlaybookID"] = item.ItemID + properties["Action"] = actionUnfavoritePlaybook + case app.RunItemType: + properties["PlaybookRunID"] = item.ItemID + properties["Action"] = actionUnfavoriteRun + } + t.Track(eventSidebarCategory, properties) } diff --git a/server/telemetry/rudder_test.go b/server/telemetry/rudder_test.go index a61a8c2c0b..c7c232f124 100644 --- a/server/telemetry/rudder_test.go +++ b/server/telemetry/rudder_test.go @@ -2,7 +2,7 @@ package telemetry import ( "encoding/json" - "io/ioutil" + "io" "net/http" "net/http/httptest" "testing" @@ -53,7 +53,7 @@ func setupRudder(t *testing.T, data chan<- rudderPayload) (*RudderTelemetry, *ht t.Helper() server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - body, err := ioutil.ReadAll(r.Body) + body, err := io.ReadAll(r.Body) require.NoError(t, err) var p rudderPayload @@ -431,7 +431,7 @@ func TestPlaybookProperties(t *testing.T) { "DefaultCommanderID": dummyPlaybook.DefaultOwnerID, "DefaultCommanderEnabled": dummyPlaybook.DefaultOwnerEnabled, "BroadcastChannelIDs": dummyPlaybook.BroadcastChannelIDs, - "BroadcastEnabled": dummyPlaybook.BroadcastEnabled, + "BroadcastEnabled": dummyPlaybook.BroadcastEnabled, //nolint "NumWebhookOnCreationURLs": 2, "WebhookOnCreationEnabled": dummyPlaybook.WebhookOnCreationEnabled, "SignalAnyKeywordsEnabled": dummyPlaybook.SignalAnyKeywordsEnabled, diff --git a/tests-e2e/cypress.config.js b/tests-e2e/cypress.config.js new file mode 100644 index 0000000000..c063756951 --- /dev/null +++ b/tests-e2e/cypress.config.js @@ -0,0 +1,55 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. +const {defineConfig} = require('cypress'); + +const cypressPlugins = require('./cypress/plugins/index'); + +module.exports = defineConfig({ + defaultCommandTimeout: 20000, + taskTimeout: 20000, + video: true, + viewportWidth: 1300, + env: { + adminEmail: 'sysadmin@sample.mattermost.com', + adminUsername: 'sysadmin', + adminPassword: 'Sys@dmin-sample1', + allowedUntrustedInternalConnections: 'localhost', + dbClient: 'postgres', + dbConnection: + 'postgres://mmuser:mostest@localhost/mattermost_test?sslmode=disable&connect_timeout=10', + elasticsearchConnectionUrl: 'http://localhost:9200', + firstTest: false, + keycloakAppName: 'mattermost', + keycloakBaseUrl: 'http://localhost:8484', + keycloakUsername: 'mmuser', + keycloakPassword: 'mostest', + ldapServer: 'localhost', + ldapPort: 389, + minioAccessKey: 'minioaccesskey', + minioSecretKey: 'miniosecretkey', + minioS3Bucket: 'mattermost-test', + minioS3Endpoint: 'localhost:9000', + minioS3SSL: false, + numberOfTrialUsers: 100, + resetBeforeTest: false, + runLDAPSync: false, + secondServerURL: 'http://localhost/s/p', + smtpUrl: 'http://localhost:10080', + storybookUrl: 'http://localhost:6006/', + webhookBaseUrl: 'http://localhost:3000', + developerMode: false, + }, + reporter: 'cypress-multi-reporters', + reporterOptions: { + configFile: 'reporter-config.json', + }, + numTestsKeptInMemory: 5, + e2e: { + setupNodeEvents(on, config) { + return cypressPlugins(on, config); + }, + baseUrl: 'http://localhost:8065', + excludeSpecPattern: '**/node_modules/**/*', + specPattern: '../**/*_spec.js', + }, +}); diff --git a/tests-e2e/cypress.json b/tests-e2e/cypress.json deleted file mode 100644 index 4b988b972f..0000000000 --- a/tests-e2e/cypress.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "baseUrl": "http://localhost:8065", - "defaultCommandTimeout": 20000, - "ignoreTestFiles": "**/node_modules/**/*", - "integrationFolder": "..", - "taskTimeout": 20000, - "testFiles": "**/*_spec.js", - "video": true, - "viewportWidth": 1300, - "env": { - "adminEmail": "sysadmin@sample.mattermost.com", - "adminUsername": "sysadmin", - "adminPassword": "Sys@dmin-sample1", - "allowedUntrustedInternalConnections": "localhost", - "dbClient": "postgres", - "dbConnection": "postgres://mmuser:mostest@localhost/mattermost_test?sslmode=disable\u0026connect_timeout=10", - "elasticsearchConnectionUrl": "http://localhost:9200", - "firstTest": false, - "keycloakAppName": "mattermost", - "keycloakBaseUrl": "http://localhost:8484", - "keycloakUsername": "mmuser", - "keycloakPassword": "mostest", - "ldapServer": "localhost", - "ldapPort": 389, - "minioAccessKey": "minioaccesskey", - "minioSecretKey": "miniosecretkey", - "minioS3Bucket": "mattermost-test", - "minioS3Endpoint": "localhost:9000", - "minioS3SSL": false, - "numberOfTrialUsers": 100, - "resetBeforeTest": false, - "runLDAPSync": false, - "secondServerURL": "http://localhost/s/p", - "smtpUrl": "http://localhost:10080", - "storybookUrl": "http://localhost:6006/", - "webhookBaseUrl": "http://localhost:3000", - "developerMode": false - }, - "reporter": "cypress-multi-reporters", - "reporterOptions": { - "configFile": "reporter-config.json" - }, - "numTestsKeptInMemory": 5 -} diff --git a/tests-e2e/cypress/integration/channels/general_actions_spec.js b/tests-e2e/cypress/integration/channels/general_actions_spec.js index 0ac5bedd99..1a244d9c05 100644 --- a/tests-e2e/cypress/integration/channels/general_actions_spec.js +++ b/tests-e2e/cypress/integration/channels/general_actions_spec.js @@ -52,8 +52,10 @@ describe('channels > general actions', () => { cy.contains('sidebar category').click(); cy.contains('Enter category name').click().type('example category{enter}'); - // # Save action - cy.findByRole('button', {name: /save/i}).click(); + cy.get('#channel-actions-modal').within(() => { + // # Save action + cy.findByRole('button', {name: /save/i}).click(); + }); // # Switch to another user and reload // # This drops them into the same channel @@ -82,8 +84,10 @@ describe('channels > general actions', () => { cy.findByTestId('channel-actions-modal_welcome-msg') .type('test ephemeral welcome message'); - // # Save action - cy.findByRole('button', {name: /save/i}).click(); + cy.get('#channel-actions-modal').within(() => { + // # Save action + cy.findByRole('button', {name: /save/i}).click(); + }); // # Switch to another user and reload // # This drops them into the same channel @@ -131,8 +135,10 @@ describe('channels > general actions', () => { cy.contains('Select a playbook').click(); cy.findByText('Public Playbook').click(); - // # Save action - cy.findByRole('button', {name: /save/i}).click(); + cy.get('#channel-actions-modal').within(() => { + // # Save action + cy.findByRole('button', {name: /save/i}).click(); + }); // # Post the trigger phrase cy.uiPostMessageQuickly('error detected red alert!'); @@ -189,8 +195,10 @@ describe('channels > general actions', () => { cy.contains('Select a playbook').click(); cy.findByText('Public Playbook').click(); - // # Save action - cy.findByRole('button', {name: /save/i}).click(); + cy.get('#channel-actions-modal').within(() => { + // # Save action + cy.findByRole('button', {name: /save/i}).click(); + }); // # Post the trigger phrase cy.uiPostMessageQuickly('error detected red alert!'); @@ -265,8 +273,10 @@ describe('channels > general actions', () => { cy.findByText('Public Playbook').click(); cy.contains('Prompt to run a playbook').click(); - // # Save action - cy.findByRole('button', {name: /save/i}).click(); + cy.get('#channel-actions-modal').within(() => { + // # Save action + cy.findByRole('button', {name: /save/i}).click(); + }); // # Post the trigger phrase cy.uiPostMessageQuickly('error detected red alert!'); @@ -320,8 +330,13 @@ describe('channels > general actions', () => { cy.contains('sidebar category').click(); cy.contains('Enter category name').click().type(categoryName + '{enter}'); - // # Save action - cy.findByRole('button', {name: /save/i}).click(); + cy.get('#channel-actions-modal').within(() => { + // # Save action + cy.findByRole('button', {name: /save/i}).click(); + }); + + // # wait to avoid MM-45969 + cy.wait(5000); // # Switch to the additional channel cy.get('#sidebarItem_' + channel.name).click(); diff --git a/tests-e2e/cypress/integration/channels/retrospective_spec.js b/tests-e2e/cypress/integration/channels/retrospective_spec.js index 2d56522e2e..ab483a3584 100644 --- a/tests-e2e/cypress/integration/channels/retrospective_spec.js +++ b/tests-e2e/cypress/integration/channels/retrospective_spec.js @@ -228,9 +228,11 @@ const publishRetro = () => { // # Publish cy.findByRole('button', {name: 'Publish'}).click(); - // * Verify we're showing the publish retro confirmation modal - cy.get('#confirm-modal-light').contains('Are you sure you want to publish?'); + cy.get('#confirm-modal-light').within(() => { + // * Verify we're showing the publish retro confirmation modal + cy.findByText('Are you sure you want to publish?'); - // # Publish - cy.findByRole('button', {name: 'Publish'}).click(); + // # Publish + cy.findByRole('button', {name: 'Publish'}).click(); + }); }; diff --git a/tests-e2e/cypress/integration/channels/rhs/checklist_spec.js b/tests-e2e/cypress/integration/channels/rhs/checklist_spec.js index 2af529c513..cd1a33feea 100644 --- a/tests-e2e/cypress/integration/channels/rhs/checklist_spec.js +++ b/tests-e2e/cypress/integration/channels/rhs/checklist_spec.js @@ -305,8 +305,8 @@ describe('channels > rhs > checklist', () => { cy.findAllByTestId('checklistHeader').eq(0).within(() => { cy.findByTitle('More').click(); }); - cy.findByRole('button', {name: 'Rename checklist'}).click(); }); + cy.findByTestId('dropdownmenu').findByText('Rename checklist').click(); // # Type the new title and click the confirm button cy.findByTestId('checklist-title-input').type(newTitle); diff --git a/tests-e2e/cypress/integration/channels/rhs/header_spec.js b/tests-e2e/cypress/integration/channels/rhs/header_spec.js index 109361fc11..edd7c14364 100644 --- a/tests-e2e/cypress/integration/channels/rhs/header_spec.js +++ b/tests-e2e/cypress/integration/channels/rhs/header_spec.js @@ -130,12 +130,13 @@ describe('channels > rhs > header', () => { cy.get('#rhsContainer').within(() => { cy.findByTestId('buttons-row').invoke('show').within(() => { cy.findAllByRole('button').eq(1).click(); - cy.findByText('Edit run summary').click({force: true}); }); }); + cy.findByText('Edit run summary').click({force: true}); + // # type text in textarea - cy.get('#rhsContainer').findByTestId('textarea-description').should('be.visible').type('new summary{ctrl+enter}'); + cy.focused().should('be.visible').type('new summary{ctrl+enter}'); // * make sure the updated summary is here cy.get('#rhsContainer').findByTestId('rendered-description').should('be.visible').contains('new summary'); diff --git a/tests-e2e/cypress/integration/channels/rhs/home_spec.js b/tests-e2e/cypress/integration/channels/rhs/home_spec.js index 1b26678fab..12e3f270cc 100644 --- a/tests-e2e/cypress/integration/channels/rhs/home_spec.js +++ b/tests-e2e/cypress/integration/channels/rhs/home_spec.js @@ -95,18 +95,18 @@ describe('channels > rhs > home', () => { it('without pre-populated channel name template', () => { cy.findByText('Team Playbook').closest('[data-testid="rhs-home-item"]').find('[data-testid="run-playbook"]').click(); - cy.get('#interactiveDialogModal').within(() => { + cy.get('#playbooks_run_playbook_dialog').within(() => { // * Verify run name prompt - cy.get('input').eq(1).should('be.empty'); + cy.get('input').eq(0).should('be.empty'); }); }); it('with pre-populated channel name template', () => { cy.findByText('Channel Name Template').closest('[data-testid="rhs-home-item"]').find('[data-testid="run-playbook"]').click(); - cy.get('#interactiveDialogModal').within(() => { + cy.get('#playbooks_run_playbook_dialog').within(() => { // * Verify run name prompt - cy.get('input').eq(1).should('have.value', 'templated name'); + cy.get('input').eq(0).should('have.value', 'templated name'); }); }); }); diff --git a/tests-e2e/cypress/integration/lhs_spec.js b/tests-e2e/cypress/integration/lhs_spec.js new file mode 100644 index 0000000000..15aaf7bf86 --- /dev/null +++ b/tests-e2e/cypress/integration/lhs_spec.js @@ -0,0 +1,308 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +import {stubClipboard} from '../utils'; + +describe('lhs', () => { + let testTeam; + let testUser; + let testPublicPlaybook; + let testPrivatePlaybook; + let playbookRun; + let testViewerUser; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Create another user in the same team + cy.apiCreateUser().then(({user: viewer}) => { + testViewerUser = viewer; + cy.apiAddUserToTeam(testTeam.id, testViewerUser.id); + }); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + }).then((playbook) => { + testPublicPlaybook = playbook; + }); + + // # Create a private playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Private Playbook', + memberIDs: [], + public: false, + }).then((playbook) => { + testPrivatePlaybook = playbook; + }); + }); + }); + + const getRunDropdownItemByText = (groupName, runName, itemName) => { + cy.findByTestId(groupName).findByTestId(runName).findByTestId('menuButton').click(); + return cy.findByTestId('dropdownmenu').findByText(itemName); + }; + + describe('navigate', () => { + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName: 'the run name(' + Date.now() + ')', + ownerUserId: testUser.id, + }).then((run) => { + playbookRun = run; + + // # Visit the playbook run + cy.visit('/playbooks/runs'); + cy.wait(5000); + }); + }); + + it('click run', () => { + // # Intercept all calls to telemetry + cy.intercept('/plugins/playbooks/api/v0/telemetry').as('telemetry'); + + // # Click on run at LHS + cy.findByTestId('Runs').findByTestId(playbookRun.name).click(); + + // * assert telemetry pageview + cy.wait('@telemetry').then((interception) => { + expect(interception.request.body.name).to.eq('run_details'); + expect(interception.request.body.type).to.eq('page'); + expect(interception.request.body.properties.from).to.eq('playbooks_lhs'); + expect(interception.request.body.properties.role).to.eq('participant'); + expect(interception.request.body.properties.playbookrun_id).to.eq(playbookRun.id); + expect(interception.request.body.properties.playbook_id).to.eq(testPublicPlaybook.id); + }); + }); + }); + + describe('run dot menu', () => { + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName: 'the run name(' + Date.now() + ')', + ownerUserId: testUser.id, + }).then((run) => { + playbookRun = run; + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + + // # LHS render takes a few seconds, wait for it + cy.wait(5000); + }); + }); + + it('shows on click', () => { + // # Click dot menu + cy.findByTestId('Runs').findByTestId(playbookRun.name).findByTestId('menuButton').click(); + + // * Assert context menu is opened + cy.findByTestId('dropdownmenu').should('be.visible'); + }); + + it('can copy link', () => { + stubClipboard().as('clipboard'); + + // # Click on Copy link menu item + getRunDropdownItemByText('Runs', playbookRun.name, 'Copy link').click().then(() => { + // * Verify clipboard content + cy.get('@clipboard').its('contents').should('contain', `/playbooks/runs/${playbookRun.id}`); + }); + }); + + it('can favorite / unfavorite', () => { + // # Click on favorite menu item + getRunDropdownItemByText('Runs', playbookRun.name, 'Favorite').click().then(() => { + // * Verify the run is added to favorites + cy.findByTestId('Favorite').findByTestId(playbookRun.name).should('exist'); + + // # Click on unfavorite menu item + getRunDropdownItemByText('Favorite', playbookRun.name, 'Unfavorite').click().then(() => { + // * Verify the run is removed from favorites + cy.findByTestId('Runs').findByTestId(playbookRun.name).should('exist'); + }); + }); + }); + + it('leave run', () => { + // # Add viewer user to the channel + cy.apiAddUserToChannel(playbookRun.channel_id, testViewerUser.id); + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + cy.wait(3000); + + // # Click on leave menu item + getRunDropdownItemByText('Runs', playbookRun.name, 'Leave and unfollow run').click(); + cy.wait(200); + + // * Verify that owner can't leave. + cy.get('#confirmModal').should('not.exist'); + + // # Change the owner to testViewerUser + cy.findByTestId('runinfo-owner').findByTestId('assignee-profile-selector').click(); + cy.get('.playbook-run-user-select').findByText('@' + testViewerUser.username).click(); + cy.wait(500); + + // # Click on leave menu item + getRunDropdownItemByText('Runs', playbookRun.name, 'Leave and unfollow run').click(); + + // * Verify that confirm leave modal is visible. + cy.get('#confirmModal').should('exist'); + }); + }); + + describe('leave run - no permanent access', () => { + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPrivatePlaybook.id, + playbookRunName: 'the run name(' + Date.now() + ')', + ownerUserId: testUser.id, + }).then((run) => { + playbookRun = run; + + // # Add viewer user to the channel + cy.apiAddUserToChannel(playbookRun.channel_id, testViewerUser.id); + + cy.apiLogin(testViewerUser).then(() => { + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + + // # LHS render takes a few seconds, wait for it + cy.wait(5000); + }); + }); + }); + + it('leave run, when on rdp of the same run', () => { + // # Click on leave menu item + getRunDropdownItemByText('Runs', playbookRun.name, 'Leave and unfollow run').click(); + cy.wait(200); + + // # confirm modal + cy.get('#confirmModal').get('#confirmModalButton').click(); + + // * Verify that user was redirected to the run list page + cy.url().should('include', 'playbooks/runs?sort='); + }); + + it('leave run, when not on rdp of the same run', () => { + // # Visit playbooks list page + cy.visit('/playbooks/playbooks'); + + // # Click on leave menu item + getRunDropdownItemByText('Runs', playbookRun.name, 'Leave and unfollow run').click(); + cy.wait(200); + + // # confirm modal + cy.get('#confirmModal').get('#confirmModalButton').click(); + cy.wait(500); + + // * Verify that user was not redirected to the run list page + cy.url().should('not.include', 'playbooks/runs?sort='); + }); + }); + + describe('playbook dot menu', () => { + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'the run name(' + Date.now() + ')', + memberIDs: [], + }).then((playbook) => { + testPublicPlaybook = playbook; + + // # Visit the playbooks page + cy.visit('/playbooks/playbooks'); + + // # LHS render takes a few seconds, wait for it + cy.wait(5000); + }); + }); + + it('shows on click', () => { + // # Click dot menu + cy.findByTestId('Playbooks').findByTestId(testPublicPlaybook.title).findByTestId('menuButton').click(); + + // * Assert context menu is opened + cy.findByTestId('dropdownmenu').should('be.visible'); + }); + + it('can copy link', () => { + stubClipboard().as('clipboard'); + + // # Click on Copy link menu item + getRunDropdownItemByText('Playbooks', testPublicPlaybook.title, 'Copy link').click().then(() => { + // * Verify clipboard content + cy.get('@clipboard').its('contents').should('contain', `/playbooks/playbooks/${testPublicPlaybook.id}`); + }); + }); + + it('can favorite / unfavorite', () => { + // # Click on favorite menu item + getRunDropdownItemByText('Playbooks', testPublicPlaybook.title, 'Favorite').click().then(() => { + // * Verify the playbook is added to favorites + cy.findByTestId('Favorite').findByTestId(testPublicPlaybook.title).should('exist'); + + // # Click on unfavorite menu item + getRunDropdownItemByText('Favorite', testPublicPlaybook.title, 'Unfavorite').click().then(() => { + // * Verify the playbook is removed from favorites + cy.findByTestId('Playbooks').findByTestId(testPublicPlaybook.title).should('exist'); + }); + }); + }); + + it('can leave', () => { + stubClipboard().as('clipboard'); + + // # Click on Leave menu item + getRunDropdownItemByText('Playbooks', testPublicPlaybook.title, 'Leave').click().then(() => { + // * Verify the playbook is removed from the list + cy.findByTestId('Playbooks').findByTestId(testPublicPlaybook.title).should('not.exist'); + }); + }); + }); +}); diff --git a/tests-e2e/cypress/integration/main_app_spec.js b/tests-e2e/cypress/integration/main_app_spec.js deleted file mode 100644 index 3a29388e77..0000000000 --- a/tests-e2e/cypress/integration/main_app_spec.js +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -// *************************************************************** -// - [#] indicates a test step (e.g. # Go to a page) -// - [*] indicates an assertion (e.g. * Check the title) -// *************************************************************** - -describe('webapp components', () => { - let testUser; - let testTeam; - - before(() => { - cy.apiInitSetup().then(({team, user}) => { - testUser = user; - testTeam = team; - - // # Login as user-1 - cy.apiLogin(testUser); - }); - }); - - beforeEach(() => { - // # Login as testUser - cy.apiLogin(testUser); - - // # Navigate to the application - cy.visit(`/${testTeam.name}/`); - }); - - it('root-portal exists', () => { - // * Verify that #root-portal exists in main markup - cy.get('#root-portal').should('exist'); - }); -}); \ No newline at end of file diff --git a/tests-e2e/cypress/integration/playbooks/access_spec.js b/tests-e2e/cypress/integration/playbooks/access_spec.js new file mode 100644 index 0000000000..79fdd0c3a7 --- /dev/null +++ b/tests-e2e/cypress/integration/playbooks/access_spec.js @@ -0,0 +1,111 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +describe('playbooks > edit', () => { + let testTeam; + let testUser; + let testUser2; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Create a second test user in this team + cy.apiCreateUser().then((payload) => { + testUser2 = payload.user; + cy.apiAddUserToTeam(testTeam.id, payload.user.id); + }); + + // # Login as testUser + cy.apiLogin(testUser); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + }); + + describe('rdp information refresh', () => { + let testPlaybook; + + beforeEach(() => { + // # Create a playbook + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: 'Playbook (' + Date.now() + ')', + userId: testUser.id, + public: true, + }).then((playbook) => { + testPlaybook = playbook; + + // Navigate to the playbook page + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + }); + }); + + it('add / remove a member', () => { + // # Open playbook access modal + cy.findByTestId('playbook-members').click(); + + // # Add a new member + cy.findByTestId('add-people-input').type(testUser2.username); + cy.wait(500); + cy.findByTestId('profile-option-' + testUser2.username).click({force: true}); + + // * Verify that user was added + cy.findByTestId('members-list').findByText(testUser2.username).should('exist'); + + // # Close playbook access modal + cy.get('.close > [aria-hidden="true"]').click(); + + // * Verify members number + cy.findByTestId('playbook-members').findByText('2').should('exist'); + + // # Open playbook access modal + cy.findByTestId('playbook-members').click(); + + // # Open dropdown and remove user + cy.findByText('Playbook Member').click(); + cy.findByTestId('dropdownmenu').findByText('Remove').click(); + + // * Verify that user was removed + cy.findByTestId('members-list').findByText(testUser2.username).should('not.exist'); + + // # Close playbook access modal + cy.get('.close > [aria-hidden="true"]').click(); + + // * Verify members number + cy.findByTestId('playbook-members').findByText('1').should('exist'); + }); + + it('change to private', () => { + // # Open playbook access modal + cy.findByTestId('playbook-members').click(); + + // # Click on convert to private + cy.findByText('Convert to private playbook').click(); + + // * Check that confirm modal is open + cy.get('#confirmModal').should('be.visible'); + + // # Confirm convert to private + cy.get('#confirmModal').get('#confirmModalButton').click(); + + // * Verify that playbook is private + cy.findByText('Convert to private playbook').should('not.exist'); + + // # Close playbook access modal + cy.get('.close > [aria-hidden="true"]').click(); + + // * Verify lock icon is visible + cy.findByTestId('playbook-editor-header').get('.icon-lock-outline').should('be.visible'); + }); + }); +}); diff --git a/tests-e2e/cypress/integration/playbooks/creation_button_spec_ignore_.js b/tests-e2e/cypress/integration/playbooks/creation_button_spec.js similarity index 63% rename from tests-e2e/cypress/integration/playbooks/creation_button_spec_ignore_.js rename to tests-e2e/cypress/integration/playbooks/creation_button_spec.js index 73833afcc6..fd19749641 100644 --- a/tests-e2e/cypress/integration/playbooks/creation_button_spec_ignore_.js +++ b/tests-e2e/cypress/integration/playbooks/creation_button_spec.js @@ -47,8 +47,7 @@ describe('playbooks > creation button', () => { }); it('opens playbook creation page with New Playbook button', () => { - const url = 'playbooks/new'; - const playbookName = 'Untitled playbook'; + const playbookName = 'Untitled Playbook'; // # Open the product cy.visit('/playbooks'); @@ -60,8 +59,11 @@ describe('playbooks > creation button', () => { cy.findByTestId('titlePlaybook').findByText('Create playbook').click(); cy.get('#playbooks_create').findByText('Create playbook').click(); - // * Verify a new playbook creation page opened - verifyPlaybookCreationPageOpened(url, playbookName); + // * Verify playbook outline page opened + verifyPlaybookOutlineOpened(playbookName); + + // * Verify playbook was added to the LHS + cy.findByTestId('lhs-navigation').findByText(playbookName).should('exist'); }); it('auto creates a playbook with "Blank" template option', () => { @@ -74,39 +76,43 @@ describe('playbooks > creation button', () => { // # Click 'Blank' cy.findByText('Blank').click(); - // * Verify playbook preview opened - verifyPreviewOpened(); + const playbookName = `@${testUser.username}'s Blank`; + + // * Verify playbook outline opened + verifyPlaybookOutlineOpened(playbookName); + + // * Verify playbook was added to the LHS + cy.findByTestId('lhs-navigation').findByText(playbookName).should('exist'); }); - it('opens Service Outage Incident page from its template option', () => { - // # Open the product - cy.visit('/playbooks'); + it('opens Service Outage Incident page from its template option (multiple teams)', () => { + cy.apiCreateTeam('second-team', 'Second Team').then(() => { + // # Open the product + cy.visit('/playbooks'); - // # Switch to playbooks - cy.findByTestId('playbooksLHSButton').click(); + // # Switch to playbooks + cy.findByTestId('playbooksLHSButton').click(); - // # Click 'Incident Resolution' - cy.findByText('Incident Resolution').click(); + // # Click 'Incident Resolution' + cy.findByText('Incident Resolution').click(); - // * Verify playbook preview opened - verifyPreviewOpened(); + const playbookName = `@${testUser.username}'s Incident Resolution`; + + // * Verify playbook outline opened + verifyPlaybookOutlineOpened(playbookName); + + // * Verify the playbook was added to the lhs of current team + cy.findByTestId('lhs-navigation').findByText(playbookName).should('exist'); + }); }); }); -function verifyPlaybookCreationPageOpened(url, playbookName) { +function verifyPlaybookOutlineOpened(playbookName) { // * Verify the page url contains 'playbooks/playbooks/new' - cy.url().should('include', url); + cy.url().should('contain', '/outline'); // * Verify the playbook name matches the one provided - cy.findByTestId('backstage-nav-bar').within(() => { + cy.findByTestId('playbook-editor-title').within(() => { cy.findByText(playbookName).should('be.visible'); }); - - // * Verify there is 'Save' button - cy.findByTestId('save_playbook').should('be.visible'); -} - -function verifyPreviewOpened() { - // * Verify the page url contains 'preview' - cy.url().should('include', 'preview'); } diff --git a/tests-e2e/cypress/integration/playbooks/edit_metrics_spec_ignore_.js b/tests-e2e/cypress/integration/playbooks/edit_metrics_spec.js similarity index 86% rename from tests-e2e/cypress/integration/playbooks/edit_metrics_spec_ignore_.js rename to tests-e2e/cypress/integration/playbooks/edit_metrics_spec.js index 5b05c05c9e..6eda1e86d8 100644 --- a/tests-e2e/cypress/integration/playbooks/edit_metrics_spec_ignore_.js +++ b/tests-e2e/cypress/integration/playbooks/edit_metrics_spec.js @@ -50,10 +50,11 @@ describe('playbooks > edit_metrics', () => { describe('adding and editing metrics', () => { it('can add 4, but not 5 metrics; can save and re-edit with metrics saved', () => { // # Visit the selected playbook - cy.visit(`/playbooks/playbooks/${testPlaybook.id}/edit`); + cy.visit(`/playbooks/playbooks/${testPlaybook.id}`); - // # Switch to Retrospective tab - cy.get('#root').findByText('Retrospective').click(); + // # Switch to Outline tab and focus retro section + cy.findByText('Outline').click(); + cy.get('#retrospective').scrollIntoView(); // # Add and verify metric addMetric('Duration', 'test duration', '0:0:1', 'test description'); @@ -77,14 +78,8 @@ describe('playbooks > edit_metrics', () => { // * Verify we have four valid metrics and are editing none. verifyViewsAndEdits(4, 0); - // # Save -- for the next batch of tests - cy.findByTestId('save_playbook').click(); - - // # Go back to editing - cy.visit(`/playbooks/playbooks/${testPlaybook.id}/edit`); - - // # Switch to Retrospective tab - cy.get('#root').findByText('Retrospective').click(); + // Refresh the page + cy.reload(); // * Verify we saved the metrics verifyViewMetric(0, 'test duration', '1 minute per run', 'test description'); @@ -95,28 +90,19 @@ describe('playbooks > edit_metrics', () => { // # Edit all 4 metrics and repeat the test cy.findAllByTestId('edit-metric').eq(0).click(); cy.get('input[type=text]').eq(2).clear().type('12:8:97'); - cy.findByRole('button', {name: 'Add'}).click(); + saveMetric(); cy.findAllByTestId('edit-metric').eq(1).click(); cy.get('textarea').eq(0).clear().type('a new description'); - cy.findByRole('button', {name: 'Add'}).click(); + saveMetric(); cy.findAllByTestId('edit-metric').eq(2).click(); cy.get('input[type=text]').eq(2).clear().type('7777777'); - cy.findByRole('button', {name: 'Add'}).click(); + saveMetric(); cy.findAllByTestId('edit-metric').eq(3).click(); cy.get('input[type=text]').eq(1).clear().type('test duration 2!!!'); - cy.findByRole('button', {name: 'Add'}).click(); - - // # Save - cy.findByTestId('save_playbook').click(); - - // * Verify we're back in the main page - cy.get('#playbooks-playbookPreview-checklists').should('exist'); - - // # Go back to editing - cy.visit(`/playbooks/playbooks/${testPlaybook.id}/edit`); + saveMetric(); - // # Switch to Retrospective tab - cy.get('#root').findByText('Retrospective').click(); + // # Refresh the page + cy.reload(); // * Verify we saved the metrics verifyViewMetric(0, 'test duration', '12 days, 9 hours, 37 minutes per run', 'test description'); @@ -132,31 +118,31 @@ describe('playbooks > edit_metrics', () => { // * Metrics need a title cy.get('input[type=text]').eq(1).clear(); - cy.findByRole('button', {name: 'Add'}).click(); + saveMetric(); cy.getStyledComponent('ErrorText').contains('Please add a title for your metric.'); // * Metrics need a unique title cy.get('input[type=text]').eq(1).type('test dollars'); - cy.findByRole('button', {name: 'Add'}).click(); + saveMetric(); cy.getStyledComponent('ErrorText') .contains('A metric with the same name already exists. Please add a unique name for each metric.'); // * A duration target needs to be in the correct format (no letters) cy.get('input[type=text]').eq(1).clear().wait(100).type('test duration again'); cy.get('input[type=text]').eq(2).clear().type('a'); - cy.findByRole('button', {name: 'Add'}).click(); + saveMetric(); cy.getStyledComponent('ErrorText') .contains('Please enter a duration in the format: dd:hh:mm (e.g., 12:00:00), or leave the target blank.'); // * A duration target needs to be in the correct format (mm:dd:ss) cy.get('input[type=text]').eq(2).clear().type('0:123:0'); - cy.findByRole('button', {name: 'Add'}).click(); + saveMetric(); cy.getStyledComponent('ErrorText') .contains('Please enter a duration in the format: dd:hh:mm (e.g., 12:00:00), or leave the target blank.'); // # A duration can have 1 or 2 numbers in each position cy.get('input[type=text]').eq(2).clear().type('2:12:1'); - cy.findByRole('button', {name: 'Add'}).click(); + saveMetric(); verifyViewMetric(0, 'test duration', '2 days, 12 hours, 1 minute per run', 'test description'); // * Verify we have four valid metrics and are editing none. @@ -200,10 +186,11 @@ describe('playbooks > edit_metrics', () => { describe('adding and editing metrics (new playbook)', () => { it('verifies when clicking "Add Metric", for Currency type, and switches to new edit', () => { // # Visit the selected playbook - cy.visit(`/playbooks/playbooks/${testPlaybook.id}/edit`); + cy.visit(`/playbooks/playbooks/${testPlaybook.id}`); - // # Switch to Retrospective tab - cy.get('#root').findByText('Retrospective').click(); + // # Switch to Outline tab and focus retro section + cy.findByText('Outline').click(); + cy.get('#retrospective').scrollIntoView(); // # Add and verify 1st metric addMetric('Integer', 'test integer!', '12314123', 'test description'); @@ -253,6 +240,10 @@ describe('playbooks > edit_metrics', () => { cy.findByText('Integer').click(); }); + // Delay for the save/re-render triggered by line 240 + // to finish before attempting to verifyViewMetric + cy.wait(500); + // * Verify metric was added without target or description. verifyViewMetric(1, 'test currency!', '', ''); @@ -295,7 +286,7 @@ describe('playbooks > edit_metrics', () => { cy.getStyledComponent('ViewContainer').should('have.length', 2); // # Stop editing - cy.findByRole('button', {name: 'Add'}).click(); + saveMetric(); // * Verify metric was added without target or description. verifyViewMetric(2, 'test integer #2!!', '', ''); @@ -308,10 +299,11 @@ describe('playbooks > edit_metrics', () => { describe('delete metric', () => { it('verifies when clicking delete button; saved metrics have different confirmation text; deleted metrics are deleted', () => { // # Visit the selected playbook - cy.visit(`/playbooks/playbooks/${testPlaybook.id}/edit`); + cy.visit(`/playbooks/playbooks/${testPlaybook.id}`); - // # Switch to Retrospective tab - cy.get('#root').findByText('Retrospective').click(); + // # Switch to Outline tab and focus retro section + cy.findByText('Outline').click(); + cy.get('#retrospective').scrollIntoView(); // # Add and verify 1st metric addMetric('Integer', 'test integer!', '12314123', 'test description'); @@ -352,6 +344,10 @@ describe('playbooks > edit_metrics', () => { cy.findAllByTestId('delete-metric').eq(1).click(); cy.get('#confirm-modal-light').should('be.visible').contains('Are you sure you want to delete?'); + // # Should see the confirmation /without/ extra text because we haven't saved this metric yet + cy.get('#confirm-modal-light') + .should('not.contain.text', 'You will still be able to access historical data for this metric.'); + // # Dismiss cy.findByRole('button', {name: 'Cancel'}).click(); @@ -359,11 +355,8 @@ describe('playbooks > edit_metrics', () => { cy.get('input[type=text]').eq(2).clear(); cy.findAllByTestId('delete-metric').eq(0).click(); - // # Should see the confirmation /without/ extra text because we haven't saved this metric yet cy.get('#confirm-modal-light') .should('contain.text', 'If you delete this metric, the values for it will not be collected for any future runs.'); - cy.get('#confirm-modal-light') - .should('not.contain.text', 'You will still be able to access historical data for this metric.'); // # Delete first metric cy.findByRole('button', {name: 'Delete metric'}).click(); @@ -380,7 +373,7 @@ describe('playbooks > edit_metrics', () => { cy.findByRole('button', {name: 'Delete metric'}).click(); cy.findAllByTestId('edit-metric').eq(0).click(); cy.get('input[type=text]').eq(1).clear().type('test currency 2!'); - cy.findByRole('button', {name: 'Add'}).click(); + saveMetric(); verifyViewsAndEdits(1, 0); verifyViewMetric(0, 'test currency 2!', '', ''); @@ -393,7 +386,7 @@ describe('playbooks > edit_metrics', () => { cy.findByRole('button', {name: 'Delete metric'}).click(); cy.findAllByTestId('edit-metric').eq(0).click(); cy.get('input[type=text]').eq(1).clear().type('test currency 3!'); - cy.findByRole('button', {name: 'Add'}).click(); + saveMetric(); verifyViewsAndEdits(1, 0); verifyViewMetric(0, 'test currency 3!', '', ''); @@ -413,17 +406,15 @@ describe('playbooks > edit_metrics', () => { verifyViewsAndEdits(1, 0); verifyViewMetric(0, 'test currency 3!', '', ''); - // # Save and verify one is saved - cy.findByTestId('save_playbook').click(); - cy.visit(`/playbooks/playbooks/${testPlaybook.id}/edit`); - cy.get('#root').findByText('Retrospective').click(); + // # Refresh and verify one is saved + cy.reload(); verifyViewsAndEdits(1, 0); verifyViewMetric(0, 'test currency 3!', '', ''); // # Delete metric cy.findAllByTestId('delete-metric').eq(0).click(); - // # Should see the confirmation /with/ extra text because we haven't saved this metric yet + // # Should see the confirmation /with/ extra text cy.get('#confirm-modal-light') .should('contain.text', 'If you delete this metric, the values for it will not be collected for any future runs. You will still be able to access historical data for this metric.'); @@ -433,10 +424,8 @@ describe('playbooks > edit_metrics', () => { // * Verify verifyViewsAndEdits(0, 0); - // # Save and verify deleted - cy.findByTestId('save_playbook').click(); - cy.visit(`/playbooks/playbooks/${testPlaybook.id}/edit`); - cy.get('#root').findByText('Retrospective').click(); + // # Refresh and verify deleted + cy.reload(); verifyViewsAndEdits(0, 0); }); }); @@ -444,10 +433,11 @@ describe('playbooks > edit_metrics', () => { describe('nullable and 0-able targets', () => { it('can add 0 targets and no (null) targets', () => { // # Visit the selected playbook - cy.visit(`/playbooks/playbooks/${testPlaybook.id}/edit`); + cy.visit(`/playbooks/playbooks/${testPlaybook.id}`); - // # Switch to Retrospective tab - cy.get('#root').findByText('Retrospective').click(); + // # Switch to Outline tab and focus retro section + cy.findByText('Outline').click(); + cy.get('#retrospective').scrollIntoView(); // # Add and verify duration addMetric('Duration', 'test duration', '0:0:0', 'test description'); @@ -457,13 +447,13 @@ describe('playbooks > edit_metrics', () => { cy.findAllByTestId('edit-metric').eq(0).click(); cy.get('input[type=text]').eq(2).should('have.value', '00:00:00') .clear(); - cy.findByRole('button', {name: 'Add'}).click(); + saveMetric(); verifyViewMetric(0, 'test duration', '', 'test description'); // * Verify it has null value when editing again. cy.findAllByTestId('edit-metric').eq(0).click(); cy.get('input[type=text]').eq(2).should('have.value', ''); - cy.findByRole('button', {name: 'Add'}).click(); + saveMetric(); // # Add and verify currency addMetric('Dollars', 'test money', '0', 'test description 2'); @@ -473,13 +463,13 @@ describe('playbooks > edit_metrics', () => { cy.findAllByTestId('edit-metric').eq(1).click(); cy.get('input[type=text]').eq(2).should('have.value', '0') .clear(); - cy.findByRole('button', {name: 'Add'}).click(); + saveMetric(); verifyViewMetric(1, 'test money', '', 'test description 2'); // * Verify it has null value when editing again. cy.findAllByTestId('edit-metric').eq(1).click(); cy.get('input[type=text]').eq(2).should('have.value', ''); - cy.findByRole('button', {name: 'Add'}).click(); + saveMetric(); // # Add and verify Integer addMetric('Integer', 'test number', '0', 'test description 3'); @@ -489,25 +479,19 @@ describe('playbooks > edit_metrics', () => { cy.findAllByTestId('edit-metric').eq(2).click(); cy.get('input[type=text]').eq(2).should('have.value', '0') .clear(); - cy.findByRole('button', {name: 'Add'}).click(); + saveMetric(); verifyViewMetric(2, 'test number', '', 'test description 3'); // * Verify it has null value when editing again. cy.findAllByTestId('edit-metric').eq(2).click(); cy.get('input[type=text]').eq(2).should('have.value', ''); - cy.findByRole('button', {name: 'Add'}).click(); + saveMetric(); // * Verify we have three valid metrics and are editing none. verifyViewsAndEdits(3, 0); - // # Save -- for the next batch of tests - cy.findByTestId('save_playbook').click(); - - // # Go back to editing - cy.visit(`/playbooks/playbooks/${testPlaybook.id}/edit`); - - // # Switch to Retrospective tab - cy.get('#root').findByText('Retrospective').click(); + // # Refresh + cy.reload(); // * Verify we saved the metrics verifyViewMetric(0, 'test duration', '', 'test description'); @@ -533,7 +517,7 @@ const addMetric = (type, title, target, description) => { .tab().type(description); // # Add the metric - cy.findByRole('button', {name: 'Add'}).click(); + saveMetric(); }; const verifyViewMetric = (index, title, target, description) => { @@ -552,6 +536,22 @@ const verifyViewMetric = (index, title, target, description) => { }; const verifyViewsAndEdits = (numViews, numEdits) => { - cy.getStyledComponent('ViewContainer').should('have.length', numViews); - cy.getStyledComponent('EditContainer').should('have.length', numEdits); + if (numViews === 0) { + cy.getStyledComponent('ViewContainer').should('not.exist'); + } else { + cy.getStyledComponent('ViewContainer').should('have.length', numViews); + } + + if (numEdits === 0) { + cy.getStyledComponent('EditContainer').should('not.exist'); + } else { + cy.getStyledComponent('EditContainer').should('have.length', numEdits); + } }; + +function saveMetric() { + cy.get('#retrospective-metrics').within(() => { + cy.findByRole('button', {name: 'Save'}).click(); + cy.wait(500); + }); +} diff --git a/tests-e2e/cypress/integration/playbooks/edit_spec.js b/tests-e2e/cypress/integration/playbooks/edit_spec.js index dc70b36720..bc89625dc0 100644 --- a/tests-e2e/cypress/integration/playbooks/edit_spec.js +++ b/tests-e2e/cypress/integration/playbooks/edit_spec.js @@ -824,8 +824,15 @@ describe('playbooks > edit', () => { }); cy.findByText(/off-topic/i).click(); - cy.get('#status-updates').within(() => { - cy.get('input[type=checkbox]').click({force: true}); + // # Close the channel selector + cy.findByText(/search for a channel/i).type('{esc}'); + + cy.get('#status-updates').trigger('mouseenter').within(() => { + // # Click on the toggle to disable the setting + cy.get('label').click(); + + // * Verify that the toggle off + cy.get('label input').should('not.be.checked'); }); // * Verify disabled status updates text @@ -834,8 +841,8 @@ describe('playbooks > edit', () => { // # Turn the status update toggle back on // * Verify there's still 1 channel selected - cy.get('#status-updates').within(() => { - cy.get('input[type=checkbox]').click({force: true}); + cy.get('#status-updates').trigger('mouseenter').within(() => { + cy.get('label').click(); cy.findByText('1 channel').should('be.visible'); }); }); @@ -1228,7 +1235,7 @@ describe('playbooks > edit', () => { cy.findByText('Rename').click(); // # Change the name and save - cy.focused().type('{selectAll}{del}renamed playbook'); + cy.findByTestId('rendered-editable-text').type('{selectAll}{del}renamed playbook'); cy.findByRole('button', {name: /save/i}).click(); cy.reload(); diff --git a/tests-e2e/cypress/integration/playbooks/list_spec.js b/tests-e2e/cypress/integration/playbooks/list_spec.js index 3e48431b2f..25abde152b 100644 --- a/tests-e2e/cypress/integration/playbooks/list_spec.js +++ b/tests-e2e/cypress/integration/playbooks/list_spec.js @@ -7,6 +7,7 @@ // *************************************************************** describe('playbooks > list', () => { + const playbookTitle = 'The Playbook Name'; let testTeam; let testUser; @@ -21,7 +22,7 @@ describe('playbooks > list', () => { // # Create a public playbook cy.apiCreatePlaybook({ teamId: testTeam.id, - title: 'Playbook', + title: playbookTitle, memberIDs: [], }); @@ -50,6 +51,29 @@ describe('playbooks > list', () => { cy.findByTestId('titlePlaybook').should('exist').contains('Playbooks'); }); + it('join/leave playbook', () => { + // # Open the product + cy.visit('/playbooks'); + + // # Switch to Playbooks + cy.findByTestId('playbooksLHSButton').click(); + + // # Click on the dot menu + cy.findByTestId('menuButtonActions').click(); + + // # Click on leave + cy.findByText('Leave').click(); + + // * Verify it has disappeared from the LHS + cy.findByTestId('lhs-navigation').findByText(playbookTitle).should('not.exist'); + + // # Join a playbook + cy.findByTestId('join-playbook').click(); + + // * Verify it has appeared in LHS + cy.findByTestId('lhs-navigation').findByText(playbookTitle).should('exist'); + }); + it('can duplicate playbook', () => { // # Open the product cy.visit('/playbooks'); @@ -58,13 +82,13 @@ describe('playbooks > list', () => { cy.findByTestId('playbooksLHSButton').click(); // # Click on the dot menu - cy.get('.icon-dots-horizontal').click(); + cy.findByTestId('menuButtonActions').click(); // # Click on duplicate cy.findByText('Duplicate').click(); // * Verify that playbook got duplicated - cy.findByText('Copy of Playbook').should('exist'); + cy.findByText('Copy of ' + playbookTitle).should('exist'); }); context('archived playbooks', () => { diff --git a/tests-e2e/cypress/integration/playbooks/overview_spec_ignore_.js b/tests-e2e/cypress/integration/playbooks/overview_spec.js similarity index 72% rename from tests-e2e/cypress/integration/playbooks/overview_spec_ignore_.js rename to tests-e2e/cypress/integration/playbooks/overview_spec.js index 4d5bd49f62..b739d9d55b 100644 --- a/tests-e2e/cypress/integration/playbooks/overview_spec_ignore_.js +++ b/tests-e2e/cypress/integration/playbooks/overview_spec.js @@ -11,12 +11,7 @@ describe('playbooks > overview', () => { let testTeam; let testOtherTeam; let testUser; - let testUserFollower; let testPublicPlaybook; - // eslint-disable-next-line no-unused-vars - let testPrivateOnlyMinePlaybook; - // eslint-disable-next-line no-unused-vars - let testPrivateSharedPlaybook; let testPlaybookOnTeamForSwitching; let testPlaybookOnOtherTeamForSwitching; @@ -32,7 +27,6 @@ describe('playbooks > overview', () => { // # Create a dedicated run follower cy.apiCreateUser().then(({user: createdUser}) => { - testUserFollower = createdUser; cy.apiAddUserToTeam(testTeam.id, createdUser.id); cy.apiAddUserToTeam(testOtherTeam.id, createdUser.id); }); @@ -58,8 +52,6 @@ describe('playbooks > overview', () => { teamId: testTeam.id, title: 'Private Only Mine Playbook', memberIDs: [testUser.id], - }).then((playbook) => { - testPrivateOnlyMinePlaybook = playbook; }); // # Create a private playbook with multiple users @@ -67,8 +59,6 @@ describe('playbooks > overview', () => { teamId: testTeam.id, title: 'Private Shared Playbook', memberIDs: [testUser.id, anotherUser.id], - }).then((playbook) => { - testPrivateSharedPlaybook = playbook; }); // # Create a public playbook @@ -129,7 +119,7 @@ describe('playbooks > overview', () => { cy.findByTestId('run-playbook').click({force: true}); // * Verify the playbook run creation dialog has opened - cy.get('#interactiveDialogModal').should('exist').within(() => { + cy.get('#playbooks_run_playbook_dialog').should('exist').within(() => { cy.findByText('Start run').should('exist'); }); }; @@ -158,7 +148,7 @@ describe('playbooks > overview', () => { cy.findByTestId('run-playbook').click({force: true}); // * Verify the playbook run creation dialog has opened - cy.get('#interactiveDialogModal').should('exist').within(() => { + cy.get('#playbooks_run_playbook_dialog').should('exist').within(() => { cy.findByText('Start run').should('exist'); }); }); @@ -172,7 +162,7 @@ describe('playbooks > overview', () => { cy.get('.icon-link-variant').trigger('mouseover', {force: true}); // * Verify tooltip text - cy.get('#copy-playbook-link-tooltip').should('contain', 'Copy link to playbook'); + cy.get('#copy-playbook-link-tooltip').should('contain', 'Copy link to'); stubClipboard().as('clipboard'); @@ -191,13 +181,13 @@ describe('playbooks > overview', () => { cy.visit(`/playbooks/playbooks/${testPublicPlaybook.id}`); // # Click on playbook title - cy.get('.icon-chevron-down').click(); + cy.findByTestId('playbook-editor-title').click(); // # Click on duplicate cy.findByText('Duplicate').click(); // * Verify that playbook got duplicated - cy.findByText(`Copy of ${testPublicPlaybook.title}`).should('exist'); + cy.findByTestId('playbook-editor-title').should('contain', `Copy of ${testPublicPlaybook.title}`); }); it('shows checklists', () => { @@ -220,85 +210,24 @@ describe('playbooks > overview', () => { cy.visit(`/playbooks/playbooks/${playbook.id}`); }); - cy.findByTestId('preview-content').within(() => { - // * Verify checklist and associated steps - cy.findByText('Checklists').next().within(() => { - cy.findByText('Stage 1').should('exist'); - cy.findByText('Step 1').should('exist'); - cy.findByText('Step 2').should('exist'); - }); - }); - }); - - it('shows followers in actions preview', () => { - // eslint-disable-next-line no-unused-vars - let playbookId; - cy.apiCreatePlaybook({ - teamId: testTeam.id, - title: 'Playbook', - description: 'Cypress Playbook', - memberIDs: [testUser.id], - checklists: [ - { - title: 'Stage 1', - items: [ - {title: 'Step 1'}, - {title: 'Step 2'}, - ], - }, - ], - retrospectiveTemplate: 'Cypress test template' - }).then((playbook) => { - playbookId = playbook.id; - cy.visit(`/playbooks/playbooks/${playbook.id}`); - - // * Verify we don't have any follower - cy.findByTestId('preview-content').within(() => { - cy.findByText('Begin following for').should('not.exist'); - }); - - // * set myself as follower and check message in preview - cy.findByTestId('auto-follow-runs').click({force: true}); - cy.findByTestId('preview-content').within(() => { - cy.findByText('Begin following for one user').should('exist'); - }); + // # Switch to Outline section + cy.findByText('Outline').click(); - // # login as other follower and follow playbook - cy.apiLogin(testUserFollower); - cy.visit(`/playbooks/playbooks/${playbook.id}`); - - // * set testUserFollower as follower and check message in preview - cy.findByTestId('auto-follow-runs').click({force: true}); - cy.findByTestId('preview-content').within(() => { - cy.findByText('Begin following for 2 users').should('exist'); - }); - - // * set testUserFollower as no follower and check message in preview - cy.findByTestId('auto-follow-runs').click({force: true}); - cy.findByTestId('preview-content').within(() => { - cy.findByText('Begin following for one user').should('exist'); - }); - }); - }); - - it('shows status update timer', () => { - cy.visit(`/playbooks/playbooks/${testPublicPlaybook.id}`); - cy.findByTestId('preview-content').within(() => { - cy.findByText('Status updates').next().within(() => { - cy.findByText('1 day').should('exist'); - }); + // * Verify checklist and associated steps + cy.get('#checklists').within(() => { + cy.findByText('Stage 1').should('exist'); + cy.findByText('Step 1').should('exist'); + cy.findByText('Step 2').should('exist'); }); }); it('shows correct retrospective timer and template text', () => { cy.visit(`/playbooks/playbooks/${testPublicPlaybook.id}`); + cy.findByText('Outline').click(); - cy.findByTestId('preview-content').within(() => { - cy.findByText('Retrospective').next().within(() => { - cy.findByText('7 days').should('exist'); - cy.findByText('Retrospective report template').click(); - cy.findByText('Retro template text').should('exist'); - }); + cy.get('#retrospective').within(() => { + cy.findByText('7days').should('exist'); + cy.findByText('Retro template text').should('exist'); }); }); @@ -313,7 +242,7 @@ describe('playbooks > overview', () => { ownerUserId: testUser.id, }).then((playbookRun) => { // # Go to usage view - cy.visit(`/playbooks/playbooks/${testPublicPlaybook.id}/usage`); + cy.visit(`/playbooks/playbooks/${testPublicPlaybook.id}`); // * Verify basic information. cy.findByText('Runs currently in progress').next().should('contain', '1'); @@ -357,14 +286,11 @@ describe('playbooks > overview', () => { cy.get('[class^="Title-"]').contains(playbookTitle); // * Verify we can see the archived badge - cy.findByTestId('archived-badge').should('be.visible'); + cy.get('.icon-archive-outline').should('be.visible'); // * Verify the run button is disabled cy.findByTestId('run-playbook').should('be.disabled'); - // * Verify the edit button is disabled - cy.findByTestId('edit-playbook').should('be.disabled'); - // # Attempt to edit the playbook cy.apiGetPlaybook(testPlaybook.id).then((playbook) => { // # New title diff --git a/tests-e2e/cypress/integration/playbooks/status_update_spec.js b/tests-e2e/cypress/integration/playbooks/status_update_spec.js index 72afc8d587..aa5736aa95 100644 --- a/tests-e2e/cypress/integration/playbooks/status_update_spec.js +++ b/tests-e2e/cypress/integration/playbooks/status_update_spec.js @@ -100,23 +100,24 @@ describe('playbooks > edit status update', () => { cy.contains('3 outgoing webhooks'); }); - // # Disable and reenable status update + // # Disable status update cy.findAllByTestId('status-update-toggle').eq(0).click(); // * Verify status update message - cy.findAllByTestId('status-update-section').should('exist').within(() => { - cy.contains('Status updates are not expected.'); + cy.get('#status-updates').within(() => { + cy.findByText('Status updates are not expected.').should('exist'); }); + // # Re-enable status update cy.findAllByTestId('status-update-toggle').eq(0).click(); // # Refresh the page cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); // * Verify that channels and webhooks persist - cy.findAllByTestId('status-update-section').should('exist').within(() => { - cy.contains('1 channel'); - cy.contains('3 outgoing webhooks'); + cy.get('#status-updates').within(() => { + cy.contains('1 channel').should('exist'); + cy.contains('3 outgoing webhooks').should('exist'); }); }); }); diff --git a/tests-e2e/cypress/integration/runs/actions_ignore.js b/tests-e2e/cypress/integration/runs/actions_ignore.js deleted file mode 100644 index 71e7aad57c..0000000000 --- a/tests-e2e/cypress/integration/runs/actions_ignore.js +++ /dev/null @@ -1,249 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -// *************************************************************** -// - [#] indicates a test step (e.g. # Go to a page) -// - [*] indicates an assertion (e.g. * Check the title) -// *************************************************************** - -// This file could be removed after completing the migration to Run Detail Page -// The equivalent test is rdp_main_header_spec.js - -describe('runs > actions', () => { - let testTeam; - let testSysadmin; - let testUser; - let testPlaybook; - let testRun; - - before(() => { - cy.apiInitSetup({promoteNewUserAsAdmin: true}).then(({team, user}) => { - testTeam = team; - testSysadmin = user; - - cy.apiCreateUser().then((resp) => { - testUser = resp.user; - cy.apiAddUserToTeam(team.id, resp.user.id); - }); - - cy.apiCreatePlaybook({ - teamId: testTeam.id, - title: 'Playbook', - }).then((playbook) => { - testPlaybook = playbook; - }); - }); - }); - - beforeEach(() => { - const now = Date.now(); - const runName = 'Playbook Run ' + now; - cy.apiRunPlaybook({ - teamId: testTeam.id, - playbookId: testPlaybook.id, - playbookRunName: runName, - ownerUserId: testSysadmin.id, - }).then((run) => { - testRun = run; - - // # Navigate to the run page - cy.visit(`/${testTeam.name}/channels/playbook-run-${now}`); - cy.findByRole('button', {name: /Run details/i}).click({force: true}); - }); - }); - - afterEach(() => { - // # Ensure apiInitSetup() can run again - cy.apiLogin(testSysadmin); - }); - - const openRunActionsModal = () => { - // # Click on the run actions modal button - cy.findByRole('button', {name: /Run Actions/i}).click({force: true}); - - // * Verify that the modal is shown - cy.findByRole('dialog', {name: /Run Actions/i}).should('exist'); - }; - - const saveRunActionsModal = () => { - // # Click on the Save button without changing anything - cy.findByRole('button', {name: /Save/i}).click(); - - // * Verify that the modal is no longer there - cy.findByRole('dialog', {name: /Run Actions/i}).should('not.exist'); - }; - - describe('modal behaviour', () => { - it('shows and hides as expected', () => { - // * Verify that the run actions modal is shown when clicking on the button - openRunActionsModal(); - - // # Click on the Cancel button - cy.findByRole('button', {name: /Cancel/i}).click(); - - // * Verify that the modal is no longer there - cy.findByRole('dialog', {name: /Run Actions/i}).should('not.exist'); - - // # Open the run actions modal - openRunActionsModal(); - - // * Verify that saving the modal hides it - saveRunActionsModal(); - }); - - it('honours the settings from the playbook', () => { - cy.apiCreateChannel( - testTeam.id, - 'action-channel', - 'Action Channel', - 'O' - ).then(({channel}) => { - // # Create a different playbook with both settings enabled and populated with data, - // # and then start a run from it - const broadcastChannelIds = [channel.id]; - const webhookOnStatusUpdateURLs = ['https://one.com', 'https://two.com']; - cy.apiCreatePlaybook({ - teamId: testTeam.id, - title: 'Playbook' + Date.now(), - broadcastEnabled: true, - broadcastChannelIds, - webhookOnStatusUpdateEnabled: true, - webhookOnStatusUpdateURLs, - }).then((playbook) => { - cy.apiRunPlaybook({ - teamId: testTeam.id, - playbookId: playbook.id, - playbookRunName: 'Run with actions preconfigured', - ownerUserId: testUser.id, - }); - }); - - // # Navigate to the run page - cy.visit(`/${testTeam.name}/channels/run-with-actions-preconfigured`); - cy.findByRole('button', {name: /Run details/i}).click({force: true}); - - // # Open the run actions modal - openRunActionsModal(); - - // * Verify that the broadcast-to-channels toggle is checked - cy.findByText('Broadcast update to selected channels').parent().within(() => { - cy.get('input').should('be.checked'); - }); - - // * Verify that the channel is in the selector - cy.findByText(channel.display_name); - - // * Verify that the send-webhooks toggle is checked - cy.findByText('Send outgoing webhook').parent().within(() => { - cy.get('input').should('be.checked'); - }); - }); - }); - }); - - describe('trigger: when a status update is posted', () => { - describe('action: Broadcast update to selected channels', () => { - it('shows channel information on first load', () => { - // # Open the run actions modal - openRunActionsModal(); - - // # Enable broadcast to channels - cy.findByText('Broadcast update to selected channels').click(); - - // # Select a couple of channels - cy.findByText('Select channels').click().type('town square{enter}off-topic{enter}'); - - // # Save the changes - saveRunActionsModal(); - - // # Reload the page, so that the store is not pre-populated when visiting Channels - cy.visit(`/playbooks/runs/${testRun.id}/overview`); - - // # Open the run actions modal - openRunActionsModal(); - - // * Check that the channels previously added are shown with their full name, - // * verifying that the store has been populated by the modal component. - cy.findByText('Town Square').should('exist'); - cy.findByText('Off-Topic').should('exist'); - }); - - it('broadcasts to two channels configured when it is enabled', () => { - // # Open the run actions modal - openRunActionsModal(); - - // # Enable broadcast to channels - cy.findByText('Broadcast update to selected channels').click(); - - // # Select a couple of channels - cy.findByText('Select channels').click().type('town square{enter}off-topic{enter}'); - - // # Save the changes - saveRunActionsModal(); - - // # Post a status update, with a reminder in 1 second. - const message = 'Status update - ' + Date.now(); - cy.apiUpdateStatus({ - playbookRunId: testRun.id, - message, - }); - - // # Navigate to the town square channel - cy.visit(`/${testTeam.name}/channels/town-square`); - - // * Verify that the last post contains the status update - cy.getLastPost().then((post) => { - cy.get(post).contains(message); - }); - - // # Navigate to the off-topic channel - cy.visit(`/${testTeam.name}/channels/off-topic`); - - // * Verify that the last post contains the status update - cy.getLastPost().then((post) => { - cy.get(post).contains(message); - }); - }); - - it('does not broadcast if it is disabled, even if there are channels configured', () => { - // # Open the run actions modal - openRunActionsModal(); - - // # Enable broadcast to channels - cy.findByText('Broadcast update to selected channels').click(); - - // # Select a couple of channels - cy.findByText('Select channels').click().type('town square{enter}off-topic{enter}'); - - // # Disable broadcast to channels - cy.findByText('Broadcast update to selected channels').click(); - - // # Save the changes - saveRunActionsModal(); - - // # Post a status update, with a reminder in 1 second. - const message = 'Status update - ' + Date.now(); - cy.apiUpdateStatus({ - playbookRunId: testRun.id, - message, - }); - - // # Navigate to the town square channel - cy.visit(`/${testTeam.name}/channels/town-square`); - - // * Verify that the last post does not contain the status update - cy.getLastPost().then((post) => { - cy.get(post).contains(message).should('not.exist'); - }); - - // # Navigate to the off-topic channel - cy.visit(`/${testTeam.name}/channels/off-topic`); - - // * Verify that the last post does not contain the status update - cy.getLastPost().then((post) => { - cy.get(post).contains(message).should('not.exist'); - }); - }); - }); - }); -}); diff --git a/tests-e2e/cypress/integration/runs/details_spec_ignore.js b/tests-e2e/cypress/integration/runs/details_spec_ignore.js deleted file mode 100644 index a89db60596..0000000000 --- a/tests-e2e/cypress/integration/runs/details_spec_ignore.js +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -// *************************************************************** -// - [#] indicates a test step (e.g. # Go to a page) -// - [*] indicates an assertion (e.g. * Check the title) -// *************************************************************** - -// This file could be removed after completing the migration to Run Detail Page -// The equivalent is spreaded on tests at rdp_xxx.js - -import {stubClipboard} from '../../utils'; - -describe('runs > details', () => { - let testTeam; - let testUser; - let testPublicPlaybook; - - before(() => { - cy.apiInitSetup().then(({team, user}) => { - testTeam = team; - testUser = user; - - // # Login as testUser - cy.apiLogin(testUser); - - // # Create a public playbook - cy.apiCreatePlaybook({ - teamId: testTeam.id, - title: 'Public Playbook', - memberIDs: [], - }).then((playbook) => { - testPublicPlaybook = playbook; - }); - }); - }); - - beforeEach(() => { - // # Size the viewport to show the RHS without covering posts. - cy.viewport('macbook-13'); - - // # Login as testUser - cy.apiLogin(testUser); - }); - - it('redirects to not found error if the playbook run is unknown', () => { - // # Visit the URL of a non-existing playbook run - cy.visit('/playbooks/runs/an_unknown_id'); - - // * Verify that the user has been redirected to the playbook runs not found error page - cy.url().should('include', '/playbooks/error?type=playbook_runs'); - }); - - describe('updates', () => { - const message = 'This is a status update'; - let playbookRunId; - beforeEach(() => { - cy.apiRunPlaybook({ - teamId: testTeam.id, - playbookId: testPublicPlaybook.id, - playbookRunName: 'visible user icons', - ownerUserId: testUser.id, - }).then((playbookRun) => { - cy.apiUpdateStatus({ - playbookRunId: playbookRun.id, - message, - }); - playbookRunId = playbookRun.id; - - // # Visit the playbook run - cy.visit(`/playbooks/runs/${playbookRun.id}`); - }); - }); - - it('should shows user icons', () => { - // * Verify the status update is present - cy.findByTestId('updates').contains(message); - - // * Verify the playbook user and icon is visible - cy.findByTestId('updates').find('img').should('be.visible').and(($img) => { - // https://stackoverflow.com/questions/51246606/test-loading-of-image-in-cypress - expect($img[0].naturalWidth).to.be.greaterThan(0); - }); - }); - - it('links back to original post in channel', () => { - cy.findByTestId('updates').within(() => { - // # Click status post permalink - cy.get('[class^="UpdateTimeLink"]').click(); - }); - - // * Verify post message - cy.get('.post').contains(message); - }); - - it('should copy run link', () => { - // # trigger the tooltip - cy.get('.icon-link-variant').trigger('mouseover'); - - // * Verify tooltip text - cy.get('#copy-run-link-tooltip').should('contain', 'Copy link to run'); - - stubClipboard().as('clipboard'); - - // # click on copy button - cy.get('.icon-link-variant').click().then(() => { - // * Verify that tooltip text changed - cy.get('#copy-run-link-tooltip').should('contain', 'Copied!'); - - // * Verify clipboard content - cy.get('@clipboard').its('contents').should('contain', `/playbooks/runs/${playbookRunId}`); - }); - }); - }); - - describe('status updates disabled', () => { - let playbookRun; - - before(() => { - // # Create a public playbook - cy.apiCreatePlaybook({ - teamId: testTeam.id, - title: 'Public Playbook', - statusUpdateEnabled: false, - }).then((playbook) => { - testPublicPlaybook = playbook; - }).then((playbook) => { - // # Create a new playbook run - const now = Date.now(); - const name = 'Playbook Run (' + now + ')'; - cy.apiRunPlaybook({ - teamId: testTeam.id, - playbookId: playbook.id, - playbookRunName: name, - ownerUserId: testUser.id, - }); - }).then((run) => { - playbookRun = run; - }); - }); - - it('should show that status updates were disabled', () => { - // # Visit the playbook run preview - cy.visit(`/playbooks/runs/${playbookRun.id}/overview`); - - // * Verify the status update msg is correct - cy.get('#status-update-msg').contains('Status updates were disabled for this playbook run.'); - }); - }); - - describe('retrospective disabled', () => { - let playbookRun; - - before(() => { - // # Create a public playbook - cy.apiCreatePlaybook({ - teamId: testTeam.id, - title: 'Public Playbook', - retrospectiveEnabled: false, - }).then((playbook) => { - testPublicPlaybook = playbook; - }).then((playbook) => { - // # Create a new playbook run - const now = Date.now(); - const name = 'Playbook Run (' + now + ')'; - cy.apiRunPlaybook({ - teamId: testTeam.id, - playbookId: playbook.id, - playbookRunName: name, - ownerUserId: testUser.id, - }); - }).then((run) => { - playbookRun = run; - }); - }); - - it('should show the retrospectives were disabled message', () => { - // # Visit the playbook run preview - cy.visit(`/playbooks/runs/${playbookRun.id}/overview`); - - // # Switch to Retrospective tab - cy.get('#root').findByText('Retrospective').click(); - - // * Verify the status message is correct - cy.get('#retrospective-disabled-msg').should('exist'); - }); - }); -}); diff --git a/tests-e2e/cypress/integration/runs/list_spec.js b/tests-e2e/cypress/integration/runs/list_spec.js index 59ac3d4124..b5715a0ad9 100644 --- a/tests-e2e/cypress/integration/runs/list_spec.js +++ b/tests-e2e/cypress/integration/runs/list_spec.js @@ -216,4 +216,53 @@ describe('runs > list', () => { }); }); }); + + describe('LHS run list', () => { + before(() => { + // # Login as testUser + cy.apiLogin(testUser); + + const runs = [ + { + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: 'run-sort-check 0', + ownerUserId: testUser.id, + }, + { + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: 'run-sort-check 1', + ownerUserId: testUser.id, + }, + { + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: 'run-sort-check 2', + ownerUserId: testUser.id, + }, + { + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: 'run-sort-check 3', + ownerUserId: testUser.id, + } + ]; + + Promise.all(runs.map((run) => { + return new Promise((resolve) => cy.apiRunPlaybook(run).then(resolve)); + })).then(() => { + cy.visit('/playbooks'); + }); + }); + + it('lhs run list sorted by name', () => { + cy.findByTestId('lhs-navigation').within(() => { + cy.get('li:contains(run-sort-check)').each((item, index) => { + // * Verify run list order + cy.wrap(item).should('have.text', 'run-sort-check ' + index); + }); + }); + }); + }); }); diff --git a/tests-e2e/cypress/integration/runs/metrics_ignore.js b/tests-e2e/cypress/integration/runs/metrics_ignore.js deleted file mode 100644 index 8b16913085..0000000000 --- a/tests-e2e/cypress/integration/runs/metrics_ignore.js +++ /dev/null @@ -1,296 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -// *************************************************************** -// - [#] indicates a test step (e.g. # Go to a page) -// - [*] indicates an assertion (e.g. * Check the title) -// *************************************************************** - -describe('runs > edit_metrics', () => { - let testTeam; - let testUser; - let testPlaybookWithMetrics; - - before(() => { - cy.apiInitSetup().then(({team, user}) => { - testTeam = team; - testUser = user; - - // # Login as testUser - cy.apiLogin(testUser); - }); - }); - - beforeEach(() => { - // # Login as testUser - cy.apiLogin(testUser); - - // # Create playbook with metrics - cy.apiCreatePlaybook({ - teamId: testTeam.id, - title: 'Playbook with metrics', - memberIDs: [], - createPublicPlaybookRun: true, - metrics: [ - { - title: 'title1', - description: 'description1', - type: 'metric_duration', - target: 720000, - }, - { - title: 'title2', - description: 'description2', - type: 'metric_currency', - target: 40, - }, - { - title: 'title3', - description: 'description3', - type: 'metric_integer', - target: 30, - }, - ] - }).then((playbook) => { - testPlaybookWithMetrics = playbook; - }); - }); - - describe('runs with metrics', () => { - let runId; - - beforeEach(() => { - // # Create a new playbook run - const now = Date.now(); - const runName = 'Playbook Run (' + now + ')'; - cy.apiRunPlaybook({ - teamId: testTeam.id, - playbookId: testPlaybookWithMetrics.id, - playbookRunName: runName, - ownerUserId: testUser.id, - }).then((run) => { - runId = run.id; - }); - }); - - describe('retrospective tab ui', () => { - it('metrics inputs info(title, target, description) and order', () => { - // # Navigate directly to the retro tab - cy.visit(`/playbooks/runs/${runId}/retrospective`); - - // * Verify metrics number - cy.getStyledComponent('InputContainer').should('have.length', 3); - - // * Verify metrics infos - verifyMetricInput(0, 'title1', '12 minutes', 'description1'); - verifyMetricInput(1, 'title2', '40', 'description2'); - verifyMetricInput(2, 'title3', '30', 'description3'); - }); - - it('metrics inputs, null and zero values', () => { - // # Set targets to null and update playbook - testPlaybookWithMetrics.metrics[0].target = null; - testPlaybookWithMetrics.metrics[1].target = 0; - cy.apiUpdatePlaybook(testPlaybookWithMetrics).then(() => { - // # Navigate directly to the retro tab - cy.visit(`/playbooks/runs/${runId}/retrospective`); - - // * Verify if Target text(top | left) is removed - verifyMetricInput(0, 'title1', null, 'description1'); - verifyMetricInput(1, 'title2', '0', 'description2'); - verifyMetricInput(2, 'title3', '30', 'description3'); - }); - }); - - it('run without metrics', () => { - // # Edit playbook, remove all metrics. then check retro tab ui - testPlaybookWithMetrics.metrics = null; - cy.apiUpdatePlaybook(testPlaybookWithMetrics).then(() => { - // # Navigate directly to the retro tab - cy.visit(`/playbooks/runs/${runId}/retrospective`); - - // * Verify there are no metrics inputs - cy.getStyledComponent('InputContainer').should('not.exist'); - }); - }); - }); - - describe('entering metric values', () => { - it('auto save', () => { - // # Navigate directly to the retro tab - cy.visit(`/playbooks/runs/${runId}/retrospective`); - - // # Enter metric values - cy.get('input[type=text]').eq(0).click(); - cy.get('input[type=text]').eq(0).type('12:11:10') - .tab().type('56') - .tab().type('123'); - - // # Navigate to the overview tab and then back. Click should flush changes - cy.findByText('Overview').click({force: true}); - cy.findByText('Retrospective').click({force: true}); - - // * Validate if values persist - cy.get('input[type=text]').eq(0).should('have.value', '12:11:10'); - cy.get('input[type=text]').eq(1).should('have.value', '56'); - cy.get('input[type=text]').eq(2).should('have.value', '123'); - - // # Enter new values - cy.get('input[type=text]').eq(0).click(); - cy.get('input[type=text]').eq(0).clear().type('12:00:10') - .tab().clear().type('20') - .tab().clear().type('21'); - - // # Wait 2 sec to auto save - cy.wait(2000); - - // # Reload page and navigate to the retro tab - cy.visit(`/playbooks/runs/${runId}/retrospective`); - - // * Validate if values are saved - cy.get('input[type=text]').eq(0).should('have.value', '12:00:10'); - cy.get('input[type=text]').eq(1).should('have.value', '20'); - cy.get('input[type=text]').eq(2).should('have.value', '21'); - }); - - it('save empty and zero values', () => { - // # Navigate directly to the retro tab - cy.visit(`/playbooks/runs/${runId}/retrospective`); - - // # Enter metric values - cy.get('input[type=text]').eq(0).click(); - cy.get('input[type=text]').eq(0).clear().type('00:00:00') - .tab().type('7') - .tab().type('0'); - - // # Navigate to the overview tab and then back - cy.findByText('Overview').click({force: true}); - cy.findByText('Retrospective').click({force: true}); - - // * Validate if values persist - cy.get('input[type=text]').eq(0).should('have.value', '00:00:00'); - cy.get('input[type=text]').eq(1).should('have.value', '7'); - cy.get('input[type=text]').eq(2).should('have.value', '0'); - - // # Clear first two metrics values - cy.get('input[type=text]').eq(0).click(); - cy.get('input[type=text]').eq(0).clear() - .tab().clear(); - - // # Navigate to the overview tab and then back - cy.findByText('Overview').click({force: true}); - cy.findByText('Retrospective').click({force: true}); - - // * Validate if values persist - cy.get('input[type=text]').eq(0).should('have.value', ''); - cy.get('input[type=text]').eq(1).should('have.value', ''); - cy.get('input[type=text]').eq(2).should('have.value', '0'); - }); - - it('only valid values are saved. check error messages', () => { - // # Navigate directly to the retro tab - cy.visit(`/playbooks/runs/${runId}/retrospective`); - - // # Enter invalid metric values - cy.get('input[type=text]').eq(0).click(); - cy.get('input[type=text]').eq(0).type('5') - .tab().type('56d') - .tab().type('125'); - - // * Validate error messages - cy.getStyledComponent('ErrorText').eq(0).contains('Please enter a duration in the format: dd:hh:mm (e.g., 12:00:00).'); - cy.getStyledComponent('ErrorText').eq(1).contains('Please enter a number.'); - - // # Navigate to the overview tab and then back - cy.findByText('Overview').click({force: true}); - cy.findByText('Retrospective').click({force: true}); - - // # Reload page and navigate to the retro tab - cy.visit(`/playbooks/runs/${runId}/retrospective`); - - // * Validate that values are not saved - cy.get('input[type=text]').eq(0).should('have.value', ''); - cy.get('input[type=text]').eq(1).should('have.value', ''); - cy.get('input[type=text]').eq(2).should('have.value', '125'); - - // # Enter new metric values - cy.get('input[type=text]').eq(0).click(); - cy.get('input[type=text]').eq(0).type('s') - .tab().type('d') - .tab().type('k'); - }); - - it('publish retro', () => { - // # Navigate directly to the retro tab - cy.visit(`/playbooks/runs/${runId}/retrospective`); - - //# Enter metric invalid values - cy.get('input[type=text]').eq(0).click(); - cy.get('input[type=text]').eq(0).type('20:00:12d') - .tab().type('56') - .tab().type('125v'); - - // # Publish - cy.findByRole('button', {name: 'Publish'}).click(); - - // * Verify we're not showing the publish retro confirmation modal - cy.get('#confirm-modal-light').should('not.exist'); - - //# Enter empty metric values - cy.get('input[type=text]').eq(0).click(); - cy.get('input[type=text]').eq(0).clear() - .tab().clear() - .tab().clear().type(24); - - // # Publish - cy.findByRole('button', {name: 'Publish'}).click(); - - // * Validate error messages - cy.getStyledComponent('ErrorText').eq(0).contains('Please fill in the metric value.'); - cy.getStyledComponent('ErrorText').eq(1).contains('Please fill in the metric value.'); - cy.getStyledComponent('ErrorText').should('have.length', 2); - - // * Verify we're not showing the publish retro confirmation modal - cy.get('#confirm-modal-light').should('not.exist'); - - //# Enter valid metric values - cy.get('input[type=text]').eq(0).click(); - cy.get('input[type=text]').eq(0).type('09:87:12') - .tab().type(123); - - // # Publish - cy.findByRole('button', {name: 'Publish'}).click(); - - // * Verify we're showing the publish retro confirmation modal - cy.get('#confirm-modal-light').contains('Are you sure you want to publish?'); - - // # Publish - cy.findByRole('button', {name: 'Publish'}).click(); - - // * Verify that retro got published - cy.get('.icon-check-all').should('be.visible'); - - // * Verify that metrics inputs are disabled - cy.get('input[type=text]').each(($el) => { - cy.wrap($el).should('not.be.enabled'); - }); - }); - }); - }); -}); - -const verifyMetricInput = (index, title, target, description) => { - cy.getStyledComponent('InputContainer').eq(index).within(() => { - cy.getStyledComponent('Title').contains(title); - - if (target) { - cy.getStyledComponent('TargetTitle').contains(target); - } else { - cy.getStyledComponent('TargetTitle').should('not.exist'); - } - - if (description) { - cy.getStyledComponent('HelpText').contains(description); - } - }); -}; diff --git a/tests-e2e/cypress/integration/runs/rdp_general_spec.js b/tests-e2e/cypress/integration/runs/rdp_general_spec.js index af414c3f41..c19bef9573 100644 --- a/tests-e2e/cypress/integration/runs/rdp_general_spec.js +++ b/tests-e2e/cypress/integration/runs/rdp_general_spec.js @@ -10,6 +10,7 @@ describe('runs > run details page', () => { let testTeam; let testUser; let testPublicPlaybook; + let testPlaybookRun; before(() => { cy.apiInitSetup().then(({team, user}) => { @@ -43,6 +44,8 @@ describe('runs > run details page', () => { playbookRunName: 'the run name', ownerUserId: testUser.id, }).then((playbookRun) => { + testPlaybookRun = playbookRun; + // # Visit the playbook run cy.visit(`/playbooks/runs/${playbookRun.id}`); }); @@ -55,4 +58,22 @@ describe('runs > run details page', () => { // * Verify that the user has been redirected to the playbook runs not found error page cy.url().should('include', '/playbooks/error?type=playbook_runs'); }); + + it('telemetry is triggered', () => { + // # Intercept all calls to telemetry + cy.intercept('/plugins/playbooks/api/v0/telemetry').as('telemetry'); + + // # Visit the URL of a non-existing playbook run + cy.visit(`/playbooks/runs/${testPlaybookRun.id}`); + + // * assert telemetry pageview + cy.wait('@telemetry').then((interception) => { + expect(interception.request.body.name).to.eq('run_details'); + expect(interception.request.body.type).to.eq('page'); + expect(interception.request.body.properties.from).to.eq(''); + expect(interception.request.body.properties.role).to.eq('participant'); + expect(interception.request.body.properties.playbookrun_id).to.eq(testPlaybookRun.id); + expect(interception.request.body.properties.playbook_id).to.eq(testPublicPlaybook.id); + }); + }); }); diff --git a/tests-e2e/cypress/integration/runs/rdp_main_finish_spec.js b/tests-e2e/cypress/integration/runs/rdp_main_finish_spec.js index 5f6d25f263..76ed1ccaf9 100644 --- a/tests-e2e/cypress/integration/runs/rdp_main_finish_spec.js +++ b/tests-e2e/cypress/integration/runs/rdp_main_finish_spec.js @@ -48,7 +48,7 @@ describe('runs > run details page > finish', () => { cy.apiRunPlaybook({ teamId: testTeam.id, playbookId: testPublicPlaybook.id, - playbookRunName: 'the run name', + playbookRunName: 'the run name(' + Date.now() + ')', ownerUserId: testUser.id, }).then((playbookRun) => { testPlaybookRun = playbookRun; @@ -98,6 +98,9 @@ describe('runs > run details page > finish', () => { // * Assert status badge is finished cy.findByTestId('run-header-section').findByTestId('badge').contains('Finished'); + + // * Verify run has been removed from LHS + cy.findByTestId('lhs-navigation').findByText(testPlaybookRun.name).should('not.exist'); }); it('can be canceled', () => { diff --git a/tests-e2e/cypress/integration/runs/rdp_main_header_spec.js b/tests-e2e/cypress/integration/runs/rdp_main_header_spec.js index 659f312ada..9e8c4f2d5b 100644 --- a/tests-e2e/cypress/integration/runs/rdp_main_header_spec.js +++ b/tests-e2e/cypress/integration/runs/rdp_main_header_spec.js @@ -76,7 +76,7 @@ describe('runs > run details page > header', () => { const getDropdownItemByText = (text) => { cy.findByTestId('run-header-section').find('h1').click(); - return cy.findByTestId('run-header-section').findByTestId('dropdownmenu').findByText(text); + return cy.findByTestId('dropdownmenu').findByText(text); }; const commonHeaderTests = () => { @@ -114,7 +114,7 @@ describe('runs > run details page > header', () => { cy.findByTestId('run-header-section').find('h1').click(); // * Assert context menu is opened - cy.findByTestId('run-header-section').findByTestId('dropdownmenu').should('be.visible'); + cy.findByTestId('dropdownmenu').should('be.visible'); }); it('can copy link', () => { @@ -138,7 +138,7 @@ describe('runs > run details page > header', () => { cy.apiRunPlaybook({ teamId: testTeam.id, playbookId: testPublicPlaybook.id, - playbookRunName: 'the run name', + playbookRunName: 'the run name(' + Date.now() + ')', ownerUserId: testUser.id, }).then((run) => { playbookRun = run; @@ -153,7 +153,7 @@ describe('runs > run details page > header', () => { it('has not get-involved button', () => { // * Assert button is not showed - getHeader().findByText('Get involved').should('not.exist'); + getHeader().findByText('Participate').should('not.exist'); }); describe('run actions', () => { @@ -175,6 +175,31 @@ describe('runs > run details page > header', () => { saveRunActionsModal(); }); + it('can not save an invalid form', () => { + // * Verify that the run actions modal is shown when clicking on the button + openRunActionsModal(); + + cy.findByRole('dialog', {name: /Run Actions/i}).within(() => { + // # click on webhooks toggle + cy.findByText('Send outgoing webhook').click(); + + // # Type an invalid webhook URL + cy.getStyledComponent('TextArea').clear().type('invalidurl'); + + // # Click outside textarea + cy.findByText('Run Actions').click(); + + // * Assert the error message is displayed + cy.findByText('Invalid webhook URLs').should('be.visible'); + + // # Click save + cy.findByTestId('modal-confirm-button').click(); + + // * Assert that modal is still open + cy.findByText('Run Actions').should('be.visible'); + }); + }); + it('honours the settings from the playbook', () => { cy.apiCreateChannel( testTeam.id, @@ -261,7 +286,7 @@ describe('runs > run details page > header', () => { cy.findByText('Broadcast update to selected channels').click(); // # Select a couple of channels - cy.findByText('Select channels').click().type('town square{enter}off-topic{enter}'); + cy.findByText('Select channels').click().type('town square{enter}off-topic{enter}', {delay: 100}); // # Save the changes saveRunActionsModal(); @@ -298,7 +323,7 @@ describe('runs > run details page > header', () => { cy.findByText('Broadcast update to selected channels').click(); // # Select a couple of channels - cy.findByText('Select channels').click().type('town square{enter}off-topic{enter}'); + cy.findByText('Select channels').click().type('town square{enter}off-topic{enter}', {delay: 100}); // # Disable broadcast to channels cy.findByText('Broadcast update to selected channels').click(); @@ -395,11 +420,37 @@ describe('runs > run details page > header', () => { cy.findByRole('dialog', {name: /Run Actions/i}).should('not.exist'); }); }); + + describe('leave run', () => { + it('can leave run', () => { + // # Add viewer user to the channel + cy.apiAddUserToChannel(playbookRun.channel_id, testViewerUser.id); + + // # Change the owner to testViewerUser + cy.apiChangePlaybookRunOwner(playbookRun.id, testViewerUser.id); + cy.wait(500); + + // # Click on leave run + getDropdownItemByText('Leave and unfollow run').click(); + + // # confirm modal + cy.get('#confirmModal').get('#confirmModalButton').click(); + + // NOTE: this check fails because the front doesn't receive updated run object. Will deal in separate PR. + // * Assert that the Participate button is shown + // getHeader().findByText('Participate').should('be.visible'); + + // * Verify run has been removed from LHS + cy.findByTestId('lhs-navigation').findByText(playbookRun.name).should('not.exist'); + }); + }); }); }); describe('as viewer', () => { let playbookRunChannelName; + let playbookRunName; + beforeEach(() => { // # Size the viewport to show the RHS without covering posts. cy.viewport('macbook-13'); @@ -408,7 +459,7 @@ describe('runs > run details page > header', () => { cy.apiLogin(testUser); const now = Date.now(); - const playbookRunName = 'Playbook Run (' + now + ')'; + playbookRunName = 'Playbook Run (' + now + ')'; playbookRunChannelName = 'playbook-run-' + now; cy.apiRunPlaybook({ teamId: testTeam.id, @@ -428,21 +479,62 @@ describe('runs > run details page > header', () => { describe('title, icons and buttons', () => { commonHeaderTests(); - describe('get involved', () => { + describe('Favorite', () => { + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + + const now = Date.now(); + playbookRunName = 'Playbook Run (' + now + ')'; + playbookRunChannelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybookAndChannel.id, + playbookRunName, + ownerUserId: testUser.id, + }).then((run) => { + playbookRun = run; + + cy.apiLogin(testViewerUser).then(() => { + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + + // # let the page render completely + cy.wait(3000); + }); + }); + }); + + it('add and remove from LHS', () => { + // # Click fav icon + getHeader().getStyledComponent('StarButton').click(); + + // * Assert run appears in LHS + cy.findByTestId('lhs-navigation').findByText(playbookRunName).should('exist'); + + // # Click fav icon again (unfav) + getHeader().getStyledComponent('StarButton').click(); + + // * Assert run disappeared from LHS + cy.findByTestId('lhs-navigation').findByText(playbookRunName).should('not.exist'); + }); + }); + + describe('Participate', () => { it('shows button', () => { // * Assert that the button is shown - getHeader().findByText('Get involved').should('be.visible'); + getHeader().findByText('Participate').should('be.visible'); }); it('click button to show modal and cancel', () => { // * Assert that component is rendered - getHeader().findByText('Get involved').should('be.visible'); + getHeader().findByText('Participate').should('be.visible'); // # Wait for useChannel cy.wait(500); - // * Click get involved button - getHeader().findByText('Get involved').click(); + // * Click Participate button + getHeader().findByText('Participate').click(); // # cancel modal cy.get('#confirmModal').get('#cancelModalButton').click(); @@ -456,19 +548,19 @@ describe('runs > run details page > header', () => { cy.visit(`${testTeam.name}/channels/${playbookRunChannelName}`); // * Assert message has not been sent - cy.getLastPost().should('not.contain', 'wants to get involved in this run.'); + cy.getLastPost().should('not.contain', 'wants to participate in this run.'); }); }); - it('click button to show modal and confirm', () => { + it('click button to show modal and confirm when private channel', () => { // * Assert component is rendered - getHeader().findByText('Get involved').should('be.visible'); + getHeader().findByText('Participate').should('be.visible'); // # Wait for useChannel cy.wait(500); - // * Click get involved button - getHeader().findByText('Get involved').click(); + // * Click start-participating button + getHeader().findByText('Participate').click(); // # confirm modal cy.get('#confirmModal').get('#confirmModalButton').click(); @@ -476,22 +568,19 @@ describe('runs > run details page > header', () => { // * Assert that modal is not shown cy.get('#confirmModal').should('not.exist'); - // # Login as testUser - cy.apiLogin(testUser).then(() => { - // # Visit the channel run - cy.visit(`${testTeam.name}/channels/${playbookRunChannelName}`); + // # Wait for ws event to be received + cy.wait(500); - // * Assert that message has been sent - cy.getLastPost().contains('wants to get involved in this run.'); - }); + // * Verify run has been added to LHS + cy.findByTestId('lhs-navigation').findByText(playbookRunName).should('exist'); }); - it('click button and confirm to join public channel', () => { + it('click button and confirm to when public channel', () => { // # Login as testUser cy.apiLogin(testUser); const now = Date.now(); - const playbookRunName = 'Playbook Run (' + now + ')'; + playbookRunName = 'Playbook Run (' + now + ')'; playbookRunChannelName = 'playbook-run-' + now; // Create a run with public chanel @@ -507,13 +596,13 @@ describe('runs > run details page > header', () => { cy.visit(`/playbooks/runs/${run.id}`); // * Assert that component is rendered - getHeader().findByText('Get involved').should('be.visible'); + getHeader().findByText('Participate').should('be.visible'); // # Wait for useChannel cy.wait(500); - // # Click get involved button - getHeader().findByText('Get involved').click(); + // # Click start-participating button + getHeader().findByText('Participate').click(); // # confirm modal cy.get('#confirmModal').get('#confirmModalButton').click(); @@ -521,14 +610,11 @@ describe('runs > run details page > header', () => { // * Assert that modal is not shown cy.get('#confirmModal').should('not.exist'); - // # Wait for useChannel + // # Wait for ws event to be received cy.wait(500); - // # Visit the channel run (now we joined) - cy.visit(`${testTeam.name}/channels/${playbookRunChannelName}`); - - // * Assert that message has not been sent - cy.getLastPost().should('not.contain', 'wants to get involved in this run.'); + // * Verify run has been added to LHS + cy.findByTestId('lhs-navigation').findByText(playbookRunName).should('exist'); }); }); }); diff --git a/tests-e2e/cypress/integration/runs/rdp_main_restore_spec.js b/tests-e2e/cypress/integration/runs/rdp_main_restore_spec.js new file mode 100644 index 0000000000..376f0337d6 --- /dev/null +++ b/tests-e2e/cypress/integration/runs/rdp_main_restore_spec.js @@ -0,0 +1,104 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +describe('runs > run details page > restart run', () => { + let testTeam; + let testUser; + let testViewerUser; + let testPublicPlaybook; + let testRun; + + // const taskIndex = 0; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // Create another user in the same team + cy.apiCreateUser().then(({user: viewer}) => { + testViewerUser = viewer; + cy.apiAddUserToTeam(testTeam.id, testViewerUser.id); + }); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + checklists: [ + { + title: 'Stage 1', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + { + title: 'Stage 2', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + ], + }).then((playbook) => { + testPublicPlaybook = playbook; + }); + }); + }); + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName: 'the run name', + ownerUserId: testUser.id, + }).then((playbookRun) => { + testRun = playbookRun; + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${testRun.id}`); + }); + }); + + describe('restart run', () => { + it('can be confirmed', () => { + cy.intercept('PUT', `/plugins/playbooks/api/v0/runs/${testRun.id}/finish`).as('routeFinish'); + cy.intercept('PUT', `/plugins/playbooks/api/v0/runs/${testRun.id}/restore`).as('routeRestore'); + + cy.findByTestId('run-header-section').findByTestId('badge').contains('In Progress'); + + // # Click finish run button + cy.findByTestId('run-finish-section').find('button').click(); + cy.get('#confirmModal').get('#confirmModalButton').click(); + + cy.wait('@routeFinish'); + cy.findByTestId('run-header-section').findByTestId('badge').contains('Finished'); + + cy.findByTestId('runDropdown').click(); + cy.get('.restartRun').find('span').contains('Restart run'); + + cy.get('.restartRun').click(); + cy.get('#confirmModal').get('#confirmModalButton').click(); + cy.wait('@routeRestore'); + cy.findByTestId('run-header-section').findByTestId('badge').contains('In Progress'); + cy.findByTestId('lhs-navigation').findByText(testRun.name).should('exist'); + } + ); + }); +}); \ No newline at end of file diff --git a/tests-e2e/cypress/integration/runs/rdp_main_retrospective_spec.js b/tests-e2e/cypress/integration/runs/rdp_main_retrospective_spec.js index bebc1afc53..660c42f6a4 100644 --- a/tests-e2e/cypress/integration/runs/rdp_main_retrospective_spec.js +++ b/tests-e2e/cypress/integration/runs/rdp_main_retrospective_spec.js @@ -24,11 +24,13 @@ const editAndPublishRetro = () => { cy.findByRole('button', {name: 'Publish'}).click(); }); - // * Verify we're showing the publish retro confirmation modal - cy.get('#confirm-modal-light').contains('Are you sure you want to publish?'); + cy.get('#confirm-modal-light').within(() => { + // * Verify we're showing the publish retro confirmation modal + cy.findByText('Are you sure you want to publish?'); - // # Publish - cy.findByRole('button', {name: 'Publish'}).click(); + // # Publish + cy.findByRole('button', {name: 'Publish'}).click(); + }); // * Verify that retro got published getRetro().get('.icon-check-all').should('be.visible'); @@ -172,7 +174,7 @@ describe('runs > run details page', () => { editAndPublishRetro(); // # Switch to the run channel - cy.findByTestId('runinfo-channel').click(); + cy.findByTestId('runinfo-channel-link').click(); // * Verify the modified retro text is posted cy.getStyledComponent('CustomPostContent').should('exist').contains('Edited retrospective.'); @@ -247,22 +249,46 @@ describe('runs > run details page', () => { commonTests(); it('inputs, null and zero values', () => { - // # Set targets to null and update playbook - testPublicPlaybookWithMetrics.metrics[0].target = null; - testPublicPlaybookWithMetrics.metrics[1].target = 0; - cy.apiUpdatePlaybook(testPublicPlaybookWithMetrics).then(() => { - // # Navigate directly to the retro tab - cy.visit(`/playbooks/runs/${testRun.id}`); - - // * Verify changes are reflected - verifyMetricInput(0, 'title1', null, 'description1', 'Add value (in dd:hh:mm)'); - verifyMetricInput(1, 'title2', '0', 'description2', 'Add value'); - verifyMetricInput(2, 'title3', '30', 'description3', 'Add value'); - - // # recover the original data for playbook - testPublicPlaybookWithMetrics.metrics[0].target = 720000; - testPublicPlaybookWithMetrics.metrics[1].target = 40; - cy.apiUpdatePlaybook(testPublicPlaybookWithMetrics); + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + createPublicPlaybookRun: true, + metrics: [ + { + title: 'title1', + description: 'description1', + type: 'metric_duration', + target: null, + }, + { + title: 'title2', + description: 'description2', + type: 'metric_currency', + target: 0, + }, + { + title: 'title3', + description: 'description3', + type: 'metric_integer', + target: 30, + }, + ] + }).then((playbook) => { + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbook.id, + playbookRunName: 'the run name', + ownerUserId: testUser.id, + }).then((playbookRun) => { + // # Navigate directly to the retro tab + cy.visit(`/playbooks/runs/${playbookRun.id}`); + + // * Verify changes are reflected + verifyMetricInput(0, 'title1', null, 'description1', 'Add value (in dd:hh:mm)'); + verifyMetricInput(1, 'title2', '0', 'description2', 'Add value'); + verifyMetricInput(2, 'title3', '30', 'description3', 'Add value'); + }); }); }); @@ -411,11 +437,13 @@ describe('runs > run details page', () => { cy.findByRole('button', {name: 'Publish'}).click(); }); - // * Verify we're showing the publish retro confirmation modal - cy.get('#confirm-modal-light').contains('Are you sure you want to publish?'); + cy.get('#confirm-modal-light').within(() => { + // * Verify we're showing the publish retro confirmation modal + cy.findByText('Are you sure you want to publish?'); - // # Publish - cy.findByRole('button', {name: 'Publish'}).click(); + // # Publish + cy.findByRole('button', {name: 'Publish'}).click(); + }); getRetro().within(() => { // * Verify that retro got published diff --git a/tests-e2e/cypress/integration/runs/rdp_main_statusupdate_spec.js b/tests-e2e/cypress/integration/runs/rdp_main_statusupdate_spec.js index b6b1b68830..dacb980657 100644 --- a/tests-e2e/cypress/integration/runs/rdp_main_statusupdate_spec.js +++ b/tests-e2e/cypress/integration/runs/rdp_main_statusupdate_spec.js @@ -110,10 +110,42 @@ describe('runs > run details page > status update', () => { // * Check new due date cy.findByTestId('update-due-date-text').contains('Update due'); cy.findByTestId('update-due-date-time').contains('in 15 minutes'); + + // # Intercept all calls to telemetry + cy.intercept('/plugins/playbooks/api/v0/telemetry').as('telemetry'); + + // # go to channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * check that post has been added + cy.getLastPost().contains('my nice update'); + + // * assert telemetry pageview + cy.wait('@telemetry').then((interception) => { + expect(interception.request.body.name).to.eq('run_status_update'); + expect(interception.request.body.type).to.eq('page'); + expect(interception.request.body.properties.channel_type).to.eq('P'); + }); }); }); describe('request an update', () => { + it('is disabled if the run is finished', () => { + cy.apiFinishRun(testRun.id).then(() => { + // # reload url + cy.visit(`/playbooks/runs/${testRun.id}`); + + // # Click on kebab menu + cy.findByTestId('run-statusupdate-section').getStyledComponent('Kebab').click(); + + // # Click on request update + cy.findByText('Request update...').click(); + + // * Assert modal is not opened + cy.get('#confirmModalButton').should('not.exist'); + }); + }); + it('requests and confirm', () => { // # Click on kebab menu cy.findByTestId('run-statusupdate-section').getStyledComponent('Kebab').click(); @@ -207,7 +239,7 @@ describe('runs > run details page > status update', () => { cy.findByTestId('update-due-date-time').contains('in 15 minutes'); // * Assert the recent updated text - cy.findByTestId('run-statusupdate-section').contains('my nice update'); + cy.findByTestId('status-update-card').contains('my nice update'); }); }); diff --git a/tests-e2e/cypress/integration/runs/rdp_rhs_runinfo_spec.js b/tests-e2e/cypress/integration/runs/rdp_rhs_runinfo_spec.js index e478e65960..fa71404cc2 100644 --- a/tests-e2e/cypress/integration/runs/rdp_rhs_runinfo_spec.js +++ b/tests-e2e/cypress/integration/runs/rdp_rhs_runinfo_spec.js @@ -13,6 +13,10 @@ describe('runs > run details page > run info', () => { let testPublicPlaybook; let testRun; + const getHeader = () => { + return cy.findByTestId('run-header-section'); + }; + before(() => { cy.apiInitSetup().then(({team, user}) => { testTeam = team; @@ -68,7 +72,7 @@ describe('runs > run details page > run info', () => { const commonTests = () => { it('Playbook entry links to the playbook', () => { // # Click on the Playbook entry - getOverviewEntry('playbook').click(); + getOverviewEntry('playbook').within(() => cy.getStyledComponent('ItemLink').click()); // * Verify the we're in the right playbook page cy.url().should('include', '/playbooks/playbooks'); @@ -143,12 +147,31 @@ describe('runs > run details page > run info', () => { }); it('click channel link navigates to run\'s channel', () => { + // * Assert channel name + getOverviewEntry('channel').contains('the run name'); + // # Click on channel item - getOverviewEntry('channel').click(); + getOverviewEntry('channel').within(() => cy.getStyledComponent('ItemLink').click()); // * Assert we navigated correctly cy.url().should('include', `${testTeam.name}/channels/the-run-name`); }); + + it('channel is still there when the run is finished', () => { + cy.apiFinishRun(testRun.id).then(() => { + // # Reload page + cy.reload(); + + // * Assert channel name + getOverviewEntry('channel').contains('the run name'); + + // # Click on channel item + getOverviewEntry('channel').within(() => cy.getStyledComponent('ItemLink').click()); + + // * Assert we navigated correctly + cy.url().should('include', `${testTeam.name}/channels/the-run-name`); + }); + }); }); describe('as viewer', () => { @@ -186,9 +209,35 @@ describe('runs > run details page > run info', () => { }); }); - it('there is no channel link', () => { - // * Assert that the link is not present - getOverviewEntry('channel').should('not.exist'); + it('there is no channel link but can request to join', () => { + // * Assert that the section exists with label Private + getOverviewEntry('channel').contains('Private'); + + // * Assert that link does not exist + getOverviewEntry('channel').within(() => { + cy.get('a').should('not.exist'); + }); + + // * Assert that request-join button does not exist + getOverviewEntry('channel').within(() => { + cy.get('button').should('not.exist'); + }); + + cy.wait(500); + + // # Click Participate button + getHeader().findByText('Participate').click(); + + // # Confirm modal + cy.get('#confirmModal').get('#confirmModalButton').click(); + + // Assert that request-join button exist + getOverviewEntry('channel').within(() => { + cy.get('button').click(); + }); + + // # Confirm modal + cy.get('#confirmModal').get('#confirmModalButton').click(); }); }); }); @@ -212,7 +261,7 @@ describe('runs > run details page > run info', () => { }); }); - describe('playbook with metrics', () => { + describe('playbook with metrics (enabled retro)', () => { let playbookWithMetrics; let runWithMetrics; @@ -330,6 +379,11 @@ describe('runs > run details page > run info', () => { // # Click on the metric row cy.findByText(metric.title).click(); + // # Seems there's a re-render between clicking the title and + // # typing that occasionally leads to dropped keystrokes in + // # .type(). Wait for it to avoid. + cy.wait(1000); + // # Type a value for the metric cy.focused().type(testData[metric.type].input); }); @@ -364,6 +418,74 @@ describe('runs > run details page > run info', () => { }); }); }); + + describe('playbook with metrics (disabled retro)', () => { + let playbookWithMetrics; + let runWithMetrics; + + before(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook with metrics + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook with metrics', + memberIDs: [], + metrics: [ + { + title: 'Integer', + description: 'integer', + type: 'metric_integer', + target: 1, + }, + ], + retrospectiveEnabled: false, + }).then((playbook) => { + playbookWithMetrics = playbook; + }); + }); + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbookWithMetrics.id, + playbookRunName: 'the run name', + ownerUserId: testUser.id, + }).then((playbookRun) => { + runWithMetrics = playbookRun; + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + }); + }); + + const commonTests = () => { + it('key metrics is hidden', () => { + getRHSSection('Key Metrics').should('not.exist'); + }); + }; + + describe('as participant', () => { + commonTests(); + }); + + describe('as viewer', () => { + beforeEach(() => { + cy.apiLogin(testViewerUser).then(() => { + cy.visit(`/playbooks/runs/${runWithMetrics.id}`); + }); + }); + + commonTests(); + }); + }); }); describe('> recent activity', () => { diff --git a/tests-e2e/cypress/integration/runs/retrospective_ignore.js b/tests-e2e/cypress/integration/runs/retrospective_ignore.js deleted file mode 100644 index 3ed6b13c5a..0000000000 --- a/tests-e2e/cypress/integration/runs/retrospective_ignore.js +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -// *************************************************************** -// - [#] indicates a test step (e.g. # Go to a page) -// - [*] indicates an assertion (e.g. * Check the title) -// *************************************************************** - -// This file could be removed after completing the migration to Run Detail Page -// The equivalent test is rdp_main_retrospective.js - -describe('runs > retrospective', () => { - const playbookName = 'Playbook (' + Date.now() + ')'; - let testTeam; - let testUser; - let testPublicPlaybook; - let runId; - - before(() => { - cy.apiInitSetup({loginAfter: true}).then(({team, user}) => { - testTeam = team; - testUser = user; - - // # Create a public playbook - cy.apiCreatePlaybook({ - teamId: testTeam.id, - title: playbookName, - memberIDs: [], - retrospectiveTemplate: 'This is a retrospective template.', - }).then((playbook) => { - testPublicPlaybook = playbook; - }); - }); - }); - - beforeEach(() => { - // # Create a new playbook run - const now = Date.now(); - const runName = 'Playbook Run (' + now + ')'; - cy.apiRunPlaybook({ - teamId: testTeam.id, - playbookId: testPublicPlaybook.id, - playbookRunName: runName, - ownerUserId: testUser.id, - }).then((run) => { - runId = run.id; - }); - }); - - it('publishing posts to run channel', () => { - editAndPublishRetro(runId); - - // # Switch to the run channel - cy.findByText('Go to channel').click(); - - // * Verify the modified retro text is posted - cy.getStyledComponent('CustomPostContent').should('exist').contains('Edited retrospective.'); - }); - - it('prevents repeated publishing', () => { - editAndPublishRetro(runId); - - // * Verify that can't publish - cy.findByText('Publish').should('not.be.enabled'); - - // # Navigate to the overview tab - cy.findByText('Overview').click(); - - // # Navigate directly to the retro tab - cy.findByText('Retrospective').click(); - - // * Verify that can't publish - cy.findByText('Publish').should('not.be.enabled'); - }); -}); - -const editAndPublishRetro = (runId) => { - // # Navigate directly to the retro tab - cy.visit(`/playbooks/runs/${runId}/retrospective`); - - // # Start editing - cy.findByTestId('retro-report-text').click(); - - // * Verify the provided template text is pre-filled - cy.focused().should('include.text', 'This is a retrospective template.'); - - // # Change the retro text - cy.focused().clear().type('Edited retrospective.'); - - // # Save it by clicking outside the text area - cy.findByText('Report').click(); - - // # Publish - cy.findByRole('button', {name: 'Publish'}).click(); - - // * Verify we're showing the publish retro confirmation modal - cy.get('#confirm-modal-light').contains('Are you sure you want to publish?'); - - // # Publish - cy.findByRole('button', {name: 'Publish'}).click(); - - // * Verify that retro got published - cy.get('.icon-check-all').should('be.visible'); -}; diff --git a/tests-e2e/cypress/integration/runs/timeline_ignore.js b/tests-e2e/cypress/integration/runs/timeline_ignore.js deleted file mode 100644 index f8046c84d4..0000000000 --- a/tests-e2e/cypress/integration/runs/timeline_ignore.js +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -// *************************************************************** -// - [#] indicates a test step (e.g. # Go to a page) -// - [*] indicates an assertion (e.g. * Check the title) -// *************************************************************** - -// This file could be removed after completing the migration to Run Detail Page -// The equivalent test is rdp_main_retrospective.js - -describe('runs > timeline', () => { - const playbookName = 'Playbook (' + Date.now() + ')'; - let testTeam; - let testUser; - let testPublicPlaybook; - let runId; - - before(() => { - cy.apiInitSetup().then(({team, user}) => { - testTeam = team; - testUser = user; - - // # Create a public playbook - cy.apiCreatePlaybook({ - teamId: testTeam.id, - title: playbookName, - memberIDs: [testUser.id], - }).then((playbook) => { - testPublicPlaybook = playbook; - }); - }); - }); - - beforeEach(() => { - // # Size the viewport to show the RHS without covering posts. - cy.viewport('macbook-13'); - - // # Login as testUser - cy.apiLogin(testUser); - - // # Create a new playbook run - const now = Date.now(); - const runName = 'Playbook Run (' + now + ')'; - cy.apiRunPlaybook({ - teamId: testTeam.id, - playbookId: testPublicPlaybook.id, - playbookRunName: runName, - ownerUserId: testUser.id, - }).then((run) => { - runId = run.id; - }); - }); - - describe('timeline updates', () => { - it('can be deleted', () => { - // # Navigate directly to the retro tab - cy.visit(`/playbooks/runs/${runId}/retrospective`); - - // * Verify playbook run created message is visible in the timeline - verifyTimelineEvent('incident_created', 1, 0, `Run started by ${testUser.username}`); - - // * Delete the playbook run created event - removeTimelineEvent('incident_created', 1, 0, `Run started by ${testUser.username}`); - }); - }); -}); - -const verifyTimelineEvent = (expectedEventType, expectedNumberOfEvents, expectedEventIndex, expectedEventSummary) => { - // * Verify we have the expected number of events - cy.findAllByTestId('timeline-item ' + expectedEventType) - .should('have.length', expectedNumberOfEvents); - - // * Verify the target event exists with the expected summary text - cy.findByText(expectedEventSummary).should('exist'); -}; - -const removeTimelineEvent = (expectedEventType, expectedNumberOfEvents, expectedEventIndex, expectedEventSummary) => { - // * Verify we have the expected number of events - cy.findAllByTestId('timeline-item ' + expectedEventType) - .should('have.length', expectedNumberOfEvents); - - // * Verify the target event exists with the expected summary text - cy.findByText(expectedEventSummary).should('exist'); - - // # Hover over the event - cy.findAllByTestId('timeline-item ' + expectedEventType) - .eq(expectedEventIndex) - .trigger('mouseover'); - - // # Click the trash - cy.get('.icon-trash-can-outline').click(); - - // * Verify confirm modal is visible - cy.get('#confirmModal').should('be.visible'); - - // # Press the delete entry button - cy.get('#confirmModalButton').contains('Delete Entry').click(); - - // * Verify confirm modal is not visible - cy.get('#confirmModal').should('not.exist'); - - // # Verify we have one fewer event - cy.findAllByTestId('timeline-item ' + expectedEventType) - .should('have.length', expectedNumberOfEvents - 1); - - // * Verify the target event does not exist with the expected summary text - cy.findByText(expectedEventSummary).should('not.exist'); -}; diff --git a/tests-e2e/cypress/support/index.js b/tests-e2e/cypress/support/e2e.js similarity index 99% rename from tests-e2e/cypress/support/index.js rename to tests-e2e/cypress/support/e2e.js index 7561826597..fd6fc71df7 100644 --- a/tests-e2e/cypress/support/index.js +++ b/tests-e2e/cypress/support/e2e.js @@ -13,7 +13,6 @@ import localforage from 'localforage'; require('@cypress/skip-test/support'); import '@testing-library/cypress/add-commands'; -import 'cypress-file-upload'; import 'cypress-wait-until'; import 'cypress-plugin-tab'; import addContext from 'mochawesome/addContext'; diff --git a/tests-e2e/cypress/support/plugin/ui_commands.js b/tests-e2e/cypress/support/plugin/ui_commands.js index 474f54d5a6..4607234dd9 100644 --- a/tests-e2e/cypress/support/plugin/ui_commands.js +++ b/tests-e2e/cypress/support/plugin/ui_commands.js @@ -24,7 +24,8 @@ Cypress.Commands.add('executeSlashCommand', (command) => { cy.findByTestId('post_textbox').clear().type(command); // Using esc to make sure we exit out of slash command autocomplete - cy.findByTestId('post_textbox').type('{esc}{esc}{esc}{esc}', {delay: 200}).type('{enter}'); + cy.findByTestId('post_textbox').type('{esc}{esc}{esc}{esc}', {delay: 200}); + cy.findByTestId('post_textbox').type('{enter}'); }); // Opens playbook run dialog using the `/playbook run` slash command diff --git a/tests-e2e/cypress/support/ui_commands.js b/tests-e2e/cypress/support/ui_commands.js index b649dfbc7d..53c758f164 100644 --- a/tests-e2e/cypress/support/ui_commands.js +++ b/tests-e2e/cypress/support/ui_commands.js @@ -10,6 +10,18 @@ import {isMac} from '../utils'; // Read more: https://on.cypress.io/custom-commands // *********************************************************** +// Overwrite navigation functions to disable landing page +// See https://github.com/mattermost/mattermost-webapp/pull/10653 +Cypress.Commands.overwrite('reload', (originalFn, forceReload, options) => { + localStorage.setItem('__landingPageSeen__', 'true'); + return originalFn(forceReload, options); +}); + +Cypress.Commands.overwrite('visit', (originalFn, url, options) => { + localStorage.setItem('__landingPageSeen__', 'true'); + return originalFn(url, options); +}); + Cypress.Commands.add('logout', () => { cy.get('#logout').click({force: true}); }); diff --git a/tests-e2e/package-lock.json b/tests-e2e/package-lock.json index e00f044d1d..c9236bc1cd 100644 --- a/tests-e2e/package-lock.json +++ b/tests-e2e/package-lock.json @@ -6,21 +6,19 @@ "": { "dependencies": { "@cypress/skip-test": "^2.6.1", - "@testing-library/cypress": "7.0.6", + "@testing-library/cypress": "^8.0.3", "authenticator": "^1.1.5", "axios": "^0.21.1", "axios-retry": "^3.1.9", - "cypress": "7.7.0", - "cypress-file-upload": "5.0.8", + "cypress": "^10.6.0", "cypress-multi-reporters": "^1.5.0", - "cypress-plugin-tab": "1.0.5", - "cypress-terminal-report": "3.2.2", - "cypress-wait-until": "1.7.1", + "cypress-plugin-tab": "^1.0.5", + "cypress-terminal-report": "^4.1.1", + "cypress-wait-until": "^1.7.2", "deepmerge": "^4.2.2", "localforage": "^1.9.0", "lodash.mapkeys": "^4.6.0", "lodash.xor": "^4.5.0", - "mattermost-redux": "^5.33.1", "mocha-junit-reporter": "Phrynobatrachus/mocha-junit-reporter#9c2eccdd4d5e78f141887f3d4bd3a9a2124688bd", "mochawesome": "^6.2.2", "mochawesome-merge": "^4.2.0", @@ -36,7 +34,7 @@ "eslint-plugin-header": "3.1.1", "eslint-plugin-import": "2.23.4", "eslint-plugin-mattermost": "github:mattermost/eslint-plugin-mattermost#46ad99355644a719bf32082f472048f526605181", - "eslint-plugin-no-only-tests": "^2.6.0", + "eslint-plugin-no-only-tests": "^3.0.0", "eslint-plugin-react": "7.24.0" } }, @@ -48,70 +46,11 @@ "@babel/highlight": "^7.10.4" } }, - "node_modules/@babel/compat-data": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", - "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", - "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helpers": "^7.14.6", - "@babel/parser": "^7.14.6", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "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.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "peer": true, - "dependencies": { - "@babel/highlight": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "dev": true, "dependencies": { "@babel/types": "^7.14.5", "jsesc": "^2.5.1", @@ -121,138 +60,11 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", - "peer": true, - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", - "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", - "peer": true, - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", - "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz", - "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", - "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "regexpu-core": "^4.7.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", - "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", - "peer": 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/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", - "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", - "peer": true, - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-function-name": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "dev": true, "dependencies": { "@babel/helper-get-function-arity": "^7.14.5", "@babel/template": "^7.14.5", @@ -266,6 +78,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "dev": true, "dependencies": { "@babel/types": "^7.14.5" }, @@ -277,123 +90,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", - "peer": true, - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", - "peer": true, - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", - "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", - "peer": true, - "dependencies": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-simple-access": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", - "peer": true, - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz", - "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-wrap-function": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", - "peer": true, - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", - "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", - "peer": true, - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", - "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", - "peer": true, + "dev": true, "dependencies": { "@babel/types": "^7.14.5" }, @@ -405,6 +102,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "dev": true, "dependencies": { "@babel/types": "^7.14.5" }, @@ -420,44 +118,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz", - "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", - "peer": true, - "dependencies": { - "@babel/helper-function-name": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", - "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", - "peer": true, - "dependencies": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "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", @@ -507,6 +167,7 @@ "version": "7.14.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", + "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -514,1586 +175,1465 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz", - "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", - "peer": true, + "node_modules/@babel/runtime": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", + "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5" + "regenerator-runtime": "^0.13.4" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", - "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", - "peer": true, + "node_modules/@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { + "node_modules/@babel/template/node_modules/@babel/code-frame": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", - "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", - "peer": true, + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/highlight": "^7.14.5" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz", - "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", - "peer": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", - "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", - "peer": true, + "node_modules/@babel/traverse": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", + "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.14.7", + "@babel/types": "^7.14.5", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-export-default-from": { + "node_modules/@babel/traverse/node_modules/@babel/code-frame": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.14.5.tgz", - "integrity": "sha512-T8KZ5abXvKMjF6JcoXjgac3ElmXf0AWzJwi2O/42Jk+HmCky3D9+i1B7NPP1FblyceqTevKeV/9szeikFoaMDg==", - "peer": true, + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-export-default-from": "^7.14.5" + "@babel/highlight": "^7.14.5" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { + "node_modules/@babel/types": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", - "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", - "peer": true, + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", + "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-validator-identifier": "^7.14.5", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", - "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=0.1.90" } }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", - "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", - "peer": true, + "node_modules/@cypress/request": { + "version": "2.88.10", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", + "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 6" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", - "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@cypress/request/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", - "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", - "peer": true, + "node_modules/@cypress/skip-test": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@cypress/skip-test/-/skip-test-2.6.1.tgz", + "integrity": "sha512-X+ibefBiuOmC5gKG91wRIT0/OqXeETYvu7zXktjZ3yLeO186Y8ia0K7/gQUpAwuUi28DuqMd1+7tBQVtPkzbPA==" + }, + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "debug": "^3.1.0", + "lodash.once": "^4.1.1" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", - "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", - "peer": true, + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dependencies": { - "@babel/compat-data": "^7.14.7", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "ms": "^2.1.1" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", - "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", - "peer": true, + "node_modules/@eslint/eslintrc": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", + "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", - "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", - "peer": true, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", - "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", - "peer": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - }, + "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": ">=6.9.0" + "node": ">=10" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", - "peer": true, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=10.10.0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", - "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", - "peer": true, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, + "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": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 8" } }, - "node_modules/@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==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "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/@babel/plugin-syntax-class-properties": { - "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==", - "peer": true, + "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": { - "@babel/helper-plugin-utils": "^7.12.13" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">= 8" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "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==", - "peer": true, + "node_modules/@testing-library/cypress": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-8.0.3.tgz", + "integrity": "sha512-nY2YaSbmuPo5k6kL0iLj/pGPPfka3iwb3kpTx8QN/vOCns92Saz9wfACqB8FJzcR7+lfA4d5HUOWqmTddBzczg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/runtime": "^7.14.6", + "@testing-library/dom": "^8.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=12", + "npm": ">=6" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "cypress": "^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" } }, - "node_modules/@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==", - "peer": true, + "node_modules/@testing-library/dom": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.16.0.tgz", + "integrity": "sha512-uxF4zmnLHHDlmW4l+0WDjcgLVwCvH+OVLpD8Dfp+Bjfz85prwxWGbwXgJdLtkgjD0qfOzkJF9SmA6YZPsMYX4w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^4.2.0", + "aria-query": "^5.0.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.4.4", + "pretty-format": "^27.0.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=12" } }, - "node_modules/@babel/plugin-syntax-export-default-from": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.14.5.tgz", - "integrity": "sha512-snWDxjuaPEobRBnhpqEfZ8RMxDbHt8+87fiEioGuE+Uc0xAKgSD8QiuL3lF93hPVQfZFAcYwrrf+H5qUhike3Q==", - "peer": true, + "node_modules/@testing-library/dom/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==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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==", - "peer": true, + "node_modules/@testing-library/dom/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": { - "@babel/helper-plugin-utils": "^7.8.3" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.14.5.tgz", - "integrity": "sha512-9WK5ZwKCdWHxVuU13XNT6X73FGmutAXeor5lGFq6qhOFtMFUF4jkbijuyUdZZlpYq6E2hZeZf/u3959X9wsv0Q==", - "peer": true, + "node_modules/@testing-library/dom/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": { - "@babel/helper-plugin-utils": "^7.14.5" + "color-name": "~1.1.4" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=7.0.0" } }, - "node_modules/@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==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "node_modules/@testing-library/dom/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/@babel/plugin-syntax-jsx": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", - "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", - "peer": true, + "node_modules/@testing-library/dom/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@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==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "node_modules/@testing-library/dom/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "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==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "node_modules/@testing-library/dom/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==" }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "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==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "node_modules/@types/aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==" }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "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==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "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==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "node_modules/@types/lodash": { + "version": "4.14.171", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.171.tgz", + "integrity": "sha512-7eQ2xYLLI/LsicL2nejW9Wyko3lcpN6O/z0ZLHrEQsg280zIdCv1t/0m6UtBjUHokCGBQ3gYTbHzDkZ1xOBwwg==", + "dev": true }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "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==", - "peer": true, + "node_modules/@types/node": { + "version": "14.17.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.5.tgz", + "integrity": "sha512-bjqH2cX/O33jXT/UmReo2pM7DIJREPMnarixbQ57DOOzzFaI6D2+IcwaJQaJpv0M1E9TIhPCYVxrkcityLjlqA==" + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==" + }, + "node_modules/@types/sizzle": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", + "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==" + }, + "node_modules/@types/yauzl": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", + "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": "*" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "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==", - "peer": true, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.4.tgz", + "integrity": "sha512-s1oY4RmYDlWMlcV0kKPBaADn46JirZzvvH7c2CtAqxCY96S538JRBAzt83RrfkDheV/+G/vWNK0zek+8TB3Gmw==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@typescript-eslint/experimental-utils": "4.28.4", + "@typescript-eslint/scope-manager": "4.28.4", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { - "node": ">=6.9.0" + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@typescript-eslint/parser": "^4.0.0", + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "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==", - "peer": true, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.4.tgz", + "integrity": "sha512-OglKWOQRWTCoqMSy6pm/kpinEIgdcXYceIcH3EKWUl4S8xhFtN34GQRaAvTIZB9DD94rW7d/U7tUg3SYeDFNHA==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.28.4", + "@typescript-eslint/types": "4.28.4", + "@typescript-eslint/typescript-estree": "4.28.4", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": "*" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", - "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", - "peer": true, + "node_modules/@typescript-eslint/experimental-utils/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, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": ">=5" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", - "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "node_modules/@typescript-eslint/experimental-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": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=10" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", - "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "node_modules/@typescript-eslint/parser": { + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.30.0.tgz", + "integrity": "sha512-HJ0XuluSZSxeboLU7Q2VQ6eLlCwXPBOGnA7CqgBnz2Db3JRQYyBDJgQnop6TZ+rsbSx5gEdWhw4rE4mDa1FnZg==", + "dev": true, "peer": true, "dependencies": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5" + "@typescript-eslint/scope-manager": "4.30.0", + "@typescript-eslint/types": "4.30.0", + "@typescript-eslint/typescript-estree": "4.30.0", + "debug": "^4.3.1" }, "engines": { - "node": ">=6.9.0" + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", - "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.30.0.tgz", + "integrity": "sha512-VJ/jAXovxNh7rIXCQbYhkyV2Y3Ac/0cVHP/FruTJSAUUm4Oacmn/nkN5zfWmWFEanN4ggP0vJSHOeajtHq3f8A==", + "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@typescript-eslint/types": "4.30.0", + "@typescript-eslint/visitor-keys": "4.30.0" }, "engines": { - "node": ">=6.9.0" + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz", - "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.30.0.tgz", + "integrity": "sha512-YKldqbNU9K4WpTNwBqtAerQKLLW/X2A/j4yw92e3ZJYLx+BpKLeheyzoPfzIXHfM8BXfoleTdiYwpsvVPvHrDw==", + "dev": true, "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, "engines": { - "node": ">=6.9.0" + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz", - "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.30.0.tgz", + "integrity": "sha512-6WN7UFYvykr/U0Qgy4kz48iGPWILvYL34xXJxvDQeiRE018B7POspNRVtAZscWntEPZpFCx4hcz/XBT+erenfg==", + "dev": true, "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "globals": "^11.1.0" + "@typescript-eslint/types": "4.30.0", + "@typescript-eslint/visitor-keys": "4.30.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { - "node": ">=6.9.0" + "node": "^10.12.0 || >=12.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", - "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.30.0.tgz", + "integrity": "sha512-pNaaxDt/Ol/+JZwzP7MqWc8PJQTUhZwoee/PVlQ+iYoYhagccvoHnC9e4l+C/krQYYkENxznhVSDwClIbZVxRw==", + "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@typescript-eslint/types": "4.30.0", + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", - "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "node_modules/@typescript-eslint/parser/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, + "peer": true, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=10" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", - "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", - "peer": true, + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.4.tgz", + "integrity": "sha512-ZJBNs4usViOmlyFMt9X9l+X0WAFcDH7EdSArGqpldXu7aeZxDAuAzHiMAeI+JpSefY2INHrXeqnha39FVqXb8w==", + "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@typescript-eslint/types": "4.28.4", + "@typescript-eslint/visitor-keys": "4.28.4" }, "engines": { - "node": ">=6.9.0" + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", - "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "node_modules/@typescript-eslint/types": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.4.tgz", + "integrity": "sha512-3eap4QWxGqkYuEmVebUGULMskR6Cuoc/Wii0oSOddleP4EGx1tjLnZQ0ZP33YRoMDCs5O3j56RBV4g14T4jvww==", + "dev": true, "engines": { - "node": ">=6.9.0" + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", - "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", - "peer": true, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.4.tgz", + "integrity": "sha512-z7d8HK8XvCRyN2SNp+OXC2iZaF+O2BTquGhEYLKLx5k6p0r05ureUtgEfo5f6anLkhCxdHtCf6rPM1p4efHYDQ==", + "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@typescript-eslint/types": "4.28.4", + "@typescript-eslint/visitor-keys": "4.28.4", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { - "node": ">=6.9.0" + "node": "^10.12.0 || >=12.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.14.5.tgz", - "integrity": "sha512-KhcolBKfXbvjwI3TV7r7TkYm8oNXHNBqGOy6JDVwtecFaRoKYsUUqJdS10q0YDKW1c6aZQgO+Ys3LfGkox8pXA==", - "peer": true, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.4.tgz", + "integrity": "sha512-NIAXAdbz1XdOuzqkJHjNKXKj8QQ4cv5cxR/g0uQhCYf/6//XrmfpaYsM7PnBcNbfvTDLUkqQ5TPNm1sozDdTWg==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-flow": "^7.14.5" + "@typescript-eslint/types": "4.28.4", + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz", - "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "node_modules/@typescript-eslint/visitor-keys/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": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=10" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", - "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", - "peer": true, - "dependencies": { - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "peer": true + }, + "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": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=0.4.0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", - "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, + "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": { - "@babel/core": "^7.0.0-0" + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", - "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", - "peer": true, + "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==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", - "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", - "peer": true, + "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": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", - "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", - "peer": true, + "node_modules/ally.js": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/ally.js/-/ally.js-1.4.1.tgz", + "integrity": "sha1-n7fmuljvrE7pExyymqnuO1QLzx4=", "dependencies": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-simple-access": "^7.14.5", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "css.escape": "^1.5.0", + "platform": "1.3.3" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz", - "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", - "peer": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.5", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, + "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==", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", - "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", - "peer": true, + "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==", "dependencies": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "type-fest": "^0.21.3" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz", - "integrity": "sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg==", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5" - }, + "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==", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", - "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", - "peer": 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==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=4" } }, - "node_modules/@babel/plugin-transform-object-assign": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.14.5.tgz", - "integrity": "sha512-lvhjk4UN9xJJYB1mI5KC0/o1D5EcJXdbhVe+4fSk08D6ZN+iuAIs7LJC+71h8av9Ew4+uRq9452v9R93SFmQlQ==", + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 8" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", - "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", - "peer": true, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==" + }, + "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": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "sprintf-js": "~1.0.2" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", - "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "node_modules/aria-query": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", + "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.0" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", - "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", - "peer": true, + "node_modules/array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.4" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.5.tgz", - "integrity": "sha512-07aqY1ChoPgIxsuDviptRpVkWCSbXWmzQqcgy65C6YSFOfPFvb/DX3bBRHh7pCd/PMEEYHYWUTSVkCbkVainYQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "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": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.5.tgz", - "integrity": "sha512-7RylxNeDnxc1OleDm0F5Q/BSL+whYRbOAR+bwgCxIr0L32v7UFh/pz1DLMZideAUxKT6eMoS2zQH6fyODLEi8Q==", - "peer": true, + "node_modules/array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-jsx": "^7.14.5", - "@babel/types": "^7.14.5" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.4" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.14.5.tgz", - "integrity": "sha512-M/fmDX6n0cfHK/NLTcPmrfVAORKDhK8tyjDhyxlUjYyPYYO8FRWwuxBA3WBx8kWN/uBUuwGa3s/0+hQ9JIN3Tg==", - "peer": true, + "node_modules/array.prototype.flatmap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "function-bind": "^1.1.1" }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.4" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.14.5.tgz", - "integrity": "sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q==", - "peer": true, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "safer-buffer": "~2.1.0" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", - "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", - "peer": true, - "dependencies": { - "regenerator-transform": "^0.14.2" - }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=0.8" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", - "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz", - "integrity": "sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg==", - "peer": true, - "dependencies": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "node_modules/async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", - "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 4.0.0" } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", - "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", - "peer": true, + "node_modules/authenticator": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/authenticator/-/authenticator-1.1.5.tgz", + "integrity": "sha512-eaT0Trfxka28DkljLQDxuoSn9uDTaYIoXhZMsAw3Z54fNC7BMIsvIxfG6Y5s+y02CH59IIyY3p1EOMqeIpljWQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" + "authenticator-cli": "^1.0.5", + "notp": "^2.0.3", + "thirty-two": "0.0.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bin": { + "authenticator": "bin/authenticator.js" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", - "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", - "peer": true, + "node_modules/authenticator-cli": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/authenticator-cli/-/authenticator-cli-1.0.5.tgz", + "integrity": "sha512-8FjXzLnytd93zE9IxtOr7/uptlxGBjQhWw6qEjPPLhfq1TqrUpaBEhPYOErtHWIPuveAgzHHEBgp2bh6GdQ6Ew==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "authenticator": "^1.1.0", + "cli": "^1.0.1", + "qrcode-terminal": "^0.12.0" }, + "bin": { + "authenticator": "bin/authenticator.js" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "*" } }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", - "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", - "peer": true, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "node_modules/axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "follow-redirects": "^1.10.0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", - "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", - "peer": true, + "node_modules/axios-retry": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-3.1.9.tgz", + "integrity": "sha512-NFCoNIHq8lYkJa6ku4m+V1837TP6lCa7n79Iuf8/AqATAHYB0ISaAS1eyIenDOfHOLtym34W65Sjke2xjg2fsA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "is-retry-allowed": "^1.1.0" } }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.6.tgz", - "integrity": "sha512-XlTdBq7Awr4FYIzqhmYY80WN0V0azF74DMPyFqVHBvf81ZUgc4X7ZOpx6O8eLDK6iM5cCQzeyJw0ynTaefixRA==", - "peer": true, + "node_modules/babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.14.6", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-typescript": "^7.14.5" + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", - "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", - "peer": true, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "tweetnacl": "^0.14.3" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", - "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "node_modules/@babel/preset-env": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.7.tgz", - "integrity": "sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==", - "peer": true, + "node_modules/blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "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==", "dependencies": { - "@babel/compat-data": "^7.14.7", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-async-generator-functions": "^7.14.7", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-class-static-block": "^7.14.5", - "@babel/plugin-proposal-dynamic-import": "^7.14.5", - "@babel/plugin-proposal-export-namespace-from": "^7.14.5", - "@babel/plugin-proposal-json-strings": "^7.14.5", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-numeric-separator": "^7.14.5", - "@babel/plugin-proposal-object-rest-spread": "^7.14.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-private-methods": "^7.14.5", - "@babel/plugin-proposal-private-property-in-object": "^7.14.5", - "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", - "@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-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.14.5", - "@babel/plugin-transform-async-to-generator": "^7.14.5", - "@babel/plugin-transform-block-scoped-functions": "^7.14.5", - "@babel/plugin-transform-block-scoping": "^7.14.5", - "@babel/plugin-transform-classes": "^7.14.5", - "@babel/plugin-transform-computed-properties": "^7.14.5", - "@babel/plugin-transform-destructuring": "^7.14.7", - "@babel/plugin-transform-dotall-regex": "^7.14.5", - "@babel/plugin-transform-duplicate-keys": "^7.14.5", - "@babel/plugin-transform-exponentiation-operator": "^7.14.5", - "@babel/plugin-transform-for-of": "^7.14.5", - "@babel/plugin-transform-function-name": "^7.14.5", - "@babel/plugin-transform-literals": "^7.14.5", - "@babel/plugin-transform-member-expression-literals": "^7.14.5", - "@babel/plugin-transform-modules-amd": "^7.14.5", - "@babel/plugin-transform-modules-commonjs": "^7.14.5", - "@babel/plugin-transform-modules-systemjs": "^7.14.5", - "@babel/plugin-transform-modules-umd": "^7.14.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", - "@babel/plugin-transform-new-target": "^7.14.5", - "@babel/plugin-transform-object-super": "^7.14.5", - "@babel/plugin-transform-parameters": "^7.14.5", - "@babel/plugin-transform-property-literals": "^7.14.5", - "@babel/plugin-transform-regenerator": "^7.14.5", - "@babel/plugin-transform-reserved-words": "^7.14.5", - "@babel/plugin-transform-shorthand-properties": "^7.14.5", - "@babel/plugin-transform-spread": "^7.14.6", - "@babel/plugin-transform-sticky-regex": "^7.14.5", - "@babel/plugin-transform-template-literals": "^7.14.5", - "@babel/plugin-transform-typeof-symbol": "^7.14.5", - "@babel/plugin-transform-unicode-escapes": "^7.14.5", - "@babel/plugin-transform-unicode-regex": "^7.14.5", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.14.5", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", - "core-js-compat": "^3.15.0", - "semver": "^6.3.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "peer": true }, - "node_modules/@babel/preset-flow": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.14.5.tgz", - "integrity": "sha512-pP5QEb4qRUSVGzzKx9xqRuHUrM/jEzMqdrZpdMA+oUCRgd5zM1qGr5y5+ZgAL/1tVv1H0dyk5t4SKJntqyiVtg==", - "peer": true, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-flow-strip-types": "^7.14.5" - }, + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "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=", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "*" } }, - "node_modules/@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", - "peer": true, + "node_modules/cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@babel/preset-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.14.5.tgz", - "integrity": "sha512-u4zO6CdbRKbS9TypMqrlGH7sd2TAJppZwn3c/ZRLeO/wGsbddxgbPDUZVNrie3JWYLQ9vpineKlsrWFvO6Pwkw==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-typescript": "^7.14.5" - }, "engines": { - "node": ">=6.9.0" + "node": ">=10" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/register": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.14.5.tgz", - "integrity": "sha512-TjJpGz/aDjFGWsItRBQMOFTrmTI9tr79CHOK+KIvLeCkbxuOAk2M5QHjvruIMGoo9OuccMh5euplPzc5FjAKGg==", + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "engines": { + "node": "*" + } + }, + "node_modules/check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "peer": true, "dependencies": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.0", - "source-map-support": "^0.5.16" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" }, "engines": { - "node": ">=6.9.0" + "node": ">= 8.10.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optionalDependencies": { + "fsevents": "~2.3.1" } }, - "node_modules/@babel/runtime": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", - "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", - "dependencies": { - "regenerator-runtime": "^0.13.4" - } + "node_modules/ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==" }, - "node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - }, + "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==", "engines": { - "node": ">=6.9.0" + "node": ">=6" } }, - "node_modules/@babel/template/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==", + "node_modules/cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", "dependencies": { - "@babel/highlight": "^7.14.5" + "exit": "0.1.2", + "glob": "^7.1.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=0.2.5" } }, - "node_modules/@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", + "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==", "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", - "globals": "^11.1.0" + "restore-cursor": "^3.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/@babel/traverse/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==", + "node_modules/cli-table3": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", + "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", "dependencies": { - "@babel/highlight": "^7.14.5" + "string-width": "^4.2.0" }, "engines": { - "node": ">=6.9.0" + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" } }, - "node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "peer": true, "dependencies": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - }, - "bin": { - "watch": "cli.js" - }, - "engines": { - "node": ">=0.1.95" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/@cypress/request": { - "version": "2.88.5", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.5.tgz", - "integrity": "sha512-TzEC1XMi1hJkywWpRfD2clreTa/Z+lOrXDCxxBTBPEcY5azdPi56A6Xw+O4tWJnaJH3iIE7G5aDXZC6JgRZLcA==", + "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": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" + "color-name": "1.1.3" } }, - "node_modules/@cypress/skip-test": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@cypress/skip-test/-/skip-test-2.6.1.tgz", - "integrity": "sha512-X+ibefBiuOmC5gKG91wRIT0/OqXeETYvu7zXktjZ3yLeO186Y8ia0K7/gQUpAwuUi28DuqMd1+7tBQVtPkzbPA==" + "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/@cypress/xvfb": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", - "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "node_modules/colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" + }, + "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==", "dependencies": { - "debug": "^3.1.0", - "lodash.once": "^4.1.1" + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/@cypress/xvfb/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" + "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/@eslint/eslintrc": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", - "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "node_modules/common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "engines": { + "node": ">=4.0.0" + } + }, + "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/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", "dev": true, "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", - "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", - "dev": true, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dependencies": { - "type-fest": "^0.20.2" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8" } }, - "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, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/@hapi/hoek": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.0.tgz", - "integrity": "sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug==", - "peer": true + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "peer": true, + "node_modules/cypress": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.6.0.tgz", + "integrity": "sha512-6sOpHjostp8gcLO34p6r/Ci342lBs8S5z9/eb3ZCQ22w2cIhMWGUoGKkosabPBfKcvRS9BE4UxybBtlIs8gTQA==", + "hasInstallScript": true, "dependencies": { - "@hapi/hoek": "^9.0.0" + "@cypress/request": "^2.88.10", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^14.14.31", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.6.0", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^5.1.0", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.2", + "enquirer": "^2.3.6", + "eventemitter2": "^6.4.3", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.6", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.3.2", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": ">=12.0.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, + "node_modules/cypress-multi-reporters": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cypress-multi-reporters/-/cypress-multi-reporters-1.5.0.tgz", + "integrity": "sha512-6rJ1rk1RpjZwTeydCDc8r3iOmWj2ZEYo++oDTJHNEu7eetb3W1cYDNo5CdxF/r0bo7TLQsOEpBHOCYBZfPVt/g==", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "lodash": "^4.17.15" }, "engines": { - "node": ">=10.10.0" + "node": ">=6.0.0" + }, + "peerDependencies": { + "mocha": ">=3.1.2" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", - "dev": true - }, - "node_modules/@jest/create-cache-key-function": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-26.6.2.tgz", - "integrity": "sha512-LgEuqU1f/7WEIPYqwLPIvvHuc1sB6gMVbT6zWhin3txYUNYK/kGQrC1F2WR4gR34YlI9bBtViTm5z98RqVZAaw==", - "peer": true, + "node_modules/cypress-plugin-tab": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/cypress-plugin-tab/-/cypress-plugin-tab-1.0.5.tgz", + "integrity": "sha512-QtTJcifOVwwbeMP3hsOzQOKf3EqKsLyjtg9ZAGlYDntrCRXrsQhe4ZQGIthRMRLKpnP6/tTk6G0gJ2sZUfRliQ==", "dependencies": { - "@jest/types": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" + "ally.js": "^1.4.1" } }, - "node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "node_modules/cypress-terminal-report": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/cypress-terminal-report/-/cypress-terminal-report-4.1.1.tgz", + "integrity": "sha512-3KREZwj3oLT0qilcPsBhwPdogJMtKkpkIfweV8uBd0bltM9uHMWiv+JzsXr6rfCPzfDvDG9YB7x67TVxWn1aGQ==", "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" + "chalk": "^4.0.0", + "fs-extra": "^10.1.0", + "semver": "^7.3.5", + "tv4": "^1.3.0" }, - "engines": { - "node": ">= 10.14.2" + "peerDependencies": { + "cypress": ">=4.10.0" } }, - "node_modules/@jest/types/node_modules/ansi-styles": { + "node_modules/cypress-terminal-report/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==", @@ -2102,21 +1642,27 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "node_modules/cypress-terminal-report/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/@jest/types/node_modules/color-convert": { + "node_modules/cypress-terminal-report/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==", @@ -2127,739 +1673,660 @@ "node": ">=7.0.0" } }, - "node_modules/@jest/types/node_modules/color-name": { + "node_modules/cypress-terminal-report/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/@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, + "node_modules/cypress-terminal-report/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">= 8" + "node": ">=12" } }, - "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/cypress-wait-until": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/cypress-wait-until/-/cypress-wait-until-1.7.2.tgz", + "integrity": "sha512-uZ+M8/MqRcpf+FII/UZrU7g1qYZ4aVlHcgyVopnladyoBrpoaMJ4PKZDrdOJ05H5RHbr7s9Tid635X3E+ZLU/Q==" }, - "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, + "node_modules/cypress/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==", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/@react-native-community/cli": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-5.0.1.tgz", - "integrity": "sha512-9VzSYUYSEqxEH5Ib2UNSdn2eyPiYZ4T7Y79o9DKtRBuSaUIwbCUdZtIm+UUjBpLS1XYBkW26FqL8/UdZDmQvXw==", - "peer": true, + "node_modules/cypress/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dependencies": { - "@react-native-community/cli-debugger-ui": "^5.0.1", - "@react-native-community/cli-hermes": "^5.0.1", - "@react-native-community/cli-server-api": "^5.0.1", - "@react-native-community/cli-tools": "^5.0.1", - "@react-native-community/cli-types": "^5.0.1", - "appdirsjs": "^1.2.4", - "chalk": "^3.0.0", - "command-exists": "^1.2.8", - "commander": "^2.19.0", - "cosmiconfig": "^5.1.0", - "deepmerge": "^3.2.0", - "envinfo": "^7.7.2", - "execa": "^1.0.0", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0", - "glob": "^7.1.3", - "graceful-fs": "^4.1.3", - "joi": "^17.2.1", - "leven": "^3.1.0", - "lodash": "^4.17.15", - "metro": "^0.64.0", - "metro-config": "^0.64.0", - "metro-core": "^0.64.0", - "metro-react-native-babel-transformer": "^0.64.0", - "metro-resolver": "^0.64.0", - "metro-runtime": "^0.64.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "node-stream-zip": "^1.9.1", - "ora": "^3.4.0", - "pretty-format": "^26.6.2", - "prompts": "^2.4.0", - "semver": "^6.3.0", - "serve-static": "^1.13.1", - "strip-ansi": "^5.2.0", - "sudo-prompt": "^9.0.0", - "wcwidth": "^1.0.1" - }, - "bin": { - "react-native": "build/bin.js" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=12" - }, - "peerDependencies": { - "react-native": ">=0.64.0-rc.0 || 0.0.0-*" - } - }, - "node_modules/@react-native-community/cli-debugger-ui": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-5.0.1.tgz", - "integrity": "sha512-5gGKaaXYOVE423BUqxIfvfAVSj5Cg1cU/TpGbeg/iqpy2CfqyWqJB3tTuVUbOOiOvR5wbU8tti6pIi1pchJ+oA==", - "peer": true, - "dependencies": { - "serve-static": "^1.13.1" - } - }, - "node_modules/@react-native-community/cli-hermes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-5.0.1.tgz", - "integrity": "sha512-nD+ZOFvu5MfjLB18eDJ01MNiFrzj8SDtENjGpf0ZRFndOWASDAmU54/UlU/wj8OzTToK1+S1KY7j2P2M1gleww==", - "peer": true, - "dependencies": { - "@react-native-community/cli-platform-android": "^5.0.1", - "@react-native-community/cli-tools": "^5.0.1", - "chalk": "^3.0.0", - "hermes-profile-transformer": "^0.0.6", - "ip": "^1.1.5" + "node": ">=10" } }, - "node_modules/@react-native-community/cli-platform-android": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-5.0.1.tgz", - "integrity": "sha512-qv9GJX6BJ+Y4qvV34vgxKwwN1cnveXUdP6y2YmTW7XoAYs5YUzKqHajpY58EyucAL2y++6+573t5y4U/9IIoww==", - "peer": true, - "dependencies": { - "@react-native-community/cli-tools": "^5.0.1", - "chalk": "^3.0.0", - "execa": "^1.0.0", - "fs-extra": "^8.1.0", - "glob": "^7.1.3", - "jetifier": "^1.6.2", - "lodash": "^4.17.15", - "logkitty": "^0.7.1", - "slash": "^3.0.0", - "xmldoc": "^1.1.2" - } - }, - "node_modules/@react-native-community/cli-platform-android/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==", - "peer": true, + "node_modules/cypress/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": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "color-name": "~1.1.4" }, "engines": { - "node": ">=4.8" + "node": ">=7.0.0" } }, - "node_modules/@react-native-community/cli-platform-android/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "peer": 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" - }, - "engines": { - "node": ">=6" - } + "node_modules/cypress/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/@react-native-community/cli-platform-android/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==", - "peer": true, + "node_modules/cypress/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/@react-native-community/cli-platform-android/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==", - "peer": true, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dependencies": { - "pump": "^3.0.0" + "assert-plus": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">=0.10" } }, - "node_modules/@react-native-community/cli-platform-android/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "peer": true, + "node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/@react-native-community/cli-platform-android/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } + "node_modules/dayjs": { + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz", + "integrity": "sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw==" }, - "node_modules/@react-native-community/cli-platform-android/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=", - "peer": true, + "node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dependencies": { - "path-key": "^2.0.0" + "ms": "2.1.2" }, "engines": { - "node": ">=4" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@react-native-community/cli-platform-android/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "peer": true, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@react-native-community/cli-platform-android/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "peer": true, - "bin": { - "semver": "bin/semver" + "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==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@react-native-community/cli-platform-android/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=", - "peer": true, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, "dependencies": { - "shebang-regex": "^1.0.0" + "object-keys": "^1.0.12" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/@react-native-community/cli-platform-android/node_modules/shebang-regex": { + "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "peer": true, + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "engines": { - "node": ">=0.10.0" + "node": ">=0.4.0" } }, - "node_modules/@react-native-community/cli-platform-android/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==", - "peer": true, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "engines": { - "node": ">= 4.0.0" + "node": ">=0.3.1" } }, - "node_modules/@react-native-community/cli-platform-android/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "peer": true, + "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": { - "isexe": "^2.0.0" + "path-type": "^4.0.0" }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">=8" } }, - "node_modules/@react-native-community/cli-platform-ios": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-5.0.1.tgz", - "integrity": "sha512-Nr/edBEYJfElgBNvjDevs2BuDicsvQaM8nYkTGgp33pyuCZRBxsYxQqfsNmnLalTzcYaebjWj6AnjUSxzQBWqg==", - "peer": true, - "dependencies": { - "@react-native-community/cli-tools": "^5.0.1", - "chalk": "^3.0.0", - "glob": "^7.1.3", - "js-yaml": "^3.13.1", - "lodash": "^4.17.15", - "plist": "^3.0.1", - "xcode": "^2.0.0" + "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/@react-native-community/cli-server-api": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-5.0.1.tgz", - "integrity": "sha512-OOxL+y9AOZayQzmSW+h5T54wQe+QBc/f67Y9QlWzzJhkKJdYx+S4VOooHoD5PFJzGbYaxhu2YF17p517pcEIIA==", - "peer": true, + "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": { - "@react-native-community/cli-debugger-ui": "^5.0.1", - "@react-native-community/cli-tools": "^5.0.1", - "compression": "^1.7.1", - "connect": "^3.6.5", - "errorhandler": "^1.5.0", - "nocache": "^2.1.0", - "pretty-format": "^26.6.2", - "serve-static": "^1.13.1", - "ws": "^1.1.0" + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@react-native-community/cli-server-api/node_modules/ws": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", - "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", - "peer": true, - "dependencies": { - "options": ">=0.0.5", - "ultron": "1.0.x" - } + "node_modules/dom-accessibility-api": { + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", + "integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==" }, - "node_modules/@react-native-community/cli-tools": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-5.0.1.tgz", - "integrity": "sha512-XOX5w98oSE8+KnkMZZPMRT7I5TaP8fLbDl0tCu40S7Epz+Zz924n80fmdu6nUDIfPT1nV6yH1hmHmWAWTDOR+Q==", - "peer": true, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dependencies": { - "chalk": "^3.0.0", - "lodash": "^4.17.15", - "mime": "^2.4.1", - "node-fetch": "^2.6.0", - "open": "^6.2.0", - "shell-quote": "1.6.1" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/@react-native-community/cli-types": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-5.0.1.tgz", - "integrity": "sha512-BesXnuFFlU/d1F3+sHhvKt8fUxbQlAbZ3hhMEImp9A6sopl8TEtryUGJ1dbazGjRXcADutxvjwT/i3LJVTIQug==", - "peer": true, + "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==" + }, + "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==", "dependencies": { - "ora": "^3.4.0" + "once": "^1.4.0" } }, - "node_modules/@react-native-community/cli/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==", - "peer": true, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dependencies": { + "ansi-colors": "^4.1.1" + }, "engines": { - "node": ">=6" + "node": ">=8.6" } }, - "node_modules/@react-native-community/cli/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==", - "peer": true - }, - "node_modules/@react-native-community/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==", - "peer": true, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, "dependencies": { - "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" + "is-arrayish": "^0.2.1" } }, - "node_modules/@react-native-community/cli/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==", - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@react-native-community/cli/node_modules/deepmerge": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", - "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@react-native-community/cli/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "peer": true, + "node_modules/es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "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" + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "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" }, "engines": { - "node": ">=6" - } - }, - "node_modules/@react-native-community/cli/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==", - "peer": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "node": ">= 0.4" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@react-native-community/cli/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==", - "peer": true, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@react-native-community/cli/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==", - "peer": true, - "dependencies": { - "pump": "^3.0.0" + "node": ">= 0.4" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@react-native-community/cli/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/@react-native-community/cli/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, - "node_modules/@react-native-community/cli/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==", - "peer": true, - "dependencies": { - "p-locate": "^4.1.0" - }, + "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=", "engines": { - "node": ">=8" + "node": ">=0.8.0" } }, - "node_modules/@react-native-community/cli/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=", - "peer": true, + "node_modules/eslint": { + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.30.0.tgz", + "integrity": "sha512-VLqz80i3as3NdloY44BQSJpFw534L9Oh+6zJOUaViV4JPd+DaHwutqP7tcpkW3YiXbK6s05RZl7yl7cQn+lijg==", + "dev": true, "dependencies": { - "path-key": "^2.0.0" + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.2", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "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": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@react-native-community/cli/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==", - "peer": true, - "dependencies": { - "p-try": "^2.0.0" + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=6" + "node": "^10.12.0 || >=12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/@react-native-community/cli/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==", - "peer": true, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "debug": "^2.6.9", + "resolve": "^1.13.1" } }, - "node_modules/@react-native-community/cli/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==", - "peer": true, - "engines": { - "node": ">=6" + "node_modules/eslint-import-resolver-node/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/@react-native-community/cli/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==", - "peer": true, - "engines": { - "node": ">=8" - } + "node_modules/eslint-import-resolver-node/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/@react-native-community/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=", - "peer": true, + "node_modules/eslint-module-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", + "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, "engines": { "node": ">=4" } }, - "node_modules/@react-native-community/cli/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true, - "bin": { - "semver": "bin/semver.js" + "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/@react-native-community/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=", - "peer": true, + "node_modules/eslint-plugin-cypress": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.11.3.tgz", + "integrity": "sha512-hOoAid+XNFtpvOzZSNWP5LDrQBEJwbZwjib4XJ1KcRYKjeVj0mAmPmucG4Egli4j/aruv+Ow/acacoloWWCl9Q==", + "dev": true, "dependencies": { - "shebang-regex": "^1.0.0" + "globals": "^11.12.0" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "eslint": ">= 3.2.1" } }, - "node_modules/@react-native-community/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=", - "peer": true, - "engines": { - "node": ">=0.10.0" + "node_modules/eslint-plugin-header": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", + "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==", + "dev": true, + "peerDependencies": { + "eslint": ">=7.7.0" } }, - "node_modules/@react-native-community/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==", - "peer": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, + "node_modules/eslint-plugin-import": { + "version": "2.23.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", + "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.1", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.4.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.9.0" + }, "engines": { - "node": ">=6" + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" } }, - "node_modules/@react-native-community/cli/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==", - "peer": true, - "engines": { - "node": ">= 4.0.0" + "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/@react-native-community/cli/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "peer": true, + "node_modules/eslint-plugin-import/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": { - "isexe": "^2.0.0" + "esutils": "^2.0.2" }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@react-native-community/netinfo": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@react-native-community/netinfo/-/netinfo-4.7.0.tgz", - "integrity": "sha512-a/sDB+AsLEUNmhAUlAaTYeXKyQdFGBUfatqKkX5jluBo2CB3OAuTHfm7rSjcaLB9EmG5iSq3fOTpync2E7EYTA==", - "peerDependencies": { - "react-native": ">=0.59" - } + "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/@react-native/assets": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@react-native/assets/-/assets-1.0.0.tgz", - "integrity": "sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ==", - "peer": true + "node_modules/eslint-plugin-import/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/@react-native/normalize-color": { + "node_modules/eslint-plugin-mattermost": { + "name": "eslint-config-mattermost", "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-1.0.0.tgz", - "integrity": "sha512-xUNRvNmCl3UGCPbbHvfyFMnpvLPoOjDCcp5bT9m2k+TF/ZBklEQwhPZlkrxRx2NhgFh1X3a5uL7mJ7ZR+8G7Qg==", - "peer": true + "resolved": "git+ssh://git@github.com/mattermost/eslint-plugin-mattermost.git#46ad99355644a719bf32082f472048f526605181", + "integrity": "sha512-XIsRlgdUmVaJ+9P5sy45uN/cVzi5rPP2w/w06yuEIEYAH6CuVzjiY/dBjDqFKOi/Ebnoo40ur2oCtD3+yzrgVw==", + "dev": true, + "license": "Apache 2.0" }, - "node_modules/@react-native/polyfills": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@react-native/polyfills/-/polyfills-1.0.0.tgz", - "integrity": "sha512-0jbp4RxjYopTsIdLl+/Fy2TiwVYHy4mgeu07DG4b/LyM0OS/+lPP5c9sbnt/AMlnF6qz2JRZpPpGw1eMNS6A4w==", - "peer": true + "node_modules/eslint-plugin-no-only-tests": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.0.0.tgz", + "integrity": "sha512-I0PeXMs1vu21ap45hey4HQCJRqpcoIvGcNTPJe+UhUm8TwjQ6//mCrDqF8q0WS6LgmRDwQ4ovQej0AQsAHb5yg==", + "dev": true, + "engines": { + "node": ">=5.0.0" + } }, - "node_modules/@sideway/address": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.2.tgz", - "integrity": "sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA==", - "peer": true, + "node_modules/eslint-plugin-react": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz", + "integrity": "sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==", + "dev": true, "dependencies": { - "@hapi/hoek": "^9.0.0" + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.4", + "object.fromentries": "^2.0.4", + "object.values": "^1.1.4", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "string.prototype.matchall": "^4.0.5" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7" } }, - "node_modules/@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", - "peer": true - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "peer": true - }, - "node_modules/@testing-library/cypress": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-7.0.6.tgz", - "integrity": "sha512-atnjqlkEt6spU4Mv7evvpA8fMXeRw7AN2uTKOR1dP6WBvBixVwAYMZY+1fMOaZULWAj9vGLCXXvmw++u3TxuCQ==", + "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": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^7.28.1" + "esutils": "^2.0.2" }, "engines": { - "node": ">=10", - "npm": ">=6" + "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", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" }, - "peerDependencies": { - "cypress": "^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@testing-library/dom": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.29.2.tgz", - "integrity": "sha512-CBMELfyY1jKdtLcSRmEnZWRzRkCRVSNPTzhzrn8wY8OnzUo7Pe/W+HgLzt4TDnWIPYeusHBodf9wUjJF48kPmA==", + "node_modules/eslint-scope": { + "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": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^4.2.0", - "aria-query": "^4.2.2", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.4", - "lz-string": "^1.4.4", - "pretty-format": "^26.6.2" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">=10" + "node": ">=8.0.0" } }, - "node_modules/@testing-library/dom/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "eslint-visitor-keys": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" } }, - "node_modules/@testing-library/dom/node_modules/chalk/node_modules/ansi-styles": { + "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/@testing-library/dom/node_modules/chalk/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==", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@testing-library/dom/node_modules/color-convert": { + "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" }, @@ -2867,1082 +2334,663 @@ "node": ">=7.0.0" } }, - "node_modules/@testing-library/dom/node_modules/color-name": { + "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==" - }, - "node_modules/@types/aria-query": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.0.tgz", - "integrity": "sha512-iIgQNzCm0v7QMhhe4Jjn9uRh+I6GoPmt03CbEtwx3ao8/EfoQcmgtqH4vQ5Db/lxiIGaWDv6nwvunuh0RyX0+A==" - }, - "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==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "peer": true, - "dependencies": { - "@types/node": "*" + "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/@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dependencies": { - "@types/istanbul-lib-coverage": "*" + "node_modules/eslint/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/@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "node_modules/eslint/node_modules/globals": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "dev": true, "dependencies": { - "@types/istanbul-lib-report": "*" + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "node_modules/@types/lodash": { - "version": "4.14.171", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.171.tgz", - "integrity": "sha512-7eQ2xYLLI/LsicL2nejW9Wyko3lcpN6O/z0ZLHrEQsg280zIdCv1t/0m6UtBjUHokCGBQ3gYTbHzDkZ1xOBwwg==", - "dev": true - }, - "node_modules/@types/node": { - "version": "14.17.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.5.tgz", - "integrity": "sha512-bjqH2cX/O33jXT/UmReo2pM7DIJREPMnarixbQ57DOOzzFaI6D2+IcwaJQaJpv0M1E9TIhPCYVxrkcityLjlqA==" - }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz", - "integrity": "sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg==" - }, - "node_modules/@types/sizzle": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", - "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==" - }, - "node_modules/@types/yargs": { - "version": "15.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz", - "integrity": "sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==" - }, - "node_modules/@types/yauzl": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", - "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.4.tgz", - "integrity": "sha512-s1oY4RmYDlWMlcV0kKPBaADn46JirZzvvH7c2CtAqxCY96S538JRBAzt83RrfkDheV/+G/vWNK0zek+8TB3Gmw==", + "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, - "dependencies": { - "@typescript-eslint/experimental-utils": "4.28.4", - "@typescript-eslint/scope-manager": "4.28.4", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.4.tgz", - "integrity": "sha512-OglKWOQRWTCoqMSy6pm/kpinEIgdcXYceIcH3EKWUl4S8xhFtN34GQRaAvTIZB9DD94rW7d/U7tUg3SYeDFNHA==", + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.28.4", - "@typescript-eslint/types": "4.28.4", - "@typescript-eslint/typescript-estree": "4.28.4", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" }, "engines": { "node": "^10.12.0 || >=12.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" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" + "engines": { + "node": ">=4" } }, - "node_modules/@typescript-eslint/experimental-utils/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==", + "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": { - "eslint-visitor-keys": "^2.0.0" + "estraverse": "^5.1.0" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" + "node": ">=0.10" } }, - "node_modules/@typescript-eslint/experimental-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==", + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true, "engines": { - "node": ">=10" + "node": ">=4.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "4.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.30.0.tgz", - "integrity": "sha512-HJ0XuluSZSxeboLU7Q2VQ6eLlCwXPBOGnA7CqgBnz2Db3JRQYyBDJgQnop6TZ+rsbSx5gEdWhw4rE4mDa1FnZg==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "4.30.0", - "@typescript-eslint/types": "4.30.0", - "@typescript-eslint/typescript-estree": "4.30.0", - "debug": "^4.3.1" + "estraverse": "^5.2.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=4.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "4.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.30.0.tgz", - "integrity": "sha512-VJ/jAXovxNh7rIXCQbYhkyV2Y3Ac/0cVHP/FruTJSAUUm4Oacmn/nkN5zfWmWFEanN4ggP0vJSHOeajtHq3f8A==", + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true, - "peer": true, - "dependencies": { - "@typescript-eslint/types": "4.30.0", - "@typescript-eslint/visitor-keys": "4.30.0" - }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=4.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "4.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.30.0.tgz", - "integrity": "sha512-YKldqbNU9K4WpTNwBqtAerQKLLW/X2A/j4yw92e3ZJYLx+BpKLeheyzoPfzIXHfM8BXfoleTdiYwpsvVPvHrDw==", + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "peer": true, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=4.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "4.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.30.0.tgz", - "integrity": "sha512-6WN7UFYvykr/U0Qgy4kz48iGPWILvYL34xXJxvDQeiRE018B7POspNRVtAZscWntEPZpFCx4hcz/XBT+erenfg==", + "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, - "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter2": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.3.tgz", + "integrity": "sha512-t0A2msp6BzOf+QAcI6z9XMktLj52OjGQg+8SJH6v5+3uxNpWYRR3wQmfA+6xtMU9kOC59qk9licus5dYcrYkMQ==" + }, + "node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dependencies": { - "@typescript-eslint/types": "4.30.0", - "@typescript-eslint/visitor-keys": "4.30.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=10" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "4.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.30.0.tgz", - "integrity": "sha512-pNaaxDt/Ol/+JZwzP7MqWc8PJQTUhZwoee/PVlQ+iYoYhagccvoHnC9e4l+C/krQYYkENxznhVSDwClIbZVxRw==", - "dev": true, - "peer": true, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", "dependencies": { - "@typescript-eslint/types": "4.30.0", - "eslint-visitor-keys": "^2.0.0" + "pify": "^2.2.0" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=4" } }, - "node_modules/@typescript-eslint/parser/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, - "peer": true, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "engines": { - "node": ">=10" + "node": ">= 0.8.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.4.tgz", - "integrity": "sha512-ZJBNs4usViOmlyFMt9X9l+X0WAFcDH7EdSArGqpldXu7aeZxDAuAzHiMAeI+JpSefY2INHrXeqnha39FVqXb8w==", - "dev": true, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dependencies": { - "@typescript-eslint/types": "4.28.4", - "@typescript-eslint/visitor-keys": "4.28.4" + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "bin": { + "extract-zip": "cli.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.4.tgz", - "integrity": "sha512-3eap4QWxGqkYuEmVebUGULMskR6Cuoc/Wii0oSOddleP4EGx1tjLnZQ0ZP33YRoMDCs5O3j56RBV4g14T4jvww==", - "dev": true, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": ">= 10.17.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "optionalDependencies": { + "@types/yauzl": "^2.9.1" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.4.tgz", - "integrity": "sha512-z7d8HK8XvCRyN2SNp+OXC2iZaF+O2BTquGhEYLKLx5k6p0r05ureUtgEfo5f6anLkhCxdHtCf6rPM1p4efHYDQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.28.4", - "@typescript-eslint/visitor-keys": "4.28.4", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.4.tgz", - "integrity": "sha512-NIAXAdbz1XdOuzqkJHjNKXKj8QQ4cv5cxR/g0uQhCYf/6//XrmfpaYsM7PnBcNbfvTDLUkqQ5TPNm1sozDdTWg==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/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": { - "@typescript-eslint/types": "4.28.4", - "eslint-visitor-keys": "^2.0.0" + "@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.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=8" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "node_modules/fast-json-stable-stringify": { "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" - } + "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/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "peer": 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/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "peer": true, + "node_modules/fastq": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz", + "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==", + "dev": true, "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" + "reusify": "^1.0.4" } }, - "node_modules/absolute-path": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/absolute-path/-/absolute-path-0.0.0.tgz", - "integrity": "sha1-p4di+9rftSl76ZsV01p4Wy8JW/c=", - "peer": true + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dependencies": { + "pend": "~1.2.0" + } }, - "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "peer": true, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "escape-string-regexp": "^1.0.5" }, "engines": { - "node": ">= 0.6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "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, - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=0.4.0" - } - }, - "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": "^10.12.0 || >=12.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==", + "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==", "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "locate-path": "^2.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ally.js": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/ally.js/-/ally.js-1.4.1.tgz", - "integrity": "sha1-n7fmuljvrE7pExyymqnuO1QLzx4=", - "dependencies": { - "css.escape": "^1.5.0", - "platform": "1.3.3" + "engines": { + "node": ">=4" } }, - "node_modules/anser": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", - "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "peer": true - }, - "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==", - "engines": { - "node": ">=6" + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "peer": true, + "bin": { + "flat": "cli.js" } }, - "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==", + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, "dependencies": { - "type-fest": "^0.21.3" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/ansi-fragments": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", - "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", - "peer": true, - "dependencies": { - "colorette": "^1.0.7", - "slice-ansi": "^2.0.0", - "strip-ansi": "^5.0.0" - } + "node_modules/flatted": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.1.tgz", + "integrity": "sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg==", + "dev": true }, - "node_modules/ansi-fragments/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==", - "peer": true, + "node_modules/follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { - "node": ">=6" + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/ansi-fragments/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==", - "peer": true, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "engines": { - "node": ">=4" + "node": "*" } }, - "node_modules/ansi-fragments/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==", - "peer": true, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=6" + "node": ">= 0.12" } }, - "node_modules/ansi-fragments/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==", - "peer": true, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dependencies": { - "ansi-regex": "^4.1.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=6" - } - }, - "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==", - "engines": { - "node": ">=8" + "node": ">=10" } }, - "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==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "peer": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, "engines": { - "node": ">= 8" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/appdirsjs": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.5.tgz", - "integrity": "sha512-UyaAyzj+7XLoKhbXJi4zoAw8IDXCiLNCKfQEiuCsCCTkDmiG1vpCliQn/MoUvO3DZqCN1i6gOahokcFtNSIrVA==", - "peer": true + "node_modules/fsu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fsu/-/fsu-1.1.1.tgz", + "integrity": "sha512-xQVsnjJ/5pQtcKh+KjUoZGzVWn4uNkchxTF6Lwjr4Gf7nQr8fmUfhKJ62zE77+xQg9xnxi5KUps7XGs+VC986A==" }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==" + "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/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "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/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, "dependencies": { - "sprintf-js": "~1.0.2" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dependencies": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" + "pump": "^3.0.0" }, "engines": { - "node": ">=6.0" + "node": ">=8" } }, - "node_modules/aria-query/node_modules/@babel/runtime-corejs3": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.12.5.tgz", - "integrity": "sha512-roGr54CsTmNPPzZoCP1AmDXuBoNao7tnSA83TXTwt+UK5QVyh1DIJnrgYRPWKCF2flqZQXwa7Yr8v7VmLzF0YQ==", + "node_modules/getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", "dependencies": { - "core-js-pure": "^3.0.0", - "regenerator-runtime": "^0.13.4" + "async": "^3.2.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=", - "peer": true, - "engines": { - "node": ">=0.10.0" + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.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==", - "peer": true, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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": ">=0.10.0" + "node": "*" } }, - "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=", - "peer": 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==", + "dependencies": { + "is-glob": "^4.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", - "peer": true - }, - "node_modules/array-includes": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", - "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", - "dev": true, + "node_modules/global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.5" + "ini": "2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", - "peer": true - }, - "node_modules/array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", - "peer": true - }, - "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==", + "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": ">=8" - } - }, - "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=", - "peer": true, - "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/array.prototype.flat": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", - "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "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": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" + "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": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/array.prototype.flatmap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", - "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "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, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "function-bind": "^1.1.1" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "peer": true - }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dependencies": { - "safer-buffer": "~2.1.0" + "node": ">= 4" } }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "engines": { - "node": ">=0.8" - } + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" }, - "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=", + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=4.x" } }, - "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==", - "peer": true, + "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": { - "tslib": "^2.0.1" + "function-bind": "^1.1.1" }, "engines": { - "node": ">=4" - } - }, - "node_modules/ast-types/node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", - "peer": true - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "engines": { - "node": ">=8" + "node": ">= 0.4.0" } }, - "node_modules/async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" - }, - "node_modules/async-limiter": { + "node_modules/has-bigints": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "peer": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "peer": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/authenticator": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/authenticator/-/authenticator-1.1.5.tgz", - "integrity": "sha512-eaT0Trfxka28DkljLQDxuoSn9uDTaYIoXhZMsAw3Z54fNC7BMIsvIxfG6Y5s+y02CH59IIyY3p1EOMqeIpljWQ==", - "dependencies": { - "authenticator-cli": "^1.0.5", - "notp": "^2.0.3", - "thirty-two": "0.0.2" - }, - "bin": { - "authenticator": "bin/authenticator.js" - } - }, - "node_modules/authenticator-cli": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/authenticator-cli/-/authenticator-cli-1.0.5.tgz", - "integrity": "sha512-8FjXzLnytd93zE9IxtOr7/uptlxGBjQhWw6qEjPPLhfq1TqrUpaBEhPYOErtHWIPuveAgzHHEBgp2bh6GdQ6Ew==", - "dependencies": { - "authenticator": "^1.1.0", - "cli": "^1.0.1", - "qrcode-terminal": "^0.12.0" - }, - "bin": { - "authenticator": "bin/authenticator.js" + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "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": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "node_modules/axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", - "dependencies": { - "follow-redirects": "^1.10.0" - } - }, - "node_modules/axios-retry": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-3.1.9.tgz", - "integrity": "sha512-NFCoNIHq8lYkJa6ku4m+V1837TP6lCa7n79Iuf8/AqATAHYB0ISaAS1eyIenDOfHOLtym34W65Sjke2xjg2fsA==", - "dependencies": { - "is-retry-allowed": "^1.1.0" - } - }, - "node_modules/babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "peer": true, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "node_modules/babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - }, "engines": { - "node": ">=6" - } - }, - "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==", - "peer": true, - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", - "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.2", - "semver": "^6.1.1" + "node": ">= 0.4" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "peer": true, "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz", - "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", - "peer": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.2.2", - "core-js-compat": "^3.14.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", - "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", - "peer": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.2.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-syntax-trailing-function-commas": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", - "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==", - "peer": true - }, - "node_modules/babel-preset-fbjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", - "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", - "peer": true, - "dependencies": { - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-syntax-class-properties": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoped-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-member-expression-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-super": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-property-literals": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.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=", - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" + "he": "bin/he" } }, - "node_modules/babel-runtime/node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": true - }, - "node_modules/babel-runtime/node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "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/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "peer": true, + "node_modules/http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", "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" + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, - "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=", - "peer": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "engines": { - "node": ">=0.10.0" + "node": ">=8.12.0" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -3958,254 +3006,215 @@ } ] }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dependencies": { - "tweetnacl": "^0.14.3" + "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/big-integer": { - "version": "1.6.48", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", - "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", - "peer": true, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "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": ">=0.6" + "node": ">=6" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "peer": true, + "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==", "engines": { "node": ">=8" } }, - "node_modules/blob-util": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", - "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==" + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/bplist-creator": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", - "integrity": "sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==", - "peer": true, - "dependencies": { - "stream-buffers": "~2.2.0" + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" } }, - "node_modules/bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "peer": true, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, "dependencies": { - "big-integer": "^1.6.44" + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" }, "engines": { - "node": ">= 5.10.0" + "node": ">= 0.4" } }, - "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==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "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-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "peer": true, "dependencies": { - "fill-range": "^7.0.1" + "binary-extensions": "^2.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "peer": true - }, - "node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "peer": true, + "node_modules/is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "bin": { - "browserslist": "cli.js" + "call-bind": "^1.0.2" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "peer": true, - "dependencies": { - "node-int64": "^0.4.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } + "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==" }, - "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=", + "node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true, "engines": { - "node": "*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "peer": true - }, - "node_modules/bytes": { + "node_modules/is-ci": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "peer": true, - "engines": { - "node": ">= 0.8" + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "dependencies": { + "ci-info": "^3.1.1" + }, + "bin": { + "is-ci": "bin.js" } }, - "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==", - "peer": true, + "node_modules/is-core-module": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", + "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", + "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" + "has": "^1.0.3" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "node_modules/is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true, "engines": { - "node": ">=6" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "peer": true, - "dependencies": { - "callsites": "^2.0.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=", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/caller-callsite/node_modules/callsites": { + "node_modules/is-fullwidth-code-point": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "peer": true, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "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=", - "peer": true, + "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==", "dependencies": { - "caller-callsite": "^2.0.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=4" - } - }, - "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": ">=0.10.0" } }, - "node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "peer": true, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, "engines": { "node": ">=10" }, @@ -4213,843 +3222,823 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001245", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001245.tgz", - "integrity": "sha512-768fM9j1PKXpOCKws6eTo3RHmvTUsG9UrpT4WoREFeZgJBTi4/X9g565azS/rVUGtqb8nt7FjLeF5u4kukERnA==", - "peer": true, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "peer": true, - "dependencies": { - "rsvp": "^4.8.4" - }, + "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==", "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=0.12.0" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "node_modules/is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "engines": { "node": ">=8" } }, - "node_modules/chalk/node_modules/ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dependencies": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - }, + "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==", + "peer": true, "engines": { "node": ">=8" } }, - "node_modules/chalk/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==", + "node_modules/is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, "dependencies": { - "color-name": "~1.1.4" + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" }, "engines": { - "node": ">=7.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/chalk/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/is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=", + "node_modules/is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "peer": true, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 0.4" }, - "optionalDependencies": { - "fsevents": "~2.3.1" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==" + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, - "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==", - "peer": true, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "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==" + }, + "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": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "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=", - "peer": true, - "dependencies": { - "is-descriptor": "^0.1.0" + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "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": ">=0.10.0" + "node": ">=4" } }, - "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=", - "peer": true, + "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/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "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/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, "dependencies": { - "kind-of": "^3.0.2" + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "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=", - "peer": true, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dependencies": { - "is-buffer": "^1.1.5" + "universalify": "^2.0.0" }, - "engines": { - "node": ">=0.10.0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "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=", - "peer": true, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "engines": [ + "node >=0.6.0" + ], "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.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=", - "peer": true, + "node_modules/jsx-ast-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", + "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", + "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "array-includes": "^3.1.2", + "object.assign": "^4.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=4.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==", - "peer": 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==", - "peer": true, - "engines": { - "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==", + "node_modules/lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=", "engines": { - "node": ">=6" + "node": "> 0.8" } }, - "node_modules/cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "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": { - "exit": "0.1.2", - "glob": "^7.1.1" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">=0.2.5" + "node": ">= 0.8.0" } }, - "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==", + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", - "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", - "peer": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "immediate": "~3.0.5" } }, - "node_modules/cli-table3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", - "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", + "node_modules/listr2": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.10.0.tgz", + "integrity": "sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw==", "dependencies": { - "object-assign": "^4.1.0", - "string-width": "^4.2.0" + "cli-truncate": "^2.1.0", + "colorette": "^1.2.2", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.7", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": "10.* || >= 12.*" + "node": ">=10.0.0" }, - "optionalDependencies": { - "colors": "^1.1.2" + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" } }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "node": ">=4" } }, - "node_modules/clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "node_modules/load-json-file/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": ">=0.8" + "node": ">=4" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "peer": true, + "node_modules/localforage": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.9.0.tgz", + "integrity": "sha512-rR1oyNrKulpe+VM9cYmcFn6tsHuokyVHFaCM3+osEmxaHTbEk8oQu6eGDfS6DQLWi/N67XRmB8ECG37OES368g==", "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" + "lie": "3.1.1" } }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "peer": true, + "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": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "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/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "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/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true }, - "node_modules/colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" + "node_modules/lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=" }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "engines": { - "node": ">=0.1.90" - } + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" }, - "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==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } + "node_modules/lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=" }, - "node_modules/command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "peer": true + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, - "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/lodash.mapkeys": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapkeys/-/lodash.mapkeys-4.6.0.tgz", + "integrity": "sha1-3yz6Ix18V8eorQA6va1dc9PqUZU=" }, - "node_modules/common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", - "engines": { - "node": ">=4.0.0" - } + "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/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "peer": true + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" }, - "node_modules/component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "peer": true, + "node_modules/lodash.xor": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.xor/-/lodash.xor-4.5.0.tgz", + "integrity": "sha512-sVN2zimthq7aZ5sPGXnSz32rZPuqcparVW50chJQe+mzTYV+IsxSsl/2gnkWWE2Of7K3myBQBqtLKOUEHJKRsQ==" + }, + "node_modules/log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", "dependencies": { - "mime-db": ">= 1.43.0 < 2" + "chalk": "^4.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "peer": true, + "node_modules/log-symbols/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==", "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "peer": true + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/compression/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==", - "peer": true + "node_modules/log-symbols/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/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/log-symbols/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/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "peer": true, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" }, "engines": { - "node": ">= 0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, + "node_modules/log-update/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==", "dependencies": { - "ms": "2.0.0" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "peer": true - }, - "node_modules/convert-source-map": { - "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==", - "peer": true, + "node_modules/log-update/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": { - "safe-buffer": "~5.1.1" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/convert-source-map/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==", - "peer": true + "node_modules/log-update/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/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "peer": true, + "node_modules/log-update/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==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/core-js": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.3.tgz", - "integrity": "sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q==", - "hasInstallScript": true, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/core-js-compat": { - "version": "3.15.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.2.tgz", - "integrity": "sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ==", - "peer": true, + "node_modules/log-update/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==", "dependencies": { - "browserslist": "^4.16.6", - "semver": "7.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "engines": { + "node": ">=8" } }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "peer": true, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, "bin": { - "semver": "bin/semver.js" + "loose-envify": "cli.js" } }, - "node_modules/core-js-pure": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", - "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==" - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "peer": true, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/cosmiconfig/node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "peer": true, + "node_modules/lz-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", + "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" } }, - "node_modules/cosmiconfig/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "peer": 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==" + }, + "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": ">=4" + "node": ">= 8" } }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "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": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" + "braces": "^3.0.1", + "picomatch": "^2.2.3" }, "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" + "node": ">=8.6" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "mime-db": "1.45.0" }, "engines": { - "node": ">= 8" + "node": ">= 0.6" } }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", + "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==", + "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==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { "node": "*" } }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, - "node_modules/cypress": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-7.7.0.tgz", - "integrity": "sha512-uYBYXNoI5ym0UxROwhQXWTi8JbUEjpC6l/bzoGZNxoKGsLrC1SDPgIDJMgLX/MeEdPL0UInXLDUWN/rSyZUCjQ==", - "hasInstallScript": 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==", "dependencies": { - "@cypress/request": "^2.88.5", - "@cypress/xvfb": "^1.2.4", - "@types/node": "^14.14.31", - "@types/sinonjs__fake-timers": "^6.0.2", - "@types/sizzle": "^2.3.2", - "arch": "^2.2.0", - "blob-util": "^2.0.2", - "bluebird": "^3.7.2", - "cachedir": "^2.3.0", - "chalk": "^4.1.0", - "check-more-types": "^2.24.0", - "cli-cursor": "^3.1.0", - "cli-table3": "~0.6.0", - "commander": "^5.1.0", - "common-tags": "^1.8.0", - "dayjs": "^1.10.4", - "debug": "^4.3.2", - "enquirer": "^2.3.6", - "eventemitter2": "^6.4.3", - "execa": "4.1.0", - "executable": "^4.1.1", - "extract-zip": "2.0.1", - "figures": "^3.2.0", - "fs-extra": "^9.1.0", - "getos": "^3.2.1", - "is-ci": "^3.0.0", - "is-installed-globally": "~0.4.0", - "lazy-ass": "^1.6.0", - "listr2": "^3.8.3", - "lodash": "^4.17.21", - "log-symbols": "^4.0.0", - "minimist": "^1.2.5", - "ospath": "^1.2.2", - "pretty-bytes": "^5.6.0", - "ramda": "~0.27.1", - "request-progress": "^3.0.0", - "supports-color": "^8.1.1", - "tmp": "~0.2.1", - "untildify": "^4.0.0", - "url": "^0.11.0", - "yauzl": "^2.10.0" + "minimist": "^1.2.5" }, "bin": { - "cypress": "bin/cypress" - }, - "engines": { - "node": ">=12.0.0" + "mkdirp": "bin/cmd.js" } }, - "node_modules/cypress-file-upload": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/cypress-file-upload/-/cypress-file-upload-5.0.8.tgz", - "integrity": "sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g==", + "node_modules/mocha": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.3.2.tgz", + "integrity": "sha512-UdmISwr/5w+uXLPKspgoV7/RXZwKRTiTjJ2/AC5ZiEztIoOYdfKb19+9jNmEInzx5pBsCyJQzarAxqIGBNYJhg==", + "peer": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, "engines": { - "node": ">=8.2.1" + "node": ">= 10.12.0" }, - "peerDependencies": { - "cypress": ">3.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, - "node_modules/cypress-multi-reporters": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/cypress-multi-reporters/-/cypress-multi-reporters-1.5.0.tgz", - "integrity": "sha512-6rJ1rk1RpjZwTeydCDc8r3iOmWj2ZEYo++oDTJHNEu7eetb3W1cYDNo5CdxF/r0bo7TLQsOEpBHOCYBZfPVt/g==", + "node_modules/mocha-junit-reporter": { + "version": "2.0.2", + "resolved": "git+ssh://git@github.com/Phrynobatrachus/mocha-junit-reporter.git#9c2eccdd4d5e78f141887f3d4bd3a9a2124688bd", + "integrity": "sha512-iLhG0FTUP7aV/yVMrMfNELmckmPT1aaXzjkBJ6U63TbYyE55s5f0ruymiXNbKVhui26DTi5NS+EMstEGvSIBwg==", + "license": "MIT", "dependencies": { - "debug": "^4.1.1", - "lodash": "^4.17.15" - }, - "engines": { - "node": ">=6.0.0" + "debug": "^2.2.0", + "md5": "^2.1.0", + "mkdirp": "~0.5.1", + "strip-ansi": "^6.0.1", + "xml": "^1.0.0" }, "peerDependencies": { - "mocha": ">=3.1.2" + "mocha": ">=2.2.5" } }, - "node_modules/cypress-plugin-tab": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/cypress-plugin-tab/-/cypress-plugin-tab-1.0.5.tgz", - "integrity": "sha512-QtTJcifOVwwbeMP3hsOzQOKf3EqKsLyjtg9ZAGlYDntrCRXrsQhe4ZQGIthRMRLKpnP6/tTk6G0gJ2sZUfRliQ==", + "node_modules/mocha-junit-reporter/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "ally.js": "^1.4.1" + "ms": "2.0.0" } }, - "node_modules/cypress-terminal-report": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/cypress-terminal-report/-/cypress-terminal-report-3.2.2.tgz", - "integrity": "sha512-mEx8UlffSGsTHIK7pbBOPTz/cf/JwMqx6/+s7+y7V7MXqv86BXvWhP8kvYbcW3xjYj4B3C625toYUD20q9LmKA==", - "dependencies": { - "chalk": "^3.0.0", - "fs-extra": "^9.0.1", - "methods": "^1.1.2", - "semver": "^7.3.5", - "tv4": "^1.3.0" - }, - "peerDependencies": { - "cypress": ">=4.10.0" - } + "node_modules/mocha-junit-reporter/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "node_modules/cypress-wait-until": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/cypress-wait-until/-/cypress-wait-until-1.7.1.tgz", - "integrity": "sha512-8DL5IsBTbAxBjfYgCzdbohPq/bY+IKc63fxtso1C8RWhLnQkZbVESyaclNr76jyxfId6uyzX8+Xnt0ZwaXNtkA==" + "node_modules/mocha/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==", + "peer": true }, - "node_modules/cypress/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/mocha/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "peer": true, "dependencies": { - "color-convert": "^2.0.1" + "ms": "2.1.2" }, "engines": { - "node": ">=8" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/cypress/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "node_modules/mocha/node_modules/debug/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==", + "peer": true + }, + "node_modules/mocha/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==", + "peer": true, "engines": { "node": ">=10" - } - }, - "node_modules/cypress/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" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cypress/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/cypress/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/mocha/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==", + "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "peer": true, "dependencies": { - "assert-plus": "^1.0.0" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "engines": { - "node": "*" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/dayjs": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz", - "integrity": "sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw==" - }, - "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "node_modules/mocha/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==", + "peer": true, "dependencies": { - "ms": "2.1.2" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=6.0" + "node": ">=10" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "peer": true + }, + "node_modules/mocha/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==", "peer": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, "engines": { "node": ">=10" }, @@ -5057,615 +4046,532 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "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=", - "peer": true, + "node_modules/mocha/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==", + "peer": true, + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { - "node": ">=0.10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/mocha/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==", + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "peer": true, "dependencies": { - "clone": "^1.0.2" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/defaults/node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "peer": true, - "engines": { - "node": ">=0.8" + "node_modules/mochawesome": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/mochawesome/-/mochawesome-6.2.2.tgz", + "integrity": "sha512-NuIxYo8zczmL5XWLNFiud21OsAJHXrflt2lcRY2u8a3TilGwglhzTPjUHZCLqJvbqj2CnIHX2ueqOh1ViUNDPw==", + "dependencies": { + "chalk": "^4.1.0", + "diff": "^5.0.0", + "json-stringify-safe": "^5.0.1", + "lodash.isempty": "^4.4.0", + "lodash.isfunction": "^3.0.9", + "lodash.isobject": "^3.0.2", + "lodash.isstring": "^4.0.1", + "mochawesome-report-generator": "^5.2.0", + "strip-ansi": "^6.0.0", + "uuid": "^8.3.2" + }, + "peerDependencies": { + "mocha": ">=7" } }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "node_modules/mochawesome-merge": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mochawesome-merge/-/mochawesome-merge-4.2.0.tgz", + "integrity": "sha512-FSMzagh+8hTShhFXdBLE4/zS2WALcDruoD0bmtiwHEjfyQszR/iEGFTgbuM5ewA5At3qeSGwGsT0k2Stt64NdQ==", "dependencies": { - "object-keys": "^1.0.12" + "fs-extra": "^7.0.1", + "glob": "^7.1.6", + "uuid": "^3.3.2", + "yargs": "^15.3.1" + }, + "bin": { + "mochawesome-merge": "bin/mochawesome-merge.js" }, "engines": { - "node": ">= 0.4" + "node": ">=10.0.0" } }, - "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==", - "peer": true, + "node_modules/mochawesome-merge/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==", "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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=", + "node_modules/mochawesome-merge/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "engines": { - "node": ">=0.4.0" + "node": ">=6" } }, - "node_modules/denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", - "peer": true + "node_modules/mochawesome-merge/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "peer": true, + "node_modules/mochawesome-merge/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": ">= 0.6" + "node": ">=7.0.0" } }, - "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "peer": true + "node_modules/mochawesome-merge/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/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "node_modules/mochawesome-merge/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "engines": { - "node": ">=0.3.1" + "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, + "node_modules/mochawesome-merge/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==", "dependencies": { - "path-type": "^4.0.0" + "locate-path": "^5.0.0", + "path-exists": "^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, + "node_modules/mochawesome-merge/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dependencies": { - "esutils": "^2.0.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=6 <7 || >=8" } }, - "node_modules/dom-accessibility-api": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.4.tgz", - "integrity": "sha512-TvrjBckDy2c6v6RLxPv5QXOnU+SmF9nBII5621Ve5fu6Z/BDrENurBEvlC1f44lKEUVqOpK4w9E5Idc5/EgkLQ==" - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "node_modules/mochawesome-merge/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/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "peer": true - }, - "node_modules/electron-to-chromium": { - "version": "1.3.775", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.775.tgz", - "integrity": "sha512-EGuiJW4yBPOTj2NtWGZcX93ZE8IGj33HJAx4d3ouE2zOfW2trbWU+t1e0yzLr1qQIw81++txbM3BH52QwSRE6Q==", - "peer": true - }, - "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==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "peer": true, + "node_modules/mochawesome-merge/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==", + "dependencies": { + "p-locate": "^4.1.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=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==", + "node_modules/mochawesome-merge/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==", "dependencies": { - "once": "^1.4.0" + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "node_modules/mochawesome-merge/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==", "dependencies": { - "ansi-colors": "^4.1.1" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=8.6" + "node": ">=8" } }, - "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "peer": true, - "bin": { - "envinfo": "dist/cli.js" - }, + "node_modules/mochawesome-merge/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==", "engines": { - "node": ">=4" + "node": ">=6" } }, - "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==", - "dependencies": { - "is-arrayish": "^0.2.1" + "node_modules/mochawesome-merge/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==", + "engines": { + "node": ">=8" } }, - "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==", - "peer": true, - "dependencies": { - "stackframe": "^1.1.1" + "node_modules/mochawesome-merge/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_modules/errorhandler": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", - "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", - "peer": true, + "node_modules/mochawesome-merge/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==", "dependencies": { - "accepts": "~1.3.7", - "escape-html": "~1.0.3" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/es-abstract": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", - "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", - "dev": true, + "node_modules/mochawesome-merge/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==" + }, + "node_modules/mochawesome-merge/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==", "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.10.3", - "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" + "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": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, + "node_modules/mochawesome-merge/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==", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" }, "engines": { - "node": ">= 0.4" + "node": ">=6" + } + }, + "node_modules/mochawesome-report-generator": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mochawesome-report-generator/-/mochawesome-report-generator-5.2.0.tgz", + "integrity": "sha512-DDY/3jSkM/VrWy0vJtdYOf6qBLdaPaLcI7rQmBVbnclIX7AKniE1Rhz3T/cMT/7u54W5EHNo1z84z7efotq/Eg==", + "dependencies": { + "chalk": "^2.4.2", + "dateformat": "^3.0.2", + "escape-html": "^1.0.3", + "fs-extra": "^7.0.0", + "fsu": "^1.0.2", + "lodash.isfunction": "^3.0.8", + "opener": "^1.5.2", + "prop-types": "^15.7.2", + "tcomb": "^3.2.17", + "tcomb-validation": "^3.3.0", + "validator": "^10.11.0", + "yargs": "^13.2.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "marge": "bin/cli.js" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "peer": true, + "node_modules/mochawesome-report-generator/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==", "engines": { "node": ">=6" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "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=", + "node_modules/mochawesome-report-generator/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "engines": { - "node": ">=0.8.0" + "node": ">=6" } }, - "node_modules/eslint": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.30.0.tgz", - "integrity": "sha512-VLqz80i3as3NdloY44BQSJpFw534L9Oh+6zJOUaViV4JPd+DaHwutqP7tcpkW3YiXbK6s05RZl7yl7cQn+lijg==", - "dev": true, + "node_modules/mochawesome-report-generator/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==", "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.2", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "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": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=4" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", - "dev": true, + "node_modules/mochawesome-report-generator/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dependencies": { - "debug": "^2.6.9", - "resolve": "^1.13.1" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, - "node_modules/eslint-import-resolver-node/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/mochawesome-report-generator/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/eslint-import-resolver-node/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/mochawesome-report-generator/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/eslint-module-utils": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", - "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", - "dev": true, + "node_modules/mochawesome-report-generator/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==", "dependencies": { - "debug": "^3.2.7", - "pkg-dir": "^2.0.0" + "locate-path": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "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, + "node_modules/mochawesome-report-generator/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-cypress": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.11.3.tgz", - "integrity": "sha512-hOoAid+XNFtpvOzZSNWP5LDrQBEJwbZwjib4XJ1KcRYKjeVj0mAmPmucG4Egli4j/aruv+Ow/acacoloWWCl9Q==", - "dev": true, - "dependencies": { - "globals": "^11.12.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, - "peerDependencies": { - "eslint": ">= 3.2.1" - } - }, - "node_modules/eslint-plugin-header": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", - "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==", - "dev": true, - "peerDependencies": { - "eslint": ">=7.7.0" + "engines": { + "node": ">=6 <7 || >=8" } }, - "node_modules/eslint-plugin-import": { - "version": "2.23.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", - "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.3", - "array.prototype.flat": "^1.2.4", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.1", - "find-up": "^2.0.0", - "has": "^1.0.3", - "is-core-module": "^2.4.0", - "minimatch": "^3.0.4", - "object.values": "^1.1.3", - "pkg-up": "^2.0.0", - "read-pkg-up": "^3.0.0", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.9.0" - }, + "node_modules/mochawesome-report-generator/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "engines": { "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" } }, - "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/mochawesome-report-generator/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/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, + "node_modules/mochawesome-report-generator/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==", "dependencies": { - "esutils": "^2.0.2" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "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-import/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, + "node_modules/mochawesome-report-generator/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==", "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-mattermost": { - "name": "eslint-config-mattermost", - "version": "1.0.0", - "resolved": "git+ssh://git@github.com/mattermost/eslint-plugin-mattermost.git#46ad99355644a719bf32082f472048f526605181", - "integrity": "sha512-XIsRlgdUmVaJ+9P5sy45uN/cVzi5rPP2w/w06yuEIEYAH6CuVzjiY/dBjDqFKOi/Ebnoo40ur2oCtD3+yzrgVw==", - "dev": true, - "license": "Apache 2.0" + "node_modules/mochawesome-report-generator/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==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } }, - "node_modules/eslint-plugin-no-only-tests": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.6.0.tgz", - "integrity": "sha512-T9SmE/g6UV1uZo1oHAqOvL86XWl7Pl2EpRpnLI8g/bkJu+h7XBCB+1LnubRZ2CUQXj805vh4/CYZdnqtVaEo2Q==", - "dev": true, + "node_modules/mochawesome-report-generator/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==", "engines": { - "node": ">=4.0.0" + "node": ">=6" } }, - "node_modules/eslint-plugin-react": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz", - "integrity": "sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==", - "dev": true, + "node_modules/mochawesome-report-generator/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==", "dependencies": { - "array-includes": "^3.1.3", - "array.prototype.flatmap": "^1.2.4", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.0.4", - "object.entries": "^1.1.4", - "object.fromentries": "^2.0.4", - "object.values": "^1.1.4", - "prop-types": "^15.7.2", - "resolve": "^2.0.0-next.3", - "string.prototype.matchall": "^4.0.5" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7" + "node": ">=6" } }, - "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, + "node_modules/mochawesome-report-generator/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==", "dependencies": { - "esutils": "^2.0.2" + "ansi-regex": "^4.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "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", - "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", - "dev": true, + "node_modules/mochawesome-report-generator/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==", "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "has-flag": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=4" } }, - "node_modules/eslint-scope": { - "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.3.0", - "estraverse": "^4.1.1" - }, + "node_modules/mochawesome-report-generator/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": ">=8.0.0" + "node": ">= 4.0.0" } }, - "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, + "node_modules/mochawesome-report-generator/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==", "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" + "node_modules/mochawesome-report-generator/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==" + }, + "node_modules/mochawesome-report-generator/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "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/eslint/node_modules/ansi-styles": { + "node_modules/mochawesome-report-generator/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==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/mochawesome/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" }, @@ -5676,11 +4582,10 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/chalk": { + "node_modules/mochawesome/node_modules/chalk": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5692,11 +4597,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint/node_modules/color-convert": { + "node_modules/mochawesome/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" }, @@ -5704,1523 +4608,1292 @@ "node": ">=7.0.0" } }, - "node_modules/eslint/node_modules/color-name": { + "node_modules/mochawesome/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 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "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/mochawesome/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/eslint/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, + "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/nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "peer": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, "engines": { - "node": ">=10" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", - "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "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/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": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "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==", + "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" + } + }, + "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==", + "peer": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, + "node_modules/notp": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/notp/-/notp-2.0.3.tgz", + "integrity": "sha1-qf0R4lz+HMs5/GaJVE7kwQ75pXc=", "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "> v0.6.0" } }, - "node_modules/esprima": { + "node_modules/npm-run-path": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "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" - }, + "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" + "node": ">=0.10.0" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true, + "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", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "engines": { - "node": ">=4.0" + "node": ">= 0.4" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "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": { - "estraverse": "^5.2.0" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "node_modules/object.entries": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", + "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + }, "engines": { - "node": ">=4.0" + "node": ">= 0.4" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/object.fromentries": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", + "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" + }, "engines": { - "node": ">=4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "peer": true, - "engines": { - "node": ">= 0.6" + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "peer": true, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eventemitter2": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.3.tgz", - "integrity": "sha512-t0A2msp6BzOf+QAcI6z9XMktLj52OjGQg+8SJH6v5+3uxNpWYRR3wQmfA+6xtMU9kOC59qk9licus5dYcrYkMQ==" - }, - "node_modules/exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", - "peer": true - }, - "node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "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": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.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": ">=10" + "node": ">= 0.8.0" } }, - "node_modules/executable": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", - "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "node_modules/ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=" + }, + "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": { - "pify": "^2.2.0" + "p-try": "^1.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "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": ">= 0.8.0" + "node": ">=4" } }, - "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=", - "peer": true, + "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==", "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" + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", - "peer": true, - "dependencies": { - "ms": "2.0.0" + "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/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=", - "peer": true, + "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": { - "is-descriptor": "^0.1.0" + "callsites": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "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=", - "peer": true, + "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": { - "is-extendable": "^0.1.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "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=", - "peer": true, - "dependencies": { - "kind-of": "^3.0.2" - }, + "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=", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "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=", - "peer": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, + "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=", "engines": { "node": ">=0.10.0" } }, - "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=", - "peer": true, - "dependencies": { - "kind-of": "^3.0.2" - }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "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=", - "peer": true, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "pify": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "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==", - "peer": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, + "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": ">=0.10.0" + "node": ">=4" } }, - "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=", - "peer": true, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", "engines": { - "node": ">=0.10.0" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "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==", - "peer": true, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "engines": { "node": ">=0.10.0" } }, - "node_modules/expand-brackets/node_modules/ms": { + "node_modules/pkg-dir": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "peer": true - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "peer": true, + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "find-up": "^2.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "peer": true, + "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": { - "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" + "find-up": "^2.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "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=", - "peer": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, + "node_modules/platform": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.3.tgz", + "integrity": "sha1-ZGx3ARiZhwtqCQPnXpl+jlHadGE=" + }, + "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/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=", - "peer": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, + "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==", "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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=", - "peer": true, + "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.10.0" + "node": ">=0.4.0" } }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "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, + "node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", "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" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" } }, - "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==" - }, - "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.12.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz", - "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } + "node_modules/proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==" }, - "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "peer": true, - "dependencies": { - "bser": "2.1.1" - } + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "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==", "dependencies": { - "pend": "~1.2.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, + "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==", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "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/qrcode-terminal": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", + "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" } }, - "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==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "engines": { - "node": ">=8" + "node": ">=0.6" } }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "peer": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } + "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/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "peer": true, "dependencies": { - "ms": "2.0.0" + "safe-buffer": "^5.1.0" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "peer": true + "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/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "peer": true, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/find-cache-dir/node_modules/find-up": { + "node_modules/read-pkg-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "peer": true, + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, "dependencies": { - "locate-path": "^3.0.0" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "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==", + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "peer": true, "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "picomatch": "^2.2.1" }, "engines": { - "node": ">=6" + "node": ">=8.10.0" } }, - "node_modules/find-cache-dir/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==", - "peer": true, + "node_modules/regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, "dependencies": { - "p-try": "^2.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "peer": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/find-cache-dir/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==", - "peer": true, + "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": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { + "node_modules/request-progress": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "peer": true, + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" + "throttleit": "^1.0.0" } }, - "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" - }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "peer": true, - "bin": { - "flat": "cli.js" + "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/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "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==" + }, + "node_modules/resolve": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.16.1.tgz", + "integrity": "sha512-rmAglCSqWWMrrBv/XM6sW0NuRFiKViw/W4d9EbC4pt+49H8JwHy+mcGmALTEg504AUDcLTvb1T2q3E9AnmY+ig==", "dev": true, "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "path-parse": "^1.0.6" } }, - "node_modules/flatted": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.1.tgz", - "integrity": "sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg==", - "dev": true - }, - "node_modules/flow-parser": { - "version": "0.121.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.121.0.tgz", - "integrity": "sha512-1gIBiWJNR0tKUNv8gZuk7l9rVX06OuLzY9AoGio7y/JT4V1IZErEMEq2TJS+PFcw/y0RshZ1J/27VfK1UQzYVg==", - "peer": true, + "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": ">=0.4.0" + "node": ">=4" } }, - "node_modules/follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" + "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==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "engines": { + "node": ">=8" } }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "peer": true, + "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/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "engines": { - "node": "*" + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" } }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "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": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" + "queue-microtask": "^1.2.2" } }, - "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=", - "peer": true, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dependencies": { - "map-cache": "^0.2.2" + "tslib": "^1.9.0" }, "engines": { - "node": ">=0.10.0" + "npm": ">=2.0.0" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "peer": true, - "engines": { - "node": ">= 0.6" - } + "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==" }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "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==", "peer": true, - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "dependencies": { + "randombytes": "^2.1.0" } }, - "node_modules/fsu": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fsu/-/fsu-1.1.1.tgz", - "integrity": "sha512-xQVsnjJ/5pQtcKh+KjUoZGzVWn4uNkchxTF6Lwjr4Gf7nQr8fmUfhKJ62zE77+xQg9xnxi5KUps7XGs+VC986A==" - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "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/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, - "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==", - "peer": true, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=8" } }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-params": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/get-params/-/get-params-0.1.2.tgz", - "integrity": "sha1-uuDfq6WIoMYNeDTA2Nwv9g7u8v4=" + "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==" }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, + "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/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/getos": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", - "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", - "dependencies": { - "async": "^3.2.0" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/gfycat-sdk": { - "version": "1.4.18", - "resolved": "https://registry.npmjs.org/gfycat-sdk/-/gfycat-sdk-1.4.18.tgz", - "integrity": "sha512-BrINtO6rj8Nr0pm38Qr3epayOuvlKcEFcDCw6yL9T4SrsWTECct6FS/isli766kdij2GGG6bWU6bRp+fDS2Cbg==", - "dependencies": { - "babel-runtime": "^6.23.0" - } - }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "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" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { - "node": "*" + "node": ">=8" } }, - "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==", + "node_modules/slice-ansi/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==", "dependencies": { - "is-glob": "^4.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "node_modules/slice-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==", "dependencies": { - "ini": "2.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=7.0.0" } }, - "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==", + "node_modules/slice-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==" + }, + "node_modules/slice-ansi/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==", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "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, - "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": ">=0.10.0" } }, - "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==", + "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, - "engines": { - "node": ">= 4" + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "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/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "peer": true, - "engines": { - "node": ">=4.x" + "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/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "engines": { - "node": ">=4" - } + "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/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/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dependencies": { - "function-bind": "^1.1.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "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/string-width/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==", "engines": { "node": ">=8" } }, - "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "engines": { - "node": ">= 0.4" + "node_modules/string.prototype.matchall": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", + "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "peer": true, + "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==", + "dev": true, "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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=", - "peer": true, + "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==", + "dev": true, "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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=", - "peer": true, + "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==", "dependencies": { - "kind-of": "^3.0.2" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "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=", - "peer": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "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=", - "peer": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, + "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==", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "peer": true, - "bin": { - "he": "bin/he" + "node_modules/strip-json-comments": { + "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==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hermes-engine": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/hermes-engine/-/hermes-engine-0.7.2.tgz", - "integrity": "sha512-E2DkRaO97gwL98LPhgfkMqhHiNsrAjIfEk3wWYn2Y31xdkdWn0572H7RnVcGujMJVqZNJvtknxlpsUb8Wzc3KA==", - "peer": true - }, - "node_modules/hermes-profile-transformer": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz", - "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==", - "peer": true, + "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==", "dependencies": { - "source-map": "^0.7.3" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/hermes-profile-transformer/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "peer": true, - "engines": { - "node": ">= 8" - } - }, - "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/http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "peer": true, + "node_modules/table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=10.0.0" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "node_modules/table/node_modules/ajv": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.1.tgz", + "integrity": "sha512-42VLtQUOLefAvKFAQIxIZDaThq6om/PrfP0CYk3/vn+y4BMNkKnbli8ON2QCiHov4KkzOSJ/xSoBJdayiiYvVQ==", + "dev": true, "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "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.8", - "npm": ">=1.3.7" - } - }, - "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "engines": { - "node": ">=8.12.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "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/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "node_modules/table/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, - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz", - "integrity": "sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA==", - "peer": true, - "bin": { - "image-size": "bin/image-size.js" + "dependencies": { + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" - }, - "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==", + "node_modules/table/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": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=6" + "node": ">=7.0.0" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "engines": { - "node": ">=0.8.19" - } + "node_modules/table/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/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==", + "node_modules/table/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/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "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==" - }, - "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "engines": { - "node": ">=10" - } + "node_modules/table/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/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "peer": true, - "engines": { - "node": ">= 0.10" - } + "node_modules/tcomb": { + "version": "3.2.29", + "resolved": "https://registry.npmjs.org/tcomb/-/tcomb-3.2.29.tgz", + "integrity": "sha512-di2Hd1DB2Zfw6StGv861JoAF5h/uQVu/QJp2g8KVbtfKnoHdBQl5M32YWq6mnSYBQ1vFFrns5B1haWJL7rKaOQ==" }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "peer": true, + "node_modules/tcomb-validation": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/tcomb-validation/-/tcomb-validation-3.4.1.tgz", + "integrity": "sha512-urVVMQOma4RXwiVCa2nM2eqrAomHROHvWPuj6UkDGz/eb5kcy0x6P0dVt6kzpUZtYMNoAqJLWmz1BPtxrtjtrA==", "dependencies": { - "loose-envify": "^1.0.0" + "tcomb": "^3.0.0" } }, - "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "peer": true + "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/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==", - "peer": true, - "dependencies": { - "kind-of": "^6.0.0" - }, + "node_modules/thirty-two": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-0.0.2.tgz", + "integrity": "sha1-QlPinYywWPBIAmfFaYwOSSflS2o=", "engines": { - "node": ">=0.10.0" + "node": ">=0.2.6" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "node_modules/is-bigint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=" }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "peer": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, - "node_modules/is-boolean-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", - "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", - "dev": true, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dependencies": { - "call-bind": "^1.0.2" + "rimraf": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.17.0" } }, - "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==" - }, - "node_modules/is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "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": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/is-ci": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", - "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "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==", "dependencies": { - "ci-info": "^3.1.1" + "is-number": "^7.0.0" }, - "bin": { - "is-ci": "bin.js" + "engines": { + "node": ">=8.0" } }, - "node_modules/is-core-module": { + "node_modules/tough-cookie": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", - "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "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==", - "peer": true, + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dependencies": { - "kind-of": "^6.0.0" + "psl": "^1.1.28", + "punycode": "^2.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8" } }, - "node_modules/is-date-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", - "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "node_modules/tsconfig-paths": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz", + "integrity": "sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q==", "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "json5": "^2.2.0", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" } }, - "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==", - "peer": 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/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "tslib": "^1.8.1" }, "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=", - "peer": true, - "engines": { - "node": ">=0.10.0" + "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/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==", - "peer": true, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dependencies": { - "is-plain-object": "^2.0.4" + "safe-buffer": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "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=", + "node_modules/tv4": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", + "integrity": "sha1-0CDIRvrdUMhVq7JeuuzGj8EPeWM=", "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "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=", - "engines": { - "node": ">=4" - } + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, - "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==", + "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": { - "is-extglob": "^2.1.1" + "prelude-ls": "^1.2.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, + "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==", "engines": { "node": ">=10" }, @@ -7228,254 +5901,218 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "node_modules/typescript": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.2.tgz", + "integrity": "sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ==", "dev": true, - "engines": { - "node": ">= 0.4" + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", "engines": { - "node": ">=0.12.0" + "node": ">=4.2.0" } }, - "node_modules/is-number-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", - "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "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==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "engines": { "node": ">=8" } }, - "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==", - "peer": true, - "engines": { - "node": ">=8" + "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/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "peer": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "bin": { + "uuid": "bin/uuid" } }, - "node_modules/is-regex": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", - "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "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/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": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "node_modules/validator": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", + "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.10" } }, - "node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "engines": { - "node": ">=8" + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, - "node_modules/is-string": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", - "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", - "dev": true, - "engines": { - "node": ">= 0.4" + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "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=" }, - "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==", + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "peer": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "string-width": "^1.0.2 || 2" } }, - "node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "peer": true, "engines": { "node": ">=4" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "peer": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "node_modules/jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "node_modules/wide-align/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "peer": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, "engines": { - "node": ">= 10.14.2" + "node": ">=4" } }, - "node_modules/jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "peer": true, "dependencies": { - "@jest/types": "^26.6.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" + "ansi-regex": "^3.0.0" }, "engines": { - "node": ">= 10.14.2" - }, - "optionalDependencies": { - "fsevents": "^2.1.2" + "node": ">=4" } }, - "node_modules/jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "peer": true, + "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": ">= 10.14.2" + "node": ">=0.10.0" } }, - "node_modules/jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", - "peer": true, - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - }, - "engines": { - "node": ">= 10.14.2" - } + "node_modules/workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "peer": true }, - "node_modules/jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", - "peer": true, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dependencies": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/jest-util/node_modules/ansi-styles": { + "node_modules/wrap-ansi/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==", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -7486,33 +6123,10 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "peer": 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/jest-util/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "peer": true - }, - "node_modules/jest-util/node_modules/color-convert": { + "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==", - "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -7520,13788 +6134,2783 @@ "node": ">=7.0.0" } }, - "node_modules/jest-util/node_modules/color-name": { + "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==", - "peer": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/jest-util/node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "peer": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=" }, - "node_modules/jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "peer": true, - "dependencies": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "leven": "^3.1.0", - "pretty-format": "^26.6.2" - }, "engines": { - "node": ">= 10.14.2" + "node": ">=10" } }, - "node_modules/jest-validate/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==", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "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" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-validate/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==", + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">=10" } }, - "node_modules/jest-validate/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==", - "peer": true - }, - "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==", + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "peer": true, "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" }, "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jetifier": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.8.tgz", - "integrity": "sha512-3Zi16h6L5tXDRQJTb221cnRoVG9/9OvreLdLU2/ZjRv/GILL+2Cemt0IKvkowwkDpvouAU1DQPOJ7qaiHeIdrw==", - "peer": true, - "bin": { - "jetifier": "bin/jetify", - "jetifier-standalone": "bin/jetifier-standalone", - "jetify": "bin/jetify" - } - }, - "node_modules/joi": { - "version": "17.4.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.4.1.tgz", - "integrity": "sha512-gDPOwQ5sr+BUxXuPDGrC1pSNcVR/yGGcTI0aCnjYxZEa3za60K/iCQ+OFIkEHWZGVCUcUlXlFKvMmrlmxrG6UQ==", - "peer": true, - "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.0", - "@sideway/formula": "^3.0.0", - "@sideway/pinpoint": "^2.0.0" + "node": ">=10" } }, - "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==" - }, - "node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" } }, - "node_modules/jsan": { - "version": "3.1.13", - "resolved": "https://registry.npmjs.org/jsan/-/jsan-3.1.13.tgz", - "integrity": "sha512-9kGpCsGHifmw6oJet+y8HaCl14y7qgAsxVdV3pCHDySNR3BfDC30zgkssd7x5LRVAT22dnpbe9JdzzmXZnq9/g==" - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "node_modules/jsc-android": { - "version": "245459.0.0", - "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-245459.0.0.tgz", - "integrity": "sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg==", - "peer": true - }, - "node_modules/jscodeshift": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.11.0.tgz", - "integrity": "sha512-SdRK2C7jjs4k/kT2mwtO07KJN9RnjxtKn03d9JVj6c3j9WwaLcFYsICYDnLAzY0hp+wG2nxl+Cm2jWLiNVYb8g==", + "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==", "peer": true, - "dependencies": { - "@babel/core": "^7.1.6", - "@babel/parser": "^7.1.6", - "@babel/plugin-proposal-class-properties": "^7.1.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.1.0", - "@babel/plugin-proposal-optional-chaining": "^7.1.0", - "@babel/plugin-transform-modules-commonjs": "^7.1.0", - "@babel/preset-flow": "^7.0.0", - "@babel/preset-typescript": "^7.1.0", - "@babel/register": "^7.0.0", - "babel-core": "^7.0.0-bridge.0", - "colors": "^1.1.2", - "flow-parser": "0.*", - "graceful-fs": "^4.2.4", - "micromatch": "^3.1.10", - "neo-async": "^2.5.0", - "node-dir": "^0.1.17", - "recast": "^0.20.3", - "temp": "^0.8.1", - "write-file-atomic": "^2.3.0" - }, - "bin": { - "jscodeshift": "bin/jscodeshift.js" + "engines": { + "node": ">=10" }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/jscodeshift/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "peer": 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" + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "requires": { + "@babel/highlight": "^7.10.4" } }, - "node_modules/jscodeshift/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=", - "peer": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "@babel/generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", + "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" } }, - "node_modules/jscodeshift/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "peer": 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" + "@babel/helper-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" } }, - "node_modules/jscodeshift/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=", - "peer": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "@babel/helper-get-function-arity": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" } }, - "node_modules/jscodeshift/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=", - "peer": true, - "engines": { - "node": ">=0.10.0" + "@babel/helper-hoist-variables": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" } }, - "node_modules/jscodeshift/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "peer": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" + "@babel/helper-split-export-declaration": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" } }, - "node_modules/jscodeshift/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=", - "peer": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } + "@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==" }, - "node_modules/jscodeshift/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "peer": 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" + "@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==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jscodeshift/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=", - "peer": true, "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "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" + } + } } }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } + "@babel/parser": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", + "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", + "dev": true }, - "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==" + "@babel/runtime": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", + "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } }, - "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "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" + } + } + } }, - "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==" + "@babel/traverse": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", + "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.14.7", + "@babel/types": "^7.14.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "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" + } + } + } }, - "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 + "@babel/types": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", + "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "to-fast-properties": "^2.0.0" + } }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true }, - "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" + "@cypress/request": { + "version": "2.88.10", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", + "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } } }, - "node_modules/jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "peer": true, - "engines": { - "node": "*" - } + "@cypress/skip-test": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@cypress/skip-test/-/skip-test-2.6.1.tgz", + "integrity": "sha512-X+ibefBiuOmC5gKG91wRIT0/OqXeETYvu7zXktjZ3yLeO186Y8ia0K7/gQUpAwuUi28DuqMd1+7tBQVtPkzbPA==" }, - "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "engines": [ - "node >=0.6.0" - ], + "@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "requires": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + }, "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } } }, - "node_modules/jsx-ast-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", - "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", + "@eslint/eslintrc": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", + "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", "dev": true, - "dependencies": { - "array-includes": "^3.1.2", - "object.assign": "^4.1.2" + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" }, - "engines": { - "node": ">=4.0" + "dependencies": { + "globals": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "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 + } } }, - "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==", - "peer": true, - "engines": { - "node": ">=0.10.0" + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" } }, - "node_modules/klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.9" - } + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "peer": true, - "engines": { - "node": ">=6" + "@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" } }, - "node_modules/lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=", - "engines": { - "node": "> 0.8" + "@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" } }, - "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==", - "peer": true, - "engines": { - "node": ">=6" + "@testing-library/cypress": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-8.0.3.tgz", + "integrity": "sha512-nY2YaSbmuPo5k6kL0iLj/pGPPfka3iwb3kpTx8QN/vOCns92Saz9wfACqB8FJzcR7+lfA4d5HUOWqmTddBzczg==", + "requires": { + "@babel/runtime": "^7.14.6", + "@testing-library/dom": "^8.1.0" } }, - "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": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "@testing-library/dom": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.16.0.tgz", + "integrity": "sha512-uxF4zmnLHHDlmW4l+0WDjcgLVwCvH+OVLpD8Dfp+Bjfz85prwxWGbwXgJdLtkgjD0qfOzkJF9SmA6YZPsMYX4w==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^4.2.0", + "aria-query": "^5.0.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.4.4", + "pretty-format": "^27.0.2" }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", "dependencies": { - "immediate": "~3.0.5" + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "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==", + "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==", + "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==" + }, + "pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "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==" + } } }, - "node_modules/linked-list": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/linked-list/-/linked-list-0.1.0.tgz", - "integrity": "sha1-eYsP+X0bkqT9CEgPVa6k6dSdN78=" + "@types/aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==" }, - "node_modules/listr2": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.10.0.tgz", - "integrity": "sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw==", - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^1.2.2", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rxjs": "^6.6.7", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/lodash": { + "version": "4.14.171", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.171.tgz", + "integrity": "sha512-7eQ2xYLLI/LsicL2nejW9Wyko3lcpN6O/z0ZLHrEQsg280zIdCv1t/0m6UtBjUHokCGBQ3gYTbHzDkZ1xOBwwg==", + "dev": true + }, + "@types/node": { + "version": "14.17.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.5.tgz", + "integrity": "sha512-bjqH2cX/O33jXT/UmReo2pM7DIJREPMnarixbQ57DOOzzFaI6D2+IcwaJQaJpv0M1E9TIhPCYVxrkcityLjlqA==" + }, + "@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==" + }, + "@types/sizzle": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", + "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==" + }, + "@types/yauzl": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", + "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "optional": true, + "requires": { + "@types/node": "*" } }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "@typescript-eslint/eslint-plugin": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.4.tgz", + "integrity": "sha512-s1oY4RmYDlWMlcV0kKPBaADn46JirZzvvH7c2CtAqxCY96S538JRBAzt83RrfkDheV/+G/vWNK0zek+8TB3Gmw==", "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" + "requires": { + "@typescript-eslint/experimental-utils": "4.28.4", + "@typescript-eslint/scope-manager": "4.28.4", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" } }, - "node_modules/load-json-file/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "@typescript-eslint/experimental-utils": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.4.tgz", + "integrity": "sha512-OglKWOQRWTCoqMSy6pm/kpinEIgdcXYceIcH3EKWUl4S8xhFtN34GQRaAvTIZB9DD94rW7d/U7tUg3SYeDFNHA==", "dev": true, - "engines": { - "node": ">=4" + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.28.4", + "@typescript-eslint/types": "4.28.4", + "@typescript-eslint/typescript-estree": "4.28.4", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "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" + } + }, + "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 + } } }, - "node_modules/localforage": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.9.0.tgz", - "integrity": "sha512-rR1oyNrKulpe+VM9cYmcFn6tsHuokyVHFaCM3+osEmxaHTbEk8oQu6eGDfS6DQLWi/N67XRmB8ECG37OES368g==", + "@typescript-eslint/parser": { + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.30.0.tgz", + "integrity": "sha512-HJ0XuluSZSxeboLU7Q2VQ6eLlCwXPBOGnA7CqgBnz2Db3JRQYyBDJgQnop6TZ+rsbSx5gEdWhw4rE4mDa1FnZg==", + "dev": true, + "peer": true, + "requires": { + "@typescript-eslint/scope-manager": "4.30.0", + "@typescript-eslint/types": "4.30.0", + "@typescript-eslint/typescript-estree": "4.30.0", + "debug": "^4.3.1" + }, "dependencies": { - "lie": "3.1.1" + "@typescript-eslint/scope-manager": { + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.30.0.tgz", + "integrity": "sha512-VJ/jAXovxNh7rIXCQbYhkyV2Y3Ac/0cVHP/FruTJSAUUm4Oacmn/nkN5zfWmWFEanN4ggP0vJSHOeajtHq3f8A==", + "dev": true, + "peer": true, + "requires": { + "@typescript-eslint/types": "4.30.0", + "@typescript-eslint/visitor-keys": "4.30.0" + } + }, + "@typescript-eslint/types": { + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.30.0.tgz", + "integrity": "sha512-YKldqbNU9K4WpTNwBqtAerQKLLW/X2A/j4yw92e3ZJYLx+BpKLeheyzoPfzIXHfM8BXfoleTdiYwpsvVPvHrDw==", + "dev": true, + "peer": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.30.0.tgz", + "integrity": "sha512-6WN7UFYvykr/U0Qgy4kz48iGPWILvYL34xXJxvDQeiRE018B7POspNRVtAZscWntEPZpFCx4hcz/XBT+erenfg==", + "dev": true, + "peer": true, + "requires": { + "@typescript-eslint/types": "4.30.0", + "@typescript-eslint/visitor-keys": "4.30.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.30.0.tgz", + "integrity": "sha512-pNaaxDt/Ol/+JZwzP7MqWc8PJQTUhZwoee/PVlQ+iYoYhagccvoHnC9e4l+C/krQYYkENxznhVSDwClIbZVxRw==", + "dev": true, + "peer": true, + "requires": { + "@typescript-eslint/types": "4.30.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "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, + "peer": true + } } }, - "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "@typescript-eslint/scope-manager": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.4.tgz", + "integrity": "sha512-ZJBNs4usViOmlyFMt9X9l+X0WAFcDH7EdSArGqpldXu7aeZxDAuAzHiMAeI+JpSefY2INHrXeqnha39FVqXb8w==", "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" + "requires": { + "@typescript-eslint/types": "4.28.4", + "@typescript-eslint/visitor-keys": "4.28.4" } }, - "node_modules/lodash": { - "version": "4.17.21", - "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.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "@typescript-eslint/types": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.4.tgz", + "integrity": "sha512-3eap4QWxGqkYuEmVebUGULMskR6Cuoc/Wii0oSOddleP4EGx1tjLnZQ0ZP33YRoMDCs5O3j56RBV4g14T4jvww==", "dev": true }, - "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=", - "peer": true - }, - "node_modules/lodash.isempty": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", - "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=" - }, - "node_modules/lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" - }, - "node_modules/lodash.isobject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", - "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" - }, - "node_modules/lodash.mapkeys": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mapkeys/-/lodash.mapkeys-4.6.0.tgz", - "integrity": "sha1-3yz6Ix18V8eorQA6va1dc9PqUZU=" - }, - "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 + "@typescript-eslint/typescript-estree": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.4.tgz", + "integrity": "sha512-z7d8HK8XvCRyN2SNp+OXC2iZaF+O2BTquGhEYLKLx5k6p0r05ureUtgEfo5f6anLkhCxdHtCf6rPM1p4efHYDQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.4", + "@typescript-eslint/visitor-keys": "4.28.4", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + "@typescript-eslint/visitor-keys": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.4.tgz", + "integrity": "sha512-NIAXAdbz1XdOuzqkJHjNKXKj8QQ4cv5cxR/g0uQhCYf/6//XrmfpaYsM7PnBcNbfvTDLUkqQ5TPNm1sozDdTWg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.4", + "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 + } + } }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=", + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "peer": true }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, - "node_modules/lodash.xor": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.xor/-/lodash.xor-4.5.0.tgz", - "integrity": "sha1-TUjtfpgJWwYyWCunFNP/iuj7HbY=" - }, - "node_modules/log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", - "dependencies": { - "chalk": "^4.0.0" - }, - "engines": { - "node": ">=10" - } + "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": {} }, - "node_modules/log-symbols/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==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "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" } }, - "node_modules/log-symbols/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" + "ally.js": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/ally.js/-/ally.js-1.4.1.tgz", + "integrity": "sha1-n7fmuljvrE7pExyymqnuO1QLzx4=", + "requires": { + "css.escape": "^1.5.0", + "platform": "1.3.3" } }, - "node_modules/log-symbols/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==" + "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==" }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "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==", + "requires": { + "type-fest": "^0.21.3" } }, - "node_modules/log-update/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==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" } }, - "node_modules/log-update/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" + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "peer": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, - "node_modules/log-update/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==" + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==" }, - "node_modules/log-update/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==", - "engines": { - "node": ">=8" + "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" } }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } + "aria-query": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", + "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==" }, - "node_modules/log-update/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==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" + "array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" } }, - "node_modules/logkitty": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", - "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", - "peer": true, - "dependencies": { - "ansi-fragments": "^0.2.1", - "dayjs": "^1.8.15", - "yargs": "^15.1.0" - }, - "bin": { - "logkitty": "bin/logkitty.js" - } + "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 }, - "node_modules/logkitty/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==", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" } }, - "node_modules/logkitty/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "peer": true, - "engines": { - "node": ">=6" + "array.prototype.flatmap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "function-bind": "^1.1.1" } }, - "node_modules/logkitty/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "requires": { + "safer-buffer": "~2.1.0" } }, - "node_modules/logkitty/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==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" }, - "node_modules/logkitty/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==", - "peer": true + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" }, - "node_modules/logkitty/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "peer": true, - "engines": { - "node": ">=0.10.0" - } + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" }, - "node_modules/logkitty/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==", - "peer": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "node_modules/logkitty/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==", - "peer": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, - "node_modules/logkitty/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==", - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "authenticator": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/authenticator/-/authenticator-1.1.5.tgz", + "integrity": "sha512-eaT0Trfxka28DkljLQDxuoSn9uDTaYIoXhZMsAw3Z54fNC7BMIsvIxfG6Y5s+y02CH59IIyY3p1EOMqeIpljWQ==", + "requires": { + "authenticator-cli": "^1.0.5", + "notp": "^2.0.3", + "thirty-two": "0.0.2" } }, - "node_modules/logkitty/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==", - "peer": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "authenticator-cli": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/authenticator-cli/-/authenticator-cli-1.0.5.tgz", + "integrity": "sha512-8FjXzLnytd93zE9IxtOr7/uptlxGBjQhWw6qEjPPLhfq1TqrUpaBEhPYOErtHWIPuveAgzHHEBgp2bh6GdQ6Ew==", + "requires": { + "authenticator": "^1.1.0", + "cli": "^1.0.1", + "qrcode-terminal": "^0.12.0" } }, - "node_modules/logkitty/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==", - "peer": true, - "engines": { - "node": ">=6" + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "requires": { + "follow-redirects": "^1.10.0" } }, - "node_modules/logkitty/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==", - "peer": true, - "engines": { - "node": ">=8" + "axios-retry": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-3.1.9.tgz", + "integrity": "sha512-NFCoNIHq8lYkJa6ku4m+V1837TP6lCa7n79Iuf8/AqATAHYB0ISaAS1eyIenDOfHOLtym34W65Sjke2xjg2fsA==", + "requires": { + "is-retry-allowed": "^1.1.0" } }, - "node_modules/logkitty/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==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" } }, - "node_modules/logkitty/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==", - "peer": true + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "node_modules/logkitty/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==", - "peer": 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" - } + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, - "node_modules/logkitty/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==", - "peer": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "requires": { + "tweetnacl": "^0.14.3" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "peer": true }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } + "blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==" }, - "node_modules/lz-string": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=", - "bin": { - "lz-string": "bin/bin.js" - } + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "peer": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/make-dir/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "peer": true, - "engines": { - "node": ">=6" + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" } }, - "node_modules/make-dir/node_modules/semver": { + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "peer": true + }, + "buffer": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "peer": true, - "bin": { - "semver": "bin/semver" + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "peer": true, - "dependencies": { - "tmpl": "1.0.x" - } + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "peer": true, - "engines": { - "node": ">=0.10.0" - } + "cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==" }, - "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=", - "peer": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" } }, - "node_modules/mattermost-redux": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/mattermost-redux/-/mattermost-redux-5.33.1.tgz", - "integrity": "sha512-fHTW5PeB0xAE5u6uMds+hlWaJsUeWgE1034vekUah1X4bZCzBcMK4fM+ycGaIQ7c5Ylj9ML6Ni10XJYiQpMo5w==", - "dependencies": { - "core-js": "3.8.3", - "form-data": "3.0.0", - "gfycat-sdk": "1.4.18", - "moment-timezone": "0.5.32", - "redux": "4.0.5", - "redux-action-buffer": "1.2.0", - "redux-offline": "git+https://github.com/enahum/redux-offline.git#885024de96b6ec73650c340c8928066585c413df", - "redux-persist": "4.9.1", - "redux-persist-node-storage": "2.0.0", - "redux-thunk": "2.3.0", - "remote-redux-devtools": "0.5.16", - "reselect": "4.0.0", - "rudder-sdk-js": "1.0.14", - "serialize-error": "6.0.0", - "shallow-equals": "1.0.0" - } - }, - "node_modules/mattermost-redux/node_modules/form-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", - "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true }, - "node_modules/md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "peer": 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==" + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, - "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" - } + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "engines": { - "node": ">= 0.6" - } + "check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=" }, - "node_modules/metro": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.64.0.tgz", - "integrity": "sha512-G2OC08Rzfs0kqnSEuKo2yZxR+/eNUpA93Ru45c60uN0Dw3HPrDi+ZBipgFftC6iLE0l+6hu8roFFIofotWxybw==", + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "peer": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@babel/core": "^7.0.0", - "@babel/generator": "^7.5.0", - "@babel/parser": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "absolute-path": "^0.0.0", - "accepts": "^1.3.7", - "async": "^2.4.0", - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "connect": "^3.6.5", - "debug": "^2.2.0", - "denodeify": "^1.2.1", - "error-stack-parser": "^2.0.6", - "fs-extra": "^1.0.0", - "graceful-fs": "^4.1.3", - "image-size": "^0.6.0", - "invariant": "^2.2.4", - "jest-haste-map": "^26.5.2", - "jest-worker": "^26.0.0", - "lodash.throttle": "^4.1.1", - "metro-babel-register": "0.64.0", - "metro-babel-transformer": "0.64.0", - "metro-cache": "0.64.0", - "metro-cache-key": "0.64.0", - "metro-config": "0.64.0", - "metro-core": "0.64.0", - "metro-hermes-compiler": "0.64.0", - "metro-inspector-proxy": "0.64.0", - "metro-minify-uglify": "0.64.0", - "metro-react-native-babel-preset": "0.64.0", - "metro-resolver": "0.64.0", - "metro-runtime": "0.64.0", - "metro-source-map": "0.64.0", - "metro-symbolicate": "0.64.0", - "metro-transform-plugins": "0.64.0", - "metro-transform-worker": "0.64.0", - "mime-types": "^2.1.27", - "mkdirp": "^0.5.1", - "node-fetch": "^2.2.0", - "nullthrows": "^1.1.1", - "rimraf": "^2.5.4", - "serialize-error": "^2.1.0", - "source-map": "^0.5.6", - "strip-ansi": "^6.0.0", - "temp": "0.8.3", - "throat": "^5.0.0", - "ws": "^1.1.5", - "yargs": "^15.3.1" - }, - "bin": { - "metro": "src/cli.js" + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" } }, - "node_modules/metro-babel-register": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-babel-register/-/metro-babel-register-0.64.0.tgz", - "integrity": "sha512-Kf6YvE3kIRumGnjK0Q9LqGDIdnsX9eFGtNBmBuCVDuB9wGGA/5CgX8We8W7Y44dz1RGTcHJRhfw5iGg+pwC3aQ==", - "peer": true, - "dependencies": { - "@babel/core": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/register": "^7.0.0", - "escape-string-regexp": "^1.0.5" + "ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==" + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "requires": { + "exit": "0.1.2", + "glob": "^7.1.1" } }, - "node_modules/metro-babel-transformer": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.64.0.tgz", - "integrity": "sha512-itZaxKTgmKGEZWxNzbSZBc22NngrMZzoUNuU92aHSTGkYi2WH4XlvzEHsstmIKHMsRVKl75cA+mNmgk4gBFJKw==", - "peer": true, - "dependencies": { - "@babel/core": "^7.0.0", - "metro-source-map": "0.64.0", - "nullthrows": "^1.1.1" + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" } }, - "node_modules/metro-cache": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.64.0.tgz", - "integrity": "sha512-QvGfxe/1QQYM9XOlR8W1xqE9eHDw/AgJIgYGn/TxZxBu9Zga+Rgs1omeSZju45D8w5VWgMr83ma5kACgzvOecg==", - "peer": true, - "dependencies": { - "metro-core": "0.64.0", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4" + "cli-table3": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", + "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", + "requires": { + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" } }, - "node_modules/metro-cache-key": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.64.0.tgz", - "integrity": "sha512-O9B65G8L/fopck45ZhdRosyVZdMtUQuX5mBWEC1NRj02iWBIUPLmYMjrunqIe8vHipCMp3DtTCm/65IlBmO8jg==", - "peer": true - }, - "node_modules/metro-cache/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" } }, - "node_modules/metro-config": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.64.0.tgz", - "integrity": "sha512-QhM4asnX5KhlRWaugwVGNNXhX0Z85u5nK0UQ/A90bBb4xWyXqUe20e788VtdA75rkQiiI6wXTCIHWT0afbnjwQ==", + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "peer": true, - "dependencies": { - "cosmiconfig": "^5.0.5", - "jest-validate": "^26.5.2", - "metro": "0.64.0", - "metro-cache": "0.64.0", - "metro-core": "0.64.0", - "metro-runtime": "0.64.0" + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/metro-core": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.64.0.tgz", - "integrity": "sha512-v8ZQ5j72EaUwamQ8pLfHlOHTyp7SbdazvHPzFGDpHnwIQqIT0Bw3Syg8R4regTlVG3ngpeSEAi005UITljmMcQ==", - "peer": true, - "dependencies": { - "jest-haste-map": "^26.5.2", - "lodash.throttle": "^4.1.1", - "metro-resolver": "0.64.0" + "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" } }, - "node_modules/metro-hermes-compiler": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-hermes-compiler/-/metro-hermes-compiler-0.64.0.tgz", - "integrity": "sha512-CLAjVDWGAoGhbi2ZyPHnH5YDdfrDIx6+tzFWfHGIMTZkYBXsYta9IfYXBV8lFb6BIbrXLjlXZAOoosknetMPOA==", - "peer": true + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "node_modules/metro-inspector-proxy": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.64.0.tgz", - "integrity": "sha512-KywbH3GNSz9Iqw4UH3smgaV2dBHHYMISeN7ORntDL/G+xfgPc6vt13d+zFb907YpUcXj5N0vdoiAHI5V/0y8IA==", - "peer": true, - "dependencies": { - "connect": "^3.6.5", - "debug": "^2.2.0", - "ws": "^1.1.5", - "yargs": "^15.3.1" - }, - "bin": { - "metro-inspector-proxy": "src/cli.js" - } + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" }, - "node_modules/metro-inspector-proxy/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==", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" } }, - "node_modules/metro-inspector-proxy/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "peer": true, - "engines": { - "node": ">=6" - } + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" }, - "node_modules/metro-inspector-proxy/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" }, - "node_modules/metro-inspector-proxy/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==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.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=" }, - "node_modules/metro-inspector-proxy/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==", - "peer": true + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, - "node_modules/metro-inspector-proxy/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "dependencies": { - "ms": "2.0.0" + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" } }, - "node_modules/metro-inspector-proxy/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "peer": true, - "engines": { - "node": ">=0.10.0" + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "node_modules/metro-inspector-proxy/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==", - "peer": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" }, - "node_modules/metro-inspector-proxy/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==", - "peer": true, - "dependencies": { - "p-locate": "^4.1.0" + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" + }, + "cypress": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.6.0.tgz", + "integrity": "sha512-6sOpHjostp8gcLO34p6r/Ci342lBs8S5z9/eb3ZCQ22w2cIhMWGUoGKkosabPBfKcvRS9BE4UxybBtlIs8gTQA==", + "requires": { + "@cypress/request": "^2.88.10", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^14.14.31", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.6.0", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^5.1.0", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.2", + "enquirer": "^2.3.6", + "eventemitter2": "^6.4.3", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.6", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.3.2", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" }, - "engines": { - "node": ">=8" + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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==", + "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==" + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "node_modules/metro-inspector-proxy/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "peer": true + "cypress-multi-reporters": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cypress-multi-reporters/-/cypress-multi-reporters-1.5.0.tgz", + "integrity": "sha512-6rJ1rk1RpjZwTeydCDc8r3iOmWj2ZEYo++oDTJHNEu7eetb3W1cYDNo5CdxF/r0bo7TLQsOEpBHOCYBZfPVt/g==", + "requires": { + "debug": "^4.1.1", + "lodash": "^4.17.15" + } }, - "node_modules/metro-inspector-proxy/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==", - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "cypress-plugin-tab": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/cypress-plugin-tab/-/cypress-plugin-tab-1.0.5.tgz", + "integrity": "sha512-QtTJcifOVwwbeMP3hsOzQOKf3EqKsLyjtg9ZAGlYDntrCRXrsQhe4ZQGIthRMRLKpnP6/tTk6G0gJ2sZUfRliQ==", + "requires": { + "ally.js": "^1.4.1" } }, - "node_modules/metro-inspector-proxy/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==", - "peer": true, - "dependencies": { - "p-limit": "^2.2.0" + "cypress-terminal-report": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/cypress-terminal-report/-/cypress-terminal-report-4.1.1.tgz", + "integrity": "sha512-3KREZwj3oLT0qilcPsBhwPdogJMtKkpkIfweV8uBd0bltM9uHMWiv+JzsXr6rfCPzfDvDG9YB7x67TVxWn1aGQ==", + "requires": { + "chalk": "^4.0.0", + "fs-extra": "^10.1.0", + "semver": "^7.3.5", + "tv4": "^1.3.0" }, - "engines": { - "node": ">=8" + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "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==", + "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==", + "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==" + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } } }, - "node_modules/metro-inspector-proxy/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==", - "peer": true, - "engines": { - "node": ">=6" - } + "cypress-wait-until": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/cypress-wait-until/-/cypress-wait-until-1.7.2.tgz", + "integrity": "sha512-uZ+M8/MqRcpf+FII/UZrU7g1qYZ4aVlHcgyVopnladyoBrpoaMJ4PKZDrdOJ05H5RHbr7s9Tid635X3E+ZLU/Q==" }, - "node_modules/metro-inspector-proxy/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==", - "peer": true, - "engines": { - "node": ">=8" + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "requires": { + "assert-plus": "^1.0.0" } }, - "node_modules/metro-inspector-proxy/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==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" }, - "node_modules/metro-inspector-proxy/node_modules/ws": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", - "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", - "peer": true, - "dependencies": { - "options": ">=0.0.5", - "ultron": "1.0.x" + "dayjs": { + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz", + "integrity": "sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw==" + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" } }, - "node_modules/metro-inspector-proxy/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==", + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "peer": true }, - "node_modules/metro-inspector-proxy/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==", - "peer": 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" - } + "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/metro-inspector-proxy/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==", - "peer": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" }, - "node_modules/metro-minify-uglify": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.64.0.tgz", - "integrity": "sha512-DRwRstqXR5qfte9Nuwoov5dRXxL7fJeVlO5fGyOajWeO3+AgPjvjXh/UcLJqftkMWTPGUFuzAD5/7JC5v5FLWw==", - "peer": true, - "dependencies": { - "uglify-es": "^3.1.9" + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" } }, - "node_modules/metro-react-native-babel-preset": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.64.0.tgz", - "integrity": "sha512-HcZ0RWQRuJfpPiaHyFQJzcym+/dDIVUPwUAXWoub/C4GkGu+mPjp8vqK6g0FxokCnnI2TK0gZTza2IDfiNNscQ==", - "peer": true, - "dependencies": { - "@babel/core": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.0.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.2.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-exponentiation-operator": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-assign": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-regenerator": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "react-refresh": "^0.4.0" - }, - "peerDependencies": { - "@babel/core": "*" - } + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, - "node_modules/metro-react-native-babel-transformer": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.64.0.tgz", - "integrity": "sha512-K1sHO3ODBFCr7uEiCQ4RvVr+cQg0EHQF8ChVPnecGh/WDD8udrTq9ECwB0dRfMjAvlsHtRUlJm6ZSI8UPgum2w==", - "peer": true, - "dependencies": { - "@babel/core": "^7.0.0", - "babel-preset-fbjs": "^3.3.0", - "metro-babel-transformer": "0.64.0", - "metro-react-native-babel-preset": "0.64.0", - "metro-source-map": "0.64.0", - "nullthrows": "^1.1.1" + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" + }, + "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" }, - "peerDependencies": { - "@babel/core": "*" + "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 + } } }, - "node_modules/metro-resolver": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.64.0.tgz", - "integrity": "sha512-cJ26Id8Zf+HmS/1vFwu71K3u7ep/+HeXXAJIeVDYf+niE7AWB9FijyMtAlQgbD8elWqv1leJCnQ/xHRFBfGKYA==", - "peer": true, - "dependencies": { - "absolute-path": "^0.0.0" + "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" } }, - "node_modules/metro-runtime": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.64.0.tgz", - "integrity": "sha512-m7XbWOaIOeFX7YcxUhmnOi6Pg8EaeL89xyZ+quZyZVF1aNoTr4w8FfbKxvijpjsytKHIZtd+43m2Wt5JrqyQmQ==", - "peer": true + "dom-accessibility-api": { + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", + "integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==" }, - "node_modules/metro-source-map": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.64.0.tgz", - "integrity": "sha512-OCG2rtcp5cLEGYvAbfkl6mEc0J2FPRP4/UCEly+juBk7hawS9bCBMBfhJm/HIsvY1frk6nT2Vsl1O8YBbwyx2g==", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "invariant": "^2.2.4", - "metro-symbolicate": "0.64.0", - "nullthrows": "^1.1.1", - "ob1": "0.64.0", - "source-map": "^0.5.6", - "vlq": "^1.0.0" + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/metro-symbolicate": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.64.0.tgz", - "integrity": "sha512-qIi+YRrDWnLVmydj6gwidYLPaBsakZRibGWSspuXgHAxOI3UuLwlo4dpQ73Et0gyHjI7ZvRMRY8JPiOntf9AQQ==", - "peer": true, - "dependencies": { - "invariant": "^2.2.4", - "metro-source-map": "0.64.0", - "nullthrows": "^1.1.1", - "source-map": "^0.5.6", - "through2": "^2.0.1", - "vlq": "^1.0.0" - }, - "bin": { - "metro-symbolicate": "src/index.js" - }, - "engines": { - "node": ">=8.3" - } + "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==" }, - "node_modules/metro-transform-plugins": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.64.0.tgz", - "integrity": "sha512-iTIRBD/wBI98plfxj8jAoNUUXfXLNlyvcjPtshhpGvdwu9pzQilGfnDnOaaK+vbITcOk9w5oQectXyJwAqTr1A==", - "peer": true, - "dependencies": { - "@babel/core": "^7.0.0", - "@babel/generator": "^7.5.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "nullthrows": "^1.1.1" + "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==", + "requires": { + "once": "^1.4.0" } }, - "node_modules/metro-transform-worker": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.64.0.tgz", - "integrity": "sha512-wegRtK8GyLF6IPZRBJp+zsORgA4iX0h1DRpknyAMDCtSbJ4VU2xV/AojteOgAsDvY3ucAGsvfuZLNDJHUdUNHQ==", - "peer": true, - "dependencies": { - "@babel/core": "^7.0.0", - "@babel/generator": "^7.5.0", - "@babel/parser": "^7.0.0", - "@babel/types": "^7.0.0", - "babel-preset-fbjs": "^3.3.0", - "metro": "0.64.0", - "metro-babel-transformer": "0.64.0", - "metro-cache": "0.64.0", - "metro-cache-key": "0.64.0", - "metro-hermes-compiler": "0.64.0", - "metro-source-map": "0.64.0", - "metro-transform-plugins": "0.64.0", - "nullthrows": "^1.1.1" - } - }, - "node_modules/metro/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==", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "requires": { + "ansi-colors": "^4.1.1" } }, - "node_modules/metro/node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "peer": true, - "dependencies": { - "lodash": "^4.17.14" + "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" } }, - "node_modules/metro/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "peer": true, - "engines": { - "node": ">=6" + "es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "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" } }, - "node_modules/metro/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, - "node_modules/metro/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "peer": true }, - "node_modules/metro/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/metro/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==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, - "node_modules/metro/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==", - "peer": 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=" }, - "node_modules/metro/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, + "eslint": { + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.30.0.tgz", + "integrity": "sha512-VLqz80i3as3NdloY44BQSJpFw534L9Oh+6zJOUaViV4JPd+DaHwutqP7tcpkW3YiXbK6s05RZl7yl7cQn+lijg==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.2", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "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": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/metro/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "peer": true, - "engines": { - "node": ">=0.10.0" + "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.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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-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 + }, + "globals": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "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 + } } }, - "node_modules/metro/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==", - "peer": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/metro/node_modules/fs-extra": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", - "peer": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0" + "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 + } } }, - "node_modules/metro/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "eslint-module-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", + "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "pkg-dir": "^2.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" + } + } } }, - "node_modules/metro/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==", - "peer": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "eslint-plugin-cypress": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.11.3.tgz", + "integrity": "sha512-hOoAid+XNFtpvOzZSNWP5LDrQBEJwbZwjib4XJ1KcRYKjeVj0mAmPmucG4Egli4j/aruv+Ow/acacoloWWCl9Q==", + "dev": true, + "requires": { + "globals": "^11.12.0" } }, - "node_modules/metro/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "peer": true + "eslint-plugin-header": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", + "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==", + "dev": true, + "requires": {} }, - "node_modules/metro/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==", - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" + "eslint-plugin-import": { + "version": "2.23.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", + "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", + "dev": true, + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.1", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.4.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/metro/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==", - "peer": true, "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "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" + } + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "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" + } + } } }, - "node_modules/metro/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==", - "peer": true, - "engines": { - "node": ">=6" - } + "eslint-plugin-mattermost": { + "version": "git+ssh://git@github.com/mattermost/eslint-plugin-mattermost.git#46ad99355644a719bf32082f472048f526605181", + "integrity": "sha512-XIsRlgdUmVaJ+9P5sy45uN/cVzi5rPP2w/w06yuEIEYAH6CuVzjiY/dBjDqFKOi/Ebnoo40ur2oCtD3+yzrgVw==", + "dev": true, + "from": "eslint-plugin-mattermost@github:mattermost/eslint-plugin-mattermost#46ad99355644a719bf32082f472048f526605181" }, - "node_modules/metro/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==", - "peer": true, - "engines": { - "node": ">=8" - } + "eslint-plugin-no-only-tests": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.0.0.tgz", + "integrity": "sha512-I0PeXMs1vu21ap45hey4HQCJRqpcoIvGcNTPJe+UhUm8TwjQ6//mCrDqF8q0WS6LgmRDwQ4ovQej0AQsAHb5yg==", + "dev": true }, - "node_modules/metro/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "peer": true, - "dependencies": { - "glob": "^7.1.3" + "eslint-plugin-react": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz", + "integrity": "sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==", + "dev": true, + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.4", + "object.fromentries": "^2.0.4", + "object.values": "^1.1.4", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "string.prototype.matchall": "^4.0.5" }, - "bin": { - "rimraf": "bin.js" + "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", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } } }, - "node_modules/metro/node_modules/serialize-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=", - "peer": true, - "engines": { - "node": ">=0.10.0" + "eslint-scope": { + "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.3.0", + "estraverse": "^4.1.1" } }, - "node_modules/metro/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==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" + "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" } }, - "node_modules/metro/node_modules/ws": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", - "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", - "peer": true, - "dependencies": { - "options": ">=0.0.5", - "ultron": "1.0.x" + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" } }, - "node_modules/metro/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==", - "peer": true + "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 }, - "node_modules/metro/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==", - "peer": true, + "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" + }, "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" + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, - "node_modules/metro/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==", - "peer": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" }, - "engines": { - "node": ">=6" + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "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 + }, + "eventemitter2": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.3.tgz", + "integrity": "sha512-t0A2msp6BzOf+QAcI6z9XMktLj52OjGQg+8SJH6v5+3uxNpWYRR3wQmfA+6xtMU9kOC59qk9licus5dYcrYkMQ==" + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" } }, - "node_modules/mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "peer": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "requires": { + "pify": "^2.2.0" } }, - "node_modules/mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", - "engines": { - "node": ">= 0.6" + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" } }, - "node_modules/mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", - "dependencies": { - "mime-db": "1.45.0" - }, - "engines": { - "node": ">= 0.6" + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "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" } }, - "node_modules/mimic-fn": { + "fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" + "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.12.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz", + "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==", + "dev": true, + "requires": { + "reusify": "^1.0.4" } }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "requires": { + "pend": "~1.2.0" } }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "requires": { + "escape-string-regexp": "^1.0.5" + } }, - "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==", - "peer": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" + "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" } }, - "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==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" + "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==", + "requires": { + "to-regex-range": "^5.0.1" } }, - "node_modules/mocha": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.3.2.tgz", - "integrity": "sha512-UdmISwr/5w+uXLPKspgoV7/RXZwKRTiTjJ2/AC5ZiEztIoOYdfKb19+9jNmEInzx5pBsCyJQzarAxqIGBNYJhg==", - "peer": true, - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.1", - "debug": "4.3.1", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.1.6", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.0.0", - "log-symbols": "4.0.0", - "minimatch": "3.0.4", - "ms": "2.1.3", - "nanoid": "3.1.20", - "serialize-javascript": "5.0.1", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.1.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 10.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "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" } }, - "node_modules/mocha-junit-reporter": { - "version": "2.0.2", - "resolved": "git+ssh://git@github.com/Phrynobatrachus/mocha-junit-reporter.git#9c2eccdd4d5e78f141887f3d4bd3a9a2124688bd", - "integrity": "sha512-iLhG0FTUP7aV/yVMrMfNELmckmPT1aaXzjkBJ6U63TbYyE55s5f0ruymiXNbKVhui26DTi5NS+EMstEGvSIBwg==", - "license": "MIT", - "dependencies": { - "debug": "^2.2.0", - "md5": "^2.1.0", - "mkdirp": "~0.5.1", - "strip-ansi": "^6.0.1", - "xml": "^1.0.0" - }, - "peerDependencies": { - "mocha": ">=2.2.5" - } + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "peer": true }, - "node_modules/mocha-junit-reporter/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" } }, - "node_modules/mocha-junit-reporter/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "flatted": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.1.tgz", + "integrity": "sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg==", + "dev": true }, - "node_modules/mocha/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==", - "peer": true + "follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" }, - "node_modules/mocha/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "peer": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, - "node_modules/mocha/node_modules/debug/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==", + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true, "peer": true }, - "node_modules/mocha/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==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "fsu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fsu/-/fsu-1.1.1.tgz", + "integrity": "sha512-xQVsnjJ/5pQtcKh+KjUoZGzVWn4uNkchxTF6Lwjr4Gf7nQr8fmUfhKJ62zE77+xQg9xnxi5KUps7XGs+VC986A==" }, - "node_modules/mocha/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==", - "peer": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "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/mocha/node_modules/js-yaml": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", - "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", - "peer": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } + "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/mocha/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==", - "peer": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "peer": true + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } }, - "node_modules/mocha/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==", - "peer": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" } }, - "node_modules/mocha/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==", - "peer": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "requires": { + "async": "^3.2.0" } }, - "node_modules/mocha/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==", - "peer": true, - "engines": { - "node": ">=8" + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "requires": { + "assert-plus": "^1.0.0" } }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" } }, - "node_modules/mochawesome": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/mochawesome/-/mochawesome-6.2.2.tgz", - "integrity": "sha512-NuIxYo8zczmL5XWLNFiud21OsAJHXrflt2lcRY2u8a3TilGwglhzTPjUHZCLqJvbqj2CnIHX2ueqOh1ViUNDPw==", - "dependencies": { - "chalk": "^4.1.0", - "diff": "^5.0.0", - "json-stringify-safe": "^5.0.1", - "lodash.isempty": "^4.4.0", - "lodash.isfunction": "^3.0.9", - "lodash.isobject": "^3.0.2", - "lodash.isstring": "^4.0.1", - "mochawesome-report-generator": "^5.2.0", - "strip-ansi": "^6.0.0", - "uuid": "^8.3.2" - }, - "peerDependencies": { - "mocha": ">=7" + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" } }, - "node_modules/mochawesome-merge": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mochawesome-merge/-/mochawesome-merge-4.2.0.tgz", - "integrity": "sha512-FSMzagh+8hTShhFXdBLE4/zS2WALcDruoD0bmtiwHEjfyQszR/iEGFTgbuM5ewA5At3qeSGwGsT0k2Stt64NdQ==", - "dependencies": { - "fs-extra": "^7.0.1", - "glob": "^7.1.6", - "uuid": "^3.3.2", - "yargs": "^15.3.1" - }, - "bin": { - "mochawesome-merge": "bin/mochawesome-merge.js" - }, - "engines": { - "node": ">=10.0.0" + "global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "requires": { + "ini": "2.0.0" } }, - "node_modules/mochawesome-merge/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==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "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 + }, + "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" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + } } }, - "node_modules/mochawesome-merge/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" }, - "node_modules/mochawesome-merge/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "peer": true }, - "node_modules/mochawesome-merge/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" + "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" } }, - "node_modules/mochawesome-merge/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==" + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true }, - "node_modules/mochawesome-merge/node_modules/decamelize": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "he": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "engines": { - "node": ">=0.10.0" - } + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "peer": true }, - "node_modules/mochawesome-merge/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==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" + "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 + }, + "http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" } }, - "node_modules/mochawesome-merge/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "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 + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "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" } }, - "node_modules/mochawesome-merge/node_modules/jsonfile": { + "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/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/mochawesome-merge/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==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/mochawesome-merge/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==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" }, - "node_modules/mochawesome-merge/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==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" } }, - "node_modules/mochawesome-merge/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==", - "engines": { - "node": ">=6" - } + "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/mochawesome-merge/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==", - "engines": { - "node": ">=8" - } + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true }, - "node_modules/mochawesome-merge/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" + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "peer": true, + "requires": { + "binary-extensions": "^2.0.0" } }, - "node_modules/mochawesome-merge/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==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" + "is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" } }, - "node_modules/mochawesome-merge/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==" + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, - "node_modules/mochawesome-merge/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==", - "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" - } + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true }, - "node_modules/mochawesome-merge/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==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" + "is-ci": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "requires": { + "ci-info": "^3.1.1" } }, - "node_modules/mochawesome-report-generator": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mochawesome-report-generator/-/mochawesome-report-generator-5.2.0.tgz", - "integrity": "sha512-DDY/3jSkM/VrWy0vJtdYOf6qBLdaPaLcI7rQmBVbnclIX7AKniE1Rhz3T/cMT/7u54W5EHNo1z84z7efotq/Eg==", - "dependencies": { - "chalk": "^2.4.2", - "dateformat": "^3.0.2", - "escape-html": "^1.0.3", - "fs-extra": "^7.0.0", - "fsu": "^1.0.2", - "lodash.isfunction": "^3.0.8", - "opener": "^1.5.2", - "prop-types": "^15.7.2", - "tcomb": "^3.2.17", - "tcomb-validation": "^3.3.0", - "validator": "^10.11.0", - "yargs": "^13.2.2" - }, - "bin": { - "marge": "bin/cli.js" + "is-core-module": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", + "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", + "dev": true, + "requires": { + "has": "^1.0.3" } }, - "node_modules/mochawesome-report-generator/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==", - "engines": { - "node": ">=6" - } + "is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true }, - "node_modules/mochawesome-report-generator/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, - "node_modules/mochawesome-report-generator/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==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } + "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=" }, - "node_modules/mochawesome-report-generator/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "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==", + "requires": { + "is-extglob": "^2.1.1" } }, - "node_modules/mochawesome-report-generator/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "engines": { - "node": ">=0.10.0" + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" } }, - "node_modules/mochawesome-report-generator/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==" + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true }, - "node_modules/mochawesome-report-generator/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==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, - "node_modules/mochawesome-report-generator/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + }, + "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==", + "peer": true + }, + "is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" } }, - "node_modules/mochawesome-report-generator/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" } }, - "node_modules/mochawesome-report-generator/node_modules/jsonfile": { + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, - "node_modules/mochawesome-report-generator/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==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" + "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" } }, - "node_modules/mochawesome-report-generator/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==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, - "node_modules/mochawesome-report-generator/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==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true }, - "node_modules/mochawesome-report-generator/node_modules/p-try": { + "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-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "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 + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json5": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" } }, - "node_modules/mochawesome-report-generator/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==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" } }, - "node_modules/mochawesome-report-generator/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==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" + "jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" } }, - "node_modules/mochawesome-report-generator/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==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "jsx-ast-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", + "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", + "dev": true, + "requires": { + "array-includes": "^3.1.2", + "object.assign": "^4.1.2" } }, - "node_modules/mochawesome-report-generator/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" + "lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=" + }, + "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": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, - "node_modules/mochawesome-report-generator/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==", - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mochawesome-report-generator/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==" - }, - "node_modules/mochawesome-report-generator/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "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/mochawesome-report-generator/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==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/mochawesome/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==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/mochawesome/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "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/mochawesome/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/mochawesome/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/mochawesome/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", - "engines": { - "node": "*" - } - }, - "node_modules/moment-timezone": { - "version": "0.5.32", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.32.tgz", - "integrity": "sha512-Z8QNyuQHQAmWucp8Knmgei8YNo28aLjJq6Ma+jy1ZSpSk5nyfRT8xgUbSQvD2+2UajISfenndwvFuH3NGS+nvA==", - "dependencies": { - "moment": ">= 2.9.0" - }, - "engines": { - "node": "*" - } - }, - "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/nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", - "peer": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "peer": 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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "peer": 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==", - "peer": true - }, - "node_modules/nocache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", - "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==", - "peer": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", - "peer": true, - "dependencies": { - "minimatch": "^3.0.2" - }, - "engines": { - "node": ">= 0.10.5" - } - }, - "node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "peer": true, - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "peer": true - }, - "node_modules/node-localstorage": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-1.3.1.tgz", - "integrity": "sha512-NMWCSWWc6JbHT5PyWlNT2i8r7PgGYXVntmKawY83k/M0UJScZ5jirb61TLnqKwd815DfBQu+lR3sRw08SPzIaQ==", - "dependencies": { - "write-file-atomic": "^1.1.4" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/node-localstorage/node_modules/write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "slide": "^1.1.5" - } - }, - "node_modules/node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/node-releases": { - "version": "1.1.73", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", - "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", - "peer": true - }, - "node_modules/node-stream-zip": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.13.6.tgz", - "integrity": "sha512-c7tRSVkLNOHvasWgmZ2d86cDgTWEygnkuuHNOY9c0mR3yLZtQTTrGvMaJ/fPs6+LOJn3240y30l5sjLaXFtcvw==", - "peer": true, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/antelle" - } - }, - "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" - } - }, - "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==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/notp": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/notp/-/notp-2.0.3.tgz", - "integrity": "sha1-qf0R4lz+HMs5/GaJVE7kwQ75pXc=", - "engines": { - "node": "> v0.6.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "peer": true - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/ob1": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.64.0.tgz", - "integrity": "sha512-CO1N+5dhvy+MoAwxz8+fymEUcwsT4a+wHhrHFb02LppcJdHxgcBWviwEhUwKOD2kLMQ7ijrrzybOqpGcqEtvpQ==", - "peer": true - }, - "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=", - "peer": 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=", - "peer": 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=", - "peer": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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=", - "peer": 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==", - "peer": 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==", - "peer": 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=", - "peer": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", - "dev": true, - "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", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "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=", - "peer": 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==", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", - "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", - "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "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=", - "peer": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.values": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", - "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "peer": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "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==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "peer": true, - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "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": { - "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": ">= 0.8.0" - } - }, - "node_modules/options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", - "peer": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ora": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", - "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", - "peer": true, - "dependencies": { - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-spinners": "^2.0.0", - "log-symbols": "^2.2.0", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ora/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==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ora/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==", - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "peer": true, - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "peer": true, - "dependencies": { - "chalk": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "peer": true, - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "peer": true, - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/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==", - "peer": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ora/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==", - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "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=", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ospath": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", - "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=" - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "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/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/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==", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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=", - "engines": { - "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=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "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==" - }, - "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/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/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "node_modules/picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "peer": true, - "dependencies": { - "node-modules-regexp": "^1.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "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/platform": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.3.tgz", - "integrity": "sha1-ZGx3ARiZhwtqCQPnXpl+jlHadGE=" - }, - "node_modules/plist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.2.tgz", - "integrity": "sha512-MSrkwZBdQ6YapHy87/8hDU8MnIcyxBKjeF+McXnr5A9MtffPewTs7G3hlpodT5TacyfIyFTaJEhh3GGcmasTgQ==", - "peer": true, - "dependencies": { - "base64-js": "^1.5.1", - "xmlbuilder": "^9.0.7", - "xmldom": "^0.5.0" - }, - "engines": { - "node": ">=6" - } - }, - "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=", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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.8.0" - } - }, - "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==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/pretty-format/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==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-format/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/pretty-format/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/pretty-format/node_modules/react-is": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", - "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==" - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "peer": true - }, - "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/promise": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", - "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", - "peer": true, - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/prompts": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", - "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", - "peer": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "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==", - "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", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qrcode-terminal": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", - "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "engines": { - "node": ">=0.4.x" - } - }, - "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/ramda": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", - "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "peer": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/react": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz", - "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-devtools-core": { - "version": "4.13.5", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.13.5.tgz", - "integrity": "sha512-k+P5VSKM6P22Go9IQ8dJmjj9fbztvKt1iRDI/4wS5oTvd1EnytIJMYB59wZt+D3kgp64jklNX/MRmY42xAQ08g==", - "peer": true, - "dependencies": { - "shell-quote": "^1.6.1", - "ws": "^7" - } - }, - "node_modules/react-devtools-core/node_modules/ws": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", - "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", - "peer": 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/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-native": { - "version": "0.64.2", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.64.2.tgz", - "integrity": "sha512-Ty/fFHld9DcYsFZujXYdeVjEhvSeQcwuTGXezyoOkxfiGEGrpL/uwUZvMzwShnU4zbbTKDu2PAm/uwuOittRGA==", - "peer": true, - "dependencies": { - "@jest/create-cache-key-function": "^26.5.0", - "@react-native-community/cli": "^5.0.1-alpha.1", - "@react-native-community/cli-platform-android": "^5.0.1-alpha.1", - "@react-native-community/cli-platform-ios": "^5.0.1-alpha.1", - "@react-native/assets": "1.0.0", - "@react-native/normalize-color": "1.0.0", - "@react-native/polyfills": "1.0.0", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "base64-js": "^1.1.2", - "event-target-shim": "^5.0.1", - "hermes-engine": "~0.7.0", - "invariant": "^2.2.4", - "jsc-android": "^245459.0.0", - "metro-babel-register": "0.64.0", - "metro-react-native-babel-transformer": "0.64.0", - "metro-runtime": "0.64.0", - "metro-source-map": "0.64.0", - "nullthrows": "^1.1.1", - "pretty-format": "^26.5.2", - "promise": "^8.0.3", - "prop-types": "^15.7.2", - "react-devtools-core": "^4.6.0", - "react-native-codegen": "^0.0.6", - "react-refresh": "^0.4.0", - "regenerator-runtime": "^0.13.2", - "scheduler": "^0.20.1", - "shelljs": "^0.8.4", - "stacktrace-parser": "^0.1.3", - "use-subscription": "^1.0.0", - "whatwg-fetch": "^3.0.0", - "ws": "^6.1.4" - }, - "bin": { - "react-native": "cli.js" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "react": "17.0.1" - } - }, - "node_modules/react-native-codegen": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.6.tgz", - "integrity": "sha512-cMvrUelD81wiPitEPiwE/TCNscIVauXxmt4NTGcy18HrUd0WRWXfYzAQGXm0eI87u3NMudNhqFj2NISJenxQHg==", - "peer": true, - "dependencies": { - "flow-parser": "^0.121.0", - "jscodeshift": "^0.11.0", - "nullthrows": "^1.1.1" - } - }, - "node_modules/react-refresh": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", - "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "peer": 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/readable-stream/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==", - "peer": true - }, - "node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "peer": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/recast": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.20.4.tgz", - "integrity": "sha512-6qLIBGGRcwjrTZGIiBpJVC/NeuXpogXNyRQpqU1zWPUigCphvApoCs9KIwDYh1eDuJ6dAFlQoi/QUyE5KQ6RBQ==", - "peer": true, - "dependencies": { - "ast-types": "0.14.2", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/recast/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==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/recast/node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", - "peer": true - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "peer": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/redux": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", - "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", - "dependencies": { - "loose-envify": "^1.4.0", - "symbol-observable": "^1.2.0" - } - }, - "node_modules/redux-action-buffer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redux-action-buffer/-/redux-action-buffer-1.2.0.tgz", - "integrity": "sha1-LsCh2JnMn29EzN60Me5SrUHdl1U=" - }, - "node_modules/redux-devtools-core": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/redux-devtools-core/-/redux-devtools-core-0.2.1.tgz", - "integrity": "sha512-RAGOxtUFdr/1USAvxrWd+Gq/Euzgw7quCZlO5TgFpDfG7rB5tMhZUrNyBjpzgzL2yMk0eHnPYIGm7NkIfRzHxQ==", - "deprecated": "Package moved to @redux-devtools/app.", - "dependencies": { - "get-params": "^0.1.2", - "jsan": "^3.1.13", - "lodash": "^4.17.11", - "nanoid": "^2.0.0", - "remotedev-serialize": "^0.1.8" - } - }, - "node_modules/redux-devtools-core/node_modules/nanoid": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", - "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" - }, - "node_modules/redux-devtools-instrument": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/redux-devtools-instrument/-/redux-devtools-instrument-1.10.0.tgz", - "integrity": "sha512-X8JRBCzX2ADSMp+iiV7YQ8uoTNyEm0VPFPd4T854coz6lvRiBrFSqAr9YAS2n8Kzxx8CJQotR0QF9wsMM+3DvA==", - "deprecated": "Package moved to @redux-devtools/instrument.", - "dependencies": { - "lodash": "^4.17.19", - "symbol-observable": "^1.2.0" - }, - "peerDependencies": { - "redux": "^3.4.0 || ^4.0.0" - } - }, - "node_modules/redux-offline": { - "version": "1.1.5", - "resolved": "git+ssh://git@github.com/enahum/redux-offline.git#885024de96b6ec73650c340c8928066585c413df", - "integrity": "sha512-srmJ1vWm8ZQTYflZCf7oUs3WBX83GyCIzsFUpwxUg2wcDHngSHjjShRTCgmkciPkVmM4aJ33i9baYS9jRC+zLA==", - "license": "MIT", - "dependencies": { - "@react-native-community/netinfo": "^4.1.3", - "redux-persist": "^4.5.0" - }, - "peerDependencies": { - "redux": ">=3" - } - }, - "node_modules/redux-persist": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-4.9.1.tgz", - "integrity": "sha512-XoOmfPyo9GEU/WLH9FgB47dNIN9l5ArjHes4o7vUWx9nxZoPxnVodhuHdyc4Ot+fMkdj3L2LTqSHhwrkr0QFUg==", - "dependencies": { - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.4", - "lodash-es": "^4.17.4" - } - }, - "node_modules/redux-persist-node-storage": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redux-persist-node-storage/-/redux-persist-node-storage-2.0.0.tgz", - "integrity": "sha1-QAHjK4tDxzgH7y2pujAfSxxmr3k=", - "dependencies": { - "node-localstorage": "^1.3.0" - } - }, - "node_modules/redux-thunk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", - "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" - }, - "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==", - "peer": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "peer": true, - "dependencies": { - "regenerate": "^1.4.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" - }, - "node_modules/regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", - "peer": 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==", - "peer": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "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": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", - "peer": true, - "dependencies": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", - "peer": true - }, - "node_modules/regjsparser": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", - "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", - "peer": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "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=", - "peer": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/remote-redux-devtools": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/remote-redux-devtools/-/remote-redux-devtools-0.5.16.tgz", - "integrity": "sha512-xZ2D1VRIWzat5nsvcraT6fKEX9Cfi+HbQBCwzNnUAM8Uicm/anOc60XGalcaDPrVmLug7nhDl2nimEa3bL3K9w==", - "dependencies": { - "jsan": "^3.1.13", - "querystring": "^0.2.0", - "redux-devtools-core": "^0.2.1", - "redux-devtools-instrument": "^1.9.4", - "rn-host-detect": "^1.1.5", - "socketcluster-client": "^14.2.1" - } - }, - "node_modules/remotedev-serialize": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/remotedev-serialize/-/remotedev-serialize-0.1.9.tgz", - "integrity": "sha512-5tFdZg9mSaAWTv6xmQ7HtHjKMLSFQFExEZOtJe10PLsv1wb7cy7kYHtBvTYRro27/3fRGEcQBRNKSaixOpb69w==", - "deprecated": "Package moved to @redux-devtools/serialize.", - "dependencies": { - "jsan": "^3.1.13" - } - }, - "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=", - "peer": true - }, - "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==", - "peer": 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=", - "peer": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/request-progress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", - "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", - "dependencies": { - "throttleit": "^1.0.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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==" - }, - "node_modules/reselect": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", - "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==" - }, - "node_modules/resolve": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.16.1.tgz", - "integrity": "sha512-rmAglCSqWWMrrBv/XM6sW0NuRFiKViw/W4d9EbC4pt+49H8JwHy+mcGmALTEg504AUDcLTvb1T2q3E9AnmY+ig==", - "dependencies": { - "path-parse": "^1.0.6" - } - }, - "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/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", - "peer": true - }, - "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==", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "peer": true, - "engines": { - "node": ">=0.12" - } - }, - "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": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/rn-host-detect": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/rn-host-detect/-/rn-host-detect-1.2.0.tgz", - "integrity": "sha512-btNg5kzHcjZZ7t7mvvV/4wNJ9e3MPgrWivkRgWURzXL0JJ0pwWlU4zrbmdlz3HHzHOxhBhHB4D+/dbMFfu4/4A==" - }, - "node_modules/rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "peer": true, - "engines": { - "node": "6.* || >= 7.*" - } - }, - "node_modules/rudder-sdk-js": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/rudder-sdk-js/-/rudder-sdk-js-1.0.14.tgz", - "integrity": "sha512-q86qmF6VUXjTUCv1YRFc2V1pt408D641nD2ymKFaLtGZTLjkZCzotQ7cW8c48vPKlSWwekkBlA3kghy/NKGwOw==" - }, - "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/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "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==" - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "peer": true, - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", - "peer": true, - "dependencies": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "bin": { - "sane": "src/cli.js" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/sane/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "peer": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/sane/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "peer": 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/sane/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=", - "peer": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/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==", - "peer": 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/sane/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "peer": 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" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sane/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "peer": 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/sane/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=", - "peer": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/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==", - "peer": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sane/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=", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "peer": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/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=", - "peer": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "peer": 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/sane/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=", - "peer": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/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=", - "peer": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/sane/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=", - "peer": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/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=", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/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=", - "peer": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "peer": true - }, - "node_modules/sc-channel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/sc-channel/-/sc-channel-1.2.0.tgz", - "integrity": "sha512-M3gdq8PlKg0zWJSisWqAsMmTVxYRTpVRqw4CWAdKBgAfVKumFcTjoCV0hYu7lgUXccCtCD8Wk9VkkE+IXCxmZA==", - "dependencies": { - "component-emitter": "1.2.1" - } - }, - "node_modules/sc-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/sc-errors/-/sc-errors-2.0.1.tgz", - "integrity": "sha512-JoVhq3Ud+3Ujv2SIG7W0XtjRHsrNgl6iXuHHsh0s+Kdt5NwI6N2EGAZD4iteitdDv68ENBkpjtSvN597/wxPSQ==" - }, - "node_modules/sc-formatter": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/sc-formatter/-/sc-formatter-3.0.2.tgz", - "integrity": "sha512-9PbqYBpCq+OoEeRQ3QfFIGE6qwjjBcd2j7UjgDlhnZbtSnuGgHdcRklPKYGuYFH82V/dwd+AIpu8XvA1zqTd+A==" - }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "peer": true, - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "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=", - "peer": true - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "peer": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/send/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==", - "peer": true - }, - "node_modules/serialize-error": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-6.0.0.tgz", - "integrity": "sha512-3vmBkMZLQO+BR4RPHcyRGdE09XCF6cvxzk2N2qn8Er3F91cy8Qt7VvEbZBOpaL53qsBbe2cFOefU6tRY6WDelA==", - "dependencies": { - "type-fest": "^0.12.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", - "integrity": "sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "peer": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "peer": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - }, - "engines": { - "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=" - }, - "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==", - "peer": 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=", - "peer": 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=", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "peer": true - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "peer": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shallow-equals": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shallow-equals/-/shallow-equals-1.0.0.tgz", - "integrity": "sha1-JLdL8cY0wR7Uxxgqbfb7MA3OQ5A=" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "peer": true, - "dependencies": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "peer": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==" - }, - "node_modules/simple-plist": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.1.1.tgz", - "integrity": "sha512-pKMCVKvZbZTsqYR6RKgLfBHkh2cV89GXcA/0CVPje3sOiNOnXA8+rp/ciAMZ7JRaUdLzlEM6JFfUn+fS6Nt3hg==", - "peer": true, - "dependencies": { - "bplist-creator": "0.0.8", - "bplist-parser": "0.2.0", - "plist": "^3.0.1" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "peer": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi/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==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-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==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-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==" - }, - "node_modules/slice-ansi/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "engines": { - "node": "*" - } - }, - "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==", - "peer": 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==", - "peer": 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=", - "peer": 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==", - "peer": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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=", - "peer": 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==", - "peer": 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=", - "peer": 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=", - "peer": 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=", - "peer": 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=", - "peer": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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=", - "peer": 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=", - "peer": 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==", - "peer": 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=", - "peer": 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==", - "peer": 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=", - "peer": true - }, - "node_modules/socketcluster-client": { - "version": "14.3.2", - "resolved": "https://registry.npmjs.org/socketcluster-client/-/socketcluster-client-14.3.2.tgz", - "integrity": "sha512-xDtgW7Ss0ARlfhx53bJ5GY5THDdEOeJnT+/C9Rmrj/vnZr54xeiQfrCZJbcglwe732nK3V+uZq87IvrRl7Hn4g==", - "dependencies": { - "buffer": "^5.2.1", - "clone": "2.1.1", - "component-emitter": "1.2.1", - "linked-list": "0.1.0", - "querystring": "0.2.0", - "sc-channel": "^1.2.0", - "sc-errors": "^2.0.1", - "sc-formatter": "^3.0.1", - "uuid": "3.2.1", - "ws": "^7.5.0" - } - }, - "node_modules/socketcluster-client/node_modules/uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", - "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.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/socketcluster-client/node_modules/ws": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", - "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", - "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/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/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==", - "peer": 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" - } - }, - "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==", - "peer": 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==", - "peer": true, - "engines": { - "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==", - "peer": true - }, - "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/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==", - "peer": 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=" - }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", - "peer": true - }, - "node_modules/stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "peer": true, - "dependencies": { - "type-fest": "^0.7.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/stacktrace-parser/node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "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=", - "peer": 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=", - "peer": 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=", - "peer": 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=", - "peer": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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=", - "peer": 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=", - "peer": 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==", - "peer": 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==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/stream-buffers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=", - "peer": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "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==", - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/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==", - "peer": true - }, - "node_modules/string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", - "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.2", - "get-intrinsic": "^1.1.1", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.3.1", - "side-channel": "^1.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==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "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==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "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=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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=", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "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==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sudo-prompt": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", - "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", - "peer": true - }, - "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==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.6.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.1.tgz", - "integrity": "sha512-42VLtQUOLefAvKFAQIxIZDaThq6om/PrfP0CYk3/vn+y4BMNkKnbli8ON2QCiHov4KkzOSJ/xSoBJdayiiYvVQ==", - "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/table/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/table/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/table/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/table/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/table/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/table/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/tcomb": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/tcomb/-/tcomb-3.2.29.tgz", - "integrity": "sha512-di2Hd1DB2Zfw6StGv861JoAF5h/uQVu/QJp2g8KVbtfKnoHdBQl5M32YWq6mnSYBQ1vFFrns5B1haWJL7rKaOQ==" - }, - "node_modules/tcomb-validation": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/tcomb-validation/-/tcomb-validation-3.4.1.tgz", - "integrity": "sha512-urVVMQOma4RXwiVCa2nM2eqrAomHROHvWPuj6UkDGz/eb5kcy0x6P0dVt6kzpUZtYMNoAqJLWmz1BPtxrtjtrA==", - "dependencies": { - "tcomb": "^3.0.0" - } - }, - "node_modules/temp": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", - "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", - "engines": [ - "node >=0.8.0" - ], - "peer": true, - "dependencies": { - "os-tmpdir": "^1.0.0", - "rimraf": "~2.2.6" - } - }, - "node_modules/temp/node_modules/rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "peer": true, - "bin": { - "rimraf": "bin.js" - } - }, - "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/thirty-two": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-0.0.2.tgz", - "integrity": "sha1-QlPinYywWPBIAmfFaYwOSSflS2o=", - "engines": { - "node": ">=0.2.6" - } - }, - "node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "peer": true - }, - "node_modules/throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=" - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "peer": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "peer": 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", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "engines": { - "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=", - "peer": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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=", - "peer": 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==", - "peer": 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", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "peer": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz", - "integrity": "sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q==", - "dev": true, - "dependencies": { - "json5": "^2.2.0", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - } - }, - "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/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/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tv4": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", - "integrity": "sha1-0CDIRvrdUMhVq7JeuuzGj8EPeWM=", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "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.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.2.tgz", - "integrity": "sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "deprecated": "support for ECMAScript is superseded by `uglify-js` as of v3.13.0", - "peer": true, - "dependencies": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/uglify-es/node_modules/commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "peer": true - }, - "node_modules/uglify-es/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==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", - "peer": true - }, - "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==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "peer": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "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==", - "peer": 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=", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "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=", - "peer": 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=", - "peer": 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=", - "peer": 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=", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "engines": { - "node": ">=8" - } - }, - "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==", - "dependencies": { - "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", - "peer": true - }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.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=" - }, - "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==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/use-subscription": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", - "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==", - "peer": true, - "dependencies": { - "object-assign": "^4.1.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "peer": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "peer": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "bin": { - "uuid": "bin/uuid" - } - }, - "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/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/validator": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", - "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/vlq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", - "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "peer": true - }, - "node_modules/walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "peer": true, - "dependencies": { - "makeerror": "1.0.x" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "peer": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==", - "peer": true - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "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=" - }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "peer": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "peer": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "peer": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "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/workerpool": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", - "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", - "peer": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/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==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "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==", - "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==" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "peer": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/xcode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/xcode/-/xcode-2.1.0.tgz", - "integrity": "sha512-uCrmPITrqTEzhn0TtT57fJaNaw8YJs1aCzs+P/QqxsDbvPZSv7XMPPwXrKvHtD6pLjBM/NaVwraWJm8q83Y4iQ==", - "peer": true, - "dependencies": { - "simple-plist": "^1.0.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=" - }, - "node_modules/xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmldoc": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.2.tgz", - "integrity": "sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ==", - "peer": true, - "dependencies": { - "sax": "^1.2.1" - } - }, - "node_modules/xmldom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.5.0.tgz", - "integrity": "sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA==", - "peer": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "peer": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "peer": 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/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "peer": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "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==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/compat-data": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", - "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", - "peer": true - }, - "@babel/core": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", - "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", - "peer": true, - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helpers": "^7.14.6", - "@babel/parser": "^7.14.6", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "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==", - "peer": true, - "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true - } - } - }, - "@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", - "requires": { - "@babel/types": "^7.14.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", - "peer": true, - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", - "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", - "peer": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", - "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", - "peer": true, - "requires": { - "@babel/compat-data": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz", - "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==", - "peer": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", - "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", - "peer": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "regexpu-core": "^4.7.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", - "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", - "peer": 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" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true - } - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", - "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", - "peer": true, - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", - "peer": true, - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", - "peer": true, - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-module-transforms": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", - "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", - "peer": true, - "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-simple-access": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", - "peer": true, - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "peer": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz", - "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", - "peer": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-wrap-function": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", - "peer": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", - "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", - "peer": true, - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", - "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", - "peer": true, - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", - "requires": { - "@babel/types": "^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==" - }, - "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", - "peer": true - }, - "@babel/helper-wrap-function": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz", - "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", - "peer": true, - "requires": { - "@babel/helper-function-name": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helpers": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", - "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", - "peer": true, - "requires": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@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==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "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" - } - } - } - }, - "@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==" - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz", - "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", - "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", - "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", - "peer": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz", - "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", - "peer": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", - "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-default-from": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.14.5.tgz", - "integrity": "sha512-T8KZ5abXvKMjF6JcoXjgac3ElmXf0AWzJwi2O/42Jk+HmCky3D9+i1B7NPP1FblyceqTevKeV/9szeikFoaMDg==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-export-default-from": "^7.14.5" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", - "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", - "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", - "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", - "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", - "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", - "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", - "peer": true, - "requires": { - "@babel/compat-data": "^7.14.7", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.14.5" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", - "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", - "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", - "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", - "peer": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", - "peer": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", - "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", - "peer": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@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==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "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==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "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==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@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==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-default-from": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.14.5.tgz", - "integrity": "sha512-snWDxjuaPEobRBnhpqEfZ8RMxDbHt8+87fiEioGuE+Uc0xAKgSD8QiuL3lF93hPVQfZFAcYwrrf+H5qUhike3Q==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@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==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-flow": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.14.5.tgz", - "integrity": "sha512-9WK5ZwKCdWHxVuU13XNT6X73FGmutAXeor5lGFq6qhOFtMFUF4jkbijuyUdZZlpYq6E2hZeZf/u3959X9wsv0Q==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@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==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", - "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@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==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "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==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "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==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "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==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "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==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "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==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "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==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "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==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", - "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", - "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", - "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", - "peer": true, - "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", - "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz", - "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz", - "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==", - "peer": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", - "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", - "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", - "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", - "peer": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", - "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", - "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", - "peer": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.14.5.tgz", - "integrity": "sha512-KhcolBKfXbvjwI3TV7r7TkYm8oNXHNBqGOy6JDVwtecFaRoKYsUUqJdS10q0YDKW1c6aZQgO+Ys3LfGkox8pXA==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-flow": "^7.14.5" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz", - "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", - "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", - "peer": true, - "requires": { - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", - "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", - "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", - "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", - "peer": true, - "requires": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", - "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", - "peer": true, - "requires": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-simple-access": "^7.14.5", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz", - "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", - "peer": true, - "requires": { - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.5", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", - "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", - "peer": true, - "requires": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz", - "integrity": "sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg==", - "peer": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", - "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-object-assign": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.14.5.tgz", - "integrity": "sha512-lvhjk4UN9xJJYB1mI5KC0/o1D5EcJXdbhVe+4fSk08D6ZN+iuAIs7LJC+71h8av9Ew4+uRq9452v9R93SFmQlQ==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", - "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", - "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", - "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.5.tgz", - "integrity": "sha512-07aqY1ChoPgIxsuDviptRpVkWCSbXWmzQqcgy65C6YSFOfPFvb/DX3bBRHh7pCd/PMEEYHYWUTSVkCbkVainYQ==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.5.tgz", - "integrity": "sha512-7RylxNeDnxc1OleDm0F5Q/BSL+whYRbOAR+bwgCxIr0L32v7UFh/pz1DLMZideAUxKT6eMoS2zQH6fyODLEi8Q==", - "peer": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-jsx": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.14.5.tgz", - "integrity": "sha512-M/fmDX6n0cfHK/NLTcPmrfVAORKDhK8tyjDhyxlUjYyPYYO8FRWwuxBA3WBx8kWN/uBUuwGa3s/0+hQ9JIN3Tg==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.14.5.tgz", - "integrity": "sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", - "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", - "peer": true, - "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", - "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz", - "integrity": "sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg==", - "peer": true, - "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", - "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", - "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", - "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", - "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", - "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.6.tgz", - "integrity": "sha512-XlTdBq7Awr4FYIzqhmYY80WN0V0azF74DMPyFqVHBvf81ZUgc4X7ZOpx6O8eLDK6iM5cCQzeyJw0ynTaefixRA==", - "peer": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.6", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-typescript": "^7.14.5" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", - "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", - "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", - "peer": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/preset-env": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.7.tgz", - "integrity": "sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==", - "peer": true, - "requires": { - "@babel/compat-data": "^7.14.7", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-async-generator-functions": "^7.14.7", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-class-static-block": "^7.14.5", - "@babel/plugin-proposal-dynamic-import": "^7.14.5", - "@babel/plugin-proposal-export-namespace-from": "^7.14.5", - "@babel/plugin-proposal-json-strings": "^7.14.5", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-numeric-separator": "^7.14.5", - "@babel/plugin-proposal-object-rest-spread": "^7.14.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-private-methods": "^7.14.5", - "@babel/plugin-proposal-private-property-in-object": "^7.14.5", - "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", - "@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-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.14.5", - "@babel/plugin-transform-async-to-generator": "^7.14.5", - "@babel/plugin-transform-block-scoped-functions": "^7.14.5", - "@babel/plugin-transform-block-scoping": "^7.14.5", - "@babel/plugin-transform-classes": "^7.14.5", - "@babel/plugin-transform-computed-properties": "^7.14.5", - "@babel/plugin-transform-destructuring": "^7.14.7", - "@babel/plugin-transform-dotall-regex": "^7.14.5", - "@babel/plugin-transform-duplicate-keys": "^7.14.5", - "@babel/plugin-transform-exponentiation-operator": "^7.14.5", - "@babel/plugin-transform-for-of": "^7.14.5", - "@babel/plugin-transform-function-name": "^7.14.5", - "@babel/plugin-transform-literals": "^7.14.5", - "@babel/plugin-transform-member-expression-literals": "^7.14.5", - "@babel/plugin-transform-modules-amd": "^7.14.5", - "@babel/plugin-transform-modules-commonjs": "^7.14.5", - "@babel/plugin-transform-modules-systemjs": "^7.14.5", - "@babel/plugin-transform-modules-umd": "^7.14.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", - "@babel/plugin-transform-new-target": "^7.14.5", - "@babel/plugin-transform-object-super": "^7.14.5", - "@babel/plugin-transform-parameters": "^7.14.5", - "@babel/plugin-transform-property-literals": "^7.14.5", - "@babel/plugin-transform-regenerator": "^7.14.5", - "@babel/plugin-transform-reserved-words": "^7.14.5", - "@babel/plugin-transform-shorthand-properties": "^7.14.5", - "@babel/plugin-transform-spread": "^7.14.6", - "@babel/plugin-transform-sticky-regex": "^7.14.5", - "@babel/plugin-transform-template-literals": "^7.14.5", - "@babel/plugin-transform-typeof-symbol": "^7.14.5", - "@babel/plugin-transform-unicode-escapes": "^7.14.5", - "@babel/plugin-transform-unicode-regex": "^7.14.5", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.14.5", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", - "core-js-compat": "^3.15.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true - } - } - }, - "@babel/preset-flow": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.14.5.tgz", - "integrity": "sha512-pP5QEb4qRUSVGzzKx9xqRuHUrM/jEzMqdrZpdMA+oUCRgd5zM1qGr5y5+ZgAL/1tVv1H0dyk5t4SKJntqyiVtg==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-flow-strip-types": "^7.14.5" - } - }, - "@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.14.5.tgz", - "integrity": "sha512-u4zO6CdbRKbS9TypMqrlGH7sd2TAJppZwn3c/ZRLeO/wGsbddxgbPDUZVNrie3JWYLQ9vpineKlsrWFvO6Pwkw==", - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-typescript": "^7.14.5" - } - }, - "@babel/register": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.14.5.tgz", - "integrity": "sha512-TjJpGz/aDjFGWsItRBQMOFTrmTI9tr79CHOK+KIvLeCkbxuOAk2M5QHjvruIMGoo9OuccMh5euplPzc5FjAKGg==", - "peer": true, - "requires": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.0", - "source-map-support": "^0.5.16" - } - }, - "@babel/runtime": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", - "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "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==", - "requires": { - "@babel/highlight": "^7.14.5" - } - } - } - }, - "@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "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==", - "requires": { - "@babel/highlight": "^7.14.5" - } - } - } - }, - "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - } - }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "peer": true, - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, - "@cypress/request": { - "version": "2.88.5", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.5.tgz", - "integrity": "sha512-TzEC1XMi1hJkywWpRfD2clreTa/Z+lOrXDCxxBTBPEcY5azdPi56A6Xw+O4tWJnaJH3iIE7G5aDXZC6JgRZLcA==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "@cypress/skip-test": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@cypress/skip-test/-/skip-test-2.6.1.tgz", - "integrity": "sha512-X+ibefBiuOmC5gKG91wRIT0/OqXeETYvu7zXktjZ3yLeO186Y8ia0K7/gQUpAwuUi28DuqMd1+7tBQVtPkzbPA==" - }, - "@cypress/xvfb": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", - "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", - "requires": { - "debug": "^3.1.0", - "lodash.once": "^4.1.1" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@eslint/eslintrc": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", - "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "globals": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", - "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "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 - } - } - }, - "@hapi/hoek": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.0.tgz", - "integrity": "sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug==", - "peer": true - }, - "@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "peer": true, - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", - "dev": true - }, - "@jest/create-cache-key-function": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-26.6.2.tgz", - "integrity": "sha512-LgEuqU1f/7WEIPYqwLPIvvHuc1sB6gMVbT6zWhin3txYUNYK/kGQrC1F2WR4gR34YlI9bBtViTm5z98RqVZAaw==", - "peer": true, - "requires": { - "@jest/types": "^26.6.2" - } - }, - "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.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==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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==", - "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==" - } - } - }, - "@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" - } - }, - "@react-native-community/cli": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-5.0.1.tgz", - "integrity": "sha512-9VzSYUYSEqxEH5Ib2UNSdn2eyPiYZ4T7Y79o9DKtRBuSaUIwbCUdZtIm+UUjBpLS1XYBkW26FqL8/UdZDmQvXw==", - "peer": true, - "requires": { - "@react-native-community/cli-debugger-ui": "^5.0.1", - "@react-native-community/cli-hermes": "^5.0.1", - "@react-native-community/cli-server-api": "^5.0.1", - "@react-native-community/cli-tools": "^5.0.1", - "@react-native-community/cli-types": "^5.0.1", - "appdirsjs": "^1.2.4", - "chalk": "^3.0.0", - "command-exists": "^1.2.8", - "commander": "^2.19.0", - "cosmiconfig": "^5.1.0", - "deepmerge": "^3.2.0", - "envinfo": "^7.7.2", - "execa": "^1.0.0", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0", - "glob": "^7.1.3", - "graceful-fs": "^4.1.3", - "joi": "^17.2.1", - "leven": "^3.1.0", - "lodash": "^4.17.15", - "metro": "^0.64.0", - "metro-config": "^0.64.0", - "metro-core": "^0.64.0", - "metro-react-native-babel-transformer": "^0.64.0", - "metro-resolver": "^0.64.0", - "metro-runtime": "^0.64.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "node-stream-zip": "^1.9.1", - "ora": "^3.4.0", - "pretty-format": "^26.6.2", - "prompts": "^2.4.0", - "semver": "^6.3.0", - "serve-static": "^1.13.1", - "strip-ansi": "^5.2.0", - "sudo-prompt": "^9.0.0", - "wcwidth": "^1.0.1" - }, - "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==", - "peer": 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==", - "peer": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "peer": 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==", - "peer": true - } - } - }, - "deepmerge": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", - "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==", - "peer": true - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "peer": 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" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "peer": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.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==", - "peer": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "peer": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "peer": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "peer": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "peer": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "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=", - "peer": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "peer": 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==", - "peer": 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==", - "peer": 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==", - "peer": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "peer": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "peer": 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=", - "peer": 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==", - "peer": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "peer": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "peer": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "@react-native-community/cli-debugger-ui": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-5.0.1.tgz", - "integrity": "sha512-5gGKaaXYOVE423BUqxIfvfAVSj5Cg1cU/TpGbeg/iqpy2CfqyWqJB3tTuVUbOOiOvR5wbU8tti6pIi1pchJ+oA==", - "peer": true, - "requires": { - "serve-static": "^1.13.1" - } - }, - "@react-native-community/cli-hermes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-5.0.1.tgz", - "integrity": "sha512-nD+ZOFvu5MfjLB18eDJ01MNiFrzj8SDtENjGpf0ZRFndOWASDAmU54/UlU/wj8OzTToK1+S1KY7j2P2M1gleww==", - "peer": true, - "requires": { - "@react-native-community/cli-platform-android": "^5.0.1", - "@react-native-community/cli-tools": "^5.0.1", - "chalk": "^3.0.0", - "hermes-profile-transformer": "^0.0.6", - "ip": "^1.1.5" - } - }, - "@react-native-community/cli-platform-android": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-5.0.1.tgz", - "integrity": "sha512-qv9GJX6BJ+Y4qvV34vgxKwwN1cnveXUdP6y2YmTW7XoAYs5YUzKqHajpY58EyucAL2y++6+573t5y4U/9IIoww==", - "peer": true, - "requires": { - "@react-native-community/cli-tools": "^5.0.1", - "chalk": "^3.0.0", - "execa": "^1.0.0", - "fs-extra": "^8.1.0", - "glob": "^7.1.3", - "jetifier": "^1.6.2", - "lodash": "^4.17.15", - "logkitty": "^0.7.1", - "slash": "^3.0.0", - "xmldoc": "^1.1.2" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "peer": 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" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "peer": 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" - } - }, - "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==", - "peer": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "peer": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "peer": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "peer": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "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=", - "peer": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "peer": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "peer": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "peer": 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=", - "peer": true - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "peer": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "peer": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "@react-native-community/cli-platform-ios": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-5.0.1.tgz", - "integrity": "sha512-Nr/edBEYJfElgBNvjDevs2BuDicsvQaM8nYkTGgp33pyuCZRBxsYxQqfsNmnLalTzcYaebjWj6AnjUSxzQBWqg==", - "peer": true, - "requires": { - "@react-native-community/cli-tools": "^5.0.1", - "chalk": "^3.0.0", - "glob": "^7.1.3", - "js-yaml": "^3.13.1", - "lodash": "^4.17.15", - "plist": "^3.0.1", - "xcode": "^2.0.0" - } - }, - "@react-native-community/cli-server-api": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-5.0.1.tgz", - "integrity": "sha512-OOxL+y9AOZayQzmSW+h5T54wQe+QBc/f67Y9QlWzzJhkKJdYx+S4VOooHoD5PFJzGbYaxhu2YF17p517pcEIIA==", - "peer": true, - "requires": { - "@react-native-community/cli-debugger-ui": "^5.0.1", - "@react-native-community/cli-tools": "^5.0.1", - "compression": "^1.7.1", - "connect": "^3.6.5", - "errorhandler": "^1.5.0", - "nocache": "^2.1.0", - "pretty-format": "^26.6.2", - "serve-static": "^1.13.1", - "ws": "^1.1.0" - }, - "dependencies": { - "ws": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", - "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", - "peer": true, - "requires": { - "options": ">=0.0.5", - "ultron": "1.0.x" - } - } - } - }, - "@react-native-community/cli-tools": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-5.0.1.tgz", - "integrity": "sha512-XOX5w98oSE8+KnkMZZPMRT7I5TaP8fLbDl0tCu40S7Epz+Zz924n80fmdu6nUDIfPT1nV6yH1hmHmWAWTDOR+Q==", - "peer": true, - "requires": { - "chalk": "^3.0.0", - "lodash": "^4.17.15", - "mime": "^2.4.1", - "node-fetch": "^2.6.0", - "open": "^6.2.0", - "shell-quote": "1.6.1" - } - }, - "@react-native-community/cli-types": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-5.0.1.tgz", - "integrity": "sha512-BesXnuFFlU/d1F3+sHhvKt8fUxbQlAbZ3hhMEImp9A6sopl8TEtryUGJ1dbazGjRXcADutxvjwT/i3LJVTIQug==", - "peer": true, - "requires": { - "ora": "^3.4.0" - } - }, - "@react-native-community/netinfo": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@react-native-community/netinfo/-/netinfo-4.7.0.tgz", - "integrity": "sha512-a/sDB+AsLEUNmhAUlAaTYeXKyQdFGBUfatqKkX5jluBo2CB3OAuTHfm7rSjcaLB9EmG5iSq3fOTpync2E7EYTA==", - "requires": {} - }, - "@react-native/assets": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@react-native/assets/-/assets-1.0.0.tgz", - "integrity": "sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ==", - "peer": true - }, - "@react-native/normalize-color": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-1.0.0.tgz", - "integrity": "sha512-xUNRvNmCl3UGCPbbHvfyFMnpvLPoOjDCcp5bT9m2k+TF/ZBklEQwhPZlkrxRx2NhgFh1X3a5uL7mJ7ZR+8G7Qg==", - "peer": true - }, - "@react-native/polyfills": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@react-native/polyfills/-/polyfills-1.0.0.tgz", - "integrity": "sha512-0jbp4RxjYopTsIdLl+/Fy2TiwVYHy4mgeu07DG4b/LyM0OS/+lPP5c9sbnt/AMlnF6qz2JRZpPpGw1eMNS6A4w==", - "peer": true - }, - "@sideway/address": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.2.tgz", - "integrity": "sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA==", - "peer": true, - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", - "peer": true - }, - "@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "peer": true - }, - "@testing-library/cypress": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-7.0.6.tgz", - "integrity": "sha512-atnjqlkEt6spU4Mv7evvpA8fMXeRw7AN2uTKOR1dP6WBvBixVwAYMZY+1fMOaZULWAj9vGLCXXvmw++u3TxuCQ==", - "requires": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^7.28.1" - } - }, - "@testing-library/dom": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.29.2.tgz", - "integrity": "sha512-CBMELfyY1jKdtLcSRmEnZWRzRkCRVSNPTzhzrn8wY8OnzUo7Pe/W+HgLzt4TDnWIPYeusHBodf9wUjJF48kPmA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^4.2.0", - "aria-query": "^4.2.2", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.4", - "lz-string": "^1.4.4", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.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==", - "requires": { - "color-convert": "^2.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==", - "requires": { - "has-flag": "^4.0.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==", - "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==" - } - } - }, - "@types/aria-query": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.0.tgz", - "integrity": "sha512-iIgQNzCm0v7QMhhe4Jjn9uRh+I6GoPmt03CbEtwx3ao8/EfoQcmgtqH4vQ5Db/lxiIGaWDv6nwvunuh0RyX0+A==" - }, - "@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==" - }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "peer": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "@types/lodash": { - "version": "4.14.171", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.171.tgz", - "integrity": "sha512-7eQ2xYLLI/LsicL2nejW9Wyko3lcpN6O/z0ZLHrEQsg280zIdCv1t/0m6UtBjUHokCGBQ3gYTbHzDkZ1xOBwwg==", - "dev": true - }, - "@types/node": { - "version": "14.17.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.5.tgz", - "integrity": "sha512-bjqH2cX/O33jXT/UmReo2pM7DIJREPMnarixbQ57DOOzzFaI6D2+IcwaJQaJpv0M1E9TIhPCYVxrkcityLjlqA==" - }, - "@types/sinonjs__fake-timers": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz", - "integrity": "sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg==" - }, - "@types/sizzle": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", - "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==" - }, - "@types/yargs": { - "version": "15.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz", - "integrity": "sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==" - }, - "@types/yauzl": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", - "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.4.tgz", - "integrity": "sha512-s1oY4RmYDlWMlcV0kKPBaADn46JirZzvvH7c2CtAqxCY96S538JRBAzt83RrfkDheV/+G/vWNK0zek+8TB3Gmw==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "4.28.4", - "@typescript-eslint/scope-manager": "4.28.4", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.4.tgz", - "integrity": "sha512-OglKWOQRWTCoqMSy6pm/kpinEIgdcXYceIcH3EKWUl4S8xhFtN34GQRaAvTIZB9DD94rW7d/U7tUg3SYeDFNHA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.28.4", - "@typescript-eslint/types": "4.28.4", - "@typescript-eslint/typescript-estree": "4.28.4", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "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" - } - }, - "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 - } - } - }, - "@typescript-eslint/parser": { - "version": "4.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.30.0.tgz", - "integrity": "sha512-HJ0XuluSZSxeboLU7Q2VQ6eLlCwXPBOGnA7CqgBnz2Db3JRQYyBDJgQnop6TZ+rsbSx5gEdWhw4rE4mDa1FnZg==", - "dev": true, - "peer": true, - "requires": { - "@typescript-eslint/scope-manager": "4.30.0", - "@typescript-eslint/types": "4.30.0", - "@typescript-eslint/typescript-estree": "4.30.0", - "debug": "^4.3.1" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "4.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.30.0.tgz", - "integrity": "sha512-VJ/jAXovxNh7rIXCQbYhkyV2Y3Ac/0cVHP/FruTJSAUUm4Oacmn/nkN5zfWmWFEanN4ggP0vJSHOeajtHq3f8A==", - "dev": true, - "peer": true, - "requires": { - "@typescript-eslint/types": "4.30.0", - "@typescript-eslint/visitor-keys": "4.30.0" - } - }, - "@typescript-eslint/types": { - "version": "4.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.30.0.tgz", - "integrity": "sha512-YKldqbNU9K4WpTNwBqtAerQKLLW/X2A/j4yw92e3ZJYLx+BpKLeheyzoPfzIXHfM8BXfoleTdiYwpsvVPvHrDw==", - "dev": true, - "peer": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.30.0.tgz", - "integrity": "sha512-6WN7UFYvykr/U0Qgy4kz48iGPWILvYL34xXJxvDQeiRE018B7POspNRVtAZscWntEPZpFCx4hcz/XBT+erenfg==", - "dev": true, - "peer": true, - "requires": { - "@typescript-eslint/types": "4.30.0", - "@typescript-eslint/visitor-keys": "4.30.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.30.0.tgz", - "integrity": "sha512-pNaaxDt/Ol/+JZwzP7MqWc8PJQTUhZwoee/PVlQ+iYoYhagccvoHnC9e4l+C/krQYYkENxznhVSDwClIbZVxRw==", - "dev": true, - "peer": true, - "requires": { - "@typescript-eslint/types": "4.30.0", - "eslint-visitor-keys": "^2.0.0" - } - }, - "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, - "peer": true - } - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.4.tgz", - "integrity": "sha512-ZJBNs4usViOmlyFMt9X9l+X0WAFcDH7EdSArGqpldXu7aeZxDAuAzHiMAeI+JpSefY2INHrXeqnha39FVqXb8w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.4", - "@typescript-eslint/visitor-keys": "4.28.4" - } - }, - "@typescript-eslint/types": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.4.tgz", - "integrity": "sha512-3eap4QWxGqkYuEmVebUGULMskR6Cuoc/Wii0oSOddleP4EGx1tjLnZQ0ZP33YRoMDCs5O3j56RBV4g14T4jvww==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.4.tgz", - "integrity": "sha512-z7d8HK8XvCRyN2SNp+OXC2iZaF+O2BTquGhEYLKLx5k6p0r05ureUtgEfo5f6anLkhCxdHtCf6rPM1p4efHYDQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.4", - "@typescript-eslint/visitor-keys": "4.28.4", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.4.tgz", - "integrity": "sha512-NIAXAdbz1XdOuzqkJHjNKXKj8QQ4cv5cxR/g0uQhCYf/6//XrmfpaYsM7PnBcNbfvTDLUkqQ5TPNm1sozDdTWg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.4", - "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 - } - } - }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "peer": true - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "peer": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "absolute-path": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/absolute-path/-/absolute-path-0.0.0.tgz", - "integrity": "sha1-p4di+9rftSl76ZsV01p4Wy8JW/c=", - "peer": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "peer": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "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.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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" - } - }, - "ally.js": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/ally.js/-/ally.js-1.4.1.tgz", - "integrity": "sha1-n7fmuljvrE7pExyymqnuO1QLzx4=", - "requires": { - "css.escape": "^1.5.0", - "platform": "1.3.3" - } - }, - "anser": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", - "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "peer": true - }, - "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==" - }, - "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==", - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-fragments": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", - "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", - "peer": true, - "requires": { - "colorette": "^1.0.7", - "slice-ansi": "^2.0.0", - "strip-ansi": "^5.0.0" - }, - "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==", - "peer": 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==", - "peer": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "peer": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.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==", - "peer": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "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==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "peer": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "appdirsjs": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.5.tgz", - "integrity": "sha512-UyaAyzj+7XLoKhbXJi4zoAw8IDXCiLNCKfQEiuCsCCTkDmiG1vpCliQn/MoUvO3DZqCN1i6gOahokcFtNSIrVA==", - "peer": true - }, - "arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==" - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "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==", - "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - }, - "dependencies": { - "@babel/runtime-corejs3": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.12.5.tgz", - "integrity": "sha512-roGr54CsTmNPPzZoCP1AmDXuBoNao7tnSA83TXTwt+UK5QVyh1DIJnrgYRPWKCF2flqZQXwa7Yr8v7VmLzF0YQ==", - "requires": { - "core-js-pure": "^3.0.0", - "regenerator-runtime": "^0.13.4" - } - } - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "peer": 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==", - "peer": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "peer": true - }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", - "peer": true - }, - "array-includes": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", - "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.5" - } - }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", - "peer": true - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", - "peer": true - }, - "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 - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "peer": true - }, - "array.prototype.flat": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", - "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - } - }, - "array.prototype.flatmap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", - "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "function-bind": "^1.1.1" - } - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "peer": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "peer": 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==", - "peer": true, - "requires": { - "tslib": "^2.0.1" - }, - "dependencies": { - "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", - "peer": true - } - } - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" - }, - "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" - }, - "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==", - "peer": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "peer": true - }, - "authenticator": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/authenticator/-/authenticator-1.1.5.tgz", - "integrity": "sha512-eaT0Trfxka28DkljLQDxuoSn9uDTaYIoXhZMsAw3Z54fNC7BMIsvIxfG6Y5s+y02CH59IIyY3p1EOMqeIpljWQ==", - "requires": { - "authenticator-cli": "^1.0.5", - "notp": "^2.0.3", - "thirty-two": "0.0.2" - } - }, - "authenticator-cli": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/authenticator-cli/-/authenticator-cli-1.0.5.tgz", - "integrity": "sha512-8FjXzLnytd93zE9IxtOr7/uptlxGBjQhWw6qEjPPLhfq1TqrUpaBEhPYOErtHWIPuveAgzHHEBgp2bh6GdQ6Ew==", - "requires": { - "authenticator": "^1.1.0", - "cli": "^1.0.1", - "qrcode-terminal": "^0.12.0" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", - "requires": { - "follow-redirects": "^1.10.0" - } - }, - "axios-retry": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-3.1.9.tgz", - "integrity": "sha512-NFCoNIHq8lYkJa6ku4m+V1837TP6lCa7n79Iuf8/AqATAHYB0ISaAS1eyIenDOfHOLtym34W65Sjke2xjg2fsA==", - "requires": { - "is-retry-allowed": "^1.1.0" - } - }, - "babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "peer": true, - "requires": {} - }, - "babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.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==", - "peer": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", - "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", - "peer": true, - "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.2", - "semver": "^6.1.1" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz", - "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", - "peer": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.2", - "core-js-compat": "^3.14.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", - "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", - "peer": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.2" - } - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", - "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==", - "peer": true - }, - "babel-preset-fbjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", - "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", - "peer": true, - "requires": { - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-syntax-class-properties": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoped-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-member-expression-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-super": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-property-literals": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.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=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "peer": 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=", - "peer": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big-integer": { - "version": "1.6.48", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", - "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", - "peer": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "peer": true - }, - "blob-util": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", - "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==" - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "bplist-creator": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", - "integrity": "sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==", - "peer": true, - "requires": { - "stream-buffers": "~2.2.0" - } - }, - "bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "peer": true, - "requires": { - "big-integer": "^1.6.44" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "peer": true - }, - "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "peer": true, - "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "peer": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "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==", - "peer": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "peer": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "peer": 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" - } - }, - "cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==" - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "peer": 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=", - "peer": true - } - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "peer": 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==", - "dev": true - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "peer": true - }, - "caniuse-lite": { - "version": "1.0.30001245", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001245.tgz", - "integrity": "sha512-768fM9j1PKXpOCKws6eTo3RHmvTUsG9UrpT4WoREFeZgJBTi4/X9g565azS/rVUGtqb8nt7FjLeF5u4kukERnA==", - "peer": true - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "peer": true, - "requires": { - "rsvp": "^4.8.4" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "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==", - "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==" - } - } - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" - }, - "check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=" - }, - "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "peer": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - } - }, - "ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==" - }, - "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==", - "peer": 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=", - "peer": 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=", - "peer": 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=", - "peer": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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=", - "peer": 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=", - "peer": 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==", - "peer": 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==", - "peer": true - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", - "requires": { - "exit": "0.1.2", - "glob": "^7.1.1" - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", - "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", - "peer": true - }, - "cli-table3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", - "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", - "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^4.2.0" - } - }, - "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "peer": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "peer": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "peer": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "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=" - }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "peer": true - }, - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "peer": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "peer": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "peer": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": 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=", - "peer": true - }, - "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==", - "peer": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "peer": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": 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=", - "peer": true - } - } - }, - "convert-source-map": { - "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==", - "peer": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "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==", - "peer": true - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "peer": true - }, - "core-js": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.3.tgz", - "integrity": "sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q==" - }, - "core-js-compat": { - "version": "3.15.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.2.tgz", - "integrity": "sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ==", - "peer": true, - "requires": { - "browserslist": "^4.16.6", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "peer": true - } - } - }, - "core-js-pure": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", - "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "peer": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "dependencies": { - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "peer": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "peer": true - } - } - }, - "cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" - }, - "css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" - }, - "cypress": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-7.7.0.tgz", - "integrity": "sha512-uYBYXNoI5ym0UxROwhQXWTi8JbUEjpC6l/bzoGZNxoKGsLrC1SDPgIDJMgLX/MeEdPL0UInXLDUWN/rSyZUCjQ==", - "requires": { - "@cypress/request": "^2.88.5", - "@cypress/xvfb": "^1.2.4", - "@types/node": "^14.14.31", - "@types/sinonjs__fake-timers": "^6.0.2", - "@types/sizzle": "^2.3.2", - "arch": "^2.2.0", - "blob-util": "^2.0.2", - "bluebird": "^3.7.2", - "cachedir": "^2.3.0", - "chalk": "^4.1.0", - "check-more-types": "^2.24.0", - "cli-cursor": "^3.1.0", - "cli-table3": "~0.6.0", - "commander": "^5.1.0", - "common-tags": "^1.8.0", - "dayjs": "^1.10.4", - "debug": "^4.3.2", - "enquirer": "^2.3.6", - "eventemitter2": "^6.4.3", - "execa": "4.1.0", - "executable": "^4.1.1", - "extract-zip": "2.0.1", - "figures": "^3.2.0", - "fs-extra": "^9.1.0", - "getos": "^3.2.1", - "is-ci": "^3.0.0", - "is-installed-globally": "~0.4.0", - "lazy-ass": "^1.6.0", - "listr2": "^3.8.3", - "lodash": "^4.17.21", - "log-symbols": "^4.0.0", - "minimist": "^1.2.5", - "ospath": "^1.2.2", - "pretty-bytes": "^5.6.0", - "ramda": "~0.27.1", - "request-progress": "^3.0.0", - "supports-color": "^8.1.1", - "tmp": "~0.2.1", - "untildify": "^4.0.0", - "url": "^0.11.0", - "yauzl": "^2.10.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==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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==", - "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==" - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "cypress-file-upload": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/cypress-file-upload/-/cypress-file-upload-5.0.8.tgz", - "integrity": "sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g==", - "requires": {} - }, - "cypress-multi-reporters": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/cypress-multi-reporters/-/cypress-multi-reporters-1.5.0.tgz", - "integrity": "sha512-6rJ1rk1RpjZwTeydCDc8r3iOmWj2ZEYo++oDTJHNEu7eetb3W1cYDNo5CdxF/r0bo7TLQsOEpBHOCYBZfPVt/g==", - "requires": { - "debug": "^4.1.1", - "lodash": "^4.17.15" - } - }, - "cypress-plugin-tab": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/cypress-plugin-tab/-/cypress-plugin-tab-1.0.5.tgz", - "integrity": "sha512-QtTJcifOVwwbeMP3hsOzQOKf3EqKsLyjtg9ZAGlYDntrCRXrsQhe4ZQGIthRMRLKpnP6/tTk6G0gJ2sZUfRliQ==", - "requires": { - "ally.js": "^1.4.1" - } - }, - "cypress-terminal-report": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/cypress-terminal-report/-/cypress-terminal-report-3.2.2.tgz", - "integrity": "sha512-mEx8UlffSGsTHIK7pbBOPTz/cf/JwMqx6/+s7+y7V7MXqv86BXvWhP8kvYbcW3xjYj4B3C625toYUD20q9LmKA==", - "requires": { - "chalk": "^3.0.0", - "fs-extra": "^9.0.1", - "methods": "^1.1.2", - "semver": "^7.3.5", - "tv4": "^1.3.0" - } - }, - "cypress-wait-until": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/cypress-wait-until/-/cypress-wait-until-1.7.1.tgz", - "integrity": "sha512-8DL5IsBTbAxBjfYgCzdbohPq/bY+IKc63fxtso1C8RWhLnQkZbVESyaclNr76jyxfId6uyzX8+Xnt0ZwaXNtkA==" - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" - }, - "dayjs": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz", - "integrity": "sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw==" - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "peer": true - }, - "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=", - "peer": 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==" - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "peer": true, - "requires": { - "clone": "^1.0.2" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "peer": true - } - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "peer": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", - "peer": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "peer": true - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "peer": true - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" - }, - "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" - } - }, - "dom-accessibility-api": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.4.tgz", - "integrity": "sha512-TvrjBckDy2c6v6RLxPv5QXOnU+SmF9nBII5621Ve5fu6Z/BDrENurBEvlC1f44lKEUVqOpK4w9E5Idc5/EgkLQ==" - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "peer": true - }, - "electron-to-chromium": { - "version": "1.3.775", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.775.tgz", - "integrity": "sha512-EGuiJW4yBPOTj2NtWGZcX93ZE8IGj33HJAx4d3ouE2zOfW2trbWU+t1e0yzLr1qQIw81++txbM3BH52QwSRE6Q==", - "peer": true - }, - "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==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "peer": 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==", - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "peer": true - }, - "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==", - "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==", - "peer": true, - "requires": { - "stackframe": "^1.1.1" - } - }, - "errorhandler": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", - "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", - "peer": true, - "requires": { - "accepts": "~1.3.7", - "escape-html": "~1.0.3" - } - }, - "es-abstract": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", - "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.10.3", - "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" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "peer": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "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=" - }, - "eslint": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.30.0.tgz", - "integrity": "sha512-VLqz80i3as3NdloY44BQSJpFw534L9Oh+6zJOUaViV4JPd+DaHwutqP7tcpkW3YiXbK6s05RZl7yl7cQn+lijg==", - "dev": true, - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.2", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "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": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.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.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "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-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 - }, - "globals": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", - "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "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-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-module-utils": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", - "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "pkg-dir": "^2.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" - } - } - } - }, - "eslint-plugin-cypress": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.11.3.tgz", - "integrity": "sha512-hOoAid+XNFtpvOzZSNWP5LDrQBEJwbZwjib4XJ1KcRYKjeVj0mAmPmucG4Egli4j/aruv+Ow/acacoloWWCl9Q==", - "dev": true, - "requires": { - "globals": "^11.12.0" - } - }, - "eslint-plugin-header": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", - "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==", - "dev": true, - "requires": {} - }, - "eslint-plugin-import": { - "version": "2.23.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", - "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", - "dev": true, - "requires": { - "array-includes": "^3.1.3", - "array.prototype.flat": "^1.2.4", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.1", - "find-up": "^2.0.0", - "has": "^1.0.3", - "is-core-module": "^2.4.0", - "minimatch": "^3.0.4", - "object.values": "^1.1.3", - "pkg-up": "^2.0.0", - "read-pkg-up": "^3.0.0", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.9.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" - } - }, - "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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "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" - } - } - } - }, - "eslint-plugin-mattermost": { - "version": "git+ssh://git@github.com/mattermost/eslint-plugin-mattermost.git#46ad99355644a719bf32082f472048f526605181", - "integrity": "sha512-XIsRlgdUmVaJ+9P5sy45uN/cVzi5rPP2w/w06yuEIEYAH6CuVzjiY/dBjDqFKOi/Ebnoo40ur2oCtD3+yzrgVw==", - "dev": true, - "from": "eslint-plugin-mattermost@github:mattermost/eslint-plugin-mattermost#46ad99355644a719bf32082f472048f526605181" - }, - "eslint-plugin-no-only-tests": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.6.0.tgz", - "integrity": "sha512-T9SmE/g6UV1uZo1oHAqOvL86XWl7Pl2EpRpnLI8g/bkJu+h7XBCB+1LnubRZ2CUQXj805vh4/CYZdnqtVaEo2Q==", - "dev": true - }, - "eslint-plugin-react": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz", - "integrity": "sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==", - "dev": true, - "requires": { - "array-includes": "^3.1.3", - "array.prototype.flatmap": "^1.2.4", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.0.4", - "object.entries": "^1.1.4", - "object.fromentries": "^2.0.4", - "object.values": "^1.1.4", - "prop-types": "^15.7.2", - "resolve": "^2.0.0-next.3", - "string.prototype.matchall": "^4.0.5" - }, - "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", - "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-scope": { - "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.3.0", - "estraverse": "^4.1.1" - } - }, - "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" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.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==" - }, - "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" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "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=", - "peer": true - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "peer": true - }, - "eventemitter2": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.3.tgz", - "integrity": "sha512-t0A2msp6BzOf+QAcI6z9XMktLj52OjGQg+8SJH6v5+3uxNpWYRR3wQmfA+6xtMU9kOC59qk9licus5dYcrYkMQ==" - }, - "exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", - "peer": true - }, - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "executable": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", - "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", - "requires": { - "pify": "^2.2.0" - } - }, - "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=", - "peer": 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==", - "peer": 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=", - "peer": 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=", - "peer": 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=", - "peer": 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=", - "peer": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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=", - "peer": 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=", - "peer": 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==", - "peer": 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=", - "peer": 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==", - "peer": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "peer": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "peer": 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==", - "peer": 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=", - "peer": 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=", - "peer": 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=", - "peer": true - } - } - }, - "extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "requires": { - "@types/yauzl": "^2.9.1", - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "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" - } - }, - "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==" - }, - "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.12.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz", - "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "peer": true, - "requires": { - "bser": "2.1.1" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "requires": { - "pend": "~1.2.0" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "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" - } - }, - "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==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "peer": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": 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=", - "peer": true - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "peer": true, - "requires": { - "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==", - "peer": 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==", - "peer": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "peer": true, - "requires": { - "p-try": "^2.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==", - "peer": true, - "requires": { - "p-limit": "^2.0.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==", - "peer": 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==", - "peer": true, - "requires": { - "find-up": "^3.0.0" - } - } - } - }, - "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" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "peer": true - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.1.tgz", - "integrity": "sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg==", - "dev": true - }, - "flow-parser": { - "version": "0.121.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.121.0.tgz", - "integrity": "sha512-1gIBiWJNR0tKUNv8gZuk7l9rVX06OuLzY9AoGio7y/JT4V1IZErEMEq2TJS+PFcw/y0RshZ1J/27VfK1UQzYVg==", - "peer": true - }, - "follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "peer": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "peer": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "peer": true - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true, - "peer": true - }, - "fsu": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fsu/-/fsu-1.1.1.tgz", - "integrity": "sha512-xQVsnjJ/5pQtcKh+KjUoZGzVWn4uNkchxTF6Lwjr4Gf7nQr8fmUfhKJ62zE77+xQg9xnxi5KUps7XGs+VC986A==" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "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.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "peer": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-params": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/get-params/-/get-params-0.1.2.tgz", - "integrity": "sha1-uuDfq6WIoMYNeDTA2Nwv9g7u8v4=" - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "peer": true - }, - "getos": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", - "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", - "requires": { - "async": "^3.2.0" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "gfycat-sdk": { - "version": "1.4.18", - "resolved": "https://registry.npmjs.org/gfycat-sdk/-/gfycat-sdk-1.4.18.tgz", - "integrity": "sha512-BrINtO6rj8Nr0pm38Qr3epayOuvlKcEFcDCw6yL9T4SrsWTECct6FS/isli766kdij2GGG6bWU6bRp+fDS2Cbg==", - "requires": { - "babel-runtime": "^6.23.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "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==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "requires": { - "ini": "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==" - }, - "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" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "peer": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "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==" - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "peer": 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=", - "peer": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "peer": 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=", - "peer": 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=", - "peer": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "peer": true - }, - "hermes-engine": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/hermes-engine/-/hermes-engine-0.7.2.tgz", - "integrity": "sha512-E2DkRaO97gwL98LPhgfkMqhHiNsrAjIfEk3wWYn2Y31xdkdWn0572H7RnVcGujMJVqZNJvtknxlpsUb8Wzc3KA==", - "peer": true - }, - "hermes-profile-transformer": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz", - "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==", - "peer": true, - "requires": { - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "peer": 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 - }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "peer": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "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 - }, - "image-size": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz", - "integrity": "sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA==", - "peer": true - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" - }, - "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=" - }, - "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==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "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==" - }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "peer": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "peer": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "peer": 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==", - "peer": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-bigint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "peer": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", - "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", - "dev": true, - "requires": { - "call-bind": "^1.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==" - }, - "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", - "dev": true - }, - "is-ci": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", - "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", - "requires": { - "ci-info": "^3.1.1" - } - }, - "is-core-module": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", - "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", - "dev": true, - "requires": { - "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==", - "peer": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-date-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", - "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", - "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==", - "peer": 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=", - "peer": 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==", - "peer": 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=" - }, - "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=" - }, - "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==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-number-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", - "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" - }, - "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==", - "peer": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "peer": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", - "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" - } - }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, - "is-string": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", - "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", - "dev": true - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "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==", - "peer": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "peer": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "peer": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "peer": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", - "peer": true - }, - "jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", - "peer": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "peer": true - }, - "jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", - "peer": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - } - }, - "jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", - "peer": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.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==", - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "peer": true - }, - "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==", - "peer": 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==", - "peer": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "peer": true, - "requires": { - "ci-info": "^2.0.0" - } - } - } - }, - "jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", - "peer": true, - "requires": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "leven": "^3.1.0", - "pretty-format": "^26.6.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==", - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "peer": 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==", - "peer": 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==", - "peer": 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==", - "peer": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "jetifier": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.8.tgz", - "integrity": "sha512-3Zi16h6L5tXDRQJTb221cnRoVG9/9OvreLdLU2/ZjRv/GILL+2Cemt0IKvkowwkDpvouAU1DQPOJ7qaiHeIdrw==", - "peer": true - }, - "joi": { - "version": "17.4.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.4.1.tgz", - "integrity": "sha512-gDPOwQ5sr+BUxXuPDGrC1pSNcVR/yGGcTI0aCnjYxZEa3za60K/iCQ+OFIkEHWZGVCUcUlXlFKvMmrlmxrG6UQ==", - "peer": true, - "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.0", - "@sideway/formula": "^3.0.0", - "@sideway/pinpoint": "^2.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==" - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsan": { - "version": "3.1.13", - "resolved": "https://registry.npmjs.org/jsan/-/jsan-3.1.13.tgz", - "integrity": "sha512-9kGpCsGHifmw6oJet+y8HaCl14y7qgAsxVdV3pCHDySNR3BfDC30zgkssd7x5LRVAT22dnpbe9JdzzmXZnq9/g==" - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsc-android": { - "version": "245459.0.0", - "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-245459.0.0.tgz", - "integrity": "sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg==", - "peer": true - }, - "jscodeshift": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.11.0.tgz", - "integrity": "sha512-SdRK2C7jjs4k/kT2mwtO07KJN9RnjxtKn03d9JVj6c3j9WwaLcFYsICYDnLAzY0hp+wG2nxl+Cm2jWLiNVYb8g==", - "peer": true, - "requires": { - "@babel/core": "^7.1.6", - "@babel/parser": "^7.1.6", - "@babel/plugin-proposal-class-properties": "^7.1.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.1.0", - "@babel/plugin-proposal-optional-chaining": "^7.1.0", - "@babel/plugin-transform-modules-commonjs": "^7.1.0", - "@babel/preset-flow": "^7.0.0", - "@babel/preset-typescript": "^7.1.0", - "@babel/register": "^7.0.0", - "babel-core": "^7.0.0-bridge.0", - "colors": "^1.1.2", - "flow-parser": "0.*", - "graceful-fs": "^4.2.4", - "micromatch": "^3.1.10", - "neo-async": "^2.5.0", - "node-dir": "^0.1.17", - "recast": "^0.20.3", - "temp": "^0.8.1", - "write-file-atomic": "^2.3.0" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "peer": 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=", - "peer": 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=", - "peer": 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=", - "peer": 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=", - "peer": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "peer": 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=", - "peer": 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==", - "peer": 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=", - "peer": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "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==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "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==" - }, - "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 - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "peer": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jsx-ast-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", - "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", - "dev": true, - "requires": { - "array-includes": "^3.1.2", - "object.assign": "^4.1.2" - } - }, - "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==", - "peer": true - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "peer": 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==", - "peer": true - }, - "lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=" - }, - "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==", - "peer": true - }, - "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": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", - "requires": { - "immediate": "~3.0.5" - } - }, - "linked-list": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/linked-list/-/linked-list-0.1.0.tgz", - "integrity": "sha1-eYsP+X0bkqT9CEgPVa6k6dSdN78=" - }, - "listr2": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.10.0.tgz", - "integrity": "sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw==", - "requires": { - "cli-truncate": "^2.1.0", - "colorette": "^1.2.2", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rxjs": "^6.6.7", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^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 - } - } - }, - "localforage": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.9.0.tgz", - "integrity": "sha512-rR1oyNrKulpe+VM9cYmcFn6tsHuokyVHFaCM3+osEmxaHTbEk8oQu6eGDfS6DQLWi/N67XRmB8ECG37OES368g==", - "requires": { - "lie": "3.1.1" - } - }, - "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" - } - }, - "lodash": { - "version": "4.17.21", - "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.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "peer": true - }, - "lodash.isempty": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", - "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=" - }, - "lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" - }, - "lodash.isobject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", - "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=" - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" - }, - "lodash.mapkeys": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mapkeys/-/lodash.mapkeys-4.6.0.tgz", - "integrity": "sha1-3yz6Ix18V8eorQA6va1dc9PqUZU=" - }, - "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.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" - }, - "lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=", - "peer": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, - "lodash.xor": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.xor/-/lodash.xor-4.5.0.tgz", - "integrity": "sha1-TUjtfpgJWwYyWCunFNP/iuj7HbY=" - }, - "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", - "requires": { - "chalk": "^4.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==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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==", - "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==" - } - } - }, - "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.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==", - "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==", - "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==" - }, - "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==" - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.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==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "logkitty": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", - "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", - "peer": true, - "requires": { - "ansi-fragments": "^0.2.1", - "dayjs": "^1.8.15", - "yargs": "^15.1.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==", - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "peer": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "peer": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.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==", - "peer": 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==", - "peer": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "peer": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "peer": 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==", - "peer": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "peer": 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==", - "peer": 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==", - "peer": 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==", - "peer": true - }, - "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==", - "peer": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "peer": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "peer": 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==", - "peer": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.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==", - "requires": { - "yallist": "^4.0.0" - } - }, - "lz-string": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=" - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "peer": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "peer": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "peer": true - } - } - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "peer": true, - "requires": { - "tmpl": "1.0.x" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "peer": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "peer": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "mattermost-redux": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/mattermost-redux/-/mattermost-redux-5.33.1.tgz", - "integrity": "sha512-fHTW5PeB0xAE5u6uMds+hlWaJsUeWgE1034vekUah1X4bZCzBcMK4fM+ycGaIQ7c5Ylj9ML6Ni10XJYiQpMo5w==", - "requires": { - "core-js": "3.8.3", - "form-data": "3.0.0", - "gfycat-sdk": "1.4.18", - "moment-timezone": "0.5.32", - "redux": "4.0.5", - "redux-action-buffer": "1.2.0", - "redux-offline": "git+https://github.com/enahum/redux-offline.git#885024de96b6ec73650c340c8928066585c413df", - "redux-persist": "4.9.1", - "redux-persist-node-storage": "2.0.0", - "redux-thunk": "2.3.0", - "remote-redux-devtools": "0.5.16", - "reselect": "4.0.0", - "rudder-sdk-js": "1.0.14", - "serialize-error": "6.0.0", - "shallow-equals": "1.0.0" - }, - "dependencies": { - "form-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", - "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - } - } - }, - "md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "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==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "metro": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.64.0.tgz", - "integrity": "sha512-G2OC08Rzfs0kqnSEuKo2yZxR+/eNUpA93Ru45c60uN0Dw3HPrDi+ZBipgFftC6iLE0l+6hu8roFFIofotWxybw==", - "peer": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/core": "^7.0.0", - "@babel/generator": "^7.5.0", - "@babel/parser": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "absolute-path": "^0.0.0", - "accepts": "^1.3.7", - "async": "^2.4.0", - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "connect": "^3.6.5", - "debug": "^2.2.0", - "denodeify": "^1.2.1", - "error-stack-parser": "^2.0.6", - "fs-extra": "^1.0.0", - "graceful-fs": "^4.1.3", - "image-size": "^0.6.0", - "invariant": "^2.2.4", - "jest-haste-map": "^26.5.2", - "jest-worker": "^26.0.0", - "lodash.throttle": "^4.1.1", - "metro-babel-register": "0.64.0", - "metro-babel-transformer": "0.64.0", - "metro-cache": "0.64.0", - "metro-cache-key": "0.64.0", - "metro-config": "0.64.0", - "metro-core": "0.64.0", - "metro-hermes-compiler": "0.64.0", - "metro-inspector-proxy": "0.64.0", - "metro-minify-uglify": "0.64.0", - "metro-react-native-babel-preset": "0.64.0", - "metro-resolver": "0.64.0", - "metro-runtime": "0.64.0", - "metro-source-map": "0.64.0", - "metro-symbolicate": "0.64.0", - "metro-transform-plugins": "0.64.0", - "metro-transform-worker": "0.64.0", - "mime-types": "^2.1.27", - "mkdirp": "^0.5.1", - "node-fetch": "^2.2.0", - "nullthrows": "^1.1.1", - "rimraf": "^2.5.4", - "serialize-error": "^2.1.0", - "source-map": "^0.5.6", - "strip-ansi": "^6.0.0", - "temp": "0.8.3", - "throat": "^5.0.0", - "ws": "^1.1.5", - "yargs": "^15.3.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==", - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "peer": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "peer": true - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "peer": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "peer": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.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==", - "peer": 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==", - "peer": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "peer": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "peer": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "fs-extra": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", - "peer": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "peer": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "peer": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "peer": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "peer": 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==", - "peer": 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==", - "peer": 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==", - "peer": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "peer": true, - "requires": { - "glob": "^7.1.3" - } - }, - "serialize-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=", - "peer": true - }, - "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==", - "peer": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "ws": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", - "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", - "peer": true, - "requires": { - "options": ">=0.0.5", - "ultron": "1.0.x" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "peer": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "peer": 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==", - "peer": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "metro-babel-register": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-babel-register/-/metro-babel-register-0.64.0.tgz", - "integrity": "sha512-Kf6YvE3kIRumGnjK0Q9LqGDIdnsX9eFGtNBmBuCVDuB9wGGA/5CgX8We8W7Y44dz1RGTcHJRhfw5iGg+pwC3aQ==", - "peer": true, + "lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", "requires": { - "@babel/core": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/register": "^7.0.0", - "escape-string-regexp": "^1.0.5" + "immediate": "~3.0.5" } }, - "metro-babel-transformer": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.64.0.tgz", - "integrity": "sha512-itZaxKTgmKGEZWxNzbSZBc22NngrMZzoUNuU92aHSTGkYi2WH4XlvzEHsstmIKHMsRVKl75cA+mNmgk4gBFJKw==", - "peer": true, + "listr2": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.10.0.tgz", + "integrity": "sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw==", "requires": { - "@babel/core": "^7.0.0", - "metro-source-map": "0.64.0", - "nullthrows": "^1.1.1" + "cli-truncate": "^2.1.0", + "colorette": "^1.2.2", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.7", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" } }, - "metro-cache": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.64.0.tgz", - "integrity": "sha512-QvGfxe/1QQYM9XOlR8W1xqE9eHDw/AgJIgYGn/TxZxBu9Zga+Rgs1omeSZju45D8w5VWgMr83ma5kACgzvOecg==", - "peer": true, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, "requires": { - "metro-core": "0.64.0", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" }, "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "peer": true, - "requires": { - "glob": "^7.1.3" - } + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true } } }, - "metro-cache-key": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.64.0.tgz", - "integrity": "sha512-O9B65G8L/fopck45ZhdRosyVZdMtUQuX5mBWEC1NRj02iWBIUPLmYMjrunqIe8vHipCMp3DtTCm/65IlBmO8jg==", - "peer": true - }, - "metro-config": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.64.0.tgz", - "integrity": "sha512-QhM4asnX5KhlRWaugwVGNNXhX0Z85u5nK0UQ/A90bBb4xWyXqUe20e788VtdA75rkQiiI6wXTCIHWT0afbnjwQ==", - "peer": true, + "localforage": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.9.0.tgz", + "integrity": "sha512-rR1oyNrKulpe+VM9cYmcFn6tsHuokyVHFaCM3+osEmxaHTbEk8oQu6eGDfS6DQLWi/N67XRmB8ECG37OES368g==", "requires": { - "cosmiconfig": "^5.0.5", - "jest-validate": "^26.5.2", - "metro": "0.64.0", - "metro-cache": "0.64.0", - "metro-core": "0.64.0", - "metro-runtime": "0.64.0" - } - }, - "metro-core": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.64.0.tgz", - "integrity": "sha512-v8ZQ5j72EaUwamQ8pLfHlOHTyp7SbdazvHPzFGDpHnwIQqIT0Bw3Syg8R4regTlVG3ngpeSEAi005UITljmMcQ==", - "peer": true, + "lie": "3.1.1" + } + }, + "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": { - "jest-haste-map": "^26.5.2", - "lodash.throttle": "^4.1.1", - "metro-resolver": "0.64.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, - "metro-hermes-compiler": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-hermes-compiler/-/metro-hermes-compiler-0.64.0.tgz", - "integrity": "sha512-CLAjVDWGAoGhbi2ZyPHnH5YDdfrDIx6+tzFWfHGIMTZkYBXsYta9IfYXBV8lFb6BIbrXLjlXZAOoosknetMPOA==", - "peer": true + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "metro-inspector-proxy": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.64.0.tgz", - "integrity": "sha512-KywbH3GNSz9Iqw4UH3smgaV2dBHHYMISeN7ORntDL/G+xfgPc6vt13d+zFb907YpUcXj5N0vdoiAHI5V/0y8IA==", - "peer": true, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=" + }, + "lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, + "lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.mapkeys": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapkeys/-/lodash.mapkeys-4.6.0.tgz", + "integrity": "sha1-3yz6Ix18V8eorQA6va1dc9PqUZU=" + }, + "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.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "lodash.xor": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.xor/-/lodash.xor-4.5.0.tgz", + "integrity": "sha512-sVN2zimthq7aZ5sPGXnSz32rZPuqcparVW50chJQe+mzTYV+IsxSsl/2gnkWWE2Of7K3myBQBqtLKOUEHJKRsQ==" + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", "requires": { - "connect": "^3.6.5", - "debug": "^2.2.0", - "ws": "^1.1.5", - "yargs": "^15.3.1" + "chalk": "^4.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==", - "peer": true, "requires": { "color-convert": "^2.0.1" } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "peer": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "peer": true, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "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==", - "peer": true, "requires": { "color-name": "~1.1.4" } @@ -21309,301 +8918,121 @@ "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==", - "peer": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "peer": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "peer": 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==", - "peer": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "peer": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "peer": 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==", - "peer": 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==", - "peer": 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==", - "peer": true - }, - "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==", - "peer": true, + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.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==", "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "color-convert": "^2.0.1" } }, - "ws": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", - "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", - "peer": true, + "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==", "requires": { - "options": ">=0.0.5", - "ultron": "1.0.x" + "color-name": "~1.1.4" } }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "peer": true + "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==" }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "peer": 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" + "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==" + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" } }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "peer": true, + "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==", "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } } } }, - "metro-minify-uglify": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.64.0.tgz", - "integrity": "sha512-DRwRstqXR5qfte9Nuwoov5dRXxL7fJeVlO5fGyOajWeO3+AgPjvjXh/UcLJqftkMWTPGUFuzAD5/7JC5v5FLWw==", - "peer": true, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "requires": { - "uglify-es": "^3.1.9" + "js-tokens": "^3.0.0 || ^4.0.0" } }, - "metro-react-native-babel-preset": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.64.0.tgz", - "integrity": "sha512-HcZ0RWQRuJfpPiaHyFQJzcym+/dDIVUPwUAXWoub/C4GkGu+mPjp8vqK6g0FxokCnnI2TK0gZTza2IDfiNNscQ==", - "peer": true, - "requires": { - "@babel/core": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.0.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.2.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-exponentiation-operator": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-assign": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-regenerator": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "react-refresh": "^0.4.0" - } - }, - "metro-react-native-babel-transformer": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.64.0.tgz", - "integrity": "sha512-K1sHO3ODBFCr7uEiCQ4RvVr+cQg0EHQF8ChVPnecGh/WDD8udrTq9ECwB0dRfMjAvlsHtRUlJm6ZSI8UPgum2w==", - "peer": true, - "requires": { - "@babel/core": "^7.0.0", - "babel-preset-fbjs": "^3.3.0", - "metro-babel-transformer": "0.64.0", - "metro-react-native-babel-preset": "0.64.0", - "metro-source-map": "0.64.0", - "nullthrows": "^1.1.1" - } - }, - "metro-resolver": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.64.0.tgz", - "integrity": "sha512-cJ26Id8Zf+HmS/1vFwu71K3u7ep/+HeXXAJIeVDYf+niE7AWB9FijyMtAlQgbD8elWqv1leJCnQ/xHRFBfGKYA==", - "peer": 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==", "requires": { - "absolute-path": "^0.0.0" + "yallist": "^4.0.0" } }, - "metro-runtime": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.64.0.tgz", - "integrity": "sha512-m7XbWOaIOeFX7YcxUhmnOi6Pg8EaeL89xyZ+quZyZVF1aNoTr4w8FfbKxvijpjsytKHIZtd+43m2Wt5JrqyQmQ==", - "peer": true + "lz-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", + "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==" }, - "metro-source-map": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.64.0.tgz", - "integrity": "sha512-OCG2rtcp5cLEGYvAbfkl6mEc0J2FPRP4/UCEly+juBk7hawS9bCBMBfhJm/HIsvY1frk6nT2Vsl1O8YBbwyx2g==", - "peer": true, - "requires": { - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "invariant": "^2.2.4", - "metro-symbolicate": "0.64.0", - "nullthrows": "^1.1.1", - "ob1": "0.64.0", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - } - }, - "metro-symbolicate": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.64.0.tgz", - "integrity": "sha512-qIi+YRrDWnLVmydj6gwidYLPaBsakZRibGWSspuXgHAxOI3UuLwlo4dpQ73Et0gyHjI7ZvRMRY8JPiOntf9AQQ==", - "peer": true, - "requires": { - "invariant": "^2.2.4", - "metro-source-map": "0.64.0", - "nullthrows": "^1.1.1", - "source-map": "^0.5.6", - "through2": "^2.0.1", - "vlq": "^1.0.0" - } - }, - "metro-transform-plugins": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.64.0.tgz", - "integrity": "sha512-iTIRBD/wBI98plfxj8jAoNUUXfXLNlyvcjPtshhpGvdwu9pzQilGfnDnOaaK+vbITcOk9w5oQectXyJwAqTr1A==", - "peer": true, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", "requires": { - "@babel/core": "^7.0.0", - "@babel/generator": "^7.5.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "nullthrows": "^1.1.1" + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" } }, - "metro-transform-worker": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.64.0.tgz", - "integrity": "sha512-wegRtK8GyLF6IPZRBJp+zsORgA4iX0h1DRpknyAMDCtSbJ4VU2xV/AojteOgAsDvY3ucAGsvfuZLNDJHUdUNHQ==", - "peer": true, - "requires": { - "@babel/core": "^7.0.0", - "@babel/generator": "^7.5.0", - "@babel/parser": "^7.0.0", - "@babel/types": "^7.0.0", - "babel-preset-fbjs": "^3.3.0", - "metro": "0.64.0", - "metro-babel-transformer": "0.64.0", - "metro-cache": "0.64.0", - "metro-cache-key": "0.64.0", - "metro-hermes-compiler": "0.64.0", - "metro-source-map": "0.64.0", - "metro-transform-plugins": "0.64.0", - "nullthrows": "^1.1.1" - } + "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==" + }, + "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" } }, - "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "peer": true - }, "mime-db": { "version": "1.45.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", @@ -21631,19 +9060,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "peer": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - } + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "mkdirp": { "version": "0.5.5", @@ -21845,253 +9264,85 @@ "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==", - "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==" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - } - } - }, - "mochawesome-merge": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mochawesome-merge/-/mochawesome-merge-4.2.0.tgz", - "integrity": "sha512-FSMzagh+8hTShhFXdBLE4/zS2WALcDruoD0bmtiwHEjfyQszR/iEGFTgbuM5ewA5At3qeSGwGsT0k2Stt64NdQ==", - "requires": { - "fs-extra": "^7.0.1", - "glob": "^7.1.6", - "uuid": "^3.3.2", - "yargs": "^15.3.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==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.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==", - "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==" - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "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" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "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==", - "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==" - }, - "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==" - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "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==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "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==", + "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==", "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "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==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" } } }, - "mochawesome-report-generator": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mochawesome-report-generator/-/mochawesome-report-generator-5.2.0.tgz", - "integrity": "sha512-DDY/3jSkM/VrWy0vJtdYOf6qBLdaPaLcI7rQmBVbnclIX7AKniE1Rhz3T/cMT/7u54W5EHNo1z84z7efotq/Eg==", + "mochawesome-merge": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mochawesome-merge/-/mochawesome-merge-4.2.0.tgz", + "integrity": "sha512-FSMzagh+8hTShhFXdBLE4/zS2WALcDruoD0bmtiwHEjfyQszR/iEGFTgbuM5ewA5At3qeSGwGsT0k2Stt64NdQ==", "requires": { - "chalk": "^2.4.2", - "dateformat": "^3.0.2", - "escape-html": "^1.0.3", - "fs-extra": "^7.0.0", - "fsu": "^1.0.2", - "lodash.isfunction": "^3.0.8", - "opener": "^1.5.2", - "prop-types": "^15.7.2", - "tcomb": "^3.2.17", - "tcomb-validation": "^3.3.0", - "validator": "^10.11.0", - "yargs": "^13.2.2" + "fs-extra": "^7.0.1", + "glob": "^7.1.6", + "uuid": "^3.3.2", + "yargs": "^15.3.1" }, "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==" + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "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==", "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "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==" + }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, "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==", "requires": { - "locate-path": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "fs-extra": { @@ -22104,11 +9355,6 @@ "universalify": "^0.1.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -22117,1802 +9363,801 @@ "graceful-fs": "^4.1.6" } }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.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==", - "requires": { - "p-limit": "^2.0.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==" - }, - "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==", - "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==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "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" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "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==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "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==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" - }, - "moment-timezone": { - "version": "0.5.32", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.32.tgz", - "integrity": "sha512-Z8QNyuQHQAmWucp8Knmgei8YNo28aLjJq6Ma+jy1ZSpSk5nyfRT8xgUbSQvD2+2UajISfenndwvFuH3NGS+nvA==", - "requires": { - "moment": ">= 2.9.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", - "peer": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "peer": 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": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "peer": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "peer": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "peer": true - }, - "nocache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", - "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==", - "peer": true - }, - "node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", - "peer": true, - "requires": { - "minimatch": "^3.0.2" - } - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "peer": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "peer": true - }, - "node-localstorage": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-1.3.1.tgz", - "integrity": "sha512-NMWCSWWc6JbHT5PyWlNT2i8r7PgGYXVntmKawY83k/M0UJScZ5jirb61TLnqKwd815DfBQu+lR3sRw08SPzIaQ==", - "requires": { - "write-file-atomic": "^1.1.4" - }, - "dependencies": { - "write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "slide": "^1.1.5" + "p-locate": "^4.1.0" } - } - } - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "peer": true - }, - "node-releases": { - "version": "1.1.73", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", - "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", - "peer": true - }, - "node-stream-zip": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.13.6.tgz", - "integrity": "sha512-c7tRSVkLNOHvasWgmZ2d86cDgTWEygnkuuHNOY9c0mR3yLZtQTTrGvMaJ/fPs6+LOJn3240y30l5sjLaXFtcvw==", - "peer": 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" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "peer": true - }, - "notp": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/notp/-/notp-2.0.3.tgz", - "integrity": "sha1-qf0R4lz+HMs5/GaJVE7kwQ75pXc=" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "peer": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "ob1": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.64.0.tgz", - "integrity": "sha512-CO1N+5dhvy+MoAwxz8+fymEUcwsT4a+wHhrHFb02LppcJdHxgcBWviwEhUwKOD2kLMQ7ijrrzybOqpGcqEtvpQ==", - "peer": true - }, - "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=", - "peer": 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=", - "peer": true, + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { - "is-descriptor": "^0.1.0" + "p-try": "^2.0.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=", - "peer": 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==", "requires": { - "kind-of": "^3.0.2" + "p-limit": "^2.2.0" } }, - "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=", - "peer": true, + "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==" + }, + "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==" + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "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==", "requires": { - "kind-of": "^3.0.2" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "peer": true, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "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==", - "peer": true - } + "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" } }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "peer": true, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "requires": { - "is-buffer": "^1.1.5" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, - "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", - "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=", - "peer": 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==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", - "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.2" - } - }, - "object.fromentries": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", - "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "peer": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", - "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.2" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "peer": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "peer": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "peer": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "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" - } - }, - "options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", - "peer": true - }, - "ora": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", - "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", - "peer": true, + "mochawesome-report-generator": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mochawesome-report-generator/-/mochawesome-report-generator-5.2.0.tgz", + "integrity": "sha512-DDY/3jSkM/VrWy0vJtdYOf6qBLdaPaLcI7rQmBVbnclIX7AKniE1Rhz3T/cMT/7u54W5EHNo1z84z7efotq/Eg==", "requires": { "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-spinners": "^2.0.0", - "log-symbols": "^2.2.0", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1" + "dateformat": "^3.0.2", + "escape-html": "^1.0.3", + "fs-extra": "^7.0.0", + "fsu": "^1.0.2", + "lodash.isfunction": "^3.0.8", + "opener": "^1.5.2", + "prop-types": "^15.7.2", + "tcomb": "^3.2.17", + "tcomb-validation": "^3.3.0", + "validator": "^10.11.0", + "yargs": "^13.2.2" }, "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==", - "peer": true + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "peer": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "peer": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "peer": true, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "requires": { - "chalk": "^2.0.1" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, - "mimic-fn": { + "decamelize": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "peer": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "peer": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "peer": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "peer": 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==" }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "peer": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "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=", - "peer": true - }, - "ospath": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", - "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "peer": true - }, - "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-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "requires": { - "aggregate-error": "^3.0.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 - }, - "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" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "peer": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "peer": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "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-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "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==" - }, - "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": { + "find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "peer": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.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" - } - }, - "platform": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.3.tgz", - "integrity": "sha1-ZGx3ARiZhwtqCQPnXpl+jlHadGE=" - }, - "plist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.2.tgz", - "integrity": "sha512-MSrkwZBdQ6YapHy87/8hDU8MnIcyxBKjeF+McXnr5A9MtffPewTs7G3hlpodT5TacyfIyFTaJEhh3GGcmasTgQ==", - "peer": true, - "requires": { - "base64-js": "^1.5.1", - "xmlbuilder": "^9.0.7", - "xmldom": "^0.5.0" - } - }, - "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=", - "peer": true - }, - "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 - }, - "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==" - }, - "pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "requires": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.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==", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { - "color-convert": "^2.0.1" + "locate-path": "^3.0.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==", + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "requires": { - "color-name": "~1.1.4" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "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==" + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, - "react-is": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", - "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==" + "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" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.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==", + "requires": { + "p-limit": "^2.0.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==" + }, + "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==", + "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==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "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" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "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==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "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==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "peer": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", - "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", - "peer": true, - "requires": { - "asap": "~2.0.6" - } - }, - "prompts": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", - "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", - "peer": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "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", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qrcode-terminal": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", - "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "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 - }, - "ramda": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", - "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "peer": true, - "requires": { - "safe-buffer": "^5.1.0" - } + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", "peer": true }, - "react": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz", - "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==", - "peer": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } + "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 }, - "react-devtools-core": { - "version": "4.13.5", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.13.5.tgz", - "integrity": "sha512-k+P5VSKM6P22Go9IQ8dJmjj9fbztvKt1iRDI/4wS5oTvd1EnytIJMYB59wZt+D3kgp64jklNX/MRmY42xAQ08g==", - "peer": 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": { - "shell-quote": "^1.6.1", - "ws": "^7" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" }, "dependencies": { - "ws": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", - "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", - "peer": true, - "requires": {} + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, - "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==" + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "peer": true }, - "react-native": { - "version": "0.64.2", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.64.2.tgz", - "integrity": "sha512-Ty/fFHld9DcYsFZujXYdeVjEhvSeQcwuTGXezyoOkxfiGEGrpL/uwUZvMzwShnU4zbbTKDu2PAm/uwuOittRGA==", - "peer": true, - "requires": { - "@jest/create-cache-key-function": "^26.5.0", - "@react-native-community/cli": "^5.0.1-alpha.1", - "@react-native-community/cli-platform-android": "^5.0.1-alpha.1", - "@react-native-community/cli-platform-ios": "^5.0.1-alpha.1", - "@react-native/assets": "1.0.0", - "@react-native/normalize-color": "1.0.0", - "@react-native/polyfills": "1.0.0", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "base64-js": "^1.1.2", - "event-target-shim": "^5.0.1", - "hermes-engine": "~0.7.0", - "invariant": "^2.2.4", - "jsc-android": "^245459.0.0", - "metro-babel-register": "0.64.0", - "metro-react-native-babel-transformer": "0.64.0", - "metro-runtime": "0.64.0", - "metro-source-map": "0.64.0", - "nullthrows": "^1.1.1", - "pretty-format": "^26.5.2", - "promise": "^8.0.3", - "prop-types": "^15.7.2", - "react-devtools-core": "^4.6.0", - "react-native-codegen": "^0.0.6", - "react-refresh": "^0.4.0", - "regenerator-runtime": "^0.13.2", - "scheduler": "^0.20.1", - "shelljs": "^0.8.4", - "stacktrace-parser": "^0.1.3", - "use-subscription": "^1.0.0", - "whatwg-fetch": "^3.0.0", - "ws": "^6.1.4" - } - }, - "react-native-codegen": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.6.tgz", - "integrity": "sha512-cMvrUelD81wiPitEPiwE/TCNscIVauXxmt4NTGcy18HrUd0WRWXfYzAQGXm0eI87u3NMudNhqFj2NISJenxQHg==", - "peer": true, + "notp": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/notp/-/notp-2.0.3.tgz", + "integrity": "sha1-qf0R4lz+HMs5/GaJVE7kwQ75pXc=" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "requires": { - "flow-parser": "^0.121.0", - "jscodeshift": "^0.11.0", - "nullthrows": "^1.1.1" + "path-key": "^3.0.0" } }, - "react-refresh": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", - "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==", - "peer": true + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "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": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } }, - "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==", - "peer": true, + "object.entries": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", + "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", + "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": { - "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==", - "peer": true - } + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" } }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "peer": true, + "object.fromentries": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", + "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", + "dev": true, "requires": { - "picomatch": "^2.2.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" } }, - "recast": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.20.4.tgz", - "integrity": "sha512-6qLIBGGRcwjrTZGIiBpJVC/NeuXpogXNyRQpqU1zWPUigCphvApoCs9KIwDYh1eDuJ6dAFlQoi/QUyE5KQ6RBQ==", - "peer": true, + "object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "dev": true, "requires": { - "ast-types": "0.14.2", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tslib": "^2.0.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==", - "peer": true - }, - "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", - "peer": true - } + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" } }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "peer": true, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "resolve": "^1.1.6" + "wrappy": "1" } }, - "redux": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", - "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "requires": { - "loose-envify": "^1.4.0", - "symbol-observable": "^1.2.0" + "mimic-fn": "^2.1.0" } }, - "redux-action-buffer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redux-action-buffer/-/redux-action-buffer-1.2.0.tgz", - "integrity": "sha1-LsCh2JnMn29EzN60Me5SrUHdl1U=" - }, - "redux-devtools-core": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/redux-devtools-core/-/redux-devtools-core-0.2.1.tgz", - "integrity": "sha512-RAGOxtUFdr/1USAvxrWd+Gq/Euzgw7quCZlO5TgFpDfG7rB5tMhZUrNyBjpzgzL2yMk0eHnPYIGm7NkIfRzHxQ==", - "requires": { - "get-params": "^0.1.2", - "jsan": "^3.1.13", - "lodash": "^4.17.11", - "nanoid": "^2.0.0", - "remotedev-serialize": "^0.1.8" - }, - "dependencies": { - "nanoid": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", - "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" - } - } + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" }, - "redux-devtools-instrument": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/redux-devtools-instrument/-/redux-devtools-instrument-1.10.0.tgz", - "integrity": "sha512-X8JRBCzX2ADSMp+iiV7YQ8uoTNyEm0VPFPd4T854coz6lvRiBrFSqAr9YAS2n8Kzxx8CJQotR0QF9wsMM+3DvA==", + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, "requires": { - "lodash": "^4.17.19", - "symbol-observable": "^1.2.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" } }, - "redux-offline": { - "version": "git+ssh://git@github.com/enahum/redux-offline.git#885024de96b6ec73650c340c8928066585c413df", - "integrity": "sha512-srmJ1vWm8ZQTYflZCf7oUs3WBX83GyCIzsFUpwxUg2wcDHngSHjjShRTCgmkciPkVmM4aJ33i9baYS9jRC+zLA==", - "from": "redux-offline@git+https://github.com/enahum/redux-offline.git#885024de96b6ec73650c340c8928066585c413df", - "requires": { - "@react-native-community/netinfo": "^4.1.3", - "redux-persist": "^4.5.0" - } + "ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=" }, - "redux-persist": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-4.9.1.tgz", - "integrity": "sha512-XoOmfPyo9GEU/WLH9FgB47dNIN9l5ArjHes4o7vUWx9nxZoPxnVodhuHdyc4Ot+fMkdj3L2LTqSHhwrkr0QFUg==", + "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": { - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.4", - "lodash-es": "^4.17.4" + "p-try": "^1.0.0" } }, - "redux-persist-node-storage": { + "p-locate": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redux-persist-node-storage/-/redux-persist-node-storage-2.0.0.tgz", - "integrity": "sha1-QAHjK4tDxzgH7y2pujAfSxxmr3k=", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, "requires": { - "node-localstorage": "^1.3.0" + "p-limit": "^1.1.0" } }, - "redux-thunk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", - "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "peer": true - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "peer": true, + "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==", "requires": { - "regenerate": "^1.4.0" + "aggregate-error": "^3.0.0" } }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" - }, - "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", - "peer": true, - "requires": { - "@babel/runtime": "^7.8.4" - } + "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 }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "peer": 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": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "callsites": "^3.0.0" } }, - "regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "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": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "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=" }, - "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", - "peer": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", - "peer": 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=" }, - "regjsparser": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", - "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", - "peer": true, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, "requires": { - "jsesc": "~0.5.0" + "pify": "^3.0.0" }, "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "peer": true + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true } } }, - "remote-redux-devtools": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/remote-redux-devtools/-/remote-redux-devtools-0.5.16.tgz", - "integrity": "sha512-xZ2D1VRIWzat5nsvcraT6fKEX9Cfi+HbQBCwzNnUAM8Uicm/anOc60XGalcaDPrVmLug7nhDl2nimEa3bL3K9w==", - "requires": { - "jsan": "^3.1.13", - "querystring": "^0.2.0", - "redux-devtools-core": "^0.2.1", - "redux-devtools-instrument": "^1.9.4", - "rn-host-detect": "^1.1.5", - "socketcluster-client": "^14.2.1" - } - }, - "remotedev-serialize": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/remotedev-serialize/-/remotedev-serialize-0.1.9.tgz", - "integrity": "sha512-5tFdZg9mSaAWTv6xmQ7HtHjKMLSFQFExEZOtJe10PLsv1wb7cy7kYHtBvTYRro27/3fRGEcQBRNKSaixOpb69w==", - "requires": { - "jsan": "^3.1.13" - } + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" }, - "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=", - "peer": true + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, - "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==", - "peer": true + "picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==" }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "peer": true + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, - "request-progress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", - "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.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": { - "throttleit": "^1.0.0" + "find-up": "^2.1.0" } }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + "platform": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.3.tgz", + "integrity": "sha1-ZGx3ARiZhwtqCQPnXpl+jlHadGE=" }, - "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==", + "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 }, - "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==" + "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==" }, - "reselect": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", - "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==" + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true }, - "resolve": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.16.1.tgz", - "integrity": "sha512-rmAglCSqWWMrrBv/XM6sW0NuRFiKViw/W4d9EbC4pt+49H8JwHy+mcGmALTEg504AUDcLTvb1T2q3E9AnmY+ig==", + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", "requires": { - "path-parse": "^1.0.6" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" } }, - "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 + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==" }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "peer": true + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "peer": 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==" }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "qrcode-terminal": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", + "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==" + }, + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" + }, + "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 }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "peer": true, "requires": { - "glob": "^7.1.3" + "safe-buffer": "^5.1.0" } }, - "rn-host-detect": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/rn-host-detect/-/rn-host-detect-1.2.0.tgz", - "integrity": "sha512-btNg5kzHcjZZ7t7mvvV/4wNJ9e3MPgrWivkRgWURzXL0JJ0pwWlU4zrbmdlz3HHzHOxhBhHB4D+/dbMFfu4/4A==" - }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "peer": true - }, - "rudder-sdk-js": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/rudder-sdk-js/-/rudder-sdk-js-1.0.14.tgz", - "integrity": "sha512-q86qmF6VUXjTUCv1YRFc2V1pt408D641nD2ymKFaLtGZTLjkZCzotQ7cW8c48vPKlSWwekkBlA3kghy/NKGwOw==" + "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==" }, - "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==", + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "queue-microtask": "^1.2.2" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" } }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, "requires": { - "tslib": "^1.9.0" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" } }, - "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==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "peer": true, "requires": { - "ret": "~0.1.10" + "picomatch": "^2.2.1" } }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "peer": true, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "peer": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "peer": 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=", - "peer": true, - "requires": { - "is-extendable": "^0.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==", - "peer": 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" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "peer": 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" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "peer": 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=", - "peer": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "peer": true, - "requires": { - "pump": "^3.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=", - "peer": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "peer": 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=", - "peer": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "peer": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "peer": 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" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "peer": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "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=", - "peer": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "peer": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "peer": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "peer": 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=", - "peer": 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=", - "peer": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "peer": true, - "requires": { - "isexe": "^2.0.0" - } - } + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", + "requires": { + "throttleit": "^1.0.0" } }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "peer": true + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, - "sc-channel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/sc-channel/-/sc-channel-1.2.0.tgz", - "integrity": "sha512-M3gdq8PlKg0zWJSisWqAsMmTVxYRTpVRqw4CWAdKBgAfVKumFcTjoCV0hYu7lgUXccCtCD8Wk9VkkE+IXCxmZA==", + "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 + }, + "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==" + }, + "resolve": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.16.1.tgz", + "integrity": "sha512-rmAglCSqWWMrrBv/XM6sW0NuRFiKViw/W4d9EbC4pt+49H8JwHy+mcGmALTEg504AUDcLTvb1T2q3E9AnmY+ig==", + "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==", "requires": { - "component-emitter": "1.2.1" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" } }, - "sc-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/sc-errors/-/sc-errors-2.0.1.tgz", - "integrity": "sha512-JoVhq3Ud+3Ujv2SIG7W0XtjRHsrNgl6iXuHHsh0s+Kdt5NwI6N2EGAZD4iteitdDv68ENBkpjtSvN597/wxPSQ==" + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true }, - "sc-formatter": { + "rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/sc-formatter/-/sc-formatter-3.0.2.tgz", - "integrity": "sha512-9PbqYBpCq+OoEeRQ3QfFIGE6qwjjBcd2j7UjgDlhnZbtSnuGgHdcRklPKYGuYFH82V/dwd+AIpu8XvA1zqTd+A==" - }, - "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "peer": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "glob": "^7.1.3" } }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "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": { - "lru-cache": "^6.0.0" + "queue-microtask": "^1.2.2" } }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "peer": true, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "peer": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "peer": true - }, - "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==", - "peer": true - } + "tslib": "^1.9.0" } }, - "serialize-error": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-6.0.0.tgz", - "integrity": "sha512-3vmBkMZLQO+BR4RPHcyRGdE09XCF6cvxzk2N2qn8Er3F91cy8Qt7VvEbZBOpaL53qsBbe2cFOefU6tRY6WDelA==", + "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==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "requires": { - "type-fest": "^0.12.0" - }, - "dependencies": { - "type-fest": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", - "integrity": "sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==" - } + "lru-cache": "^6.0.0" } }, "serialize-javascript": { @@ -23924,72 +10169,11 @@ "randombytes": "^2.1.0" } }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "peer": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, - "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==", - "peer": 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=", - "peer": 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=", - "peer": true - } - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "peer": true - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "peer": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shallow-equals": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shallow-equals/-/shallow-equals-1.0.0.tgz", - "integrity": "sha1-JLdL8cY0wR7Uxxgqbfb7MA3OQ5A=" - }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -24003,29 +10187,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, - "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "peer": true, - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } - }, - "shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "peer": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -24042,27 +10203,11 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, - "simple-plist": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.1.1.tgz", - "integrity": "sha512-pKMCVKvZbZTsqYR6RKgLfBHkh2cV89GXcA/0CVPje3sOiNOnXA8+rp/ciAMZ7JRaUdLzlEM6JFfUn+fS6Nt3hg==", - "peer": true, - "requires": { - "bplist-creator": "0.0.8", - "bplist-parser": "0.2.0", - "plist": "^3.0.1" - } - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "peer": true - }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true }, "slice-ansi": { "version": "3.0.0", @@ -24096,244 +10241,17 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "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==" - } - } - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "peer": 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==", - "peer": 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=", - "peer": 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=", - "peer": 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=", - "peer": 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=", - "peer": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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=", - "peer": 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=", - "peer": 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==", - "peer": 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=", - "peer": 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==", - "peer": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "peer": 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==", - "peer": 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=", - "peer": 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==", - "peer": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "peer": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "socketcluster-client": { - "version": "14.3.2", - "resolved": "https://registry.npmjs.org/socketcluster-client/-/socketcluster-client-14.3.2.tgz", - "integrity": "sha512-xDtgW7Ss0ARlfhx53bJ5GY5THDdEOeJnT+/C9Rmrj/vnZr54xeiQfrCZJbcglwe732nK3V+uZq87IvrRl7Hn4g==", - "requires": { - "buffer": "^5.2.1", - "clone": "2.1.1", - "component-emitter": "1.2.1", - "linked-list": "0.1.0", - "querystring": "0.2.0", - "sc-channel": "^1.2.0", - "sc-errors": "^2.0.1", - "sc-formatter": "^3.0.1", - "uuid": "3.2.1", - "ws": "^7.5.0" - }, - "dependencies": { - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" - }, - "ws": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", - "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", - "requires": {} + "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==" } } }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "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==", - "peer": 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-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==", - "peer": 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==", - "peer": true - } - } - }, - "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==", - "peer": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true }, "spdx-correct": { "version": "3.1.1", @@ -24367,24 +10285,16 @@ "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", "dev": true }, - "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==", - "peer": 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=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -24397,136 +10307,6 @@ "tweetnacl": "~0.14.0" } }, - "stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", - "peer": true - }, - "stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "peer": true, - "requires": { - "type-fest": "^0.7.1" - }, - "dependencies": { - "type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "peer": true - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "peer": 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=", - "peer": 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=", - "peer": 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=", - "peer": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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=", - "peer": 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=", - "peer": 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==", - "peer": 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==", - "peer": true - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "peer": true - }, - "stream-buffers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=", - "peer": 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==", - "peer": true, - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "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==", - "peer": true - } - } - }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -24594,12 +10374,6 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "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=", - "peer": true - }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -24610,12 +10384,6 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, - "sudo-prompt": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", - "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", - "peer": true - }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -24624,11 +10392,6 @@ "has-flag": "^4.0.0" } }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" - }, "table": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", @@ -24717,24 +10480,6 @@ "tcomb": "^3.0.0" } }, - "temp": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", - "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", - "peer": true, - "requires": { - "os-tmpdir": "^1.0.0", - "rimraf": "~2.2.6" - }, - "dependencies": { - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "peer": true - } - } - }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -24746,12 +10491,6 @@ "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-0.0.2.tgz", "integrity": "sha1-QlPinYywWPBIAmfFaYwOSSflS2o=" }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "peer": true - }, "throttleit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", @@ -24762,16 +10501,6 @@ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "peer": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -24780,48 +10509,11 @@ "rimraf": "^3.0.0" } }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "peer": 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=", - "peer": 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=", - "peer": 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==", - "peer": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true }, "to-regex-range": { "version": "5.0.1", @@ -24831,12 +10523,6 @@ "is-number": "^7.0.0" } }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "peer": true - }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -24874,7 +10560,7 @@ "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "requires": { "safe-buffer": "^5.0.1" } @@ -24887,7 +10573,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "type-check": { "version": "0.4.0", @@ -24910,36 +10596,6 @@ "dev": true, "peer": true }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "peer": true, - "requires": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "peer": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "peer": true - } - } - }, - "ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", - "peer": true - }, "unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", @@ -24952,105 +10608,11 @@ "which-boxed-primitive": "^1.0.2" } }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "peer": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "peer": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "peer": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "peer": 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==", - "peer": 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=", - "peer": true - } - } - }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "peer": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "peer": 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=", - "peer": 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=", - "peer": 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=", - "peer": true - } - } - }, "untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", @@ -25060,59 +10622,11 @@ "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" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "peer": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "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=" - } - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "peer": true - }, - "use-subscription": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", - "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==", - "peer": true, - "requires": { - "object-assign": "^4.1.1" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "peer": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "peer": true - }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -25139,52 +10653,16 @@ "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "peer": true - }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, - "vlq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", - "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "peer": true - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "peer": true, - "requires": { - "makeerror": "1.0.x" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "peer": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==", - "peer": true - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -25297,68 +10775,11 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "peer": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "peer": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xcode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/xcode/-/xcode-2.1.0.tgz", - "integrity": "sha512-uCrmPITrqTEzhn0TtT57fJaNaw8YJs1aCzs+P/QqxsDbvPZSv7XMPPwXrKvHtD6pLjBM/NaVwraWJm8q83Y4iQ==", - "peer": true, - "requires": { - "simple-plist": "^1.0.0", - "uuid": "^3.3.2" - } - }, "xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=" }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "peer": true - }, - "xmldoc": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.2.tgz", - "integrity": "sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ==", - "peer": true, - "requires": { - "sax": "^1.2.1" - } - }, - "xmldom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.5.0.tgz", - "integrity": "sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA==", - "peer": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "peer": true - }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/tests-e2e/package.json b/tests-e2e/package.json index 5411d185ed..a5aba537a2 100644 --- a/tests-e2e/package.json +++ b/tests-e2e/package.json @@ -1,21 +1,19 @@ { "dependencies": { "@cypress/skip-test": "^2.6.1", - "@testing-library/cypress": "7.0.6", + "@testing-library/cypress": "^8.0.3", "authenticator": "^1.1.5", "axios": "^0.21.1", "axios-retry": "^3.1.9", - "cypress": "7.7.0", - "cypress-file-upload": "5.0.8", + "cypress": "^10.6.0", "cypress-multi-reporters": "^1.5.0", - "cypress-plugin-tab": "1.0.5", - "cypress-terminal-report": "3.2.2", - "cypress-wait-until": "1.7.1", + "cypress-plugin-tab": "^1.0.5", + "cypress-terminal-report": "^4.1.1", + "cypress-wait-until": "^1.7.2", "deepmerge": "^4.2.2", "localforage": "^1.9.0", "lodash.mapkeys": "^4.6.0", "lodash.xor": "^4.5.0", - "mattermost-redux": "^5.33.1", "mocha-junit-reporter": "Phrynobatrachus/mocha-junit-reporter#9c2eccdd4d5e78f141887f3d4bd3a9a2124688bd", "mochawesome": "^6.2.2", "mochawesome-merge": "^4.2.0", @@ -31,7 +29,7 @@ "eslint-plugin-header": "3.1.1", "eslint-plugin-import": "2.23.4", "eslint-plugin-mattermost": "github:mattermost/eslint-plugin-mattermost#46ad99355644a719bf32082f472048f526605181", - "eslint-plugin-no-only-tests": "^2.6.0", + "eslint-plugin-no-only-tests": "^3.0.0", "eslint-plugin-react": "7.24.0" }, "scripts": { diff --git a/webapp/.eslintrc.json b/webapp/.eslintrc.json index 745ded1723..23ad650ee5 100644 --- a/webapp/.eslintrc.json +++ b/webapp/.eslintrc.json @@ -547,7 +547,17 @@ "react/require-render-return": 2, "react/self-closing-comp": 2, "react/sort-comp": 0, - "react/style-prop-object": 2, + "react/style-prop-object": [ + 2, + { + "allow": [ + "FormattedNumber", + "FormattedDuration", + "FormattedRelativeTime", + "Timestamp" + ] + } + ], "require-yield": 2, "rest-spread-spacing": [ 2, @@ -620,6 +630,7 @@ "formatjs/no-multiple-whitespaces": 1, "formatjs/no-multiple-plurals": 2, "formatjs/enforce-placeholders": 2, + "formatjs/no-literal-string-in-jsx": 2, "unused-imports/no-unused-imports": 2 }, "overrides": [ diff --git a/webapp/i18n/de.json b/webapp/i18n/de.json index 9d0237bdfd..56cb58f23e 100644 --- a/webapp/i18n/de.json +++ b/webapp/i18n/de.json @@ -610,5 +610,99 @@ "nc8QpJ": "Letzte Aktivitäten", "m/KtHt": "Du hast keine Berechtigung den Besitzer zu ändern", "RnOiCg": "Es war nicht möglich dem Durchlauf {isFollowing, select, true {nicht mehr zu folgen} other {zu folgen}}", - "4mCpAv": "Der Besitzer konnte nicht geändert werden" + "4mCpAv": "Der Besitzer konnte nicht geändert werden", + "lr1CUA": "Durchsuche Playbooks", + "Ul0aFX": "Importiere Playbook", + "LfhTNW": "Durchsuche oder erstelle Playbooks und Durchläufe", + "GVpA4Q": "Erstelle neues Playbook", + "CFysvS": "Erstelle Playbook Dropdown", + "/qDObA": "Durchläufe durchsuchen", + "/+8SGX": "Zeige {filteredNum} von {totalNum} Ereignissen", + "Xx0WZV": "Sende Nachricht", + "UePrSL": "{num} {num, plural, one {Teilnehmer} other {Teilnehmer}}", + "UMFnWV": "Retrospektive anzeigen", + "9xs0pp": "Wert hinzufügen...", + "jboo9u": "Aktualisierung anfordern", + "P9PKvb": "Ein Nachricht wurde an den Durchlauf-Kanal gesendet.", + "NGqzDU": "Aktualisierungsanfrage bestätigen", + "JvEwg/": "Es war nicht möglich eine Aktualisierung anzufordern", + "Jli9m7": "Eine Nachricht wird an den Durchlauf-Kanal gesendet mit der Aufforderung eine Aktualisierung zu senden.", + "VpQKQE": "{displayName} sind keine Teilnehmer dieses Durchlaufs. Möchtest du sie zu Teilnehmern machen? Sei werden Zugriff auf den kompletten Nachrichtenverlauf im Durchlauf-Kanal haben.", + "RCT0Px": "Füge {displayName} zum Kanal hinzu", + "KeO51o": "Kanal", + "lKeJ+i": "Es gibt keine Zusammenfassung", + "pFK6bJ": "Zeige alle", + "hIWK05": "Eine Nachricht wird an den Durchlaufkanal gesendet, um dich als Beteiligten hinzuzufügen.", + "U8u4uF": "Beteiligt werden", + "J2NmIY": "Bestätige um beteiligt zu werden", + "MD6oav": "Es war nicht möglich, eine Anfrage auf Beteiligung zu stellen", + "3O8M5M": "Anfrage wurde an den Durchlaufkanal gesendet.", + "zW/5AB": "Professional Funktion Dies ist eine kostenpflichtige Funktion, die mit einem kostenlosen 30-Tage Test verfügbar ist", + "vDvWJ6": "Teste Aktualisierung anfordern mit einem kostenlosen Test", + "ch4Vs1": "Fordere Aktualisierungen für Durchläufe mit einem einzelnen Klick an und werde direkt benachrichtigt, wenn eine Aktualisierung gesendet wird. Starte einen kostenlosen 30-Tage Test um es auszuprobieren.", + "PdRg+3": "Zeige alle...", + "P6NEL/": "Befehl...", + "1fXVVz": "Fälligkeitsdatum...", + "1GOpgL": "Bearbeiter...", + "u6Fyic": "Deine Anfrage wurde an den Durchlaufkanal gesendet.", + "pzTOmv": "Verfolger", + "pXWclp": "Deine Teilnahme-Anfrage wird an den Durchlaufkanal gesendet.", + "Nf9oAA": "Du bist dabei an diesem Durchlauf teilzunehmen.", + "5PpBsd": "Deine Anfrage war nicht erfolgreich.", + "4Iqlfe": "Du nimmst an diesem Durchlauf teil.", + "wGp7l3": "{icon} Dollar", + "s+rSpl": "{icon} Ganzzahl", + "qp5G0Z": "Upgrade benötigt für Zugriff auf die Retrospektive-Funktionen.", + "ojQue/": "{icon} Dauer (in dd:hh:mm)", + "mNgqXf": "Zum Freischalten dieser Funktion:", + "j2VYGA": "Zeige alle Playbooks", + "SMrXWc": "Favoriten", + "PWmZrW": "Zeige alle Durchläufe", + "PW+sL4": "N.V.", + "KzHQCQ": "Es gibt keine beendeten Durchläufe, die auf diese Filter passen.", + "CUhlqp": "Tutorial Tour Tipp Produktbild", + "5HXkY/": "Typ: {typeTitle}", + "3zF589": "Zurücksetzen auf alle {filterName}", + "xfnuXm": "Teilnehmen", + "wRM2AO": "Die Aktualisierungsanfrage war nicht erfolgreich.", + "ePhhuK": "Deine Anfrage wurde an den Durchlaufkanal gesendet.", + "b+DwLA": "Anfrage zur Teilnahme an diesem Durchlauf.", + "PoX2HN": "Sende Anfrage", + "OfN7IN": "Eine Statusaktualisierungsanfrage wird in den Durchlaufkanal gesendet.", + "Gwmqz5": "Frage eine Aktualisierung an", + "CV1ddt": "Nimm am Durchlauf teil", + "B9z0uZ": "Deine Anfrage zur Teilnahme am Durchlauf war nicht erfolgreich.", + "AH+V3r": "Werde ein Teilnehmer des Durchlaufs.", + "+6DCr9": "Als Teilnehmer kannst du Statusaktualisierungen senden, Aufgaben zuweisen und abschliessen und Retrospektiven durchführen.", + "wBZz47": "Du hast den Durchlauf verlassen.", + "gfUBRi": "Weise einen neuen Besitzer zu bevor du den Durchlauf verläßt.", + "fnihsY": "Verlassen", + "a1vQ5Q": "Verlassen bestätigen", + "SK5APX": "Es war nicht möglich den Durchlauf zu verlassen.", + "N9CTUJ": "Durchlauf verlassen", + "F/HKIy": "Bist du sicher, dass die den Durchlauf verlassen möchtest?", + "Mjq//Y": "Nicht favorisieren", + "5Hzwqs": "Favorisieren", + "XS4umx": "{name} hat ein Statusupdate verschlafen", + "mttASm": "Verlassen und Durchlauf nicht mehr folgen", + "lpWBJE": "Bestätige verlassen und nicht mehr folgen", + "hnYSP3": "Wenn du einen Durchlauf verläßt und nicht mehr folgst, wird er aus der linken Randleiste entfernt. Du kannst ihn über die Anzeige aller Durchläufe wiederfinden.", + "AhY0vJ": "Verlassen und nicht mehr folgen", + "egUE/K": "Senden an ausgewählte Kanäle", + "Xm0L7N": "Wenn eine Statusaktualisierung gesendet oder eine Retrospektive veröffentlicht wird", + "iEtImk": "Wenn du einen Durchlauf verlässt{isFollowing, select, true { und nicht mehr folgst} other { }}, wird er aus der linken Seitenleiste entfernt. Du findest ihn weiterhin, wenn du alle Durchläufe ansiehst.", + "cnfVhV": "Verlassen {isFollowing, select, true { und nicht folgen } other {}}run", + "Q4sutg": "Bestätige verlassen{isFollowing, select, true { und nicht mehr folgen} other {}}", + "Suyx6A": "Der Playbook Import ist fehlgeschlagen. Bitte prüfe, dass das JSON valide ist und nochmal versuchen.", + "QegBKq": "Playbook beitreten", + "P6PLpi": "Teilnehmen", + "FgydNe": "Ansehen", + "qGlwfc": "Starte Durchlauf", + "j2FnDV": "Es wird ein Kanal mit diesem Namen erstellt", + "iQhFxR": "Zuletzt verwendet", + "03oqA2": "Aktive Durchläufe", + "KjNfA8": "Ungültiger Zeitraum", + "k5EChD": "Bist du sicher, dass du den Durchlauf neu starten möchtest?", + "vqmRBs": "Bestätige Neustart Durchlauf", + "Zg0obP": "Durchlauf erneut starten" } diff --git a/webapp/i18n/en.json b/webapp/i18n/en.json index 2bd94d9a12..f1fe45fa06 100644 --- a/webapp/i18n/en.json +++ b/webapp/i18n/en.json @@ -1,5 +1,6 @@ { "+/x2FM": "Select a playbook", + "+6DCr9": "As a participant, you can post status updates, assign and complete tasks, and perform retrospectives.", "+8G9qr": "Default text for the retrospective.", "+PMJAg": "Begin following for {followers, plural, =1 {one user} other {# users}}", "+QgvjN": "Assign the owner role to", @@ -18,13 +19,14 @@ "/jUtaM": "ACTIVE RUNS per day over the last 14 days", "/qDObA": "Browse Runs", "/urtZ8": "Your Playbooks", + "03oqA2": "Active Runs", "0HT+Ib": "Archived", + "0QD99o": "Request to join channel", "0RlzlZ": "Send a temporary welcome message to the user", "0Vvpht": "Make Playbook Member", "0Xt1ea": "You will still be able to access historical data for this metric.", "0oL1zz": "Copied!", "0oLj/t": "Expand", - "0q+hj2": "Define a template for a concise description that explains each run to its stakeholders.", "0tznw6": "Convert to private playbook", "15jbT0": "Add more to your timeline", "1GOpgL": "Assignee...", @@ -41,12 +43,12 @@ "2VrVHu": "Search by run name", "3/wF0G": "Slash commands", "36GNZj": "The playbook {title} was successfully archived.", - "371AC3": "Update the run summary", "3Ls2m+": "Playbook Member", "3MSGcL": "Channel name is not valid.", "3PoGhY": "Are you sure you want to publish?", "3hBelc": "A retrospective is not expected.", "3rCdDw": "Status updates", + "3zF589": "Reset to all {filterName}", "42qmJ5": "You do not have permission to post an update.", "47FYwb": "Cancel", "4BN53Q": "We’ll show you how close or far from the target each run’s value is and also plot it on a chart.", @@ -64,9 +66,8 @@ "5AJmOz": "When a user joins the channel", "5BUxvl": "Everyone in this team can view this playbook.", "5CI3KH": "Contact support", - "5FRgqE": "Downloading channel log", - "5Ofkag": "Enable retrospective", - "5PpBsd": "Your request wasn't successful.", + "5HXkY/": "Type: {typeTitle}", + "5Hzwqs": "Favorite", "5ZIN3u": "Status Updates", "5ciuDD": "NOT IN CHANNEL", "5j6GD/": "{numParticipants, plural, =0 {no participants} =1 {# participant} other {# participants}}", @@ -76,8 +77,6 @@ "6CGo3o": "Status / Last update", "6D6ffM": "Please enter a duration in the format: dd:hh:mm (e.g., 12:00:00), or leave the target blank.", "6GTzTR": "See what’s in this playbook at any time", - "6jDabx": "Give Feedback", - "6n0XDG": "Are you sure you want to remove the checklist? All tasks will be removed.", "6uhSSw": "Select a channel", "7P5T3W": "Restore checklist", "8hDbW6": "Send an outgoing webhook", @@ -93,7 +92,6 @@ "9j5KzL": "Enter category name", "9kCT7Q": "Make retrospectives easy with a timeline that automatically keeps track of the key events and messages so that teams have it at their fingertips.", "9kQNdp": "This playbook is private.", - "9m0I/B": "Keep stakeholders updated", "9tBhzB": "Upgrade now", "9trZXa": "Anyone on the team can view", "9uOFF3": "Overview", @@ -101,14 +99,13 @@ "A21Mgv": "Run finished", "A8dbCS": "Playbook Not Found", "AF7+5o": "Add due date", + "AH+V3r": "Become a participant of the run.", "AML4RW": "Task assignments", - "AS5kar": "Participants ({participants})", + "AhY0vJ": "Leave and unfollow", "ApULhK": "Invite members", - "ArpdYl": "Timeline events are displayed here as they occur. Hover over an event to remove it.", "Auj1ap": "Start a trial or upgrade your subscription.", "B3Q5mz": "Trigger", "B487HA": "In Progress", - "BD66u6": "Download a CSV containing all messages from the channel", "BNB75h": "A playbook prescribes the checklists, automations, and templates for any repeatable procedures. {br} It helps teams reduce errors, earn trust with stakeholders, and become more effective with every iteration.", "BQtd5I": "Welcome to Playbooks!", "Brya9X": "Add a run summary template…", @@ -118,6 +115,8 @@ "CBM4vh": "Timer for next update", "CFysvS": "Create Playbook Dropdown", "CSts8B": "Team Icon", + "CUhlqp": "tutorial tour tip product image", + "CV1ddt": "Participate in the run", "CjNrqO": "Retrospective report template", "CkYhdY": "Add the channel to a sidebar category", "CwwzAU": "Add checklist name", @@ -125,7 +124,6 @@ "CyGaem": "Run name", "D2CE02": "Enter webhook", "D55vrs": "Your license could not be generated", - "D9IV7i": "Retrospectives were disabled for this playbook run.", "DCl7Vv": "inline code", "DPj6DM": "Select Run to see it in action.", "DSVJjB": "Currently running the {playbookTitle} playbook", @@ -133,8 +131,6 @@ "DaHpK1": "Search for a channel", "DnBhRg": "Add People", "DtCplA": "{numParticipants, plural, =1 {# participant} other {# participants}}", - "E0LnBo": "You can select an option or specify a custom duration (\"2 weeks\", \"3 days 12 hours\", \"45 minutes\", ...)", - "EC5MJD": "There are no updates available.", "EQpfkS": "Finished", "EWz2w5": "Run Playbook", "Ek1Fx2": "When a message with these keywords is posted", @@ -144,18 +140,17 @@ "FEGywG": "Please specify a future date/time for the update reminder.", "FGzxgY": "e.g., Time to acknowledge, Time to resolve", "FXCLuZ": "{total, number} total", + "FgydNe": "View", "G/yZLu": "Remove", - "GAuN6w": "Set up assumptions", "GDCpPr": "Recent status update", "GG1yhI": "There are templates for a range of use cases and events. You can use a playbook as-is or customize it—then share it with your team.", "GRTyvN": "Toggle Playbook List", "GVpA4Q": "Create New Playbook", "GXjP8g": "All the runs that you can access will show here", "GjCS6U": "Choose a template", - "GwtR3W": "Drag and drop an existing task or click to create a new task.", + "Gwmqz5": "Request an update", "GxJAK1": "The playbook you're requesting is private or does not exist.", "HAlOn1": "Name", - "HGdWwZ": "Create and assign tasks", "HLn43R": "Manage access", "HSi3uv": "No Assignee", "HXvk56": "Post status updates", @@ -164,35 +159,26 @@ "Hzwzgs": "Broadcast updates in the {oneChannel, plural, one {channel} other {channels}}", "I0NIMp": "Your tasks", "I2zEie": "Celebrate success and learn from mistakes with retrospective reports. Filter timeline events for process review, stakeholder engagement, and auditing purposes.", - "I5DYM+": "Learn AND reflect", "I5NMJ8": "More", "I7+d55": "Specify date/time (“in 4 hours”, “May 1”...)", "I90sbW": "just now", "ICqy9/": "Checklists", - "IOnm/Z": "There is no run summary available.", - "Ietscn": "Tasks finished", "IfxUgC": "Add a run summary…", - "IuFETn": "Duration", "IxtSML": "Add a checklist", - "J2NmIY": "Confirm get involved", - "JCGvY/": "This template helps to standardize the format for recurring updates that take place throughout each run to keep.", "JJMNME": "{withRunName, select, true {@{authorUsername} posted an update for [{runName}]({overviewURL})} other {@{authorUsername} posted an update}}", "JJNc3c": "Previous", "JXdbo8": "Done", - "Ja1sVR": "Status updates were disabled for this playbook run.", "JcefuP": "Add a description (optional)", "JeqL8w": "Retrospective canceled by {name}", - "Jli9m7": "A message will be sent to the run channel, requesting them to post an update.", "JqKASQ": "Add @{displayName} to Channel", "JrZ2th": "Add Metric", - "JvEwg/": "It was not possible to request an update", "K3r6DQ": "Delete", - "K4O03z": "New task", - "KJu1sq": "Remove checklist", "KUr+sG": "Update run summary", "KXVV4+": "Welcome to the playbook preview page!", "KeO51o": "Channel", "KiXNvz": "Run", + "KjNfA8": "Invalid time duration", + "KzHQCQ": "There are no finished runs matching those filters.", "L6k6aT": "…or start with a template", "LDYFkN": "Duration (in dd:hh:mm)", "LI7YlB": "Add details on what this metric is about and how it should be filled in. This description will be available on the retrospective page for each run where values for these metrics will be input.", @@ -204,14 +190,15 @@ "Lo10yH": "Unknown Channel", "M/2yY/": "Nobody yet.", "M4gAc9": "Add value", + "M9tXoZ": "A join request will be sent to the run channel.", "MBNMo9": "Channel Actions", "MFpAtm": "{numTasks, number} {numTasks, plural, one {task} other {tasks}}", "MHzP9I": "Define a message to welcome users joining the channel.", "MJ89uW": "Convert to Private playbook", "MTzF3S": "Are you sure you want to restore the playbook {title}?", "MbapTE": "{num} {num, plural, =1 {task} other {tasks}} overdue", + "Mjq//Y": "Unfavorite", "Mm1Gse": "Search for member", - "MrJPOh": "Enable status updates", "MtrTNy": "Tomorrow", "MvEydR": "{name} posted a status update", "MyIJbr": "Contents", @@ -219,32 +206,33 @@ "N2IrpM": "Confirm", "NA7Cw1": "Copy link to playbook", "NFyWnZ": "Work more effectively", - "NGqzDU": "Confirm request update", "NJ9uPu": "Key metrics", "NLeFGn": "to", "NMxVd+": "Please fill in the metric value.", "NYTGIb": "Got it", - "Nf9oAA": "You're about to join this run.", "Nh91Us": "{from, number}–{to, number} of {total, number} total", "NiAH1z": "Target value", "OINwWS": "Create a {isPublic, select, true {public} other {private}} channel", "OK8u0r": "Create a playbook to prescribe the workflow that your teams and tools should follow, including everything from checklists, actions, templates, and retrospectives.", - "OKhRC6": "Share", "OQplDX": "A status update is expected every . New updates will be posted to {channelCount, plural, =0 {no channels} one {# channel} other {# channels}} and {webhookCount, plural, =0 {no outgoing webhooks} one {# outgoing webhook} other {# outgoing webhooks}}.", "Ob5cSv": "Changes that you made will not be saved if you leave this page. Are you sure you want to discard changes and leave?", "ObmjTB": "Slash Command", "OcpRSQ": "Delete Entry", + "OfN7IN": "A status update request will be sent to the run channel.", "Oo5sdB": "Playbook name", "OqCzNb": "Add a task", "OsDomv": "All events", "OuZhcQ": "Specify duration (\"8 hours\", \"3 days\"...)", "OyZnsJ": "per run", "P6NEL/": "Command...", - "P9PKvb": "A message was sent to the run channel.", + "P6PLpi": "Join", + "PW+sL4": "N/A", + "PWmZrW": "View all runs", "PdRg+3": "View all...", + "PoX2HN": "Send request", "Ppx673": "Reports", "Q15rLN": "Request update...", - "Q3R9Uj": "Document steps for the entire process here. Assign each task to responsible individuals and optionally add timelines or linked actions.", + "Q4sutg": "Confirm leave{isFollowing, select, true { and unfollow} other {}}", "Q5hysF": "Do more with Playbooks", "Q7aZO4": "{numParticipants, plural, =0 {no active participants} =1 {# active participant} other {# active participants}}", "Q7hMnp": "Run playbook", @@ -252,12 +240,12 @@ "QUwMsX": "Reminder to fill out the retrospective", "QaZNp9": "Finish run", "QbGfqo": "Broadcast to stakeholders in multiple places and keep a paper trail for retrospective with just one post.", + "QegBKq": "Join playbook", "QiKcO7": "Enter retrospective template", "QnZAit": "Add optional description", "QpUBDr": "{members, plural, =0 {No one} =1 {One person} other {# people}} can access this playbook.", "Qrl6bQ": "Streamline your processes with playbooks", "QywYDe": "Also mark the run as finished", - "R+JQaJ": "Channel members", "R/2lqw": "Select a template", "R5Zh+l": "This lets you experience a sample playbook first before investing time to create your own.", "RCT0Px": "Add {displayName} to Channel", @@ -272,11 +260,13 @@ "S0kWcH": "Update overdue", "SDSqfA": "When a run starts", "SENRqu": "Help", + "SK5APX": "It wasn't possible to leave the run.", + "SMrXWc": "Favorites", "SVwJTM": "Export", "SXJ98n": "You will not be able to edit the retrospective report after publishing it. Do you want to publish the retrospective report?", "SmAUf9": "A reminder will be sent {timestamp}", + "Suyx6A": "The playbook import has failed. Please check that JSON is valid and try again.", "Sx3lHL": "Integer", - "T5rX+W": "How often should an update be posted?", "TBez4r": "There are no playbooks to view. You don't have permission to create playbooks in this workspace.", "TD8WrM": "Duplicate is disabled for this team.", "TJo5E6": "Preview", @@ -287,7 +277,6 @@ "Tt04f1": "See who is involved and what needs to be done without leaving the conversation.", "TxCTXQ": "Are you sure you want to finish the run?", "TxmjKI": "Describe what this metric is about", - "U8u4uF": "Get involved", "UMFnWV": "View Retrospective", "UMoxP9": "Channel name template (optional)", "UbTsGY": "Runs started between {start} and {end}", @@ -310,15 +299,16 @@ "X2K92H": "Checklist name", "XF8rrh": "Copy link to ''{name}''", "XRyRzf": "Status updates are not expected.", + "XS4umx": "{name} snoozed a status update", "XXbWAU": "Select this to automatically receive updates when this playbook is run.", "Xgxruo": "Skip checklist", "XmUdvV": "All the statistics you need", + "XnICdK": "It wasn't possible to join the run", "XpDetT": "Opt out of these tips.", "Xx0WZV": "Send message", "Y4MU/9": "Select Start a test run to see it in action.", "YDuW/T": "{num_runs, plural, =0 {Not run yet} one {# run} other {# total runs}}", "YKn+7s": "This channel is not running any playbook.", - "YMrTRm": "Run Summary", "YORRGQ": "Post update", "YQOmSf": "Enter one webhook per line", "Z/hwEf": "The channel will be reminded to perform the retrospective {reminderEnabled, select, true {every} other {}}", @@ -328,8 +318,10 @@ "ZAJviT": "We weren't able to notify the System Admin.", "ZJS10z": "No updates have been posted yet", "ZNNjWw": "Please enter a number.", + "ZRv7Dm": "Request to Join", "ZWtlyd": "Run restored by {name}", "ZdWYcm": "No, skip retrospective", + "Zg0obP": "Restart run", "ZkhArX": "Let's go!", "a0hBZ0": "Delete metric", "aACJNp": "Run started by {name}", @@ -339,9 +331,9 @@ "aZGAOI": "Add a status update template…", "avPeEI": "Upgrade to view trends for total runs, active runs and participants involved in runs of this playbook.", "awG90C": "Target per run", + "b+DwLA": "Request to participate in this run.", "b/QBNs": "Update due", "b3TdyZ": "By clicking Start trial, I agree to the Mattermost Software Evaluation Agreement, Privacy Policy, and receiving product emails.", - "b40Pr7": "Reporter", "b5FaCc": "Add the channel to the sidebar category", "bE1Cro": "My runs only", "bGhCLX": "When an update is posted", @@ -352,9 +344,9 @@ "c23IHq": "Channel actions allow you to automate activities for this channel", "c6LNcW": "Delete task", "c8hxKk": "Week of {date}", - "cEWBE3": "Evaluate your processes using a retrospective to refine and improve with each run.", "cPIKU2": "Following", "ch4Vs1": "Request updates for playbook runs in a single click and get notified directly when an update is posted. Start a free, 30-day trial to try it out.", + "cnfVhV": "Leave {isFollowing, select, true { and unfollow } other {}}run", "cp7KUI": "Playbook", "cyR7Kh": "Back", "d4g2r8": "Deleted: {timestamp}", @@ -369,23 +361,23 @@ "e/AZL5": "Your 30-day trial has started", "e3z3P8": "Discard & leave", "eHAvFf": "bold", - "eLeFE2": "Edit name and description", + "ePhhuK": "Your request was sent to the run channel.", "edxtzC": "Create playbook", "efeNi1": "10-run average value", "egvJrY": "Assignee Changed", "eiPBw7": "Retrospective reminder interval", "f+bqgK": "Name of the metric", - "fUEpLA": "There are no Timeline events matching those filters.", "fV6578": "Assign the owner role", "fXGjhC": "Owner changed from {summary}", "fhMaTZ": "Take a quick tour", "fmbSyg": "Add value (in dd:hh:mm)", + "fnihsY": "Leave", "fuDLDJ": "Create a channel", "g0mp+I": "When you convert to a private playbook, membership and run history is preserved. This change is permanent and cannot be undone. Are you sure you want to convert {playbookTitle} to a private playbook?", "g4IF1x": "There are no runs for this playbook.", - "g5pX+a": "About", "g9pEhE": "Due", "gGcNUr": "You do not have permissions", + "gfUBRi": "Assign a new owner before you leave the run.", "gsMPAS": "Dollars", "gt6BhE": "Run details", "guunZt": "Assign", @@ -397,26 +389,28 @@ "hjteuA": "All the playbooks that you can access will show here", "hrgo+E": "Archive", "hw83pa": "Track key metrics and measure value", - "hzt6l8": "Use Markdown to create a template.", "iDMOiz": "CHANNEL MEMBERS", + "iEtImk": "When you leave{isFollowing, select, true { and unfollow a run} other { a run}}, it's removed from the left-hand sidebar. You can find it again by viewing all runs.", "iMjjOH": "Next week", "iNU1lj": "The run you're requesting is private or does not exist.", + "iQhFxR": "Last used", "iXNbPf": "Rename", "ieGrWo": "Follow", "iigkp8": "Time to wrap up?", "ijAUQf": "Notify your System Admin to upgrade.", + "izWS4J": "Unfollow", + "j2FnDV": "A channel will be created with this name", + "j2VYGA": "View all playbooks", "j7jdWG": "Convert to a commercial edition.", "j940pJ": "This update will be saved to overview page.", "jIIWN+": "preformatted", "jIgqRa": "Owner / Participants", "jS/UOn": "Update template", - "jXT2++": "Go to channel", - "jboo9u": "Request update", "jnmORb": "In this playbook", "jvo0vs": "Save", "jwimQJ": "Ok", "k1djnL": "Delete checklist", - "k9q07e": "Broadcast update to other channels", + "k5EChD": "Are you sure you want to restart the run?", "kDcpd/": "{numKeywords, plural, other {# keywords}}", "kEMvwX": "There are no runs matching those filters.", "kV5GkX": "When a status update is posted", @@ -424,9 +418,7 @@ "kYCbJE": "Add time frame", "kkw4kS": "This update will be broadcasted to {hasChannels, select, true {{broadcastChannelCount, plural, =1 {one channel} other {{broadcastChannelCount, number} channels}}} other {}}{hasFollowersAndChannels, select, true { and } other {}}{hasFollowers, select, true {{followersChannelCount, plural, =1 {one direct message} other {{followersChannelCount, number} direct messages}}} other {}}.", "kvgvNW": "Know what happened", - "l0hFoB": "Add playbook description...", "l5/RKZ": "There are no finished runs for this playbook.", - "l7zMH6": "Select an option or specify a custom duration", "lBqu4h": "Restore playbook", "lJ48wN": "Private playbook", "lJyq2a": "Run not found", @@ -447,6 +439,7 @@ "m/Q4ye": "Rename checklist", "mCrdeS": "Total Playbook Runs", "mLrh+0": "No due date", + "mNgqXf": "To unlock this feature:", "mVpO8u": "Seen this before?", "mkLeuq": "Broadcast update to selected channels", "mm5vL8": "Only invited members", @@ -461,32 +454,30 @@ "oAJsne": "Public playbook", "oBeKB4": "Due on {date}", "oL7YsP": "Last edited {timestamp}", - "oS0w4E": "Default update timer", "oVHn4s": "Last update", "ocYb9S": "Key Metrics", + "ojQue/": "{icon} Duration (in dd:hh:mm)", "opn6uf": "View Timeline", "osuP6z": "Drag to reorder checklist", "p1I/Fx": "We’ve auto-created your run", "pFK6bJ": "View all", "pK6+CW": "@{displayName} is not a member of the [{runName}]({overviewUrl}) channel. Would you like to add them to this channel? They will have access to all of the message history.", "pKLw8O": "Are you sure you want to delete this event? Deleted events will be permanently removed from the timeline.", - "pXWclp": "Your participation request will be sent to the run channel.", - "pjt3qA": "New checklist", "pzTOmv": "Followers", "q/Qo8l": "Private playbooks are only available in Mattermost Enterprise", - "q/VD+s": "Set timers and put together a template for status updates so stakeholders are always up to date with developments.", "q0cpUe": "Add checklist", "q6f8x9": "Change since last update", + "qGlwfc": "Start run", "qyJtWy": "Show less", "rDvvQs": "{completed, number} / {total, number} done", "rMhrJH": "Please add a title for your metric.", "rX08cW": "Date must be in the future.", "rbrahO": "Close", - "recCg9": "Updates", "ru+JCk": "Average value", "ruJGqS": "Playbook Access", "ryrP8K": "Manage permission for who can view, modify, and run this playbook.", "rzbYbE": "Target", + "s+rSpl": "{icon} Integer", "s3jjqi": "{num_actions, plural, =0 {no actions} one {# action} other {# actions}}", "sDKojV": "Archive playbook", "sGJpuF": "Add a description…", @@ -502,20 +493,18 @@ "tVPYMu": "Playbook Admin", "tbjmvS": "A metric with the same name already exists. Please add a unique name for each metric.", "twieZh": "Go to run overview", - "tzMNF3": "Status", "u4L4yd": "You have unsaved changes", "u4MwUB": "Save your playbook run history", - "u6Fyic": "Your request has been sent to the run channel.", "uT4ebt": "e.g., Resource count, Customers affected", "udrLSP": "Use metrics to understand patterns and progress across runs, and track performance.", "uhu5aG": "Public", + "unwVil": "The join channel request was unsuccessful.", "uny3Zy": "Playbooks", "usa8vQ": "Send a welcome message", "v1DNMW": "Retrospective published by {name}", "v1SpKO": "Role changes", "v5/Cox": "Duplicate checklist", "vDvWJ6": "Try request update with a free trial", - "vJ2SaW": "Automate aspects of your playbook, such as sending a welcome message, inviting key members, and creating an update channel.", "vL4++D": "Track progress and ownership", "vNiZXF": "There are no runs in progress at the moment. Run a playbook to start orchestrating workflows for your team and tools.", "vSMfYU": "Run info", @@ -523,10 +512,13 @@ "viXE32": "Private", "vjzpnC": "There are no playbooks matching those filters.", "vndQuC": "Slash Command Executed", + "vqmRBs": "Confirm restart run", "w0muFd": "Send outgoing webhook (One per line)", + "wBZz47": "You've left the run.", "wEQDC6": "Edit", + "wGp7l3": "{icon} Dollars", "wL7VAE": "Actions", - "wX3k9U": "Untitled playbook", + "wRM2AO": "The update request was unsuccessful.", "wZ83YL": "Not right now", "waVyVY": "Participants currently active", "wbdGb5": "Assign, check off, or skip tasks to ensure the team is clear on how to move toward the finish line together.", @@ -540,6 +532,7 @@ "xEQYo5": "Configure custom metrics to fill out with the retrospective report.", "xHNF7i": "Run Actions", "xVyHgP": "Start a test run", + "xfnuXm": "Participate", "xmcVZ0": "Search", "xvBDOH": "Are you sure you want to archive the playbook {title}?", "y7o4Rn": "Are you sure you want to delete?", diff --git a/webapp/i18n/en_AU.json b/webapp/i18n/en_AU.json index 2074976596..9f7d11d9ac 100644 --- a/webapp/i18n/en_AU.json +++ b/webapp/i18n/en_AU.json @@ -600,5 +600,97 @@ "GDCpPr": "Recent status update", "+qDKgW": "View all updates", "kEMvwX": "There are no runs matching those filters.", - "GXjP8g": "All the runs that you can access will show here" + "GXjP8g": "All the runs that you can access will show here", + "ocYb9S": "Key Metrics", + "nc8QpJ": "Recent Activity", + "m/KtHt": "You have insufficient permissions to change the owner", + "lr1CUA": "Browse Playbooks", + "Ul0aFX": "Import Playbook", + "RnOiCg": "It was not possible to {isFollowing, select, true {unfollow} other {follow}} the run", + "LfhTNW": "Browse or create Playbooks and Runs", + "GVpA4Q": "Create New Playbook", + "CFysvS": "Create Playbook Dropdown", + "4mCpAv": "It was not possible to change the owner", + "/qDObA": "Browse Runs", + "UMFnWV": "View Retrospective", + "9xs0pp": "Add value", + "/+8SGX": "Showing {filteredNum} of {totalNum} events", + "jboo9u": "Request update", + "Xx0WZV": "Send message", + "VpQKQE": "{displayName} is not a participant of the run. Would you like to make them a participant? They will have access to all of the message history in the run channel.", + "UePrSL": "{num} {num, plural, one {Participant} other {Participants}}", + "RCT0Px": "Add {displayName} to Channel", + "P9PKvb": "A message was sent to the run channel.", + "NGqzDU": "Confirm request update", + "JvEwg/": "It was not possible to request an update", + "Jli9m7": "A message will be sent to the run channel, requesting an update.", + "KeO51o": "Channel", + "zW/5AB": "Professional feature This is a paid feature, available with a free 30-day trial", + "vDvWJ6": "Try request update with a free trial", + "u6Fyic": "Your request has been sent to the run channel.", + "pzTOmv": "Followers", + "pXWclp": "Your participation request will be sent to the run channel.", + "pFK6bJ": "View all", + "lKeJ+i": "There's no summary", + "ch4Vs1": "Request updates for playbook runs in a single click and get notified directly when an update is posted. Start a free 30-day trial to try it out.", + "U8u4uF": "Get involved", + "P6NEL/": "Command", + "PdRg+3": "View all", + "Nf9oAA": "You're about to join this run.", + "J2NmIY": "Confirm get involved", + "5PpBsd": "Your request wasn't successful.", + "4Iqlfe": "You've joined this run.", + "1fXVVz": "Due date:", + "1GOpgL": "Assignee:", + "wGp7l3": "{icon} Dollars", + "s+rSpl": "{icon} Integer", + "qp5G0Z": "Upgrade required for access to retrospective features.", + "ojQue/": "{icon} Duration (in dd:hh:mm)", + "mNgqXf": "To unlock this feature:", + "j2VYGA": "View all playbooks", + "SMrXWc": "Favourites", + "PWmZrW": "View all runs", + "PW+sL4": "N/A", + "KzHQCQ": "There are no finished runs matching those filters.", + "5HXkY/": "Type: {typeTitle}", + "3zF589": "Reset to all {filterName}", + "xfnuXm": "Participate", + "wRM2AO": "The update request was unsuccessful.", + "wBZz47": "You've left the run.", + "mttASm": "Leave and unfollow run", + "lpWBJE": "Confirm leave and unfollow", + "hnYSP3": "When you leave and unfollow a run, it's removed from the left-hand sidebar. You can find it again by viewing all runs.", + "gfUBRi": "Assign a new owner before you leave the run.", + "ePhhuK": "Your request was sent to the run channel.", + "b+DwLA": "Request to participate in this run.", + "XS4umx": "{name} snoozed a status update", + "SK5APX": "It wasn't possible to leave the run.", + "PoX2HN": "Send request", + "OfN7IN": "An request will be sent to the run channel for a status update.", + "Mjq//Y": "Unfavourite", + "Gwmqz5": "Request an update", + "CV1ddt": "Participate in the run", + "B9z0uZ": "Your request to join the run was unsuccessful.", + "AhY0vJ": "Leave and unfollow", + "AH+V3r": "Become a participant of the run.", + "5Hzwqs": "Favourite", + "+6DCr9": "As a participant, you can post status updates, assign and complete tasks as well as perform retrospectives.", + "iEtImk": "When you leave{isFollowing, select, true { and unfollow a run} other { a run}}, it's removed from the left-hand sidebar. You can find it again by viewing all runs.", + "fnihsY": "Leave", + "egUE/K": "Broadcast to selected channels", + "cnfVhV": "Leave {isFollowing, select, true { and unfollow } other {}}run", + "Xm0L7N": "When a status update is posted, or a retrospective is published", + "Suyx6A": "The playbook import has failed. Please check that JSON is valid and try again.", + "QegBKq": "Join playbook", + "Q4sutg": "Confirm leave{isFollowing, select, true { and unfollow} other {}}", + "P6PLpi": "Join", + "FgydNe": "View", + "qGlwfc": "Start run", + "vqmRBs": "Confirm restart run", + "k5EChD": "Are you sure you want to restart the run?", + "j2FnDV": "A channel will be created with this name", + "iQhFxR": "Last used", + "Zg0obP": "Restart run", + "KjNfA8": "Invalid time duration", + "03oqA2": "Active Runs" } diff --git a/webapp/i18n/hr.json b/webapp/i18n/hr.json index a4f113da7a..1a39807ab3 100644 --- a/webapp/i18n/hr.json +++ b/webapp/i18n/hr.json @@ -338,7 +338,7 @@ "wO6NOM": "Stvarno želiš obnoviti ovaj zadatak? Ovaj zadatak će biti dodan u ovo pokretanje", "twieZh": "Idi na pregled izvođenja", "scYyVv": "Želitš li ispuniti izvještaj o retrospektivi?", - "ryrP8K": "Upravljaj dozvolama osoba koje mogu pregledavati, mijenjati i izvoditi ovaj priručnik.", + "ryrP8K": "Upravljaj dozvolama osoba koje mogu vidjeti, mijenjati i izvoditi ovaj priručnik.", "qp3Fk4": "Priručnik predstavlja tijek rada koji bi tvoji timovi i alati trebali slijediti, uključujući sve popise zadataka, radnje, predloške i retrospektive.", "q0cpUe": "Dodaj popis", "oS0w4E": "Standardni timer aktualiziranja", @@ -347,7 +347,7 @@ "k9q07e": "Šalji aktualiziranje na druge kanale", "0tznw6": "Pretvori u privatni priručnik", "0Vvpht": "Postavi člana priručnika", - "wylJpv": "Svatko u timu {team} može pristupiti ovom priručniku.", + "wylJpv": "Svatko u timu {team} može vidjeti ovaj priručnik.", "vaYTD+": "Postoji {outstanding, plural, =1 {# nedovršeni zadatak} few {# nedovršena zadatka} other {# nedovršenih zadataka}}. Stvarno želiš završiti izvođenje?", "pK6+CW": "@{displayName} nije član kanala [{runName}]({overviewUrl}). Želiš li ih dodati ovom kanalu? Imat će pristup cijeloj povijesti poruka.", "o+ZEL3": "Objavljeno {timestamp}", @@ -362,7 +362,7 @@ "nqVby7": "{numTasksChecked, number} od {numTasks, number} {numTasks, plural, =1 {zadatka} few {zadatka} other {zadataka}} provjereno", "kDcpd/": "{numKeywords, plural, few {# ključne riječi} other {# ključnih riječi}}", "MFpAtm": "{numTasks, number} {numTasks, plural, one {zadatak} few {zadatka} other {zadataka}}", - "DtCplA": "{numParticipants, plural, =1 {# sudionik} few {# sudionika} other {# sudionika}}", + "DtCplA": "{numParticipants, plural, =1 {# sudionik} other {# sudionika}}", "5j6GD/": "{numParticipants, plural, =0 {nema sudionika} =1 {# sudionik} few {# sudionika} other {# sudionika}}", "2QkJ4s": "Spremi važne poruke za dobivanje potpune slike koja optimira tok retrospektiva.", "tVPYMu": "Administrator priručnika", @@ -408,7 +408,7 @@ "4aupaG": "Priručnik {title} je uspješno obnovljen.", "vQqT/8": "", "9m0I/B": "Obavještavaj sudionike o aktualnom stanju", - "8n24G2": "Pogledaj pojedinosti izvođenja u bočnoj ploči", + "8n24G2": "Prikaži pojedinosti izvođenja u bočnoj ploči", "R5Zh+l": "Ovo omogućuje isprobati primjer priručnika prije ulaganja vremena za izradu vlastitog.", "lgZf0l": "Počni raditi s priručnicima", "q/Qo8l": "Privatni priručnici dostupni su samo u Mattermost Enterpriseu", @@ -593,10 +593,104 @@ "ZJS10z": "Još nije objavljeno nijedno aktualiziranje", "Q15rLN": "Zatraži aktualiziranje …", "GDCpPr": "Nedavno aktualiziranje stanja", - "+qDKgW": "Pogledaj sva aktualiziranja", - "opn6uf": "Pogledaj kronologiju", + "+qDKgW": "Prikaži sva aktualiziranja", + "opn6uf": "Prikaži kronologiju", "lbr3Lq": "Kopiraj poveznicu", - "bf5rs0": "Pogledaj informacije", + "bf5rs0": "Prikaži informacije", "kEMvwX": "Nema izvođenja koja odgovaraju tim filtrima.", - "GXjP8g": "Sva izvođenja kojima možeš pristupiti prikazat će se ovdje" + "GXjP8g": "Sva izvođenja kojima možeš pristupiti prikazat će se ovdje", + "ocYb9S": "Ključni mjerni podaci", + "nc8QpJ": "Nedavne aktivnosti", + "m/KtHt": "Nemaš dozvole za mijenjanje vlasnika", + "RnOiCg": "Nije bilo moguće {isFollowing, select, true {ne pratiti} other {pratiti}} izvođenje", + "4mCpAv": "Nije biilo moguće prominijeti vlasnika", + "CFysvS": "Stvori padajući izbornik priručnika", + "VpQKQE": "{displayName} nije sudionik izvođenja. Želiš li ih učiniti sudionikom? Imat će pristup cjelokupnoj povijesti poruka u kanalu izvođenja.", + "Jli9m7": "Poruka će se poslati kanalu za izvođenje, zahtjevajući slanje aktualiziranja.", + "lr1CUA": "Pregledaj priručnike", + "jboo9u": "Zatraži aktualiziranje", + "Xx0WZV": "Pošalji poruku", + "Ul0aFX": "Uvezi priručnik", + "UePrSL": "{num} {num, plural, one {sudionik} other {sudionika}}", + "UMFnWV": "Prikaži retrospektivu", + "RCT0Px": "Dodaj {displayName} kanalu", + "P9PKvb": "Kanalu izvođenja je poslana poruka.", + "NGqzDU": "Potvrdi zahtjev za aktualiziranje", + "LfhTNW": "Pretraži ili stvori priručnike i izvođenja", + "KeO51o": "Kanal", + "JvEwg/": "Nije bilo moguće zatražiti aktualiziranje", + "GVpA4Q": "Stvori novi priručnik", + "9xs0pp": "Dodaj vrijednost …", + "/qDObA": "Pretraži izvođenja", + "/+8SGX": "Prikaz {filteredNum} od {totalNum} događaja", + "ch4Vs1": "Zatraži aktualiziranje za izvođenja priručnika jednim pritiskom miša i primaj obavijesti kad se objavi aktualiziranje. Isprobaj funkciju pokretanjem besplatne probne verzije od 30 dana.", + "zW/5AB": "Profesionalna značajka Ovo je značajka koja se naplaćuje, dostupna s besplatnim probnim razdobljem od 30 dana", + "vDvWJ6": "Pokušaj zatražiti aktualiziranje s besplatnom probom", + "pFK6bJ": "Prikaži sve", + "lKeJ+i": "Nema sažetka", + "hIWK05": "Kanalu izvođenja će se poslati poruka sa zahtjevom da te se doda kao sudionika.", + "U8u4uF": "Uključi se", + "J2NmIY": "Potvrdi uključivanje", + "MD6oav": "Nije bilo moguće zatražiti uključivanje", + "3O8M5M": "Poslan je zahtjev za izvođenje kanala.", + "u6Fyic": "Tvoj zahtjev je poslan na kanal izvođenja.", + "pzTOmv": "Pratitelji", + "pXWclp": "Tvoj zahtjev za sudjelovanjem bit će poslan na kanal izvođenja.", + "PdRg+3": "Prikaži sve …", + "P6NEL/": "Naredba …", + "Nf9oAA": "Pridružit ćeš se ovom izvođenju.", + "5PpBsd": "Tvoj zahtjev nije bio uspješan.", + "4Iqlfe": "Pridružio/la si se ovom izvođenju.", + "1fXVVz": "Datum roka …", + "1GOpgL": "Zadužena osoba …", + "xfnuXm": "Sudjeluj", + "wRM2AO": "Zahtjev za aktualiziranjem nije uspio.", + "wGp7l3": "{icon} Dolari", + "s+rSpl": "{icon} Cijeli broj", + "ojQue/": "{icon} Trajanje (dd:hh:mm)", + "mNgqXf": "Za otključavanje ove funkcije:", + "b+DwLA": "Zatraži sudjelovanje u ovom izvođenju.", + "SMrXWc": "Favoriti", + "PoX2HN": "Pošalji zahtjev", + "PWmZrW": "Prikaži sva izvođenja", + "PW+sL4": "--", + "Gwmqz5": "Zatraži aktualiziranje", + "CV1ddt": "Sudjeluj u izvođenju", + "B9z0uZ": "Tvoj zahtjev za pridruđivanje izvođenju nije uspio.", + "AH+V3r": "Postani sudionik izvođenja.", + "5HXkY/": "Vrsta: {typeTitle}", + "CUhlqp": "slika proizvoda vježbi", + "j2VYGA": "Prikaži sve priručnike", + "qp5G0Z": "Pristup funkcijama retrospektive zahtijeva nadogradnju.", + "ePhhuK": "Tvoj zahtjev je poslan kanalu izvođenja.", + "OfN7IN": "Kanalu izvođenja će se poslati zahtjev za aktualiziranjem stanja.", + "KzHQCQ": "Nema završenih izvođenja koja odgovaraju tim filtrima.", + "3zF589": "Resetetiraj na sve {filterName}", + "+6DCr9": "Kao sudionik, možeš objavljivati aktualiziranja stanja, dodjeliti i dovršiti zadatke i izvoditi retrospektive.", + "wBZz47": "Napustio/la si izvođenje.", + "mttASm": "Napusti i prestani pratiti izvođenje", + "lpWBJE": "Potvrdi napuštanje i prestanak praćenja", + "hnYSP3": "Kad napustiš i prestaneš pratiti izvođenje, izvođenje se uklanja iz lijeve bočne trake. Izvođenje možeš ponovo pronaći pregledom svih izvođenja.", + "gfUBRi": "Odredi novog vlasnika prije napuštanja izvođenja.", + "XS4umx": "{name} je propustio jedno aktualiziranje stanja", + "SK5APX": "Nije bilo moguće napustiti izvođenje.", + "Mjq//Y": "Ukloni iz favorita", + "AhY0vJ": "Napusti i nemoj više pratiti", + "5Hzwqs": "Favorit", + "iEtImk": "Kada napustiš{isFollowing, select, true { i prekineš pratiti izvođenje} other { izvođenje}}, ono se uklanja iz lijeve bočne trake. Možeš ga ponovo pronaći prikazom svih izvođenja.", + "fnihsY": "Napusti", + "cnfVhV": "Napusti {isFollowing, select, true { i prekini pratiti } other {}}izvođenje", + "Suyx6A": "Uvoz priručnika nije uspio. Provjeri ispravnost JSON-a i pokušaj ponovo.", + "QegBKq": "Pridruži se priručniku", + "Q4sutg": "Potvrdi napuštanje{isFollowing, select, true { i prekid praćenja} other {}}", + "P6PLpi": "Pridruži se", + "FgydNe": "Prikaži", + "qGlwfc": "Pokreni izvođenje", + "j2FnDV": "Stvorit će se kanal s tim imenom", + "vqmRBs": "Potvrdi ponovno pokretanje izvođenja", + "k5EChD": "Stvarno želiš ponovo pokrenuti izvođenje?", + "iQhFxR": "Zadnje korišteno", + "Zg0obP": "Ponovo pokreni izvođenje", + "KjNfA8": "Neispravno vrijeme trajanja", + "03oqA2": "Aktivna izvođenja" } diff --git a/webapp/i18n/hu.json b/webapp/i18n/hu.json index b6832adf6d..c928384bb5 100644 --- a/webapp/i18n/hu.json +++ b/webapp/i18n/hu.json @@ -531,7 +531,7 @@ "lyXljU": "Feladat duplikálása", "371AC3": "Futás összefoglalójának frissítése", "TTIQ6E": "Jelöljön ki határidőket a feladatokhoz, hogy a kijelöltek priorizálni és elvégezni tudják a feladatokat.", - "aEhjYg": "Körvonal", + "aEhjYg": "Áttekintés", "oBeKB4": "Határidő {date}", "oAJsne": "Nyilvános forgatókönyv", "mm5vL8": "Csak meghívott tagok", @@ -603,5 +603,98 @@ "+qDKgW": "Összes frissítés megtekintése", "kkw4kS": "Ez a frissítés közzé lesz téve {hasChannels, select, true {{broadcastChannelCount, plural, =1 {egy csatornában} other {{broadcastChannelCount, number} csatornában}}} other {}}{hasFollowersAndChannels, select, true { és } other {}}{hasFollowers, select, true {{followersChannelCount, plural, =1 {egy közvetlen üzenetben} other {{followersChannelCount, number} közvetlen üzenetben}}} other {}}.", "kEMvwX": "Nincs a szűrésnek megfelelő futás.", - "GXjP8g": "Minden futás, amelyhez hozzáférhet, itt fog megjelenni" + "GXjP8g": "Minden futás, amelyhez hozzáférhet, itt fog megjelenni", + "m/KtHt": "Nincs jogosultsága a tulajdonos megváltoztatásához", + "nc8QpJ": "Legutóbbi tevékenységek", + "ocYb9S": "Kulcs mérőszámok", + "lr1CUA": "Forgatókönyvek áttekintése", + "Ul0aFX": "Forgatókönyv importálása", + "RnOiCg": "Nem volt lehetséges, hogy {isFollowing, select, true {ne kövesse} other {kövesse}} a futást", + "CFysvS": "Forgatókönyv legördülő létrehozása", + "/qDObA": "Futások áttekintése", + "LfhTNW": "Forgatókönyvek és futások áttekintése és létrehozása", + "GVpA4Q": "Új forgatókönyv létrehozása", + "4mCpAv": "Nem volt lehetséges a tulajdonos megváltoztatása", + "/+8SGX": "Megjelenítve {filteredNum} / {totalNum} eseményt", + "VpQKQE": "{displayName} nem résztvevője a futásnak. Szeretné őket is résztvevővé tenni? Hozzáférésük lesz a futó csatorna összes üzenet előzményéhez.", + "jboo9u": "Frissítés kérése", + "Xx0WZV": "Üzenet küldése", + "UePrSL": "{num} résztvevő", + "UMFnWV": "Visszatekintő megtekintése", + "RCT0Px": "{displayName} hozzáadása a Csatornához", + "P9PKvb": "Üzenet lett küldve a futó csatornára.", + "NGqzDU": "Frissítés kérésének jóváhagyása", + "JvEwg/": "Nem volt lehetséges egy frissítést kérni", + "Jli9m7": "A rendszer üzenetet küld a futó csatornának, amelyben kéri, hogy tegyen közzé egy frissítést.", + "9xs0pp": "Érték hozzáadása...", + "KeO51o": "Csatorna", + "lKeJ+i": "Nincsen összefoglaló", + "pFK6bJ": "Összes megtekintése", + "u6Fyic": "A kérését elküldtük a futás csatornájára.", + "pzTOmv": "Követők", + "P6NEL/": "Parancs...", + "1GOpgL": "Felelős...", + "1fXVVz": "Határidő...", + "J2NmIY": "Részvétel megerősítése", + "U8u4uF": "Vegyen részt", + "zW/5AB": "Professional funkció Ez egy fizetős funkció, amely 30 napos ingyenes próbaverzióval érhető el.", + "ch4Vs1": "Egyetlen kattintással kérhet frissítéseket a forgatókönyv futásokhoz, és kapjon közvetlen értesítést, ha frissítés érkezik. Indítson ingyenes, 30 napos próbaverziót a kipróbáláshoz.", + "pXWclp": "A résztvevői kérése el lett küldve a futás csatornájának.", + "vDvWJ6": "Próbálja ki a futás frissítés kérést egy ingyenes próbával", + "PdRg+3": "Összes megtekintése...", + "Nf9oAA": "Ön csatlakozni készül ehhez a futáshoz.", + "5PpBsd": "A kérése nem volt sikeres.", + "4Iqlfe": "Csatlakozott ehhez a futáshoz.", + "SMrXWc": "Kedvencek", + "PW+sL4": "N/A", + "KzHQCQ": "Nem található ezeknek a szűrőknek megfelelő befejeződött futás.", + "5HXkY/": "Típus: {typeTitle}", + "AH+V3r": "Legyen a futás részvevője.", + "b+DwLA": "Kérés a futásban való részvételre.", + "qp5G0Z": "A visszatekintő funkciók eléréséhez előfizetés váltása szükséges.", + "ojQue/": "{icon} Időtartam (dd:hh:mm formában)", + "wGp7l3": "{icon} Dollár", + "wRM2AO": "A frissítés kérése nem sikerült.", + "xfnuXm": "Részvétel", + "s+rSpl": "{icon} Szám", + "mNgqXf": "Ahhoz hogy feloldja ezt a szolgáltatást:", + "j2VYGA": "Összes forgatókönyv megjelenítése", + "ePhhuK": "A kérését elküldtük a futás csatornájára.", + "PoX2HN": "Kérés küldése", + "PWmZrW": "Összes futás megjelenítése", + "OfN7IN": "A futás csatornájára állapotfrissítési kérés lesz elküldve.", + "Gwmqz5": "Frissítés kérése", + "CV1ddt": "Részvétel a futásban", + "CUhlqp": "bemutató körút tipp termékkép", + "B9z0uZ": "A futáshoz való csatlakozási kérelme sikertelen volt.", + "+6DCr9": "Résztvevőként állapotfrissítéseket tehet közzé, feladatokat oszthat ki és végezhet el, valamint visszatekintéseket végezhet.", + "3zF589": "Visszaállítás a {filterName} szűrőre", + "gfUBRi": "Rendeljen hozzá másvalakit mielőtt kilép a futásból.", + "wBZz47": "Ön kilépett a futásból.", + "fnihsY": "Kilépés", + "a1vQ5Q": "Kilépés jóváhagyása", + "SK5APX": "Nem volt lehetséges a futásból kilépni.", + "N9CTUJ": "Kilépés a futásból", + "F/HKIy": "Biztosan ki szeretne lépni a futásból?", + "Mjq//Y": "Kedvenc visszavonása", + "5Hzwqs": "Kedvenc", + "XS4umx": "{name} elaltatott egy állapot frissítést", + "QegBKq": "Csatlakozás a forgatókönyvhöz", + "Xm0L7N": "Amikor egy állapotfrissítés, vagy egy visszatekintő közzé lesz téve", + "Suyx6A": "A forgatókönyv importálása nem sikerült. Kérjük, ellenőrizze, hogy a JSON helyes-e, és próbálja meg újra.", + "cnfVhV": "Kilépés a futásból{isFollowing, select, true { és követés kikapcsolása} other {}}", + "egUE/K": "Közzététel a kiválasztott csatornákban", + "AhY0vJ": "Kilépés és követés kikapcsolása", + "Q4sutg": "Kilépés jóváhagyása{isFollowing, select, true { és követés kikapcsolása} other {}}", + "P6PLpi": "Csatlakozás", + "FgydNe": "Megtekintés", + "iEtImk": "Amikor kilép egy futásból{isFollowing, select, true { és kikapcsolja a követést}}, az el lesz távolítva a bal oldali oldalsávból. Újra megtalálhatja, ha megtekinti az összes futást.", + "j2FnDV": "Egy csatorna lesz létrehozva ezzel a névvel", + "qGlwfc": "Futás indítása", + "iQhFxR": "Legutóbb használt", + "03oqA2": "Aktív futások", + "vqmRBs": "Futás újraindításán", + "Zg0obP": "Futás újraindítása", + "KjNfA8": "Érvénytelen idő intervallum", + "k5EChD": "Biztos benne, hogy szeretné újraindítani a futást?" } diff --git a/webapp/i18n/ja.json b/webapp/i18n/ja.json index fe0d1bd8a8..2a47ffac96 100644 --- a/webapp/i18n/ja.json +++ b/webapp/i18n/ja.json @@ -192,7 +192,7 @@ "d8KvXJ": "あなたのトライアルライセンスは{expiryDate}で終了します。カスタマーポータルからいつでもライセンスを購入することができます。", "c6LNcW": "タスクを削除", "bE1Cro": "自分の実行のみ", - "b3TdyZ": "トライアルを開始する をクリックすると、Mattermost Software Evaluation AgreementPrivacy Policy、および製品メールの受信に同意したことになります。", + "b3TdyZ": "トライアルを開始する をクリックすると、Mattermost Software Evaluation Agreementプライバシーポリシーに同意したことになり、製品メールを受信するようになります。", "b/QBNs": "更新予定", "aYIUar": "ありがとうございます!", "aWpBzj": "さらに表示", @@ -255,7 +255,7 @@ "J1G4S4": "まだプレイブックが作成されていません。", "IwY/wg": "すべてのプロセスのためのプレイブック", "Ietscn": "タスク完了", - "I90sbW": "今すぐ", + "I90sbW": "たった今", "I2zEie": "レトロスペクティブレポートを使って、成功を祝い、失敗から学びましょう。プロセスのレビュー、ステークホルダーとのエンゲージメント向上、監査などの目的でタイムラインのイベントをフィルタリングできます。", "Hzwzgs": "{oneChannel, plural, one {チャンネル} other {チャンネル}}に更新をブロードキャストする", "HAlOn1": "名前", @@ -607,5 +607,82 @@ "nc8QpJ": "最近の活動", "m/KtHt": "オーナーを変更する権限がありません", "RnOiCg": "実行{isFollowing, select, true {のフォロー解除が} other {をフォロー}}できませんでした", - "4mCpAv": "オーナーを変更できませんでした" + "4mCpAv": "オーナーを変更できませんでした", + "lr1CUA": "プレイブックの閲覧", + "Ul0aFX": "プレイブックのインポート", + "LfhTNW": "プレイブックと実行の閲覧と作成", + "GVpA4Q": "新しいプレイブックを作成", + "CFysvS": "プレイブックドロップダウンの作成", + "/qDObA": "実行中を表示", + "/+8SGX": "{filteredNum} / {totalNum} イベントを表示中", + "zW/5AB": "Professional版の機能 これは30日間の無料トライアルで利用可能になる有償版の機能です", + "vDvWJ6": "無料トライアルで更新要求を試す", + "u6Fyic": "あなたの要求が実行チャンネルに送信されました。", + "pzTOmv": "フォロワー", + "pXWclp": "あなたの参加要求が実行チャンネルに送信されました。", + "pFK6bJ": "すべて見る", + "lKeJ+i": "概要はありません", + "jboo9u": "更新を要求", + "ch4Vs1": "ワンクリックで実行中のプレイブックに更新を要求し、更新が投稿されたときに直接通知されるようになります。この機能を試すには30日間の無料トライアルを開始してください。", + "Xx0WZV": "メッセージを送信", + "VpQKQE": "{displayName}は実行の参加者ではありません。彼らを参加者にしますか? 彼らはこのチャンネルのすべてのメッセージ履歴にアクセスできるようになります。", + "UePrSL": "{num} {num, plural, one {参加済} other {参加済}}", + "UMFnWV": "レトロスペクティブを見る", + "U8u4uF": "参加する", + "RCT0Px": "チャンネルに{displayName}を追加する", + "PdRg+3": "すべて見る...", + "P9PKvb": "メッセージが実行チャンネルに送信されました。", + "P6NEL/": "コマンド...", + "Nf9oAA": "あなたはこの実行に参加することになります。", + "NGqzDU": "更新を要求する", + "KeO51o": "チャンネル", + "JvEwg/": "更新を要求できませんでした", + "Jli9m7": "メッセージが実行チャンネルに送信され、更新を投稿するよう要求します。", + "J2NmIY": "参加する", + "9xs0pp": "値を追加...", + "5PpBsd": "リクエストは成功しませんでした。", + "4Iqlfe": "この実行に参加済みです。", + "1fXVVz": "期限...", + "1GOpgL": "担当者...", + "xfnuXm": "参加", + "wRM2AO": "更新リクエストが失敗しました。", + "wGp7l3": "{icon} ドル", + "s+rSpl": "{icon} 数値", + "qp5G0Z": "レトロスペクティブ機能にアクセスするにはアップグレードが必要です。", + "ojQue/": "{icon} 期間 (in dd:hh:mm)", + "mNgqXf": "この機能をアンロックするには:", + "j2VYGA": "すべてのプレイブックを見る", + "ePhhuK": "あなたのリクエストが実行チャンネルに送信されました。", + "b+DwLA": "実行への参加をリクエストする。", + "SMrXWc": "お気に入り", + "PoX2HN": "リクエスト送信", + "PWmZrW": "すべての実行を見る", + "PW+sL4": "N/A", + "OfN7IN": "ステータス更新リクエストが実行チャンネルに送信されます。", + "KzHQCQ": "フィルターに合致する完了済みの実行がありません。", + "Gwmqz5": "更新をリクエスト", + "CV1ddt": "実行に参加", + "CUhlqp": "チュートリアルツアー製品画像", + "B9z0uZ": "実行への参加リクエストが失敗しました。", + "AH+V3r": "実行の参加者になります。", + "5HXkY/": "タイプ: {typeTitle}", + "3zF589": "{filterName} を全てリセット", + "+6DCr9": "参加者として、ステータス更新の投稿、タスクの割り当てと完了、レトロスペクティブの実行を行えるようになります。", + "cnfVhV": "実行を脱退{isFollowing, select, true {およびフォロー解除} other {}}する", + "SK5APX": "実行から脱退できませんでした。", + "Q4sutg": "脱退{isFollowing, select, true {とフォロー解除} other {}} する", + "wBZz47": "実行から脱退しました。", + "iEtImk": "実行を脱退{isFollowing, select, true {およびフォロー解除} other {}}すると、左サイドバーから削除されます。再度その実行を見つけるには、全ての実行から見つけてください。", + "fnihsY": "脱退", + "XS4umx": "{name}がステータス更新をスヌーズしました", + "Suyx6A": "プレイブックをインポートできませんでした。JSONが正しいことを確認し、再度実行してください。", + "QegBKq": "プレイブックに参加する", + "P6PLpi": "参加", + "Mjq//Y": "お気に入り解除", + "FgydNe": "閲覧", + "5Hzwqs": "お気に入り", + "AhY0vJ": "脱退とフォロー解除", + "gfUBRi": "実行を脱退する前に新しいオーナーをアサインしてください。", + "qGlwfc": "実行開始", + "j2FnDV": "この名前でチャンネルが作成されます" } diff --git a/webapp/i18n/nl.json b/webapp/i18n/nl.json index e1ec07f406..6e0cae408e 100644 --- a/webapp/i18n/nl.json +++ b/webapp/i18n/nl.json @@ -602,5 +602,101 @@ "Q15rLN": "Vraag een update...", "GXjP8g": "Alle uitvoeringen waartoe je toegang hebt worden hier getoond", "GDCpPr": "Recente status update", - "+qDKgW": "Bekijk alle updates" + "+qDKgW": "Bekijk alle updates", + "ocYb9S": "Belangrijkste meetwaarden", + "nc8QpJ": "Recente activiteit", + "m/KtHt": "Je hebt geen rechten om de eigenaar te wijzigen", + "RnOiCg": "Het was niet mogelijk om de uitvoering {isFollowing, select, true {niet langer te volgen} other {te volgen}}", + "4mCpAv": "Het was niet mogelijk om de eigenaar te wijzigen", + "GVpA4Q": "Nieuw Playbook maken", + "CFysvS": "Maak Playbook keuzemenu", + "/qDObA": "Bladeren door uitvoeringen", + "KeO51o": "Kanaal", + "JvEwg/": "Het was niet mogelijk om een update te vragen", + "Jli9m7": "Er zal een bericht naar het kanaal van de uitvoering worden gestuurd met het verzoek een update te posten.", + "J2NmIY": "Bevestig betrokkenheid", + "9xs0pp": "Waarde toevoegen...", + "3O8M5M": "Verzoek is verzonden naar het kanaal van de uitvoering.", + "1fXVVz": "Vervaldatum...", + "1GOpgL": "Aangeduide...", + "/+8SGX": "Weergave van {filteredNum} van {totalNum} gebeurtenissen", + "Nf9oAA": "Je staat op het punt om lid te worden van deze uitvoering.", + "NGqzDU": "Updateverzoek bevestingen", + "LfhTNW": "Playbooks en uitvoeringen doorbladeren of aanmaken", + "5PpBsd": "Jouw verzoek was niet succesvol.", + "4Iqlfe": "Je sloot aan bij deze uitvoering.", + "wGp7l3": "{icon} Dollars", + "s+rSpl": "{icon} Geheel getal", + "qp5G0Z": "Upgrade is vereist voor toegang tot terugblikfuncties.", + "ojQue/": "{icon} Duur (in dd:hh:mm)", + "mNgqXf": "Om deze functie te ontgrendelen:", + "j2VYGA": "Bekijk alle Playbooks", + "PWmZrW": "Bekijk alle uitvoeringen", + "PW+sL4": "nvt", + "KzHQCQ": "Er zijn geen afgewerkte uitvoeringen die aan die filters voldoen.", + "CUhlqp": "handleiding tour tip product afbeelding", + "5HXkY/": "Type: {typeTitle}", + "3zF589": "Reset naar alle {filterName}", + "zW/5AB": "Professional functie Dit is een betaalde functie, beschikbaar met een gratis 30-dagen proefversie", + "vDvWJ6": "Probeer updates verzoeken met een gratis proefversie", + "u6Fyic": "Jouw verzoek is verzonden naar het kanaal van de uitvoering.", + "pzTOmv": "Volgers", + "pXWclp": "Jouw verzoek om deel te nemen zal naar het uitvoeringskanaal worden gestuurd.", + "pFK6bJ": "Alle bekijken", + "lr1CUA": "Playbooks doorbladeren", + "lKeJ+i": "Er is geen samenvatting", + "jboo9u": "Vraag een update", + "ch4Vs1": "Vraag met één klik updates aan voor playbook-uitvoeringen en krijg direct bericht als er een update is gepost. Begin een gratis proefperiode van 30 dagen om het uit te proberen.", + "Xx0WZV": "Bericht versturen", + "VpQKQE": "{displayName} is geen deelnemer van de uitvoering. Wilt je hen een deelnemer maken? Zij zullen toegang hebben tot de gehele berichtengeschiedenis in het uitvoeringskanaal.", + "Ul0aFX": "Playbook importeren", + "UePrSL": "{num} {num, plural, one {Deelnemer} other {Deelnemers}}", + "UMFnWV": "Terugblik bekijken", + "U8u4uF": "Wordt betrokken", + "SMrXWc": "Favorieten", + "RCT0Px": "Voeg @{displayName} toe aan het kanaal", + "PdRg+3": "Alle bekijken...", + "P9PKvb": "Een bericht werd naar het uitvoeringskanaal gestuurd.", + "P6NEL/": "Opdracht...", + "xfnuXm": "Deelnemen", + "wRM2AO": "De update aanvraag is mislukt.", + "ePhhuK": "Je verzoek is naar het uitvoeringskanaal gestuurd.", + "b+DwLA": "Verzoek om deel te nemen aan deze uitvoering.", + "PoX2HN": "Verzoek verzenden", + "OfN7IN": "Een statusupdate-verzoek zal naar het uitvoeringskanaal gestuurd worden.", + "Gwmqz5": "Om een update verzoeken", + "CV1ddt": "Aan de uitvoering deelnemen", + "B9z0uZ": "Jouw verzoek om deel te nemen aan de uitvoering was niet succesvol.", + "AH+V3r": "Neem deel aan de uitvoering.", + "+6DCr9": "Als deelnemer kan je statusupdates plaatsen, taken toewijzen en voltooien, en terugblikken uitvoeren.", + "wBZz47": "Je hebt de uitvoering verlaten.", + "gfUBRi": "Wijs een nieuwe eigenaar aan voordat je de uitvoering verlaat.", + "fnihsY": "Verlaten", + "a1vQ5Q": "Verlaten bevestigen", + "SK5APX": "Het was niet mogelijk om de uitvoering te verlaten.", + "N9CTUJ": "Uitvoering verlaten", + "F/HKIy": "Weet je zeker dat je de uitvoering wilt verlaten?", + "mttASm": "Verlaten en het niet langer volgen", + "lpWBJE": "Verlaten en het niet langer volgen bevestingen", + "hnYSP3": "Wanneer je een uitvoering verlaat en niet langer volgt, wordt deze verwijderd uit de linkerzijbalk. Je kan deze terugvinden door alle uitvoeringen te bekijken.", + "XS4umx": "{name} snoozed een status-update", + "5Hzwqs": "Markeren als favoriet", + "Mjq//Y": "Markeren als favoriet ongedaan maken", + "AhY0vJ": "Verlaten en niet langer volgen", + "Xm0L7N": "Wanneer een status update gepost wordt, of een terugblik gepubliceerd wordt", + "Suyx6A": "De playbook-import is mislukt. Controleer of JSON geldig is en probeer het opnieuw.", + "QegBKq": "Deelnemen aan Playbook", + "Q4sutg": "Bevestig verlaten{isFollowing, select, true { en niet langer volgen} other{}}", + "P6PLpi": "Deelnemen", + "FgydNe": "Bekijken", + "iEtImk": "Wanneer je {isFollowing, select, true { en een uitvoering niet langer volgt} other { een uitvoering}} verlaat, wordt deze verwijderd uit de linkerzijbalk. Je kan deze terugvinden door alle uitvoeringen te bekijken.", + "cnfVhV": "De uitvoering verlaten {isFollowing, select, true { en niet langer volgen } other {}}", + "vqmRBs": "Bevestig herstarten uitvoering", + "qGlwfc": "Uitvoering starten", + "k5EChD": "Weet je zeker dat je deze uitvoering wil herstarten?", + "j2FnDV": "Er zal een kanaal aangemaakt worden met deze naam", + "iQhFxR": "Laatst gebruikt", + "Zg0obP": "Uitvoering opnieuw starten", + "KjNfA8": "Ongeldige tijdsduur", + "03oqA2": "Actieve uitvoeringen" } diff --git a/webapp/i18n/pl.json b/webapp/i18n/pl.json index 3e6fb2ccb8..cfb1dc3818 100644 --- a/webapp/i18n/pl.json +++ b/webapp/i18n/pl.json @@ -602,5 +602,97 @@ "GDCpPr": "Ostatnia aktualizacja statusu", "+qDKgW": "Wyświetl wszystkie aktualizacje", "kEMvwX": "Nie ma żadnych przebiegów pasujących do tych filtrów.", - "GXjP8g": "Wszystkie dostępne przebiegi będą wyświetlane tutaj" + "GXjP8g": "Wszystkie dostępne przebiegi będą wyświetlane tutaj", + "ocYb9S": "Kluczowe Wskaźniki", + "nc8QpJ": "Ostatnia Aktywność", + "m/KtHt": "Nie masz uprawnień do zmiany właściciela", + "RnOiCg": "Nie można było {isFollowing, select, true {wyłaczyć obserwowanie} other {właczyć obserwowanie}} przebiegu", + "4mCpAv": "Nie można było zmienić właściciela", + "lr1CUA": "Przeglądaj Playbooki", + "jboo9u": "Wniosek o aktualizację", + "Xx0WZV": "Wyślij wiadomość", + "VpQKQE": "{displayName} nie jest uczestnikiem uruchomienia. Czy chciałbyś uczynić go uczestnikiem? Będą mieli dostęp do całej historii wiadomości na kanale uruchomienia.", + "Ul0aFX": "Import Playbooka", + "UePrSL": "{num} {num, plural, one {Uczestnik} other {Uczestników}}", + "UMFnWV": "Zobacz Retrospektywę", + "RCT0Px": "Dodaj {displayName} do Kanału", + "P9PKvb": "Na uruchomiony kanał została wysłana wiadomość.", + "NGqzDU": "Potwierdź prośbę o aktualizację", + "LfhTNW": "Przeglądanie lub tworzenie Playbooków i Uruchomień", + "JvEwg/": "Nie było możliwe wystąpić o aktualizację", + "Jli9m7": "Do uruchomionego kanału zostanie wysłana wiadomość z prośbą o zamieszczenie aktualizacji.", + "GVpA4Q": "Utwórz nowy Playbook", + "CFysvS": "Utwórz rozwijany Playbook", + "9xs0pp": "Dodaj wartość...", + "/qDObA": "Przeglądaj przebiegi", + "/+8SGX": "Wyświetlanie {filteredNum} z {totalNum} zdarzeń", + "KeO51o": "Kanał", + "zW/5AB": " Funkcja profesjonalna Jest to funkcja płatna, dostępna z bezpłatnym 30-dniowym okresem próbnym", + "xfnuXm": "Weź udział", + "wGp7l3": "{icon} Dolary", + "wBZz47": "Opuściłeś uruchomienie.", + "vDvWJ6": "Wypróbuj aktualizację za pomocą bezpłatnej wersji próbnej", + "u6Fyic": "Twoja prośba została wysłana do kanału uruchomienia.", + "s+rSpl": "{icon} Integer", + "qp5G0Z": "Dostęp do funkcji retrospektywnych wymaga aktualizacji.", + "pzTOmv": "Obserwujący", + "pFK6bJ": "Zobacz wszystkie", + "ojQue/": "{icon} Czas trwania (w dd:hh:mm)", + "mNgqXf": "Aby odblokować tę funkcję:", + "lKeJ+i": "Brak podsumowania", + "j2VYGA": "Pokaż wszystkie playbooki", + "gfUBRi": "Przydziel nowego właściciela przed opuszczeniem uruchomienia.", + "fnihsY": "Opuść", + "ePhhuK": "Twoja prośba została wysłana do kanału uruchomienia.", + "ch4Vs1": "Zażądaj aktualizacji dla uruchomień playbooków jednym kliknięciem i otrzymaj powiadomienie bezpośrednio po opublikowaniu aktualizacji. Rozpocznij bezpłatny, 30-dniowy okres próbny, aby go wypróbować.", + "b+DwLA": "Wniosek o udział w tym uruchomieniu.", + "a1vQ5Q": "Potwierdź odejście", + "XS4umx": "{name} uśpił aktualizację statusu", + "SMrXWc": "Ulubione", + "SK5APX": "Nie można było opuścić uruchomienie.", + "PoX2HN": "Wyślij prośbę", + "PdRg+3": "Zobacz wszystkie...", + "PWmZrW": "Zobacz wszystkie uruchomienia", + "PW+sL4": "N/A", + "P6NEL/": "Polecenie...", + "OfN7IN": "Na kanał uruchomienia zostanie wysłany wniosek o aktualizację statusu.", + "N9CTUJ": "Opuść uruchomienie", + "Mjq//Y": "Cofnij ulubione", + "KzHQCQ": "Nie ma gotowych uruchomień pasujących do tych filtrów.", + "Gwmqz5": "Wniosek o aktualizację", + "F/HKIy": "Czy na pewno chcesz opuścić uruchomienie?", + "CV1ddt": "Weź udział w uruchomieniu", + "CUhlqp": "samouczek i porady", + "B9z0uZ": "Twoja prośba o dołączenie do uruchomienia nie powiodła się.", + "AH+V3r": "Zostań uczestnikiem uruchomienia.", + "5Hzwqs": "Ulubiony", + "5HXkY/": "Typ: {typeTitle}", + "4Iqlfe": "Dołączyłeś do tego uruchomienia.", + "3zF589": "Resetuj do wszystkich {filterName}", + "1fXVVz": "Termin...", + "1GOpgL": "Przypisany...", + "+6DCr9": "Jako uczestnik możesz zamieszczać aktualizacje statusu, przydzielać i realizować zadania oraz przeprowadzać retrospektywy.", + "wRM2AO": "Żądanie aktualizacji nie powiodło się.", + "mttASm": "Opuść i przestań obserwować uruchomienie", + "lpWBJE": "Potwierdź opuszczenie i zaprzestanie obserwowania", + "hnYSP3": "Kiedy opuścisz i przestaniesz obserwować uruchomienie, zostanie on usunięty z lewego paska bocznego. Możesz go ponownie znaleźć przeglądając wszystkie uruchomienia.", + "AhY0vJ": "Opuść i przestań obserwować", + "egUE/K": "Nadawanie na wybranych kanałach", + "Xm0L7N": "Kiedy aktualizuje się status, lub publikuje retrospekcję", + "iEtImk": "Kiedy opuścisz {isFollowing, select, true {i przestaniesz śledzić uruchomienie} other { uruchomienie}}, zostanie on usunięty z lewego paska bocznego. Możesz go ponownie znaleźć, przeglądając wszystkie uruchomienia.", + "cnfVhV": "Opuść{isFollowing, select, true { i wyłącz obserwowanie} other {}}", + "Suyx6A": "Import playbooka nie powiódł się. Proszę sprawdzić czy JSON jest poprawny i spróbować ponownie.", + "QegBKq": "Dołącz do playbooka", + "Q4sutg": "Potwierdź opuszczenie{isFollowing, select, true { i wyłączenie obserwowania} other {}}", + "P6PLpi": "Dołącz do", + "FgydNe": "Zobacz", + "5PpBsd": "Twoja prośba nie powiodła się.", + "qGlwfc": "Uruchom przebieg", + "j2FnDV": "Zostanie utworzony kanał o tej nazwie", + "iQhFxR": "Ostatnio używane", + "03oqA2": "Aktywuj Uruchomienia", + "vqmRBs": "Potwierdź ponowne uruchomienie", + "k5EChD": "Czy na pewno chcesz ponownie uruchomić przebieg?", + "Zg0obP": "Uruchom ponownie", + "KjNfA8": "Nieważny czas trwania" } diff --git a/webapp/i18n/sv.json b/webapp/i18n/sv.json index 52a51ba25f..0a007a2446 100644 --- a/webapp/i18n/sv.json +++ b/webapp/i18n/sv.json @@ -106,117 +106,117 @@ "4Hrh5B": "{name} ändrade status från {summary}", "3/wF0G": "Slash-kommandon", "+QgvjN": "Tilldela rollen ägare till", - "lQT7iD": "", + "lQT7iD": "Skapa en playbook", "EQpfkS": "Slutförd", "42qmJ5": "Du har inte behörighet att skicka en uppdatering.", - "l0hFoB": "", + "l0hFoB": "Lägg till en beskrivning av playbooken...", "/MaJux": "Starta retrospektivt", - "e/AZL5": "", + "e/AZL5": "Din 30-dagars prova-på-period har börjat", "IfxUgC": "Och lägg till en sammanfattning av körningen…", "Auj1ap": "Starta en prova-på-period eller uppgradera ditt abonnemang.", - "hO9EdA": "", + "hO9EdA": "Bjud in {numInvitedUsers, plural, =0 {inga medlemmar} =1 {en medlem} other {# medlemmar}} till kanalen", "9TTfXU": "Din systemadministratör har blivit notifierad.", "5qBEKB": "Vad är playbook-körningar?", - "ijAUQf": "", - "Z/hwEf": "", - "W1Qs5O": "", - "rDvvQs": "", - "YORRGQ": "", - "aYIUar": "", + "ijAUQf": "Meddela din systemadministratör att uppgradera.", + "Z/hwEf": "Kanalen kommer att påminnas om att utföra retrospektiv {reminderEnabled, select, true {varje} other {}}", + "W1Qs5O": "Körs", + "rDvvQs": "{completed, number} / {total, number} klar", + "YORRGQ": "Publicera en uppdatering", + "aYIUar": "Tack!", "6uhSSw": "Välj en kanal", "fmylXu": "", - "SmAUf9": "", + "SmAUf9": "En påminnelse kommer att skickas {timestamp}", "5j6GD/": "{numParticipants, plural, =0 {inga aktiva deltagare} =1 {# aktiv deltagare} other {# aktiva deltagare}}", "5Ofkag": "Aktivera retrospektivt", - "wX3k9U": "", + "wX3k9U": "Playbook utan titel", "0tznw6": "Konvertera till en privat playbook", - "kvgvNW": "", - "lJyq2a": "", - "kDcpd/": "", + "kvgvNW": "Vet vad som hände", + "lJyq2a": "Körningen hittas inte", + "kDcpd/": "{numKeywords, plural, other {# nyckelord}}", "wsUmh9": "", "/ZsEUy": "Är du säker på att du vill ta bort den här checklistan? Den tas bort från den här körningen men påverkar inte denna playbook.", "+hddg7": "Lägg till i tidslinjen för körning", "D9IV7i": "Retrospektiv var inaktiverad för den här körningen.", - "cp7KUI": "", - "j7jdWG": "", - "u4MwUB": "", + "cp7KUI": "Playbook", + "j7jdWG": "Konvertera till en kommersiell version.", + "u4MwUB": "Spara din playbooks körningshistorik", "DSVJjB": "För närvarande körs playbook {playbookTitle}", "D55vrs": "Din licens kunde inte genereras", "Cy1AK/": "Visa information om körning", - "jS/UOn": "", + "jS/UOn": "Uppdatera mallen", "9+Ddtu": "Nästa", "9PXW6Q": "Varaktighet / påbörjad den", "FXCLuZ": "{total, number} totalt", "91Hr5f": "Ta tag och drag för att organisera om", - "hfrrC7": "", - "fV6578": "", - "d4g2r8": "", - "vjzpnC": "", - "vaYTD+": "", - "vNiZXF": "", - "sIX63S": "", - "sDKojV": "", - "ryrP8K": "", - "ruJGqS": "", - "qyJtWy": "", + "hfrrC7": "Team-initialer", + "fV6578": "Tilldela rollen ägare till", + "d4g2r8": "Borttagen: {timestamp}", + "vjzpnC": "Det finns inga playbooks som motsvarar valt filter.", + "vaYTD+": "Det {outstanding, plural, =1 {finns # utestående uppgift} other {finns # utestående uppgifter}}. Är du säker att du vill avsluta körningen?", + "vNiZXF": "Inga körningar pågår för närvarande. Kör en playbook för att börja orkestrera ditt teams arbetsflöden och dina verktyg.", + "sIX63S": "Din systemadministratör har blivit notifierad", + "sDKojV": "Arkivera playbook", + "ryrP8K": "Hantera behörigheter för vem som kan visa, ändra och köra denna playbook.", + "ruJGqS": "Tillgång till playbook", + "qyJtWy": "Visa mindre", "qp3Fk4": "", - "lrbrjv": "", - "b5FaCc": "", - "b3TdyZ": "", - "b/QBNs": "", - "ZAJviT": "", - "Z7vWDQ": "", - "YKn+7s": "", + "lrbrjv": "Ja, starta retrospektiv", + "b5FaCc": "Lägg till kanalen i en kategori i sidofältet", + "b3TdyZ": "Genom att klicka på Starta prova-på-period godkänner jag Mattermost Software Evaluation Agreement, Privacy Policy och att ta emot mejl med produktinformation.", + "b/QBNs": "Uppdatering är planerad", + "ZAJviT": "Vi kunde inte meddela systemadministratören.", + "Z7vWDQ": "Ett fel har uppstått", + "YKn+7s": "Ingen playbook kör i denna kanal.", "Y+U8La": "", - "XXbWAU": "", - "W/V6+Y": "", - "SDSqfA": "", - "RO+BaS": "", - "JJNc3c": "", - "zx0myy": "", - "z3B83t": "", + "XXbWAU": "Välj detta om du vill få automatiska uppdateringar när denna playbook körs.", + "W/V6+Y": "dra ihop", + "SDSqfA": "När en körning startar", + "RO+BaS": "Kopiera länken för att köra", + "JJNc3c": "Föregående", + "zx0myy": "Deltagare", + "z3B83t": "Sök efter en playbook", "yxguVq": "", - "wZ83YL": "", - "wL7VAE": "", - "w0muFd": "", - "syEQFE": "", - "sVlNlY": "", - "q6f8x9": "", - "oVHn4s": "", + "wZ83YL": "Inte just nu", + "wL7VAE": "Händelser", + "w0muFd": "Skicka utgående webhook (en per rad)", + "syEQFE": "Publicera", + "sVlNlY": "Alla team har olika struktur. Du kan hantera vilka användare i teamet som kan skapa playbooks.", + "q6f8x9": "Förändring sedan den senaste uppdateringen", + "oVHn4s": "Senaste uppdatering", "nmpevl": "", - "nkCCM2": "", - "k9q07e": "", - "iNU1lj": "", - "fuDLDJ": "", + "nkCCM2": "Du kommer inte bli påmind igen.", + "k9q07e": "Sänd uppdatering till andra kanaler", + "iNU1lj": "Den körning du efterfrågar är privat eller existerar inte.", + "fuDLDJ": "Skapa en kanal", "fpuWL1": "", - "eLeFE2": "", - "d8KvXJ": "", - "VmnoW8": "", - "Ui6GK/": "", - "UMoxP9": "", - "OINwWS": "", - "NA7Cw1": "", - "Mm1Gse": "", - "M/2yY/": "", - "KJu1sq": "", - "ypIsVG": "", + "eLeFE2": "Redigera namn och beskrivning", + "d8KvXJ": "Din testlicens löper ut den {expiryDate}. Du kan köpa en licens när som helst via Kundportalen för att undvika avbrott.", + "VmnoW8": "Kontrollera systemloggarna för mer information.", + "Ui6GK/": "När en ny medlem går med i kanalen", + "UMoxP9": "Mall för kanalnamn (valfritt)", + "OINwWS": "Skapa en {isPublic, select, true {publik} other {privat}} kanal", + "NA7Cw1": "Kopiera länken till playbook", + "Mm1Gse": "Sök efter medlem", + "M/2yY/": "Ingen ännu.", + "KJu1sq": "Ta bort checklistan", + "ypIsVG": "Återställ uppgiften", "qsr3Zk": "", - "q0cpUe": "", - "pKLw8O": "", + "q0cpUe": "Lägg till en checklista", + "pKLw8O": "Är du säker på att du vill ta bort den här händelsen? Radade händelser kommer att tas bort från tidslinjen permanent.", "nSFBC2": "", - "dSC1YD": "", + "dSC1YD": "Hoppa över uppgiften", "0q+hj2": "Definiera en mall för en kortfattad beskrivning som förklarar varje körning för intressenterna.", - "o+ZEL3": "", - "SXJ98n": "", + "o+ZEL3": "Publicerad {timestamp}", + "SXJ98n": "Du kan inte redigera retrospekt-rapporten efter att du publicerat den. Vill du publicera retrospekt-rapporten?", "8oCVbz": "", - "wylJpv": "", - "tVPYMu": "", - "gGcNUr": "", - "g0mp+I": "", - "R/2lqw": "", - "QpUBDr": "", - "OsDomv": "", - "MJ89uW": "", + "wylJpv": "Alla i {team} kan se denna playbook.", + "tVPYMu": "Playbook administratör", + "gGcNUr": "Du har inga behörigheter", + "g0mp+I": "När du konverterar till en privat playbook bevaras medlemskap och körhistorik. Den här ändringen är permanent och kan inte göras ogjord. Är du säker på att du vill konvertera {playbookTitle} till en privat playbook?", + "R/2lqw": "Välj en mall", + "QpUBDr": "{members, plural, =0 {Ingen} =1 {En person} other {# personer}} har tillgång till denna playbook.", + "OsDomv": "Alla händelser", + "MJ89uW": "Konvertera till en privat playbook", "HLn43R": "Hantera åtkomst", "EvBQLq": "Gör till Playbook-admin", "EWz2w5": "Kör playbook", @@ -224,107 +224,107 @@ "5BUxvl": "Alla i teamet har åtkomst till denna playbook.", "3Ls2m+": "Medlem i playbook", "0Vvpht": "Gör till Playbook-medlem", - "osuP6z": "", - "zz6ObK": "", + "osuP6z": "Dra för att ändra ordningen i checklistan", + "zz6ObK": "Återställ", "wO6NOM": "", - "tzMNF3": "", - "twieZh": "", - "sqNmlF": "", - "pK6+CW": "", - "Lo10yH": "", - "iDMOiz": "", - "hrgo+E": "", - "hVFgh4": "", - "dvhvum": "", - "djALPR": "", - "JqKASQ": "", + "tzMNF3": "Status", + "twieZh": "Gå till översikten över körning", + "sqNmlF": "Hoppa över retrospektivt", + "pK6+CW": "@{displayName} är inte medlem i kanalen [{runName}]({overviewUrl}). Vill du lägga till dem i den här kanalen? De kommer att ha tillgång till all meddelandehistorik.", + "Lo10yH": "Okänd kanal", + "iDMOiz": "KANALMEDLEMMAR", + "hrgo+E": "Arkiv", + "hVFgh4": "Inkludera slutförda", + "dvhvum": "(Valfritt) Beskriv hur denna playbook ska användas", + "djALPR": "{activeRuns, number} {activeRuns, plural, one {körning} other {körningar}} pågår", + "JqKASQ": "Lägg till @{displayName} i kanalen", "HSi3uv": "Ingen mottagare", "HAlOn1": "Namn", "C9NScU": "Ge kontroll till teamet", "5ciuDD": "INTE I KANALEN", - "TxCTXQ": "", - "QywYDe": "", + "TxCTXQ": "Är du säker på att du vill avsluta körningen?", + "QywYDe": "Markera också körningen som avslutad", "2563nT": "Bekräfta att avsluta körningen", - "MrJPOh": "", - "Ja1sVR": "", - "v1DNMW": "", - "m/Q4ye": "", - "k1djnL": "", - "iXNbPf": "", - "fUEpLA": "", - "X2K92H": "", - "OK8u0r": "", + "MrJPOh": "Aktivera statusuppdateringar", + "Ja1sVR": "Statusuppdateringar var inaktiverade för den här playbook-körningen.", + "v1DNMW": "Retrospektiv publicerad av {name}", + "m/Q4ye": "Byt namn på checklistan", + "k1djnL": "Ta bort checklistan", + "iXNbPf": "Byt namn", + "fUEpLA": "Det finns inga händelser på tidslinjen som matchar dessa filter.", + "X2K92H": "Namn på checklista", + "OK8u0r": "Skapa en playbook för att beskriva arbetsflödet som dina team och verktyg ska följa, inklusive checklistor, åtgärder, mallar och retrospektiva möten.", "I5NMJ8": "Mer", "9kCT7Q": "Gör retrospektiven enkla med en tidslinje som automatiskt håller reda på händelser och meddelanden så att teamet har dem nära till hands.", "5CI3KH": "Kontakta support", "2/2yg+": "Lägg till", "O8o2lE": "", - "vndQuC": "", - "o2eHmz": "", - "fXGjhC": "", - "bGhCLX": "", + "vndQuC": "Slash-kommando utfört", + "o2eHmz": "Körning avslutad av {name}", + "fXGjhC": "Ägare ändrades från {summary}", + "bGhCLX": "När en uppdatering publiceras", "4vuNrq": "{duration} efter att körningen startade", "4ltHYh": "Gå till playbook", "3Psa+5": "", "2VrVHu": "Sök efter körningsnamn", "/gbqA6": "{duration} innan körningen startade", - "cPIKU2": "", + "cPIKU2": "Följer", "C6Oghd": "Redigera sammanfattningen av körningen", - "usa8vQ": "", - "lxfpbh": "", - "kXFojL": "", - "jIgqRa": "", - "L6k6aT": "", + "usa8vQ": "Skicka ett välkomstmeddelande", + "lxfpbh": "Ägaren kommer {reminderEnabled, select, true {bli efterfrågad att ge statusuppdateringar varje} other {inte bli efterfrågad att ge statusuppdatering}}", + "kXFojL": "Du kan också skapa en playbook i förväg så att den finns tillgänglig när du behöver den.", + "jIgqRa": "Ägare / Deltagare", + "L6k6aT": "...eller börja med en mall", "3MSGcL": "Kanalnamnet är inte giltigt.", "kGI46P": "", - "K4O03z": "", + "K4O03z": "Ny uppgift", "0oL1zz": "Kopierad!", - "K3r6DQ": "", - "Vhnd2J": "", - "ZdWYcm": "", - "YMrTRm": "", - "X/koAN": "", + "K3r6DQ": "Radera", + "Vhnd2J": "Växla beskrivningen", + "ZdWYcm": "Nej, hoppa över retrospekt", + "YMrTRm": "Sammanfattning av körning", + "X/koAN": "Ogiltig post: det högsta tillåtna antalet webhooks är 64", "7VTSeD": "", "/4tOwT": "", "h+e7G+": "", - "v1SpKO": "", + "v1SpKO": "Rollförändringar", "36GNZj": "Playbook {title} arkiverades.", "+Tmpup": "Du får automatiskt uppdateringar när den här spelboken körs.", - "l7zMH6": "", + "l7zMH6": "Välj ett alternativ eller ange en egen varaktighet", "0HT+Ib": "Arkiverad", - "rbrahO": "", - "pjt3qA": "", - "nqVby7": "", - "ZWtlyd": "", - "z3A0LP": "", - "xmcVZ0": "", - "x8cvBr": "", - "WTQpnI": "", - "WIxhrv": "", - "WAHCT2": "", - "VOzlSL": "", - "Qrl6bQ": "", + "rbrahO": "Stäng", + "pjt3qA": "Ny checklista", + "nqVby7": "{numTasksChecked, number} av {numTasks, number} {numTasks, plural, =1 {uppgift} other {uppgifter}} markerad", + "ZWtlyd": "Körning återställd av {name}", + "z3A0LP": "Den senaste körningen var {relativeTime}", + "xmcVZ0": "Sök", + "x8cvBr": "Visa en översikt över körningar", + "WTQpnI": "Agera med hjälp av playbooks", + "WIxhrv": "Körnamnet måste ha minst två tecken", + "WAHCT2": "Meddela systemadministratören", + "VOzlSL": "Genom att köra en playbook kan du orkestrera arbetsflöden för teamet och dina verktyg.", + "Qrl6bQ": "Effektivisera dina processer med playbooks", "Q67RuY": "", - "Oo5sdB": "", - "N1U/QR": "", + "Oo5sdB": "Playbook namn", + "N1U/QR": "Uppgiftsstatus ändrad", "IOnm/Z": "Det finns ingen sammanfattning av körningen.", - "jwimQJ": "", - "edxtzC": "", - "bE1Cro": "", - "V5TY0z": "", + "jwimQJ": "Ok", + "edxtzC": "Skapa en playbook", + "bE1Cro": "Endast mina körningar", + "V5TY0z": "Lägg till deltagare?", "E0LnBo": "Du kan välja ett alternativ eller ange en anpassad varaktighet (\"2 veckor\", \"3 dagar 12 timmar\", \"45 minuter\", ...)", - "TdTXXf": "", - "TBez4r": "", - "QaZNp9": "", - "QUwMsX": "", - "Q7hMnp": "", - "OcpRSQ": "", + "TdTXXf": "Mer information", + "TBez4r": "Det finns inga playbooks att visa. Du har inte behörighet att skapa playbooks i denna arbetsyta.", + "QaZNp9": "Slutför körningen", + "QUwMsX": "Påminnelse om att fylla i retrospektiv", + "Q7hMnp": "Kör playbook", + "OcpRSQ": "Radera posten", "OHfpS1": "", - "Nh91Us": "", - "N2IrpM": "", - "Lg3I1b": "", + "Nh91Us": "{from, number}–{to, number} av totalt {total, number}", + "N2IrpM": "Bekräfta", + "Lg3I1b": "Vänligen ge en statusuppdatering @{targetUsername}.", "Leh2tk": "", - "JJMNME": "", + "JJMNME": "{withRunName, select, true {@{authorUsername} har postat en uppdatering för [{runName}]({overviewURL})} other {@{authorUsername} har postat en uppdatering}}", "GxJAK1": "Den playbook som du efterfrågar är privat eller existerar inte.", "GwtR3W": "Dra och släpp en befintlig uppgift eller klicka för att skapa en ny uppgift.", "GRTyvN": "Växla till Playbook-listan", @@ -342,16 +342,16 @@ "ApULhK": "Bjud in medlemmar", "9tBhzB": "Uppgradera nu", "9qc7BX": "", - "yqpcOa": "", - "yhU1et": "", - "scYyVv": "", - "guunZt": "", - "gt6BhE": "", - "g4IF1x": "", + "yqpcOa": "Använd", + "yhU1et": "Uppgifter", + "scYyVv": "Vill du fylla i retrospektiv-rapporten?", + "guunZt": "Tilldela", + "gt6BhE": "Information om körning", + "g4IF1x": "Denna playbook har aldrig körts.", "dsTLW1": "", - "aWpBzj": "", - "S0kWcH": "", - "JXdbo8": "", + "aWpBzj": "Visa mer", + "S0kWcH": "Försenad uppdatering", + "JXdbo8": "Klar", "Ietscn": "Uppgifter avslutade", "I90sbW": "just nu", "A8dbCS": "Playbook hittades inte", @@ -367,107 +367,107 @@ "0wJ7N+": "", "0oLj/t": "Expandera", "/YZ/sw": "Starta prova-på-period", - "zWkvNO": "", - "wcWpGs": "", - "uny3Zy": "", + "zWkvNO": "Tidslinje", + "wcWpGs": "Ogiltiga URL:er för webhooks", + "uny3Zy": "Playbooks", "uBLF+D": "", - "zELxbG": "", - "x5Tz6M": "", - "ieGrWo": "", - "egvJrY": "", - "aACJNp": "", - "jnmORb": "", + "zELxbG": "Sparade meddelanden", + "x5Tz6M": "Rapportera", + "ieGrWo": "Följ", + "egvJrY": "Mottagare Ändrat", + "aACJNp": "Körning påbörjad av {name}", + "jnmORb": "I den här playbooken", "HGdWwZ": "Skapa och tilldela uppgifter", "HXvk56": "Skicka statusuppdateringar", "Pue+oV": "", - "q/Qo8l": "", - "dxyZg3": "", - "Q5hysF": "", - "f+bqgK": "", + "q/Qo8l": "Privata playbooks är endast tillgängliga i Mattermost Enterprise", + "dxyZg3": "Låt mig utforska själv", + "Q5hysF": "Gör mer med Playbooks", + "f+bqgK": "Namn på måttet", "wPVxBN": "", - "vL4++D": "", + "vL4++D": "Uppföljning av framsteg och ägarskap", "1QosTr": "Används av", - "rzbYbE": "", + "rzbYbE": "Mål", "8n24G2": "Visa detaljer om körning i en sidopanel", - "rMhrJH": "", + "rMhrJH": "Sätt en rubrik för ditt mått.", "mbo96h": "", - "y7o4Rn": "", - "Tt04f1": "", + "y7o4Rn": "Är du säker på att du vill radera?", + "Tt04f1": "Se vem som är inblandad och vad som behöver göras utan att lämna konversationen.", "6D6ffM": "Ange en varaktighet i formatet dd:hh:mm (t.ex. 31:23:59) eller lämna fältet tomt.", - "NYTGIb": "", - "mVpO8u": "", + "NYTGIb": "Jag fattar", + "mVpO8u": "Sett detta tidigare?", "0Xt1ea": "Du kommer fortfarande att kunna få tillgång till historiska data för denna mätning.", "4BN53Q": "Vi visar hur nära eller långt ifrån målet varje körning är och visar även värdet på ett diagram.", "1isgPF": "", - "VZRWFk": "", - "hw83pa": "", - "TxmjKI": "", - "a0hBZ0": "", + "VZRWFk": "t.ex. kostnad, inköp", + "hw83pa": "Följ upp statistik och viktiga mätvärden", + "TxmjKI": "Beskriv vad mätetalet handlar om", + "a0hBZ0": "Ta bort mätvärden", "vQqT/8": "", - "gsMPAS": "", + "gsMPAS": "Dollars", "6GTzTR": "Se vad som finns i denna playbook när som helst", "/fU9y/": "På den här sidan kan du läsa mer detaljer om olika delar av playbooken.", - "lBqu4h": "", + "lBqu4h": "Återställa playbook", "0EEIkR": "", - "RzEVnf": "", + "RzEVnf": "Med hjälp av playbooks blir viktiga procedurer upprepbara och möjliga att följa i efterhand. En playbook kan köras flera gånger, och varje körning har sin egen logg och retrospekt.", "GG1yhI": "Det finns mallar för en rad olika användningsområden och händelser. Du kan använda en playbook som den är eller anpassa den och sedan dela den med ditt team.", - "XpDetT": "", - "udrLSP": "", - "lUfDe1": "", - "vJ2SaW": "", - "q/VD+s": "", - "cEWBE3": "", - "Q3R9Uj": "", + "XpDetT": "Välj bort att få tips.", + "udrLSP": "Använd mätvärden för att förstå mönster och framsteg i olika körningar och spåra resultat.", + "lUfDe1": "Exportera körningens kanal och spara den för senare analys.", + "vJ2SaW": "Automatisera delar av din playbook, t.ex. genom att skicka välkomstmeddelande, bjuda in viktiga medlemmar och skapa en kanal med uppdateringar.", + "q/VD+s": "Sätt upp tidsramar och skapa en mall för statusuppdateringar så att intressenterna alltid är uppdaterade om vad som händer.", + "cEWBE3": "Utvärdera dina processer med hjälp av retrospektiv för att förfina och förbättra dem för varje körning.", + "Q3R9Uj": "Dokumentera alla steg för hela processen här. Tilldela respektive uppgift till ansvariga personer och lägg till eventuella tidslinjer eller länkade åtgärder.", "I5DYM+": "Lär dig OCH reflektera", "GAuN6w": "Ange antaganden", "9m0I/B": "Håll intressenterna uppdaterade", - "wbdGb5": "", - "fhMaTZ": "", - "R5Zh+l": "", - "QbGfqo": "", - "lgZf0l": "", - "ZkhArX": "", + "wbdGb5": "Tilldela, bocka av eller hoppa över uppgifter för att se till att teamet vet hur kommer i mål tillsammans.", + "fhMaTZ": "Ta en snabb rundtur", + "R5Zh+l": "Här kan du först uppleva ett exempel på en playbook innan du lägger tid på att skapa din egen.", + "QbGfqo": "Sänd till intressenter på flera olika ställen och behåll spårning för retrospektiv med ett enda inlägg.", + "lgZf0l": "Kom igång med Playbooks", + "ZkhArX": "Kör igång!", "GjCS6U": "Välj en mall", - "dZmYk6": "", + "dZmYk6": "Playbook duplicerad", "1ikfp3": "Om du raderar den här mätningen kommer värdena för den inte att samlas in för framtida körningar.", - "uT4ebt": "", - "tbjmvS": "", - "Sx3lHL": "", - "OyZnsJ": "", - "NJ9uPu": "", - "LI7YlB": "", - "LDYFkN": "", - "JrZ2th": "", + "uT4ebt": "t.ex. antal resurser, berörda kunder", + "tbjmvS": "Det finns redan ett mätvärde med samma namn. Ange ett unikt namn för varje mätetal.", + "Sx3lHL": "Heltal", + "OyZnsJ": "per körning", + "NJ9uPu": "Viktiga mätvärden", + "LI7YlB": "Lägg till detaljer om vad mätvärdet handlar om och hur det ska fyllas i. Denna beskrivning kommer att finnas tillgänglig på sidan för retrospektivt arbete för varje körning där värden för dessa mätvärden kommer att anges.", + "LDYFkN": "Varaktighet (i dd:hh:mm)", + "JrZ2th": "Lägg till mätvärden", "FGzxgY": "t.ex. Tid för att bekräfta, Tid för att lösa problemet", "F4pfM/": "Ange ett nummer eller lämna fältet tomt.", "9SIW2x": "Målvärde för varje körning", - "xvBDOH": "", - "bTgMQ2": "", - "MTzF3S": "", + "xvBDOH": "Är du säker på att du vill arkivera playbook {title}?", + "bTgMQ2": "Denna playbook är arkiverad.", + "MTzF3S": "Är du säker på att du vill återställa playbook {title}?", "4cwL43": "Med arkiverade", "4aupaG": "Playbook {title} återställdes framgångsrikt.", - "SVwJTM": "", + "SVwJTM": "Exportera", "9XUYQt": "Importera", "4alprY": "Playbookmallar", "/urtZ8": "Dina playbooks", "4fHiNl": "Kopiera", "3PoGhY": "Är du säker på att du vill publicera?", - "NMxVd+": "", - "lbs7UO": "", + "NMxVd+": "Fyll i mätvärdet.", + "lbs7UO": "per körning under de senaste 10 körningarna", "69nlA3": "Ange en varaktighet i formatet: dd:hh:mm (t.ex. 31:23:59).", - "l5/RKZ": "", - "awG90C": "", - "efeNi1": "", - "fmbSyg": "", - "mvZUm3": "", - "xVyHgP": "", - "KXVV4+": "", - "NiAH1z": "", - "M4gAc9": "", - "ZNNjWw": "", - "ru+JCk": "", - "Vf/QlZ": "", - "NLeFGn": "", + "l5/RKZ": "Denna playbook har inga slutförda körningar.", + "awG90C": "Mål per körning", + "efeNi1": "Genomsnittligt värde över 10 körningar", + "fmbSyg": "Lägg till värde (i dd:hh:mm)", + "mvZUm3": "Här du kan utforska komponenterna i din playbook i detalj. Välj Redigera för att anpassa din playbook så att den passar dina processer och modeller.", + "xVyHgP": "Starta en testkörning", + "KXVV4+": "Välkommen till förhandsgranskning av playbook!", + "NiAH1z": "Målvärde", + "M4gAc9": "Lägg till värde", + "ZNNjWw": "Ange ett nummer.", + "ru+JCk": "Genomsnittligt värde", + "Vf/QlZ": "Värdeintervall", + "NLeFGn": "till", "9a9+ww": "Titel", "+PMJAg": "Börja följa {followers, plural, =1 {en användare} other {# användare}}", "5ZIN3u": "Statusuppdateringar", @@ -497,5 +497,151 @@ "9kQNdp": "Denna playbook är privat.", "9j5KzL": "Ange kategorinamn", "+qDKgW": "Visa alla uppdateringar", - "IxtSML": "Lägg till en checklista" + "IxtSML": "Lägg till en checklista", + "ZJS10z": "Inga uppdateringar har publicerats ännu", + "Z3ybv/": "Lägg till kanalen i en kategori i sidofältet för användaren", + "Z2Hfu4": "Lägg till en sammanfattning av körningen", + "YQOmSf": "Ange en webhook per rad", + "Y4MU/9": "Välj Starta en testkörning för att se hur det fungerar.", + "Xgxruo": "Hoppa över checklistan", + "XRyRzf": "Inga statusuppdateringar förväntas.", + "XF8rrh": "Kopiera länken till ''{name}''", + "W0aij2": "Tilldela till...", + "UlJJ1i": "Lägg till slash-kommando", + "TTIQ6E": "Ange förfallodatum på uppgifter så att de som tilldelas uppgifterna kan prioritera och få saker gjorda.", + "TD8WrM": "Duplicering är inaktiverad för teamet.", + "RrCui3": "Sammanfattning", + "RnOiCg": "Det var inte möjligt att {isFollowing, select, true {sluta följa} other {följa}} körningen", + "RUlvbf": "Testa din nya playbook!", + "RQl8IW": "Snooza i…", + "Q15rLN": "Begär uppdatering...", + "Ppx673": "Rapporter", + "OuZhcQ": "Ange varaktighet (\"8 timmar\", \"3 dagar\"...)", + "Ob5cSv": "De ändringar som du har gjort kommer inte att sparas om du lämnar den här sidan. Är du säker på att du vill kasta ändringarna och lämna sidan?", + "OQplDX": "En statusuppdatering förväntas varje . Nya uppdateringar kommer {channelCount, plural, =0 {inte skickas till någon kanal} one {skickas till # kanal} other {skickas till # kanaler}} och {webhookCount, plural, =0 {inga utgående webhooks} one {# utgående webhook} other {# utgående webhooks}}.", + "OKhRC6": "Dela", + "NFyWnZ": "Arbeta mer effektivt", + "MyIJbr": "Innehåll", + "MbapTE": "{num} {num, plural, =1 {uppgift försenad} other {uppgifter försenade}}", + "MHzP9I": "Definiera ett välkomstmeddelande för att välkomna användare som ansluter sig till kanalen.", + "MBNMo9": "Åtgärder i kanalen", + "LcC/pi": "Skicka ett välkomstmeddelande…", + "JcefuP": "Lägg till en beskrivning (valfritt)", + "4mCpAv": "Det gick inte att byta ägare", + "OqCzNb": "Lägg till en uppgift", + "MtrTNy": "Imorgon", + "Ul0aFX": "Importera playbook", + "LfhTNW": "Bläddra bland eller skapa playbooks och körningar", + "GVpA4Q": "Skapa en ny playbook", + "/qDObA": "Bläddra bland körningar", + "dCtjdj": "Är du redo att köra din playbook?", + "cyR7Kh": "Tillbaka", + "c6LNcW": "Ta bort uppgift", + "c23IHq": "Med kanal-händelser kan du automatisera aktiviteter i den här kanalen", + "bf5rs0": "Visa info", + "aZGAOI": "Lägg till mall för statusuppdatering…", + "aEhjYg": "Översikt", + "CFysvS": "Skapa Playbook dropdown", + "/+8SGX": "Visar {filteredNum} av {totalNum} händelser", + "g9pEhE": "Förfallna", + "e3z3P8": "Ignorera ändringar och lämna sidan", + "Xx0WZV": "Skicka meddelande", + "UePrSL": "{num} {num, plural, one {deltagare} other {deltagare}}", + "UMFnWV": "Visa retrospektiv", + "9xs0pp": "Lägg till värde...", + "gfUBRi": "Utse en ny ägare innan du lämnar körningen.", + "fnihsY": "Lämna", + "ePhhuK": "Din begäran skickades till körningens kanal.", + "cnfVhV": "Lämna {isFollowing, select, true {och sluta följa } other {}}körningen", + "ch4Vs1": "Begär uppdateringar för playbook-körningar med ett enda klick och få direkt meddelande när en uppdatering publiceras. Starta en kostnadsfri 30-dagars prova-på-period för testa.", + "b+DwLA": "Fråga om att få delta i denna körning.", + "XS4umx": "{name} snoozade en statusuppdatering", + "VpQKQE": "{displayName} är inte en deltagare i körningen. Vill du göra dem till deltagare? De kommer att ha tillgång till all meddelandehistorik i körningens kanal.", + "Suyx6A": "Importen av playbook har misslyckats. Kontrollera att JSON-filen är felfri och försök igen.", + "SMrXWc": "Favoriter", + "SK5APX": "Det var inte möjligt att lämna körningen.", + "RCT0Px": "Lägg till {displayName} till kanalen", + "QegBKq": "Gå med i playbook", + "Q4sutg": "Bekräfta att lämna{isFollowing, select, true { och att sluta följa} other {}}", + "PoX2HN": "Skicka förfrågan", + "PdRg+3": "Visa alla...", + "PWmZrW": "Visa alla körningar", + "PW+sL4": "N/A", + "P6PLpi": "Gå med", + "P6NEL/": "Kommando...", + "OfN7IN": "En begäran om statusuppdatering skickas till körningens kanal.", + "Mjq//Y": "Ta bort favorit", + "KzHQCQ": "Det finns inga slutförda körningar som motsvarar valt filter.", + "KeO51o": "Kanal", + "Gwmqz5": "Begär en uppdatering", + "FgydNe": "Visa", + "CV1ddt": "Delta i körningen", + "CUhlqp": "bild för produktrundtur", + "B9z0uZ": "Din begäran om att få delta i körningen misslyckades.", + "AhY0vJ": "Lämna och avfölj", + "AH+V3r": "Bli deltagare i körningen.", + "5PpBsd": "Din förfrågan lyckades inte.", + "5Hzwqs": "Markera som favorit", + "5HXkY/": "Typ: {typeTitle}", + "4Iqlfe": "Du har deltagit i denna körning.", + "3zF589": "Återställ till alla {filterName}", + "1fXVVz": "Förfallodag...", + "1GOpgL": "Mottagare...", + "+6DCr9": "Som deltagare kan du uppdatera status, tilldela och slutföra uppgifter och göra retrospektiv.", + "lr1CUA": "Bläddra bland playbooks", + "kYCbJE": "Lägg till en tidsram", + "kV5GkX": "När en statusuppdatering publiceras", + "j940pJ": "Uppdateringen sparas på översiktssidan.", + "iMjjOH": "Nästa vecka", + "iEtImk": "När du lämnar{isFollowing, select, true { och avföljer en körning} other { en körning}} tas den bort från den vänstra sidofältet. Du kan hitta den igen genom att visa alla körningar.", + "hjteuA": "Alla playbooks som du har tillgång till visas här", + "m/KtHt": "Du har inte behörighet att ändra ägare", + "lyXljU": "Duplicera uppgiften", + "lkv547": "Förfallodag (finns tillgänglig i Professional abonnemang)", + "lbr3Lq": "Kopiera länken", + "lKeJ+i": "Det finns ingen sammanfattning", + "lJ48wN": "Privat playbook", + "kkw4kS": "Den här uppdateringen kommer publiceras i {hasChannels, select, true {{broadcastChannelCount, plural, =1 {en kanal} other {{broadcastChannelCount, number} kanaler}}} other {}}{hasFollowersAndChannels, select, true { och } other {}}{hasFollowers, select, true {{followersChannelCount, plural, =1 {ett direktmeddelande} other {{followersChannelCount, number} direktmeddelanden}}} other {}}.", + "kEMvwX": "Det finns inga körningar som motsvarar valt filter.", + "j2VYGA": "Visa alla playbooks", + "iigkp8": "Är det dags att avsluta?", + "zWgbGg": "Idag", + "zW/5AB": "Professionel-funktion Detta är en betal-funktion som är tillgänglig med en gratis 30-dagars prova-på-period", + "wGp7l3": "{icon} Dollar", + "u6Fyic": "Din begäran skickades till körningens kanal.", + "s+rSpl": "{icon} heltal", + "opn6uf": "Visa tidslinje", + "ojQue/": "{icon} Varaktighet (i dd:hh:mm)", + "ocYb9S": "Viktiga nyckeltal", + "oL7YsP": "Senast redigerad {timestamp}", + "oAJsne": "Publik playbook", + "o6N9pU": "Kör åtgärder", + "mm5vL8": "Endast inbjudna medlemmar", + "mkLeuq": "Sänd uppdatering till utvalda kanaler", + "mCrdeS": "Totalt antal körningar i playbook", + "zl6378": "Konfigurera mätvärden för retrospektiv", + "yllba1": "Den här arkiverade playbook kan inte byta namn.", + "xfnuXm": "Delta", + "xHNF7i": "Kör åtgärder", + "xEQYo5": "Konfigurera anpassade mätvärden som ska fyllas i den retrospektiva rapporten.", + "x1phlu": "Ingen tidsram", + "wRM2AO": "Uppdateringsbegäran misslyckades.", + "wBZz47": "Du har lämnat körningen.", + "vSMfYU": "Information om körning", + "vDvWJ6": "Prova uppdateringsbegäran med en gratis prova-på-period", + "v5/Cox": "Duplicera checklistan", + "u4L4yd": "Du har ej sparade förändringar", + "sX5Mn5": "Ange en webhook per rad", + "sGJpuF": "Lägg till en beskrivning…", + "qp5G0Z": "Uppgradering krävs för att få tillgång till retrospektiva funktioner.", + "pzTOmv": "Följare", + "pFK6bJ": "Visa alla", + "p1I/Fx": "Vi har automatiskt skapat din körning", + "oBeKB4": "Förfaller den {date}", + "nc8QpJ": "Senast aktivitet", + "mw9jVA": "Lägg till en titel", + "mNgqXf": "För att låsa upp den här funktionen:", + "mLrh+0": "Ingen förfallodag", + "qGlwfc": "Starta körning", + "j2FnDV": "Alla kanaler kommer skapas med detta namn" } diff --git a/webapp/i18n/tr.json b/webapp/i18n/tr.json index 6605bfbf56..aa0976ccdf 100644 --- a/webapp/i18n/tr.json +++ b/webapp/i18n/tr.json @@ -87,7 +87,7 @@ "BD66u6": "Kanaldaki tüm iletileri CSV dosyası biçiminde indirin", "B487HA": "Sürüyor", "B3Q5mz": "Tetikleyici", - "Auj1ap": "Ücretsiz deneme süresini başlatın ya da aboneliğinizi yükseltin.", + "Auj1ap": "Ücretsiz deneme süresini başlatın ya da aboneliğinizi üst tarifeye geçirin.", "ArpdYl": "Zaman çizelgesi etkinlikleri gerçekleştikçe burada görüntülenir. Bir etkinliği kaldırmak için üzerine gidin.", "ApULhK": "Üyeler çağır", "AS5kar": "Katılımcılar ({participants})", @@ -102,7 +102,7 @@ "A21Mgv": "Oyun tamamlandı", "9uOFF3": "Özet", "9trZXa": "Takımdaki herkes görebilir", - "9tBhzB": "Şimdi yükselt", + "9tBhzB": "Üst tarifeye geçin", "9m0I/B": "Paydaşlar bilgilendirilsin", "9kQNdp": "Bu senaryo özeldir.", "9j5KzL": "Kategori adını yazın", @@ -254,7 +254,7 @@ "Q7aZO4": "{numParticipants, plural, =0 {Etkin katılımcı yok} =1 {# katılımcı etkin} other {katılımcı etkin}}", "cPIKU2": "İzlenenler", "ijAUQf": "Sistem yöneticinizden aboneliğinizi yüklseltmesini isteyin.", - "avPeEI": "Bu senaryonun oyunlarındaki tüm oyunların eğilimini, etkin oyunları ve katılımcıları görmek için aboneliğinizi yükseltin.", + "avPeEI": "Bu senaryonun oyunlarındaki tüm oyunların eğilimini, etkin oyunları ve katılımcıları görmek için aboneliğinizi üst tarifeye geçirin.", "ieGrWo": "İzle", "iXNbPf": "Yeniden adlandır", "iMjjOH": "Sonraki hafta", @@ -294,7 +294,7 @@ "cyR7Kh": "Geri", "cp7KUI": "Senaryo", "cEWBE3": "Her oynamada süreçleri daha iyi kılmak için geçmiş değerlendirmesi yapın.", - "b3TdyZ": "Denemeyi başlat üzerine tıklayarak, Mattermost yazılım değerlendirme sözleşmesini, Gizlilik ilkesini ve ürün tanıtım e-postalarını almayı kabul ediyorum.", + "b3TdyZ": "Denemeyi başlat üzerine tıklayarak, Mattermost yazılım değerlendirme sözleşmesi ve Kişisel verilerin gizliliği ilkesi metinleri ile ürün tanıtımı e-postalarını almayı kabul ediyorum.", "c8hxKk": "{date}. hafta", "c6LNcW": "Görevi sil", "c23IHq": "Kanal işlemleri ile bu kanaldaki işlemler otomatikleştirilebilir", @@ -519,5 +519,104 @@ "GDCpPr": "Son durum güncellemesi", "+qDKgW": "Tüm güncellemeleri görüntüle", "kEMvwX": "Bu süzgeçlere uygun bir rol bulunamadı.", - "GXjP8g": "Erişebileceğiniz tüm roller burada görüntülenir" + "GXjP8g": "Erişebileceğiniz tüm roller burada görüntülenir", + "ocYb9S": "Anahtar ölçümler", + "nc8QpJ": "Son işlemler", + "m/KtHt": "Sahibi değiştirme izniniz yok", + "RnOiCg": "Oyun {isFollowing, select, true {izlemesi bırakılamıyor} other {izlenemiyor}}", + "4mCpAv": "Sahip değiştirilemez", + "lr1CUA": "Senaryolara göz at", + "Ul0aFX": "İçe senaryo aktar", + "LfhTNW": "Senaryo ve oyunlara göz atın ya da oluşturun", + "GVpA4Q": "Yeni senaryo oluştur", + "CFysvS": "Oyun açılan kutusu oluştur", + "/qDObA": "Oyunlara göz at", + "/+8SGX": "{filteredNum} / {totalNum} etkinlik görüntüleniyor", + "Jli9m7": "Oyun kanalına, bir güncelleme göndermelerini isteyen bir ileti gönderilecek.", + "9xs0pp": "Değer ekle...", + "jboo9u": "Güncelleme iste", + "Xx0WZV": "İleti gönder", + "UePrSL": "{num} {num, plural, one {katılımcı} other {katılımcı}}", + "UMFnWV": "Geçmiş değerlendirmesini görüntüle", + "P9PKvb": "Oyun kanalına bir ileti gönderildi.", + "NGqzDU": "Güncelleme isteğini onayla", + "JvEwg/": "Bir güncelleme istenemedi", + "RCT0Px": "{displayName} katılımcısını kanala ekle", + "KeO51o": "Kanal", + "VpQKQE": "{displayName} oyunun bir katılımcısı değil. Katılımcı yapmak ister misiniz? Oyun kanalındaki tüm ileti geçmişine erişebilecek.", + "zW/5AB": "Professional tarife özelliği Bu ücretli bir özelliktir ve 30 günlük ücretsiz deneme süresi boyunca kullanabilirsiniz", + "vDvWJ6": "Ücretsiz deneme ile güncelleme isteğini deneyin", + "pzTOmv": "Takipçiler", + "pFK6bJ": "Tümünü görüntüle", + "lKeJ+i": "Herhangi bir özet yok", + "hIWK05": "Oyun kanalına sizi katılımcı olarak eklemelerini isteyen bir ileti gönderilecek.", + "ch4Vs1": "Senaryo oyunlarındaki güncellemeleri tek bir tıklamayla isteyin ve bir güncelleme yayınlandığında doğrudan bilgilendirme alın. Denemek için 30 günlük ücretsiz deneme sürümünü başlatın.", + "U8u4uF": "Katkıda bulun", + "PdRg+3": "Tümünü görüntüle...", + "P6NEL/": "Komut...", + "MD6oav": "Katılma isteği yapılamadı", + "J2NmIY": "Katılmak istediğinizi onaylayın", + "3O8M5M": "İstek oyun kanalına gönderildi.", + "1fXVVz": "Bitiş tarihi...", + "1GOpgL": "Atanan...", + "u6Fyic": "İsteğiniz oyun kanalına gönderildi.", + "pXWclp": "Katılım isteğiniz oyun kanalına gönderilecek.", + "Nf9oAA": "Bu oyuna katılmak üzeresiniz.", + "5PpBsd": "İsteğiniz yapılamadı.", + "4Iqlfe": "Bu oyuna katıldınız.", + "mNgqXf": "Bu özelliği kullanabilmek için:", + "j2VYGA": "Tüm senaryoları görüntüle", + "SMrXWc": "Sık kullanılanlar", + "PWmZrW": "Tüm oyunları görüntüle", + "PW+sL4": "Kullanılamaz", + "KzHQCQ": "Bu süzgeçlere uygun tamamlanmış bir oyun yok.", + "CUhlqp": "eğitim turu ipucu ürün görseli", + "5HXkY/": "Tür: {typeTitle}", + "3zF589": "Tüm {filterName} sıfırla", + "wGp7l3": "{icon} Dolar", + "s+rSpl": "{icon} Tamsayı", + "qp5G0Z": "Geçmiş değerlendirmesi özellikleri için üst tarifeye geçilmesi gerekir.", + "ojQue/": "{icon} Süre (gg:ss:dd)", + "xfnuXm": "Katılın", + "wRM2AO": "Güncelleme isteği yapılamadı.", + "ePhhuK": "İsteğiniz oyun kanalına gönderildi.", + "b+DwLA": "Bu oyuna katılma isteği gönderin.", + "PoX2HN": "İsteği gönder", + "CV1ddt": "Oyuna katılın", + "Gwmqz5": "Bir güncelleme isteyin", + "OfN7IN": "Oyun kanalına bir durum güncellemesi isteği yapılacak.", + "B9z0uZ": "Oyuna katılma isteğiniz yapılamadı.", + "AH+V3r": "Oyuna katılın.", + "+6DCr9": "Bir katılımcı olarak durum güncellemeleri gönderebilir, görevler atayıp tamamlayabilir ve geriye dönük incelemeler gerçekleştirebilirsiniz.", + "wBZz47": "Oyundan ayrıldınız.", + "gfUBRi": "Oyundan ayrılmadan önce yeni bir sahip belirleyin.", + "fnihsY": "Ayrıl", + "a1vQ5Q": "Ayrılmayı onayla", + "SK5APX": "Oyundan ayrılınamadı.", + "N9CTUJ": "Oyundan ayrıl", + "F/HKIy": "Oyundan ayrılmak istediğinize emin misiniz?", + "Mjq//Y": "Sık kullanılanlardan kaldır", + "5Hzwqs": "Sık kullanılanlara ekle", + "XS4umx": "{name} bir durum güncellemesini susturdu", + "mttASm": "Oyundan ayrıl ve izlemeyi bırak", + "lpWBJE": "Ayrılıp izlemeyi bırakmayı onayla", + "hnYSP3": "Bir oyundan ayrılıp izlemeyi bıraktığınızda, sol yan çubuğunuzdan kaldırılır. Tüm oyunları görüntüleyerek yeniden erişebilirsiniz.", + "AhY0vJ": "Ayrıl ve izlemeyi bırak", + "egUE/K": "Seçilmiş kanallarda yayınlansın", + "Xm0L7N": "Bir durum güncellemesi gönderildiğinde ya da bir geçmiş değerlendirmesi yayınlandığında", + "iEtImk": "Bir oyundan ayrılıp{isFollowing, select, true { izlemeyi bıraktığınızda} other { }}, oyun sağ yan çubuktan kaldırılır. Oyuna tüm oyunları görüntüleyerek yeniden erişebilirsiniz.", + "cnfVhV": "Oyundan ayrıl{isFollowing, select, true { ve izlemeyi bırak } other {}}", + "Suyx6A": "Senaryo içe aktarılamadı. Lütfen JSOn dosyasının geçerli olduğunu denetleyip yeniden deneyin.", + "Q4sutg": "Ayrılmayı onayla{isFollowing, select, true { ve izlemeyi bırak} other {}}", + "QegBKq": "Senaryoya katıl", + "FgydNe": "Görüntüle", + "P6PLpi": "Katıl", + "qGlwfc": "Oyunu başlat", + "j2FnDV": "Bu adı taşıyan bir kanal eklenecek", + "iQhFxR": "Son kullanılma", + "03oqA2": "Süren oyunlar", + "KjNfA8": "Süre geçersiz", + "vqmRBs": "Oyunu yeniden başlatmayı onayla", + "k5EChD": "Oyunu yeniden başlatmak istediğinize emin misiniz?", + "Zg0obP": "Oyunu yeniden başlat" } diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 41959032e3..d7ce70a44f 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -7,7 +7,9 @@ "dependencies": { "@apollo/client": "3.5.10", "@floating-ui/react-dom-interactions": "0.6.3", - "@mattermost/compass-icons": "0.1.24", + "@mattermost/client": "7.1.0", + "@mattermost/compass-icons": "0.1.26", + "@mattermost/types": "7.1.0", "@mdi/js": "^6.5.95", "@mdi/react": "1.5.0", "@tippyjs/react": "4.2.6", @@ -20,7 +22,7 @@ "js-trim-multiline-string": "^1.0.8", "lodash": "4.17.21", "luxon": "2.3.1", - "mattermost-webapp": "github:mattermost/mattermost-webapp#6dcac2993000139f19c1b018f7fa6b9266973918", + "mattermost-webapp": "github:mattermost/mattermost-webapp#c00fde021889aaddfcd3afa5ce18254756fc4185", "parse-duration": "1.0.2", "qs": "6.10.2", "react": "16.13.1", @@ -30,7 +32,7 @@ "react-intl": "5.24.1", "react-redux": "7.2.6", "react-router-hash-link": "2.4.3", - "react-select": "3.2.0", + "react-select": "4.3.1", "react-use": "17.3.2", "redux": "4.1.2", "styled-components": "5.3.3", @@ -90,12 +92,13 @@ "css-loader": "6.5.1", "eslint": "8.6.0", "eslint-import-resolver-webpack": "0.13.2", - "eslint-plugin-formatjs": "2.20.1", + "eslint-plugin-formatjs": "4.0.2", "eslint-plugin-import": "2.25.4", "eslint-plugin-react": "7.28.0", "eslint-plugin-react-hooks": "4.3.0", "eslint-plugin-unused-imports": "2.0.0", "file-loader": "^6.2.0", + "identity-obj-proxy": "3.0.0", "image-webpack-loader": "^8.0.1", "jest": "27.4.7", "jest-canvas-mock": "2.3.1", @@ -109,6 +112,7 @@ "sass": "1.46.0", "sass-loader": "12.4.0", "style-loader": "3.3.1", + "ts-prune": "0.10.3", "webpack": "5.65.0", "webpack-cli": "4.9.1", "webpack-dev-server": "4.7.2" @@ -166,7 +170,6 @@ "node_modules/@babel/compat-data": { "version": "7.16.4", "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -174,7 +177,6 @@ "node_modules/@babel/core": { "version": "7.16.7", "integrity": "sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.7", @@ -237,7 +239,6 @@ "node_modules/@babel/helper-compilation-targets": { "version": "7.16.7", "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", - "dev": true, "dependencies": { "@babel/compat-data": "^7.16.4", "@babel/helper-validator-option": "^7.16.7", @@ -381,7 +382,6 @@ "node_modules/@babel/helper-module-transforms": { "version": "7.16.7", "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", - "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", @@ -410,7 +410,6 @@ "node_modules/@babel/helper-plugin-utils": { "version": "7.16.7", "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -446,7 +445,6 @@ "node_modules/@babel/helper-simple-access": { "version": "7.16.7", "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", - "dev": true, "dependencies": { "@babel/types": "^7.16.7" }, @@ -485,7 +483,6 @@ "node_modules/@babel/helper-validator-option": { "version": "7.16.7", "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -507,7 +504,6 @@ "node_modules/@babel/helpers": { "version": "7.16.7", "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", - "dev": true, "dependencies": { "@babel/template": "^7.16.7", "@babel/traverse": "^7.16.7", @@ -910,7 +906,6 @@ "node_modules/@babel/plugin-syntax-jsx": { "version": "7.16.7", "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1816,6 +1811,49 @@ "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/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/stylis": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", + "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" + }, "node_modules/@emotion/babel-utils": { "version": "0.6.10", "integrity": "sha512-/fnkM/LTEp3jKe++T0KyTszVGWNKPNOUJfjNKLO17BzQ6QPxgbg3whayom1Qr2oLFH3V92tDymU+dT5q676uow==", @@ -1862,57 +1900,25 @@ } }, "node_modules/@emotion/cache": { - "version": "10.0.29", - "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", - "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", - "integrity": "sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww==", - "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", - "integrity": "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==", + "version": "11.9.3", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.9.3.tgz", + "integrity": "sha512-0dgkI/JKlCXa+lEXviaMtGBL0ynpx4osh7rjOXE71q9bIF8G+XhJgvi+wDu0B0IdCVx37BffiwXlN9I3UuzFvg==", "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.1", + "@emotion/utils": "^1.0.0", + "@emotion/weak-memoize": "^0.2.5", + "stylis": "4.0.13" } }, - "node_modules/@emotion/css/node_modules/babel-plugin-emotion": { - "version": "10.2.2", - "integrity": "sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA==", - "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/@emotion/cache/node_modules/stylis": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", + "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" }, "node_modules/@emotion/hash": { "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, "node_modules/@emotion/is-prop-valid": { @@ -1926,24 +1932,48 @@ "version": "0.7.4", "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" }, - "node_modules/@emotion/serialize": { - "version": "0.11.16", - "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", + "node_modules/@emotion/react": { + "version": "11.9.3", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.9.3.tgz", + "integrity": "sha512-g9Q1GcTOlzOEjqwuLF/Zd9LC+4FljjPjDfxSM7KmEakm+hsHXk+bYZ2q+/hTJzr0OUNkujo72pXLQvXj6H+GJQ==", "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" + "@babel/runtime": "^7.13.10", + "@emotion/babel-plugin": "^11.7.1", + "@emotion/cache": "^11.9.3", + "@emotion/serialize": "^1.0.4", + "@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/serialize/node_modules/csstype": { - "version": "2.6.19", - "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==" + "node_modules/@emotion/serialize": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.4.tgz", + "integrity": "sha512-1JHamSpH8PIfFwAMryO2bNka+y8+KA5yga5Ocf2d7ZEiJjb7xlLW7aknBGZqJLajuLOvJ+72vN+IBSwPlXD1Pg==", + "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/sheet": { - "version": "0.9.4", - "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.1.tgz", + "integrity": "sha512-J3YPccVRMiTZxYAY0IOq3kd+hUP8idY8Kz6B/Cyo+JuXq52Ek+zbPbSQUrVQp95aJ+lsAW7DPL1P2Z+U1jGkKA==" }, "node_modules/@emotion/stylis": { "version": "0.8.5", @@ -1954,11 +1984,13 @@ "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, "node_modules/@emotion/utils": { - "version": "0.11.3", - "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" + "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/@endemolshinegroup/cosmiconfig-typescript-loader": { @@ -3793,6 +3825,36 @@ "node": ">=8" } }, + "node_modules/@mattermost/client": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@mattermost/client/-/client-7.1.0.tgz", + "integrity": "sha512-aCsBaMHQV9x76RhWU1gpKnJsy7bUE8jo8dCfe+dZQtUiMOm0lWmDIG7gOafaM2BJQSCFzUFpf9it0RLEsYWhwQ==", + "dependencies": { + "form-data": "^4.0.0" + }, + "peerDependencies": { + "@mattermost/types": "*", + "typescript": "^4.3" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@mattermost/client/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/@mattermost/compass-components": { "version": "0.2.12", "integrity": "sha512-45ObrULlchyH8cNwGbb18ifsBSMtKHFo/VxBIxl1tNvrhqgD+tNafvlz9pO+Xy+1yFkm/pZtYr2aqZpXGXeQ8Q==", @@ -3819,9 +3881,9 @@ } }, "node_modules/@mattermost/compass-icons": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/@mattermost/compass-icons/-/compass-icons-0.1.24.tgz", - "integrity": "sha512-UhLFbRPrgHvt2+lUwUq17Ecs6ag+NUtIH0T/zX6agYngvt+tUJZJ3Y2hTu+Dj4/3zeCTKCHkIhacWv6qGleU/A==", + "version": "0.1.26", + "resolved": "https://registry.npmjs.org/@mattermost/compass-icons/-/compass-icons-0.1.26.tgz", + "integrity": "sha512-HFhTW9yjpYWDEtjWlZ50BpgKYvdrngzwtgIz4G/ghl+BQkEbhDaM7m7hzNA1lzfdyIknu7WTqEbV8lTE6GZncQ==", "dependencies": { "esm": "3.2.25", "fontello-batch-cli": "4.0.0", @@ -3871,6 +3933,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@mattermost/types": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@mattermost/types/-/types-7.1.0.tgz", + "integrity": "sha512-SVw5oDXwflNdXUWzl3QuTT5npEddglq6bB+kqdHjowPopOv1Fxi4zJh08/LvaRJYQENEk1QnEVIRTNhnoV0/tg==", + "peerDependencies": { + "typescript": "^4.3" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/@mdi/js": { "version": "6.5.95", "integrity": "sha512-x/bwEoAGP+Mo10Dfk5audNIPi7Yz8ZBrILcbXLW3ShOI/njpgodzpgpC2WYK3D2ZSC392peRRemIFb/JsyzzYQ==" @@ -4132,6 +4207,18 @@ "node": ">=10.13.0" } }, + "node_modules/@ts-morph/common": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.12.3.tgz", + "integrity": "sha512-4tUmeLyXJnJWvTFOKtcNJ1yh0a3SsTLi2MUoyj8iUNznFRN1ZquaNe7Oukqrnki2FzZkm0J9adCNLDZxUzvj+w==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.7", + "minimatch": "^3.0.4", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + } + }, "node_modules/@types/babel__core": { "version": "7.1.18", "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==", @@ -4420,6 +4507,12 @@ "version": "4.0.0", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, + "node_modules/@types/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-O397rnSS9iQI4OirieAtsDqvCj4+3eY1J+EPdNTKuHuRWIfUoGyzX294o8C4KJYaLqgSrd2o60c5EqCU8Zv02g==", + "dev": true + }, "node_modules/@types/prettier": { "version": "2.4.2", "integrity": "sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==", @@ -4650,6 +4743,7 @@ }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", "integrity": "sha512-qT4lr2jysDQBQOPsCCvpPUZHjbABoTJW8V9ZzIYKHMfppJtpdtzszDYsldwhFxlhvrp7aCHeXD1Lb9M1zhwWwQ==", "dev": true, "dependencies": { @@ -4681,8 +4775,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "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" @@ -4696,6 +4791,7 @@ }, "node_modules/@typescript-eslint/experimental-utils": { "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.0.tgz", "integrity": "sha512-ZnLVjBrf26dn7ElyaSKa6uDhqwvAi4jBBmHK1VxuFGPRAxhdi18ubQYSGA7SRiFiES3q9JiBOBHEBStOFkwD2g==", "dev": true, "dependencies": { @@ -4761,6 +4857,7 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.9.0.tgz", "integrity": "sha512-uVCb9dJXpBrK1071ri5aEW7ZHdDHAiqEjYznF3HSSvAJXyrkxGOw2Ejibz/q6BXdT8lea8CMI0CzKNFTNI6TEQ==", "dev": true, "dependencies": { @@ -6067,7 +6164,6 @@ "node_modules/base64-js": { "version": "1.5.1", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, "funding": [ { "type": "github", @@ -7327,6 +7423,12 @@ "node": ">= 0.12.0" } }, + "node_modules/code-block-writer": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-11.0.3.tgz", + "integrity": "sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==", + "dev": true + }, "node_modules/code-point-at": { "version": "1.1.0", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", @@ -7406,10 +7508,6 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "node_modules/component-emitter": { - "version": "1.3.0", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, "node_modules/compressible": { "version": "2.0.18", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", @@ -7551,10 +7649,6 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, - "node_modules/cookiejar": { - "version": "2.1.3", - "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" - }, "node_modules/copy-to-clipboard": { "version": "3.3.1", "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", @@ -8055,8 +8149,9 @@ "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" }, "node_modules/debug": { - "version": "4.3.3", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -8775,8 +8870,8 @@ }, "node_modules/dynamic-virtualized-list": { "version": "1.0.0-beta", - "resolved": "git+ssh://git@github.com/mattermost/dynamic-virtualized-list.git#119db968c96643c7106d4d2c965f05b2e251bc83", - "integrity": "sha512-oo2K033DnVTJYDuUC6hknxfxLfxqGcRFxyBpkT4ZYTit1RQ8tMRt+ApD/rvKotECsH7/L6qvf+oHiH5N2ceIRQ==", + "resolved": "git+ssh://git@github.com/mattermost/dynamic-virtualized-list.git#77a0cb4c565bc239bab1ce5414b95bdd9a570963", + "integrity": "sha512-/Q5gwOK+wgHMaOH03DbgBXBpnJHORoHgRNDxsYoJ5R4GxDS4dk5xkAC7h6t/HPDLFzdobTkfXypd5o8gOybejQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.0.0", @@ -8857,9 +8952,9 @@ "integrity": "sha512-Aqj3Km5e4Q8an0cOASP0T1S/+StnIrPQc9Y7Mg2x2LtkwvmoVQO3UaaF9Cj8yi4o8yOPc6GoIKeg95WJTzWzhw==" }, "node_modules/emoji-regex": { - "version": "9.2.2", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.1.0.tgz", + "integrity": "sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg==" }, "node_modules/emojis-list": { "version": "3.0.0", @@ -9291,28 +9386,95 @@ } }, "node_modules/eslint-plugin-formatjs": { - "version": "2.20.1", - "integrity": "sha512-9WB0aqr49DOlLYCK67vQcUqtUOdVvkHKxEa3SGstXVHy02bmfpEROIU/VEWSNYfyer1nck3rZucXOgaB7KIksQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-formatjs/-/eslint-plugin-formatjs-4.0.2.tgz", + "integrity": "sha512-6tEtLtH4N39pnYp5MjelxHDdohU6yMp5fmXqQq4Uu8MAbkAWAiufNKXfFdLSjuPa0lY5x/ExXKJHr1NJsZtzVA==", + "dev": true, + "dependencies": { + "@formatjs/icu-messageformat-parser": "2.1.4", + "@formatjs/ts-transformer": "3.9.9", + "@types/eslint": "7 || 8", + "@types/picomatch": "^2.3.0", + "@typescript-eslint/typescript-estree": "^5.9.1", + "emoji-regex": "^10.0.0", + "picomatch": "^2.3.1", + "tslib": "2.4.0", + "typescript": "^4.5" + }, + "peerDependencies": { + "eslint": "7 || 8" + } + }, + "node_modules/eslint-plugin-formatjs/node_modules/@formatjs/ecma402-abstract": { + "version": "1.11.8", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.8.tgz", + "integrity": "sha512-fgLqyWlwmTEuqV/TSLEL/t9JOmHNLFvCdgzXB0jc2w+WOItPCOJ1T0eyN6fQBQKRPfSqqNlu+kWj7ijcOVTVVQ==", "dev": true, "dependencies": { - "@formatjs/icu-messageformat-parser": "2.0.16", - "@formatjs/ts-transformer": "3.8.1", - "@types/eslint": "8", - "@typescript-eslint/typescript-estree": "^4.11.0", - "emoji-regex": "^9.2.0", - "tslib": "^2.1.0", + "@formatjs/intl-localematcher": "0.2.28", + "tslib": "2.4.0" + } + }, + "node_modules/eslint-plugin-formatjs/node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.4.tgz", + "integrity": "sha512-3PqMvKWV1oyok0BuiXUAHIaotdhdTJw6OICqCZbfUgKT+ZRwRWO4IlCgvXJeCITaKS5p+PY0XXKjf/vUyIpWjQ==", + "dev": true, + "dependencies": { + "@formatjs/ecma402-abstract": "1.11.8", + "@formatjs/icu-skeleton-parser": "1.3.10", + "tslib": "2.4.0" + } + }, + "node_modules/eslint-plugin-formatjs/node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.10.tgz", + "integrity": "sha512-kXJmtLDqFF5aLTf8IxdJXnhrIX1Qb4Qp3a9jqRecGDYfzOa9hMhi9U0nKyhrJJ4cXxBzptcgb+LWkyeHL6nlBQ==", + "dev": true, + "dependencies": { + "@formatjs/ecma402-abstract": "1.11.8", + "tslib": "2.4.0" + } + }, + "node_modules/eslint-plugin-formatjs/node_modules/@formatjs/intl-localematcher": { + "version": "0.2.28", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.28.tgz", + "integrity": "sha512-FLsc6Gifs1np/8HnCn/7Q+lHMmenrD5fuDhRT82yj0gi9O19kfaFwjQUw1gZsyILuRyT93GuzdifHj7TKRhBcw==", + "dev": true, + "dependencies": { + "tslib": "2.4.0" + } + }, + "node_modules/eslint-plugin-formatjs/node_modules/@formatjs/ts-transformer": { + "version": "3.9.9", + "resolved": "https://registry.npmjs.org/@formatjs/ts-transformer/-/ts-transformer-3.9.9.tgz", + "integrity": "sha512-V5BDpn5XW1wWBkpDn5SFHRH4Ndf3oyjxmuqWMxe2EwOKkV4XJvzZI73k3p/Hut3Xg55AxBQQmkFK9hyeBJPyIg==", + "dev": true, + "dependencies": { + "@formatjs/icu-messageformat-parser": "2.1.4", + "@types/json-stable-stringify": "^1.0.32", + "@types/node": "14 || 16 || 17", + "chalk": "^4.0.0", + "json-stable-stringify": "^1.0.1", + "tslib": "2.4.0", "typescript": "^4.5" }, "peerDependencies": { - "eslint": "8" + "ts-jest": "27 || 28" + }, + "peerDependenciesMeta": { + "ts-jest": { + "optional": true + } } }, "node_modules/eslint-plugin-formatjs/node_modules/@typescript-eslint/types": { - "version": "4.33.0", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.6.tgz", + "integrity": "sha512-HdnP8HioL1F7CwVmT4RaaMX57RrfqsOMclZc08wGMiDYJBsLGBM7JwXM4cZJmbWLzIR/pXg1kkrBBVpxTOwfUg==", "dev": true, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -9320,20 +9482,21 @@ } }, "node_modules/eslint-plugin-formatjs/node_modules/@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.6.tgz", + "integrity": "sha512-Z7TgPoeYUm06smfEfYF0RBkpF8csMyVnqQbLYiGgmUSTaSXTP57bt8f0UFXstbGxKIreTwQCujtaH0LY9w9B+A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/visitor-keys": "5.30.6", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", "tsutils": "^3.21.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -9346,32 +9509,84 @@ } }, "node_modules/eslint-plugin-formatjs/node_modules/@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.6.tgz", + "integrity": "sha512-41OiCjdL2mCaSDi2SvYbzFLlqqlm5v1ZW9Ym55wXKL/Rx6OOB1IbuFGo71Fj6Xy90gJDFTlgOS+vbmtGHPTQQA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "5.30.6", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/eslint-plugin-formatjs/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "node_modules/eslint-plugin-formatjs/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-plugin-formatjs/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-plugin-formatjs/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-plugin-formatjs/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-plugin-formatjs/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-plugin-formatjs/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "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" @@ -9383,6 +9598,24 @@ "node": ">=10" } }, + "node_modules/eslint-plugin-formatjs/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-plugin-formatjs/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/eslint-plugin-formatjs/node_modules/typescript": { "version": "4.5.4", "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", @@ -9580,8 +9813,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.1.0", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "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" @@ -10248,8 +10482,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.7", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -10259,7 +10494,7 @@ "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, "node_modules/fast-glob/node_modules/glob-parent": { @@ -10281,10 +10516,6 @@ "version": "2.0.6", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" - }, "node_modules/fast-shallow-equal": { "version": "1.0.0", "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==" @@ -10641,6 +10872,7 @@ "node_modules/form-data": { "version": "3.0.1", "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -10675,14 +10907,6 @@ "node": ">= 12" } }, - "node_modules/formidable": { - "version": "1.2.6", - "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", - "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - } - }, "node_modules/forwarded": { "version": "0.2.0", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", @@ -10822,7 +11046,6 @@ "node_modules/gensync": { "version": "1.0.0-beta.2", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -11042,15 +11265,16 @@ } }, "node_modules/globby": { - "version": "11.0.4", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "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", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { @@ -11240,6 +11464,12 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "dev": true + }, "node_modules/has": { "version": "1.0.3", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", @@ -11376,8 +11606,9 @@ } }, "node_modules/highlight.js": { - "version": "11.5.0", - "integrity": "sha512-SM6WDj5/C+VfIY8pZ6yW6Xa0Fm1tniYVYWYW1Q/DcMnISZFrC3aQAZZZFAAZtybKNrGId3p/DNbFTtcTXXgYBw==", + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.5.1.tgz", + "integrity": "sha512-LKzHqnxr4CrD2YsNoIf/o5nJ09j4yi/GcH5BnYz9UnVpZdS4ucMgvP61TDty5xJcFGRjnH4DpujkS9bHT3hq0Q==", "engines": { "node": ">=12.0.0" } @@ -11643,10 +11874,21 @@ "postcss": "^8.1.0" } }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "dev": true, + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/ieee754": { "version": "1.2.1", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, "funding": [ { "type": "github", @@ -12087,8 +12329,9 @@ } }, "node_modules/inobounce": { - "version": "0.2.0", - "integrity": "sha512-eJt1MQEqLKanAFEE5DkSF36d9uyg8kLb/R6ysEF7udJOM5JZXidkhhGv6WoWbEcVdyRqZfYMjv6XbSIz7tD4CQ==" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/inobounce/-/inobounce-0.2.1.tgz", + "integrity": "sha512-dmKhRDbUS3zGD8HDGchsZBuxaXnfFM+2jXrZpnEnBToEWCgcs3lBfCQe0wzkbpIoJwU/lufaMquSyWoX8OXTRw==" }, "node_modules/inquirer": { "version": "8.2.0", @@ -14722,7 +14965,6 @@ "node_modules/json5": { "version": "2.2.0", "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, "dependencies": { "minimist": "^1.2.5" }, @@ -15686,43 +15928,46 @@ "node_modules/mattermost-webapp": { "name": "@mattermost/webapp", "version": "5.36.0-0", - "resolved": "git+ssh://git@github.com/mattermost/mattermost-webapp.git#6dcac2993000139f19c1b018f7fa6b9266973918", + "resolved": "git+ssh://git@github.com/mattermost/mattermost-webapp.git#c00fde021889aaddfcd3afa5ce18254756fc4185", "workspaces": [ + "packages/client", "packages/types" ], "dependencies": { + "@floating-ui/react-dom": "0.7.1", "@mattermost/compass-components": "^0.2.12", "@mattermost/compass-icons": "0.1.22", "@stripe/react-stripe-js": "1.6.0", "@stripe/stripe-js": "1.20.3", "@tippyjs/react": "4.2.6", "bootstrap": "3.4.1", + "buffer": "6.0.3", "chart.js": "2.9.4", "classnames": "2.3.1", - "core-js": "3.21.1", + "core-js": "3.22.7", "country-list": "2.2.0", "crypto-browserify": "3.12.0", "css-vars-ponyfill": "2.4.7", - "dynamic-virtualized-list": "github:mattermost/dynamic-virtualized-list#119db968c96643c7106d4d2c965f05b2e251bc83", + "dynamic-virtualized-list": "github:mattermost/dynamic-virtualized-list#77a0cb4c565bc239bab1ce5414b95bdd9a570963", "emoji-datasource": "6.1.1", "emoji-datasource-apple": "6.0.1", - "emoji-regex": "10.0.1", + "emoji-regex": "10.1.0", "exif2css": "1.3.0", "fast-deep-equal": "3.1.3", "flexsearch": "0.6.32", "font-awesome": "4.7.0", "gfycat-sdk": "1.4.18", - "highlight.js": "11.5.0", + "highlight.js": "11.5.1", "hoist-non-react-statics": "3.3.2", "html-to-react": "1.4.8", - "inobounce": "0.2.0", + "inobounce": "0.2.1", "jasny-bootstrap": "3.1.3", "katex": "0.13.11", "key-mirror": "1.0.1", "localforage": "1.10.0", "localforage-observable": "2.1.1", "lodash": "4.17.21", - "luxon": "2.3.1", + "luxon": "2.4.0", "mark.js": "8.11.1", "marked": "github:mattermost/marked#2ef7f28cc7718e3f551c4ce9ea75fdd7580c2008", "memoize-one": "5.2.1", @@ -15731,7 +15976,7 @@ "pdfjs-dist": "2.1.266", "popper.js": "1.16.1", "process": "0.11.10", - "prop-types": "15.7.2", + "prop-types": "15.8.1", "react": "16.13.1", "react-beautiful-dnd": "13.1.0", "react-bootstrap": "github:mattermost/react-bootstrap#c6957962364e0818a51bbfd13e89919903b422d6", @@ -15750,7 +15995,7 @@ "react-select": "2.4.4", "react-transition-group": "4.4.2", "react-virtualized-auto-sizer": "1.0.6", - "react-window": "1.8.6", + "react-window": "1.8.7", "react-window-infinite-loader": "1.0.7", "rebound": "0.1.0", "redux": "4.1.0", @@ -15760,13 +16005,12 @@ "regenerator-runtime": "0.13.9", "rudder-sdk-js": "1.0.16", "sass": "1.35.1", - "semver": "7.3.5", + "semver": "7.3.7", "serialize-error": "8.0.1", "shallow-equals": "1.0.0", "smooth-scroll-into-view-if-needed": "1.1.33", "stream-browserify": "3.0.0", "styled-components": "5.3.5", - "superagent": "6.1.0", "timezones.json": "1.6.1", "tinycolor2": "1.4.2", "typescript": "4.3.4", @@ -15888,6 +16132,29 @@ "csstype": "^3.0.2" } }, + "node_modules/mattermost-webapp/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/mattermost-webapp/node_modules/chart.js": { "version": "2.9.4", "integrity": "sha512-B07aAzxcrikjAPyV+01j7BmOpxtQETxTSlQ26BEYJ+3iUkbNKaOJ/nDbT6JjyqYxseM0ON12COHYdU2cTIjC7A==", @@ -15897,8 +16164,10 @@ } }, "node_modules/mattermost-webapp/node_modules/core-js": { - "version": "3.21.1", - "integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==", + "version": "3.22.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.7.tgz", + "integrity": "sha512-Jt8SReuDKVNZnZEzyEQT5eK6T2RRCXkfTq7Lo09kpm+fHjgGewSbNjV+Wt4yZMhPDdzz2x1ulI5z/w4nxpBseg==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -15920,10 +16189,6 @@ "@babel/runtime": "^7.1.2" } }, - "node_modules/mattermost-webapp/node_modules/emoji-regex": { - "version": "10.0.1", - "integrity": "sha512-cLuZzriSWVE+rllzeq4zpUEoCPfYEbQ6ZVhIq+ed6ynWST7Bw9XnOr+bKWgCup4paq72DI21gw9M3aaFkm4HAw==" - }, "node_modules/mattermost-webapp/node_modules/intl-messageformat": { "version": "9.9.1", "integrity": "sha512-cuzS/XKHn//hvKka77JKU2dseiVY2dofQjIOZv6ZFxFt4Z9sPXnZ7KQ9Ak2r+4XBCjI04MqJ1PhKs/3X22AkfA==", @@ -15933,6 +16198,14 @@ "tslib": "^2.1.0" } }, + "node_modules/mattermost-webapp/node_modules/luxon": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.4.0.tgz", + "integrity": "sha512-w+NAwWOUL5hO0SgwOHsMBAmZ15SoknmQXhSO0hIbJCAmPKSsGeK8MlmhYh2w6Iib38IxN2M+/ooXWLbeis7GuA==", + "engines": { + "node": ">=12" + } + }, "node_modules/mattermost-webapp/node_modules/needle": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/needle/-/needle-3.0.0.tgz", @@ -15965,15 +16238,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mattermost-webapp/node_modules/prop-types": { - "version": "15.7.2", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, "node_modules/mattermost-webapp/node_modules/react-bootstrap": { "version": "0.32.4", "resolved": "git+ssh://git@github.com/mattermost/react-bootstrap.git#c6957962364e0818a51bbfd13e89919903b422d6", @@ -16156,8 +16420,9 @@ } }, "node_modules/mattermost-webapp/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -16316,6 +16581,7 @@ "node_modules/methods": { "version": "1.1.2", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true, "engines": { "node": ">= 0.6" } @@ -16347,16 +16613,6 @@ "version": "4.12.0", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, - "node_modules/mime": { - "version": "2.6.0", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/mime-db": { "version": "1.51.0", "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", @@ -17527,6 +17783,12 @@ "tslib": "^2.0.3" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, "node_modules/path-case": { "version": "3.0.4", "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", @@ -18741,13 +19003,13 @@ } }, "node_modules/react-select": { - "version": "3.2.0", - "integrity": "sha512-B/q3TnCZXEKItO0fFN/I0tWOX3WJvi/X2wtdffmwSQVRwg5BpValScTO1vdic9AxlUgmeSzib2hAZAwIUQUZGQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-4.3.1.tgz", + "integrity": "sha512-HBBd0dYwkF5aZk1zP81Wx5UsLIIT2lSvAY2JiJo199LjoLHoivjn9//KsmvQMEFGNhe58xyuOITjfxKCcGc62Q==", "dependencies": { - "@babel/runtime": "^7.4.4", - "@emotion/cache": "^10.0.9", - "@emotion/core": "^10.0.9", - "@emotion/css": "^10.0.9", + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.1.1", "memoize-one": "^5.0.0", "prop-types": "^15.6.0", "react-input-autosize": "^3.0.0", @@ -18873,8 +19135,9 @@ } }, "node_modules/react-window": { - "version": "1.8.6", - "integrity": "sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==", + "version": "1.8.7", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.7.tgz", + "integrity": "sha512-JHEZbPXBpKMmoNO1bNhoXOOLg/ujhL/BU4IqVU9r8eQPcy5KQnGHIHDRkJ0ns9IM5+Aq5LNwt3j8t3tIrePQzA==", "dependencies": { "@babel/runtime": "^7.0.0", "memoize-one": ">=3.1.1 <6" @@ -18883,8 +19146,8 @@ "node": ">8.0.0" }, "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0", - "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0" + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/react-window-infinite-loader": { @@ -19787,7 +20050,6 @@ "node_modules/semver": { "version": "6.3.0", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -20700,40 +20962,6 @@ "node": ">=0.10.0" } }, - "node_modules/superagent": { - "version": "6.1.0", - "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", - "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", - "dependencies": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.2", - "debug": "^4.1.1", - "fast-safe-stringify": "^2.0.7", - "form-data": "^3.0.0", - "formidable": "^1.2.2", - "methods": "^1.1.2", - "mime": "^2.4.6", - "qs": "^6.9.4", - "readable-stream": "^3.6.0", - "semver": "^7.3.2" - }, - "engines": { - "node": ">= 7.0.0" - } - }, - "node_modules/superagent/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/supports-color": { "version": "5.5.0", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", @@ -21260,6 +21488,15 @@ "node": ">=0.10.0" } }, + "node_modules/true-myth": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/true-myth/-/true-myth-4.1.1.tgz", + "integrity": "sha512-rqy30BSpxPznbbTcAcci90oZ1YR4DqvKcNXNerG5gQBU2v4jk0cygheiul5J6ExIMrgDVuanv/MkGfqZbKrNNg==", + "dev": true, + "engines": { + "node": "10.* || >= 12.*" + } + }, "node_modules/ts-easing": { "version": "0.2.0", "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==" @@ -21279,6 +21516,16 @@ "integrity": "sha512-DEQrfv6l7IvN2jlzc/VTdZJYsWUnQNCsueYjMkC/iXoEoi5fNan6MjeDqkvhfzbmHgdz9UxDUluX3V5HdjTydQ==", "dev": true }, + "node_modules/ts-morph": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-13.0.3.tgz", + "integrity": "sha512-pSOfUMx8Ld/WUreoSzvMFQG5i9uEiWIsBYjpU9+TTASOeUa89j5HykomeqVULm1oqWtBdleI3KEFRLrlA3zGIw==", + "dev": true, + "dependencies": { + "@ts-morph/common": "~0.12.3", + "code-block-writer": "^11.0.0" + } + }, "node_modules/ts-node": { "version": "9.1.1", "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", @@ -21304,6 +21551,66 @@ "typescript": ">=2.7" } }, + "node_modules/ts-prune": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/ts-prune/-/ts-prune-0.10.3.tgz", + "integrity": "sha512-iS47YTbdIcvN8Nh/1BFyziyUqmjXz7GVzWu02RaZXqb+e/3Qe1B7IQ4860krOeCGUeJmterAlaM2FRH0Ue0hjw==", + "dev": true, + "dependencies": { + "commander": "^6.2.1", + "cosmiconfig": "^7.0.1", + "json5": "^2.1.3", + "lodash": "^4.17.21", + "true-myth": "^4.1.0", + "ts-morph": "^13.0.1" + }, + "bin": { + "ts-prune": "lib/index.js" + } + }, + "node_modules/ts-prune/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/ts-prune/node_modules/cosmiconfig": { + "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", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-prune/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/tsconfig-paths": { "version": "3.12.0", "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", @@ -22715,13 +23022,11 @@ }, "@babel/compat-data": { "version": "7.16.4", - "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", - "dev": true + "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==" }, "@babel/core": { "version": "7.16.7", "integrity": "sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.7", @@ -22768,7 +23073,6 @@ "@babel/helper-compilation-targets": { "version": "7.16.7", "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", - "dev": true, "requires": { "@babel/compat-data": "^7.16.4", "@babel/helper-validator-option": "^7.16.7", @@ -22870,7 +23174,6 @@ "@babel/helper-module-transforms": { "version": "7.16.7", "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", - "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", @@ -22892,8 +23195,7 @@ }, "@babel/helper-plugin-utils": { "version": "7.16.7", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "dev": true + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" }, "@babel/helper-remap-async-to-generator": { "version": "7.16.7", @@ -22920,7 +23222,6 @@ "@babel/helper-simple-access": { "version": "7.16.7", "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -22946,8 +23247,7 @@ }, "@babel/helper-validator-option": { "version": "7.16.7", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" }, "@babel/helper-wrap-function": { "version": "7.16.7", @@ -22963,7 +23263,6 @@ "@babel/helpers": { "version": "7.16.7", "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", - "dev": true, "requires": { "@babel/template": "^7.16.7", "@babel/traverse": "^7.16.7", @@ -23219,7 +23518,6 @@ "@babel/plugin-syntax-jsx": { "version": "7.16.7", "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -23816,6 +24114,42 @@ "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", "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==" + }, + "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==" + }, + "stylis": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", + "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" + } + } + }, "@emotion/babel-utils": { "version": "0.6.10", "integrity": "sha512-/fnkM/LTEp3jKe++T0KyTszVGWNKPNOUJfjNKLO17BzQ6QPxgbg3whayom1Qr2oLFH3V92tDymU+dT5q676uow==", @@ -23861,56 +24195,27 @@ } }, "@emotion/cache": { - "version": "10.0.29", - "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", + "version": "11.9.3", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.9.3.tgz", + "integrity": "sha512-0dgkI/JKlCXa+lEXviaMtGBL0ynpx4osh7rjOXE71q9bIF8G+XhJgvi+wDu0B0IdCVx37BffiwXlN9I3UuzFvg==", "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", - "integrity": "sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww==", - "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", - "integrity": "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==", - "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.1", + "@emotion/utils": "^1.0.0", + "@emotion/weak-memoize": "^0.2.5", + "stylis": "4.0.13" }, "dependencies": { - "babel-plugin-emotion": { - "version": "10.2.2", - "integrity": "sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA==", - "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" - } + "stylis": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", + "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" } } }, "@emotion/hash": { "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, "@emotion/is-prop-valid": { @@ -23924,26 +24229,36 @@ "version": "0.7.4", "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" }, + "@emotion/react": { + "version": "11.9.3", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.9.3.tgz", + "integrity": "sha512-g9Q1GcTOlzOEjqwuLF/Zd9LC+4FljjPjDfxSM7KmEakm+hsHXk+bYZ2q+/hTJzr0OUNkujo72pXLQvXj6H+GJQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@emotion/babel-plugin": "^11.7.1", + "@emotion/cache": "^11.9.3", + "@emotion/serialize": "^1.0.4", + "@emotion/utils": "^1.1.0", + "@emotion/weak-memoize": "^0.2.5", + "hoist-non-react-statics": "^3.3.1" + } + }, "@emotion/serialize": { - "version": "0.11.16", - "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.4.tgz", + "integrity": "sha512-1JHamSpH8PIfFwAMryO2bNka+y8+KA5yga5Ocf2d7ZEiJjb7xlLW7aknBGZqJLajuLOvJ+72vN+IBSwPlXD1Pg==", "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" - }, - "dependencies": { - "csstype": { - "version": "2.6.19", - "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==" - } + "@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", - "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.1.tgz", + "integrity": "sha512-J3YPccVRMiTZxYAY0IOq3kd+hUP8idY8Kz6B/Cyo+JuXq52Ek+zbPbSQUrVQp95aJ+lsAW7DPL1P2Z+U1jGkKA==" }, "@emotion/stylis": { "version": "0.8.5", @@ -23954,11 +24269,13 @@ "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, "@emotion/utils": { - "version": "0.11.3", - "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" + "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==" }, "@endemolshinegroup/cosmiconfig-typescript-loader": { @@ -25338,6 +25655,26 @@ } } }, + "@mattermost/client": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@mattermost/client/-/client-7.1.0.tgz", + "integrity": "sha512-aCsBaMHQV9x76RhWU1gpKnJsy7bUE8jo8dCfe+dZQtUiMOm0lWmDIG7gOafaM2BJQSCFzUFpf9it0RLEsYWhwQ==", + "requires": { + "form-data": "^4.0.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, "@mattermost/compass-components": { "version": "0.2.12", "integrity": "sha512-45ObrULlchyH8cNwGbb18ifsBSMtKHFo/VxBIxl1tNvrhqgD+tNafvlz9pO+Xy+1yFkm/pZtYr2aqZpXGXeQ8Q==", @@ -25357,9 +25694,9 @@ } }, "@mattermost/compass-icons": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/@mattermost/compass-icons/-/compass-icons-0.1.24.tgz", - "integrity": "sha512-UhLFbRPrgHvt2+lUwUq17Ecs6ag+NUtIH0T/zX6agYngvt+tUJZJ3Y2hTu+Dj4/3zeCTKCHkIhacWv6qGleU/A==", + "version": "0.1.26", + "resolved": "https://registry.npmjs.org/@mattermost/compass-icons/-/compass-icons-0.1.26.tgz", + "integrity": "sha512-HFhTW9yjpYWDEtjWlZ50BpgKYvdrngzwtgIz4G/ghl+BQkEbhDaM7m7hzNA1lzfdyIknu7WTqEbV8lTE6GZncQ==", "requires": { "esm": "3.2.25", "fontello-batch-cli": "4.0.0", @@ -25399,6 +25736,12 @@ } } }, + "@mattermost/types": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@mattermost/types/-/types-7.1.0.tgz", + "integrity": "sha512-SVw5oDXwflNdXUWzl3QuTT5npEddglq6bB+kqdHjowPopOv1Fxi4zJh08/LvaRJYQENEk1QnEVIRTNhnoV0/tg==", + "requires": {} + }, "@mdi/js": { "version": "6.5.95", "integrity": "sha512-x/bwEoAGP+Mo10Dfk5audNIPi7Yz8ZBrILcbXLW3ShOI/njpgodzpgpC2WYK3D2ZSC392peRRemIFb/JsyzzYQ==" @@ -25554,6 +25897,18 @@ "dev": true, "optional": true }, + "@ts-morph/common": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.12.3.tgz", + "integrity": "sha512-4tUmeLyXJnJWvTFOKtcNJ1yh0a3SsTLi2MUoyj8iUNznFRN1ZquaNe7Oukqrnki2FzZkm0J9adCNLDZxUzvj+w==", + "dev": true, + "requires": { + "fast-glob": "^3.2.7", + "minimatch": "^3.0.4", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + } + }, "@types/babel__core": { "version": "7.1.18", "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==", @@ -25841,6 +26196,12 @@ "version": "4.0.0", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, + "@types/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-O397rnSS9iQI4OirieAtsDqvCj4+3eY1J+EPdNTKuHuRWIfUoGyzX294o8C4KJYaLqgSrd2o60c5EqCU8Zv02g==", + "dev": true + }, "@types/prettier": { "version": "2.4.2", "integrity": "sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==", @@ -26075,6 +26436,7 @@ }, "@typescript-eslint/eslint-plugin": { "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", "integrity": "sha512-qT4lr2jysDQBQOPsCCvpPUZHjbABoTJW8V9ZzIYKHMfppJtpdtzszDYsldwhFxlhvrp7aCHeXD1Lb9M1zhwWwQ==", "dev": true, "requires": { @@ -26090,8 +26452,9 @@ }, "dependencies": { "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "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" @@ -26101,6 +26464,7 @@ }, "@typescript-eslint/experimental-utils": { "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.0.tgz", "integrity": "sha512-ZnLVjBrf26dn7ElyaSKa6uDhqwvAi4jBBmHK1VxuFGPRAxhdi18ubQYSGA7SRiFiES3q9JiBOBHEBStOFkwD2g==", "dev": true, "requires": { @@ -26134,6 +26498,7 @@ }, "@typescript-eslint/type-utils": { "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.9.0.tgz", "integrity": "sha512-uVCb9dJXpBrK1071ri5aEW7ZHdDHAiqEjYznF3HSSvAJXyrkxGOw2Ejibz/q6BXdT8lea8CMI0CzKNFTNI6TEQ==", "dev": true, "requires": { @@ -27159,8 +27524,7 @@ }, "base64-js": { "version": "1.5.1", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "batch": { "version": "0.6.1", @@ -28176,6 +28540,12 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, + "code-block-writer": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-11.0.3.tgz", + "integrity": "sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==", + "dev": true + }, "code-point-at": { "version": "1.1.0", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", @@ -28237,10 +28607,6 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "component-emitter": { - "version": "1.3.0", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, "compressible": { "version": "2.0.18", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", @@ -28354,10 +28720,6 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, - "cookiejar": { - "version": "2.1.3", - "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" - }, "copy-to-clipboard": { "version": "3.3.1", "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", @@ -28772,8 +29134,9 @@ "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" }, "debug": { - "version": "4.3.3", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } @@ -29334,9 +29697,9 @@ "dev": true }, "dynamic-virtualized-list": { - "version": "git+ssh://git@github.com/mattermost/dynamic-virtualized-list.git#119db968c96643c7106d4d2c965f05b2e251bc83", - "integrity": "sha512-oo2K033DnVTJYDuUC6hknxfxLfxqGcRFxyBpkT4ZYTit1RQ8tMRt+ApD/rvKotECsH7/L6qvf+oHiH5N2ceIRQ==", - "from": "dynamic-virtualized-list@github:mattermost/dynamic-virtualized-list#119db968c96643c7106d4d2c965f05b2e251bc83", + "version": "git+ssh://git@github.com/mattermost/dynamic-virtualized-list.git#77a0cb4c565bc239bab1ce5414b95bdd9a570963", + "integrity": "sha512-/Q5gwOK+wgHMaOH03DbgBXBpnJHORoHgRNDxsYoJ5R4GxDS4dk5xkAC7h6t/HPDLFzdobTkfXypd5o8gOybejQ==", + "from": "dynamic-virtualized-list@github:mattermost/dynamic-virtualized-list#77a0cb4c565bc239bab1ce5414b95bdd9a570963", "requires": { "@babel/runtime": "^7.0.0", "memoize-one": "^3.1.1" @@ -29404,9 +29767,9 @@ "integrity": "sha512-Aqj3Km5e4Q8an0cOASP0T1S/+StnIrPQc9Y7Mg2x2LtkwvmoVQO3UaaF9Cj8yi4o8yOPc6GoIKeg95WJTzWzhw==" }, "emoji-regex": { - "version": "9.2.2", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.1.0.tgz", + "integrity": "sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg==" }, "emojis-list": { "version": "3.0.0", @@ -29841,60 +30204,172 @@ } }, "eslint-plugin-formatjs": { - "version": "2.20.1", - "integrity": "sha512-9WB0aqr49DOlLYCK67vQcUqtUOdVvkHKxEa3SGstXVHy02bmfpEROIU/VEWSNYfyer1nck3rZucXOgaB7KIksQ==", - "dev": true, - "requires": { - "@formatjs/icu-messageformat-parser": "2.0.16", - "@formatjs/ts-transformer": "3.8.1", - "@types/eslint": "8", - "@typescript-eslint/typescript-estree": "^4.11.0", - "emoji-regex": "^9.2.0", - "tslib": "^2.1.0", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-formatjs/-/eslint-plugin-formatjs-4.0.2.tgz", + "integrity": "sha512-6tEtLtH4N39pnYp5MjelxHDdohU6yMp5fmXqQq4Uu8MAbkAWAiufNKXfFdLSjuPa0lY5x/ExXKJHr1NJsZtzVA==", + "dev": true, + "requires": { + "@formatjs/icu-messageformat-parser": "2.1.4", + "@formatjs/ts-transformer": "3.9.9", + "@types/eslint": "7 || 8", + "@types/picomatch": "^2.3.0", + "@typescript-eslint/typescript-estree": "^5.9.1", + "emoji-regex": "^10.0.0", + "picomatch": "^2.3.1", + "tslib": "2.4.0", "typescript": "^4.5" }, "dependencies": { + "@formatjs/ecma402-abstract": { + "version": "1.11.8", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.8.tgz", + "integrity": "sha512-fgLqyWlwmTEuqV/TSLEL/t9JOmHNLFvCdgzXB0jc2w+WOItPCOJ1T0eyN6fQBQKRPfSqqNlu+kWj7ijcOVTVVQ==", + "dev": true, + "requires": { + "@formatjs/intl-localematcher": "0.2.28", + "tslib": "2.4.0" + } + }, + "@formatjs/icu-messageformat-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.4.tgz", + "integrity": "sha512-3PqMvKWV1oyok0BuiXUAHIaotdhdTJw6OICqCZbfUgKT+ZRwRWO4IlCgvXJeCITaKS5p+PY0XXKjf/vUyIpWjQ==", + "dev": true, + "requires": { + "@formatjs/ecma402-abstract": "1.11.8", + "@formatjs/icu-skeleton-parser": "1.3.10", + "tslib": "2.4.0" + } + }, + "@formatjs/icu-skeleton-parser": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.10.tgz", + "integrity": "sha512-kXJmtLDqFF5aLTf8IxdJXnhrIX1Qb4Qp3a9jqRecGDYfzOa9hMhi9U0nKyhrJJ4cXxBzptcgb+LWkyeHL6nlBQ==", + "dev": true, + "requires": { + "@formatjs/ecma402-abstract": "1.11.8", + "tslib": "2.4.0" + } + }, + "@formatjs/intl-localematcher": { + "version": "0.2.28", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.28.tgz", + "integrity": "sha512-FLsc6Gifs1np/8HnCn/7Q+lHMmenrD5fuDhRT82yj0gi9O19kfaFwjQUw1gZsyILuRyT93GuzdifHj7TKRhBcw==", + "dev": true, + "requires": { + "tslib": "2.4.0" + } + }, + "@formatjs/ts-transformer": { + "version": "3.9.9", + "resolved": "https://registry.npmjs.org/@formatjs/ts-transformer/-/ts-transformer-3.9.9.tgz", + "integrity": "sha512-V5BDpn5XW1wWBkpDn5SFHRH4Ndf3oyjxmuqWMxe2EwOKkV4XJvzZI73k3p/Hut3Xg55AxBQQmkFK9hyeBJPyIg==", + "dev": true, + "requires": { + "@formatjs/icu-messageformat-parser": "2.1.4", + "@types/json-stable-stringify": "^1.0.32", + "@types/node": "14 || 16 || 17", + "chalk": "^4.0.0", + "json-stable-stringify": "^1.0.1", + "tslib": "2.4.0", + "typescript": "^4.5" + } + }, "@typescript-eslint/types": { - "version": "4.33.0", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.6.tgz", + "integrity": "sha512-HdnP8HioL1F7CwVmT4RaaMX57RrfqsOMclZc08wGMiDYJBsLGBM7JwXM4cZJmbWLzIR/pXg1kkrBBVpxTOwfUg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.6.tgz", + "integrity": "sha512-Z7TgPoeYUm06smfEfYF0RBkpF8csMyVnqQbLYiGgmUSTaSXTP57bt8f0UFXstbGxKIreTwQCujtaH0LY9w9B+A==", "dev": true, "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/visitor-keys": "5.30.6", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", "tsutils": "^3.21.0" } }, "@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.6.tgz", + "integrity": "sha512-41OiCjdL2mCaSDi2SvYbzFLlqqlm5v1ZW9Ym55wXKL/Rx6OOB1IbuFGo71Fj6Xy90gJDFTlgOS+vbmtGHPTQQA==", "dev": true, "requires": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "5.30.6", + "eslint-visitor-keys": "^3.3.0" } }, - "eslint-visitor-keys": { - "version": "2.1.0", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "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 }, "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "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" + } + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, "typescript": { "version": "4.5.4", "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", @@ -30036,8 +30511,9 @@ } }, "eslint-visitor-keys": { - "version": "3.1.0", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "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 }, "esm": { @@ -30430,8 +30906,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { - "version": "3.2.7", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -30459,10 +30936,6 @@ "version": "2.0.6", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, - "fast-safe-stringify": { - "version": "2.1.1", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" - }, "fast-shallow-equal": { "version": "1.0.0", "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==" @@ -30730,6 +31203,7 @@ "form-data": { "version": "3.0.1", "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -30757,10 +31231,6 @@ } } }, - "formidable": { - "version": "1.2.6", - "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==" - }, "forwarded": { "version": "0.2.0", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", @@ -30882,8 +31352,7 @@ }, "gensync": { "version": "1.0.0-beta.2", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-caller-file": { "version": "2.0.5", @@ -31035,15 +31504,16 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globby": { - "version": "11.0.4", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "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", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" } }, @@ -31179,6 +31649,12 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, + "harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "dev": true + }, "has": { "version": "1.0.3", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", @@ -31269,8 +31745,9 @@ } }, "highlight.js": { - "version": "11.5.0", - "integrity": "sha512-SM6WDj5/C+VfIY8pZ6yW6Xa0Fm1tniYVYWYW1Q/DcMnISZFrC3aQAZZZFAAZtybKNrGId3p/DNbFTtcTXXgYBw==" + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.5.1.tgz", + "integrity": "sha512-LKzHqnxr4CrD2YsNoIf/o5nJ09j4yi/GcH5BnYz9UnVpZdS4ucMgvP61TDty5xJcFGRjnH4DpujkS9bHT3hq0Q==" }, "history": { "version": "4.10.1", @@ -31488,10 +31965,18 @@ "dev": true, "requires": {} }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "dev": true, + "requires": { + "harmony-reflect": "^1.4.6" + } + }, "ieee754": { "version": "1.2.1", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { "version": "5.2.0", @@ -31805,8 +32290,9 @@ } }, "inobounce": { - "version": "0.2.0", - "integrity": "sha512-eJt1MQEqLKanAFEE5DkSF36d9uyg8kLb/R6ysEF7udJOM5JZXidkhhGv6WoWbEcVdyRqZfYMjv6XbSIz7tD4CQ==" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/inobounce/-/inobounce-0.2.1.tgz", + "integrity": "sha512-dmKhRDbUS3zGD8HDGchsZBuxaXnfFM+2jXrZpnEnBToEWCgcs3lBfCQe0wzkbpIoJwU/lufaMquSyWoX8OXTRw==" }, "inquirer": { "version": "8.2.0", @@ -33711,7 +34197,6 @@ "json5": { "version": "2.2.0", "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, "requires": { "minimist": "^1.2.5" } @@ -34464,41 +34949,43 @@ "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==" }, "mattermost-webapp": { - "version": "git+ssh://git@github.com/mattermost/mattermost-webapp.git#6dcac2993000139f19c1b018f7fa6b9266973918", - "from": "mattermost-webapp@github:mattermost/mattermost-webapp#6dcac2993000139f19c1b018f7fa6b9266973918", + "version": "git+ssh://git@github.com/mattermost/mattermost-webapp.git#c00fde021889aaddfcd3afa5ce18254756fc4185", + "from": "mattermost-webapp@github:mattermost/mattermost-webapp#c00fde021889aaddfcd3afa5ce18254756fc4185", "requires": { + "@floating-ui/react-dom": "0.7.1", "@mattermost/compass-components": "^0.2.12", "@mattermost/compass-icons": "0.1.22", "@stripe/react-stripe-js": "1.6.0", "@stripe/stripe-js": "1.20.3", "@tippyjs/react": "4.2.6", "bootstrap": "3.4.1", + "buffer": "6.0.3", "chart.js": "2.9.4", "classnames": "2.3.1", - "core-js": "3.21.1", + "core-js": "3.22.7", "country-list": "2.2.0", "crypto-browserify": "3.12.0", "css-vars-ponyfill": "2.4.7", - "dynamic-virtualized-list": "github:mattermost/dynamic-virtualized-list#119db968c96643c7106d4d2c965f05b2e251bc83", + "dynamic-virtualized-list": "github:mattermost/dynamic-virtualized-list#77a0cb4c565bc239bab1ce5414b95bdd9a570963", "emoji-datasource": "6.1.1", "emoji-datasource-apple": "6.0.1", - "emoji-regex": "10.0.1", + "emoji-regex": "10.1.0", "exif2css": "1.3.0", "fast-deep-equal": "3.1.3", "flexsearch": "0.6.32", "font-awesome": "4.7.0", "gfycat-sdk": "1.4.18", - "highlight.js": "11.5.0", + "highlight.js": "11.5.1", "hoist-non-react-statics": "3.3.2", "html-to-react": "1.4.8", - "inobounce": "0.2.0", + "inobounce": "0.2.1", "jasny-bootstrap": "3.1.3", "katex": "0.13.11", "key-mirror": "1.0.1", "localforage": "1.10.0", "localforage-observable": "2.1.1", "lodash": "4.17.21", - "luxon": "2.3.1", + "luxon": "2.4.0", "mark.js": "8.11.1", "marked": "github:mattermost/marked#2ef7f28cc7718e3f551c4ce9ea75fdd7580c2008", "memoize-one": "5.2.1", @@ -34507,7 +34994,7 @@ "pdfjs-dist": "2.1.266", "popper.js": "1.16.1", "process": "0.11.10", - "prop-types": "15.7.2", + "prop-types": "15.8.1", "react": "16.13.1", "react-beautiful-dnd": "13.1.0", "react-bootstrap": "github:mattermost/react-bootstrap#c6957962364e0818a51bbfd13e89919903b422d6", @@ -34526,7 +35013,7 @@ "react-select": "2.4.4", "react-transition-group": "4.4.2", "react-virtualized-auto-sizer": "1.0.6", - "react-window": "1.8.6", + "react-window": "1.8.7", "react-window-infinite-loader": "1.0.7", "rebound": "0.1.0", "redux": "4.1.0", @@ -34536,13 +35023,12 @@ "regenerator-runtime": "0.13.9", "rudder-sdk-js": "1.0.16", "sass": "1.35.1", - "semver": "7.3.5", + "semver": "7.3.7", "serialize-error": "8.0.1", "shallow-equals": "1.0.0", "smooth-scroll-into-view-if-needed": "1.1.33", "stream-browserify": "3.0.0", "styled-components": "5.3.5", - "superagent": "6.1.0", "timezones.json": "1.6.1", "tinycolor2": "1.4.2", "typescript": "4.3.4", @@ -34651,6 +35137,15 @@ "csstype": "^3.0.2" } }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "chart.js": { "version": "2.9.4", "integrity": "sha512-B07aAzxcrikjAPyV+01j7BmOpxtQETxTSlQ26BEYJ+3iUkbNKaOJ/nDbT6JjyqYxseM0ON12COHYdU2cTIjC7A==", @@ -34660,8 +35155,9 @@ } }, "core-js": { - "version": "3.21.1", - "integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==" + "version": "3.22.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.7.tgz", + "integrity": "sha512-Jt8SReuDKVNZnZEzyEQT5eK6T2RRCXkfTq7Lo09kpm+fHjgGewSbNjV+Wt4yZMhPDdzz2x1ulI5z/w4nxpBseg==" }, "debug": { "version": "3.2.7", @@ -34678,10 +35174,6 @@ "@babel/runtime": "^7.1.2" } }, - "emoji-regex": { - "version": "10.0.1", - "integrity": "sha512-cLuZzriSWVE+rllzeq4zpUEoCPfYEbQ6ZVhIq+ed6ynWST7Bw9XnOr+bKWgCup4paq72DI21gw9M3aaFkm4HAw==" - }, "intl-messageformat": { "version": "9.9.1", "integrity": "sha512-cuzS/XKHn//hvKka77JKU2dseiVY2dofQjIOZv6ZFxFt4Z9sPXnZ7KQ9Ak2r+4XBCjI04MqJ1PhKs/3X22AkfA==", @@ -34691,6 +35183,11 @@ "tslib": "^2.1.0" } }, + "luxon": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.4.0.tgz", + "integrity": "sha512-w+NAwWOUL5hO0SgwOHsMBAmZ15SoknmQXhSO0hIbJCAmPKSsGeK8MlmhYh2w6Iib38IxN2M+/ooXWLbeis7GuA==" + }, "needle": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/needle/-/needle-3.0.0.tgz", @@ -34711,15 +35208,6 @@ "is-wsl": "^2.2.0" } }, - "prop-types": { - "version": "15.7.2", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, "react-bootstrap": { "version": "git+ssh://git@github.com/mattermost/react-bootstrap.git#c6957962364e0818a51bbfd13e89919903b422d6", "integrity": "sha512-+Y6asWTHOk+p33E+If0Tk/DV+lfFGJIXhruFR1R3OcC/1t0R2IttGmW7EbxGAgaHFhiomySNUDGLSrXSqU4/bw==", @@ -34853,8 +35341,9 @@ } }, "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "requires": { "lru-cache": "^6.0.0" } @@ -34972,7 +35461,8 @@ }, "methods": { "version": "1.1.2", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true }, "micromatch": { "version": "4.0.4", @@ -34997,10 +35487,6 @@ } } }, - "mime": { - "version": "2.6.0", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" - }, "mime-db": { "version": "1.51.0", "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" @@ -35854,6 +36340,12 @@ "tslib": "^2.0.3" } }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, "path-case": { "version": "3.0.4", "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", @@ -36759,13 +37251,13 @@ } }, "react-select": { - "version": "3.2.0", - "integrity": "sha512-B/q3TnCZXEKItO0fFN/I0tWOX3WJvi/X2wtdffmwSQVRwg5BpValScTO1vdic9AxlUgmeSzib2hAZAwIUQUZGQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-4.3.1.tgz", + "integrity": "sha512-HBBd0dYwkF5aZk1zP81Wx5UsLIIT2lSvAY2JiJo199LjoLHoivjn9//KsmvQMEFGNhe58xyuOITjfxKCcGc62Q==", "requires": { - "@babel/runtime": "^7.4.4", - "@emotion/cache": "^10.0.9", - "@emotion/core": "^10.0.9", - "@emotion/css": "^10.0.9", + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.1.1", "memoize-one": "^5.0.0", "prop-types": "^15.6.0", "react-input-autosize": "^3.0.0", @@ -36864,8 +37356,9 @@ "requires": {} }, "react-window": { - "version": "1.8.6", - "integrity": "sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==", + "version": "1.8.7", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.7.tgz", + "integrity": "sha512-JHEZbPXBpKMmoNO1bNhoXOOLg/ujhL/BU4IqVU9r8eQPcy5KQnGHIHDRkJ0ns9IM5+Aq5LNwt3j8t3tIrePQzA==", "requires": { "@babel/runtime": "^7.0.0", "memoize-one": ">=3.1.1 <6" @@ -37537,8 +38030,7 @@ }, "semver": { "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "semver-regex": { "version": "2.0.0", @@ -38274,32 +38766,6 @@ } } }, - "superagent": { - "version": "6.1.0", - "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", - "requires": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.2", - "debug": "^4.1.1", - "fast-safe-stringify": "^2.0.7", - "form-data": "^3.0.0", - "formidable": "^1.2.2", - "methods": "^1.1.2", - "mime": "^2.4.6", - "qs": "^6.9.4", - "readable-stream": "^3.6.0", - "semver": "^7.3.2" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, "supports-color": { "version": "5.5.0", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", @@ -38693,6 +39159,12 @@ "escape-string-regexp": "^1.0.2" } }, + "true-myth": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/true-myth/-/true-myth-4.1.1.tgz", + "integrity": "sha512-rqy30BSpxPznbbTcAcci90oZ1YR4DqvKcNXNerG5gQBU2v4jk0cygheiul5J6ExIMrgDVuanv/MkGfqZbKrNNg==", + "dev": true + }, "ts-easing": { "version": "0.2.0", "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==" @@ -38709,6 +39181,16 @@ "integrity": "sha512-DEQrfv6l7IvN2jlzc/VTdZJYsWUnQNCsueYjMkC/iXoEoi5fNan6MjeDqkvhfzbmHgdz9UxDUluX3V5HdjTydQ==", "dev": true }, + "ts-morph": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-13.0.3.tgz", + "integrity": "sha512-pSOfUMx8Ld/WUreoSzvMFQG5i9uEiWIsBYjpU9+TTASOeUa89j5HykomeqVULm1oqWtBdleI3KEFRLrlA3zGIw==", + "dev": true, + "requires": { + "@ts-morph/common": "~0.12.3", + "code-block-writer": "^11.0.0" + } + }, "ts-node": { "version": "9.1.1", "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", @@ -38722,6 +39204,53 @@ "yn": "3.1.1" } }, + "ts-prune": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/ts-prune/-/ts-prune-0.10.3.tgz", + "integrity": "sha512-iS47YTbdIcvN8Nh/1BFyziyUqmjXz7GVzWu02RaZXqb+e/3Qe1B7IQ4860krOeCGUeJmterAlaM2FRH0Ue0hjw==", + "dev": true, + "requires": { + "commander": "^6.2.1", + "cosmiconfig": "^7.0.1", + "json5": "^2.1.3", + "lodash": "^4.17.21", + "true-myth": "^4.1.0", + "ts-morph": "^13.0.1" + }, + "dependencies": { + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + }, + "cosmiconfig": { + "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", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "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" + } + } + } + }, "tsconfig-paths": { "version": "3.12.0", "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", diff --git a/webapp/package.json b/webapp/package.json index 2a4dce537a..f54568a551 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -17,7 +17,8 @@ "test-ci": "jest --forceExit --detectOpenHandles --maxWorkers=2", "check-types": "tsc", "extract": "formatjs extract 'src/**/*.{ts,tsx}' --out-file i18n/temp.json --id-interpolation-pattern '[sha512:contenthash:base64:6]' && formatjs compile 'i18n/temp.json' --out-file i18n/en.json && rm i18n/temp.json", - "graphql": "graphql-codegen --config graphql_gen.yml" + "graphql": "graphql-codegen --config graphql_gen.yml", + "report-unused-exports": "ts-prune" }, "author": "", "license": "", @@ -75,12 +76,13 @@ "css-loader": "6.5.1", "eslint": "8.6.0", "eslint-import-resolver-webpack": "0.13.2", - "eslint-plugin-formatjs": "2.20.1", + "eslint-plugin-formatjs": "4.0.2", "eslint-plugin-import": "2.25.4", "eslint-plugin-react": "7.28.0", "eslint-plugin-react-hooks": "4.3.0", "eslint-plugin-unused-imports": "2.0.0", "file-loader": "^6.2.0", + "identity-obj-proxy": "3.0.0", "image-webpack-loader": "^8.0.1", "jest": "27.4.7", "jest-canvas-mock": "2.3.1", @@ -94,6 +96,7 @@ "sass": "1.46.0", "sass-loader": "12.4.0", "style-loader": "3.3.1", + "ts-prune": "0.10.3", "webpack": "5.65.0", "webpack-cli": "4.9.1", "webpack-dev-server": "4.7.2" @@ -101,7 +104,9 @@ "dependencies": { "@apollo/client": "3.5.10", "@floating-ui/react-dom-interactions": "0.6.3", - "@mattermost/compass-icons": "0.1.24", + "@mattermost/client": "7.1.0", + "@mattermost/compass-icons": "0.1.26", + "@mattermost/types": "7.1.0", "@mdi/js": "^6.5.95", "@mdi/react": "1.5.0", "@tippyjs/react": "4.2.6", @@ -114,7 +119,7 @@ "js-trim-multiline-string": "^1.0.8", "lodash": "4.17.21", "luxon": "2.3.1", - "mattermost-webapp": "github:mattermost/mattermost-webapp#6dcac2993000139f19c1b018f7fa6b9266973918", + "mattermost-webapp": "github:mattermost/mattermost-webapp#c00fde021889aaddfcd3afa5ce18254756fc4185", "parse-duration": "1.0.2", "qs": "6.10.2", "react": "16.13.1", @@ -124,7 +129,7 @@ "react-intl": "5.24.1", "react-redux": "7.2.6", "react-router-hash-link": "2.4.3", - "react-select": "3.2.0", + "react-select": "4.3.1", "react-use": "17.3.2", "redux": "4.1.2", "styled-components": "5.3.3", @@ -154,7 +159,7 @@ "^@mattermost/types(.*)$": "/node_modules/mattermost-webapp/packages//types/src/$1" }, "moduleDirectories": [ - "", + "", "node_modules", "non_npm_dependencies" ], diff --git a/webapp/rudder_transform.js b/webapp/rudder_transform.js new file mode 100644 index 0000000000..72be2cdc67 --- /dev/null +++ b/webapp/rudder_transform.js @@ -0,0 +1,33 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// Note that This file is not used from webapp's build +// +// It's the transformer function that ruddersack should have to transform the +// old event data into the new event data. + +// eslint-disable-next-line no-unused-vars +export function transformEvent(event, metadata) { + const action = event.properties.Action; + + if (action === undefined) { + return event; + } + + switch (event.event) { + case 'frontend': + switch (action) { + case 'view_run_details': + event.type = 'page'; + event.event = 'run_details'; + delete event.properties.Action; + break; + + // ... other actions for frontend event + } + + // ... other events + break; + } + return event; +} diff --git a/webapp/src/actions.ts b/webapp/src/actions.ts index 1ce8b673a3..a416b2885d 100644 --- a/webapp/src/actions.ts +++ b/webapp/src/actions.ts @@ -10,9 +10,11 @@ import {DispatchFunc, GetStateFunc} from 'mattermost-redux/types/actions'; import {getCurrentChannelId} from 'mattermost-webapp/packages/mattermost-redux/src/selectors/entities/common'; +import {makeModalDefinition as makePlaybookRunModalDefinition} from 'src/components/modals/run_playbook_modal'; + import {PlaybookRun} from 'src/types/playbook_run'; import {selectToggleRHS, canIPostUpdateForRun} from 'src/selectors'; -import {RHSState, TimelineEventsFilter} from 'src/types/rhs'; +import {RHSState} from 'src/types/rhs'; import {BackstageRHSSection, BackstageRHSViewMode} from 'src/types/backstage_rhs'; import { PLAYBOOK_RUN_CREATED, @@ -28,11 +30,9 @@ import { REMOVED_FROM_CHANNEL, RemovedFromChannel, SET_CLIENT_ID, - SET_PLAYBOOK_RUN_EVENTS_FILTER, SET_RHS_OPEN, SET_RHS_STATE, SetClientId, - SetPlaybookRunEventsFilter, SetRHSOpen, SetRHSState, SetTriggerId, @@ -75,7 +75,7 @@ import { } from 'src/types/actions'; import {clientExecuteCommand} from 'src/client'; import {GlobalSettings} from 'src/types/settings'; -import {ChecklistItemsFilter, PlaybookWithChecklist} from 'src/types/playbook'; +import {ChecklistItemsFilter} from 'src/types/playbook'; import {modals} from 'src/webapp_globals'; import {makeModalDefinition as makeUpdateRunStatusModalDefinition} from 'src/components/modals/update_run_status_modal'; import {makePlaybookAccessModalDefinition} from 'src/components/backstage/playbook_access_modal'; @@ -98,23 +98,14 @@ export function startPlaybookRun(teamId: string, postId?: string) { }; } -export function startPlaybookRunById(teamId: string, playbookId: string, timeout = 0) { - return async (dispatch: Dispatch, getState: GetStateFunc) => { - // Add unique id - const clientId = generateId(); - dispatch(setClientId(clientId)); - - const command = `/playbook run-playbook ${playbookId} ${clientId}`; - - // When dispatching from the playbooks product, the switch to channels resets the websocket - // connection, losing the event that opens this dialog. Allow the caller to specify a - // timeout as a gross workaround. - await new Promise((resolve) => setTimeout(() => { - clientExecuteCommand(dispatch, getState, command, teamId); - // eslint-disable-next-line no-undefined - resolve(undefined); - }, timeout)); - }; +export function openPlaybookRunModal(playbookId: string, defaultOwnerId: string | null, description: string, teamId: string, teamName: string) { + return modals.openModal(makePlaybookRunModalDefinition( + playbookId, + defaultOwnerId, + description, + teamId, + teamName + )); } export function promptUpdateStatus( @@ -149,10 +140,10 @@ export function openUpdateRunStatusModal( export function displayEditPlaybookAccessModal( playbookId: string, - onPlaybookChange?: React.Dispatch>, + refetch?: () => void, ) { return async (dispatch: Dispatch) => { - dispatch(modals.openModal(makePlaybookAccessModalDefinition({playbookId, onPlaybookChange}))); + dispatch(modals.openModal(makePlaybookAccessModalDefinition({playbookId, refetch}))); }; } @@ -290,12 +281,6 @@ export const removedFromPlaybookRunChannel = (channelId: string): RemovedFromCha channelId, }); -export const setPlaybookRunEventsFilter = (playbookRunId: string, nextState: TimelineEventsFilter): SetPlaybookRunEventsFilter => ({ - type: SET_PLAYBOOK_RUN_EVENTS_FILTER, - playbookRunId, - nextState, -}); - export const actionSetGlobalSettings = (settings: GlobalSettings): ReceivedGlobalSettings => ({ type: RECEIVED_GLOBAL_SETTINGS, settings, diff --git a/webapp/src/client.ts b/webapp/src/client.ts index d5680b1fcd..e2aadeb4fb 100644 --- a/webapp/src/client.ts +++ b/webapp/src/client.ts @@ -9,15 +9,13 @@ import {UserProfile} from '@mattermost/types/users'; import {Channel} from '@mattermost/types/channels'; import {IntegrationTypes} from 'mattermost-redux/action_types'; import {Client4} from 'mattermost-redux/client'; -import {ClientError} from 'mattermost-redux/client/client4'; +import {ClientError} from '@mattermost/client'; import {getCurrentChannel} from 'mattermost-redux/selectors/entities/channels'; import { FetchPlaybookRunsParams, FetchPlaybookRunsReturn, PlaybookRun, - isPlaybookRun, - isMetadata, Metadata, RunMetricData, StatusPostComplete, @@ -25,6 +23,7 @@ import { import {setTriggerId} from 'src/actions'; import {OwnerInfo} from 'src/types/backstage'; +import {TelemetryViewTarget, TelemetryEventTarget, PlaybookRunViewTarget, PlaybookRunEventTarget} from 'src/types/telemetry'; import { Checklist, ChecklistItemState, @@ -38,12 +37,12 @@ import { import {PROFILE_CHUNK_SIZE, AdminNotificationType} from 'src/constants'; import {ChannelAction} from 'src/types/channel_actions'; import {RunActions} from 'src/types/run_actions'; -import {PlaybookRunViewTarget, PlaybookRunEventTarget} from 'src/types/telemetry'; import {EmptyPlaybookStats, PlaybookStats, Stats, SiteStats} from 'src/types/stats'; import {pluginId} from './manifest'; import {GlobalSettings, globalSettingsSetDefaults} from './types/settings'; import {Category} from './types/category'; +import {InsightsResponse} from './types/insights'; let siteURL = ''; let basePath = ''; @@ -82,13 +81,6 @@ export async function fetchPlaybookRuns(params: FetchPlaybookRunsParams) { export async function fetchPlaybookRun(id: string) { const data = await doGet(`${apiUrl}/runs/${id}`); - // eslint-disable-next-line no-process-env - if (process.env.NODE_ENV !== 'production') { - if (!isPlaybookRun(data)) { - // eslint-disable-next-line no-console - console.error('expected a PlaybookRun in fetchPlaybookRun, received:', data); - } - } return data as PlaybookRun; } @@ -148,26 +140,12 @@ export async function postStatusUpdate( export async function fetchPlaybookRunMetadata(id: string) { const data = await doGet(`${apiUrl}/runs/${id}/metadata`); - // eslint-disable-next-line no-process-env - if (process.env.NODE_ENV !== 'production') { - if (!isMetadata(data)) { - // eslint-disable-next-line no-console - console.error('expected a Metadata in fetchPlaybookRunMetadata, received:', data); - } - } return data; } export async function fetchPlaybookRunByChannel(channelId: string) { const data = await doGet(`${apiUrl}/runs/channel/${channelId}`); - // eslint-disable-next-line no-process-env - if (process.env.NODE_ENV !== 'production') { - if (!isPlaybookRun(data)) { - // eslint-disable-next-line no-console - console.error('expected a PlaybookRun in fetchPlaybookRun, received:', data); - } - } return data as PlaybookRun; } @@ -302,6 +280,14 @@ export async function finishRun(playbookRunId: string) { } } +export async function restoreRun(playbookRunId: string) { + try { + return await doPut(`${apiUrl}/runs/${playbookRunId}/restore`); + } catch (error) { + return {error}; + } +} + export async function setOwner(playbookRunId: string, ownerId: string) { const body = `{"owner_id": "${ownerId}"}`; try { @@ -529,6 +515,24 @@ export async function telemetryEventForTemplate(templateName: string, action: st }); } +export async function telemetryEvent(name: TelemetryEventTarget, properties: {[key: string]: string}) { + await doFetchWithoutResponse(`${apiUrl}/telemetry`, { + method: 'POST', + body: JSON.stringify( + {name, type: 'track', properties} + ), + }); +} + +export async function telemetryView(name: TelemetryViewTarget, properties: {[key: string]: string}) { + await doFetchWithoutResponse(`${apiUrl}/telemetry`, { + method: 'POST', + body: JSON.stringify( + {name, type: 'page', properties} + ), + }); +} + export async function setGlobalSettings(settings: GlobalSettings) { await doFetchWithoutResponse(`${apiUrl}/settings`, { method: 'PUT', @@ -591,9 +595,7 @@ export const requestTrialLicense = async (users: number, action: string) => { trackRequestTrialLicense(action); try { - const response = await Client4.doFetch(`${Client4.getBaseRoute()}/trial-license`, { - method: 'POST', body: JSON.stringify({users, terms_accepted: true, receive_emails_accepted: true}), - }); + const response = await Client4.requestTrialLicense({users, terms_accepted: true, receive_emails_accepted: true}); return {data: response}; } catch (e) { return {error: e.message}; @@ -733,20 +735,20 @@ export const requestUpdate = async (playbookRunId: string) => { } }; -export const favoriteItem = async (teamID: string, itemID: string, itemType: string) => { +export const requestJoinChannel = async (playbookRunId: string) => { try { - return await doPost(`${apiUrl}/my_categories/favorites?team_id=${teamID}`, JSON.stringify({ - item_id: itemID, - type: itemType, - })); + return await doPost(`${apiUrl}/runs/${playbookRunId}/request-join-channel`); } catch (error) { return {error}; } }; -export const requestGetInvolved = async (playbookRunId: string) => { +export const favoriteItem = async (teamID: string, itemID: string, itemType: string) => { try { - return await doPost(`${apiUrl}/runs/${playbookRunId}/request-get-involved`); + return await doPost(`${apiUrl}/my_categories/favorites?team_id=${teamID}`, JSON.stringify({ + item_id: itemID, + type: itemType, + })); } catch (error) { return {error}; } @@ -778,6 +780,14 @@ export const fetchMyCategories = async (teamID: string): Promise => return data; }; +export const setCategoryCollapsed = async (categoryID: string, collapsed: boolean) => { + try { + return await doPut(`${apiUrl}/my_categories/${categoryID}/collapse`, collapsed); + } catch (error) { + return {error}; + } +}; + export const doGet = async (url: string) => { const {data} = await doFetchWithResponse(url, {method: 'get'}); @@ -885,3 +895,32 @@ export const playbookExportProps = (playbook: {id: string, title: string}) => { const filename = playbook.title.split(/\s+/).join('_').toLowerCase() + '_playbook.json'; return [href, filename]; }; + +export async function getMyTopPlaybooks(timeRange: string, page: number, perPage: number, teamId: string): Promise { + const queryParams = qs.stringify({ + time_range: timeRange, + page, + per_page: perPage, + team_id: teamId, + }, {addQueryPrefix: true}); + + const data = await doGet(`${apiUrl}/playbooks/insights/user/me${queryParams}`); + if (!data) { + return null; + } + return data as InsightsResponse; +} + +export async function getTeamTopPlaybooks(timeRange: string, page: number, perPage: number, teamId: string): Promise { + const queryParams = qs.stringify({ + time_range: timeRange, + page, + per_page: perPage, + }, {addQueryPrefix: true}); + + const data = await doGet(`${apiUrl}/playbooks/insights/teams/${teamId}${queryParams}`); + if (!data) { + return null; + } + return data as InsightsResponse; +} diff --git a/webapp/src/components/actions_modal.tsx b/webapp/src/components/actions_modal.tsx index 4dd75798b7..3a849514b6 100644 --- a/webapp/src/components/actions_modal.tsx +++ b/webapp/src/components/actions_modal.tsx @@ -3,13 +3,11 @@ import React from 'react'; import {useIntl} from 'react-intl'; -import {Scrollbars} from 'react-custom-scrollbars'; import {Modal} from 'react-bootstrap'; import styled from 'styled-components'; -import {mdiLightningBoltOutline} from '@mdi/js'; -import Icon from '@mdi/react'; +import {LightningBoltOutlineIcon} from '@mattermost/compass-icons/components'; import GenericModal, {ModalSubheading, DefaultFooterContainer} from 'src/components/widgets/generic_modal'; @@ -22,7 +20,7 @@ interface Props { editable: boolean; onSave: () => void; children: React.ReactNode; - adjustTop?: number; + isValid: boolean; } const ActionsModal = (props: Props) => { @@ -30,10 +28,12 @@ const ActionsModal = (props: Props) => { const header = (
- + + +
{props.title} @@ -43,6 +43,17 @@ const ActionsModal = (props: Props) => {
); + // We want to show the confirm button but disabled when is invalid + const onHandleConfirm = () => { + if (!props.editable) { + return null; + } + if (!props.isValid) { + return () => null; + } + return props.onSave; + }; + return ( { onHide={props.onHide} onExited={() => {/* do nothing else after the modal has exited */}} handleCancel={props.editable ? props.onHide : null} - handleConfirm={props.editable ? props.onSave : null} + handleConfirm={onHandleConfirm()} confirmButtonText={formatMessage({defaultMessage: 'Save'})} cancelButtonText={formatMessage({defaultMessage: 'Cancel'})} isConfirmDisabled={!props.editable} + confirmButtonClassName={props.isValid ? '' : 'disabled'} isConfirmDestructive={false} autoCloseOnCancelButton={true} autoCloseOnConfirmButton={false} enforceFocus={true} - adjustTop={props.adjustTop} components={{ Header: ModalHeader, FooterContainer: ModalFooter, }} > - - {props.children} - + {props.children} ); }; @@ -108,6 +112,11 @@ const ModalFooter = styled(DefaultFooterContainer)` background: rgba(var(--center-channel-color-rgb), 0.08); } + + .disabled { + opacity: 0.4; + cursor: not-allowed; + } `; const renderThumbVertical = ({style, ...props}: any) => ( @@ -147,8 +156,7 @@ const Header = styled.div` flex-direction: row; `; -const ActionsIcon = styled(Icon)` - color: rgba(var(--center-channel-color-rgb), 0.56); +const IconWrapper = styled.div` margin-right: 14px; margin-top: 2px; `; diff --git a/webapp/src/components/actions_modal_action_children.tsx b/webapp/src/components/actions_modal_action_children.tsx index 48fd6f6883..bb0bada6ed 100644 --- a/webapp/src/components/actions_modal_action_children.tsx +++ b/webapp/src/components/actions_modal_action_children.tsx @@ -4,6 +4,8 @@ import React from 'react'; import {useIntl} from 'react-intl'; +import {useFloatingPortalNode} from '@floating-ui/react-dom-interactions'; + import {usePlaybook, usePlaybooksCrud} from 'src/hooks'; import MarkdownTextbox from 'src/components/markdown_textbox'; @@ -47,7 +49,8 @@ interface OptionType { export const RunPlaybookChildren = ({playbookId, onUpdate, editable}: RunPlaybookProps) => { const {formatMessage} = useIntl(); - const playbook = usePlaybook(playbookId); + const portalEl = useFloatingPortalNode(); + const [playbook] = usePlaybook(playbookId); const [playbooks, {params}, {setSearchTerm}] = usePlaybooksCrud({sort: 'title'}, {infinitePaging: false}); // Format the playbooks for use with StyledSelect. @@ -75,6 +78,8 @@ export const RunPlaybookChildren = ({playbookId, onUpdate, editable}: RunPlayboo maxMenuHeight={250} styles={{indicatorSeparator: () => null}} isDisabled={!editable} + captureMenuScroll={false} + menuPlacement={'auto'} /> ); }; @@ -99,7 +104,6 @@ export const CategorizeChannelChildren = ({categoryName, onUpdate, editable}: Ca captureMenuScroll={false} shouldRenderValue={true} placeholder={formatMessage({defaultMessage: 'Enter category name'})} - menuPlacement={'bottom'} /> ); }; diff --git a/webapp/src/components/assets/icons/playbook_icon.tsx b/webapp/src/components/assets/icons/playbook_icon.tsx deleted file mode 100644 index 33ed0821ca..0000000000 --- a/webapp/src/components/assets/icons/playbook_icon.tsx +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. -// See License for license information. - -import React from 'react'; -import styled from 'styled-components'; - -import Icon from 'src/components/assets/svg'; - -const Svg = styled(Icon)` - width: 14px; - height: 16px; -`; - -const PlaybookIcon = (props: {className?: string}) => ( - - - -); - -export default PlaybookIcon; diff --git a/webapp/src/components/assets/icons/playbook_run_icon.tsx b/webapp/src/components/assets/icons/playbook_run_icon.tsx deleted file mode 100644 index 4b20cdadee..0000000000 --- a/webapp/src/components/assets/icons/playbook_run_icon.tsx +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See License for license information. - -import React from 'react'; -import styled from 'styled-components'; - -import Icon from 'src/components/assets/svg'; - -const Svg = styled(Icon)` - width: 10px; - height: 11px; -`; - -const PlaybookRunIcon = (props: {className?: string}) => ( - - - -); - -export default PlaybookRunIcon; diff --git a/webapp/src/components/assets/icons/private_playbook_icon.tsx b/webapp/src/components/assets/icons/private_playbook_icon.tsx deleted file mode 100644 index 666a091e99..0000000000 --- a/webapp/src/components/assets/icons/private_playbook_icon.tsx +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See License for license information. - -import React from 'react'; -import styled from 'styled-components'; - -import Icon from 'src/components/assets/svg'; - -const Svg = styled(Icon)` - width: 14px; - height: 15px; -`; - -const PrivatePlaybookIcon = (props: {className?: string}) => ( - - - -); - -export default PrivatePlaybookIcon; diff --git a/webapp/src/components/backstage/archive_playbook_modal.tsx b/webapp/src/components/backstage/archive_playbook_modal.tsx index 93742ccd6b..e862bebc1b 100644 --- a/webapp/src/components/backstage/archive_playbook_modal.tsx +++ b/webapp/src/components/backstage/archive_playbook_modal.tsx @@ -5,6 +5,8 @@ import {Banner} from 'src/components/backstage/styles'; import {Playbook} from 'src/types/playbook'; import ConfirmModal from '../widgets/confirmation_modal'; +import {useLHSRefresh} from './lhs_navigation'; + const ArchiveBannerTimeout = 5000; interface ArchiveModalParams { @@ -17,6 +19,7 @@ const useConfirmPlaybookArchiveModal = (archivePlaybook: (id: Playbook['id']) => const [open, setOpen] = useState(false); const [showBanner, setShowBanner] = useState(false); const [playbook, setPlaybook] = useState(null); + const refreshLHS = useLHSRefresh(); const openModal = (playbookToOpenWith: ArchiveModalParams) => { setPlaybook(playbookToOpenWith); @@ -25,7 +28,8 @@ const useConfirmPlaybookArchiveModal = (archivePlaybook: (id: Playbook['id']) => const onArchive = async () => { if (playbook) { - archivePlaybook(playbook.id); + await archivePlaybook(playbook.id); + refreshLHS(); setOpen(false); setShowBanner(true); diff --git a/webapp/src/components/backstage/backstage.tsx b/webapp/src/components/backstage/backstage.tsx index 5c31acb599..e858de1154 100644 --- a/webapp/src/components/backstage/backstage.tsx +++ b/webapp/src/components/backstage/backstage.tsx @@ -2,24 +2,16 @@ // See LICENSE.txt for license information. import React, {useEffect} from 'react'; -import {Switch, Route, NavLink, useLocation, useRouteMatch} from 'react-router-dom'; +import {useLocation, useRouteMatch, matchPath} from 'react-router-dom'; import {useSelector} from 'react-redux'; -import {useIntl} from 'react-intl'; import styled, {css} from 'styled-components'; -import Icon from '@mdi/react'; -import {mdiThumbsUpDown, mdiClipboardPlayMultipleOutline} from '@mdi/js'; import {GlobalState} from '@mattermost/types/store'; -import {getMyTeams} from 'mattermost-redux/selectors/entities/teams'; -import {Team} from '@mattermost/types/teams'; -import {Theme} from '@mattermost/types/themes'; +import {Theme} from 'mattermost-redux/types/themes'; import {getTheme} from 'mattermost-redux/selectors/entities/preferences'; -import {promptForFeedback} from 'src/client'; -import PlaybookIcon from 'src/components/assets/icons/playbook_icon'; import {useForceDocumentTitle} from 'src/hooks'; import CloudModal from 'src/components/cloud_modal'; -import {BackstageNavbar} from 'src/components/backstage/backstage_navbar'; import {applyTheme} from 'src/components/backstage/css_utils'; import BackstageRHS from 'src/components/backstage/rhs/rhs'; @@ -28,67 +20,18 @@ import {ToastProvider} from './toast_banner'; import LHSNavigation from './lhs_navigation'; import MainBody from './main_body'; -const BackstageContainer = styled.div<{isRunDetailsPage: boolean}>` +const BackstageContainer = styled.div` background: var(--center-channel-bg); - display: flex; - flex-direction: column; overflow-y: auto; height: 100%; - - ${({isRunDetailsPage}) => isRunDetailsPage && css` - // Accounts for the run header, so when scrolling with - // anchor links, the sections are not hidden under it. - scroll-padding-top: 64px; - - scroll-behavior: smooth; - `} -`; - -const BackstageTitlebarItem = styled(NavLink)` - && { - font-size: 16px; - cursor: pointer; - color: rgba(var(--center-channel-color-rgb), 0.80); - fill: rgba(var(--center-channel-color-rgb), 0.80); - padding: 0 12px; - margin-right: 20px; - display: flex; - align-items: center; - height: 40px; - border-radius: 4px; - border: 0px; - - &:hover { - text-decoration: unset; - color: rgba(var(--center-channel-color-rgb), 0.80); - fill: rgba(var(--center-channel-color-rgb), 0.80); - background: rgba(var(--center-channel-color-rgb), 0.08); - } - - &.active { - color: var(--button-bg); - fill: var(--button-bg); - text-decoration: unset; - background: rgba(var(--button-bg-rgb), 0.08); - } - - & > :first-child { - margin-right: 12px; - } - } -`; - -const BackstageBody = styled.div` - flex-grow: 1; - display: flex; - flex-direction: column; `; const Backstage = () => { const {pathname} = useLocation(); - - // TODO: Change to /playbooks/runs when we get the new run details page to production - const isRunDetailsPage = pathname.startsWith('/playbooks/run_details'); + const {url} = useRouteMatch(); + const noContainerScroll = matchPath<{playbookRunId?: string; playbookId?: string;}>(pathname, { + path: [`${url}/runs/:playbookRunId`], + }); const currentTheme = useSelector(getTheme); useEffect(() => { @@ -109,12 +52,9 @@ const Backstage = () => { useForceDocumentTitle('Playbooks'); return ( - + - + @@ -125,72 +65,17 @@ const Backstage = () => { ); }; -const MainContainer = styled.div` +const MainContainer = styled.div<{noContainerScroll: boolean}>` display: grid; grid-auto-flow: column; grid-template-columns: max-content auto; + ${({noContainerScroll}) => (noContainerScroll ? css` + height: 100%; + ` : css` + min-height: 100%; + `)} `; -const Navbar = () => { - const {formatMessage} = useIntl(); - const match = useRouteMatch(); - const teams = useSelector(getMyTeams); - - //@ts-ignore plugins state is a thing - const npsAvailable = useSelector((state) => Boolean(state.plugins?.plugins?.['com.mattermost.nps'])); - - return ( - - - - - - - -
- - - {formatMessage({defaultMessage: 'Runs'})} - - - - {formatMessage({defaultMessage: 'Playbooks'})} - -
-
- {npsAvailable && ( - - - {formatMessage({defaultMessage: 'Give Feedback'})} - - )} -
-
-
-
- ); -}; - export const BackstageID = 'playbooks-backstageRoot'; export default Backstage; diff --git a/webapp/src/components/backstage/backstage_navbar.tsx b/webapp/src/components/backstage/backstage_navbar.tsx deleted file mode 100644 index ca6c24c536..0000000000 --- a/webapp/src/components/backstage/backstage_navbar.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import styled from 'styled-components'; - -export const BackstageNavbar = styled.div` - position: sticky; - width: 100%; - top: 0; - z-index: 2; - - display: flex; - align-items: center; - padding: 28px 31px; - background: var(--center-channel-bg); - color: var(--center-channel-color); - font-family: 'compass-icons'; - box-shadow: inset 0px -1px 0px rgba(var(--center-channel-color-rgb), 0.16); - - font-family: 'Open Sans'; - font-style: normal; - font-weight: 600; -`; diff --git a/webapp/src/components/backstage/category_selector.tsx b/webapp/src/components/backstage/category_selector.tsx index 9eaf69a047..c40a5bb7c9 100644 --- a/webapp/src/components/backstage/category_selector.tsx +++ b/webapp/src/components/backstage/category_selector.tsx @@ -59,7 +59,8 @@ const CategorySelector = (props: Props & { className?: string }) => { components={components} isDisabled={props.isDisabled} captureMenuScroll={props.captureMenuScroll} - menuPlacement={props.menuPlacement ?? 'top'} + menuPlacement={props.menuPlacement ?? 'auto'} + menuShouldScrollIntoView={false} /> ); }; diff --git a/webapp/src/components/backstage/collapsible_section.tsx b/webapp/src/components/backstage/collapsible_section.tsx deleted file mode 100644 index 0bfe0499f7..0000000000 --- a/webapp/src/components/backstage/collapsible_section.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import React, {useState} from 'react'; - -import styled from 'styled-components'; - -import HorizontalBar from './horizontal_bar'; -import EditableText from './editable_text'; - -export interface CollapsibleSectionProps { - title: string - onTitleChange: (newTitle: string) => void - children: React.ReactNode -} - -const Container = styled.span` - font-size: 16px; - font-weight: 600; - line-height: 24px; - color: var(--center-channel-color); -`; - -const ClickableI = styled.i` - margin: 0 4px 0 0; - cursor: pointer; - width: 24px; - height: 24px; - display: inline-flex; - align-items: center; - justify-content: center; - position: relative; - color: rgba(var(--center-channel-color-rgb), 0.56); - - &:hover { - color: var(--center-channel-color); - } -`; - -const CollapsibleSection = (props: CollapsibleSectionProps) => { - const [expanded, setExpanded] = useState(true); - - let icon = 'icon-20 icon-chevron-down'; - if (!expanded) { - icon = 'icon-20 icon-chevron-right'; - } - - return ( -
- - setExpanded(!expanded)} - /> - - - - - { - expanded ? props.children : null - } -
- ); -}; - -export default CollapsibleSection; diff --git a/webapp/src/components/backstage/convert_enterprise_notice.tsx b/webapp/src/components/backstage/convert_enterprise_notice.tsx index 720f5a0fdf..f112daeec4 100644 --- a/webapp/src/components/backstage/convert_enterprise_notice.tsx +++ b/webapp/src/components/backstage/convert_enterprise_notice.tsx @@ -5,7 +5,9 @@ import styled from 'styled-components'; const ConvertEnterpriseNotice = () => ( <> - {'To unlock this feature:'} + + +

  • diff --git a/webapp/src/components/backstage/default_update_timer.tsx b/webapp/src/components/backstage/default_update_timer.tsx deleted file mode 100644 index 8fe4d78f4d..0000000000 --- a/webapp/src/components/backstage/default_update_timer.tsx +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -import React, {useMemo} from 'react'; -import {useIntl} from 'react-intl'; - -import { - BackstageSubheader, - BackstageSubheaderDescription, - InfoLine, -} from 'src/components/backstage/styles'; - -import { - useDateTimeInput, - useMakeOption, - ms, - Mode, - Option, -} from 'src/components/datetime_input'; - -interface Props { - seconds: number; - setSeconds: (seconds: number) => void; - disabled?: boolean; -} - -const DefaultUpdateTimer = (props: Props) => { - const {formatMessage} = useIntl(); - const makeOption = useMakeOption(Mode.DurationValue); - - const defaults = useMemo(() => { - const options = [ - makeOption({hours: 1}), - makeOption({days: 1}), - makeOption({days: 7}), - ]; - - let value: Option | undefined; - if (props.seconds) { - value = makeOption({seconds: props.seconds}); - - const matched = options.find((o) => value && ms(o.value) === ms(value.value)); - if (matched) { - value = matched; - } else { - options.push(value); - } - options.sort((a, b) => ms(a.value) - ms(b.value)); - } - - return {options, value}; - }, [props]); - - const {input, value} = useDateTimeInput({ - mode: Mode.DurationValue, - parsingOptions: {defaultUnit: 'minutes'}, - defaultOptions: defaults.options, - defaultValue: defaults.value, - isClearable: false, - placeholder: formatMessage({defaultMessage: 'Select an option or specify a custom duration'}), - id: 'update_timer_duration', - disabled: props.disabled, - }); - - if (value?.value) { - props.setSeconds(Math.floor(ms(value.value) / 1000)); - } - - return ( - <> - - {formatMessage({defaultMessage: 'Default update timer'})} - - {formatMessage({defaultMessage: 'How often should an update be posted?'})} - - - {input} - - {formatMessage({defaultMessage: 'You can select an option or specify a custom duration ("2 weeks", "3 days 12 hours", "45 minutes", ...)'})} - - - ); -}; - -export default DefaultUpdateTimer; diff --git a/webapp/src/components/backstage/drag_handle.tsx b/webapp/src/components/backstage/drag_handle.tsx deleted file mode 100644 index 787978a857..0000000000 --- a/webapp/src/components/backstage/drag_handle.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import React, {useState} from 'react'; -import styled from 'styled-components'; -import {DraggableProvided} from 'react-beautiful-dnd'; - -interface HandleProps { - show: boolean; -} - -const HandleContainer = styled.div` - display: flex; - align-items: flex-start; - margin: 24px 0 0; - - &.HandleContainer--Step { - margin: 16px -32px 0; - } -`; - -const ClickableI = styled.i` - cursor: pointer; -`; - -const Handle = styled.div` - width: 24px; - height: 24px; - display: flex; - align-items: center; - justify-content: center; - visibility: ${(props) => (props.show ? 'visible' : 'hidden')}; - color: rgba(var(--center-channel-color-rgb), 0.56); - margin: 0 8px 0 0; - - &:first-child { - margin: 0 0 0 8px; - } - - &:hover { - color: var(--center-channel-color); - } -`; - -const Content = styled.div` - flex-grow: 1; -`; - -export interface DragHandleProps { - step: boolean; - children: React.ReactNode; - draggableProvided: DraggableProvided; - onDelete: () => void -} - -const DragHandle = (props: DragHandleProps) => { - const [hover, setHover] = useState(false); - - return ( - setHover(true)} - onMouseLeave={() => setHover(false)} - > - - - - - {props.children} - - - - - - ); -}; - -export default DragHandle; diff --git a/webapp/src/components/backstage/editable_text.tsx b/webapp/src/components/backstage/editable_text.tsx deleted file mode 100644 index c13378f291..0000000000 --- a/webapp/src/components/backstage/editable_text.tsx +++ /dev/null @@ -1,130 +0,0 @@ -import React, {useState, useRef} from 'react'; -import styled from 'styled-components'; - -export interface EditableTextProps { - id?: string - text: string - onChange: (newText: string) => void - placeholder?: string -} - -const Container = styled.span` - display: inline-flex; - flex-shrink: 0; - flex-direction: row; - align-items: center; - - i { - padding: 0 8px; - color: rgba(var(--center-channel-color-rgb), 0.56); - - &.icon-check { - padding: 0 8px; - } - - &:hover { - color: var(--center-channel-color); - } - } -`; - -const Input = styled.input` - background: none; - font: inherit; - padding: 0 0 2px; - box-shadow: 0 2px 0 var(--button-bg); - border: none; - margin-top: -2px; - max-width: 650px; - padding: 0 0 2px; -`; - -const Text = styled.span` - overflow: hidden; - text-overflow: ellipsis; - max-width: 650px; - white-space: nowrap; -`; - -const Placeholder = styled.span` - overflow: hidden; - text-overflow: ellipsis; - max-width: 650px; - white-space: nowrap; - font-style: italic; -`; - -const ClickableI = styled.i` - cursor: pointer; -`; - -const EditableText = (props: EditableTextProps) => { - const [editMode, setEditMode] = useState(false); - const [text, setText] = useState(props.text); - const textElement = useRef(null); - const [inputWidth, setInputWidth] = useState(0); - - const submit = () => { - setEditMode(false); - props.onChange(text); - }; - - const enterEditMode = () => { - // When editing, copy the props value at the instant editing starts. - setText(props.text); - - // Start the input size at least as wide as the span, itself with a max width. - setInputWidth(textElement.current?.offsetWidth || 0); - setEditMode(true); - }; - - if (editMode) { - return ( - - { - setText(e.target.value); - }} - autoFocus={true} - onBlur={submit} - onKeyPress={(e) => { - if (e.key === 'Enter') { - submit(); - } - }} - /> - - - ); - } - - return ( - - {props.text && props.text.trim().length > 0 && - - {props.text} - - } - {(!props.text || props.text.length === 0) && props.placeholder && props.placeholder.length > 0 && - - {props.placeholder} - - } - - - ); -}; - -export default EditableText; diff --git a/webapp/src/components/backstage/horizontal_bar.tsx b/webapp/src/components/backstage/horizontal_bar.tsx deleted file mode 100644 index 2798e2b9e0..0000000000 --- a/webapp/src/components/backstage/horizontal_bar.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React from 'react'; -import styled from 'styled-components'; - -export interface HorizontalBarProps { - children: React.ReactNode; -} - -export const Container = styled.div` - display: flex; - flex-direction: row; - width: 100%; - line-height: 0.1em; - margin-bottom: 12px; -`; - -export const Line = styled.hr` - width: 100%; - margin: auto 0; - display: inline-block; - flex-grow: 1; -`; - -const Children = styled.div` - flex-shrink: 0; - display: flex; - align-items: center; -`; - -const HorizontalBar = (props: HorizontalBarProps) => { - return ( - - - {props.children} - - - - ); -}; - -export default HorizontalBar; diff --git a/webapp/src/components/backstage/import_playbook.tsx b/webapp/src/components/backstage/import_playbook.tsx new file mode 100644 index 0000000000..906aa80a58 --- /dev/null +++ b/webapp/src/components/backstage/import_playbook.tsx @@ -0,0 +1,40 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React, {useRef} from 'react'; +import {useIntl} from 'react-intl'; + +import {importFile} from 'src/client'; +import {useToaster, ToastType} from 'src/components/backstage/toast_banner'; + +export const useImportPlaybook = (teamId: string, cb: (id: string) => void) => { + const fileInputRef = useRef(null); + const {formatMessage} = useIntl(); + const addToast = useToaster().add; + + const importUpload = (e: React.ChangeEvent) => { + if (e.target.files?.[0]) { + const file = e.target.files[0]; + + const reader = new FileReader(); + reader.onload = async (ev) => { + importFile(ev?.target?.result, teamId) + .then(({id}) => cb(id)) + .catch(() => addToast(formatMessage({defaultMessage: 'The playbook import has failed. Please check that JSON is valid and try again.'}), ToastType.Failure)); + e.target.value = ''; + }; + reader.readAsArrayBuffer(file); + } + }; + + const input = ( + + ); + return [fileInputRef, input] as const; +}; diff --git a/webapp/src/components/backstage/lhs_navigation.tsx b/webapp/src/components/backstage/lhs_navigation.tsx index 37a6ec0276..3eb748197c 100644 --- a/webapp/src/components/backstage/lhs_navigation.tsx +++ b/webapp/src/components/backstage/lhs_navigation.tsx @@ -1,6 +1,8 @@ +import {useApolloClient} from '@apollo/client'; import React from 'react'; import styled from 'styled-components'; +import {PlaybookLhsDocument} from 'src/graphql/generated_types'; import PlaybooksSidebar from '../sidebar/playbooks_sidebar'; const LHSContainer = styled.div` @@ -13,10 +15,22 @@ const LHSContainer = styled.div` const LHSNavigation = () => { return ( - - + + ); }; +export const useLHSRefresh = () => { + const apolloClient = useApolloClient(); + + const refreshLists = () => { + apolloClient.refetchQueries({ + include: [PlaybookLhsDocument], + }); + }; + + return refreshLists; +}; + export default LHSNavigation; diff --git a/webapp/src/components/backstage/lhs_playbook_dot_menu.tsx b/webapp/src/components/backstage/lhs_playbook_dot_menu.tsx new file mode 100644 index 0000000000..6d57a825b4 --- /dev/null +++ b/webapp/src/components/backstage/lhs_playbook_dot_menu.tsx @@ -0,0 +1,41 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React from 'react'; +import {DotsVerticalIcon} from '@mattermost/compass-icons/components'; + +import DotMenu from 'src/components/dot_menu'; +import {Separator} from 'src/components/backstage/playbook_runs/shared'; + +import {DotMenuButtonStyled} from './shared'; +import {CopyPlaybookLinkMenuItem, FavoritePlaybookMenuItem, LeavePlaybookMenuItem} from './playbook_editor/controls'; + +interface Props { + playbookId: string; + isFavorite: boolean; +} + +export const LHSPlaybookDotMenu = ({playbookId, isFavorite}: Props) => { + return ( + <> + + )} + dotMenuButton={DotMenuButtonStyled} + > + + + + + + + ); +}; diff --git a/webapp/src/components/backstage/lhs_run_dot_menu.tsx b/webapp/src/components/backstage/lhs_run_dot_menu.tsx new file mode 100644 index 0000000000..fba4f01203 --- /dev/null +++ b/webapp/src/components/backstage/lhs_run_dot_menu.tsx @@ -0,0 +1,93 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React from 'react'; +import {useIntl} from 'react-intl'; +import {DotsVerticalIcon} from '@mattermost/compass-icons/components'; +import {useSelector} from 'react-redux'; +import {getCurrentUser} from 'mattermost-webapp/packages/mattermost-redux/src/selectors/entities/users'; + +import {followPlaybookRun, unfollowPlaybookRun} from 'src/client'; +import DotMenu from 'src/components/dot_menu'; +import {ToastType, useToaster} from 'src/components/backstage/toast_banner'; +import {Role, Separator} from 'src/components/backstage/playbook_runs/shared'; + +import {useUpdateRun} from 'src/graphql/hooks'; + +import {useLeaveRun} from './playbook_runs/playbook_run/context_menu'; +import {useFollowers} from './playbook_runs/playbook_run/playbook_run'; +import {CopyRunLinkMenuItem, FavoriteRunMenuItem, FollowRunMenuItem, LeaveRunMenuItem} from './playbook_runs/playbook_run/controls'; +import {DotMenuButtonStyled} from './shared'; + +interface Props { + playbookRunId: string; + isFavorite: boolean; + ownerUserId: string; + participantIDs: string[]; + followerIDs: string[]; + hasPermanentViewerAccess: boolean; +} + +export const LHSRunDotMenu = ({playbookRunId, isFavorite, ownerUserId, participantIDs, followerIDs, hasPermanentViewerAccess}: Props) => { + const {formatMessage} = useIntl(); + const {add: addToast} = useToaster(); + const updateRun = useUpdateRun(playbookRunId); + const currentUser = useSelector(getCurrentUser); + + const followState = useFollowers(followerIDs); + const {isFollowing, followers, setFollowers} = followState; + + const {leaveRunConfirmModal, showLeaveRunConfirm} = useLeaveRun(hasPermanentViewerAccess, playbookRunId, ownerUserId, isFollowing); + const role = participantIDs.includes(currentUser.id) ? Role.Participant : Role.Viewer; + + const toggleFavorite = () => { + updateRun({isFavorite: !isFavorite}); + }; + + const toggleFollow = () => { + const action = isFollowing ? unfollowPlaybookRun : followPlaybookRun; + action(playbookRunId) + .then(() => { + const newFollowers = isFollowing ? followers.filter((userId) => userId !== currentUser.id) : [...followers, currentUser.id]; + setFollowers(newFollowers); + }) + .catch(() => { + addToast(formatMessage({defaultMessage: 'It was not possible to {isFollowing, select, true {unfollow} other {follow}} the run'}, {isFollowing}), ToastType.Failure); + }); + }; + + return ( + <> + + )} + dotMenuButton={DotMenuButtonStyled} + > + + + + + + + + {leaveRunConfirmModal} + + ); +}; diff --git a/webapp/src/components/backstage/main_body.tsx b/webapp/src/components/backstage/main_body.tsx index 9b5de9782c..56879f0bc1 100644 --- a/webapp/src/components/backstage/main_body.tsx +++ b/webapp/src/components/backstage/main_body.tsx @@ -16,9 +16,7 @@ import PlaybookRun from 'src/components/backstage/playbook_runs/playbook_run/pla import Playbook from 'src/components/backstage/playbooks/playbook'; import PlaybookList from 'src/components/backstage/playbook_list'; -import PlaybookEdit from 'src/components/backstage/playbook_edit/playbook_edit'; import PlaybookEditor from 'src/components/backstage/playbook_editor/playbook_editor'; -import {NewPlaybook} from 'src/components/backstage/new_playbook'; import {ErrorPageTypes} from 'src/constants'; import {pluginErrorUrl, pluginUrl} from 'src/browser_routing'; import ErrorPage from 'src/components/error_page'; @@ -86,14 +84,6 @@ const MainBody = () => { return ( - - - - - - diff --git a/webapp/src/components/backstage/new_playbook.tsx b/webapp/src/components/backstage/new_playbook.tsx deleted file mode 100644 index b2f082e956..0000000000 --- a/webapp/src/components/backstage/new_playbook.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import React from 'react'; -import {Redirect} from 'react-router-dom'; -import {useIntl} from 'react-intl'; -import {useDispatch} from 'react-redux'; -import styled from 'styled-components'; - -import PlaybookEdit from 'src/components/backstage/playbook_edit/playbook_edit'; -import {pluginUrl} from 'src/browser_routing'; -import {displayPlaybookCreateModal} from 'src/actions'; -import {PrimaryButton} from '../assets/buttons'; - -export const NewPlaybook = () => { - const searchParams = Object.fromEntries(new URLSearchParams(location.search)); - - if (!searchParams.teamId) { - return ; - } - - return ( - - ); -}; - -export const PlaybookModalButton = () => { - const {formatMessage} = useIntl(); - const dispatch = useDispatch(); - - return ( - dispatch(displayPlaybookCreateModal({}))} - > - - {formatMessage({defaultMessage: 'Create playbook'})} - - ); -}; - -const CreatePlaybookButton = styled(PrimaryButton)` - display: flex; - align-items: center; -`; diff --git a/webapp/src/components/backstage/playbook_access_modal.tsx b/webapp/src/components/backstage/playbook_access_modal.tsx index 24207e64ac..5a1362504c 100644 --- a/webapp/src/components/backstage/playbook_access_modal.tsx +++ b/webapp/src/components/backstage/playbook_access_modal.tsx @@ -1,7 +1,7 @@ import {getTeam} from 'mattermost-redux/selectors/entities/teams'; import {getProfilesInTeam, searchProfiles} from 'mattermost-webapp/packages/mattermost-redux/src/actions/users'; -import {GlobalState} from 'mattermost-webapp/packages/mattermost-redux/src/types/store'; -import {Team} from 'mattermost-webapp/packages/mattermost-redux/src/types/teams'; +import {GlobalState} from '@mattermost/types/store'; +import {Team} from '@mattermost/types/teams'; import React, {ComponentProps, useState} from 'react'; import {useIntl} from 'react-intl'; import {useDispatch, useSelector} from 'react-redux'; @@ -23,7 +23,7 @@ const ID = 'playbooks_access'; type Props = { playbookId: string - onPlaybookChange?: React.Dispatch> + refetch?: () => void } & Partial>; export const makePlaybookAccessModalDefinition = (props: Props) => ({ @@ -66,12 +66,12 @@ const BlueArrow = styled.i` const PlaybookAccessModal = ({ playbookId, - onPlaybookChange, + refetch, ...modalProps }: Props) => { const {formatMessage} = useIntl(); const dispatch = useDispatch(); - const [playbook, updatePlaybook] = useEditPlaybook(playbookId); + const [playbook, updatePlaybook] = useEditPlaybook(playbookId, refetch); const team = useSelector((state) => getTeam(state, playbook?.team_id || '')); const permissionToMakePrivate = useHasPlaybookPermission(PlaybookPermissionGeneral.Convert, playbook); const licenseToMakePrivate = useAllowMakePlaybookPrivate(); @@ -83,7 +83,6 @@ const PlaybookAccessModal = ({ if (playbook) { const updatedPlaybook: PlaybookWithChecklist = {...playbook, ...update}; updatePlaybook(updatedPlaybook); - onPlaybookChange?.(updatedPlaybook); } }; diff --git a/webapp/src/components/backstage/playbook_edit/actions_edit.tsx b/webapp/src/components/backstage/playbook_edit/actions_edit.tsx deleted file mode 100644 index f30f637739..0000000000 --- a/webapp/src/components/backstage/playbook_edit/actions_edit.tsx +++ /dev/null @@ -1,229 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -import React from 'react'; -import {useIntl} from 'react-intl'; - -import {ActionFunc} from 'mattermost-redux/types/actions'; - -import {TabContainer} from 'src/components/backstage/styles'; -import {DraftPlaybookWithChecklist, PlaybookWithChecklist} from 'src/types/playbook'; -import {Section, SectionTitle, Setting} from 'src/components/backstage/playbook_edit/styles'; -import {InviteUsers} from 'src/components/backstage/playbook_edit/automation/invite_users'; -import {AutoAssignOwner} from 'src/components/backstage/playbook_edit/automation/auto_assign_owner'; -import {WebhookSetting} from 'src/components/backstage/playbook_edit/automation/webhook_setting'; -import {MessageOnJoin} from 'src/components/backstage/playbook_edit/automation/message_on_join'; -import {CategorizePlaybookRun} from 'src/components/backstage/playbook_edit/automation/categorize_playbook_run'; -import RunSummary from 'src/components/backstage/playbook_edit/automation/run_summary'; -import {CreateAChannel} from 'src/components/backstage/playbook_edit/automation/channel_access'; - -interface Props { - playbook: DraftPlaybookWithChecklist | PlaybookWithChecklist; - setPlaybook: React.Dispatch>; - setChangesMade: (b: boolean) => void; - searchUsers: (term: string) => ActionFunc; - getUsers: () => ActionFunc; -} - -const ActionsEdit = ({playbook, setPlaybook, setChangesMade, searchUsers, getUsers}: Props) => { - const {formatMessage} = useIntl(); - - const handleAddUserInvited = (userId: string) => { - if (!playbook.invited_user_ids.includes(userId)) { - setPlaybook({ - ...playbook, - invited_user_ids: [...playbook.invited_user_ids, userId], - }); - setChangesMade(true); - } - }; - - const handleRemoveUserInvited = (userId: string) => { - const idx = playbook.invited_user_ids.indexOf(userId); - setPlaybook({ - ...playbook, - invited_user_ids: [...playbook.invited_user_ids.slice(0, idx), ...playbook.invited_user_ids.slice(idx + 1)], - }); - setChangesMade(true); - }; - - const handleAssignDefaultOwner = (userId: string | undefined) => { - if ((userId || userId === '') && playbook.default_owner_id !== userId) { - setPlaybook({ - ...playbook, - default_owner_id: userId, - }); - setChangesMade(true); - } - }; - - const handleWebhookOnCreationChange = (urls: string) => { - setPlaybook({ - ...playbook, - webhook_on_creation_urls: urls.split('\n'), - }); - setChangesMade(true); - }; - - const handleMessageOnJoinChange = (message: string) => { - if (playbook.message_on_join !== message) { - setPlaybook({ - ...playbook, - message_on_join: message, - }); - setChangesMade(true); - } - }; - - const handleToggleMessageOnJoin = () => { - setPlaybook({ - ...playbook, - message_on_join_enabled: !playbook.message_on_join_enabled, - }); - setChangesMade(true); - }; - - const handleToggleInviteUsers = () => { - setPlaybook({ - ...playbook, - invite_users_enabled: !playbook.invite_users_enabled, - }); - setChangesMade(true); - }; - - const handleToggleDefaultOwner = () => { - setPlaybook({ - ...playbook, - default_owner_enabled: !playbook.default_owner_enabled, - }); - setChangesMade(true); - }; - - const handleToggleRunSummary = () => { - setPlaybook({ - ...playbook, - run_summary_template_enabled: !playbook.run_summary_template_enabled, - }); - setChangesMade(true); - }; - - const handleRunSummaryChange = (runSummary: string) => { - setPlaybook({ - ...playbook, - run_summary_template: runSummary, - }); - setChangesMade(true); - }; - - const handleToggleWebhookOnCreation = () => { - setPlaybook({ - ...playbook, - webhook_on_creation_enabled: !playbook.webhook_on_creation_enabled, - }); - setChangesMade(true); - }; - - const handleToggleCategorizePlaybookRun = () => { - setPlaybook({ - ...playbook, - categorize_channel_enabled: !playbook.categorize_channel_enabled, - }); - setChangesMade(true); - }; - - const handleCategoryNameChange = (name: string) => { - if (playbook.category_name !== name) { - setPlaybook({ - ...playbook, - category_name: name, - }); - setChangesMade(true); - } - }; - - return ( - -
    - - {formatMessage({defaultMessage: 'When a run starts'})} - - - - - - - - - - - - - - - - -
    -
    - - {formatMessage({defaultMessage: 'When a new member joins the channel'})} - - - - - - - -
    -
    - ); -}; - -export default ActionsEdit; diff --git a/webapp/src/components/backstage/playbook_edit/automation/auto_assign_owner.tsx b/webapp/src/components/backstage/playbook_edit/automation/auto_assign_owner.tsx index 6e0bdba170..d76e811f43 100644 --- a/webapp/src/components/backstage/playbook_edit/automation/auto_assign_owner.tsx +++ b/webapp/src/components/backstage/playbook_edit/automation/auto_assign_owner.tsx @@ -3,13 +3,10 @@ import React from 'react'; -import styled from 'styled-components'; - import {ActionFunc} from 'mattermost-redux/types/actions'; import {FormattedMessage} from 'react-intl'; -import Profile from 'src/components/profile/profile'; import { AutomationHeader, AutomationTitle, @@ -51,94 +48,3 @@ export const AutoAssignOwner = (props: Props) => { ); }; - -interface UserRowProps { - isEnabled: boolean; -} - -const UserRow = styled.div` - margin: 12px 0 0 auto; - - padding: 0; - - display: flex; - flex-direction: row; -`; - -const Cross = styled.i` - position: absolute; - cursor: pointer; - top: 0; - left: 50%; - - color: var(--button-bg); - // Filling the transparent X in the icon: this sets a background gradient, - // which is effectively a circle with color --button-color that fills only - // 50% of the background, transparent outside of it. If we simply add a - // background color, the icon is misplaced and a weird border appears at the bottom - background-image: radial-gradient(circle, var(--button-color) 50%, rgba(0, 0, 0, 0) 50%); - - visibility: hidden; -`; - -const UserPic = styled.div` - .PlaybookRunProfile { - flex-direction: column; - - .name { - display: none; - position: absolute; - bottom: -24px; - margin-left: auto; - } - } - - :not(:first-child) { - margin-left: -16px; - } - - position: relative; - transition: transform .4s; - - :hover { - z-index: 1; - transform: translateY(-8px); - - ${Cross} { - visibility: visible; - } - - .name { - display: block; - } - } - - && img { - // We need both background-color and border color to imitate the color in the background - background-color: var(--center-channel-bg); - border: 2px solid rgba(var(--center-channel-color-rgb), 0.04); - } - -`; - -interface UserProps { - userIds: string[]; - onRemoveUser: (userId: string) => void; - isEnabled: boolean; -} - -const Users = (props: UserProps) => { - return ( - - {props.userIds.map((userId: string) => ( - - - props.onRemoveUser(userId)} - /> - - ))} - - ); -}; diff --git a/webapp/src/components/backstage/playbook_edit/automation/broadcast.tsx b/webapp/src/components/backstage/playbook_edit/automation/broadcast.tsx deleted file mode 100644 index 1dc8befd06..0000000000 --- a/webapp/src/components/backstage/playbook_edit/automation/broadcast.tsx +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -import React from 'react'; -import {useSelector} from 'react-redux'; - -import {FormattedMessage} from 'react-intl'; - -import {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams'; - -import {AutomationHeader, AutomationTitle, SelectorWrapper} from 'src/components/backstage/playbook_edit/automation/styles'; -import {Toggle} from 'src/components/backstage/playbook_edit/automation/toggle'; -import BroadcastChannelSelector from 'src/components/broadcast_channel_selector'; - -interface Props { - enabled: boolean; - onToggle: () => void; - channelIds: string[]; - onChannelsSelected: (channelIds: string[]) => void; -} - -export const Broadcast = (props: Props) => { - const teamId = useSelector(getCurrentTeamId); - - return ( - - - -
    -
    - - - -
    - ); -}; - diff --git a/webapp/src/components/backstage/playbook_edit/automation/invite_users_selector.tsx b/webapp/src/components/backstage/playbook_edit/automation/invite_users_selector.tsx index d84bbdb11e..20259b1f17 100644 --- a/webapp/src/components/backstage/playbook_edit/automation/invite_users_selector.tsx +++ b/webapp/src/components/backstage/playbook_edit/automation/invite_users_selector.tsx @@ -12,7 +12,7 @@ import {UserProfile} from '@mattermost/types/users'; import {GlobalState} from '@mattermost/types/store'; import {getUser} from 'mattermost-redux/selectors/entities/users'; -import {useIntl} from 'react-intl'; +import {FormattedMessage, useIntl} from 'react-intl'; import Profile from 'src/components/profile/profile'; import {useEnsureProfiles} from 'src/hooks'; @@ -139,7 +139,7 @@ interface UserLabelProps { const UserLabel = (props: UserLabelProps) => { let icon = ; if (props.invitedUsers.find((user: UserProfile) => user.id === props.id)) { - icon = {'Remove'}; + icon = ; } return ( diff --git a/webapp/src/components/backstage/playbook_edit/automation/message_on_join.tsx b/webapp/src/components/backstage/playbook_edit/automation/message_on_join.tsx deleted file mode 100644 index 0ecd484292..0000000000 --- a/webapp/src/components/backstage/playbook_edit/automation/message_on_join.tsx +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -import React from 'react'; -import styled from 'styled-components'; - -import {FormattedMessage} from 'react-intl'; - -import {StyledMarkdownTextbox} from 'src/components/backstage/styles'; - -import { - AutomationHeader, - AutomationTitle, -} from 'src/components/backstage/playbook_edit/automation/styles'; -import {Toggle} from 'src/components/backstage/playbook_edit/automation/toggle'; - -const TextboxWrapper = styled.div` - margin-top: 2rem; - width: 100%; -`; - -const StyledAutomationHeader = styled(AutomationHeader)` - align-items: start; - flex-direction: column; -`; - -interface Props { - enabled: boolean; - onToggle: () => void; - message: string; - onChange: (message: string) => void; -} - -export const MessageOnJoin = (props: Props) => { - return ( - - - -
    -
    - - - -
    - ); -}; diff --git a/webapp/src/components/backstage/playbook_edit/automation/run_summary.tsx b/webapp/src/components/backstage/playbook_edit/automation/run_summary.tsx deleted file mode 100644 index 52c830a238..0000000000 --- a/webapp/src/components/backstage/playbook_edit/automation/run_summary.tsx +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -import React from 'react'; -import {FormattedMessage, useIntl} from 'react-intl'; -import styled from 'styled-components'; - -import { - AutomationHeader, - AutomationTitle, -} from 'src/components/backstage/playbook_edit/automation/styles'; -import {Toggle} from 'src/components/backstage/playbook_edit/automation/toggle'; -import {StyledMarkdownTextbox} from 'src/components/backstage/styles'; - -interface Props { - enabled: boolean; - onToggle: () => void; - summary: string; - onSummaryChanged: (summary: string) => void; -} - -const RunSummary = ({enabled, onToggle, summary, onSummaryChanged}: Props) => { - const {formatMessage} = useIntl(); - - return ( - - - - - - - - - - ); -}; - -const StyledAutomationHeader = styled(AutomationHeader)` - align-items: start; - flex-direction: column; -`; - -const TextboxWrapper = styled.div` - margin-top: 2rem; - width: 100%; -`; - -export default RunSummary; diff --git a/webapp/src/components/backstage/playbook_edit/metrics/metric_edit.tsx b/webapp/src/components/backstage/playbook_edit/metrics/metric_edit.tsx index b4d5761e04..2d823b94ea 100644 --- a/webapp/src/components/backstage/playbook_edit/metrics/metric_edit.tsx +++ b/webapp/src/components/backstage/playbook_edit/metrics/metric_edit.tsx @@ -3,14 +3,14 @@ import React, {useState} from 'react'; import styled from 'styled-components'; -import {useIntl} from 'react-intl'; +import {FormattedMessage, useIntl} from 'react-intl'; import {Metric, MetricType} from 'src/types/playbook'; import {PrimaryButton} from 'src/components/assets/buttons'; import {StyledInput, HelpText, ErrorText} from 'src/components/backstage/playbook_runs/shared'; import {ClockOutline, DollarSign, PoundSign} from 'src/components/backstage/playbook_edit/styles'; import {stringToMetric, metricToString, isMetricValueValid} from 'src/components/backstage/playbook_edit/metrics/shared'; -import MetricInput from 'src/components/backstage/playbook_runs/playbook_run_backstage/metrics/metric_input'; +import MetricInput from 'src/components/backstage/playbook_runs/playbook_run/metrics/metric_input'; import {BaseTextArea} from 'src/components/assets/inputs'; import {VerticalSpacer} from 'src/components/backstage/styles'; @@ -72,21 +72,42 @@ const MetricEdit = ({metric, setMetric, otherTitles, onAdd, deleteClick, saveTog } } - let typeTitle = {' Dollars'}; let inputIcon = ; + let typeTitle = ( + + ); if (metric.type === MetricType.Integer) { - typeTitle = {' Integer'}; inputIcon = ; + typeTitle = ( + + ); } else if (metric.type === MetricType.Duration) { - typeTitle = {' Duration (in dd:hh:mm)'}; inputIcon = ; + typeTitle = ( + + ); } return ( - {'Type: '} - {typeTitle} + {typeTitle}}} + tagName={React.Fragment} + />