From d71043609e46d1999939038eb24dad3139743ff7 Mon Sep 17 00:00:00 2001 From: Leonard Gram Date: Tue, 2 Jul 2019 09:42:35 +0200 Subject: [PATCH 01/22] Testing: Include BatchRevoke for all tokens in the fake. (#17728) --- pkg/services/auth/testing.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pkg/services/auth/testing.go b/pkg/services/auth/testing.go index 378a68b053c1..4a31f3d9840a 100644 --- a/pkg/services/auth/testing.go +++ b/pkg/services/auth/testing.go @@ -15,6 +15,7 @@ type FakeUserAuthTokenService struct { ActiveAuthTokenCount func(ctx context.Context) (int64, error) GetUserTokenProvider func(ctx context.Context, userId, userTokenId int64) (*models.UserToken, error) GetUserTokensProvider func(ctx context.Context, userId int64) ([]*models.UserToken, error) + BatchRevokedTokenProvider func(ctx context.Context, userIds []int64) error } func NewFakeUserAuthTokenService() *FakeUserAuthTokenService { @@ -40,6 +41,9 @@ func NewFakeUserAuthTokenService() *FakeUserAuthTokenService { RevokeAllUserTokensProvider: func(ctx context.Context, userId int64) error { return nil }, + BatchRevokedTokenProvider: func(ctx context.Context, userIds []int64) error { + return nil + }, ActiveAuthTokenCount: func(ctx context.Context) (int64, error) { return 10, nil }, @@ -83,3 +87,7 @@ func (s *FakeUserAuthTokenService) GetUserToken(ctx context.Context, userId, use func (s *FakeUserAuthTokenService) GetUserTokens(ctx context.Context, userId int64) ([]*models.UserToken, error) { return s.GetUserTokensProvider(context.Background(), userId) } + +func (s *FakeUserAuthTokenService) BatchRevokeAllUserTokens(ctx context.Context, userIds []int64) error { + return s.BatchRevokedTokenProvider(ctx, userIds) +} From 8f150c67aa5b53f836427b335f77bc909d93580c Mon Sep 17 00:00:00 2001 From: Leonard Gram Date: Tue, 2 Jul 2019 09:43:25 +0200 Subject: [PATCH 02/22] Docs upgrading deps (#17657) * Docs: correct link to the Grafana build-container. * Docs: documents usage on the gopath when upgrading deps. * Dev docs: info for upgrading deps only in one location. --- UPGRADING_DEPENDENCIES.md | 18 +++++++++++++++--- pkg/README.md | 30 +----------------------------- 2 files changed, 16 insertions(+), 32 deletions(-) diff --git a/UPGRADING_DEPENDENCIES.md b/UPGRADING_DEPENDENCIES.md index 16e6ce9ad445..17321043426a 100644 --- a/UPGRADING_DEPENDENCIES.md +++ b/UPGRADING_DEPENDENCIES.md @@ -22,18 +22,30 @@ The Grafana project uses [Go modules](https://golang.org/cmd/go/#hdr-Modules__mo All dependencies are vendored in the `vendor/` directory. +_Note:_ Since most developers of Grafana still use the `GOPATH` we need to specify `GO111MODULE=on` to make `go mod` and `got get` work as intended. If you have setup Grafana outside of the `GOPATH` on your machine you can skip `GO111MODULE=on` when running the commands below. + To add or update a new dependency, use the `go get` command: ```bash +# The GO111MODULE variable can be omitted when the code isn't located in GOPATH. # Pick the latest tagged release. -go get example.com/some/module/pkg +GO111MODULE=on go get example.com/some/module/pkg # Pick a specific version. -go get example.com/some/module/pkg@vX.Y.Z +GO111MODULE=on go get example.com/some/module/pkg@vX.Y.Z ``` Tidy up the `go.mod` and `go.sum` files and copy the new/updated dependency to the `vendor/` directory: +```bash +# The GO111MODULE variable can be omitted when the code isn't located in GOPATH. +GO111MODULE=on go mod tidy + +GO111MODULE=on go mod vendor +``` + +You have to commit the changes to `go.mod`, `go.sum` and the `vendor/` directory before submitting the pull request. + ## Node.js Dependencies Updated using `yarn`. @@ -60,7 +72,7 @@ Our builds run on CircleCI through our build script. The main build step (in CircleCI) is built using a custom build container that comes pre-baked with some of the necessary dependencies. -Link: [grafana-build-container](https://github.com/grafana/grafana-build-container) +Link: [grafana/build-container](https://github.com/grafana/grafana/tree/master/scripts/build/ci-build) #### Dependencies diff --git a/pkg/README.md b/pkg/README.md index bcf14b420b70..3226cec05635 100644 --- a/pkg/README.md +++ b/pkg/README.md @@ -34,32 +34,4 @@ Newly introduced date columns in the database should be stored as epochs if date # Dependency management -The Grafana project uses [Go modules](https://golang.org/cmd/go/#hdr-Modules__module_versions__and_more) to manage dependencies on external packages. This requires a working Go environment with version 1.11 or greater installed. - -All dependencies are vendored in the `vendor/` directory. - -_Note:_ Since most developers of Grafana still use the `GOPATH` we need to specify `GO111MODULE=on` to make `go mod` and `got get` work as intended. If you have setup Grafana outside of the `GOPATH` on your machine you can skip `GO111MODULE=on` when running the commands below. - -To add or update a new dependency, use the `go get` command: - -```bash -# The GO111MODULE variable can be omitted when the code isn't located in GOPATH. -# Pick the latest tagged release. -GO111MODULE=on go get example.com/some/module/pkg - -# Pick a specific version. -GO111MODULE=on go get example.com/some/module/pkg@vX.Y.Z -``` - -Tidy up the `go.mod` and `go.sum` files and copy the new/updated dependency to the `vendor/` directory: - -```bash -# The GO111MODULE variable can be omitted when the code isn't located in GOPATH. -GO111MODULE=on go mod tidy - -GO111MODULE=on go mod vendor -``` - -You have to commit the changes to `go.mod`, `go.sum` and the `vendor/` directory before submitting the pull request. - - +Documented in [UPDRAGING_DEPENDENCIES.md](https://github.com/grafana/grafana/blob/master/UPGRADING_DEPENDENCIES.md). From 0a1bb97a2f84de32991684ee80250a99e3c2231d Mon Sep 17 00:00:00 2001 From: kay delaney <45561153+kaydelaney@users.noreply.github.com> Date: Tue, 2 Jul 2019 09:06:04 +0100 Subject: [PATCH 03/22] Loki: getHighlighterExpressionsFromQuery Returns null if filter term is not quoted (#17852) Closes #17687 --- .../app/plugins/datasource/loki/query_utils.test.ts | 8 ++++++++ public/app/plugins/datasource/loki/query_utils.ts | 11 +++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/public/app/plugins/datasource/loki/query_utils.test.ts b/public/app/plugins/datasource/loki/query_utils.test.ts index 964f8678a795..fc23ca2eef3e 100644 --- a/public/app/plugins/datasource/loki/query_utils.test.ts +++ b/public/app/plugins/datasource/loki/query_utils.test.ts @@ -71,17 +71,25 @@ describe('getHighlighterExpressionsFromQuery', () => { it('returns no expressions for empty query', () => { expect(getHighlighterExpressionsFromQuery('')).toEqual([]); }); + it('returns a single expressions for legacy query', () => { expect(getHighlighterExpressionsFromQuery('{} x')).toEqual(['(?i)x']); expect(getHighlighterExpressionsFromQuery('{foo="bar"} x')).toEqual(['(?i)x']); }); + it('returns an expression for query with filter', () => { expect(getHighlighterExpressionsFromQuery('{foo="bar"} |= "x"')).toEqual(['x']); }); + it('returns expressions for query with filter chain', () => { expect(getHighlighterExpressionsFromQuery('{foo="bar"} |= "x" |~ "y"')).toEqual(['x', 'y']); }); + it('returns drops expressions for query with negative filter chain', () => { expect(getHighlighterExpressionsFromQuery('{foo="bar"} |= "x" != "y"')).toEqual(['x']); }); + + it('returns null if filter term is not wrapped in double quotes', () => { + expect(getHighlighterExpressionsFromQuery('{foo="bar"} |= x')).toEqual(null); + }); }); diff --git a/public/app/plugins/datasource/loki/query_utils.ts b/public/app/plugins/datasource/loki/query_utils.ts index 54fcca8809a3..b4f6e31f358d 100644 --- a/public/app/plugins/datasource/loki/query_utils.ts +++ b/public/app/plugins/datasource/loki/query_utils.ts @@ -59,12 +59,19 @@ export function getHighlighterExpressionsFromQuery(input: string): string[] { if (filterEnd === -1) { filterTerm = expression.trim(); } else { - filterTerm = expression.substr(0, filterEnd); + filterTerm = expression.substr(0, filterEnd).trim(); expression = expression.substr(filterEnd); } // Unwrap the filter term by removing quotes - results.push(filterTerm.replace(/^\s*"/g, '').replace(/"\s*$/g, '')); + const quotedTerm = filterTerm.match(/^"((?:[^\\"]|\\")*)"$/); + + if (quotedTerm) { + const unwrappedFilterTerm = quotedTerm[1]; + results.push(unwrappedFilterTerm); + } else { + return null; + } } return results; } From 364f1f2e559c184170bd9b5e27edab0c06f296bf Mon Sep 17 00:00:00 2001 From: kay delaney <45561153+kaydelaney@users.noreply.github.com> Date: Tue, 2 Jul 2019 09:06:21 +0100 Subject: [PATCH 04/22] =?UTF-8?q?Explore:=C2=A0Log=20highlights=20only=20u?= =?UTF-8?q?pdate=20when=20user=20stops=20typing=20(#17845)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reverts performance enhancements made to LogsContainer as they are no longer needed, and complicated things. Closes #17818 --- public/app/features/explore/LogsContainer.tsx | 17 ++--------------- public/app/features/explore/QueryField.tsx | 6 +++++- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/public/app/features/explore/LogsContainer.tsx b/public/app/features/explore/LogsContainer.tsx index 4b5c00798d49..20da384dc1fe 100644 --- a/public/app/features/explore/LogsContainer.tsx +++ b/public/app/features/explore/LogsContainer.tsx @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import React, { PureComponent } from 'react'; import { hot } from 'react-hot-loader'; import { connect } from 'react-redux'; import { @@ -52,7 +52,7 @@ interface LogsContainerProps { absoluteRange: AbsoluteTimeRange; } -export class LogsContainer extends Component { +export class LogsContainer extends PureComponent { onChangeTime = (absoluteRange: AbsoluteTimeRange) => { const { exploreId, updateTimeRange } = this.props; @@ -86,19 +86,6 @@ export class LogsContainer extends Component { return []; }; - // Limit re-rendering to when a query is finished executing or when the deduplication strategy changes - // for performance reasons. - shouldComponentUpdate(nextProps: LogsContainerProps): boolean { - return ( - nextProps.loading !== this.props.loading || - nextProps.dedupStrategy !== this.props.dedupStrategy || - nextProps.logsHighlighterExpressions !== this.props.logsHighlighterExpressions || - nextProps.hiddenLogLevels !== this.props.hiddenLogLevels || - nextProps.scanning !== this.props.scanning || - nextProps.isLive !== this.props.isLive - ); - } - render() { const { exploreId, diff --git a/public/app/features/explore/QueryField.tsx b/public/app/features/explore/QueryField.tsx index aded4cf029ad..93b6c075092c 100644 --- a/public/app/features/explore/QueryField.tsx +++ b/public/app/features/explore/QueryField.tsx @@ -19,6 +19,7 @@ import { makeFragment, makeValue } from '@grafana/ui'; import PlaceholdersBuffer from './PlaceholdersBuffer'; export const TYPEAHEAD_DEBOUNCE = 100; +export const HIGHLIGHT_WAIT = 500; function getSuggestionByIndex(suggestions: CompletionItemGroup[], index: number): CompletionItem { // Flatten suggestion groups @@ -77,11 +78,13 @@ export class QueryField extends React.PureComponent) { super(props, context); this.placeholdersBuffer = new PlaceholdersBuffer(props.initialQuery || ''); + this.updateHighlightsTimer = _.debounce(this.updateLogsHighlights, HIGHLIGHT_WAIT); // Base plugins this.plugins = [ClearPlugin(), NewlinePlugin(), ...(props.additionalPlugins || [])].filter(p => p); @@ -152,7 +155,7 @@ export class QueryField extends React.PureComponent { const { onChange } = this.props; + if (onChange) { onChange(Plain.serialize(this.state.value)); } From caa1314f441c991ccb3a8e3fd70c1a263a239d6a Mon Sep 17 00:00:00 2001 From: Oleg Gaidarenko Date: Tue, 2 Jul 2019 16:06:59 +0300 Subject: [PATCH 05/22] Build: use golangci-lint as a make command (#17739) * Build: use golangci-lint as a make command * Since gometalinter was deprecated in favor of golangci-lint so it was replaced by it. Responsibilities held by the gometalinter was moved to golangci-lint * There was some changes in implementation (that was also mentioned in the code comment) between the tools, which uncovered couple errors in the code. Those issues were either solved or disabled by the inline comments * Introduce the golangci-lint config, to make their configuration more manageable * Build: replace backend-lint.sh script with make --- .circleci/config.yml | 32 ++-- Makefile | 31 +++- pkg/STYLEGUIDE.md | 5 +- pkg/api/pluginproxy/ds_proxy_test.go | 2 +- pkg/components/dynmap/dynmap_test.go | 16 +- pkg/login/social/social.go | 3 +- pkg/middleware/middleware_test.go | 11 +- pkg/models/datasource_cache_test.go | 1 + .../alerting/notifiers/alertmanager_test.go | 1 + pkg/services/alerting/notifiers/discord.go | 3 +- .../alerting/notifiers/hipchat_test.go | 4 +- pkg/services/alerting/notifiers/slack_test.go | 1 + .../provisioning/dashboards/file_reader.go | 4 +- pkg/services/sqlstore/user_auth_test.go | 1 + pkg/tsdb/elasticsearch/client/client_test.go | 1 + scripts/backend-lint.sh | 43 ----- scripts/go/configs/.golangci.yml | 25 +++ scripts/go/go.mod | 5 + scripts/go/go.sum | 173 ++++++++++++++++++ scripts/go/tools.go | 1 + 20 files changed, 278 insertions(+), 85 deletions(-) delete mode 100755 scripts/backend-lint.sh create mode 100644 scripts/go/configs/.golangci.yml diff --git a/.circleci/config.yml b/.circleci/config.yml index a783c8641a9f..7b71800a2e5b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -114,7 +114,7 @@ jobs: name: check documentation spelling errors command: 'codespell -I ./words_to_ignore.txt docs/' - backend-lint: + lint-go: docker: - image: circleci/golang:1.12.6 environment: @@ -124,8 +124,8 @@ jobs: steps: - checkout - run: - name: backend lint - command: './scripts/backend-lint.sh' + name: Lint Go + command: 'make lint-go' test-frontend: docker: @@ -633,7 +633,7 @@ workflows: filters: *filter-only-master - codespell: filters: *filter-only-master - - backend-lint: + - lint-go: filters: *filter-only-master - test-frontend: filters: *filter-only-master @@ -649,7 +649,7 @@ workflows: - test-backend - test-frontend - codespell - - backend-lint + - lint-go - mysql-integration-test - postgres-integration-test - build-oss-msi @@ -661,7 +661,7 @@ workflows: - test-backend - test-frontend - codespell - - backend-lint + - lint-go - mysql-integration-test - postgres-integration-test filters: *filter-only-master @@ -671,7 +671,7 @@ workflows: - test-backend - test-frontend - codespell - - backend-lint + - lint-go - mysql-integration-test - postgres-integration-test - build-all-enterprise @@ -682,7 +682,7 @@ workflows: - test-backend - test-frontend - codespell - - backend-lint + - lint-go - mysql-integration-test - postgres-integration-test filters: *filter-only-master @@ -702,7 +702,7 @@ workflows: filters: *filter-only-release - codespell: filters: *filter-only-release - - backend-lint: + - lint-go: filters: *filter-only-release - test-frontend: filters: *filter-only-release @@ -718,7 +718,7 @@ workflows: - test-backend - test-frontend - codespell - - backend-lint + - lint-go - mysql-integration-test - postgres-integration-test - build-oss-msi @@ -730,7 +730,7 @@ workflows: - test-backend - test-frontend - codespell - - backend-lint + - lint-go - mysql-integration-test - postgres-integration-test filters: *filter-only-release @@ -741,7 +741,7 @@ workflows: - test-backend - test-frontend - codespell - - backend-lint + - lint-go - mysql-integration-test - postgres-integration-test filters: *filter-only-release @@ -751,7 +751,7 @@ workflows: - test-backend - test-frontend - codespell - - backend-lint + - lint-go - mysql-integration-test - postgres-integration-test filters: *filter-only-release @@ -769,7 +769,7 @@ workflows: - build-fast-frontend - codespell: filters: *filter-not-release-or-master - - backend-lint: + - lint-go: filters: *filter-not-release-or-master - test-frontend: filters: *filter-not-release-or-master @@ -787,7 +787,7 @@ workflows: - test-backend - test-frontend - codespell - - backend-lint + - lint-go - mysql-integration-test - postgres-integration-test - cache-server-test @@ -798,7 +798,7 @@ workflows: - test-backend - test-frontend - codespell - - backend-lint + - lint-go - mysql-integration-test - postgres-integration-test - cache-server-test diff --git a/Makefile b/Makefile index 88c57a84ed5b..9347d8647b97 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ -include local/Makefile -.PHONY: all deps-go deps-js deps build-go build-server build-cli build-js build build-docker-dev build-docker-full lint-go test-go test-js test run clean gosec revive devenv devenv-down revive-alerting +.PHONY: all deps-go deps-js deps build-go build-server build-cli build-js build build-docker-dev build-docker-full lint-go gosec revive golangci-lint go-vet test-go test-js test run clean devenv devenv-down revive-alerting GO := GO111MODULE=on go GO_FILES := ./pkg/... @@ -43,10 +43,6 @@ build-docker-full: @echo "build docker container" docker build --tag grafana/grafana:dev . -lint-go: - @echo "lint go source" - scripts/backend-lint.sh - test-go: @echo "test backend" GO111MODULE=on go test -v ./pkg/... @@ -78,27 +74,46 @@ scripts/go/bin/bra: scripts/go/go.mod @cd scripts/go; \ $(GO) build -o ./bin/bra github.com/Unknwon/bra +scripts/go/bin/golangci-lint: scripts/go/go.mod + @cd scripts/go; \ + $(GO) build -o ./bin/golangci-lint github.com/golangci/golangci-lint/cmd/golangci-lint + revive: scripts/go/bin/revive + @echo "lint via revive" @scripts/go/bin/revive \ -formatter stylish \ -config ./scripts/go/configs/revive.toml \ $(GO_FILES) revive-alerting: scripts/go/bin/revive + @echo "lint alerting via revive" @scripts/go/bin/revive \ -formatter stylish \ ./pkg/services/alerting/... -run: scripts/go/bin/bra - @scripts/go/bin/bra run - # TODO recheck the rules and leave only necessary exclusions gosec: scripts/go/bin/gosec + @echo "lint via gosec" @scripts/go/bin/gosec -quiet \ -exclude=G104,G107,G201,G202,G204,G301,G304,G401,G402,G501 \ -conf=./scripts/go/configs/gosec.json \ $(GO_FILES) +golangci-lint: scripts/go/bin/golangci-lint + @echo "lint via golangci-lint" + @scripts/go/bin/golangci-lint run \ + --config ./scripts/go/configs/.golangci.yml \ + $(GO_FILES) + +go-vet: + @echo "lint via go vet" + @go vet $(GO_FILES) + +lint-go: go-vet golangci-lint revive revive-alerting gosec + +run: scripts/go/bin/bra + @scripts/go/bin/bra run + # create docker-compose file with provided sources and start them # example: make devenv sources=postgres,openldap ifeq ($(sources),) diff --git a/pkg/STYLEGUIDE.md b/pkg/STYLEGUIDE.md index 8fce578cfad7..3d162b61100a 100644 --- a/pkg/STYLEGUIDE.md +++ b/pkg/STYLEGUIDE.md @@ -5,7 +5,10 @@ Grafanas backend has been developed for a long time with a mix of code styles. This style guide is a guide for how we want to write Go code in the future. Generally, we want to follow the style guides used in Go [Code Review Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) and Peter Bourgon's [Go: Best Practices for Production Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style) ## Linting and formatting -We enforce strict `gofmt` formating and use some linters on our codebase. You can find the current list of linters at https://github.com/grafana/grafana/blob/master/scripts/backend-lint.sh +We enforce strict `gofmt` formating and use some linters on our codebase. You can lint the codebase with Date: Tue, 2 Jul 2019 15:25:31 +0200 Subject: [PATCH 06/22] Chore: Build grafana-cli when running bra run (#17788) --- .bra.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.bra.toml b/.bra.toml index 5be42ceebbf0..01d50e8c9288 100644 --- a/.bra.toml +++ b/.bra.toml @@ -1,6 +1,7 @@ [run] init_cmds = [ - ["go", "run", "build.go", "-dev", "build-server"], + ["go", "run", "build.go", "-dev", "build-cli"], + ["go", "run", "build.go", "-dev", "build-server"], ["./bin/grafana-server", "-packaging=dev", "cfg:app_mode=development"] ] watch_all = true From 3aed4d36137f60c577ffff804863cbd3f12597c2 Mon Sep 17 00:00:00 2001 From: Tobias Skarhed Date: Tue, 2 Jul 2019 16:42:08 +0200 Subject: [PATCH 07/22] StatsPicker: Fix multiple value input layout etc. (#17827) * Add padding and centering * Vertically center input * Add noOptions styles * Move reove button to same line * StatsPicker: style tweak --- .../src/components/Select/_Select.scss | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages/grafana-ui/src/components/Select/_Select.scss b/packages/grafana-ui/src/components/Select/_Select.scss index f9c635053dda..5814b2aaa6f5 100644 --- a/packages/grafana-ui/src/components/Select/_Select.scss +++ b/packages/grafana-ui/src/components/Select/_Select.scss @@ -58,6 +58,10 @@ $select-input-bg-disabled: $input-bg-disabled; position: absolute; z-index: $zindex-dropdown; min-width: 100%; + &-notice--no-options { + background-color: $input-bg; + padding: 10px; + } } .gf-form-select-box__menu-list { @@ -75,6 +79,21 @@ $select-input-bg-disabled: $input-bg-disabled; .gf-form-select-box__multi-value { display: inline; + margin: 0 6px 0 0; + cursor: pointer; +} + +.gf-form-select-box__multi-value__remove { + text-align: center; + display: inline-block; + height: 14px; + vertical-align: middle; + margin-left: 2px; +} + +.gf-form-select-box__multi-value__label { + display: inline; + vertical-align: middle; } .gf-form-select-box__option { @@ -105,6 +124,7 @@ $select-input-bg-disabled: $input-bg-disabled; vertical-align: middle; > div { display: inline-block; + vertical-align: middle; } } From a2c1462675da639d5de1a9d0f881db4a55cd917f Mon Sep 17 00:00:00 2001 From: Marcus Efraimsson Date: Tue, 2 Jul 2019 18:06:02 +0200 Subject: [PATCH 08/22] Docs: Fix developing plugins index page (#17877) Fixes #17874 --- docs/sources/plugins/developing/{index.md => _index.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/sources/plugins/developing/{index.md => _index.md} (100%) diff --git a/docs/sources/plugins/developing/index.md b/docs/sources/plugins/developing/_index.md similarity index 100% rename from docs/sources/plugins/developing/index.md rename to docs/sources/plugins/developing/_index.md From 498572d2d8176bd07c59c3c49e598431c3b4892e Mon Sep 17 00:00:00 2001 From: Tobias Skarhed Date: Wed, 3 Jul 2019 09:50:42 +0200 Subject: [PATCH 09/22] Docs: How to work with themes (#17876) * Add docs for themes * Edit description a little bit * Update themes.md --- style_guides/themes.md | 103 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 style_guides/themes.md diff --git a/style_guides/themes.md b/style_guides/themes.md new file mode 100644 index 000000000000..e9a9f83215b3 --- /dev/null +++ b/style_guides/themes.md @@ -0,0 +1,103 @@ +## Core changes + +JS is the primary source of theme variables for Grafana. Theme definitions are located in `@grafana/ui/themes` directory. + +#### Themes are implemented in pure js. + +This is because our goal is to share variables between app and SASS. To achieve that themes are necessary during build time to be exposed to sass loader via `node-sass` functions (https://github.com/sass/node-sass/blob/master/README.md#functions--v300---experimental). This retrieval is implemented in `getThemeVariable(variablePath, themeName)`. + +#### Themes are available to React components via `ThemeContext` + +Context is available via `import { ThemeContext } from '@grafana/ui';` + +**If you skip `themeName` param, then dark theme's variant will be used** + +## Using themes in Grafana + +### SASS + +`getThemeVariable` is a function, that's available in sass files. Use it i.e. like this: + +```scss +// In theme agnostic SASS file +.foo { + font-size: getThemeVariable('typography.size.m'); +} + +// In *.[themeName].scss +.bar { + background-color: getThemeVariable('colors.blueLight', '[themeName]'); +} +``` + +### React + +#### Using `ThemeContext` directly + +```ts +import { ThemeContext } from '@grafana/ui'; + +{theme => }; +``` + +#### Using `withTheme` HOC + +With this method your component will be automatically wrapped in `ThemeContext.Consumer` and provided with current theme via `theme` prop. Component used with `withTheme` must implement `Themeable` interface. + +```ts +import { ThemeContext, Themeable } from '@grafana/ui'; + +interface FooProps extends Themeable {} + +const Foo: React.FunctionComponent = () => ... + +export default withTheme(Foo); +``` + +### Storybook + +All stories are wrapped with `ThemeContext.Provider` using global decorator. To render `Themeable` component that's not wrapped by `withTheme` HOC you either create a new component in your story: + +```tsx +// Foo.story.tsx +const FooWithTheme = withTheme(Foo); + +FooStories.add('Story' () => { + return +}); +``` + +or use `renderComponentWithTheme` helper: + +```tsx +// Bar.story.tsx + +BarStories.add('Story' () => { + return renderComponentWithTheme(Bar, /* pass props here */) +}); +``` + +### Angular + +There should be very few cases when theme would be used in Angular context. For this purpise there is a function available that retrieves current theme: `import { getCurrentTheme } from app/core/utils/ConfigProvider` + +## Limitations + +- #### Hot updates + Changes in JS theme files _are not subject of hot updates_ during development. This applies to styles that comes from SASS files (which means 100% until we introduce css in js approach). This is a consequence of the fact that `getThemeVariable` util is executed during webpack pipeline. +- #### You must ensure ThemeContext provider is available in a React tree + By default all react2angular directives have `ThemeContext.Provider` ensured. But, there are cases where we create another React tree via `ReactDOM.render`. This happens in case of graph legend rendering and `ReactContainer` directive. In such cases theme consumption will fail. To make sure theme context is available in such cases, you need to wrap your rendered component with ThemeContext.Provider using `provideTheme` function: + +```typescript +// graph.ts +import { provideTheme } from 'app/core/utils/ConfigProvider'; + +// Create component with ThemeContext.Provider first. +// Otherwise React will create new components every time it renders! +const LegendWithThemeProvider = provideTheme(Legend); + +const legendReactElem = React.createElement(LegendWithThemeProvider, legendProps); +ReactDOM.render(legendReactElem, this.legendElem, () => this.renderPanel()); +``` + +`provideTheme` makes current theme available via ThemeContext by checking if user has `lightTheme` set in her boot data. From 2ae6adef26aad8ebb3b0f68db378dfe5664837a6 Mon Sep 17 00:00:00 2001 From: Sofia Papagiannaki Date: Wed, 3 Jul 2019 11:36:01 +0300 Subject: [PATCH 10/22] Codestyle: add guidelines for removing the m alias for models (#17890) * Add guidelines for avoiding use of m alias for models * Add suggestion for elimination of existing aliases --- pkg/ARCHITECTURE.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/ARCHITECTURE.md b/pkg/ARCHITECTURE.md index 330f60d0c80c..612d82ea549c 100644 --- a/pkg/ARCHITECTURE.md +++ b/pkg/ARCHITECTURE.md @@ -31,6 +31,10 @@ We value clean & readable code that is loosely coupled and covered by unit tests The majority of our tests uses go convey but thats something we want to avoid going forward. For new tests we want to use standard library and `testify/assert`. +## Import aliases +Currently there are import aliases for `/pkg/models` package but thats something we want to avoid going forward. +Newly introduced code should refer explicitly to the `models` instead of using the alias `m`. Whenever changing existing code it's desired to remove the import aliases as well. + ## The Bus The bus is our way to introduce indirection between the HTTP handlers and sqlstore (responsible for fetching data from the database). Http handlers and sqlstore don't depend on each other. They only depend on the bus and the domain model(pkg/models). This makes it easier to test the code and avoids coupling. More about this under `current rewrite/refactorings` From b06ad02a749e0c9167dc2a8fe46cb1fd5995175c Mon Sep 17 00:00:00 2001 From: kay delaney <45561153+kaydelaney@users.noreply.github.com> Date: Wed, 3 Jul 2019 13:49:47 +0100 Subject: [PATCH 11/22] Explore: Query rows are now reset when changing data sources (#17865) Except when those data sources are compatible, via query import. Closes #17861 --- public/app/features/explore/state/reducers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/app/features/explore/state/reducers.ts b/public/app/features/explore/state/reducers.ts index dcbd19bc1cfe..56fb29b0273a 100644 --- a/public/app/features/explore/state/reducers.ts +++ b/public/app/features/explore/state/reducers.ts @@ -264,7 +264,7 @@ export const itemReducer = reducerFactory({} as ExploreItemSta loadingState: LoadingState.NotStarted, StartPage, showingStartPage: Boolean(StartPage), - queryKeys: getQueryKeys(state.queries, datasourceInstance), + queryKeys: [], supportedModes, mode, }; From 1c291e26f836ab003dd95951da4137f61d787aab Mon Sep 17 00:00:00 2001 From: kay delaney <45561153+kaydelaney@users.noreply.github.com> Date: Wed, 3 Jul 2019 13:54:06 +0100 Subject: [PATCH 12/22] Loki: Adds comment explaining usage of RFC3339Nano string (#17872) * Loki: Adds comment explaining usage of RFC3339Nano string --- public/app/plugins/datasource/loki/datasource.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/app/plugins/datasource/loki/datasource.ts b/public/app/plugins/datasource/loki/datasource.ts index c5cf29261726..e77f7252544f 100644 --- a/public/app/plugins/datasource/loki/datasource.ts +++ b/public/app/plugins/datasource/loki/datasource.ts @@ -310,7 +310,7 @@ export class LokiDatasource extends DataSourceApi { return { ...commontTargetOptons, start: timeEpochNs - contextTimeBuffer, - end: row.timestamp, + end: row.timestamp, // using RFC3339Nano format to avoid precision loss direction, }; } else { From 0d2be0a7ed6b27ce365e8f0c6c8c5bb80f93e738 Mon Sep 17 00:00:00 2001 From: Anthony Templeton Date: Wed, 3 Jul 2019 09:16:00 -0400 Subject: [PATCH 13/22] Logging: Login and Logout logging actions (#17760) (#17883) --- pkg/api/login.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/api/login.go b/pkg/api/login.go index fe4b8f5d1be2..975a905853c5 100644 --- a/pkg/api/login.go +++ b/pkg/api/login.go @@ -126,7 +126,6 @@ func (hs *HTTPServer) LoginPost(c *m.ReqContext, cmd dtos.LoginCommand) Response } metrics.M_Api_Login_Post.Inc() - return JSON(200, result) } @@ -139,7 +138,7 @@ func (hs *HTTPServer) loginUserWithUser(user *m.User, c *m.ReqContext) { if err != nil { hs.log.Error("failed to create auth token", "error", err) } - + hs.log.Info("Successful Login", "User", user.Email) middleware.WriteSessionCookie(c, userToken.UnhashedToken, hs.Cfg.LoginMaxLifetimeDays) } @@ -153,6 +152,7 @@ func (hs *HTTPServer) Logout(c *m.ReqContext) { if setting.SignoutRedirectUrl != "" { c.Redirect(setting.SignoutRedirectUrl) } else { + hs.log.Info("Successful Logout", "User", c.Email) c.Redirect(setting.AppSubUrl + "/login") } } From 3d848d0fdf88d9a5a0ee7a375e565cb2b21e9138 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Wed, 3 Jul 2019 16:52:10 +0300 Subject: [PATCH 14/22] Teams: show proper label for each auth provider (#17860) * Teams: show proper label for each auth provider Teams: don't sore AuthModule in team_member table, use JOIN to get it instead * Teams: fix AddTeamMember after last changes * Teams: add more auth provider labels * Teams: show external sync badge if LDAP is not enabled * Teams: tests for getting auth module --- pkg/api/team_members.go | 22 ++++++++++++++++++++-- pkg/models/team_member.go | 1 + pkg/services/sqlstore/team.go | 13 +++++++++++-- pkg/services/sqlstore/team_test.go | 26 ++++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 4 deletions(-) diff --git a/pkg/api/team_members.go b/pkg/api/team_members.go index bc622f8662ae..5d34323c55f9 100644 --- a/pkg/api/team_members.go +++ b/pkg/api/team_members.go @@ -21,14 +21,32 @@ func GetTeamMembers(c *m.ReqContext) Response { member.AvatarUrl = dtos.GetGravatarUrl(member.Email) member.Labels = []string{} - if setting.IsEnterprise && setting.LDAPEnabled && member.External { - member.Labels = append(member.Labels, "LDAP") + if setting.IsEnterprise && member.External { + authProvider := GetAuthProviderLabel(member.AuthModule) + member.Labels = append(member.Labels, authProvider) } } return JSON(200, query.Result) } +func GetAuthProviderLabel(authModule string) string { + switch authModule { + case "oauth_github": + return "GitHub" + case "oauth_google": + return "Google" + case "oauth_gitlab": + return "GitLab" + case "oauth_grafana_com", "oauth_grafananet": + return "grafana.com" + case "ldap", "": + return "LDAP" + default: + return "OAuth" + } +} + // POST /api/teams/:teamId/members func (hs *HTTPServer) AddTeamMember(c *m.ReqContext, cmd m.AddTeamMemberCommand) Response { cmd.OrgId = c.OrgId diff --git a/pkg/models/team_member.go b/pkg/models/team_member.go index 0b80aef8f44f..6e17872a072c 100644 --- a/pkg/models/team_member.go +++ b/pkg/models/team_member.go @@ -68,6 +68,7 @@ type TeamMemberDTO struct { TeamId int64 `json:"teamId"` UserId int64 `json:"userId"` External bool `json:"-"` + AuthModule string `json:"auth_module"` Email string `json:"email"` Login string `json:"login"` AvatarUrl string `json:"avatarUrl"` diff --git a/pkg/services/sqlstore/team.go b/pkg/services/sqlstore/team.go index 03fd2df78fc1..460eb5925985 100644 --- a/pkg/services/sqlstore/team.go +++ b/pkg/services/sqlstore/team.go @@ -41,7 +41,7 @@ func getTeamSelectSqlBase() string { team.org_id, team.name as name, team.email as email, - (SELECT COUNT(*) from team_member where team_member.team_id = team.id) as member_count + (SELECT COUNT(*) from team_member where team_member.team_id = team.id) as member_count FROM team as team ` } @@ -365,6 +365,15 @@ func GetTeamMembers(query *m.GetTeamMembersQuery) error { query.Result = make([]*m.TeamMemberDTO, 0) sess := x.Table("team_member") sess.Join("INNER", x.Dialect().Quote("user"), fmt.Sprintf("team_member.user_id=%s.id", x.Dialect().Quote("user"))) + + // Join with only most recent auth module + authJoinCondition := `( + SELECT id from user_auth + WHERE user_auth.user_id = team_member.user_id + ORDER BY user_auth.created DESC ` + authJoinCondition = "user_auth.id=" + authJoinCondition + dialect.Limit(1) + ")" + sess.Join("LEFT", "user_auth", authJoinCondition) + if query.OrgId != 0 { sess.Where("team_member.org_id=?", query.OrgId) } @@ -377,7 +386,7 @@ func GetTeamMembers(query *m.GetTeamMembersQuery) error { if query.External { sess.Where("team_member.external=?", dialect.BooleanStr(true)) } - sess.Cols("team_member.org_id", "team_member.team_id", "team_member.user_id", "user.email", "user.login", "team_member.external", "team_member.permission") + sess.Cols("team_member.org_id", "team_member.team_id", "team_member.user_id", "user.email", "user.login", "team_member.external", "team_member.permission", "user_auth.auth_module") sess.Asc("user.login", "user.email") err := sess.Find(&query.Result) diff --git a/pkg/services/sqlstore/team_test.go b/pkg/services/sqlstore/team_test.go index 7ac78733af78..c407fd9a8d44 100644 --- a/pkg/services/sqlstore/team_test.go +++ b/pkg/services/sqlstore/team_test.go @@ -75,6 +75,32 @@ func TestTeamCommandsAndQueries(t *testing.T) { So(q2.Result[0].External, ShouldEqual, true) }) + Convey("Should return latest auth module for users when getting team members", func() { + userId := userIds[1] + err := SetAuthInfo(&m.SetAuthInfoCommand{UserId: userId, AuthModule: "oauth_github", AuthId: "1234567"}) + So(err, ShouldBeNil) + + teamQuery := &m.SearchTeamsQuery{OrgId: testOrgId, Name: "group1 name", Page: 1, Limit: 10} + err = SearchTeams(teamQuery) + So(err, ShouldBeNil) + So(teamQuery.Page, ShouldEqual, 1) + + team1 := teamQuery.Result.Teams[0] + + err = AddTeamMember(&m.AddTeamMemberCommand{OrgId: testOrgId, TeamId: team1.Id, UserId: userId, External: true}) + So(err, ShouldBeNil) + + memberQuery := &m.GetTeamMembersQuery{OrgId: testOrgId, TeamId: team1.Id, External: true} + err = GetTeamMembers(memberQuery) + So(err, ShouldBeNil) + So(memberQuery.Result, ShouldHaveLength, 1) + So(memberQuery.Result[0].TeamId, ShouldEqual, team1.Id) + So(memberQuery.Result[0].Login, ShouldEqual, "loginuser1") + So(memberQuery.Result[0].OrgId, ShouldEqual, testOrgId) + So(memberQuery.Result[0].External, ShouldEqual, true) + So(memberQuery.Result[0].AuthModule, ShouldEqual, "oauth_github") + }) + Convey("Should be able to update users in a team", func() { userId := userIds[0] team := group1.Result From 2596974cd2b3fe348293e7d65c6cf6811f649741 Mon Sep 17 00:00:00 2001 From: Leonard Gram Date: Wed, 3 Jul 2019 16:00:34 +0200 Subject: [PATCH 15/22] Build: fixes missing shebang in release tagging script. (#17894) --- scripts/tag_release.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/tag_release.sh b/scripts/tag_release.sh index 9d56c4e48ca3..fe047266c44e 100755 --- a/scripts/tag_release.sh +++ b/scripts/tag_release.sh @@ -1,4 +1,4 @@ -#/bin/bash +#!/usr/bin/env bash # abort if we get any error set -e @@ -33,8 +33,9 @@ echo "press [y] to push the tags" read -n 1 confirm -if [ "${confirm}" == "y" ]; then +if [ "${confirm}" == "y" ]; then git push origin "${_branch}" --tags -else +else + git tag -d "${_tag}" echo "Abort! " fi From 444c4d59991bd950d16046104a58b5e5fb248d68 Mon Sep 17 00:00:00 2001 From: Oleg Gaidarenko Date: Wed, 3 Jul 2019 17:39:54 +0300 Subject: [PATCH 16/22] LDAP: Divide the requests (#17885) * LDAP: Divide the requests Active Directory does indeed have a limitation with 1000 results per search (default of course). However, that limitation can be workaround with the pagination search feature, meaning `pagination` number is how many times LDAP compatible server will be requested by the client with specified amount of users (like 1000). That feature already embeded with LDAP compatible client (including our `go-ldap`). But slapd server has by default stricter settings. First, limitation is not 1000 but 500, second, pagination workaround presumably (information about it a bit scarce and I still not sure on some of the details from my own testing) cannot be workaround with pagination feature. See https://www.openldap.org/doc/admin24/limits.html https://serverfault.com/questions/328671/paging-using-ldapsearch hashicorp/vault#4162 - not sure why they were hitting the limit in the first place, since `go-ldap` doesn't have one by default. But, given all that, for me `ldapsearch` command with same request as with `go-ldap` still returns more then 500 results, it can even return as much as 10500 items (probably more). So either there is some differences with implementation of the LDAP search between `go-ldap` module and `ldapsearch` or I am missing a step :/. In the wild (see serverfault link), apparently, people still hitting that limitation even with `ldapsearch`, so it still seems to be an issue. But, nevertheless, I'm still confused by this incoherence. To workaround it, I divide the request by no more then 500 items per search --- pkg/services/ldap/ldap.go | 83 +++++++++++++++---- pkg/services/ldap/ldap_helpers_test.go | 79 ++++++++++++++++++ pkg/services/ldap/ldap_private_test.go | 4 +- .../ldap/{ldap_test_mocks.go => testing.go} | 0 4 files changed, 148 insertions(+), 18 deletions(-) rename pkg/services/ldap/{ldap_test_mocks.go => testing.go} (100%) diff --git a/pkg/services/ldap/ldap.go b/pkg/services/ldap/ldap.go index d53d91666020..bea06b45a2d8 100644 --- a/pkg/services/ldap/ldap.go +++ b/pkg/services/ldap/ldap.go @@ -6,11 +6,12 @@ import ( "errors" "fmt" "io/ioutil" + "math" "strings" + "github.com/davecgh/go-spew/spew" "gopkg.in/ldap.v3" - "github.com/davecgh/go-spew/spew" "github.com/grafana/grafana/pkg/bus" "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/models" @@ -43,6 +44,11 @@ type Server struct { log log.Logger } +// UsersMaxRequest is a max amount of users we can request via Users(). +// Since many LDAP servers has limitations +// on how much items can we return in one request +const UsersMaxRequest = 500 + var ( // ErrInvalidCredentials is returned if username and password do not match @@ -148,10 +154,67 @@ func (server *Server) Login(query *models.LoginUserQuery) ( return user, nil } +// getUsersIteration is a helper function for Users() method. +// It divides the users by equal parts for the anticipated requests +func getUsersIteration(logins []string, fn func(int, int) error) error { + lenLogins := len(logins) + iterations := int( + math.Ceil( + float64(lenLogins) / float64(UsersMaxRequest), + ), + ) + + for i := 1; i < iterations+1; i++ { + previous := float64(UsersMaxRequest * (i - 1)) + current := math.Min(float64(i*UsersMaxRequest), float64(lenLogins)) + + err := fn(int(previous), int(current)) + if err != nil { + return err + } + } + + return nil +} + // Users gets LDAP users func (server *Server) Users(logins []string) ( []*models.ExternalUserInfo, error, +) { + var users []*ldap.Entry + err := getUsersIteration(logins, func(previous, current int) error { + entries, err := server.users(logins[previous:current]) + if err != nil { + return err + } + + users = append(users, entries...) + + return nil + }) + if err != nil { + return nil, err + } + + if len(users) == 0 { + return []*models.ExternalUserInfo{}, nil + } + + serializedUsers, err := server.serializeUsers(users) + if err != nil { + return nil, err + } + + server.log.Debug("LDAP users found", "users", spew.Sdump(serializedUsers)) + + return serializedUsers, nil +} + +// users is helper method for the Users() +func (server *Server) users(logins []string) ( + []*ldap.Entry, + error, ) { var result *ldap.SearchResult var Config = server.Config @@ -170,18 +233,7 @@ func (server *Server) Users(logins []string) ( } } - if len(result.Entries) == 0 { - return []*models.ExternalUserInfo{}, nil - } - - serializedUsers, err := server.serializeUsers(result) - if err != nil { - return nil, err - } - - server.log.Debug("LDAP users found", "users", spew.Sdump(serializedUsers)) - - return serializedUsers, nil + return result.Entries, nil } // validateGrafanaUser validates user access. @@ -261,7 +313,6 @@ func (server *Server) getSearchRequest( return &ldap.SearchRequest{ BaseDN: base, Scope: ldap.ScopeWholeSubtree, - SizeLimit: 1000, DerefAliases: ldap.NeverDerefAliases, Attributes: attributes, Filter: filter, @@ -407,11 +458,11 @@ func (server *Server) requestMemberOf(entry *ldap.Entry) ([]string, error) { // serializeUsers serializes the users // from LDAP result to ExternalInfo struct func (server *Server) serializeUsers( - users *ldap.SearchResult, + entries []*ldap.Entry, ) ([]*models.ExternalUserInfo, error) { var serialized []*models.ExternalUserInfo - for _, user := range users.Entries { + for _, user := range entries { extUser, err := server.buildGrafanaUser(user) if err != nil { return nil, err diff --git a/pkg/services/ldap/ldap_helpers_test.go b/pkg/services/ldap/ldap_helpers_test.go index 0f30f228fc4e..b9f49c496444 100644 --- a/pkg/services/ldap/ldap_helpers_test.go +++ b/pkg/services/ldap/ldap_helpers_test.go @@ -25,6 +25,85 @@ func TestLDAPHelpers(t *testing.T) { }) }) + Convey("getUsersIteration()", t, func() { + Convey("it should execute twice for 600 users", func() { + logins := make([]string, 600) + i := 0 + + result := getUsersIteration(logins, func(previous, current int) error { + i++ + + if i == 1 { + So(previous, ShouldEqual, 0) + So(current, ShouldEqual, 500) + } else { + So(previous, ShouldEqual, 500) + So(current, ShouldEqual, 600) + } + + return nil + }) + + So(i, ShouldEqual, 2) + So(result, ShouldBeNil) + }) + + Convey("it should execute three times for 1500 users", func() { + logins := make([]string, 1500) + i := 0 + + result := getUsersIteration(logins, func(previous, current int) error { + i++ + if i == 1 { + So(previous, ShouldEqual, 0) + So(current, ShouldEqual, 500) + } else if i == 2 { + So(previous, ShouldEqual, 500) + So(current, ShouldEqual, 1000) + } else { + So(previous, ShouldEqual, 1000) + So(current, ShouldEqual, 1500) + } + + return nil + }) + + So(i, ShouldEqual, 3) + So(result, ShouldBeNil) + }) + + Convey("it should execute once for 400 users", func() { + logins := make([]string, 400) + i := 0 + + result := getUsersIteration(logins, func(previous, current int) error { + i++ + if i == 1 { + So(previous, ShouldEqual, 0) + So(current, ShouldEqual, 400) + } + + return nil + }) + + So(i, ShouldEqual, 1) + So(result, ShouldBeNil) + }) + + Convey("it should not execute for 0 users", func() { + logins := make([]string, 0) + i := 0 + + result := getUsersIteration(logins, func(previous, current int) error { + i++ + return nil + }) + + So(i, ShouldEqual, 0) + So(result, ShouldBeNil) + }) + }) + Convey("getAttribute()", t, func() { Convey("Should get username", func() { value := []string{"roelgerrits"} diff --git a/pkg/services/ldap/ldap_private_test.go b/pkg/services/ldap/ldap_private_test.go index 83de153ceab6..d7e8c57aeb96 100644 --- a/pkg/services/ldap/ldap_private_test.go +++ b/pkg/services/ldap/ldap_private_test.go @@ -37,7 +37,7 @@ func TestLDAPPrivateMethods(t *testing.T) { {Name: "memberof", Values: []string{"admins"}}, }, } - users := &ldap.SearchResult{Entries: []*ldap.Entry{&entry}} + users := []*ldap.Entry{&entry} result, err := server.serializeUsers(users) @@ -71,7 +71,7 @@ func TestLDAPPrivateMethods(t *testing.T) { {Name: "memberof", Values: []string{"admins"}}, }, } - users := &ldap.SearchResult{Entries: []*ldap.Entry{&entry}} + users := []*ldap.Entry{&entry} result, err := server.serializeUsers(users) diff --git a/pkg/services/ldap/ldap_test_mocks.go b/pkg/services/ldap/testing.go similarity index 100% rename from pkg/services/ldap/ldap_test_mocks.go rename to pkg/services/ldap/testing.go From 98147fd52b7c99ecb115832c6b9d98e25b35311c Mon Sep 17 00:00:00 2001 From: kay delaney <45561153+kaydelaney@users.noreply.github.com> Date: Wed, 3 Jul 2019 15:42:03 +0100 Subject: [PATCH 17/22] Explore: Adds support for toggling text edit mode in explore (#17870) * Explore: Adds support for toggling text edit mode in explore Also modifies query-row-status css to use relative position instead of absolute Closes #16770 * Explore: Defines State interface for and removes unnecessary constructor --- public/app/features/explore/QueryEditor.tsx | 20 +++++++++++--- public/app/features/explore/QueryRow.tsx | 29 ++++++++++++++++++--- public/sass/pages/_explore.scss | 5 ++-- 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/public/app/features/explore/QueryEditor.tsx b/public/app/features/explore/QueryEditor.tsx index d29e8a0e8925..53212c4d76e5 100644 --- a/public/app/features/explore/QueryEditor.tsx +++ b/public/app/features/explore/QueryEditor.tsx @@ -19,11 +19,13 @@ interface QueryEditorProps { initialQuery: DataQuery; exploreEvents: Emitter; range: TimeRange; + textEditModeEnabled?: boolean; } export default class QueryEditor extends PureComponent { element: any; component: AngularComponent; + angularScope: any; async componentDidMount() { if (!this.element) { @@ -58,6 +60,7 @@ export default class QueryEditor extends PureComponent { }; this.component = loader.load(this.element, scopeProps, template); + this.angularScope = scopeProps.ctrl; setTimeout(() => { this.props.onQueryChange(target); this.props.onExecuteQuery(); @@ -65,10 +68,19 @@ export default class QueryEditor extends PureComponent { } componentDidUpdate(prevProps: QueryEditorProps) { - if (prevProps.error !== this.props.error && this.component) { - // Some query controllers listen to data error events and need a digest - // for some reason this needs to be done in next tick - setTimeout(this.component.digest); + const hasToggledEditorMode = prevProps.textEditModeEnabled !== this.props.textEditModeEnabled; + const hasNewError = prevProps.error !== this.props.error; + + if (this.component) { + if (hasToggledEditorMode) { + this.angularScope.toggleEditorMode(); + } + + if (hasNewError || hasToggledEditorMode) { + // Some query controllers listen to data error events and need a digest + // for some reason this needs to be done in next tick + setTimeout(this.component.digest); + } } } diff --git a/public/app/features/explore/QueryRow.tsx b/public/app/features/explore/QueryRow.tsx index 03d066ce5a36..54b0162c5521 100644 --- a/public/app/features/explore/QueryRow.tsx +++ b/public/app/features/explore/QueryRow.tsx @@ -53,7 +53,15 @@ interface QueryRowProps extends PropsFromParent { mode: ExploreMode; } -export class QueryRow extends PureComponent { +interface QueryRowState { + textEditModeEnabled: boolean; +} + +export class QueryRow extends PureComponent { + state: QueryRowState = { + textEditModeEnabled: false, + }; + onRunQuery = () => { const { exploreId } = this.props; this.props.runQueries(exploreId); @@ -95,6 +103,10 @@ export class QueryRow extends PureComponent { this.props.runQueries(exploreId); }; + onClickToggleEditorMode = () => { + this.setState({ textEditModeEnabled: !this.state.textEditModeEnabled }); + }; + updateLogsHighlights = _.debounce((value: DataQuery) => { const { datasourceInstance } = this.props; if (datasourceInstance.getHighlighterExpression) { @@ -117,6 +129,7 @@ export class QueryRow extends PureComponent { queryErrors, mode, } = this.props; + const canToggleEditorModes = _.has(datasourceInstance, 'components.QueryCtrl.prototype.toggleEditorMode'); let QueryField; if (mode === ExploreMode.Metrics && datasourceInstance.components.ExploreMetricsQueryField) { @@ -129,9 +142,6 @@ export class QueryRow extends PureComponent { return (
-
- -
{QueryField ? ( { initialQuery={query} exploreEvents={exploreEvents} range={range} + textEditModeEnabled={this.state.textEditModeEnabled} /> )}
+
+ +
+ {canToggleEditorModes && ( +
+ +
+ )}
+ + Cancel + +
+ + ); + } +} + +export default ChangePasswordForm; diff --git a/public/app/features/profile/ChangePasswordPage.tsx b/public/app/features/profile/ChangePasswordPage.tsx new file mode 100644 index 000000000000..85872c8dfba5 --- /dev/null +++ b/public/app/features/profile/ChangePasswordPage.tsx @@ -0,0 +1,46 @@ +import React, { PureComponent } from 'react'; +import { hot } from 'react-hot-loader'; +import { connect } from 'react-redux'; +import { StoreState } from 'app/types'; +import { NavModel } from '@grafana/data'; +import { getNavModel } from 'app/core/selectors/navModel'; +import { UserProvider } from 'app/core/utils/UserProvider'; +import Page from 'app/core/components/Page/Page'; +import { ChangePasswordForm } from './ChangePasswordForm'; + +export interface Props { + navModel: NavModel; +} + +export class ChangePasswordPage extends PureComponent { + render() { + const { navModel } = this.props; + return ( + + + {({ changePassword }, states) => ( + +

Change Your Password

+ +
+ )} +
+
+ ); + } +} + +function mapStateToProps(state: StoreState) { + return { + navModel: getNavModel(state.navIndex, `change-password`), + }; +} + +const mapDispatchToProps = {}; + +export default hot(module)( + connect( + mapStateToProps, + mapDispatchToProps + )(ChangePasswordPage) +); diff --git a/public/app/features/profile/all.ts b/public/app/features/profile/all.ts index 6d462c08e6bc..656ca1ddcfa1 100644 --- a/public/app/features/profile/all.ts +++ b/public/app/features/profile/all.ts @@ -1,3 +1,2 @@ import './ProfileCtrl'; -import './ChangePasswordCtrl'; import './PrefControlCtrl'; diff --git a/public/app/features/profile/partials/change_password.html b/public/app/features/profile/partials/change_password.html deleted file mode 100644 index 49a45bd6653b..000000000000 --- a/public/app/features/profile/partials/change_password.html +++ /dev/null @@ -1,35 +0,0 @@ - - -
-

- Change your password -

- -
- You cannot change password when ldap or auth proxy authentication is enabled. -
- -
-
- Old Password - -
- -
- New Password - -
- -
- Confirm Password - -
- -
- - Cancel -
-
- -
- diff --git a/public/app/routes/routes.ts b/public/app/routes/routes.ts index 54722af5ba7d..26746f821687 100644 --- a/public/app/routes/routes.ts +++ b/public/app/routes/routes.ts @@ -3,6 +3,7 @@ import './ReactContainer'; import { applyRouteRegistrationHandlers } from './registry'; // Pages +import ChangePasswordPage from 'app/features/profile/ChangePasswordPage'; import ServerStats from 'app/features/admin/ServerStats'; import AlertRuleList from 'app/features/alerting/AlertRuleList'; import TeamPages from 'app/features/teams/TeamPages'; @@ -230,8 +231,10 @@ export function setupAngularRoutes($routeProvider: route.IRouteProvider, $locati controllerAs: 'ctrl', }) .when('/profile/password', { - templateUrl: 'public/app/features/profile/partials/change_password.html', - controller: 'ChangePasswordCtrl', + template: '', + resolve: { + component: () => ChangePasswordPage, + }, }) .when('/profile/select-org', { templateUrl: 'public/app/features/org/partials/select_org.html', From 22e2ac270b356aa6f971dc763650b4628eff3664 Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Wed, 3 Jul 2019 08:17:18 -0700 Subject: [PATCH 20/22] grafana/toolkit: copy sass files (#17888) include sass files in toolkit --- .../src/cli/tasks/toolkit.build.ts | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/packages/grafana-toolkit/src/cli/tasks/toolkit.build.ts b/packages/grafana-toolkit/src/cli/tasks/toolkit.build.ts index 975b1d6fa792..5f01d2fe2dd0 100644 --- a/packages/grafana-toolkit/src/cli/tasks/toolkit.build.ts +++ b/packages/grafana-toolkit/src/cli/tasks/toolkit.build.ts @@ -5,6 +5,8 @@ import chalk from 'chalk'; import { useSpinner } from '../utils/useSpinner'; import { Task, TaskRunner } from './task'; +const path = require('path'); + let distDir: string, cwd: string; // @ts-ignore @@ -74,6 +76,28 @@ const moveFiles = () => { })(); }; +const copySassFiles = () => { + const files = ['_variables.generated.scss', '_variables.dark.generated.scss', '_variables.light.generated.scss']; + // @ts-ignore + return useSpinner(`Copy scss files ${files.join(', ')} files`, async () => { + const sassDir = path.resolve(cwd, '../../public/sass/'); + const promises = files.map(file => { + return new Promise((resolve, reject) => { + const name = file.replace('.generated', ''); + fs.copyFile(`${sassDir}/${file}`, `${distDir}/sass/${name}`, err => { + if (err) { + reject(err); + return; + } + resolve(); + }); + }); + }); + + await Promise.all(promises); + })(); +}; + const toolkitBuildTaskRunner: TaskRunner = async () => { cwd = changeCwdToGrafanaToolkit(); distDir = `${cwd}/dist`; @@ -84,7 +108,9 @@ const toolkitBuildTaskRunner: TaskRunner = async () => { await compile(); await preparePackage(pkg); fs.mkdirSync('./dist/bin'); + fs.mkdirSync('./dist/sass'); await moveFiles(); + await copySassFiles(); restoreCwd(); }; From 164fb13d992cee165bec1cd497381b847b9c87e4 Mon Sep 17 00:00:00 2001 From: kay delaney <45561153+kaydelaney@users.noreply.github.com> Date: Wed, 3 Jul 2019 16:36:12 +0100 Subject: [PATCH 21/22] Explore: Adds orgId to URL for sharing purposes (#17895) Also replaces one-off segment detection functions in explore.ts with general purpose function Closes #15462 --- public/app/core/utils/explore.ts | 14 ++++++-------- .../explore/state/epics/stateSaveEpic.test.ts | 7 ++++--- .../features/explore/state/epics/stateSaveEpic.ts | 3 ++- public/test/mocks/mockExploreState.ts | 9 ++++++++- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/public/app/core/utils/explore.ts b/public/app/core/utils/explore.ts index 6159efe96d7d..ba7b648f63c1 100644 --- a/public/app/core/utils/explore.ts +++ b/public/app/core/utils/explore.ts @@ -162,11 +162,8 @@ export function buildQueryTransaction( export const clearQueryKeys: (query: DataQuery) => object = ({ key, refId, ...rest }) => rest; -const metricProperties = ['expr', 'target', 'datasource', 'query']; -const isMetricSegment = (segment: { [key: string]: string }) => - metricProperties.some(prop => segment.hasOwnProperty(prop)); -const isUISegment = (segment: { [key: string]: string }) => segment.hasOwnProperty('ui'); -const isModeSegment = (segment: { [key: string]: string }) => segment.hasOwnProperty('mode'); +const isSegment = (segment: { [key: string]: string }, ...props: string[]) => + props.some(prop => segment.hasOwnProperty(prop)); enum ParseUrlStateIndex { RangeFrom = 0, @@ -237,11 +234,12 @@ export function parseUrlState(initial: string | undefined): ExploreUrlState { }; const datasource = parsed[ParseUrlStateIndex.Datasource]; const parsedSegments = parsed.slice(ParseUrlStateIndex.SegmentsStart); - const queries = parsedSegments.filter(segment => isMetricSegment(segment)); - const modeObj = parsedSegments.filter(segment => isModeSegment(segment))[0]; + const metricProperties = ['expr', 'target', 'datasource', 'query']; + const queries = parsedSegments.filter(segment => isSegment(segment, ...metricProperties)); + const modeObj = parsedSegments.filter(segment => isSegment(segment, 'mode'))[0]; const mode = modeObj ? modeObj.mode : ExploreMode.Metrics; - const uiState = parsedSegments.filter(segment => isUISegment(segment))[0]; + const uiState = parsedSegments.filter(segment => isSegment(segment, 'ui'))[0]; const ui = uiState ? { showingGraph: uiState.ui[ParseUiStateIndex.Graph], diff --git a/public/app/features/explore/state/epics/stateSaveEpic.test.ts b/public/app/features/explore/state/epics/stateSaveEpic.test.ts index 08df3ac4fb46..9670ae996ee9 100644 --- a/public/app/features/explore/state/epics/stateSaveEpic.test.ts +++ b/public/app/features/explore/state/epics/stateSaveEpic.test.ts @@ -15,7 +15,7 @@ describe('stateSaveEpic', () => { .whenActionIsDispatched(stateSaveAction()) .thenResultingActionsEqual( updateLocation({ - query: { left: '["now-6h","now","test",{"mode":null},{"ui":[true,true,true,null]}]' }, + query: { orgId: '1', left: '["now-6h","now","test",{"mode":null},{"ui":[true,true,true,null]}]' }, replace: true, }), setUrlReplacedAction({ exploreId }) @@ -23,7 +23,7 @@ describe('stateSaveEpic', () => { }); }); - describe('and explore is splitted', () => { + describe('and explore is split', () => { it('then the correct actions are dispatched', () => { const { exploreId, state } = mockExploreState({ split: true }); @@ -32,6 +32,7 @@ describe('stateSaveEpic', () => { .thenResultingActionsEqual( updateLocation({ query: { + orgId: '1', left: '["now-6h","now","test",{"mode":null},{"ui":[true,true,true,null]}]', right: '["now-6h","now","test",{"mode":null},{"ui":[true,true,true,null]}]', }, @@ -51,7 +52,7 @@ describe('stateSaveEpic', () => { .whenActionIsDispatched(stateSaveAction()) .thenResultingActionsEqual( updateLocation({ - query: { left: '["now-6h","now","test",{"mode":null},{"ui":[true,true,true,null]}]' }, + query: { orgId: '1', left: '["now-6h","now","test",{"mode":null},{"ui":[true,true,true,null]}]' }, replace: false, }) ); diff --git a/public/app/features/explore/state/epics/stateSaveEpic.ts b/public/app/features/explore/state/epics/stateSaveEpic.ts index 210a14369e87..e696734d9b98 100644 --- a/public/app/features/explore/state/epics/stateSaveEpic.ts +++ b/public/app/features/explore/state/epics/stateSaveEpic.ts @@ -31,8 +31,9 @@ export const stateSaveEpic: Epic, ActionOf, StoreState> = (ac return action$.ofType(stateSaveAction.type).pipe( mergeMap(() => { const { left, right, split } = state$.value.explore; + const orgId = state$.value.user.orgId.toString(); const replace = left && left.urlReplaced === false; - const urlStates: { [index: string]: string } = {}; + const urlStates: { [index: string]: string } = { orgId }; const leftUrlState: ExploreUrlState = { datasource: left.datasourceInstance.name, queries: left.queries.map(clearQueryKeys), diff --git a/public/test/mocks/mockExploreState.ts b/public/test/mocks/mockExploreState.ts index a51d18968f0f..87a25441ba1c 100644 --- a/public/test/mocks/mockExploreState.ts +++ b/public/test/mocks/mockExploreState.ts @@ -2,7 +2,7 @@ import { DataSourceApi } from '@grafana/ui/src/types/datasource'; import { ExploreId, ExploreItemState, ExploreState } from 'app/types/explore'; import { makeExploreItemState } from 'app/features/explore/state/reducers'; -import { StoreState } from 'app/types'; +import { StoreState, UserState } from 'app/types'; import { TimeRange, dateTime } from '@grafana/ui'; export const mockExploreState = (options: any = {}) => { @@ -77,8 +77,15 @@ export const mockExploreState = (options: any = {}) => { right, split, }; + + const user: UserState = { + orgId: 1, + timeZone: 'browser', + }; + const state: Partial = { explore, + user, }; return { From 9f351156c318943294548891bdfb877dc792b0f4 Mon Sep 17 00:00:00 2001 From: Dominik Prokop Date: Wed, 3 Jul 2019 18:25:12 +0200 Subject: [PATCH 22/22] grafana/toolkit: bundle plugins with webpack (#17850) --- packages/grafana-toolkit/README.md | 58 +- packages/grafana-toolkit/package.json | 47 +- packages/grafana-toolkit/src/cli/index.ts | 3 +- .../src/cli/tasks/plugin.build.ts | 35 +- .../src/cli/tasks/plugin.dev.ts | 15 +- .../src/cli/tasks/plugin/bundle.ts | 86 +- .../src/cli/tasks/toolkit.build.ts | 1 + .../src/config/jest.plugin.config.ts | 2 - .../src/config/rollup.plugin.config.ts | 160 --- .../src/config/tsconfig.plugin.local.json | 9 + .../src/config/webpack.plugin.config.ts | 203 +++ .../src/config/webpack/loaders.test.ts | 47 + .../src/config/webpack/loaders.ts | 92 ++ .../mocks/duplicates/src/styles/dark.css | 0 .../mocks/duplicates/src/styles/dark.scss | 0 .../mocks/duplicates/src/styles/light.css | 0 .../missing-theme-file/src/styles/light.css | 0 .../no-theme-files/src/styles/whatever.css | 0 .../webpack/mocks/ok/src/styles/dark.css | 0 .../webpack/mocks/ok/src/styles/light.css | 0 public/sass/.sass-lint.yml | 1 - scripts/grunt/options/sasslint.js | 1 + yarn.lock | 1265 ++++++++++------- 23 files changed, 1309 insertions(+), 716 deletions(-) delete mode 100644 packages/grafana-toolkit/src/config/rollup.plugin.config.ts create mode 100644 packages/grafana-toolkit/src/config/tsconfig.plugin.local.json create mode 100644 packages/grafana-toolkit/src/config/webpack.plugin.config.ts create mode 100644 packages/grafana-toolkit/src/config/webpack/loaders.test.ts create mode 100644 packages/grafana-toolkit/src/config/webpack/loaders.ts create mode 100644 packages/grafana-toolkit/src/config/webpack/mocks/duplicates/src/styles/dark.css create mode 100644 packages/grafana-toolkit/src/config/webpack/mocks/duplicates/src/styles/dark.scss create mode 100644 packages/grafana-toolkit/src/config/webpack/mocks/duplicates/src/styles/light.css create mode 100644 packages/grafana-toolkit/src/config/webpack/mocks/missing-theme-file/src/styles/light.css create mode 100644 packages/grafana-toolkit/src/config/webpack/mocks/no-theme-files/src/styles/whatever.css create mode 100644 packages/grafana-toolkit/src/config/webpack/mocks/ok/src/styles/dark.css create mode 100644 packages/grafana-toolkit/src/config/webpack/mocks/ok/src/styles/light.css diff --git a/packages/grafana-toolkit/README.md b/packages/grafana-toolkit/README.md index 5655afcb2ad4..235ba66d7e53 100644 --- a/packages/grafana-toolkit/README.md +++ b/packages/grafana-toolkit/README.md @@ -2,10 +2,45 @@ Make sure to run `yarn install` before trying anything! Otherwise you may see unknown command grafana-toolkit and spend a while tracking that down. + + ## Internal development -For development use `yarn link`. First, navigate to `packages/grafana-toolkit` and run `yarn link`. Then, in your project use `yarn link @grafana/toolkit` to use linked version. +For development use `yarn link`. First, navigate to `packages/grafana-toolkit` and run `yarn link`. Then, in your project run +``` +yarn add babel-loader ts-loader css-loader style-loader sass-loader html-loader node-sass @babel/preset-env @babel/core & yarn link @grafana/toolkit +``` + +Note, that for development purposes we are adding `babel-loader ts-loader style-loader sass-loader html-loader node-sass @babel/preset-env @babel/core` packages to your extension. This is due to the specific behavior of `yarn link` which does not install dependencies of linked packages and webpack is having hard time trying to load its extensions. + +TODO: Experiment with [yalc](https://github.com/whitecolor/yalc) for linking packages + +### Publishing to npm +The publish process is now manual. Follow the steps to publish @grafana/toolkit to npm +1. From Grafana root dir: `./node_modules/.bin/grafana-toolkit toolkit:build` +2. `cd packages/grafana-toolkit/dist` +3. Open `package.json`, change version according to current version on npm (https://www.npmjs.com/package/@grafana/toolkit) +4. Run `npm publish --tag next` - for dev purposes we now publish on `next` channel + +Note, that for publishing you need to be part of Grafana npm org and you need to be logged in to npm in your terminal (`npm login`). + ## Grafana extensions development with grafana-toolkit overview +### Available tasks +#### `grafana-toolkit plugin:test` +Runs Jest against your codebase. See [Tests](#tests) for more details. + +Available options: +- `-u, --updateSnapshot` - performs snapshots update +- `--coverage` - reports code coverage + +#### `grafana-toolkit plugin:dev` +Compiles plugin in development mode. + +Available options: +- `-w, --watch` - runs `plugin:dev` task in watch mode +#### `grafana-toolkit plugin:build` +Compiles plugin in production mode + ### Typescript To configure Typescript create `tsconfig.json` file in the root dir of your app. grafana-toolkit comes with default tsconfig located in `packages/grafana-toolkit/src/config/tsconfig.plugin.ts`. In order for Typescript to be able to pickup your source files you need to extend that config as follows: @@ -44,9 +79,30 @@ grafana-toolkit will use that file as Jest's setup file. You can also setup Jest Adidtionaly, you can also provide additional Jest config via package.json file. For more details please refer to [Jest docs](https://jest-bot.github.io/jest/docs/configuration.html#verbose-boolean). Currently we support following properties: - [`snapshotSerializers`](https://jest-bot.github.io/jest/docs/configuration.html#snapshotserializers-array-string) + +## Working with CSS +We support pure css, SASS and CSS in JS approach (via Emotion). + +1. Single css/sass file +Create your css/sass file and import it in your plugin entry point (typically module.ts): + +```ts +import 'path/to/your/css_or_sass +``` +The styles will be injected via `style` tag during runtime. + +2. Theme css/sass files +If you want to provide different stylesheets for Dark/Light theme, create `dark.[css|scss]` and `light.[css|scss]` files in `src/styles` directory of your plugin. Based on that we will generate stylesheets that will end up in `dist/styles` directory. + +TODO: add note about loadPluginCss + +3. Emotion +TODO + ## Prettier [todo] ## Development mode [todo] +`grafana-toolkit plugin:dev [--watch]` TODO - Enable rollup watch on extension sources diff --git a/packages/grafana-toolkit/package.json b/packages/grafana-toolkit/package.json index e602f60dcf1a..ad56792e4c04 100644 --- a/packages/grafana-toolkit/package.json +++ b/packages/grafana-toolkit/package.json @@ -19,53 +19,58 @@ "author": "Grafana Labs", "license": "Apache-2.0", "dependencies": { + "@babel/core": "7.4.5", + "@babel/preset-env": "7.4.5", "@types/execa": "^0.9.0", "@types/inquirer": "^6.0.3", "@types/jest": "24.0.13", "@types/jest-cli": "^23.6.0", "@types/node": "^12.0.4", "@types/prettier": "^1.16.4", + "@types/react-dev-utils": "^9.0.1", "@types/semver": "^6.0.0", + "@types/webpack": "4.4.34", "axios": "0.19.0", + "babel-loader": "8.0.6", "chalk": "^2.4.2", "commander": "^2.20.0", "concurrently": "4.1.0", + "copy-webpack-plugin": "5.0.3", + "css-loader": "^3.0.0", "execa": "^1.0.0", "glob": "^7.1.4", + "html-loader": "0.5.5", "inquirer": "^6.3.1", + "jest": "24.8.0", "jest-cli": "^24.8.0", + "jest-coverage-badges": "^1.1.2", "lodash": "4.17.11", + "mini-css-extract-plugin": "^0.7.0", + "node-sass": "^4.12.0", + "optimize-css-assets-webpack-plugin": "^5.0.3", "ora": "^3.4.0", "prettier": "^1.17.1", + "react-dev-utils": "^9.0.1", "replace-in-file": "^4.1.0", - "rollup": "^1.14.2", - "rollup-plugin-commonjs": "^10.0.0", - "rollup-plugin-copy-glob": "^0.3.0", - "rollup-plugin-json": "^4.0.0", - "rollup-plugin-node-builtins": "^2.1.2", - "rollup-plugin-node-globals": "^1.4.0", - "rollup-plugin-node-resolve": "^5.1.0", - "rollup-plugin-sourcemaps": "^0.4.2", - "rollup-plugin-terser": "^5.0.0", - "rollup-plugin-typescript2": "^0.21.1", - "rollup-plugin-visualizer": "^1.1.1", + "replace-in-file-webpack-plugin": "^1.0.6", + "sass-loader": "7.1.0", "semver": "^6.1.1", "simple-git": "^1.112.0", - "ts-node": "^8.2.0", - "tslint": "5.14.0" - }, - "peerDependencies": { - "jest": "24.8.0", + "style-loader": "^0.23.1", + "terser-webpack-plugin": "^1.3.0", "ts-jest": "24.0.2", + "ts-loader": "6.0.4", + "ts-node": "^8.2.0", "tslib": "1.10.0", - "typescript": "3.5.1" + "tslint": "5.14.0", + "tslint-config-prettier": "^1.18.0", + "typescript": "3.5.1", + "webpack": "4.35.0" }, "resolutions": { - "@types/lodash": "4.14.119", - "rollup-plugin-typescript2": "0.21.1" + "@types/lodash": "4.14.119" }, "devDependencies": { - "@types/glob": "^7.1.1", - "rollup-watch": "^4.3.1" + "@types/glob": "^7.1.1" } } diff --git a/packages/grafana-toolkit/src/cli/index.ts b/packages/grafana-toolkit/src/cli/index.ts index c457983ef7aa..82cb7e95bb5a 100644 --- a/packages/grafana-toolkit/src/cli/index.ts +++ b/packages/grafana-toolkit/src/cli/index.ts @@ -130,10 +130,11 @@ export const run = (includeInternalScripts = false) => { program .command('plugin:dev') + .option('-w, --watch', 'Run plugin development mode with watch enabled') .description('Starts plugin dev mode') .action(async cmd => { await execTask(pluginDevTask)({ - watch: true, + watch: !!cmd.watch, }); }); diff --git a/packages/grafana-toolkit/src/cli/tasks/plugin.build.ts b/packages/grafana-toolkit/src/cli/tasks/plugin.build.ts index eeccb7d10f99..e603140240ca 100644 --- a/packages/grafana-toolkit/src/cli/tasks/plugin.build.ts +++ b/packages/grafana-toolkit/src/cli/tasks/plugin.build.ts @@ -4,16 +4,32 @@ import execa = require('execa'); import path = require('path'); import fs = require('fs'); import glob = require('glob'); -import * as rollup from 'rollup'; -import { inputOptions, outputOptions } from '../../config/rollup.plugin.config'; import { useSpinner } from '../utils/useSpinner'; import { Linter, Configuration, RuleFailure } from 'tslint'; import { testPlugin } from './plugin/tests'; +import { bundlePlugin as bundleFn, PluginBundleOptions } from './plugin/bundle'; interface PrecommitOptions {} +export const bundlePlugin = useSpinner('Compiling...', async options => await bundleFn(options)); + // @ts-ignore -export const clean = useSpinner('Cleaning', async () => await execa('rimraf', ['./dist'])); +export const clean = useSpinner('Cleaning', async () => await execa('rimraf', [`${process.cwd()}/dist`])); + +export const prepare = useSpinner('Preparing', async () => { + // Make sure a local tsconfig exists. Otherwise this will work, but have odd behavior + const tsConfigPath = path.resolve(process.cwd(), 'tsconfig.json'); + if (!fs.existsSync(tsConfigPath)) { + const defaultTsConfigPath = path.resolve(__dirname, '../../config/tsconfig.plugin.local.json'); + fs.copyFile(defaultTsConfigPath, tsConfigPath, err => { + if (err) { + throw err; + } + console.log('Created tsconfig.json file'); + }); + } + return Promise.resolve(); +}); // @ts-ignore const typecheckPlugin = useSpinner('Typechecking', async () => { @@ -64,21 +80,14 @@ const lintPlugin = useSpinner('Linting', async () => { } }); -const bundlePlugin = useSpinner('Bundling plugin', async () => { - // @ts-ignore - const bundle = await rollup.rollup(inputOptions()); - // TODO: we can work on more verbose output - await bundle.generate(outputOptions); - await bundle.write(outputOptions); -}); - const pluginBuildRunner: TaskRunner = async () => { + // console.log('asasas') await clean(); + await prepare(); // @ts-ignore await lintPlugin(); await testPlugin({ updateSnapshot: false, coverage: false }); - // @ts-ignore - await bundlePlugin(); + await bundlePlugin({ watch: false, production: true }); }; export const pluginBuildTask = new Task('Build plugin', pluginBuildRunner); diff --git a/packages/grafana-toolkit/src/cli/tasks/plugin.dev.ts b/packages/grafana-toolkit/src/cli/tasks/plugin.dev.ts index 1793d7ddbc07..3ff1e7e68abd 100644 --- a/packages/grafana-toolkit/src/cli/tasks/plugin.dev.ts +++ b/packages/grafana-toolkit/src/cli/tasks/plugin.dev.ts @@ -1,9 +1,18 @@ import { Task, TaskRunner } from './task'; -import { bundlePlugin, PluginBundleOptions } from './plugin/bundle'; +import { bundlePlugin as bundleFn, PluginBundleOptions } from './plugin/bundle'; +import { useSpinner } from '../utils/useSpinner'; + +const bundlePlugin = useSpinner('Bundling plugin in dev mode', options => { + return bundleFn(options); +}); const pluginDevRunner: TaskRunner = async options => { - const result = await bundlePlugin(options); - return result; + if (options.watch) { + await bundleFn(options); + } else { + const result = await bundlePlugin(options); + return result; + } }; export const pluginDevTask = new Task('Dev plugin', pluginDevRunner); diff --git a/packages/grafana-toolkit/src/cli/tasks/plugin/bundle.ts b/packages/grafana-toolkit/src/cli/tasks/plugin/bundle.ts index 4c905764b471..bf798304c6c5 100644 --- a/packages/grafana-toolkit/src/cli/tasks/plugin/bundle.ts +++ b/packages/grafana-toolkit/src/cli/tasks/plugin/bundle.ts @@ -1,29 +1,71 @@ import path = require('path'); -import * as jestCLI from 'jest-cli'; -import * as rollup from 'rollup'; -import { inputOptions, outputOptions } from '../../../config/rollup.plugin.config'; +import fs = require('fs'); +import webpack = require('webpack'); +import { getWebpackConfig } from '../../../config/webpack.plugin.config'; +import formatWebpackMessages = require('react-dev-utils/formatWebpackMessages'); +import clearConsole = require('react-dev-utils/clearConsole'); export interface PluginBundleOptions { watch: boolean; + production?: boolean; } -export const bundlePlugin = async ({ watch }: PluginBundleOptions) => { - if (watch) { - const watcher = rollup.watch([ - { - ...inputOptions(), - output: outputOptions, - watch: { - chokidar: true, - clearScreen: true, - }, - }, - ]); - } else { - // @ts-ignore - const bundle = await rollup.rollup(inputOptions()); - // TODO: we can work on more verbose output - await bundle.generate(outputOptions); - await bundle.write(outputOptions); - } +// export const bundlePlugin = useSpinner('Bundle plugin', ({ watch }) => { +export const bundlePlugin = async ({ watch, production }: PluginBundleOptions) => { + const compiler = webpack( + getWebpackConfig({ + watch, + production, + }) + ); + + const webpackPromise = new Promise((resolve, reject) => { + if (watch) { + console.log('Started watching plugin for changes...'); + compiler.watch({}, (err, stats) => {}); + + compiler.hooks.invalid.tap('invalid', () => { + clearConsole(); + console.log('Compiling...'); + }); + + compiler.hooks.done.tap('done', stats => { + clearConsole(); + const output = formatWebpackMessages(stats.toJson()); + + if (!output.errors.length && !output.warnings.length) { + console.log('Compiled successfully!'); + } + + if (output.errors.length) { + console.log('Compilation failed!'); + output.errors.forEach(e => console.log(e)); + if (output.warnings.length) { + console.log('Warnings:'); + output.warnings.forEach(w => console.log(w)); + } + } + if (output.errors.length === 0 && output.warnings.length) { + console.log('Compiled with warnings!'); + output.warnings.forEach(w => console.log(w)); + } + }); + } else { + compiler.run((err: Error, stats: webpack.Stats) => { + if (err) { + reject(err.message); + } + if (stats.hasErrors()) { + stats.compilation.errors.forEach(e => { + console.log(e.message); + }); + + reject('Build failed'); + } + resolve(); + }); + } + }); + + return webpackPromise; }; diff --git a/packages/grafana-toolkit/src/cli/tasks/toolkit.build.ts b/packages/grafana-toolkit/src/cli/tasks/toolkit.build.ts index 5f01d2fe2dd0..f69286b7b969 100644 --- a/packages/grafana-toolkit/src/cli/tasks/toolkit.build.ts +++ b/packages/grafana-toolkit/src/cli/tasks/toolkit.build.ts @@ -56,6 +56,7 @@ const moveFiles = () => { 'CHANGELOG.md', 'bin/grafana-toolkit.dist.js', 'src/config/tsconfig.plugin.json', + 'src/config/tsconfig.plugin.local.json', 'src/config/tslint.plugin.json', ]; // @ts-ignore diff --git a/packages/grafana-toolkit/src/config/jest.plugin.config.ts b/packages/grafana-toolkit/src/config/jest.plugin.config.ts index 685791bd984e..924eb5a2224b 100644 --- a/packages/grafana-toolkit/src/config/jest.plugin.config.ts +++ b/packages/grafana-toolkit/src/config/jest.plugin.config.ts @@ -27,8 +27,6 @@ export const jestConfig = () => { '^.+\\.(ts|tsx)$': 'ts-jest', }, moduleDirectories: ['node_modules', 'src'], - rootDir: process.cwd(), - roots: ['/src'], moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'], setupFiles, globals: { 'ts-jest': { isolatedModules: true } }, diff --git a/packages/grafana-toolkit/src/config/rollup.plugin.config.ts b/packages/grafana-toolkit/src/config/rollup.plugin.config.ts deleted file mode 100644 index 2636ed6b685e..000000000000 --- a/packages/grafana-toolkit/src/config/rollup.plugin.config.ts +++ /dev/null @@ -1,160 +0,0 @@ -// @ts-ignore -import resolve from 'rollup-plugin-node-resolve'; -// @ts-ignore -import commonjs from 'rollup-plugin-commonjs'; -// @ts-ignore -import sourceMaps from 'rollup-plugin-sourcemaps'; -// @ts-ignore -import typescript from 'rollup-plugin-typescript2'; -// @ts-ignore -import json from 'rollup-plugin-json'; -// @ts-ignore -import copy from 'rollup-plugin-copy-glob'; -// @ts-ignore -import { terser } from 'rollup-plugin-terser'; -// @ts-ignore -import visualizer from 'rollup-plugin-visualizer'; - -// @ts-ignore -const replace = require('replace-in-file'); -const pkg = require(`${process.cwd()}/package.json`); -const path = require('path'); -const fs = require('fs'); -const tsConfig = require(`${__dirname}/tsconfig.plugin.json`); -import { OutputOptions, InputOptions, GetManualChunk } from 'rollup'; -const { PRODUCTION } = process.env; - -export const outputOptions: OutputOptions = { - dir: 'dist', - format: 'amd', - sourcemap: true, - chunkFileNames: '[name].js', -}; - -const findModuleTs = (base: string, files?: string[], result?: string[]) => { - files = files || fs.readdirSync(base); - result = result || []; - - if (files) { - files.forEach(file => { - const newbase = path.join(base, file); - if (fs.statSync(newbase).isDirectory()) { - result = findModuleTs(newbase, fs.readdirSync(newbase), result); - } else { - if (file.indexOf('module.ts') > -1) { - // @ts-ignore - result.push(newbase); - } - } - }); - } - return result; -}; - -const getModuleFiles = () => { - return findModuleTs(path.resolve(process.cwd(), 'src')); -}; - -const getManualChunk: GetManualChunk = (id: string) => { - // id == absolute path - if (id.endsWith('module.ts')) { - const idx = id.indexOf('/src/'); - if (idx > 0) { - const p = id.substring(idx + 5, id.lastIndexOf('.')); - console.log('MODULE:', id, p); - return p; - } - } - console.log('shared:', id); - return 'shared'; -}; - -const getExternals = () => { - // Those are by default exported by Grafana - const defaultExternals = [ - 'jquery', - 'lodash', - 'moment', - 'rxjs', - 'd3', - 'react', - 'react-dom', - '@grafana/ui', - '@grafana/runtime', - '@grafana/data', - ]; - const toolkitConfig = require(path.resolve(process.cwd(), 'package.json')).grafanaToolkit; - const userDefinedExternals = (toolkitConfig && toolkitConfig.externals) || []; - return [...defaultExternals, ...userDefinedExternals]; -}; - -export const inputOptions = (): InputOptions => { - const inputFiles = getModuleFiles(); - return { - input: inputFiles, - manualChunks: inputFiles.length > 1 ? getManualChunk : undefined, - external: getExternals(), - plugins: [ - // Allow json resolution - json(), - // globals(), - // builtins(), - - // Compile TypeScript files - typescript({ - typescript: require('typescript'), - objectHashIgnoreUnknownHack: true, - tsconfigDefaults: tsConfig, - }), - - // Allow node_modules resolution, so you can use 'external' to control - // which external modules to include in the bundle - // https://github.com/rollup/rollup-plugin-node-resolve#usage - resolve(), - - // Allow bundling cjs modules (unlike webpack, rollup doesn't understand cjs) - commonjs(), - - // Resolve source maps to the original source - sourceMaps(), - - // Minify - PRODUCTION && terser(), - - // Copy files - copy([{ files: 'src/**/*.{json,svg,png,html}', dest: 'dist' }], { verbose: true }), - - // Help avoid including things accidentally - visualizer({ - filename: 'dist/stats.html', - title: 'Plugin Stats', - }), - - // Custom callback when we are done - finish(), - ], - }; -}; - -function finish() { - return { - name: 'finish', - buildEnd() { - const files = 'dist/plugin.json'; - replace.sync({ - files: files, - from: /%VERSION%/g, - to: pkg.version, - }); - replace.sync({ - files: files, - from: /%TODAY%/g, - to: new Date().toISOString().substring(0, 10), - }); - - if (PRODUCTION) { - console.log('*minified*'); - } - }, - }; -} diff --git a/packages/grafana-toolkit/src/config/tsconfig.plugin.local.json b/packages/grafana-toolkit/src/config/tsconfig.plugin.local.json new file mode 100644 index 000000000000..211e352ef5eb --- /dev/null +++ b/packages/grafana-toolkit/src/config/tsconfig.plugin.local.json @@ -0,0 +1,9 @@ +{ + "extends": "./node_modules/@grafana/toolkit/src/config/tsconfig.plugin.json", + "include": ["src", "types"], + "compilerOptions": { + "rootDir": "./src", + "baseUrl": "./src", + "typeRoots": ["./node_modules/@types"] + } +} diff --git a/packages/grafana-toolkit/src/config/webpack.plugin.config.ts b/packages/grafana-toolkit/src/config/webpack.plugin.config.ts new file mode 100644 index 000000000000..be19888e8bb1 --- /dev/null +++ b/packages/grafana-toolkit/src/config/webpack.plugin.config.ts @@ -0,0 +1,203 @@ +const fs = require('fs'); +const path = require('path'); +const CopyWebpackPlugin = require('copy-webpack-plugin'); +const ReplaceInFileWebpackPlugin = require('replace-in-file-webpack-plugin'); +const TerserPlugin = require('terser-webpack-plugin'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin'); +import * as webpack from 'webpack'; +import { hasThemeStylesheets, getStyleLoaders, getStylesheetEntries } from './webpack/loaders'; + +interface WebpackConfigurationOptions { + watch?: boolean; + production?: boolean; +} +type WebpackConfigurationGetter = (options: WebpackConfigurationOptions) => webpack.Configuration; + +const findModuleTs = (base: string, files?: string[], result?: string[]) => { + files = files || fs.readdirSync(base); + result = result || []; + + if (files) { + files.forEach(file => { + const newbase = path.join(base, file); + if (fs.statSync(newbase).isDirectory()) { + result = findModuleTs(newbase, fs.readdirSync(newbase), result); + } else { + if (file.indexOf('module.ts') > -1) { + // @ts-ignore + result.push(newbase); + } + } + }); + } + return result; +}; + +const getModuleFiles = () => { + return findModuleTs(path.resolve(process.cwd(), 'src')); +}; + +const getManualChunk = (id: string) => { + if (id.endsWith('module.ts') || id.endsWith('module.tsx')) { + const idx = id.indexOf('/src/'); + if (idx > 0) { + const name = id.substring(idx + 5, id.lastIndexOf('.')); + + return { + name, + module: id, + }; + } + } +}; + +const getEntries = () => { + const entries: { [key: string]: string } = {}; + const modules = getModuleFiles(); + + modules.forEach(modFile => { + const mod = getManualChunk(modFile); + // @ts-ignore + entries[mod.name] = mod.module; + }); + return { + ...entries, + ...getStylesheetEntries(), + }; +}; + +const getCommonPlugins = (options: WebpackConfigurationOptions) => { + const packageJson = require(path.resolve(process.cwd(), 'package.json')); + return [ + new MiniCssExtractPlugin({ + // both options are optional + filename: 'styles/[name].css', + }), + new webpack.optimize.OccurrenceOrderPlugin(true), + new CopyWebpackPlugin( + [ + { from: 'plugin.json', to: '.' }, + { from: '../README.md', to: '.' }, + { from: '../LICENSE', to: '.' }, + { from: 'img/*', to: '.' }, + { from: '**/*.json', to: '.' }, + { from: '**/*.svg', to: '.' }, + { from: '**/*.png', to: '.' }, + { from: '**/*.html', to: '.' }, + ], + { logLevel: options.watch ? 'silent' : 'warn' } + ), + + new ReplaceInFileWebpackPlugin([ + { + dir: 'dist', + files: ['plugin.json', 'README.md'], + rules: [ + { + search: '%VERSION%', + replace: packageJson.version, + }, + { + search: '%TODAY%', + replace: new Date().toISOString().substring(0, 10), + }, + ], + }, + ]), + ]; +}; + +export const getWebpackConfig: WebpackConfigurationGetter = options => { + const plugins = getCommonPlugins(options); + const optimization: { [key: string]: any } = {}; + + if (options.production) { + optimization.minimizer = [new TerserPlugin(), new OptimizeCssAssetsPlugin()]; + } + + return { + mode: options.production ? 'production' : 'development', + target: 'web', + node: { + fs: 'empty', + net: 'empty', + tls: 'empty', + }, + context: path.join(process.cwd(), 'src'), + devtool: 'source-map', + entry: getEntries(), + output: { + filename: '[name].js', + path: path.join(process.cwd(), 'dist'), + libraryTarget: 'amd', + }, + + performance: { hints: false }, + externals: [ + 'lodash', + 'jquery', + 'moment', + 'slate', + 'prismjs', + 'slate-plain-serializer', + 'slate-react', + 'react', + 'react-dom', + 'rxjs', + 'd3', + '@grafana/ui', + '@grafana/runtime', + '@grafana/data', + // @ts-ignore + (context, request, callback) => { + let prefix = 'app/'; + if (request.indexOf(prefix) === 0) { + return callback(null, request); + } + prefix = 'grafana/'; + if (request.indexOf(prefix) === 0) { + return callback(null, request.substr(prefix.length)); + } + + // @ts-ignore + callback(); + }, + ], + plugins, + resolve: { + extensions: ['.ts', '.tsx', '.js'], + modules: [path.resolve(process.cwd(), 'src'), 'node_modules'], + }, + module: { + rules: [ + { + test: /\.tsx?$/, + loaders: [ + { + loader: 'babel-loader', + options: { presets: ['@babel/preset-env'] }, + }, + 'ts-loader', + ], + exclude: /(node_modules)/, + }, + ...getStyleLoaders(), + { + test: /\.html$/, + exclude: [/node_modules/], + use: { + loader: 'html-loader', + }, + }, + ], + }, + optimization, + // optimization: { + // splitChunks: { + // chunks: 'all', + // name: 'shared' + // } + // } + }; +}; diff --git a/packages/grafana-toolkit/src/config/webpack/loaders.test.ts b/packages/grafana-toolkit/src/config/webpack/loaders.test.ts new file mode 100644 index 000000000000..af30c990ffec --- /dev/null +++ b/packages/grafana-toolkit/src/config/webpack/loaders.test.ts @@ -0,0 +1,47 @@ +import { getStylesheetEntries, hasThemeStylesheets } from './loaders'; + +describe('Loaders', () => { + describe('stylesheet helpers', () => { + const logSpy = jest.spyOn(console, 'log').mockImplementation(); + const errorSpy = jest.spyOn(console, 'error').mockImplementation(); + + afterAll(() => { + logSpy.mockRestore(); + logSpy.mockRestore(); + }); + + describe('getStylesheetEntries', () => { + it('returns entries for dark and light theme', () => { + const result = getStylesheetEntries(`${__dirname}/mocks/ok`); + expect(Object.keys(result)).toHaveLength(2); + }); + it('throws on theme files duplicates', () => { + const result = () => { + getStylesheetEntries(`${__dirname}/mocks/duplicates`); + }; + expect(result).toThrow(); + }); + }); + + describe('hasThemeStylesheets', () => { + it('throws when only one theme file is defined', () => { + const result = () => { + hasThemeStylesheets(`${__dirname}/mocks/missing-theme-file`); + }; + expect(result).toThrow(); + }); + + it('returns false when no theme files present', () => { + const result = hasThemeStylesheets(`${__dirname}/mocks/no-theme-files`); + + expect(result).toBeFalsy(); + }); + + it('returns true when theme files present', () => { + const result = hasThemeStylesheets(`${__dirname}/mocks/ok`); + + expect(result).toBeTruthy(); + }); + }); + }); +}); diff --git a/packages/grafana-toolkit/src/config/webpack/loaders.ts b/packages/grafana-toolkit/src/config/webpack/loaders.ts new file mode 100644 index 000000000000..efbf700475fe --- /dev/null +++ b/packages/grafana-toolkit/src/config/webpack/loaders.ts @@ -0,0 +1,92 @@ +const fs = require('fs'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); + +const supportedExtensions = ['css', 'scss']; + +const getStylesheetPaths = (root: string = process.cwd()) => { + return [`${root}/src/styles/light`, `${root}/src/styles/dark`]; +}; + +export const getStylesheetEntries = (root: string = process.cwd()) => { + const stylesheetsPaths = getStylesheetPaths(root); + const entries: { [key: string]: string } = {}; + supportedExtensions.forEach(e => { + stylesheetsPaths.forEach(p => { + const entryName = p.split('/').slice(-1)[0]; + if (fs.existsSync(`${p}.${e}`)) { + if (entries[entryName]) { + console.log(`\nSeems like you have multiple files for ${entryName} theme:`); + console.log(entries[entryName]); + console.log(`${p}.${e}`); + throw new Error('Duplicated stylesheet'); + } else { + entries[entryName] = `${p}.${e}`; + } + } + }); + }); + + return entries; +}; + +export const hasThemeStylesheets = (root: string = process.cwd()) => { + const stylesheetsPaths = [`${root}/src/styles/light`, `${root}/src/styles/dark`]; + const stylesheetsSummary: boolean[] = []; + + const result = stylesheetsPaths.reduce((acc, current) => { + if (fs.existsSync(`${current}.css`) || fs.existsSync(`${current}.scss`)) { + stylesheetsSummary.push(true); + return acc && true; + } else { + stylesheetsSummary.push(false); + return false; + } + }, true); + + const hasMissingStylesheets = stylesheetsSummary.filter(s => s).length === 1; + + // seems like there is one theme file defined only + if (result === false && hasMissingStylesheets) { + console.error('\nWe think you want to specify theme stylesheet, but it seems like there is something missing...'); + stylesheetsSummary.forEach((s, i) => { + if (s) { + console.log(stylesheetsPaths[i], 'discovered'); + } else { + console.log(stylesheetsPaths[i], 'missing'); + } + }); + + throw new Error('Stylesheet missing!'); + } + + return result; +}; + +export const getStyleLoaders = () => { + const shouldExtractCss = hasThemeStylesheets(); + + const executiveLoader = shouldExtractCss + ? { + loader: MiniCssExtractPlugin.loader, + } + : 'style-loader'; + + const cssLoader = { + loader: 'css-loader', + options: { + importLoaders: 1, + sourceMap: true, + }, + }; + + return [ + { + test: /\.css$/, + use: [executiveLoader, cssLoader], + }, + { + test: /\.scss$/, + use: [executiveLoader, cssLoader, 'sass-loader'], + }, + ]; +}; diff --git a/packages/grafana-toolkit/src/config/webpack/mocks/duplicates/src/styles/dark.css b/packages/grafana-toolkit/src/config/webpack/mocks/duplicates/src/styles/dark.css new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/grafana-toolkit/src/config/webpack/mocks/duplicates/src/styles/dark.scss b/packages/grafana-toolkit/src/config/webpack/mocks/duplicates/src/styles/dark.scss new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/grafana-toolkit/src/config/webpack/mocks/duplicates/src/styles/light.css b/packages/grafana-toolkit/src/config/webpack/mocks/duplicates/src/styles/light.css new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/grafana-toolkit/src/config/webpack/mocks/missing-theme-file/src/styles/light.css b/packages/grafana-toolkit/src/config/webpack/mocks/missing-theme-file/src/styles/light.css new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/grafana-toolkit/src/config/webpack/mocks/no-theme-files/src/styles/whatever.css b/packages/grafana-toolkit/src/config/webpack/mocks/no-theme-files/src/styles/whatever.css new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/grafana-toolkit/src/config/webpack/mocks/ok/src/styles/dark.css b/packages/grafana-toolkit/src/config/webpack/mocks/ok/src/styles/dark.css new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/grafana-toolkit/src/config/webpack/mocks/ok/src/styles/light.css b/packages/grafana-toolkit/src/config/webpack/mocks/ok/src/styles/light.css new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/public/sass/.sass-lint.yml b/public/sass/.sass-lint.yml index 1d1e2fd9c733..c04f5d98797e 100644 --- a/public/sass/.sass-lint.yml +++ b/public/sass/.sass-lint.yml @@ -1,6 +1,5 @@ options: formatter: stylish - rules: quotes: - 0 diff --git a/scripts/grunt/options/sasslint.js b/scripts/grunt/options/sasslint.js index e7651b5ece89..08d9d13de9de 100644 --- a/scripts/grunt/options/sasslint.js +++ b/scripts/grunt/options/sasslint.js @@ -7,6 +7,7 @@ module.exports = function(config) { src: [ 'public/sass/**/*.scss', 'packages/**/*.scss', + '!**/node_modules/**/*.scss' ], }; }; diff --git a/yarn.lock b/yarn.lock index 230a2bf457b9..88dd8accbb05 100644 --- a/yarn.lock +++ b/yarn.lock @@ -46,6 +46,26 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.5.tgz#081f97e8ffca65a9b4b0fdc7e274e703f000c06a" + integrity sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helpers" "^7.4.4" + "@babel/parser" "^7.4.5" + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.4.5" + "@babel/types" "^7.4.4" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.11" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/core@^7.1.0", "@babel/core@^7.4.3": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.4.tgz#84055750b05fcd50f9915a826b44fa347a825250" @@ -249,6 +269,11 @@ version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.4.tgz#5977129431b8fe33471730d255ce8654ae1250b6" +"@babel/parser@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" + integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== + "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" @@ -541,6 +566,13 @@ dependencies: regexp-tree "^0.1.0" +"@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106" + integrity sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg== + dependencies: + regexp-tree "^0.1.6" + "@babel/plugin-transform-new-target@^7.0.0", "@babel/plugin-transform-new-target@^7.4.0", "@babel/plugin-transform-new-target@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" @@ -609,6 +641,13 @@ dependencies: regenerator-transform "^0.13.4" +"@babel/plugin-transform-regenerator@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" + integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== + dependencies: + regenerator-transform "^0.14.0" + "@babel/plugin-transform-reserved-words@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" @@ -776,6 +815,60 @@ js-levenshtein "^1.1.3" semver "^5.3.0" +"@babel/preset-env@7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.5.tgz#2fad7f62983d5af563b5f3139242755884998a58" + integrity sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.4.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.4.4" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.4.4" + "@babel/plugin-transform-classes" "^7.4.4" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.4.4" + "@babel/plugin-transform-function-name" "^7.4.4" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-member-expression-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.4.4" + "@babel/plugin-transform-modules-systemjs" "^7.4.4" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" + "@babel/plugin-transform-new-target" "^7.4.4" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.4.4" + "@babel/plugin-transform-property-literals" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.4.5" + "@babel/plugin-transform-reserved-words" "^7.2.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.4.4" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.4.4" + "@babel/types" "^7.4.4" + browserslist "^4.6.0" + core-js-compat "^3.1.1" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.5.0" + "@babel/preset-env@^7.4.1", "@babel/preset-env@^7.4.3": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.4.tgz#b6f6825bfb27b3e1394ca3de4f926482722c1d6f" @@ -900,6 +993,21 @@ globals "^11.1.0" lodash "^4.17.11" +"@babel/traverse@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216" + integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.4.5" + "@babel/types" "^7.4.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + "@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" @@ -1675,6 +1783,11 @@ version "1.6.54" resolved "https://registry.yarnpkg.com/@types/angular/-/angular-1.6.54.tgz#f9d5a03e4da7b021a6dabe5d63e899ed4567a5bd" +"@types/anymatch@*": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" + integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== + "@types/babel__core@^7.1.0": version "7.1.1" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.1.tgz#ce9a9e5d92b7031421e1d0d74ae59f572ba48be6" @@ -1704,6 +1817,14 @@ dependencies: "@babel/types" "^7.3.0" +"@types/body-parser@*": + version "1.17.0" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c" + integrity sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w== + dependencies: + "@types/connect" "*" + "@types/node" "*" + "@types/cheerio@*": version "0.22.11" resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.11.tgz#61c0facf9636d14ba5f77fc65ed8913aa845d717" @@ -1714,10 +1835,32 @@ version "2.2.7" resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.2.7.tgz#fb68cc9be8487e6ea5b13700e759bfbab7e0fefd" +"@types/clean-css@*": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@types/clean-css/-/clean-css-4.2.1.tgz#cb0134241ec5e6ede1b5344bc829668fd9871a8d" + integrity sha512-A1HQhQ0hkvqqByJMgg+Wiv9p9XdoYEzuwm11SVo1mX2/4PSdhjcrUlilJQoqLscIheC51t1D5g+EFWCXZ2VTQQ== + dependencies: + "@types/node" "*" + "@types/clipboard@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/clipboard/-/clipboard-2.0.1.tgz#75a74086c293d75b12bc93ff13bc7797fef05a40" +"@types/connect-history-api-fallback@*": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.2.tgz#40a497500238ebf30ae28fdf687c2f92969f2635" + integrity sha512-tobKLYh5XszXIQ2lHTeyK1wMi/3K5WiOKb/sl6MENCirlOcXw0jUBHHmST2dLKnYMv6WHWPOSmR8jIF3za0MBQ== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.32" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" + integrity sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg== + dependencies: + "@types/node" "*" + "@types/d3-array@*": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-2.0.0.tgz#a0d63a296a2d8435a9ec59393dcac746c6174a96" @@ -1976,7 +2119,15 @@ "@types/cheerio" "*" "@types/react" "*" -"@types/estree@0.0.39": +"@types/eslint@*": + version "4.16.6" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-4.16.6.tgz#96d4ecddbea618ab0b55eaf0dffedf387129b06c" + integrity sha512-GL7tGJig55FeclpOytU7nCCqtR143jBoC7AUdH0DO9xBSIFiNNUFCY/S3KNWsHeQJuU3hjw/OC1+kRTFNXqUZQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" @@ -1998,6 +2149,23 @@ "@types/jest" "*" "@types/puppeteer" "*" +"@types/express-serve-static-core@*": + version "4.16.7" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.7.tgz#50ba6f8a691c08a3dd9fa7fba25ef3133d298049" + integrity sha512-847KvL8Q1y3TtFLRTXcVakErLJQgdpFSaq+k043xefz9raEf0C7HalpSY7OW5PyjCnY8P7bPW5t/Co9qqp+USg== + dependencies: + "@types/node" "*" + "@types/range-parser" "*" + +"@types/express@*": + version "4.17.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.0.tgz#49eaedb209582a86f12ed9b725160f12d04ef287" + integrity sha512-CjaMu57cjgjuZbh9DpkloeGxV45CnMGlVd+XpG7Gm9QgVrd7KFq+X4HY0vM+2v0bczS48Wg7bvnMY5TN+Xmcfw== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "*" + "@types/serve-static" "*" + "@types/geojson@*": version "7946.0.7" resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.7.tgz#c8fa532b60a0042219cdf173ca21a975ef0666ad" @@ -2017,6 +2185,40 @@ "@types/react" "*" hoist-non-react-statics "^3.3.0" +"@types/html-minifier@*": + version "3.5.3" + resolved "https://registry.yarnpkg.com/@types/html-minifier/-/html-minifier-3.5.3.tgz#5276845138db2cebc54c789e0aaf87621a21e84f" + integrity sha512-j1P/4PcWVVCPEy5lofcHnQ6BtXz9tHGiFPWzqm7TtGuWZEfCHEP446HlkSNc9fQgNJaJZ6ewPtp2aaFla/Uerg== + dependencies: + "@types/clean-css" "*" + "@types/relateurl" "*" + "@types/uglify-js" "*" + +"@types/html-webpack-plugin@*": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@types/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#26b20854124bbcccbc22ccec715a1ba74583526c" + integrity sha512-in9rViBsTRB4ZApndZ12It68nGzSMHVK30JD7c49iLIHMFeTPbP7I7wevzMv7re2o0k5TlU6Ry/beyrmgWX7Bg== + dependencies: + "@types/html-minifier" "*" + "@types/tapable" "*" + "@types/webpack" "*" + +"@types/http-proxy-middleware@*": + version "0.19.2" + resolved "https://registry.yarnpkg.com/@types/http-proxy-middleware/-/http-proxy-middleware-0.19.2.tgz#1c44b96487cb2f333102b762c56a8f02241e85bd" + integrity sha512-aXcAs2VEaiHwlFlEqMJ+sNSFCO+wuWXcvdBk5Un7f0tUv1eTIIAmkd4S5D/Yi5JI0xofPpm9h3017TngbrLh7A== + dependencies: + "@types/connect" "*" + "@types/http-proxy" "*" + "@types/node" "*" + +"@types/http-proxy@*": + version "1.17.0" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.0.tgz#baf82ff6aa2723fd29f90e3ba1384e665006863e" + integrity sha512-l+s0IoxSHqhLFJPDHRfO235kgrCkvFD8JmdV/T9C4BKBYPIjrQopGFH4r7h2e3jQqgJRCthRCAZIxDoFnj1zwQ== + dependencies: + "@types/node" "*" + "@types/inquirer@^6.0.3": version "6.0.3" resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-6.0.3.tgz#597b3c1aa4a575899841ab99bb4f1774d0b8c090" @@ -2071,6 +2273,11 @@ version "1.10.35" resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-1.10.35.tgz#4e5c2b1e5b3bf0b863efb8c5e70081f52e6c9518" +"@types/json-schema@*": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" + integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== + "@types/lodash@4.14.123": version "4.14.123" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.123.tgz#39be5d211478c8dd3bdae98ee75bb7efe4abfe4d" @@ -2081,6 +2288,11 @@ resolved "https://registry.yarnpkg.com/@types/marked/-/marked-0.6.5.tgz#3cf2a56ef615dad24aaf99784ef90a9eba4e29d8" integrity sha512-6kBKf64aVfx93UJrcyEZ+OBM5nGv4RLsI6sR1Ar34bpgvGVRoyTgpxn4ZmtxOM5aDTAaaznYuYUH8bUX3Nk3YA== +"@types/mime@*": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d" + integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw== + "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -2101,7 +2313,7 @@ version "11.13.10" resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.10.tgz#4df59e5966b56f512bac98898bcbee5067411f0f" -"@types/node@^12.0.4", "@types/node@^12.0.8": +"@types/node@^12.0.4": version "12.0.10" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.10.tgz#51babf9c7deadd5343620055fc8aff7995c8b031" integrity sha512-LcsGbPomWsad6wmMNv7nBLw7YYYyfdYcz6xryKYQhx89c3XXan+8Q6AJ43G5XDIaklaVkK3mE4fCb0SBvMiPSQ== @@ -2153,6 +2365,11 @@ version "1.5.2" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" +"@types/range-parser@*": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" + integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== + "@types/react-color@2.17.0": version "2.17.0" resolved "https://registry.yarnpkg.com/@types/react-color/-/react-color-2.17.0.tgz#7f3c958bb43ebeedc7e04309576a235d5233ce9d" @@ -2165,6 +2382,17 @@ dependencies: "@types/react" "*" +"@types/react-dev-utils@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@types/react-dev-utils/-/react-dev-utils-9.0.1.tgz#6893aef0b1dcaf6e955b10038d0856bdca3ca269" + integrity sha512-kAps5AHTpr/EXQtbOsAQlpqngnLsIHIdvVAACc1OXVt8bWye5jpGzHQwhP1ekeoYR6xEcz44QdLPwVLJ2nT1DQ== + dependencies: + "@types/eslint" "*" + "@types/express" "*" + "@types/html-webpack-plugin" "*" + "@types/webpack" "*" + "@types/webpack-dev-server" "*" + "@types/react-dom@*", "@types/react-dom@16.8.4": version "16.8.4" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.8.4.tgz#7fb7ba368857c7aa0f4e4511c4710ca2c5a12a88" @@ -2245,24 +2473,30 @@ dependencies: redux "^3.6.0" +"@types/relateurl@*": + version "0.2.28" + resolved "https://registry.yarnpkg.com/@types/relateurl/-/relateurl-0.2.28.tgz#6bda7db8653fa62643f5ee69e9f69c11a392e3a6" + integrity sha1-a9p9uGU/piZD9e5p6facEaOS46Y= + "@types/reselect@2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@types/reselect/-/reselect-2.2.0.tgz#c667206cfdc38190e1d379babe08865b2288575f" dependencies: reselect "*" -"@types/resolve@0.0.8": - version "0.0.8" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" - integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== - dependencies: - "@types/node" "*" - "@types/semver@^6.0.0": version "6.0.1" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-6.0.1.tgz#a984b405c702fa5a7ec6abc56b37f2ba35ef5af6" integrity sha512-ffCdcrEE5h8DqVxinQjo+2d1q+FV5z7iNtPofw3JsrltSoSVlOGaW0rY8XxtO9XukdTn8TaCGWmk2VFGhI70mg== +"@types/serve-static@*": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48" + integrity sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q== + dependencies: + "@types/express-serve-static-core" "*" + "@types/mime" "*" + "@types/sinon@^7.0.11": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-7.0.11.tgz#6f28f005a36e779b7db0f1359b9fb9eef72aae88" @@ -2309,6 +2543,11 @@ resolved "https://registry.yarnpkg.com/@types/systemjs/-/systemjs-0.20.6.tgz#79838d2b4bce9c014330efa0b4c7b9345e830a72" integrity sha512-p3yv9sBBJXi3noUG216BpUI7VtVBUAvBIfZNTiDROUY31YBfsFHM4DreS7XMekN8IjtX0ysvCnm6r3WnirnNeA== +"@types/tapable@*": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.4.tgz#b4ffc7dc97b498c969b360a41eee247f82616370" + integrity sha512-78AdXtlhpCHT0K3EytMpn4JNxaf5tbqbLcbIRoQIHzpTIyjpxLQKRoxU55ujBXAtg3Nl2h/XWvfDa9dsMOd0pQ== + "@types/through@*": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.29.tgz#72943aac922e179339c651fa34a4428a4d722f93" @@ -2324,6 +2563,13 @@ resolved "https://registry.yarnpkg.com/@types/tinycolor2/-/tinycolor2-1.4.2.tgz#721ca5c5d1a2988b4a886e35c2ffc5735b6afbdf" integrity sha512-PeHg/AtdW6aaIO2a+98Xj7rWY4KC1E6yOy7AFknJQ7VXUGNrMlyxDFxJo7HqLtjQms/ZhhQX52mLVW/EX3JGOw== +"@types/uglify-js@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.4.tgz#96beae23df6f561862a830b4288a49e86baac082" + integrity sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ== + dependencies: + source-map "^0.6.1" + "@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" @@ -2343,10 +2589,32 @@ "@types/unist" "*" "@types/vfile-message" "*" +"@types/webpack-dev-server@*": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@types/webpack-dev-server/-/webpack-dev-server-3.1.6.tgz#a674bcdbe045390e6301977790d465f4aeb5b1c0" + integrity sha512-fysTHPetk7emf4XPj+GCbwGy56JTIUXWH7FuSABctCU2i+pczOD9bbUqd1+vT18WhqEqsr5v8SPshvm/FL3yDw== + dependencies: + "@types/connect-history-api-fallback" "*" + "@types/express" "*" + "@types/http-proxy-middleware" "*" + "@types/serve-static" "*" + "@types/webpack" "*" + "@types/webpack-env@*": version "1.13.9" resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.13.9.tgz#a67287861c928ebf4159a908d1fb1a2a34d4097a" +"@types/webpack@*", "@types/webpack@4.4.34": + version "4.4.34" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.4.34.tgz#e5f88b9a795da11683b4ec4a07d1c2b023b19810" + integrity sha512-GnEBgjHsfO1M7DIQ0dAupSofcmDItE3Zsu3reK8SQpl/6N0rtUQxUmQzVFAS5ou/FGjsYKjXAWfItLZ0kNFTfQ== + dependencies: + "@types/anymatch" "*" + "@types/node" "*" + "@types/tapable" "*" + "@types/uglify-js" "*" + source-map "^0.6.0" + "@types/yargs@^12.0.2", "@types/yargs@^12.0.9": version "12.0.12" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.12.tgz#45dd1d0638e8c8f153e87d296907659296873916" @@ -2513,13 +2781,6 @@ abbrev@1, abbrev@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" -abstract-leveldown@~0.12.0, abstract-leveldown@~0.12.1: - version "0.12.4" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz#29e18e632e60e4e221d5810247852a63d7b2e410" - integrity sha1-KeGOYy5g5OIh1YECR4UqY9ey5BA= - dependencies: - xtend "~3.0.0" - accepts@~1.3.4, accepts@~1.3.5: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -2556,7 +2817,7 @@ acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" -acorn@^5.0.0, acorn@^5.5.0, acorn@^5.5.3, acorn@^5.7.3: +acorn@^5.0.0, acorn@^5.5.0, acorn@^5.5.3: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" @@ -2771,14 +3032,6 @@ any-observable@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== - dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" - anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -3002,7 +3255,7 @@ astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" -async-each@^1.0.0, async-each@^1.0.1: +async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" @@ -3147,6 +3400,16 @@ babel-loader@8.0.5: mkdirp "^0.5.1" util.promisify "^1.0.0" +babel-loader@8.0.6: + version "8.0.6" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" + integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw== + dependencies: + find-cache-dir "^2.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + pify "^4.0.1" + babel-plugin-add-react-displayname@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz#339d4cddb7b65fd62d1df9db9fe04de134122bd5" @@ -3507,13 +3770,6 @@ bl@^1.0.0: readable-stream "^2.3.5" safe-buffer "^5.1.1" -bl@~0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/bl/-/bl-0.8.2.tgz#c9b6bca08d1bc2ea00fc8afb4f1a5fd1e1c66e4e" - integrity sha1-yba8oI0bwuoA/Ir7Txpf0eHGbk4= - dependencies: - readable-stream "~1.0.26" - block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" @@ -3607,7 +3863,7 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -braces@^2.3.0, braces@^2.3.1, braces@^2.3.2: +braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" dependencies: @@ -3622,6 +3878,13 @@ braces@^2.3.0, braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -3668,15 +3931,6 @@ browserify-des@^1.0.0: inherits "^2.0.1" safe-buffer "^5.1.2" -browserify-fs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-fs/-/browserify-fs-1.0.0.tgz#f075aa8a729d4d1716d066620e386fcc1311a96f" - integrity sha1-8HWqinKdTRcW0GZiDjhvzBMRqW8= - dependencies: - level-filesystem "^1.0.1" - level-js "^2.1.3" - levelup "^0.18.2" - browserify-rsa@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" @@ -3710,6 +3964,15 @@ browserslist@4.4.1: electron-to-chromium "^1.3.103" node-releases "^1.1.3" +browserslist@4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.5.4.tgz#166c4ecef3b51737a42436ea8002aeea466ea2c7" + integrity sha512-rAjx494LMjqKnMPhFkuLmLp8JWEX0o8ADTGeAbOqaF+XCvYLreZrG5uVjnPBlAQ8REZK4pzXGvp0bWgrFtKaag== + dependencies: + caniuse-lite "^1.0.30000955" + electron-to-chromium "^1.3.122" + node-releases "^1.1.13" + browserslist@^4.0.0, browserslist@^4.3.4, browserslist@^4.4.2, browserslist@^4.5.2, browserslist@^4.5.4: version "4.5.6" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.5.6.tgz#ea42e8581ca2513fa7f371d4dd66da763938163d" @@ -3718,6 +3981,15 @@ browserslist@^4.0.0, browserslist@^4.3.4, browserslist@^4.4.2, browserslist@^4.5 electron-to-chromium "^1.3.127" node-releases "^1.1.17" +browserslist@^4.6.0, browserslist@^4.6.2: + version "4.6.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.3.tgz#0530cbc6ab0c1f3fc8c819c72377ba55cf647f05" + integrity sha512-CNBqTCq22RKM8wKJNowcqihHJ4SkI8CGeK7KOR9tPboXUuS5Zk5lQgzzTbs4oxD8x+6HUshZUa2OyNI9lR93bQ== + dependencies: + caniuse-lite "^1.0.30000975" + electron-to-chromium "^1.3.164" + node-releases "^1.1.23" + bs-logger@0.x: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -3745,11 +4017,6 @@ buffer-crc32@^0.2.1: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" -buffer-es6@^4.9.2, buffer-es6@^4.9.3: - version "4.9.3" - resolved "https://registry.yarnpkg.com/buffer-es6/-/buffer-es6-4.9.3.tgz#f26347b82df76fd37e18bcb5288c4970cfd5c404" - integrity sha1-8mNHuC33b9N+GLy1KIxJcM/VxAQ= - buffer-fill@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" @@ -3785,7 +4052,7 @@ builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" -builtin-modules@^3.0.0, builtin-modules@^3.1.0: +builtin-modules@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" @@ -3940,6 +4207,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000929, caniuse-lite@^1.0.30000947, can version "1.0.30000966" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000966.tgz#f3c6fefacfbfbfb981df6dfa68f2aae7bff41b64" +caniuse-lite@^1.0.30000955, caniuse-lite@^1.0.30000975: + version "1.0.30000979" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000979.tgz#92f16d00186a6cf20d6c5711bb6e042a3d667029" + integrity sha512-gcu45yfq3B7Y+WB05fOMfr0EiSlq+1u+m6rPHyJli/Wy3PVQNGaU7VA4bZE5qw+AU2UVOBR/N5g1bzADUqdvFw== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -4053,42 +4325,6 @@ child-process-promise@^2.2.1: node-version "^1.0.0" promise-polyfill "^6.0.1" -chokidar@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" - integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.0" - braces "^2.3.0" - glob-parent "^3.1.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - lodash.debounce "^4.0.8" - normalize-path "^2.1.1" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - upath "^1.0.5" - optionalDependencies: - fsevents "^1.2.2" - -chokidar@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" - chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.4, chokidar@^2.1.0: version "2.1.5" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d" @@ -4289,11 +4525,6 @@ clone@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" -clone@~0.1.9: - version "0.1.19" - resolved "https://registry.yarnpkg.com/clone/-/clone-0.1.19.tgz#613fb68639b26a494ac53253e15b1a6bd88ada85" - integrity sha1-YT+2hjmyaklKxTJT4Vsaa9iK2oU= - cmd-shim@^2.0.2, cmd-shim@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb" @@ -4356,7 +4587,7 @@ color@^3.0.0: color-convert "^1.9.1" color-string "^1.5.2" -colors@1.3.3, colors@^1.1.2: +colors@^1.1.2: version "1.3.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" @@ -4462,7 +4693,7 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@1.6.2, concat-stream@^1.4.4, concat-stream@^1.4.6, concat-stream@^1.5.0: +concat-stream@1.6.2, concat-stream@^1.4.6, concat-stream@^1.5.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" dependencies: @@ -4575,6 +4806,24 @@ copy-to-clipboard@^3.0.8, copy-to-clipboard@^3.1.0: dependencies: toggle-selection "^1.0.6" +copy-webpack-plugin@5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.0.3.tgz#2179e3c8fd69f13afe74da338896f1f01a875b5c" + integrity sha512-PlZRs9CUMnAVylZq+vg2Juew662jWtwOXOqH4lbQD9ZFhRG9R7tVStOgHt21CBGVq7k5yIJaz8TXDLSjV+Lj8Q== + dependencies: + cacache "^11.3.2" + find-cache-dir "^2.1.0" + glob-parent "^3.1.0" + globby "^7.1.1" + is-glob "^4.0.1" + loader-utils "^1.2.3" + minimatch "^3.0.4" + normalize-path "^3.0.0" + p-limit "^2.2.0" + schema-utils "^1.0.0" + serialize-javascript "^1.7.0" + webpack-log "^2.0.0" + core-js-compat@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.0.1.tgz#bff73ba31ca8687431b9c88f78d3362646fb76f0" @@ -4584,10 +4833,24 @@ core-js-compat@^3.0.0: core-js-pure "3.0.1" semver "^6.0.0" +core-js-compat@^3.1.1: + version "3.1.4" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.1.4.tgz#e4d0c40fbd01e65b1d457980fe4112d4358a7408" + integrity sha512-Z5zbO9f1d0YrJdoaQhphVAnKPimX92D6z8lCGphH89MNRxlL1prI9ExJPqVwP0/kgkQCv8c4GJGT8X16yUncOg== + dependencies: + browserslist "^4.6.2" + core-js-pure "3.1.4" + semver "^6.1.1" + core-js-pure@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.0.1.tgz#37358fb0d024e6b86d443d794f4e37e949098cbe" +core-js-pure@3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.1.4.tgz#5fa17dc77002a169a3566cc48dc774d2e13e3769" + integrity sha512-uJ4Z7iPNwiu1foygbcZYJsJs1jiXrTTCvxfLDXNhI/I+NHbSIEyr548y4fcsCEyWY0XgfAG/qqaunJ1SThHenA== + core-js@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.0.1.tgz#1343182634298f7f38622f95e73f54e48ddf4738" @@ -4788,6 +5051,24 @@ css-loader@2.1.1, css-loader@^2.1.0: postcss-value-parser "^3.3.0" schema-utils "^1.0.0" +css-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.0.0.tgz#bdd48a4921eefedf1f0a55266585944d4e5efc63" + integrity sha512-WR6KZuCkFbnMhRrGPlkwAA7SSCtwqPwpyXJAPhotYkYsc0mKU9n/fu5wufy4jl2WhBw9Ia8gUQMIp/1w98DuPw== + dependencies: + camelcase "^5.3.1" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.17" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.1.0" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.0.0" + schema-utils "^1.0.0" + css-select-base-adapter@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" @@ -4901,7 +5182,7 @@ cssnano-util-same-parent@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" -cssnano@^4.1.0: +cssnano@^4.1.0, cssnano@^4.1.10: version "4.1.10" resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" dependencies: @@ -5492,13 +5773,6 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -deferred-leveldown@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz#2cef1f111e1c57870d8bbb8af2650e587cd2f5b4" - integrity sha1-LO8fER4cV4cNi7uK8mUOWHzS9bQ= - dependencies: - abstract-leveldown "~0.12.1" - define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -5659,6 +5933,13 @@ dir-glob@2.0.0: arrify "^1.0.1" path-type "^3.0.0" +dir-glob@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + direction@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/direction/-/direction-0.1.5.tgz#ce5d797f97e26f8be7beff53f7dc40e1c1a9ec4c" @@ -5864,6 +6145,16 @@ electron-to-chromium@^1.3.103, electron-to-chromium@^1.3.127: version "1.3.131" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.131.tgz#205a0b7a276b3f56bc056f19178909243054252a" +electron-to-chromium@^1.3.122: + version "1.3.185" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.185.tgz#36368514eb719632a91435f3c9f57c98b47d81de" + integrity sha512-h2iW0AHIwix8ifNJg/RkXhQjUDqBME8TvX8qQQMvvF2Tb6F2KnO6febvI+JqI9CdZOWnl90CPxdBRWGDrdk9UA== + +electron-to-chromium@^1.3.164: + version "1.3.183" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.183.tgz#d6ecf177d3388ae5913844ea46b4b4c9cc726e52" + integrity sha512-WbKCYs7yAFOfpuoa2pK5kbOngriUtlPC+8mcQW5L/686wv04w7hYXfw5ScDrsl9kixFw1SPsALEob5V/gtlDxw== + elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" @@ -6010,7 +6301,7 @@ err-code@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" -errno@^0.1.1, errno@^0.1.3, errno@~0.1.1, errno@~0.1.7: +errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" dependencies: @@ -6249,11 +6540,6 @@ estree-walker@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.0.tgz#5d865327c44a618dde5699f763891ae31f257dae" -estree-walker@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" - integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== - esutils@^2.0.0, esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -6649,6 +6935,13 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + finalhandler@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" @@ -6661,7 +6954,7 @@ finalhandler@1.1.1: statuses "~1.4.0" unpipe "~1.0.0" -find-cache-dir@^2.0.0: +find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" dependencies: @@ -6771,11 +7064,6 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" -foreach@~2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -6792,6 +7080,20 @@ fork-ts-checker-webpack-plugin@1.0.0: semver "^5.6.0" tapable "^1.0.0" +fork-ts-checker-webpack-plugin@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.1.1.tgz#caf2a210778fb1e171b6993ca0a40f9b6589e3b7" + integrity sha512-gqWAEMLlae/oeVnN6RWCAhesOJMswAN1MaKNqhhjXHV5O0/rTUjWI4UbgQHdlrVbCnb+xLotXmJbBlC66QmpFw== + dependencies: + babel-code-frame "^6.22.0" + chalk "^2.4.1" + chokidar "^2.0.4" + micromatch "^3.1.10" + minimatch "^3.0.4" + semver "^5.6.0" + tapable "^1.0.0" + worker-rpc "^0.1.0" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -6909,7 +7211,7 @@ fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" -fsevents@^1.0.0, fsevents@^1.2.2, fsevents@^1.2.7: +fsevents@^1.2.7: version "1.2.9" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" dependencies: @@ -6941,13 +7243,6 @@ fuzzy-search@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/fuzzy-search/-/fuzzy-search-3.0.1.tgz#14a4964508a9607d6e9a88818e7ff634108260b6" -fwd-stream@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fwd-stream/-/fwd-stream-1.0.4.tgz#ed281cabed46feecf921ee32dc4c50b372ac7cfa" - integrity sha1-7Sgcq+1G/uz5Ie4y3ExQs3KsfPo= - dependencies: - readable-stream "~1.0.26-4" - g-status@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/g-status/-/g-status-2.0.2.tgz#270fd32119e8fc9496f066fe5fe88e0a6bc78b97" @@ -7080,19 +7375,19 @@ glob-base@^0.3.0: glob-parent "^2.0.0" is-glob "^2.0.0" -glob-parent@3.1.0, glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - glob-parent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" dependencies: is-glob "^2.0.0" +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + glob-to-regexp@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" @@ -7235,7 +7530,19 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -globule@^1.0.0: +globby@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" + integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA= + dependencies: + array-union "^1.0.1" + dir-glob "^2.0.0" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +globule@^1.0.0: version "1.2.1" resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" dependencies: @@ -7866,17 +8173,19 @@ icss-replace-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + icss-utils@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.0.tgz#339dbbffb9f8729a243b701e1c29d4cc58c52f0e" dependencies: postcss "^7.0.14" -idb-wrapper@^1.5.0: - version "1.7.2" - resolved "https://registry.yarnpkg.com/idb-wrapper/-/idb-wrapper-1.7.2.tgz#8251afd5e77fe95568b1c16152eb44b396767ea2" - integrity sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg== - ieee754@^1.1.4: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" @@ -7976,7 +8285,7 @@ indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" -indexof@0.0.1, indexof@~0.0.1: +indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" @@ -8037,6 +8346,25 @@ inquirer@6.2.1: strip-ansi "^5.0.0" through "^2.3.6" +inquirer@6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" + integrity sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.11" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.0.0" + through "^2.3.6" + inquirer@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" @@ -8335,7 +8663,7 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0: +is-glob@^4.0.0, is-glob@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" dependencies: @@ -8408,15 +8736,15 @@ is-number@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + is-obj@^1.0.0, is-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" -is-object@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-0.1.2.tgz#00efbc08816c33cfc4ac8251d132e10dc65098d7" - integrity sha1-AO+8CIFsM8/ErIJR0TLhDcZQmNc= - is-observable@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" @@ -8455,7 +8783,7 @@ is-path-inside@^2.1.0: dependencies: path-is-inside "^1.0.2" -is-plain-obj@^1.1.0: +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -8485,13 +8813,6 @@ is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" -is-reference@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.1.2.tgz#01cf91517d21db66a34642287ed6e70d53dcbe5c" - integrity sha512-Kn5g8c7XHKejFOpTf2QN9YjiHHKl5xRj+2uAZf9iM2//nkBNi/NNeB5JMoun28nEaUVHyPUzqzhfRlfAirEjXg== - dependencies: - "@types/estree" "0.0.39" - is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" @@ -8564,11 +8885,6 @@ is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" -is@~0.2.6: - version "0.2.7" - resolved "https://registry.yarnpkg.com/is/-/is-0.2.7.tgz#3b34a2c48f359972f35042849193ae7264b63562" - integrity sha1-OzSixI81mXLzUEKEkZOucmS2NWI= - isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -8577,11 +8893,6 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" -isbuffer@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/isbuffer/-/isbuffer-0.0.0.tgz#38c146d9df528b8bf9b0701c3d43cf12df3fc39b" - integrity sha1-OMFG2d9Si4v5sHAcPUPPEt8/w5s= - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -8699,6 +9010,13 @@ jest-config@^24.8.0: pretty-format "^24.8.0" realpath-native "^1.1.0" +jest-coverage-badges@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/jest-coverage-badges/-/jest-coverage-badges-1.1.2.tgz#a70786b139fd8fb685db732e1e2d916d8a47287e" + integrity sha512-44A7i2xR6os8+fWk8ZRM6W4fKiD2jwKOLU9eB3iTIIWACd9RbdvmiCNpQZTOsUBhKvz7aQ/ASFhu5JOEhWUOlg== + dependencies: + mkdirp "0.5.1" + jest-date-mock@1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/jest-date-mock/-/jest-date-mock-1.0.7.tgz#b1e5071beb314cbfcfb0a21d8560a2122519f5c3" @@ -9256,91 +9574,6 @@ left-pad@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" -level-blobs@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/level-blobs/-/level-blobs-0.1.7.tgz#9ab9b97bb99f1edbf9f78a3433e21ed56386bdaf" - integrity sha1-mrm5e7mfHtv594o0M+Ie1WOGva8= - dependencies: - level-peek "1.0.6" - once "^1.3.0" - readable-stream "^1.0.26-4" - -level-filesystem@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/level-filesystem/-/level-filesystem-1.2.0.tgz#a00aca9919c4a4dfafdca6a8108d225aadff63b3" - integrity sha1-oArKmRnEpN+v3KaoEI0iWq3/Y7M= - dependencies: - concat-stream "^1.4.4" - errno "^0.1.1" - fwd-stream "^1.0.4" - level-blobs "^0.1.7" - level-peek "^1.0.6" - level-sublevel "^5.2.0" - octal "^1.0.0" - once "^1.3.0" - xtend "^2.2.0" - -level-fix-range@2.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/level-fix-range/-/level-fix-range-2.0.0.tgz#c417d62159442151a19d9a2367868f1724c2d548" - integrity sha1-xBfWIVlEIVGhnZojZ4aPFyTC1Ug= - dependencies: - clone "~0.1.9" - -level-fix-range@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/level-fix-range/-/level-fix-range-1.0.2.tgz#bf15b915ae36d8470c821e883ddf79cd16420828" - integrity sha1-vxW5Fa422EcMgh6IPd95zRZCCCg= - -"level-hooks@>=4.4.0 <5": - version "4.5.0" - resolved "https://registry.yarnpkg.com/level-hooks/-/level-hooks-4.5.0.tgz#1b9ae61922930f3305d1a61fc4d83c8102c0dd93" - integrity sha1-G5rmGSKTDzMF0aYfxNg8gQLA3ZM= - dependencies: - string-range "~1.2" - -level-js@^2.1.3: - version "2.2.4" - resolved "https://registry.yarnpkg.com/level-js/-/level-js-2.2.4.tgz#bc055f4180635d4489b561c9486fa370e8c11697" - integrity sha1-vAVfQYBjXUSJtWHJSG+jcOjBFpc= - dependencies: - abstract-leveldown "~0.12.0" - idb-wrapper "^1.5.0" - isbuffer "~0.0.0" - ltgt "^2.1.2" - typedarray-to-buffer "~1.0.0" - xtend "~2.1.2" - -level-peek@1.0.6, level-peek@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/level-peek/-/level-peek-1.0.6.tgz#bec51c72a82ee464d336434c7c876c3fcbcce77f" - integrity sha1-vsUccqgu5GTTNkNMfIdsP8vM538= - dependencies: - level-fix-range "~1.0.2" - -level-sublevel@^5.2.0: - version "5.2.3" - resolved "https://registry.yarnpkg.com/level-sublevel/-/level-sublevel-5.2.3.tgz#744c12c72d2e72be78dde3b9b5cd84d62191413a" - integrity sha1-dEwSxy0ucr543eO5tc2E1iGRQTo= - dependencies: - level-fix-range "2.0" - level-hooks ">=4.4.0 <5" - string-range "~1.2.1" - xtend "~2.0.4" - -levelup@^0.18.2: - version "0.18.6" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-0.18.6.tgz#e6a01cb089616c8ecc0291c2a9bd3f0c44e3e5eb" - integrity sha1-5qAcsIlhbI7MApHCqb0/DETj5es= - dependencies: - bl "~0.8.1" - deferred-leveldown "~0.2.0" - errno "~0.1.1" - prr "~0.0.0" - readable-stream "~1.0.26" - semver "~2.3.1" - xtend "~3.0.0" - leven@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" @@ -9851,19 +10084,7 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -ltgt@^2.1.2: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" - integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= - -magic-string@^0.22.5: - version "0.22.5" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" - integrity sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w== - dependencies: - vlq "^0.2.2" - -magic-string@^0.25.1, magic-string@^0.25.2: +magic-string@^0.25.1: version "0.25.2" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.2.tgz#139c3a729515ec55e96e69e82a11fe890a293ad9" dependencies: @@ -10078,7 +10299,12 @@ methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" -micromatch@^2.1.5, micromatch@^2.3.11: +microevent.ts@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" + integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== + +micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" dependencies: @@ -10114,6 +10340,14 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, mic snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -10165,6 +10399,16 @@ mini-css-extract-plugin@0.5.0, mini-css-extract-plugin@^0.5.0: schema-utils "^1.0.0" webpack-sources "^1.1.0" +mini-css-extract-plugin@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.7.0.tgz#5ba8290fbb4179a43dd27cca444ba150bee743a0" + integrity sha512-RQIw6+7utTYn8DBGsf/LpRgZCJMpZt+kuawJ/fju0KiOL6nAaTBNmCJwS7HtwSCXfS47gCkmtBFS7HdsquhdxQ== + dependencies: + loader-utils "^1.1.0" + normalize-url "1.9.1" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -10343,6 +10587,11 @@ nan@^2.10.0, nan@^2.12.1, nan@^2.6.2: version "2.13.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" +nan@^2.13.2: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + nano-css@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/nano-css/-/nano-css-5.1.0.tgz#03c2b4ea2edefd445ac0c0e0f2565ea62e2aa81a" @@ -10597,6 +10846,13 @@ node-pre-gyp@^0.12.0: semver "^5.3.0" tar "^4" +node-releases@^1.1.13, node-releases@^1.1.23: + version "1.1.24" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.24.tgz#2fb494562705c01bfb81a7af9f8584c4d56311b4" + integrity sha512-wym2jptfuKowMmkZsfCSTsn8qAVo8zm+UiQA6l5dNqUcpfChZSnS/vbbpOeXczf+VdPhutxh+99lWHhdd6xKzg== + dependencies: + semver "^5.3.0" + node-releases@^1.1.17, node-releases@^1.1.3: version "1.1.17" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.17.tgz#71ea4631f0a97d5cd4f65f7d04ecf9072eac711a" @@ -10627,6 +10883,29 @@ node-sass@4.11.0: stdout-stream "^1.4.0" "true-case-path" "^1.0.2" +node-sass@^4.12.0: + version "4.12.0" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.12.0.tgz#0914f531932380114a30cc5fa4fa63233a25f017" + integrity sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ== + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash "^4.17.11" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.13.2" + node-gyp "^3.8.0" + npmlog "^4.0.0" + request "^2.88.0" + sass-graph "^2.2.4" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + node-version@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.2.0.tgz#34fde3ffa8e1149bd323983479dda620e1b5060d" @@ -10696,6 +10975,16 @@ normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" +normalize-url@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + normalize-url@^3.0.0: version "3.3.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" @@ -10977,20 +11266,6 @@ object-keys@^1.0.0, object-keys@^1.0.11, object-keys@^1.0.12: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" -object-keys@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.2.0.tgz#cddec02998b091be42bf1035ae32e49f1cb6ea67" - integrity sha1-zd7AKZiwkb5CvxA1rjLknxy26mc= - dependencies: - foreach "~2.0.1" - indexof "~0.0.1" - is "~0.2.6" - -object-keys@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" - integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= - object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -11063,11 +11338,6 @@ obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" -octal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/octal/-/octal-1.0.0.tgz#63e7162a68efbeb9e213588d58e989d1e5c4530b" - integrity sha1-Y+cWKmjvvrniE1iNWOmJ0eXEUws= - on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -11124,6 +11394,14 @@ optimize-css-assets-webpack-plugin@5.0.1: cssnano "^4.1.0" last-call-webpack-plugin "^3.0.0" +optimize-css-assets-webpack-plugin@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572" + integrity sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA== + dependencies: + cssnano "^4.1.10" + last-call-webpack-plugin "^3.0.0" + optionator@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" @@ -11228,7 +11506,7 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0: +p-limit@^2.0.0, p-limit@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" dependencies: @@ -11500,6 +11778,11 @@ phantomjs-prebuilt@2.1.16: request-progress "^2.0.1" which "^1.2.10" +picomatch@^2.0.5: + version "2.0.7" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" + integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -11740,6 +12023,16 @@ postcss-modules-local-by-default@^2.0.6: postcss-selector-parser "^6.0.0" postcss-value-parser "^3.3.1" +postcss-modules-local-by-default@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" + integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.16" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.0" + postcss-modules-scope@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz#ad3f5bf7856114f6fcab901b0502e2a2bc39d4eb" @@ -11754,6 +12047,14 @@ postcss-modules-values@^2.0.0: icss-replace-symbols "^1.1.0" postcss "^7.0.6" +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + postcss-normalize-charset@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" @@ -11877,7 +12178,7 @@ postcss-selector-parser@^5.0.0-rc.4: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-selector-parser@^6.0.0: +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" dependencies: @@ -11906,6 +12207,11 @@ postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.0, postcss-value-parser@^ version "3.3.1" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" +postcss-value-parser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.0.tgz#99a983d365f7b2ad8d0f9b8c3094926eab4b936d" + integrity sha512-ESPktioptiSUchCKgggAkzdmkgzKfmp0EU8jXH+5kbIUB+unr0Y4CY9SRMvibuvYUBjNh1ACLbxqYNpdTQOteQ== + postcss@^5.0.0, postcss@^5.0.4: version "5.2.18" resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" @@ -11923,6 +12229,15 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.5, postcss@^7.0.6, source-map "^0.6.1" supports-color "^6.1.0" +postcss@^7.0.16, postcss@^7.0.17: + version "7.0.17" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.17.tgz#4da1bdff5322d4a0acaab4d87f3e782436bad31f" + integrity sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + power-assert-context-formatter@^1.0.7: version "1.2.0" resolved "https://registry.yarnpkg.com/power-assert-context-formatter/-/power-assert-context-formatter-1.2.0.tgz#8fbe72692288ec5a7203cdf215c8b838a6061d2a" @@ -12039,7 +12354,7 @@ prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" -prepend-http@^1.0.1: +prepend-http@^1.0.0, prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" @@ -12106,11 +12421,6 @@ private@^0.1.6, private@~0.1.5: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" -process-es6@^0.11.2, process-es6@^0.11.6: - version "0.11.6" - resolved "https://registry.yarnpkg.com/process-es6/-/process-es6-0.11.6.tgz#c6bb389f9a951f82bd4eb169600105bd2ff9c778" - integrity sha1-xrs4n5qVH4K9TrFpYAEFvS/5x3g= - process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" @@ -12228,11 +12538,6 @@ proxy-from-env@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" -prr@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" - integrity sha1-GoS4WQgyVQFBGFPQCB7j+obikmo= - prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -12330,6 +12635,14 @@ qs@^6.5.2: version "6.7.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + query-string@^6.2.0: version "6.5.0" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.5.0.tgz#2e1a70125af01f6f04573692d02c09302a1d8bfc" @@ -12559,6 +12872,37 @@ react-dev-utils@^7.0.0, react-dev-utils@^7.0.1: strip-ansi "5.0.0" text-table "0.2.0" +react-dev-utils@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-9.0.1.tgz#5c03d85a0b2537d0c46af7165c24a7dfb274bef2" + integrity sha512-pnaeMo/Pxel8aZpxk1WwxT3uXxM3tEwYvsjCYn5R7gNxjhN1auowdcLDzFB8kr7rafAj2rxmvfic/fbac5CzwQ== + dependencies: + "@babel/code-frame" "7.0.0" + address "1.0.3" + browserslist "4.5.4" + chalk "2.4.2" + cross-spawn "6.0.5" + detect-port-alt "1.1.6" + escape-string-regexp "1.0.5" + filesize "3.6.1" + find-up "3.0.0" + fork-ts-checker-webpack-plugin "1.1.1" + global-modules "2.0.0" + globby "8.0.2" + gzip-size "5.0.0" + immer "1.10.0" + inquirer "6.2.2" + is-root "2.0.0" + loader-utils "1.2.3" + opn "5.4.0" + pkg-up "2.0.0" + react-error-overlay "^5.1.6" + recursive-readdir "2.2.2" + shell-quote "1.6.1" + sockjs-client "1.3.0" + strip-ansi "5.2.0" + text-table "0.2.0" + react-docgen-typescript-loader@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/react-docgen-typescript-loader/-/react-docgen-typescript-loader-3.0.1.tgz#889aa472450c8db82ea0355656a307806ec74e77" @@ -12617,6 +12961,11 @@ react-error-overlay@^5.1.4: version "5.1.5" resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-5.1.5.tgz#884530fd055476c764eaa8ab13b8ecf1f57bbf2c" +react-error-overlay@^5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-5.1.6.tgz#0cd73407c5d141f9638ae1e0c63e7b2bf7e9929d" + integrity sha512-X1Y+0jR47ImDVr54Ab6V9eGk0Hnu7fVWGeHQSOXHf/C2pF9c6uy3gef8QUeuUiWlNb0i08InPSE5a/KJzNzw1Q== + react-fast-compare@^2.0.2, react-fast-compare@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" @@ -13014,15 +13363,6 @@ read@1, read@~1.0.1, read@~1.0.7: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^1.0.26-4, readable-stream@~1.1.10: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - readable-stream@^3.0.6, readable-stream@^3.1.1: version "3.3.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.3.0.tgz#cb8011aad002eb717bf040291feba8569c986fb9" @@ -13031,10 +13371,9 @@ readable-stream@^3.0.6, readable-stream@^3.1.1: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@~1.0.26, readable-stream@~1.0.26-4: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= +readable-stream@~1.1.10: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -13050,7 +13389,7 @@ readdir-scoped-modules@^1.0.0: graceful-fs "^4.1.2" once "^1.3.0" -readdirp@^2.0.0, readdirp@^2.2.1: +readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" dependencies: @@ -13210,6 +13549,13 @@ regenerator-transform@^0.13.4: dependencies: private "^0.1.6" +regenerator-transform@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.0.tgz#2ca9aaf7a2c239dd32e4761218425b8c7a86ecaf" + integrity sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w== + dependencies: + private "^0.1.6" + regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" @@ -13233,6 +13579,11 @@ regexp-tree@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.6.tgz#84900fa12fdf428a2ac25f04300382a7c0148479" +regexp-tree@^0.1.6: + version "0.1.10" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.10.tgz#d837816a039c7af8a8d64d7a7c3cf6a1d93450bc" + integrity sha512-K1qVSbcedffwuIslMwpe6vGlj+ZXRnGkvjAtFHfDZZZuEdA/h0dxljAPu9vhUo6Rrx2U2AwJ+nSQ6hK+lrP5MQ== + regexp.prototype.flags@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz#6b30724e306a27833eeb171b66ac8890ba37e41c" @@ -13321,6 +13672,11 @@ replace-ext@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" +replace-in-file-webpack-plugin@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/replace-in-file-webpack-plugin/-/replace-in-file-webpack-plugin-1.0.6.tgz#eee7e139be967e8e48a0552f73037ed567b54dbd" + integrity sha512-+KRgNYL2nbc6nza6SeF+wTBNkovuHFTfJF8QIEqZg5MbwkYpU9no0kH2YU354wvY/BK8mAC2UKoJ7q+sJTvciw== + replace-in-file@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/replace-in-file/-/replace-in-file-4.1.0.tgz#07846245a4b98a8bc5f5f9c3e3e368fa12b18bf7" @@ -13391,11 +13747,6 @@ require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" -require-relative@0.8.7: - version "0.8.7" - resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" - integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= - require-uncached@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" @@ -13462,12 +13813,6 @@ resolve@1.1.7, resolve@~1.1.0: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" -resolve@1.10.1, resolve@1.x, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.8.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18" - dependencies: - path-parse "^1.0.6" - resolve@1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" @@ -13475,10 +13820,9 @@ resolve@1.8.1: dependencies: path-parse "^1.0.5" -resolve@^1.11.0, resolve@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" - integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== +resolve@1.x, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.8.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18" dependencies: path-parse "^1.0.6" @@ -13557,56 +13901,6 @@ rollup-plugin-commonjs@9.2.1: resolve "^1.10.0" rollup-pluginutils "^2.3.3" -rollup-plugin-commonjs@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.0.1.tgz#fbfcadf4ce2e826068e056a9f5c19287d9744ddf" - integrity sha512-x0PcCVdEc4J8igv1qe2vttz8JKAKcTs3wfIA3L8xEty3VzxgORLrzZrNWaVMc+pBC4U3aDOb9BnWLAQ8J11vkA== - dependencies: - estree-walker "^0.6.1" - is-reference "^1.1.2" - magic-string "^0.25.2" - resolve "^1.11.0" - rollup-pluginutils "^2.8.1" - -rollup-plugin-copy-glob@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-copy-glob/-/rollup-plugin-copy-glob-0.3.0.tgz#cec0e96c26e8a5aee0930c62e6147f941a39452d" - integrity sha512-x2ialxhpchEiOZ5cE8h3/9MDm2nMNFGXTssJxy+OFCldl0qISRQmtGmqkdal1KOiT4UebLct4K2kkhd6fvugLg== - dependencies: - chokidar "2.0.4" - colors "1.3.3" - glob "7.1.3" - glob-parent "3.1.0" - -rollup-plugin-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-json/-/rollup-plugin-json-4.0.0.tgz#a18da0a4b30bf5ca1ee76ddb1422afbb84ae2b9e" - integrity sha512-hgb8N7Cgfw5SZAkb3jf0QXii6QX/FOkiIq2M7BAQIEydjHvTyxXHQiIzZaTFgx1GK0cRCHOCBHIyEkkLdWKxow== - dependencies: - rollup-pluginutils "^2.5.0" - -rollup-plugin-node-builtins@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-builtins/-/rollup-plugin-node-builtins-2.1.2.tgz#24a1fed4a43257b6b64371d8abc6ce1ab14597e9" - integrity sha1-JKH+1KQyV7a2Q3HYq8bOGrFFl+k= - dependencies: - browserify-fs "^1.0.0" - buffer-es6 "^4.9.2" - crypto-browserify "^3.11.0" - process-es6 "^0.11.2" - -rollup-plugin-node-globals@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-globals/-/rollup-plugin-node-globals-1.4.0.tgz#5e1f24a9bb97c0ef51249f625e16c7e61b7c020b" - integrity sha512-xRkB+W/m1KLIzPUmG0ofvR+CPNcvuCuNdjVBVS7ALKSxr3EDhnzNceGkGi1m8MToSli13AzKFYH4ie9w3I5L3g== - dependencies: - acorn "^5.7.3" - buffer-es6 "^4.9.3" - estree-walker "^0.5.2" - magic-string "^0.22.5" - process-es6 "^0.11.6" - rollup-pluginutils "^2.3.1" - rollup-plugin-node-resolve@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-4.0.1.tgz#f95765d174e5daeef9ea6268566141f53aa9d422" @@ -13615,18 +13909,7 @@ rollup-plugin-node-resolve@4.0.1: is-module "^1.0.0" resolve "^1.10.0" -rollup-plugin-node-resolve@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.1.0.tgz#49608b6ecaf2b776ab83e317d39b282d65d21b76" - integrity sha512-2hwwHNj0s8UEtUNT+lJq8rFWEznP7yJm3GCHBicadF6hiNX1aRARRZIjz2doeTlTGg/hOvJr4C/8+3k9Y/J5Hg== - dependencies: - "@types/resolve" "0.0.8" - builtin-modules "^3.1.0" - is-module "^1.0.0" - resolve "^1.11.1" - rollup-pluginutils "^2.8.1" - -rollup-plugin-sourcemaps@0.4.2, rollup-plugin-sourcemaps@^0.4.2: +rollup-plugin-sourcemaps@0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.4.2.tgz#62125aa94087aadf7b83ef4dfaf629b473135e87" dependencies: @@ -13642,16 +13925,6 @@ rollup-plugin-terser@4.0.4: serialize-javascript "^1.6.1" terser "^3.14.1" -rollup-plugin-terser@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-5.0.0.tgz#ac50fdb703b580447a7e6b1692aeed515a6be8cf" - integrity sha512-W+jJ4opYnlmNyVW0vtRufs+EGf68BIJ7bnOazgz8mgz8pA9lUyrEifAhPs5y9M16wFeAyBGaRjKip4dnFBtXaw== - dependencies: - "@babel/code-frame" "^7.0.0" - jest-worker "^24.6.0" - serialize-javascript "^1.7.0" - terser "^4.0.0" - rollup-plugin-typescript2@0.19.3: version "0.19.3" resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.19.3.tgz#713063233461765f030a2baa2640905c2656164f" @@ -13662,16 +13935,6 @@ rollup-plugin-typescript2@0.19.3: rollup-pluginutils "2.3.3" tslib "1.9.3" -rollup-plugin-typescript2@^0.21.1: - version "0.21.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.21.1.tgz#91cea787c5282762f4849e334cbef6a9fdaa7564" - integrity sha512-jM2tn8/fUKDRmDtH++/6CHYHv2R9dxfXnuW0rxbOq1Zrxdsg4g6w+WwbK0X2ma21WQcT9l/U9bA3RO+2SBIJ/A== - dependencies: - fs-extra "7.0.1" - resolve "1.10.1" - rollup-pluginutils "2.6.0" - tslib "1.9.3" - rollup-plugin-visualizer@0.9.2: version "0.9.2" resolved "https://registry.yarnpkg.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-0.9.2.tgz#bbc8e8e67d5aa3e6c188c5ca0fcfa57234fb9f92" @@ -13681,16 +13944,6 @@ rollup-plugin-visualizer@0.9.2: source-map "^0.7.3" typeface-oswald "0.0.54" -rollup-plugin-visualizer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-1.1.1.tgz#454ae0aed23845407ebfb81cc52114af308d6d90" - integrity sha512-7xkSKp+dyJmSC7jg2LXqViaHuOnF1VvIFCnsZEKjrgT5ZVyiLLSbeszxFcQSfNJILphqgAEmWAUz0Z4xYScrRw== - dependencies: - mkdirp "^0.5.1" - opn "^5.4.0" - source-map "^0.7.3" - typeface-oswald "0.0.54" - rollup-pluginutils@2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.3.3.tgz#3aad9b1eb3e7fe8262820818840bf091e5ae6794" @@ -13699,29 +13952,13 @@ rollup-pluginutils@2.3.3: estree-walker "^0.5.2" micromatch "^2.3.11" -rollup-pluginutils@2.6.0, rollup-pluginutils@^2.0.1, rollup-pluginutils@^2.3.3: +rollup-pluginutils@^2.0.1, rollup-pluginutils@^2.3.3: version "2.6.0" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.6.0.tgz#203706edd43dfafeaebc355d7351119402fc83ad" dependencies: estree-walker "^0.6.0" micromatch "^3.1.10" -rollup-pluginutils@^2.3.1, rollup-pluginutils@^2.5.0, rollup-pluginutils@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz#8fa6dd0697344938ef26c2c09d2488ce9e33ce97" - integrity sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg== - dependencies: - estree-walker "^0.6.1" - -rollup-watch@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/rollup-watch/-/rollup-watch-4.3.1.tgz#5aa1eaeab787addf368905d102b39d6fc5ce4a8b" - integrity sha512-6yjnIwfjpSrqA8IafyIu7fsEyeImNR4aDjA1bQ7KWeVuiA+Clfsx8+PGQkyABWIQzmauQ//tIJ5wAxLXsXs8qQ== - dependencies: - chokidar "^1.7.0" - require-relative "0.8.7" - rollup-pluginutils "^2.0.1" - rollup@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.6.0.tgz#4329f4634718197c678d18491724d50d8b7ee76c" @@ -13730,15 +13967,6 @@ rollup@1.6.0: "@types/node" "^11.9.5" acorn "^6.1.1" -rollup@^1.14.2: - version "1.16.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.16.2.tgz#959aeae4b06c8e540749bac442d6d37aefb9217d" - integrity sha512-UAZxaQvH0klYZdF+90xv9nGb+m4p8jdoaow1VL5/RzDK/gN/4CjvaMmJNcOIv1/+gtzswKhAg/467mzF0sLpAg== - dependencies: - "@types/estree" "0.0.39" - "@types/node" "^12.0.8" - acorn "^6.1.1" - rst-selector-parser@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91" @@ -13988,11 +14216,6 @@ semver@^6.1.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.2.tgz#079960381376a3db62eb2edc8a3bfb10c7cfe318" integrity sha512-z4PqiCpomGtWj8633oeAdXm1Kn1W++3T8epkZYnwiVgIYIJ0QHszhInYSJTYxebByQH7KVCEAn8R9duzZW2PhQ== -semver@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-2.3.2.tgz#b9848f25d6cf36333073ec9ef8856d42f1233e52" - integrity sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI= - semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -14382,6 +14605,13 @@ socks@~2.3.2: ip "^1.1.5" smart-buffer "4.0.2" +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + sorted-object@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/sorted-object/-/sorted-object-2.0.1.tgz#7d631f4bd3a798a24af1dffcfbfe83337a5df5fc" @@ -14644,6 +14874,11 @@ stream-shift@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -14659,11 +14894,6 @@ string-length@^2.0.0: astral-regex "^1.0.0" strip-ansi "^4.0.0" -string-range@~1.2, string-range@~1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/string-range/-/string-range-1.2.2.tgz#a893ed347e72299bc83befbbf2a692a8d239d5dd" - integrity sha1-qJPtNH5yKZvIO++78qaSqNI51d0= - string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -14779,6 +15009,12 @@ strip-ansi@5.0.0: dependencies: ansi-regex "^4.0.0" +strip-ansi@5.2.0, strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + dependencies: + ansi-regex "^4.1.0" + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -14791,12 +15027,6 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - dependencies: - ansi-regex "^4.1.0" - strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -15033,6 +15263,22 @@ terser-webpack-plugin@1.2.3, terser-webpack-plugin@^1.1.0, terser-webpack-plugin webpack-sources "^1.1.0" worker-farm "^1.5.2" +terser-webpack-plugin@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz#69aa22426299f4b5b3775cbed8cb2c5d419aa1d4" + integrity sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg== + dependencies: + cacache "^11.3.2" + find-cache-dir "^2.0.0" + is-wsl "^1.1.0" + loader-utils "^1.2.3" + schema-utils "^1.0.0" + serialize-javascript "^1.7.0" + source-map "^0.6.1" + terser "^4.0.0" + webpack-sources "^1.3.0" + worker-farm "^1.7.0" + terser@^3.14.1, terser@^3.16.1: version "3.17.0" resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" @@ -15042,9 +15288,9 @@ terser@^3.14.1, terser@^3.16.1: source-map-support "~0.5.10" terser@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.0.0.tgz#ef356f6f359a963e2cc675517f21c1c382877374" - integrity sha512-dOapGTU0hETFl1tCo4t56FN+2jffoKyER9qBGoUFyZ6y7WLoKT0bF+lAYi6B6YsILcGF3q1C2FBh8QcKSCgkgA== + version "4.0.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.0.2.tgz#580cea06c4932f46a48ed13804c93bc93c275968" + integrity sha512-IWLuJqTvx97KP3uTYkFVn93cXO+EtlzJu8TdJylq+H0VBDlPMIfQA9MBS5Vc5t3xTEUG1q0hIfHMpAP2R+gWTw== dependencies: commander "^2.19.0" source-map "~0.6.1" @@ -15190,6 +15436,13 @@ to-regex-range@^2.1.0: is-number "^3.0.0" repeat-string "^1.6.1" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" @@ -15311,6 +15564,17 @@ ts-loader@5.3.3: micromatch "^3.1.4" semver "^5.0.1" +ts-loader@6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.0.4.tgz#bc331ad91a887a60632d94c9f79448666f2c4b63" + integrity sha512-p2zJYe7OtwR+49kv4gs7v4dMrfYD1IPpOtqiSPCbe8oR+4zEBtdHwzM7A7M91F+suReqgzZrlClk4LRSSp882g== + dependencies: + chalk "^2.3.0" + enhanced-resolve "^4.0.0" + loader-utils "^1.0.2" + micromatch "^4.0.0" + semver "^6.0.0" + ts-node@8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.1.0.tgz#8c4b37036abd448577db22a061fd7a67d47e658e" @@ -15332,10 +15596,20 @@ ts-node@^8.2.0: source-map-support "^0.5.6" yn "^3.0.0" +tslib@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + tslib@1.9.3, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" +tslint-config-prettier@^1.18.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz#75f140bde947d35d8f0d238e0ebf809d64592c37" + integrity sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg== + tslint-loader@3.5.4: version "3.5.4" resolved "https://registry.yarnpkg.com/tslint-loader/-/tslint-loader-3.5.4.tgz#052af7f0772434451ea1b247bb55407f878a4c40" @@ -15415,11 +15689,6 @@ typed-styles@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" -typedarray-to-buffer@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz#9bb8ba0e841fb3f4cf1fe7c245e9f3fa8a5fe99c" - integrity sha1-m7i6DoQfs/TPH+fCRenz+opf6Zw= - typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -15432,6 +15701,11 @@ typescript@3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.1.tgz#b6691be11a881ffa9a05765a205cb7383f3b63c6" +typescript@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.1.tgz#ba72a6a600b2158139c5dd8850f700e231464202" + integrity sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw== + ua-parser-js@^0.7.18: version "0.7.19" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b" @@ -15595,7 +15869,7 @@ unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" -upath@^1.0.5, upath@^1.1.1: +upath@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" @@ -15796,11 +16070,6 @@ vfile@^4.0.0: unist-util-stringify-position "^2.0.0" vfile-message "^2.0.0" -vlq@^0.2.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" - integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== - vm-browserify@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" @@ -16031,6 +16300,36 @@ webpack@4.29.6: watchpack "^1.5.0" webpack-sources "^1.3.0" +webpack@4.35.0: + version "4.35.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.35.0.tgz#ad3f0f8190876328806ccb7a36f3ce6e764b8378" + integrity sha512-M5hL3qpVvtr8d4YaJANbAQBc4uT01G33eDpl/psRTBCfjxFTihdhin1NtAKB1ruDwzeVdcsHHV3NX+QsAgOosw== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.0.5" + acorn-dynamic-import "^4.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + chrome-trace-event "^1.0.0" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.0" + json-parse-better-errors "^1.0.2" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + micromatch "^3.1.8" + mkdirp "~0.5.0" + neo-async "^2.5.0" + node-libs-browser "^2.0.0" + schema-utils "^1.0.0" + tapable "^1.1.0" + terser-webpack-plugin "^1.1.0" + watchpack "^1.5.0" + webpack-sources "^1.3.0" + webpack@^4.29.0: version "4.30.0" resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.30.0.tgz#aca76ef75630a22c49fcc235b39b4c57591d33a9" @@ -16153,12 +16452,19 @@ wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" -worker-farm@^1.5.2, worker-farm@^1.6.0: +worker-farm@^1.5.2, worker-farm@^1.6.0, worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" dependencies: errno "~0.1.7" +worker-rpc@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" + integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== + dependencies: + microevent.ts "~0.1.1" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -16251,35 +16557,10 @@ xss@1.0.3: commander "^2.9.0" cssfilter "0.0.10" -xtend@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.2.0.tgz#eef6b1f198c1c8deafad8b1765a04dad4a01c5a9" - integrity sha1-7vax8ZjByN6vrYsXZaBNrUoBxak= - xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" -xtend@~2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.0.6.tgz#5ea657a6dba447069c2e59c58a1138cb0c5e6cee" - integrity sha1-XqZXptukRwacLlnFihE4ywxebO4= - dependencies: - is-object "~0.1.2" - object-keys "~0.2.0" - -xtend@~2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" - integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= - dependencies: - object-keys "~0.4.0" - -xtend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" - integrity sha1-XM50B7r2Qsunvs2laBEcST9ZZlo= - y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"