diff --git a/CODEOWNERS b/CODEOWNERS index 07ee57d26c..b0bd218122 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,9 +1,7 @@ -/plugin/ @mattermost/toolkit - /.github/workflows/channels-ci.yml @mattermost/web-platform /webapp/package.json @mattermost/web-platform /webapp/channels/package.json @mattermost/web-platform /webapp/Makefile @mattermost/web-platform /webapp/package-lock.json @mattermost/web-platform /webapp/platform/*/package.json @mattermost/web-platform -/webapp/scripts @mattermost/web-platform \ No newline at end of file +/webapp/scripts @mattermost/web-platform diff --git a/e2e-tests/cypress/tests/integration/channels/channel/new_channel_with_board_spec.js b/e2e-tests/cypress/tests/integration/channels/channel/new_channel_with_board_spec.js index 32c3591dd3..e924b17f82 100644 --- a/e2e-tests/cypress/tests/integration/channels/channel/new_channel_with_board_spec.js +++ b/e2e-tests/cypress/tests/integration/channels/channel/new_channel_with_board_spec.js @@ -22,8 +22,6 @@ describe('New Channel modal with Boards enabled', () => { cy.apiLogin(sysadmin); cy.visit(`/${testTeam.name}/channels/town-square`); }); - - cy.shouldHaveFeatureFlag('BoardsProduct', true); }); it('MM-T5141 New Channel is created with an associated Board', () => { diff --git a/e2e-tests/cypress/tests/integration/channels/messaging/edit_message_spec.js b/e2e-tests/cypress/tests/integration/channels/messaging/edit_message_spec.js index 0bf2363650..1aad5036be 100644 --- a/e2e-tests/cypress/tests/integration/channels/messaging/edit_message_spec.js +++ b/e2e-tests/cypress/tests/integration/channels/messaging/edit_message_spec.js @@ -145,4 +145,42 @@ describe('Edit Message', () => { cy.get(postText).should('have.text', `${secondMessage} Another new message Edited`); }); }); + + it('MM-T5416 should discard any changes made after cancelling the edit and opening the edit textbox again should display the original message', () => { + const message = 'World!'; + cy.postMessage(message); + + // * Verify message is sent and not pending + cy.getLastPostId().then((postId) => { + const postText = `#postMessageText_${postId}`; + cy.get(postText).should('have.text', message); + + // # Open edit textbox + cy.uiGetPostTextBox().type('{uparrow}'); + + // * Edit Post Input should appear, and edit the post + cy.get('#edit_textbox').should('be.visible'); + + // * Press the escape key to cancel + cy.get('#edit_textbox').should('have.text', message).type(' Another new message{esc}'); + cy.get('#edit_textbox').should('not.exist'); + + // * Check that the message wasn't edited + cy.get(postText).should('have.text', message); + }); + + cy.getLastPostId().then((postId) => { + const postText = `#postMessageText_${postId}`; + cy.get(postText).should('have.text', message); + + // # Open edit textbox again + cy.uiGetPostTextBox().type('{uparrow}'); + + // * Edit Post Input should appear, and edit the post + cy.get('#edit_textbox').should('be.visible'); + + // * Opening the edit textbox again after previously cancelling the edit should contain the original message. + cy.get('#edit_textbox').should('have.text', message); + }); + }); }); diff --git a/e2e-tests/playwright/global_setup.ts b/e2e-tests/playwright/global_setup.ts index d54d6ded88..53386e351f 100644 --- a/e2e-tests/playwright/global_setup.ts +++ b/e2e-tests/playwright/global_setup.ts @@ -5,7 +5,6 @@ import {expect} from '@playwright/test'; import {UserProfile} from '@mattermost/types/users'; import {Client, createRandomTeam, getAdminClient, getDefaultAdminUser, makeClient} from './support/server'; -import {boardsPluginId, callsPluginId} from './support/constant'; import {defaultTeam} from './support/util'; import testConfig from './test.config'; @@ -97,26 +96,15 @@ async function printClientInfo(client: Client) { - BuildHashEnterprise = ${config.BuildHashEnterprise} - BuildEnterpriseReady = ${config.BuildEnterpriseReady} - FeatureFlagAppsEnabled = ${config.FeatureFlagAppsEnabled} - - FeatureFlagBoardsProduct = ${config.FeatureFlagBoardsProduct} - FeatureFlagCallsEnabled = ${config.FeatureFlagCallsEnabled} - TelemetryId = ${config.TelemetryId}`); } -function getProductsAsPlugin() { - const productsAsPlugin = [callsPluginId]; - - if (!testConfig.boardsProductEnabled) { - productsAsPlugin.push(boardsPluginId); - } - - return productsAsPlugin; -} - async function ensurePluginsLoaded(client: Client) { const pluginStatus = await client.getPluginStatuses(); const plugins = await client.getPlugins(); - getProductsAsPlugin().forEach(async (pluginId) => { + testConfig.ensurePluginsInstalled.forEach(async (pluginId) => { const isInstalled = pluginStatus.some((plugin) => plugin.plugin_id === pluginId); if (!isInstalled) { // eslint-disable-next-line no-console diff --git a/e2e-tests/playwright/support/constant.ts b/e2e-tests/playwright/support/constant.ts index e5fd709f4e..35aa9bb5f4 100644 --- a/e2e-tests/playwright/support/constant.ts +++ b/e2e-tests/playwright/support/constant.ts @@ -1,6 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. +export const appsPluginId = 'com.mattermost.apps'; export const boardsPluginId = 'focalboard'; export const boardsProductId = 'boards'; export const callsPluginId = 'com.mattermost.calls'; diff --git a/e2e-tests/playwright/support/flag.ts b/e2e-tests/playwright/support/flag.ts index dfa82775bc..8e9a451c73 100644 --- a/e2e-tests/playwright/support/flag.ts +++ b/e2e-tests/playwright/support/flag.ts @@ -5,22 +5,10 @@ import os from 'node:os'; import {expect, test} from '@playwright/test'; -import {boardsPluginId, callsPluginId} from './constant'; +import {callsPluginId} from './constant'; import {getAdminClient} from './server/init'; import {isSmallScreen} from './util'; -export async function shouldHaveBoardsEnabled(enabled = true) { - const {adminClient} = await getAdminClient(); - const config = await adminClient.getConfig(); - - const boardsEnabled = - (typeof config.FeatureFlags.BoardsProduct === 'boolean' && config.FeatureFlags.BoardsProduct) || - config.PluginSettings.PluginStates[boardsPluginId].Enable; - - const matched = boardsEnabled === enabled; - expect(matched, matched ? '' : `Boards expect "${enabled}" but actual "${boardsEnabled}"`).toBeTruthy(); -} - export async function shouldHaveCallsEnabled(enabled = true) { const {adminClient} = await getAdminClient(); const config = await adminClient.getConfig(); diff --git a/e2e-tests/playwright/support/server/client.ts b/e2e-tests/playwright/support/server/client.ts index 32eb55f448..703275e0d7 100644 --- a/e2e-tests/playwright/support/server/client.ts +++ b/e2e-tests/playwright/support/server/client.ts @@ -167,8 +167,9 @@ async function makeClient(userRequest?: UserRequest, useCache = true): Promise; ExperimentalSettings: Partial; - FeatureFlags: Partial; PasswordSettings: Partial; PluginSettings: Partial; ServiceSettings: Partial; @@ -40,9 +38,6 @@ const onPremServerConfig = (): Partial => { ExperimentalSettings: { EnableAppBar: true, }, - FeatureFlags: { - BoardsProduct: testConfig.boardsProductEnabled, - }, PasswordSettings: { MinimumLength: 5, Lowercase: false, @@ -57,11 +52,6 @@ const onPremServerConfig = (): Partial => { defaultenabled: true, }, }, - PluginStates: { - focalboard: { - Enable: !testConfig.boardsProductEnabled, - }, - }, }, ServiceSettings: { SiteURL: testConfig.baseURL, @@ -686,7 +676,6 @@ const defaultServerConfig: AdminConfig = { GraphQL: false, InsightsEnabled: true, CommandPalette: false, - BoardsProduct: false, SendWelcomePost: true, WorkTemplate: false, PostPriority: true, diff --git a/e2e-tests/playwright/support/test_fixture.ts b/e2e-tests/playwright/support/test_fixture.ts index 8b7949634b..d35435dd7c 100644 --- a/e2e-tests/playwright/support/test_fixture.ts +++ b/e2e-tests/playwright/support/test_fixture.ts @@ -1,13 +1,7 @@ import {test as base, Browser} from '@playwright/test'; import {TestBrowser} from './browser_context'; -import { - shouldHaveBoardsEnabled, - shouldHaveCallsEnabled, - shouldHaveFeatureFlag, - shouldSkipInSmallScreen, - shouldRunInLinux, -} from './flag'; +import {shouldHaveCallsEnabled, shouldHaveFeatureFlag, shouldSkipInSmallScreen, shouldRunInLinux} from './flag'; import {initSetup, getAdminClient} from './server'; import {hideDynamicChannelsContent, waitForAnimationEnd, waitUntil} from './test_action'; import {pages} from './ui/pages'; @@ -36,7 +30,6 @@ class PlaywrightExtended { readonly testBrowser: TestBrowser; // ./flag - readonly shouldHaveBoardsEnabled; readonly shouldHaveCallsEnabled; readonly shouldHaveFeatureFlag; readonly shouldSkipInSmallScreen; @@ -62,7 +55,6 @@ class PlaywrightExtended { this.testBrowser = new TestBrowser(browser); // ./flag - this.shouldHaveBoardsEnabled = shouldHaveBoardsEnabled; this.shouldHaveCallsEnabled = shouldHaveCallsEnabled; this.shouldHaveFeatureFlag = shouldHaveFeatureFlag; this.shouldSkipInSmallScreen = shouldSkipInSmallScreen; diff --git a/e2e-tests/playwright/test.config.ts b/e2e-tests/playwright/test.config.ts index 2d29d2a100..5a370a541e 100644 --- a/e2e-tests/playwright/test.config.ts +++ b/e2e-tests/playwright/test.config.ts @@ -3,6 +3,9 @@ import {Page, ViewportSize} from '@playwright/test'; import * as dotenv from 'dotenv'; + +import {appsPluginId, callsPluginId} from '@e2e-support/constant'; + dotenv.config(); export type TestArgs = { @@ -17,7 +20,7 @@ export type TestConfig = { adminUsername: string; adminPassword: string; adminEmail: string; - boardsProductEnabled: boolean; + ensurePluginsInstalled: string[]; resetBeforeTest: boolean; haClusterEnabled: boolean; haClusterNodeCount: number; @@ -41,7 +44,10 @@ const config: TestConfig = { adminUsername: process.env.PW_ADMIN_USERNAME || 'sysadmin', adminPassword: process.env.PW_ADMIN_PASSWORD || 'Sys@dmin-sample1', adminEmail: process.env.PW_ADMIN_EMAIL || 'sysadmin@sample.mattermost.com', - boardsProductEnabled: parseBool(process.env.PW_BOARDS_PRODUCT_ENABLED, true), + ensurePluginsInstalled: + typeof process.env?.PW_ENSURE_PLUGINS_INSTALLED === 'string' + ? process.env.PW_ENSURE_PLUGINS_INSTALLED.split(',') + : [appsPluginId, callsPluginId], haClusterEnabled: parseBool(process.env.PW_HA_CLUSTER_ENABLED, false), haClusterNodeCount: parseNumber(process.env.PW_HA_CLUSTER_NODE_COUNT, 2), haClusterName: process.env.PW_HA_CLUSTER_NAME || 'mm_dev_cluster', diff --git a/e2e-tests/playwright/tests/functional/boards/board-creation-and-set-up/create_empty_board.spec.ts b/e2e-tests/playwright/tests/functional/boards/board-creation-and-set-up/create_empty_board.spec.ts index d4e4c30681..0967d8577c 100644 --- a/e2e-tests/playwright/tests/functional/boards/board-creation-and-set-up/create_empty_board.spec.ts +++ b/e2e-tests/playwright/tests/functional/boards/board-creation-and-set-up/create_empty_board.spec.ts @@ -7,8 +7,6 @@ import {shouldSkipInSmallScreen} from '@e2e-support/flag'; shouldSkipInSmallScreen(); test('MM-T4274 Create an Empty Board', async ({pw, pages}) => { - await pw.shouldHaveBoardsEnabled(); - // Create and sign in a new user const {user} = await pw.initSetup(); diff --git a/e2e-tests/playwright/tests/visual/boards/board_template.spec.ts b/e2e-tests/playwright/tests/visual/boards/board_template.spec.ts index ca130486db..1866840349 100644 --- a/e2e-tests/playwright/tests/visual/boards/board_template.spec.ts +++ b/e2e-tests/playwright/tests/visual/boards/board_template.spec.ts @@ -7,8 +7,6 @@ import {shouldSkipInSmallScreen} from '@e2e-support/flag'; shouldSkipInSmallScreen(); test('Board template', async ({pw, pages, browserName, viewport}, testInfo) => { - await pw.shouldHaveBoardsEnabled(); - // Create and sign in a new user const {user} = await pw.initSetup(); diff --git a/e2e-tests/playwright/tests/visual/boards/view_untitled_board.spec.ts b/e2e-tests/playwright/tests/visual/boards/view_untitled_board.spec.ts index 00645a851b..f5a03b4ba9 100644 --- a/e2e-tests/playwright/tests/visual/boards/view_untitled_board.spec.ts +++ b/e2e-tests/playwright/tests/visual/boards/view_untitled_board.spec.ts @@ -7,8 +7,6 @@ import {shouldSkipInSmallScreen} from '@e2e-support/flag'; shouldSkipInSmallScreen(); test('View untitled board', async ({pw, pages, browserName, viewport}, testInfo) => { - await pw.shouldHaveBoardsEnabled(); - // Create and sign in a new user const {user} = await pw.initSetup(); diff --git a/go.mod b/go.mod index 4d95ef02c1..2eb36199e3 100644 --- a/go.mod +++ b/go.mod @@ -4,12 +4,12 @@ go 1.19 require ( code.sajari.com/docconv v1.3.5 - github.com/Masterminds/semver/v3 v3.2.0 - github.com/Masterminds/squirrel v1.5.3 + github.com/Masterminds/semver/v3 v3.2.1 + github.com/Masterminds/squirrel v1.5.4 github.com/avct/uasurfer v0.0.0-20191028135549-26b5daa857f1 - github.com/aws/aws-sdk-go v1.44.173 + github.com/aws/aws-sdk-go v1.44.240 github.com/blang/semver v3.5.1+incompatible - github.com/blevesearch/bleve/v2 v2.3.6 + github.com/blevesearch/bleve/v2 v2.3.7 github.com/cespare/xxhash/v2 v2.2.0 github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/dgryski/dgoogauth v0.0.0-20190221195224-5a805980a5f3 @@ -17,7 +17,7 @@ require ( github.com/dyatlov/go-opengraph/opengraph v0.0.0-20220524092352-606d7b1e5f8a github.com/francoispqt/gojay v1.2.13 github.com/fsnotify/fsnotify v1.6.0 - github.com/getsentry/sentry-go v0.16.0 + github.com/getsentry/sentry-go v0.20.0 github.com/go-sql-driver/mysql v1.7.0 github.com/golang-migrate/migrate/v4 v4.15.2 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 @@ -31,9 +31,9 @@ require ( github.com/graph-gophers/dataloader/v7 v7.1.0 github.com/graph-gophers/graphql-go v1.5.1-0.20230110080634-edea822f558a github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c - github.com/hashicorp/go-hclog v1.4.0 - github.com/hashicorp/go-plugin v1.4.8 - github.com/jaytaylor/html2text v0.0.0-20211105163654-bc68cce691ba + github.com/hashicorp/go-hclog v1.5.0 + github.com/hashicorp/go-plugin v1.4.9 + github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056 github.com/jmoiron/sqlx v1.3.5 github.com/krolaw/zipstream v0.0.0-20180621105154-0a2661891f94 github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80 @@ -42,32 +42,31 @@ require ( github.com/mattermost/gziphandler v0.0.1 github.com/mattermost/ldap v0.0.0-20201202150706-ee0e6284187d github.com/mattermost/logr/v2 v2.0.16 - github.com/mattermost/mattermost-plugin-playbooks/client v0.7.0 github.com/mattermost/morph v1.0.5-0.20221115094356-4c18a75b1f5e github.com/mattermost/rsc v0.0.0-20160330161541-bbaefb05eaa0 github.com/mattermost/squirrel v0.2.0 github.com/mgdelacroix/foundation v0.0.0-20220812143423-0bfc18f73538 github.com/mholt/archiver/v3 v3.5.1 - github.com/microcosm-cc/bluemonday v1.0.21 - github.com/minio/minio-go/v7 v7.0.45 - github.com/mitchellh/mapstructure v1.4.3 + github.com/microcosm-cc/bluemonday v1.0.23 + github.com/minio/minio-go/v7 v7.0.51 + github.com/mitchellh/mapstructure v1.5.0 github.com/oklog/run v1.1.0 github.com/oov/psd v0.0.0-20220121172623-5db5eafcecbb github.com/opentracing/opentracing-go v1.2.0 github.com/pborman/uuid v1.2.1 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.12.1 + github.com/prometheus/client_golang v1.14.0 github.com/reflog/dateconstraints v0.2.1 - github.com/rivo/uniseg v0.4.3 + github.com/rivo/uniseg v0.4.4 github.com/rs/cors v1.8.3 github.com/rudderlabs/analytics-go v3.3.3+incompatible github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd - github.com/sergi/go-diff v1.2.0 + github.com/sergi/go-diff v1.3.1 github.com/sirupsen/logrus v1.9.0 - github.com/spf13/cobra v1.6.1 - github.com/spf13/viper v1.10.1 - github.com/splitio/go-client/v6 v6.2.1 - github.com/stretchr/testify v1.8.1 + github.com/spf13/cobra v1.7.0 + github.com/spf13/viper v1.15.0 + github.com/splitio/go-client/v6 v6.3.1 + github.com/stretchr/testify v1.8.2 github.com/throttled/throttled v2.2.5+incompatible github.com/tinylib/msgp v1.1.8 github.com/uber/jaeger-client-go v2.30.0+incompatible @@ -76,14 +75,14 @@ require ( github.com/wiggin77/merror v1.0.4 github.com/writeas/go-strip-markdown v2.0.1+incompatible github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c - github.com/yuin/goldmark v1.5.3 - golang.org/x/crypto v0.5.0 - golang.org/x/image v0.3.0 - golang.org/x/net v0.8.0 - golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b + github.com/yuin/goldmark v1.5.4 + golang.org/x/crypto v0.8.0 + golang.org/x/image v0.7.0 + golang.org/x/net v0.9.0 + golang.org/x/oauth2 v0.7.0 golang.org/x/sync v0.1.0 - golang.org/x/text v0.8.0 - golang.org/x/tools v0.6.0 + golang.org/x/text v0.9.0 + golang.org/x/tools v0.8.0 gopkg.in/guregu/null.v4 v4.0.0 gopkg.in/mail.v2 v2.3.1 gopkg.in/yaml.v2 v2.4.0 @@ -91,16 +90,17 @@ require ( ) require ( + github.com/HdrHistogram/hdrhistogram-go v0.9.0 // indirect github.com/JalfResi/justext v0.0.0-20221106200834-be571e3e3052 // indirect - github.com/PuerkitoBio/goquery v1.8.0 // indirect - github.com/RoaringBitmap/roaring v1.2.1 // indirect + github.com/PuerkitoBio/goquery v1.8.1 // indirect + github.com/RoaringBitmap/roaring v1.2.3 // indirect github.com/advancedlogic/GoOse v0.0.0-20210820140952-9d5822d4a625 // indirect - github.com/andybalholm/brotli v1.0.4 // indirect + github.com/andybalholm/brotli v1.0.5 // indirect github.com/andybalholm/cascadia v1.3.1 // indirect github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de // indirect github.com/aymerick/douceur v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.4.0 // indirect + github.com/bits-and-blooms/bitset v1.5.0 // indirect github.com/bits-and-blooms/bloom/v3 v3.3.1 // indirect github.com/blevesearch/bleve_index_api v1.0.5 // indirect github.com/blevesearch/geo v0.1.17 // indirect @@ -116,21 +116,21 @@ require ( github.com/blevesearch/zapx/v12 v12.3.7 // indirect github.com/blevesearch/zapx/v13 v13.3.7 // indirect github.com/blevesearch/zapx/v14 v14.3.7 // indirect - github.com/blevesearch/zapx/v15 v15.3.8 // indirect + github.com/blevesearch/zapx/v15 v15.3.9 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 // indirect - github.com/dustin/go-humanize v1.0.0 // indirect - github.com/fatih/color v1.13.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/fatih/color v1.15.0 // indirect github.com/fatih/set v0.2.1 // indirect github.com/felixge/httpsnoop v1.0.3 // indirect github.com/gigawattio/window v0.0.0-20180317192513-0f5467e35573 // indirect github.com/go-asn1-ber/asn1-ber v1.5.4 // indirect - github.com/go-redis/redis/v8 v8.11.5 // indirect github.com/go-resty/resty/v2 v2.7.0 // indirect - github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/geo v0.0.0-20230404232722-c4acd7a044dc // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect + github.com/gomodule/redigo v2.0.0+incompatible // indirect github.com/google/uuid v1.3.0 // indirect github.com/gopherjs/gopherjs v1.17.2 // indirect github.com/gorilla/css v1.0.0 // indirect @@ -141,17 +141,17 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/klauspost/compress v1.15.14 // indirect - github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/klauspost/compress v1.16.4 // indirect + github.com/klauspost/cpuid/v2 v2.2.4 // indirect github.com/klauspost/pgzip v1.2.5 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect github.com/levigross/exp-html v0.0.0-20120902181939-8df60c69a8f5 // indirect - github.com/magiconair/properties v1.8.6 // indirect + github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.18 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/minio/md5-simd v1.1.2 // indirect github.com/minio/sha256-simd v1.0.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect @@ -162,26 +162,28 @@ require ( github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/otiai10/gosseract/v2 v2.4.0 // indirect github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.7 // indirect github.com/philhofer/fwd v1.1.2 // indirect github.com/pierrec/lz4/v4 v4.1.17 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.33.0 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/remyoudompheng/bigfft v0.0.0-20220927061507-ef77025ab5aa // indirect + github.com/prometheus/client_model v0.3.0 // indirect + github.com/prometheus/common v0.42.0 // indirect + github.com/prometheus/procfs v0.9.0 // indirect + github.com/redis/go-redis/v9 v9.0.3 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/richardlehane/mscfb v1.0.4 // indirect github.com/richardlehane/msoleps v1.0.3 // indirect github.com/rs/xid v1.4.0 // indirect github.com/segmentio/backo-go v1.0.1 // indirect - github.com/spf13/afero v1.8.2 // indirect - github.com/spf13/cast v1.4.1 // indirect + github.com/spf13/afero v1.9.5 // indirect + github.com/spf13/cast v1.5.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/splitio/go-split-commons/v4 v4.2.3 // indirect - github.com/splitio/go-toolkit/v5 v5.2.2 // indirect + github.com/splitio/go-split-commons/v4 v4.3.1 // indirect + github.com/splitio/go-toolkit/v5 v5.3.0 // indirect github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect github.com/stretchr/objx v0.5.0 // indirect - github.com/subosito/gotenv v1.2.0 // indirect + github.com/subosito/gotenv v1.4.2 // indirect github.com/tidwall/gjson v1.14.4 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect @@ -189,25 +191,25 @@ require ( github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect github.com/wiggin77/srslog v1.0.1 // indirect github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect - go.etcd.io/bbolt v1.3.6 // indirect + go.etcd.io/bbolt v1.3.7 // indirect go.uber.org/atomic v1.10.0 // indirect - golang.org/x/mod v0.8.0 // indirect - golang.org/x/sys v0.6.0 // indirect + golang.org/x/mod v0.10.0 // indirect + golang.org/x/sys v0.7.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230104163317-caabf589fcbf // indirect - google.golang.org/grpc v1.51.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect + google.golang.org/grpc v1.54.0 // indirect + google.golang.org/protobuf v1.30.0 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect - lukechampine.com/uint128 v1.2.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect + lukechampine.com/uint128 v1.3.0 // indirect modernc.org/cc/v3 v3.40.0 // indirect modernc.org/ccgo/v3 v3.16.13 // indirect - modernc.org/libc v1.22.2 // indirect + modernc.org/libc v1.22.3 // indirect modernc.org/mathutil v1.5.0 // indirect modernc.org/memory v1.5.0 // indirect modernc.org/opt v0.1.3 // indirect - modernc.org/sqlite v1.20.1 // indirect + modernc.org/sqlite v1.21.1 // indirect modernc.org/strutil v1.1.3 // indirect modernc.org/token v1.1.0 // indirect ) diff --git a/go.sum b/go.sum index 7aff53830e..67c290126e 100644 --- a/go.sum +++ b/go.sum @@ -4,7 +4,6 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= -cloud.google.com/go v0.37.1/go.mod h1:SAbnLi6YTSPKSI0dTUEOVLCkyPfKXK8n4ibqiMoj4ok= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= @@ -18,8 +17,6 @@ cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bP cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.63.0/go.mod h1:GmezbQc7T2snqkEXWfZ0sy0VfkB/ivI2DdtJL2DEmlg= -cloud.google.com/go v0.64.0/go.mod h1:xfORb36jGvE+6EexW71nMEtL025s3x6xvuYUKM4JLv4= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= @@ -52,7 +49,6 @@ cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2k cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/spanner v1.9.0/go.mod h1:xvlEn0NZ5v1iJPYsBnUVRDNvccDxsBTEi16pJRKQVws= cloud.google.com/go/spanner v1.28.0/go.mod h1:7m6mtQZn/hMbMfx62ct5EWrGND4DNqkXyrmBPRS+OJo= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= @@ -60,10 +56,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -code.sajari.com/docconv v1.1.1-0.20210427001343-7b3472bc323a/go.mod h1:KPNt2zuWplps1W0TpOb6ltHj4Xu+j6h7a+YkqGHrxQE= code.sajari.com/docconv v1.3.5 h1:RBBs6aT3/5gHHWzAaxBj85e3ozsu05s2kAslhW7i+Ag= code.sajari.com/docconv v1.3.5/go.mod h1:EDkTrwa2yO2O9EbVpD3dlHXDVcxbfKDWnDNE/8vbbP8= -contrib.go.opencensus.io/exporter/ocagent v0.4.9/go.mod h1:ueLzZcP7LPhPulEBukGn4aLh7Mx9YJwpVJ9nL2FYltw= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= @@ -71,18 +65,14 @@ dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1 dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v26.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v11.5.2+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= @@ -97,29 +87,17 @@ github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ClickHouse/clickhouse-go v1.3.12/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= github.com/ClickHouse/clickhouse-go v1.4.3/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/HdrHistogram/hdrhistogram-go v0.9.0 h1:dpujRju0R4M/QZzcnR1LH1qm+TVG3UzkWdp5tH1WMcg= github.com/HdrHistogram/hdrhistogram-go v0.9.0/go.mod h1:nxrse8/Tzg2tg3DZcZjm6qEclQKK70g0KxO61gFFZD4= github.com/JalfResi/justext v0.0.0-20170829062021-c0282dea7198/go.mod h1:0SURuH1rsE8aVWvutuMZghRNrNrYEUzibzJfhEYR8L0= github.com/JalfResi/justext v0.0.0-20221106200834-be571e3e3052 h1:8T2zMbhLBbH9514PIQVHdsGhypMrsB4CxwbldKA9sBA= github.com/JalfResi/justext v0.0.0-20221106200834-be571e3e3052/go.mod h1:0SURuH1rsE8aVWvutuMZghRNrNrYEUzibzJfhEYR8L0= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Julusian/godocdown v0.0.0-20170816220326-6d19f8ff2df8/go.mod h1:INZr5t32rG59/5xeltqoCJoNY7e5x/3xoY9WSWVWg74= -github.com/Masterminds/glide v0.13.2/go.mod h1:STyF5vcenH/rUqTEv+/hBXlSTo7KYwg2oc2f4tzPWic= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= -github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Masterminds/squirrel v1.5.0/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= -github.com/Masterminds/squirrel v1.5.3 h1:YPpoceAcxuzIljlr5iWpNKaql7hLeG1KLSrhvdHpkZc= -github.com/Masterminds/squirrel v1.5.3/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= -github.com/Masterminds/vcs v1.13.0/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= +github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= +github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM= +github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= @@ -146,29 +124,20 @@ github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:m github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PaulARoy/azurestoragecache v0.0.0-20170906084534-3c249a3ba788/go.mod h1:lY1dZd8HBzJ10eqKERHn3CU59tfhzcAVb2c0ZhIWSOk= github.com/PuerkitoBio/goquery v1.4.1/go.mod h1:T9ezsOHcCrDCgA8aF1Cqr3sSYbO/xgdy8/R/XiIMAhA= github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= -github.com/PuerkitoBio/goquery v1.7.0/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= -github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U= -github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI= +github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= +github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/RoaringBitmap/roaring v0.4.23/go.mod h1:D0gp8kJQgE1A4LQ5wFLggQEyvDi06Mq5mKs52e1TwOo= -github.com/RoaringBitmap/roaring v0.8.0/go.mod h1:jdT9ykXwHFNdJbEtxePexlFYH9LXucApeS0/+/g+p1I= -github.com/RoaringBitmap/roaring v1.2.1 h1:58/LJlg/81wfEHd5L9qsHduznOIhyv4qb1yWcSvVq9A= -github.com/RoaringBitmap/roaring v1.2.1/go.mod h1:icnadbWcNyfEHlYdr+tDlOTih1Bf/h+rzPpv4sbomAA= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= +github.com/RoaringBitmap/roaring v1.2.3 h1:yqreLINqIrX22ErkKI0vY47/ivtJr6n+kMhVOVmhWBY= +github.com/RoaringBitmap/roaring v1.2.3/go.mod h1:plvDsJQpxOC5bw8LRteu/MLWHsHez/3y6cubLI4/1yE= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/advancedlogic/GoOse v0.0.0-20191112112754-e742535969c1/go.mod h1:f3HCSN1fBWjcpGtXyM119MJgeQl838v6so/PQOqvE1w= -github.com/advancedlogic/GoOse v0.0.0-20200830213114-1225d531e0ad/go.mod h1:f3HCSN1fBWjcpGtXyM119MJgeQl838v6so/PQOqvE1w= github.com/advancedlogic/GoOse v0.0.0-20210820140952-9d5822d4a625 h1:LZIP5Bj5poWWRZ8fcL4ZwCupb4FwcTFK2RCTxkGnCX8= github.com/advancedlogic/GoOse v0.0.0-20210820140952-9d5822d4a625/go.mod h1:f3HCSN1fBWjcpGtXyM119MJgeQl838v6so/PQOqvE1w= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -177,11 +146,9 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= -github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY= @@ -189,10 +156,8 @@ github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x0 github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow/go/arrow v0.0.0-20200601151325-b2287a20f230/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= github.com/apache/arrow/go/arrow v0.0.0-20210818145353-234c94e4ce64/go.mod h1:2qMFB56yOP3KzkB3PbYZ4AlUFg3a88F67TIx5lB/WwY= github.com/apache/arrow/go/arrow v0.0.0-20211013220434-5962184e7a30/go.mod h1:Q7yQnSMnLvcXlZ8RV+jwz/6y1rQTqbX6C82SndT52Zs= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/araddon/dateparse v0.0.0-20180729174819-cfd92a431d0e/go.mod h1:SLqhdZcd+dF3TEVL2RMoob5bBP5R1P1qkox+HtCBgGI= github.com/araddon/dateparse v0.0.0-20200409225146-d820a6159ab1/go.mod h1:SLqhdZcd+dF3TEVL2RMoob5bBP5R1P1qkox+HtCBgGI= github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhPwqqXc4/vE0f7GvRjuAsbW+HOIe8KnA= @@ -200,17 +165,14 @@ github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoU github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/avct/uasurfer v0.0.0-20191028135549-26b5daa857f1 h1:9h8f71kuF1pqovnn9h7LTHLEjxzyQaj0j1rQq5nsMM4= github.com/avct/uasurfer v0.0.0-20191028135549-26b5daa857f1/go.mod h1:noBAuukeYOXa0aXGqxr24tADqkwDO2KRD15FsuaZ5a8= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.19.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.38.67/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.44.173 h1:8kXIxvQnBpGhmR3Eof6SnCKgR0q5/L/3Qbv9vAC5wic= -github.com/aws/aws-sdk-go v1.44.173/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.44.240 h1:38f1qBTuzotDC6bgSNLw1vrrYaoWL8MNNzwTsGjP6TY= +github.com/aws/aws-sdk-go v1.44.240/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go-v2 v1.8.0/go.mod h1:xEFuWz+3TYdlPRuo+CqATbeDWIWyaT5uAPwPaWtgse0= github.com/aws/aws-sdk-go-v2 v1.9.2/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= github.com/aws/aws-sdk-go-v2/config v1.6.0/go.mod h1:TNtBVmka80lRPk5+S9ZqVfFszOQAGJJ9KbT3EM3CHNU= @@ -239,8 +201,6 @@ github.com/aws/smithy-go v1.7.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAm github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= -github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -252,8 +212,8 @@ github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCS github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bits-and-blooms/bitset v1.3.1/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bits-and-blooms/bitset v1.4.0 h1:+YZ8ePm+He2pU3dZlIZiOeAKfrBkXi1lSrXJ/Xzgbu8= -github.com/bits-and-blooms/bitset v1.4.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.5.0 h1:NpE8frKRLGHIcEzkR+gZhiioW1+WbYV6fKwD6ZIpQT8= +github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bits-and-blooms/bloom/v3 v3.3.1 h1:K2+A19bXT8gJR5mU7y+1yW6hsKfNCjcP2uNfLFKncjQ= github.com/bits-and-blooms/bloom/v3 v3.3.1/go.mod h1:bhUUknWd5khVbTe4UgMCSiOOVJzr3tMoijSK3WwvW90= github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4= @@ -261,25 +221,20 @@ github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJm github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blevesearch/bleve v1.0.14/go.mod h1:e/LJTr+E7EaoVdkQZTfoz7dt4KoDNvDbLb8MSKuNTLQ= -github.com/blevesearch/bleve/v2 v2.3.6 h1:NlntUHcV5CSWIhpugx4d/BRMGCiaoI8ZZXrXlahzNq4= -github.com/blevesearch/bleve/v2 v2.3.6/go.mod h1:JM2legf1cKVkdV8Ehu7msKIOKC0McSw0Q16Fmv9vsW4= +github.com/blevesearch/bleve/v2 v2.3.7 h1:nIfIrhv28tvgBpbVF8Dq7/U1zW/YiwSqg/PBgE3x8bo= +github.com/blevesearch/bleve/v2 v2.3.7/go.mod h1:2tToYD6mDeseIA13jcZiEEqYrVLg6xdk0v6+F7dWquU= github.com/blevesearch/bleve_index_api v1.0.5 h1:Lc986kpC4Z0/n1g3gg8ul7H+lxgOQPcXb9SxvQGu+tw= github.com/blevesearch/bleve_index_api v1.0.5/go.mod h1:YXMDwaXFFXwncRS8UobWs7nvo0DmusriM1nztTlj1ms= -github.com/blevesearch/blevex v1.0.0/go.mod h1:2rNVqoG2BZI8t1/P1awgTKnGlx5MP9ZbtEciQaNhswc= -github.com/blevesearch/cld2 v0.0.0-20200327141045-8b5f551d37f5/go.mod h1:PN0QNTLs9+j1bKy3d/GB/59wsNBFC4sWLWG3k69lWbc= github.com/blevesearch/geo v0.1.17 h1:AguzI6/5mHXapzB0gE9IKWo+wWPHZmXZoscHcjFgAFA= github.com/blevesearch/geo v0.1.17/go.mod h1:uRMGWG0HJYfWfFJpK3zTdnnr1K+ksZTuWKhXeSokfnM= github.com/blevesearch/go-porterstemmer v1.0.3 h1:GtmsqID0aZdCSNiY8SkuPJ12pD4jI+DdXTAn4YRcHCo= github.com/blevesearch/go-porterstemmer v1.0.3/go.mod h1:angGc5Ht+k2xhJdZi511LtmxuEf0OVpvUUNrwmM1P7M= github.com/blevesearch/gtreap v0.1.1 h1:2JWigFrzDMR+42WGIN/V2p0cUvn4UP3C4Q5nmaZGW8Y= github.com/blevesearch/gtreap v0.1.1/go.mod h1:QaQyDRAT51sotthUWAH4Sj08awFSSWzgYICSZ3w0tYk= -github.com/blevesearch/mmap-go v1.0.2/go.mod h1:ol2qBqYaOUsGdm7aRMRrYGgPvnwLe6Y+7LMvAB5IbSA= github.com/blevesearch/mmap-go v1.0.4 h1:OVhDhT5B/M1HNPpYPBKIEJaD0F3Si+CrEKULGCDPWmc= github.com/blevesearch/mmap-go v1.0.4/go.mod h1:EWmEAOmdAS9z/pi/+Toxu99DnsbhG1TIxUoRmJw/pSs= github.com/blevesearch/scorch_segment_api/v2 v2.1.4 h1:LmGmo5twU3gV+natJbKmOktS9eMhokPGKWuR+jX84vk= github.com/blevesearch/scorch_segment_api/v2 v2.1.4/go.mod h1:PgVnbbg/t1UkgezPDu8EHLi1BHQ17xUwsFdU6NnOYS0= -github.com/blevesearch/segment v0.9.0/go.mod h1:9PfHYUdQCgHktBgvtUOF4x+pc4/l8rdH0u5spnW85UQ= github.com/blevesearch/segment v0.9.1 h1:+dThDy+Lvgj5JMxhmOVlgFfkUtZV2kw49xax4+jTfSU= github.com/blevesearch/segment v0.9.1/go.mod h1:zN21iLm7+GnBHWTao9I+Au/7MBiL8pPFtJBJTsk6kQw= github.com/blevesearch/snowballstem v0.9.0 h1:lMQ189YspGP6sXvZQ4WZ+MLawfV8wOmPoD/iWeNXm8s= @@ -288,11 +243,6 @@ github.com/blevesearch/upsidedown_store_api v1.0.2 h1:U53Q6YoWEARVLd1OYNc9kvhBMG github.com/blevesearch/upsidedown_store_api v1.0.2/go.mod h1:M01mh3Gpfy56Ps/UXHjEO/knbqyQ1Oamg8If49gRwrQ= github.com/blevesearch/vellum v1.0.9 h1:PL+NWVk3dDGPCV0hoDu9XLLJgqU4E5s/dOeEJByQ2uQ= github.com/blevesearch/vellum v1.0.9/go.mod h1:ul1oT0FhSMDIExNjIxHqJoGpVrBpKCdgDQNxfqgJt7k= -github.com/blevesearch/zap/v11 v11.0.14/go.mod h1:MUEZh6VHGXv1PKx3WnCbdP404LGG2IZVa/L66pyFwnY= -github.com/blevesearch/zap/v12 v12.0.14/go.mod h1:rOnuZOiMKPQj18AEKEHJxuI14236tTQ1ZJz4PAnWlUg= -github.com/blevesearch/zap/v13 v13.0.6/go.mod h1:L89gsjdRKGyGrRN6nCpIScCvvkyxvmeDCwZRcjjPCrw= -github.com/blevesearch/zap/v14 v14.0.5/go.mod h1:bWe8S7tRrSBTIaZ6cLRbgNH4TUDaC9LZSpRGs85AsGY= -github.com/blevesearch/zap/v15 v15.0.3/go.mod h1:iuwQrImsh1WjWJ0Ue2kBqY83a0rFtJTqfa9fp1rbVVU= github.com/blevesearch/zapx/v11 v11.3.7 h1:Y6yIAF/DVPiqZUA/jNgSLXmqewfzwHzuwfKyfdG+Xaw= github.com/blevesearch/zapx/v11 v11.3.7/go.mod h1:Xk9Z69AoAWIOvWudNDMlxJDqSYGf90LS0EfnaAIvXCA= github.com/blevesearch/zapx/v12 v12.3.7 h1:DfQ6rsmZfEK4PzzJJRXjiM6AObG02+HWvprlXQ1Y7eI= @@ -301,23 +251,23 @@ github.com/blevesearch/zapx/v13 v13.3.7 h1:igIQg5eKmjw168I7av0Vtwedf7kHnQro/M+ub github.com/blevesearch/zapx/v13 v13.3.7/go.mod h1:yyrB4kJ0OT75UPZwT/zS+Ru0/jYKorCOOSY5dBzAy+s= github.com/blevesearch/zapx/v14 v14.3.7 h1:gfe+fbWslDWP/evHLtp/GOvmNM3sw1BbqD7LhycBX20= github.com/blevesearch/zapx/v14 v14.3.7/go.mod h1:9J/RbOkqZ1KSjmkOes03AkETX7hrXT0sFMpWH4ewC4w= -github.com/blevesearch/zapx/v15 v15.3.8 h1:q4uMngBHzL1IIhRc8AJUEkj6dGOE3u1l3phLu7hq8uk= -github.com/blevesearch/zapx/v15 v15.3.8/go.mod h1:m7Y6m8soYUvS7MjN9eKlz1xrLCcmqfFadmu7GhWIrLY= +github.com/blevesearch/zapx/v15 v15.3.9 h1:/s9zqKxFaZKQTTcMO2b/Tup0ch5MSztlvw+frVDfIBk= +github.com/blevesearch/zapx/v15 v15.3.9/go.mod h1:m7Y6m8soYUvS7MjN9eKlz1xrLCcmqfFadmu7GhWIrLY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/bsm/ginkgo/v2 v2.7.0 h1:ItPMPH90RbmZJt5GtkcNvIRuGEdwlBItdNVoyzaNQao= +github.com/bsm/gomega v1.26.0 h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y= github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= @@ -339,8 +289,6 @@ github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -354,15 +302,11 @@ github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/cockroachdb/cockroach-go v0.0.0-20190925194419-606b3d062051/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= github.com/cockroachdb/cockroach-go/v2 v2.1.1/go.mod h1:7NtUnP6eK+l6k483WSYNrq3Kb23bWV10IRV1TyeSpwM= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= @@ -390,7 +334,6 @@ github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMX github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= @@ -463,7 +406,6 @@ github.com/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= @@ -480,11 +422,6 @@ github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+ github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/corpix/uarand v0.1.1/go.mod h1:SFKZvkcRoLqVRFZ4u25xPmp6m9ktANfbpXZ7SJ0/FNU= -github.com/couchbase/ghistogram v0.1.0/go.mod h1:s1Jhy76zqfEecpNWJfWUiKZookAFaiGOEoyzgHt9i7k= -github.com/couchbase/moss v0.1.0/go.mod h1:9MaHIaRuy9pvLPUJxB8sh8OrLfyDczECVL37grCIubs= -github.com/couchbase/vellum v1.0.2/go.mod h1:FcwrEivFpNi24R3jLOs3n+fs5RnuQnQqCLBJ1uAg1W4= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -493,10 +430,7 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/cznic/b v0.0.0-20181122101859-a26611c4d92d/go.mod h1:URriBxXwVq5ijiJ12C7iIZqlA69nTlI+LgI6/pwftG8= github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= -github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= -github.com/cznic/strutil v0.0.0-20181122101858-275e90344537/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc= github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= @@ -505,23 +439,17 @@ github.com/dave/jennifer v1.4.1/go.mod h1:7jEdnm+qBcxl8PC0zyp7vxcpSRnzXSt9r39tpT github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.0.0-20200620013148-b91950f658ec/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/dgoogauth v0.0.0-20190221195224-5a805980a5f3 h1:AqeKSZIG/NIC75MNQlPy/LM3LxfpLwahICJBHwSMFNc= github.com/dgryski/dgoogauth v0.0.0-20190221195224-5a805980a5f3/go.mod h1:hEfFauPHz7+NnjR/yHJGhrKo1Za+zStgwUETx3yzqgY= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dhui/dktest v0.3.3/go.mod h1:EML9sP4sqJELHn4jV7B0TY8oF6077nk83/tz7M56jcQ= github.com/dhui/dktest v0.3.10/go.mod h1:h5Enh0nG3Qbo9WjNFRrwmKUaePEBhXMOygbz3Ww7Sz0= -github.com/die-net/lrucache v0.0.0-20181227122439-19a39ef22a11/go.mod h1:ew0MSjCVDdtGMjF3kzLK9hwdgF5mOE8SbYVF3Rc7mkU= -github.com/disintegration/imaging v1.6.0/go.mod h1:xuIt+sRxDFrHS0drzXUlCJthkJ8k7lkkUojDSR247MQ= github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= @@ -531,7 +459,6 @@ github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v17.12.0-ce-rc1.0.20200618181300-9dc6525e6118+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.13+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= @@ -543,22 +470,16 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo= github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 h1:iFaUwBSo5Svw6L7HYpRu/0lE3e0BaElwnNO1qkNQxBY= github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s= github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dvyukov/go-fuzz v0.0.0-20210429054444-fca39067bc72/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/dyatlov/go-opengraph/opengraph v0.0.0-20220524092352-606d7b1e5f8a h1:etIrTD8BQqzColk9nKRusM9um5+1q0iOEJLqfBMIK64= github.com/dyatlov/go-opengraph/opengraph v0.0.0-20220524092352-606d7b1e5f8a/go.mod h1:emQhSYTXqB0xxjLITTw4EaWZ+8IIQYw+kx9GqNUKdLg= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/elazarl/go-bindata-assetfs v1.0.1/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= @@ -573,23 +494,16 @@ github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go. github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= -github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= -github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/fatih/set v0.2.1 h1:nn2CaJyknWE/6txyUDGwysr3G5QC6xWB/PtVjPBbeaA= github.com/fatih/set v0.2.1/go.mod h1:+RKtMCH+favT2+3YecHGxcc0b4KyVWA1QWWJUs4E0CI= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= @@ -598,10 +512,10 @@ github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzP github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= @@ -611,26 +525,17 @@ github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXt github.com/gabriel-vasile/mimetype v1.3.1/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/getsentry/sentry-go v0.11.0/go.mod h1:KBQIxiZAetw62Cj8Ri964vAEWVdgfaUCn30Q3bCvANo= -github.com/getsentry/sentry-go v0.16.0 h1:owk+S+5XcgJLlGR/3+3s6N4d+uKwqYvh/eS0AIMjPWo= -github.com/getsentry/sentry-go v0.16.0/go.mod h1:ZXCloQLj0pG7mja5NK6NPf2V4A88YJ4pNlc2mOHwh6Y= +github.com/getsentry/sentry-go v0.20.0 h1:bwXW98iMRIWxn+4FgPW7vMrjmbym6HblXALmhjHmQaQ= +github.com/getsentry/sentry-go v0.20.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gigawattio/window v0.0.0-20180317192513-0f5467e35573 h1:u8AQ9bPa9oC+8/A/jlWouakhIvkFfuxgIIRjiy8av7I= github.com/gigawattio/window v0.0.0-20180317192513-0f5467e35573/go.mod h1:eBvb3i++NHDH4Ugo9qCvMw8t0mTSctaEa5blJbWcNxs= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= -github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-asn1-ber/asn1-ber v1.3.2-0.20191121212151-29be175fc3a3/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= -github.com/go-asn1-ber/asn1-ber v1.5.3/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-asn1-ber/asn1-ber v1.5.4 h1:vXT6d/FNDiELJnLb6hGNa309LMsrCoYFvpwHDF0+Y1A= github.com/go-asn1-ber/asn1-ber v1.5.4/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= @@ -644,12 +549,10 @@ github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3I github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= @@ -659,7 +562,6 @@ github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -674,13 +576,8 @@ github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dp github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-redis/redis/v8 v8.0.0/go.mod h1:isLoQT/NFSP7V67lyvM9GmdvLdyZ7pEhsXvvyQtnQTo= -github.com/go-redis/redis/v8 v8.10.0/go.mod h1:vXLTvigok0VtUX0znvbcEW1SOt4OA9CU1ZfnOtKOaiM= -github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= -github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-resty/resty/v2 v2.0.0/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= github.com/go-resty/resty/v2 v2.3.0/go.mod h1:UpN9CgLZNsv4e9XG50UU8xdI0F43UQ4HmxLBDwaroHU= -github.com/go-resty/resty/v2 v2.6.0/go.mod h1:PwvJS6hvaPkjtjNg9ph+VrSD92bi5Zq73w/BIH7cC3Q= github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= @@ -715,10 +612,6 @@ github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWe github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0= github.com/gocql/gocql v0.0.0-20210515062232-b7ef815b4556/go.mod h1:DL0ekTmBSTdlNF25Orwt/JMzqIq3EJ4MVa/J/uK64OY= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= @@ -731,7 +624,6 @@ github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRx github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= @@ -739,14 +631,13 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-migrate/migrate/v4 v4.14.1/go.mod h1:l7Ks0Au6fYHuUIxUhQ0rcVX1uLlJg54C/VvW7tvxSz0= github.com/golang-migrate/migrate/v4 v4.15.2 h1:vU+M05vs6jWHKDdmE1Ecwj0BznygFc4QsdRe2E/L7kc= github.com/golang-migrate/migrate/v4 v4.15.2/go.mod h1:f2toGLkYqD3JH+Todi4aZ2ZdbeUNx4sIwiOK96rE9Lw= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 h1:gtexQ/VGyN+VVFRXSFiguSNcXmS6rkKT+X7FdIrTtfo= -github.com/golang/geo v0.0.0-20210211234256-740aa86cb551/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= +github.com/golang/geo v0.0.0-20230404232722-c4acd7a044dc h1:WkAZHSmcnJhZyutVoVXe7lDSQBbISxITcm57tYf22PE= +github.com/golang/geo v0.0.0-20230404232722-c4acd7a044dc/go.mod h1:8wI0hitZ3a1IxZfeH3/5I97CI8i5cLGsYe7xNhQGs9U= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -782,22 +673,20 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0= github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/flatbuffers v2.0.0+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -838,7 +727,6 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= @@ -861,18 +749,14 @@ github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2c github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20190910122728-9d188e94fb99/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20210621113107-84c6004145de/go.mod h1:MtKwTfDNYAP5EtbQSMYjTSqvj1aXJKQRASWq3bwaP+g= github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= @@ -882,7 +766,6 @@ github.com/gorilla/schema v1.2.0 h1:YufUaxZYCKGFuAq3c96BOhjgd5nmXiOY9NGzF247Tsc= github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -893,54 +776,39 @@ github.com/graph-gophers/dataloader/v7 v7.1.0/go.mod h1:1bKE0Dm6OUcTB/OAuYVOZctg github.com/graph-gophers/graphql-go v1.5.1-0.20230110080634-edea822f558a h1:i0+Se9S+2zL5CBxJouqn2Ej6UQMwH1c57ZB6DVnqck4= github.com/graph-gophers/graphql-go v1.5.1-0.20230110080634-edea822f558a/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/gregjones/httpcache v0.0.0-20190212212710-3befbb6ad0cc/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.6.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c h1:fEE5/5VNnYUoBOj2I9TP8Jc+a7lge3QWn9DKE7NCwfc= github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c/go.mod h1:ObS/W+h8RYb1Y7fYivughjxojTmIu5iAIjSrSLCLeqE= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= -github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b/go.mod h1:VzxiSdG6j1pi7rwGm/xYI5RbtpBgM8sARDXlvEvxlu0= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v0.16.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.4.0 h1:ctuWFGrhFha8BnnzxqeRGidlEcQkDyL5u8J8t5eA11I= -github.com/hashicorp/go-hclog v1.4.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v1.1.5/go.mod h1:gWVc3sv/wbDmR3rQsj1CAktEZzoz1YNK9NfGLXJ69/4= github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-plugin v1.4.2/go.mod h1:5fGEH17QVwTTcR0zV7yhDPLLmFX9YSZ38b18Udy6vYQ= -github.com/hashicorp/go-plugin v1.4.8 h1:CHGwpxYDOttQOY7HOWgETU9dyVjOXzniXDqJcYJE1zM= -github.com/hashicorp/go-plugin v1.4.8/go.mod h1:viDMjcLJuDui6pXb8U4HVfb8AamCWhHGUjr2IrTF67s= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-plugin v1.4.9 h1:ESiK220/qE0aGxWdzKIvRH69iLiuN/PjoLTm69RoWtU= +github.com/hashicorp/go-plugin v1.4.9/go.mod h1:viDMjcLJuDui6pXb8U4HVfb8AamCWhHGUjr2IrTF67s= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -951,34 +819,22 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.4/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= -github.com/hashicorp/yamux v0.0.0-20210316155119-a95892c5f864/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428/go.mod h1:uhpZMVGznybq1itEKXj6RYw9I71qK4kH+OGMjRC4KEo= -github.com/ikawaha/kagome.ipadic v1.1.2/go.mod h1:DPSBbU0czaJhAb/5uKQZHMc9MTVRpDugJfX+HddPHHg= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= @@ -987,7 +843,6 @@ github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgO github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= -github.com/jackc/pgconn v1.3.2/go.mod h1:LvCquS3HbBKwgl7KbX9KyqEIumJAbm1UMcTvGaIf3bM= github.com/jackc/pgconn v1.4.0/go.mod h1:Y2O3ZDF0q4mMacyWV3AstPJpeHXWGEetiFttmq5lahk= github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= github.com/jackc/pgconn v1.5.1-0.20200601181101-fa742c524853/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= @@ -1025,14 +880,12 @@ github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0f github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jamiealquiza/envy v1.1.0/go.mod h1:MP36BriGCLwEHhi1OU8E9569JNZrjWfCvzG7RsPnHus= github.com/jaytaylor/html2text v0.0.0-20180606194806-57d518f124b0/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= github.com/jaytaylor/html2text v0.0.0-20200412013138-3577fbdbcff7/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= -github.com/jaytaylor/html2text v0.0.0-20211105163654-bc68cce691ba h1:QFQpJdgbON7I0jr2hYW7Bs+XV0qjc3d5tZoDnRFnqTg= -github.com/jaytaylor/html2text v0.0.0-20211105163654-bc68cce691ba/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= +github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056 h1:iCHtR9CQyktQ5+f3dMVZfwD2KWJUgm7M0gdL9NGr8KA= +github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jhump/protoreflect v1.6.0 h1:h5jfMVslIg6l29nsMs0D8Wj17RDVdNYti0vDN/PZZoE= -github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -1042,22 +895,18 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jmoiron/sqlx v1.3.1/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= -github.com/jmoiron/sqlx v1.3.4/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -1074,11 +923,6 @@ github.com/k0kubun/pp v2.3.0+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3t github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= @@ -1086,31 +930,22 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.14 h1:i7WCKDToww0wA+9qrUZ1xOjp218vfFo3nTU6UHp+gOc= -github.com/klauspost/compress v1.15.14/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= +github.com/klauspost/compress v1.16.4 h1:91KN02FnsOYhuunwU4ssRe8lc2JosWmizWa91B5v1PU= +github.com/klauspost/compress v1.16.4/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= -github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/pgzip v1.2.4/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= +github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/kljensen/snowball v0.6.0/go.mod h1:27N7E8fVU5H68RlUmnWwZCfxgt4POBJfENGMvNRhldw= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -1118,8 +953,8 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= @@ -1130,13 +965,10 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/krolaw/zipstream v0.0.0-20180621105154-0a2661891f94 h1:+AIlO01SKT9sfWU5CLWi0cfHc7dQwgGz3FhFRzXLoMg= github.com/krolaw/zipstream v0.0.0-20180621105154-0a2661891f94/go.mod h1:TcE3PIIkVWbP/HjhRAafgCjRKvDOi086iqp9VkNX/ng= github.com/ktrysmt/go-bitbucket v0.6.4/go.mod h1:9u0v3hsd2rqCHRIpbir1oP7F58uo5dq19sBYvuMoyQ4= -github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= -github.com/ledongthuc/pdf v0.0.0-20210621053716-e28cb8259002/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80 h1:6Yzfa6GP0rIo/kULo2bwGEkFvCePZ3qHDDTC3/J9Swo= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= github.com/levigross/exp-html v0.0.0-20120902181939-8df60c69a8f5 h1:W7p+m/AECTL3s/YR5RpQ4hz5SjNeKzZBl1q36ws12s0= @@ -1147,7 +979,6 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= @@ -1155,36 +986,26 @@ github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/pkger v0.15.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= -github.com/marstr/guid v0.0.0-20170427235115-8bdf7d1a087c/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/mattermost/go-i18n v1.11.0/go.mod h1:RyS7FDNQlzF1PsjbJWHRI35exqaKGSO9qD4iv8QjE34= github.com/mattermost/go-i18n v1.11.1-0.20211013152124-5c415071e404 h1:Khvh6waxG1cHc4Cz5ef9n3XVCxRWpAKUtqg9PJl5+y8= github.com/mattermost/go-i18n v1.11.1-0.20211013152124-5c415071e404/go.mod h1:RyS7FDNQlzF1PsjbJWHRI35exqaKGSO9qD4iv8QjE34= -github.com/mattermost/gorp v1.6.2-0.20210714143452-8b50f5209a7f/go.mod h1:QCQ3U0M9T/BlAdjKFJo0I1oe/YAgbyjNdhU8bpOLafk= -github.com/mattermost/gosaml2 v0.3.3/go.mod h1:Z429EIOiEi9kbq6yHoApfzlcXpa6dzRDc6pO+Vy2Ksk= github.com/mattermost/gziphandler v0.0.1 h1:uXHcXF5agnQ6bXabvpiwwwZOlCYoa7mKHH0lxns/o8w= github.com/mattermost/gziphandler v0.0.1/go.mod h1:CvvZR7sXqhj81V2swXuQY7T04Ccc89u7W7pHNPKev8g= github.com/mattermost/ldap v0.0.0-20201202150706-ee0e6284187d h1:/RJ/UV7M5c7L2TQ0KNm4yZxxFvC1nvRz/gY/Daa35aI= github.com/mattermost/ldap v0.0.0-20201202150706-ee0e6284187d/go.mod h1:HLbgMEI5K131jpxGazJ97AxfPDt31osq36YS1oxFQPQ= -github.com/mattermost/logr v1.0.13/go.mod h1:Mt4DPu1NXMe6JxPdwCC0XBoxXmN9eXOIRPoZarU2PXs= -github.com/mattermost/logr/v2 v2.0.10/go.mod h1:mpPp935r5dIkFDo2y9Q87cQWhFR/4xXpNh0k/y8Hmwg= github.com/mattermost/logr/v2 v2.0.16 h1:jnePX4cPskC3WDFvUardh/xZfxNdsFXbEERJQ1kUEDE= github.com/mattermost/logr/v2 v2.0.16/go.mod h1:1dm/YhTpozsqANXxo5Pi5zYLBsal2xY0pX+JZNbzYJY= -github.com/mattermost/mattermost-plugin-playbooks/client v0.7.0 h1:5TPlzBmrrl6/q6rupBzGvLgeJf/qsn1NoqQmuPDJvdw= -github.com/mattermost/mattermost-plugin-playbooks/client v0.7.0/go.mod h1:pIR9gutNcE4K726viIya01XT7+T9ziLF0jd5ho6kJlM= -github.com/mattermost/mattermost-server/v6 v6.0.0-20210825182941-ddfa6e2436d6/go.mod h1:+S8CsNEPv1FOl1usaPBQ6Gu9+Sm1Cc9YdU/Qh1YMGVI= github.com/mattermost/morph v1.0.5-0.20221115094356-4c18a75b1f5e h1:VfNz+fvJ3DxOlALM22Eea8ONp5jHrybKBCcCtDPVlss= github.com/mattermost/morph v1.0.5-0.20221115094356-4c18a75b1f5e/go.mod h1:xo0ljDknTpPxEdhhrUdwhLCexIsYyDKS6b41HqG8wGU= github.com/mattermost/rsc v0.0.0-20160330161541-bbaefb05eaa0 h1:G9tL6JXRBMzjuD1kkBtcnd42kUiT6QDwxfFYu7adM6o= @@ -1194,7 +1015,6 @@ github.com/mattermost/squirrel v0.2.0/go.mod h1:NPPtk+CdpWre4GxMGoOpzEVFVc0ZoEFy github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -1208,75 +1028,60 @@ github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= +github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.10/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= -github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/mgdelacroix/foundation v0.0.0-20220812143423-0bfc18f73538 h1:6mFhRD89wtsxh7g8V6og9DR4y/UGlzzehc1c3O9tbMQ= github.com/mgdelacroix/foundation v0.0.0-20220812143423-0bfc18f73538/go.mod h1:ZwobEfNHde7sU2pGybCWEnSlQ2r+MGrHGOKLphHZ42g= -github.com/mholt/archiver/v3 v3.5.0/go.mod h1:qqTTPUK/HZPFgFQ/TJ3BzvTpF/dPtFVJXdQbCmeMxwc= github.com/mholt/archiver/v3 v3.5.1 h1:rDjOBX9JSF5BvoJGvjqK479aL70qh9DIpZCl+k7Clwo= github.com/mholt/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/microcosm-cc/bluemonday v1.0.21 h1:dNH3e4PSyE4vNX+KlRGHT5KrSvjeUkoNPwEORjffHJg= -github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= +github.com/microcosm-cc/bluemonday v1.0.23 h1:SMZe2IGa0NuHvnVNAZ+6B38gsTbi5e4sViiWJyDDqFY= +github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.11/go.mod h1:WoyW+ySKAKjY98B9+7ZbI8z8S3jaxaisdcvj9TGlazA= -github.com/minio/minio-go/v7 v7.0.45 h1:g4IeM9M9pW/Lo8AGGNOjBZYlvmtlE1N5TQEYWXRWzIs= -github.com/minio/minio-go/v7 v7.0.45/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= -github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/minio/minio-go/v7 v7.0.51 h1:eSewrwc23TqUDEH8aw8Bwp4f+JDdozRrPWcKR7DZhmY= +github.com/minio/minio-go/v7 v7.0.51/go.mod h1:IbbodHyjUAguneyucUaahv+VMNs/EOTV9du7A7/Z3HU= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= @@ -1298,13 +1103,9 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM= github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw= -github.com/muesli/smartcrop v0.2.1-0.20181030220600-548bbf0c0965/go.mod h1:i2fCI/UorTfgEpPPLWiFBv4pye+YAG78RwcQLUkocpI= -github.com/muesli/smartcrop v0.3.0/go.mod h1:i2fCI/UorTfgEpPPLWiFBv4pye+YAG78RwcQLUkocpI= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mutecomm/go-sqlcipher/v4 v4.4.0/go.mod h1:PyN04SaWalavxRGH9E8ZftG6Ju7rsPrGmQRjrEaVpiY= @@ -1312,25 +1113,16 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= -github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/neo4j/neo4j-go-driver v1.8.1-0.20200803113522-b626aa943eba/go.mod h1:ncO5VaFWh0Nrt+4KT4mOZboaczBZcLuHrG+/sUeP8gI= -github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= -github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZVNoHScRE3EO9pVMM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc= github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -1339,11 +1131,9 @@ github.com/olekukonko/tablewriter v0.0.0-20180506121414-d4647c9c7a84/go.mod h1:v github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/olivere/elastic v6.2.35+incompatible/go.mod h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8= github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -1352,28 +1142,16 @@ github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0 github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= -github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= -github.com/oov/psd v0.0.0-20210618170533-9fb823ddb631/go.mod h1:GHI1bnmAcbp96z6LNfBJvtrjxhaXGkbsk967utPlvL8= github.com/oov/psd v0.0.0-20220121172623-5db5eafcecbb h1:JF9kOhBBk4WPF7luXFu5yR+WgaFm9L/KiHJHhU9vDwA= github.com/oov/psd v0.0.0-20220121172623-5db5eafcecbb/go.mod h1:GHI1bnmAcbp96z6LNfBJvtrjxhaXGkbsk967utPlvL8= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -1407,20 +1185,15 @@ github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFSt github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= -github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= github.com/otiai10/gosseract/v2 v2.2.4/go.mod h1:ahOp/kHojnOMGv1RaUnR0jwY5JVa6BYKhYAS8nbMLSo= -github.com/otiai10/gosseract/v2 v2.3.1/go.mod h1:2ZOGgdTIXQzCS5f+N1HkcXRgDX6K3ZoYe3Yvo++cpp4= github.com/otiai10/gosseract/v2 v2.4.0 h1:gYd3mx6FuMtIlxL4sYb9JLCFEDzg09VgNSZRNbqpiGM= github.com/otiai10/gosseract/v2 v2.4.0/go.mod h1:fhbIDRh29bj13vni6RT3gtWKjKCAeqDYI4C1dxeJuek= github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.2/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/otiai10/mint v1.3.3 h1:7JgpsBaN0uMkyju4tbYHu0mnM55hNKVYLsXmwr15NQI= github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= @@ -1430,23 +1203,19 @@ github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrap github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/peterbourgon/diskv v0.0.0-20171120014656-2973218375c3/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pelletier/go-toml/v2 v2.0.7 h1:muncTPStnKRos5dpVKULv2FVd4bMOhNePj9CjgDb8Us= +github.com/pelletier/go-toml/v2 v2.0.7/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4/v4 v4.0.3/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc= github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -1463,41 +1232,34 @@ github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prY github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.33.0 h1:rHgav/0a6+uYgGdNt3jwz8FNSesO/Hsang3O0T9A5SE= -github.com/prometheus/common v0.33.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -1507,17 +1269,18 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= +github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/redis/go-redis/v9 v9.0.3 h1:+7mmR26M0IvyLxGZUHxu4GiBkJkVDid0Un+j4ScYu4k= +github.com/redis/go-redis/v9 v9.0.3/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= github.com/reflog/dateconstraints v0.2.1 h1:Hz1n2Q1vEm0Rj5gciDQcCN1iPBwfFjxUJy32NknGP/s= github.com/reflog/dateconstraints v0.2.1/go.mod h1:Ax8AxTBcJc3E/oVS2hd2j7RDM/5MDtuPwuR7lIHtPLo= github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/remyoudompheng/bigfft v0.0.0-20220927061507-ef77025ab5aa h1:tEkEyxYeZ43TR55QU/hsIt9aRGBxbgGuz9CGykjvogY= -github.com/remyoudompheng/bigfft v0.0.0-20220927061507-ef77025ab5aa/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/richardlehane/mscfb v1.0.3/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= @@ -1526,27 +1289,23 @@ github.com/richardlehane/msoleps v1.0.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN github.com/richardlehane/msoleps v1.0.3/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= -github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/robertkrimen/godocdown v0.0.0-20130622164427-0bfa04905481/go.mod h1:C9WhFzY47SzYBIvzFqSvHIR6ROgDo4TtdTuRaOMjF/s= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/rudderlabs/analytics-go v3.3.1+incompatible/go.mod h1:LF8/ty9kUX4PTY3l5c97K3nZZaX5Hwsvt+NBaRL/f30= github.com/rudderlabs/analytics-go v3.3.3+incompatible h1:OG0XlKoXfr539e2t1dXtTB+Gr89uFW+OUNQBVhHIIBY= github.com/rudderlabs/analytics-go v3.3.3+incompatible/go.mod h1:LF8/ty9kUX4PTY3l5c97K3nZZaX5Hwsvt+NBaRL/f30= -github.com/russellhaering/goxmldsig v1.1.0/go.mod h1:QK8GhXPB3+AfuCrfo0oRISa9NfzeCpWmxeGnqEpDF9o= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -1554,24 +1313,20 @@ github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfF github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd h1:CmH9+J6ZSsIjUK3dcGsnCnO41eRBOnY12zwkn5qVwgc= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/satori/go.uuid v0.0.0-20180103174451-36e9d2ebbde5/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/segmentio/backo-go v0.0.0-20200129164019-23eae7c10bd3/go.mod h1:9/Rh6yILuLysoQnZ2oNooD2g7aBnvM7r/fNVxRNWfBc= github.com/segmentio/backo-go v1.0.1 h1:68RQccglxZeyURy93ASB/2kc9QudzgIDexJ927N++y4= github.com/segmentio/backo-go v1.0.1/go.mod h1:9/Rh6yILuLysoQnZ2oNooD2g7aBnvM7r/fNVxRNWfBc= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -1579,7 +1334,6 @@ github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIl github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= @@ -1589,7 +1343,6 @@ github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9A github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= @@ -1599,7 +1352,6 @@ github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1l github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= -github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= github.com/simplereach/timeutils v1.2.0/go.mod h1:VVbQDfN/FHRZa1LSqcwo4kNZ62OOyqLLGQKYB3pB0Q8= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= @@ -1614,11 +1366,8 @@ github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/snowflakedb/glog v0.0.0-20180824191149-f5055e6f21ce/go.mod h1:EB/w24pR5VKI60ecFnKqXzxX3dOorz1rnVicQTQrGM0= -github.com/snowflakedb/gosnowflake v1.3.5/go.mod h1:13Ky+lxzIm3VqNDZJdyvu9MCGy+WgRdYFdXp96UcLZU= github.com/snowflakedb/gosnowflake v1.6.3/go.mod h1:6hLajn6yxuJ4xUHZegMekpq9rnQbGJ7TMwXjgTmA6lg= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= @@ -1629,18 +1378,17 @@ github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= -github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -1650,37 +1398,28 @@ github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk= -github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= -github.com/splitio/go-client/v6 v6.1.0/go.mod h1:CEGAEFT99Fwb32ZIRcnZoXTMXddtB6IIpTmt3RP8mnM= -github.com/splitio/go-client/v6 v6.2.1 h1:EH3xYH7fr2c0I0ZtYvsyn7DjC9ZmoNAFLoKoT3BmQFU= -github.com/splitio/go-client/v6 v6.2.1/go.mod h1:+HnGMevmSUk56va2egs9W2s9mJ7LW9IXiDPB1ExOi+k= -github.com/splitio/go-split-commons/v3 v3.1.0/go.mod h1:29NCy20oAS4ZMy4qkwTd6277eieVDonx4V/aeDU/wUQ= -github.com/splitio/go-split-commons/v4 v4.2.0/go.mod h1:mzanM00PV8t1FL6IHc2UXepIH2z79d49ArZ2LoJHGrY= -github.com/splitio/go-split-commons/v4 v4.2.3 h1:/bQg8Z0eCkF9RHl7Dh1SJ8j7Ci024bgtkZEWwEKXywc= -github.com/splitio/go-split-commons/v4 v4.2.3/go.mod h1:mzanM00PV8t1FL6IHc2UXepIH2z79d49ArZ2LoJHGrY= -github.com/splitio/go-toolkit/v4 v4.2.0/go.mod h1:EdIHN0yzB1GTXDYQc0KdKvnjkO/jfUM2YqHVYfhD3Wo= -github.com/splitio/go-toolkit/v5 v5.2.2 h1:VHSJoIH9tsRt2cCzGKN4WG3BoGCr0tCPZIl8APtJ4bw= -github.com/splitio/go-toolkit/v5 v5.2.2/go.mod h1:SYi/svhhtEgdMSb5tNcDcMjOSUH/7XVkvjp5dPL+nBE= +github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= +github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= +github.com/splitio/go-client/v6 v6.3.1 h1:HtIVILFZotiT2AE1gTElWehrdy71kh8kDux3M3IuKjA= +github.com/splitio/go-client/v6 v6.3.1/go.mod h1:B7mq//ds3MiYjbY1amIESSR8qKcSWjOJJBzVgSAqlLE= +github.com/splitio/go-split-commons/v4 v4.3.1 h1:+BaNoyuxOWopYN603Pbk1etiysHaEz8EghVx20CbwDk= +github.com/splitio/go-split-commons/v4 v4.3.1/go.mod h1:tjtSYwuIMDGTEifO1dMcKk9UYf0Q2gz0xypkT//cdLc= +github.com/splitio/go-toolkit/v5 v5.3.0 h1:NSUBIkyRwyMQ6ruPOiG1Kl1pni/pW3Gqiu7L+11mIMw= +github.com/splitio/go-toolkit/v5 v5.3.0/go.mod h1:yn9f3Bmka+97BNnNnnlM1V484jMqu7MNoM/RBZLbZZs= github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf h1:pvbZ0lM0XWPBqUKqFU8cmavspvIl9nulOYwdy6IFRRo= github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf/go.mod h1:RJID2RhlZKId02nZ62WenDCkgHFerpIOmW0iT7GKmXM= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= -github.com/stephens2424/writerset v1.0.2/go.mod h1:aS2JhsMn6eA7e82oNmW4rfsgAOp9COBTTl8mzkwADnc= -github.com/steveyen/gtreap v0.1.0/go.mod h1:kl/5J7XbrOmlIbYIXdRHDDE5QxHqpk0cmkT7Z4dM9/Y= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -1690,69 +1429,48 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= +github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tebeka/snowball v0.4.2/go.mod h1:4IfL14h1lvwZcp1sfXuuc7/7yCsvVffTWxWxCLfFpYg= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/throttled/throttled v2.2.5+incompatible h1:65UB52X0qNTYiT0Sohp8qLYVFwZQPDw85uSa65OljjQ= github.com/throttled/throttled v2.2.5+incompatible/go.mod h1:0BjlrEGQmvxps+HuXLsyRdqpSRvJpq0PNIsOtqP9Nos= -github.com/tidwall/gjson v1.8.0/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk= github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= -github.com/tinylib/msgp v1.1.6/go.mod h1:75BAfg2hauQhs3qedfdDZmWAPcFMAvJE5b9rGOMufyw= github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0= github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= github.com/twmb/murmur3 v1.1.6 h1:mqrRot1BRxm+Yct+vavLMou2/iJt0tNVTTC0QoIjaZg= github.com/twmb/murmur3 v1.1.6/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= -github.com/tylerb/graceful v1.2.15/go.mod h1:LPYTbOYmUTdabwRt0TGhLllQ0MUNbs0Y5q1WXJOI9II= -github.com/uber/jaeger-client-go v2.29.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= -github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= @@ -1763,19 +1481,14 @@ github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmF github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vmihailenco/msgpack/v5 v5.3.4/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -github.com/wiggin77/cfg v1.0.2/go.mod h1:b3gotba2e5bXTqTW48DwIFoLc+4lWKP7WPi/CdvZ4aE= -github.com/wiggin77/merror v1.0.2/go.mod h1:uQTcIU0Z6jRK4OwqganPYerzQxSFJ4GSHM3aurxxQpg= -github.com/wiggin77/merror v1.0.3/go.mod h1:H2ETSu7/bPE0Ymf4bEwdUoo73OOEkdClnoRisfw0Nm0= github.com/wiggin77/merror v1.0.4 h1:XxFLEevmQQfgJW2AxhapuMG7C1fQqfbim/XyUmYv/ZM= github.com/wiggin77/merror v1.0.4/go.mod h1:H2ETSu7/bPE0Ymf4bEwdUoo73OOEkdClnoRisfw0Nm0= github.com/wiggin77/srslog v1.0.1 h1:gA2XjSMy3DrRdX9UqLuDtuVAAshb8bE1NhX1YK0Qe+8= github.com/wiggin77/srslog v1.0.1/go.mod h1:fehkyYDq1QfuYn60TDPu9YdY2bB85VUW2mvN1WynEls= -github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= github.com/writeas/go-strip-markdown v2.0.1+incompatible h1:IIqxTM5Jr7RzhigcL6FkrCNfXkvbR+Nbu1ls48pXYcw= @@ -1784,43 +1497,35 @@ github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVT github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= -github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c h1:3lbZUMbMiGUW/LMkfsEABsc5zNT9+b1CvsJx47JzJ8g= github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c/go.mod h1:UrdRz5enIKZ63MEE3IF9l2/ebyx59GyGgPi+tICQdmM= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.3.8/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/goldmark v1.5.3 h1:3HUJmBFbQW9fhQOzMgseU134xfi6hU+mjWywx5Ty+/M= -github.com/yuin/goldmark v1.5.3/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/goldmark v1.5.4 h1:2uY/xC0roWy8IBEGLgB1ywIoEJFGmRrX21YQcvGZzjU= +github.com/yuin/goldmark v1.5.4/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= +go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= +go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= @@ -1829,12 +1534,9 @@ go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lL go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.mongodb.org/mongo-driver v1.1.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.7.0/go.mod h1:Q4oFMbo1+MSNqICAdYMlC/zSTrwCogR4R8NzkI+yfU8= go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= -go.opencensus.io v0.19.1/go.mod h1:gug0GbSHa8Pafr0d2urOSgoXHZ6x/RUlaiT0d9pqb4A= -go.opencensus.io v0.19.2/go.mod h1:NO/8qkisMZLZ1FCsKNqtJPwc8/TaclWyY0B6wcYNg9M= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1846,9 +1548,7 @@ go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUz go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.11.0/go.mod h1:G8UCk+KooF2HLkgo8RHX9epABH/aRGYET7gQOqBVdB0= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel v1.0.0-RC1/go.mod h1:x9tRa9HK4hSSq7jf2TKbqFbtt58/TGk0f9XiEYISI1I= go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= @@ -1856,17 +1556,13 @@ go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= -go.opentelemetry.io/otel/internal/metric v0.21.0/go.mod h1:iOfAaY2YycsXfYD4kaRSbLx2LKmfpKObWBEv9QK5zFo= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/metric v0.21.0/go.mod h1:JWCt1bjivC4iCrz/aCrM1GSw+ZcvY44KCbaeeRhzHnc= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/oteltest v1.0.0-RC1/go.mod h1:+eoIG0gdEOaPNftuy1YScLr1Gb4mL/9lpDkZ0JjMRq4= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/otel/trace v1.0.0-RC1/go.mod h1:86UHmyHWFEtWjfWPSbu0+d0Pf9Q6e1U+3ViBOc+NXAg= go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= @@ -1875,7 +1571,6 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.8.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= @@ -1883,20 +1578,17 @@ go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= -golang.org/x/build v0.0.0-20190314133821-5284462c4bec/go.mod h1:atTaCNAy0f16Ah5aV1gMSwgiKVHwu/JncqDpuRr7lS4= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -1908,25 +1600,20 @@ golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= -golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ= +golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1941,10 +1628,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200908183739-ae8ad444f925/go.mod h1:1phAWC201xIgDyaFpmDeZkgf70Q4Pd/CNqfRtVPtxNw= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190321063152-3fc05d484e9f/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1953,12 +1638,10 @@ golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+o golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210622092929-e6eecd499c2c/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.3.0 h1:HTDXbdK9bjfSWkPzDJIw89W8CAtfFGduujWs33NLLsg= -golang.org/x/image v0.3.0/go.mod h1:fXd9211C/0VTlYuAcOhW8dY/RtEJqODXOWBDpmYBf+A= +golang.org/x/image v0.7.0 h1:gzS29xtG1J5ybQlv0PuyfE3nmc6R4qB73m6LUUmvFuw= +golang.org/x/image v0.7.0/go.mod h1:nd/q4ef1AKKYl/4kft7g+6UyGbdiqWqTP1ZAbRoV7Rg= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -1978,17 +1661,16 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= +golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2001,12 +1683,10 @@ golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190225153610-fe579d43d832/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -2019,7 +1699,6 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -2034,15 +1713,11 @@ golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201029221708-28c70e62bb1d/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -2062,24 +1737,25 @@ golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220111093109-d55c255bac03/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/oauth2 v0.0.0-20180227000427-d7d64896b5ff/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190319182350-c85d3e98c914/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -2094,8 +1770,8 @@ golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2121,10 +1797,6 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181218192612-074acd46bca6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181221143128-b4a75ba826a6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2151,11 +1823,8 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2188,7 +1857,6 @@ golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2197,7 +1865,6 @@ golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201029080932-201ba4db2418/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2210,7 +1877,6 @@ golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2247,7 +1913,6 @@ golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220317061510-51cd9980dadf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2259,8 +1924,10 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -2268,6 +1935,7 @@ golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2279,9 +1947,9 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2298,20 +1966,16 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181219222714-6e267b5cc78e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190424220101-1e8e1cfdf96b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -2325,7 +1989,6 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2360,15 +2023,9 @@ golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200806022845-90696ccdc692/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200814230902-9882f1d1823d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200817023811-d00afeaade8f/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200818005847-188abfa75333/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20200928182047-19e03678916f/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -2385,8 +2042,9 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.8.0 h1:vSDcovVPld282ceKgDimkRSC8kpaH1dgyc9UMzlt84Y= +golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2402,9 +2060,7 @@ gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= -google.golang.org/api v0.2.0/go.mod h1:IfRCZScioGtypHNTlz3gFk67J8uePVW7uDTBzXuIkhU= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -2450,15 +2106,12 @@ google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= -google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= -google.golang.org/genproto v0.0.0-20181219182458-5a97ab628bfb/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190321212433-e79c0c59cdb5/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -2490,13 +2143,9 @@ google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200815001618-f69a88009b70/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200911024640-645f7a48b24f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201030142918-24207fddd1c3/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -2536,15 +2185,13 @@ google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ6 google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20230104163317-caabf589fcbf h1:/JqRexUvugu6JURQ0O7RfV1EnvgrOxUV4tSjuAv0Sr0= -google.golang.org/genproto v0.0.0-20230104163317-caabf589fcbf/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -2560,7 +2207,6 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= @@ -2578,8 +2224,8 @@ google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ5 google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U= -google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -2595,8 +2241,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= @@ -2612,30 +2258,23 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/guregu/null.v4 v4.0.0 h1:1Wm3S1WEA2I26Kq+6vcW+w0gcDo44YKYD7YIEJNHDjg= gopkg.in/guregu/null.v4 v4.0.0/go.mod h1:YoQhUrADuG3i9WqesrCmpNRwm1ypAgSHYqoOcTu/JrI= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mail.v2 v2.3.1 h1:WYFn/oANrAGP2C0dcV6/pbkPzv8yGzqTjPmTeO7qoXk= gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/olivere/elastic.v6 v6.2.35/go.mod h1:2cTT8Z+/LcArSWpCgvZqBgt3VOqXiy7v00w12Lz8bd4= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -2648,7 +2287,6 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -2663,7 +2301,6 @@ gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= gotest.tools/v3 v3.1.0/go.mod h1:fHy7eyTmJFO5bQbUsEGQ1v4m2J3Jz9eWL54TP2/ZuYQ= grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20180920025451-e3ad64cb4ed3/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2715,8 +2352,8 @@ k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI= -lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= +lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= modernc.org/b v1.0.0/go.mod h1:uZWcZfRj1BpYzfN9JTerzlNUnnPsV9O2ZA8JsRcubNg= modernc.org/cc/v3 v3.32.4/go.mod h1:0R6jl1aZlIl2avnYfbfHBS1QB6/f+16mihBObaBC878= modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= @@ -2744,8 +2381,8 @@ modernc.org/libc v1.9.5/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w= modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= modernc.org/libc v1.16.7/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= -modernc.org/libc v1.22.2 h1:4U7v51GyhlWqQmwCHj28Rdq2Yzwk55ovjFrdPjs8Hb0= -modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= +modernc.org/libc v1.22.3 h1:D/g6O5ftAfavceqlLOFwaZuA5KYafKwmr30A6iSqoyY= +modernc.org/libc v1.22.3/go.mod h1:MQrloYP209xa2zHome2a8HLiLm6k0UT8CoHpV74tOFw= modernc.org/lldb v1.0.0/go.mod h1:jcRvJGWfCGodDZz8BPwiKMJxGJngQ/5DrRapkQnLob8= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= @@ -2764,15 +2401,15 @@ modernc.org/ql v1.0.0/go.mod h1:xGVyrLIatPcO2C1JvI/Co8c0sr6y91HKFNy4pt9JXEY= modernc.org/sortutil v1.1.0/go.mod h1:ZyL98OQHJgH9IEfN71VsamvJgrtRX9Dj2gX+vH86L1k= modernc.org/sqlite v1.10.6/go.mod h1:Z9FEjUtZP4qFEg6/SiADg9XCER7aYy9a/j7Pg9P7CPs= modernc.org/sqlite v1.18.0/go.mod h1:B9fRWZacNxJBHoCJZQr1R54zhVn3fjfl0aszflrTSxY= -modernc.org/sqlite v1.20.1 h1:z6qRLw72B0VfRrJjs3l6hWkzYDx1bo0WGVrBGP4ohhM= -modernc.org/sqlite v1.20.1/go.mod h1:fODt+bFmc/j8LcoCbMSkAuKuGmhxjG45KGc25N2705M= +modernc.org/sqlite v1.21.1 h1:GyDFqNnESLOhwwDRaHGdp2jKLDzpyT/rNLglX3ZkMSU= +modernc.org/sqlite v1.21.1/go.mod h1:XwQ0wZPIh1iKb5mkvCJ3szzbhk+tykC8ZWqTRTgYRwI= modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/tcl v1.5.2/go.mod h1:pmJYOLgpiys3oI4AeAafkcUfE+TKKilminxNyU/+Zlo= modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= -modernc.org/tcl v1.15.0 h1:oY+JeD11qVVSgVvodMJsu7Edf8tr5E/7tuhF5cNYz34= +modernc.org/tcl v1.15.1 h1:mOQwiEK4p7HruMZcwKTZPw/aqtGM4aY00uzWhlKKYws= modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= @@ -2796,5 +2433,3 @@ sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= -willnorris.com/go/gifresize v1.0.0/go.mod h1:eBM8gogBGCcaH603vxSpnfjwXIpq6nmnj/jauBDKtAk= -willnorris.com/go/imageproxy v0.10.0/go.mod h1:2tWdKRneln3E9X/zwH1RINpQAQWPeUiNynZ7UQ9OROk= diff --git a/model/command_args.go b/model/command_args.go index 9d09656e38..a01b5db87a 100644 --- a/model/command_args.go +++ b/model/command_args.go @@ -19,9 +19,6 @@ type CommandArgs struct { T i18n.TranslateFunc `json:"-"` UserMentions UserMentionMap `json:"-"` ChannelMentions ChannelMentionMap `json:"-"` - - // DO NOT USE Session field is deprecated. MM-26398 - Session Session `json:"-"` } func (o *CommandArgs) Auditable() map[string]interface{} { diff --git a/model/config.go b/model/config.go index a91ac29c40..4868229bbf 100644 --- a/model/config.go +++ b/model/config.go @@ -239,10 +239,10 @@ const ( Office365SettingsDefaultTokenEndpoint = "https://login.microsoftonline.com/common/oauth2/v2.0/token" Office365SettingsDefaultUserAPIEndpoint = "https://graph.microsoft.com/v1.0/me" - CloudSettingsDefaultCwsURL = "https://customers.cloud.mattermost.com" + CloudSettingsDefaultCwsURL = "https://customers.mattermost.com" CloudSettingsDefaultCwsAPIURL = "https://portal.internal.prod.cloud.mattermost.com" // TODO: update to "https://portal.test.cloud.mattermost.com" when ready to use test license key - CloudSettingsDefaultCwsURLTest = "https://customers.cloud.mattermost.com" + CloudSettingsDefaultCwsURLTest = "https://customers.mattermost.com" // TODO: update to // "https://api.internal.test.cloud.mattermost.com" when ready to use test license key CloudSettingsDefaultCwsAPIURLTest = "https://portal.internal.prod.cloud.mattermost.com" diff --git a/model/feature_flags.go b/model/feature_flags.go index 792ae834e9..07bfe6762a 100644 --- a/model/feature_flags.go +++ b/model/feature_flags.go @@ -75,7 +75,11 @@ type FeatureFlags struct { OnboardingTourTips bool + DeprecateCloudFree bool + AppsSidebarCategory bool + + CloudReverseTrial bool } func (f *FeatureFlags) SetDefaults() { @@ -101,10 +105,12 @@ func (f *FeatureFlags) SetDefaults() { f.ReduceOnBoardingTaskList = false f.ThreadsEverywhere = false f.GlobalDrafts = true + f.DeprecateCloudFree = false f.WysiwygEditor = false f.OnboardingAutoShowLinkedBoard = false f.OnboardingTourTips = true f.AppsSidebarCategory = false + f.CloudReverseTrial = false } func (f *FeatureFlags) Plugins() map[string]string { diff --git a/server/Makefile b/server/Makefile index 87130c4e3e..3271d4d4b9 100644 --- a/server/Makefile +++ b/server/Makefile @@ -142,7 +142,7 @@ TEMPLATES_DIR=templates PLUGIN_PACKAGES ?= mattermost-plugin-antivirus-v0.1.2 PLUGIN_PACKAGES += mattermost-plugin-autolink-v1.2.2 PLUGIN_PACKAGES += mattermost-plugin-aws-SNS-v1.2.0 -PLUGIN_PACKAGES += mattermost-plugin-calls-v0.14.0 +PLUGIN_PACKAGES += mattermost-plugin-calls-v0.15.1 PLUGIN_PACKAGES += mattermost-plugin-channel-export-v1.0.0 PLUGIN_PACKAGES += mattermost-plugin-confluence-v1.3.0 PLUGIN_PACKAGES += mattermost-plugin-custom-attributes-v1.3.1 diff --git a/server/boards/api/blocks.go b/server/boards/api/blocks.go index 312e3cd37e..c1b8f6a562 100644 --- a/server/boards/api/blocks.go +++ b/server/boards/api/blocks.go @@ -72,7 +72,6 @@ func (a *API) handleGetBlocks(w http.ResponseWriter, r *http.Request) { query := r.URL.Query() parentID := query.Get("parent_id") blockType := query.Get("type") - all := query.Get("all") blockID := query.Get("block_id") boardID := mux.Vars(r)["boardID"] @@ -122,18 +121,11 @@ func (a *API) handleGetBlocks(w http.ResponseWriter, r *http.Request) { auditRec.AddMeta("boardID", boardID) auditRec.AddMeta("parentID", parentID) auditRec.AddMeta("blockType", blockType) - auditRec.AddMeta("all", all) auditRec.AddMeta("blockID", blockID) var blocks []*model.Block var block *model.Block switch { - case all != "": - blocks, err = a.app.GetBlocksForBoard(boardID) - if err != nil { - a.errorResponse(w, r, err) - return - } case blockID != "": block, err = a.app.GetBlockByID(blockID) if err != nil { @@ -148,7 +140,12 @@ func (a *API) handleGetBlocks(w http.ResponseWriter, r *http.Request) { blocks = append(blocks, block) default: - blocks, err = a.app.GetBlocks(boardID, parentID, blockType) + opts := model.QueryBlocksOptions{ + BoardID: boardID, + ParentID: parentID, + BlockType: model.BlockType(blockType), + } + blocks, err = a.app.GetBlocks(opts) if err != nil { a.errorResponse(w, r, err) return diff --git a/server/boards/app/blocks.go b/server/boards/app/blocks.go index 0e736212c9..8db5ad5990 100644 --- a/server/boards/app/blocks.go +++ b/server/boards/app/blocks.go @@ -18,20 +18,11 @@ import ( var ErrBlocksFromMultipleBoards = errors.New("the block set contain blocks from multiple boards") -func (a *App) GetBlocks(boardID, parentID string, blockType string) ([]*model.Block, error) { - if boardID == "" { +func (a *App) GetBlocks(opts model.QueryBlocksOptions) ([]*model.Block, error) { + if opts.BoardID == "" { return []*model.Block{}, nil } - - if blockType != "" && parentID != "" { - return a.store.GetBlocksWithParentAndType(boardID, parentID, blockType) - } - - if blockType != "" { - return a.store.GetBlocksWithType(boardID, blockType) - } - - return a.store.GetBlocksWithParent(boardID, parentID) + return a.store.GetBlocks(opts) } func (a *App) DuplicateBlock(boardID string, blockID string, userID string, asTemplate bool) ([]*model.Block, error) { @@ -514,10 +505,6 @@ func (a *App) GetBlockCountsByType() (map[string]int64, error) { return a.store.GetBlockCountsByType() } -func (a *App) GetBlocksForBoard(boardID string) ([]*model.Block, error) { - return a.store.GetBlocksForBoard(boardID) -} - func (a *App) notifyBlockChanged(action notify.Action, block *model.Block, oldBlock *model.Block, modifiedByID string) { // don't notify if notifications service disabled, or block change is generated via system user. if a.notifications == nil || modifiedByID == model.SystemUserID { diff --git a/server/boards/app/blocks_test.go b/server/boards/app/blocks_test.go index 9e4f53c2f9..a810b064d5 100644 --- a/server/boards/app/blocks_test.go +++ b/server/boards/app/blocks_test.go @@ -207,10 +207,17 @@ func TestIsWithinViewsLimit(t *testing.T) { Views: mm_model.NewInt(2), }, } + + opts := model.QueryBlocksOptions{ + BoardID: "board_id", + ParentID: "parent_id", + BlockType: model.BlockType("view"), + } + th.Store.EXPECT().GetCloudLimits().Return(cloudLimit, nil) th.Store.EXPECT().GetUsedCardsCount().Return(1, nil) th.Store.EXPECT().GetCardLimitTimestamp().Return(int64(1), nil) - th.Store.EXPECT().GetBlocksWithParentAndType("board_id", "parent_id", "view").Return([]*model.Block{{}}, nil) + th.Store.EXPECT().GetBlocks(opts).Return([]*model.Block{{}}, nil) withinLimits, err := th.App.isWithinViewsLimit("board_id", &model.Block{ParentID: "parent_id"}) assert.NoError(t, err) @@ -225,10 +232,17 @@ func TestIsWithinViewsLimit(t *testing.T) { Views: mm_model.NewInt(1), }, } + + opts := model.QueryBlocksOptions{ + BoardID: "board_id", + ParentID: "parent_id", + BlockType: model.BlockType("view"), + } + th.Store.EXPECT().GetCloudLimits().Return(cloudLimit, nil) th.Store.EXPECT().GetUsedCardsCount().Return(1, nil) th.Store.EXPECT().GetCardLimitTimestamp().Return(int64(1), nil) - th.Store.EXPECT().GetBlocksWithParentAndType("board_id", "parent_id", "view").Return([]*model.Block{{}}, nil) + th.Store.EXPECT().GetBlocks(opts).Return([]*model.Block{{}}, nil) withinLimits, err := th.App.isWithinViewsLimit("board_id", &model.Block{ParentID: "parent_id"}) assert.NoError(t, err) @@ -243,10 +257,17 @@ func TestIsWithinViewsLimit(t *testing.T) { Views: mm_model.NewInt(2), }, } + + opts := model.QueryBlocksOptions{ + BoardID: "board_id", + ParentID: "parent_id", + BlockType: model.BlockType("view"), + } + th.Store.EXPECT().GetCloudLimits().Return(cloudLimit, nil) th.Store.EXPECT().GetUsedCardsCount().Return(1, nil) th.Store.EXPECT().GetCardLimitTimestamp().Return(int64(1), nil) - th.Store.EXPECT().GetBlocksWithParentAndType("board_id", "parent_id", "view").Return([]*model.Block{{}, {}, {}}, nil) + th.Store.EXPECT().GetBlocks(opts).Return([]*model.Block{{}, {}, {}}, nil) withinLimits, err := th.App.isWithinViewsLimit("board_id", &model.Block{ParentID: "parent_id"}) assert.NoError(t, err) @@ -261,10 +282,17 @@ func TestIsWithinViewsLimit(t *testing.T) { Views: mm_model.NewInt(2), }, } + + opts := model.QueryBlocksOptions{ + BoardID: "board_id", + ParentID: "parent_id", + BlockType: model.BlockType("view"), + } + th.Store.EXPECT().GetCloudLimits().Return(cloudLimit, nil) th.Store.EXPECT().GetUsedCardsCount().Return(1, nil) th.Store.EXPECT().GetCardLimitTimestamp().Return(int64(1), nil) - th.Store.EXPECT().GetBlocksWithParentAndType("board_id", "parent_id", "view").Return([]*model.Block{}, nil) + th.Store.EXPECT().GetBlocks(opts).Return([]*model.Block{}, nil) withinLimits, err := th.App.isWithinViewsLimit("board_id", &model.Block{ParentID: "parent_id"}) assert.NoError(t, err) @@ -333,10 +361,17 @@ func TestInsertBlocks(t *testing.T) { Views: mm_model.NewInt(2), }, } + + opts := model.QueryBlocksOptions{ + BoardID: "test-board-id", + ParentID: "parent_id", + BlockType: model.BlockType("view"), + } + th.Store.EXPECT().GetCloudLimits().Return(cloudLimit, nil) th.Store.EXPECT().GetUsedCardsCount().Return(1, nil) th.Store.EXPECT().GetCardLimitTimestamp().Return(int64(1), nil) - th.Store.EXPECT().GetBlocksWithParentAndType("test-board-id", "parent_id", "view").Return([]*model.Block{{}}, nil) + th.Store.EXPECT().GetBlocks(opts).Return([]*model.Block{{}}, nil) _, err := th.App.InsertBlocks([]*model.Block{block}, "user-id-1") require.NoError(t, err) @@ -365,10 +400,17 @@ func TestInsertBlocks(t *testing.T) { Views: mm_model.NewInt(2), }, } + + opts := model.QueryBlocksOptions{ + BoardID: "test-board-id", + ParentID: "parent_id", + BlockType: model.BlockType("view"), + } + th.Store.EXPECT().GetCloudLimits().Return(cloudLimit, nil) th.Store.EXPECT().GetUsedCardsCount().Return(1, nil) th.Store.EXPECT().GetCardLimitTimestamp().Return(int64(1), nil) - th.Store.EXPECT().GetBlocksWithParentAndType("test-board-id", "parent_id", "view").Return([]*model.Block{{}, {}}, nil) + th.Store.EXPECT().GetBlocks(opts).Return([]*model.Block{{}, {}}, nil) _, err := th.App.InsertBlocks([]*model.Block{block}, "user-id-1") require.Error(t, err) @@ -406,10 +448,17 @@ func TestInsertBlocks(t *testing.T) { Views: mm_model.NewInt(2), }, } + + opts := model.QueryBlocksOptions{ + BoardID: "test-board-id", + ParentID: "parent_id", + BlockType: model.BlockType("view"), + } + th.Store.EXPECT().GetCloudLimits().Return(cloudLimit, nil).Times(2) th.Store.EXPECT().GetUsedCardsCount().Return(1, nil).Times(2) th.Store.EXPECT().GetCardLimitTimestamp().Return(int64(1), nil).Times(2) - th.Store.EXPECT().GetBlocksWithParentAndType("test-board-id", "parent_id", "view").Return([]*model.Block{{}}, nil).Times(2) + th.Store.EXPECT().GetBlocks(opts).Return([]*model.Block{{}}, nil).Times(2) _, err := th.App.InsertBlocks([]*model.Block{view1, view2}, "user-id-1") require.Error(t, err) diff --git a/server/boards/app/export.go b/server/boards/app/export.go index 4f717be041..60af732727 100644 --- a/server/boards/app/export.go +++ b/server/boards/app/export.go @@ -86,7 +86,7 @@ func (a *App) writeArchiveBoard(zw *zip.Writer, board model.Board, opt model.Exp var files []string // write the board's blocks // TODO: paginate this - blocks, err := a.GetBlocksForBoard(board.ID) + blocks, err := a.GetBlocks(model.QueryBlocksOptions{BoardID: board.ID}) if err != nil { return err } diff --git a/server/boards/auth/auth.go b/server/boards/auth/auth.go index 1b038d5768..0e90c8ecbd 100644 --- a/server/boards/auth/auth.go +++ b/server/boards/auth/auth.go @@ -58,6 +58,10 @@ func (a *Auth) IsValidReadToken(boardID string, readToken string) (bool, error) return false, err } + if !a.config.EnablePublicSharedBoards { + return false, errors.New("public shared boards disabled") + } + if sharing != nil && (sharing.ID == boardID && sharing.Enabled && sharing.Token == readToken) { return true, nil } diff --git a/server/boards/integrationtests/boards_and_blocks_test.go b/server/boards/integrationtests/boards_and_blocks_test.go index 8541265c38..9ae48366f8 100644 --- a/server/boards/integrationtests/boards_and_blocks_test.go +++ b/server/boards/integrationtests/boards_and_blocks_test.go @@ -133,7 +133,7 @@ func TestCreateBoardsAndBlocks(t *testing.T) { require.Equal(t, "public board", board1.Title) require.Equal(t, model.BoardTypeOpen, board1.Type) require.NotEqual(t, "board-id-1", board1.ID) - blocks1, err := th.Server.App().GetBlocksForBoard(board1.ID) + blocks1, err := th.Server.App().GetBlocks(model.QueryBlocksOptions{BoardID: board1.ID}) require.NoError(t, err) require.Len(t, blocks1, 1) require.Equal(t, "block 1", blocks1[0].Title) @@ -147,7 +147,7 @@ func TestCreateBoardsAndBlocks(t *testing.T) { require.Equal(t, "private board", board2.Title) require.Equal(t, model.BoardTypePrivate, board2.Type) require.NotEqual(t, "board-id-2", board2.ID) - blocks2, err := th.Server.App().GetBlocksForBoard(board2.ID) + blocks2, err := th.Server.App().GetBlocks(model.QueryBlocksOptions{BoardID: board2.ID}) require.NoError(t, err) require.Len(t, blocks2, 1) require.Equal(t, "block 2", blocks2[0].Title) diff --git a/server/boards/integrationtests/clienttestlib.go b/server/boards/integrationtests/clienttestlib.go index ad11791367..10997b0b18 100644 --- a/server/boards/integrationtests/clienttestlib.go +++ b/server/boards/integrationtests/clienttestlib.go @@ -388,6 +388,11 @@ func (th *TestHelper) TearDown() { panic(err) } + err = th.Server.Store().Shutdown() + if err != nil { + panic(err) + } + os.RemoveAll(th.Server.Config().FilesPath) if err := os.Remove(th.Server.Config().DBConfigString); err == nil { diff --git a/server/boards/integrationtests/export_test.go b/server/boards/integrationtests/export_test.go index 40de905346..da96ebf301 100644 --- a/server/boards/integrationtests/export_test.go +++ b/server/boards/integrationtests/export_test.go @@ -62,7 +62,7 @@ func TestExportBoard(t *testing.T) { require.NoError(t, err) require.Len(t, boardsImported, 1) boardImported := boardsImported[0] - blocksImported, err := th.Server.App().GetBlocksForBoard(boardImported.ID) + blocksImported, err := th.Server.App().GetBlocks(model.QueryBlocksOptions{BoardID: boardImported.ID}) require.NoError(t, err) require.Len(t, blocksImported, 1) require.Equal(t, block.Title, blocksImported[0].Title) diff --git a/server/boards/integrationtests/permissions_test.go b/server/boards/integrationtests/permissions_test.go index 573f55c2db..e86f1d1c64 100644 --- a/server/boards/integrationtests/permissions_test.go +++ b/server/boards/integrationtests/permissions_test.go @@ -585,6 +585,35 @@ func TestPermissionsGetBoard(t *testing.T) { }) } +func TestPermissionsGetBoardPublic(t *testing.T) { + ttCases := []TestCase{ + {"/boards/{PRIVATE_BOARD_ID}?read_token=invalid", methodGet, "", userAnon, http.StatusUnauthorized, 0}, + {"/boards/{PRIVATE_BOARD_ID}?read_token=valid", methodGet, "", userAnon, http.StatusUnauthorized, 1}, + {"/boards/{PRIVATE_BOARD_ID}?read_token=invalid", methodGet, "", userNoTeamMember, http.StatusForbidden, 0}, + {"/boards/{PRIVATE_BOARD_ID}?read_token=valid", methodGet, "", userTeamMember, http.StatusForbidden, 1}, + } + t.Run("plugin", func(t *testing.T) { + th := SetupTestHelperPluginMode(t) + defer th.TearDown() + cfg := th.Server.Config() + cfg.EnablePublicSharedBoards = false + th.Server.UpdateAppConfig() + clients := setupClients(th) + testData := setupData(t, th) + runTestCases(t, ttCases, testData, clients) + }) + t.Run("local", func(t *testing.T) { + th := SetupTestHelperLocalMode(t) + defer th.TearDown() + cfg := th.Server.Config() + cfg.EnablePublicSharedBoards = false + th.Server.UpdateAppConfig() + clients := setupLocalClients(th) + testData := setupData(t, th) + runTestCases(t, ttCases, testData, clients) + }) +} + func TestPermissionsPatchBoard(t *testing.T) { ttCases := []TestCase{ {"/boards/{PRIVATE_BOARD_ID}", methodPatch, "{\"title\": \"test\"}", userAnon, http.StatusUnauthorized, 0}, diff --git a/server/boards/model/block.go b/server/boards/model/block.go index 587c648eff..02b633e840 100644 --- a/server/boards/model/block.go +++ b/server/boards/model/block.go @@ -176,7 +176,7 @@ type QueryBlocksOptions struct { ParentID string // if not empty then filter for blocks belonging to specified parent BlockType BlockType // if not empty and not `TypeUnknown` then filter for records of specified block type Page int // page number to select when paginating - PerPage int // number of blocks per page (default=-1, meaning unlimited) + PerPage int // number of blocks per page (default=0, meaning unlimited) } // QuerySubtreeOptions are query options that can be passed to GetSubTree methods. diff --git a/server/boards/server/server.go b/server/boards/server/server.go index 9a364d25c9..d79f30129b 100644 --- a/server/boards/server/server.go +++ b/server/boards/server/server.go @@ -355,7 +355,7 @@ func (s *Server) Shutdown() error { defer s.logger.Info("Server.Shutdown") - return s.store.Shutdown() + return nil } func (s *Server) Config() *config.Configuration { diff --git a/server/boards/services/store/mockstore/mockstore.go b/server/boards/services/store/mockstore/mockstore.go index 1c5f6e0c21..5cd89f13eb 100644 --- a/server/boards/services/store/mockstore/mockstore.go +++ b/server/boards/services/store/mockstore/mockstore.go @@ -536,66 +536,6 @@ func (mr *MockStoreMockRecorder) GetBlocksComplianceHistory(arg0 interface{}) *g return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBlocksComplianceHistory", reflect.TypeOf((*MockStore)(nil).GetBlocksComplianceHistory), arg0) } -// GetBlocksForBoard mocks base method. -func (m *MockStore) GetBlocksForBoard(arg0 string) ([]*model0.Block, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetBlocksForBoard", arg0) - ret0, _ := ret[0].([]*model0.Block) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetBlocksForBoard indicates an expected call of GetBlocksForBoard. -func (mr *MockStoreMockRecorder) GetBlocksForBoard(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBlocksForBoard", reflect.TypeOf((*MockStore)(nil).GetBlocksForBoard), arg0) -} - -// GetBlocksWithParent mocks base method. -func (m *MockStore) GetBlocksWithParent(arg0, arg1 string) ([]*model0.Block, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetBlocksWithParent", arg0, arg1) - ret0, _ := ret[0].([]*model0.Block) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetBlocksWithParent indicates an expected call of GetBlocksWithParent. -func (mr *MockStoreMockRecorder) GetBlocksWithParent(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBlocksWithParent", reflect.TypeOf((*MockStore)(nil).GetBlocksWithParent), arg0, arg1) -} - -// GetBlocksWithParentAndType mocks base method. -func (m *MockStore) GetBlocksWithParentAndType(arg0, arg1, arg2 string) ([]*model0.Block, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetBlocksWithParentAndType", arg0, arg1, arg2) - ret0, _ := ret[0].([]*model0.Block) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetBlocksWithParentAndType indicates an expected call of GetBlocksWithParentAndType. -func (mr *MockStoreMockRecorder) GetBlocksWithParentAndType(arg0, arg1, arg2 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBlocksWithParentAndType", reflect.TypeOf((*MockStore)(nil).GetBlocksWithParentAndType), arg0, arg1, arg2) -} - -// GetBlocksWithType mocks base method. -func (m *MockStore) GetBlocksWithType(arg0, arg1 string) ([]*model0.Block, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetBlocksWithType", arg0, arg1) - ret0, _ := ret[0].([]*model0.Block) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetBlocksWithType indicates an expected call of GetBlocksWithType. -func (mr *MockStoreMockRecorder) GetBlocksWithType(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBlocksWithType", reflect.TypeOf((*MockStore)(nil).GetBlocksWithType), arg0, arg1) -} - // GetBoard mocks base method. func (m *MockStore) GetBoard(arg0 string) (*model0.Board, error) { m.ctrl.T.Helper() diff --git a/server/boards/services/store/sqlstore/blocks.go b/server/boards/services/store/sqlstore/blocks.go index 67318e6b25..c20002963e 100644 --- a/server/boards/services/store/sqlstore/blocks.go +++ b/server/boards/services/store/sqlstore/blocks.go @@ -105,23 +105,6 @@ func (s *SQLStore) getBlocks(db sq.BaseRunner, opts model.QueryBlocksOptions) ([ return s.blocksFromRows(rows) } -func (s *SQLStore) getBlocksWithParentAndType(db sq.BaseRunner, boardID, parentID string, blockType string) ([]*model.Block, error) { - opts := model.QueryBlocksOptions{ - BoardID: boardID, - ParentID: parentID, - BlockType: model.BlockType(blockType), - } - return s.getBlocks(db, opts) -} - -func (s *SQLStore) getBlocksWithParent(db sq.BaseRunner, boardID, parentID string) ([]*model.Block, error) { - opts := model.QueryBlocksOptions{ - BoardID: boardID, - ParentID: parentID, - } - return s.getBlocks(db, opts) -} - func (s *SQLStore) getBlocksByIDs(db sq.BaseRunner, ids []string) ([]*model.Block, error) { query := s.getQueryBuilder(db). Select(s.blockFields("")...). @@ -148,14 +131,6 @@ func (s *SQLStore) getBlocksByIDs(db sq.BaseRunner, ids []string) ([]*model.Bloc return blocks, nil } -func (s *SQLStore) getBlocksWithType(db sq.BaseRunner, boardID, blockType string) ([]*model.Block, error) { - opts := model.QueryBlocksOptions{ - BoardID: boardID, - BlockType: model.BlockType(blockType), - } - return s.getBlocks(db, opts) -} - // getSubTree2 returns blocks within 2 levels of the given blockID. func (s *SQLStore) getSubTree2(db sq.BaseRunner, boardID string, blockID string, opts model.QuerySubtreeOptions) ([]*model.Block, error) { query := s.getQueryBuilder(db). @@ -188,13 +163,6 @@ func (s *SQLStore) getSubTree2(db sq.BaseRunner, boardID string, blockID string, return s.blocksFromRows(rows) } -func (s *SQLStore) getBlocksForBoard(db sq.BaseRunner, boardID string) ([]*model.Block, error) { - opts := model.QueryBlocksOptions{ - BoardID: boardID, - } - return s.getBlocks(db, opts) -} - func (s *SQLStore) blocksFromRows(rows *sql.Rows) ([]*model.Block, error) { results := []*model.Block{} diff --git a/server/boards/services/store/sqlstore/boards_and_blocks.go b/server/boards/services/store/sqlstore/boards_and_blocks.go index 23d8f5696c..6a88c78f2a 100644 --- a/server/boards/services/store/sqlstore/boards_and_blocks.go +++ b/server/boards/services/store/sqlstore/boards_and_blocks.go @@ -166,7 +166,7 @@ func (s *SQLStore) duplicateBoard(db sq.BaseRunner, boardID string, userID strin } bab.Boards = []*model.Board{board} - blocks, err := s.getBlocksForBoard(db, boardID) + blocks, err := s.getBlocks(db, model.QueryBlocksOptions{BoardID: boardID}) if err != nil { return nil, nil, err } diff --git a/server/boards/services/store/sqlstore/public_methods.go b/server/boards/services/store/sqlstore/public_methods.go index dca9d162bf..df4d3419ea 100644 --- a/server/boards/services/store/sqlstore/public_methods.go +++ b/server/boards/services/store/sqlstore/public_methods.go @@ -326,26 +326,6 @@ func (s *SQLStore) GetBlocksComplianceHistory(opts model.QueryBlocksComplianceHi } -func (s *SQLStore) GetBlocksForBoard(boardID string) ([]*model.Block, error) { - return s.getBlocksForBoard(s.db, boardID) - -} - -func (s *SQLStore) GetBlocksWithParent(boardID string, parentID string) ([]*model.Block, error) { - return s.getBlocksWithParent(s.db, boardID, parentID) - -} - -func (s *SQLStore) GetBlocksWithParentAndType(boardID string, parentID string, blockType string) ([]*model.Block, error) { - return s.getBlocksWithParentAndType(s.db, boardID, parentID, blockType) - -} - -func (s *SQLStore) GetBlocksWithType(boardID string, blockType string) ([]*model.Block, error) { - return s.getBlocksWithType(s.db, boardID, blockType) - -} - func (s *SQLStore) GetBoard(id string) (*model.Board, error) { return s.getBoard(s.db, id) diff --git a/server/boards/services/store/store.go b/server/boards/services/store/store.go index 5d4da0460b..23b8a3d1c3 100644 --- a/server/boards/services/store/store.go +++ b/server/boards/services/store/store.go @@ -18,12 +18,8 @@ const CardLimitTimestampSystemKey = "card_limit_timestamp" // Store represents the abstraction of the data storage. type Store interface { GetBlocks(opts model.QueryBlocksOptions) ([]*model.Block, error) - GetBlocksWithParentAndType(boardID, parentID string, blockType string) ([]*model.Block, error) - GetBlocksWithParent(boardID, parentID string) ([]*model.Block, error) GetBlocksByIDs(ids []string) ([]*model.Block, error) - GetBlocksWithType(boardID, blockType string) ([]*model.Block, error) GetSubTree2(boardID, blockID string, opts model.QuerySubtreeOptions) ([]*model.Block, error) - GetBlocksForBoard(boardID string) ([]*model.Block, error) // @withTransaction InsertBlock(block *model.Block, userID string) error // @withTransaction diff --git a/server/boards/services/store/storetests/blocks.go b/server/boards/services/store/storetests/blocks.go index 85dbae606b..1df3ae288d 100644 --- a/server/boards/services/store/storetests/blocks.go +++ b/server/boards/services/store/storetests/blocks.go @@ -69,7 +69,7 @@ func testInsertBlock(t *testing.T, store store.Store) { userID := testUserID boardID := testBoardID - blocks, errBlocks := store.GetBlocksForBoard(boardID) + blocks, errBlocks := store.GetBlocks(model.QueryBlocksOptions{BoardID: boardID}) require.NoError(t, errBlocks) initialCount := len(blocks) @@ -85,7 +85,7 @@ func testInsertBlock(t *testing.T, store store.Store) { err := store.InsertBlock(block, "user-id-1") require.NoError(t, err) - blocks, err := store.GetBlocksForBoard(boardID) + blocks, err := store.GetBlocks(model.QueryBlocksOptions{BoardID: boardID}) require.NoError(t, err) require.Len(t, blocks, initialCount+1) @@ -105,7 +105,7 @@ func testInsertBlock(t *testing.T, store store.Store) { err := store.InsertBlock(block, "user-id-1") require.Error(t, err) - blocks, err := store.GetBlocksForBoard(boardID) + blocks, err := store.GetBlocks(model.QueryBlocksOptions{BoardID: boardID}) require.NoError(t, err) require.Len(t, blocks, initialCount+1) }) @@ -121,7 +121,7 @@ func testInsertBlock(t *testing.T, store store.Store) { err := store.InsertBlock(block, "user-id-1") require.Error(t, err) - blocks, err := store.GetBlocksForBoard(boardID) + blocks, err := store.GetBlocks(model.QueryBlocksOptions{BoardID: boardID}) require.NoError(t, err) require.Len(t, blocks, initialCount+1) }) @@ -204,7 +204,7 @@ func testInsertBlock(t *testing.T, store store.Store) { func testInsertBlocks(t *testing.T, store store.Store) { userID := testUserID - blocks, errBlocks := store.GetBlocksForBoard("id-test") + blocks, errBlocks := store.GetBlocks(model.QueryBlocksOptions{BoardID: "id-test"}) require.NoError(t, errBlocks) initialCount := len(blocks) @@ -227,7 +227,7 @@ func testInsertBlocks(t *testing.T, store store.Store) { err := store.InsertBlocks(newBlocks, "user-id-1") require.Error(t, err) - blocks, err := store.GetBlocksForBoard("id-test") + blocks, err := store.GetBlocks(model.QueryBlocksOptions{BoardID: "id-test"}) require.NoError(t, err) // no blocks should have been inserted require.Len(t, blocks, initialCount) @@ -249,7 +249,7 @@ func testPatchBlock(t *testing.T, store store.Store) { err := store.InsertBlock(block, "user-id-1") require.NoError(t, err) - blocks, errBlocks := store.GetBlocksForBoard(boardID) + blocks, errBlocks := store.GetBlocks(model.QueryBlocksOptions{BoardID: boardID}) require.NoError(t, errBlocks) initialCount := len(blocks) @@ -259,7 +259,7 @@ func testPatchBlock(t *testing.T, store store.Store) { require.ErrorAs(t, err, &nf) require.True(t, model.IsErrNotFound(err)) - blocks, err := store.GetBlocksForBoard(boardID) + blocks, err := store.GetBlocks(model.QueryBlocksOptions{BoardID: boardID}) require.NoError(t, err) require.Len(t, blocks, initialCount) }) @@ -272,7 +272,7 @@ func testPatchBlock(t *testing.T, store store.Store) { err := store.PatchBlock("id-test", blockPatch, "user-id-1") require.Error(t, err) - blocks, err := store.GetBlocksForBoard(boardID) + blocks, err := store.GetBlocks(model.QueryBlocksOptions{BoardID: boardID}) require.NoError(t, err) require.Len(t, blocks, initialCount) }) @@ -452,7 +452,7 @@ var ( func testGetSubTree2(t *testing.T, store store.Store) { boardID := testBoardID - blocks, err := store.GetBlocksForBoard(boardID) + blocks, err := store.GetBlocks(model.QueryBlocksOptions{BoardID: boardID}) require.NoError(t, err) initialCount := len(blocks) @@ -460,7 +460,7 @@ func testGetSubTree2(t *testing.T, store store.Store) { time.Sleep(1 * time.Millisecond) defer DeleteBlocks(t, store, subtreeSampleBlocks, "test") - blocks, err = store.GetBlocksForBoard(boardID) + blocks, err = store.GetBlocks(model.QueryBlocksOptions{BoardID: boardID}) require.NoError(t, err) require.Len(t, blocks, initialCount+6) @@ -492,7 +492,7 @@ func testDeleteBlock(t *testing.T, store store.Store) { userID := testUserID boardID := testBoardID - blocks, err := store.GetBlocksForBoard(boardID) + blocks, err := store.GetBlocks(model.QueryBlocksOptions{BoardID: boardID}) require.NoError(t, err) initialCount := len(blocks) @@ -516,7 +516,7 @@ func testDeleteBlock(t *testing.T, store store.Store) { InsertBlocks(t, store, blocksToInsert, "user-id-1") defer DeleteBlocks(t, store, blocksToInsert, "test") - blocks, err = store.GetBlocksForBoard(boardID) + blocks, err = store.GetBlocks(model.QueryBlocksOptions{BoardID: boardID}) require.NoError(t, err) require.Len(t, blocks, initialCount+3) @@ -550,7 +550,7 @@ func testUndeleteBlock(t *testing.T, store store.Store) { boardID := testBoardID userID := testUserID - blocks, err := store.GetBlocksForBoard(boardID) + blocks, err := store.GetBlocks(model.QueryBlocksOptions{BoardID: boardID}) require.NoError(t, err) initialCount := len(blocks) @@ -574,7 +574,7 @@ func testUndeleteBlock(t *testing.T, store store.Store) { InsertBlocks(t, store, blocksToInsert, "user-id-1") defer DeleteBlocks(t, store, blocksToInsert, "test") - blocks, err = store.GetBlocksForBoard(boardID) + blocks, err = store.GetBlocks(model.QueryBlocksOptions{BoardID: boardID}) require.NoError(t, err) require.Len(t, blocks, initialCount+3) @@ -643,7 +643,7 @@ func testUndeleteBlock(t *testing.T, store store.Store) { func testGetBlocks(t *testing.T, store store.Store) { boardID := testBoardID - blocks, err := store.GetBlocksForBoard(boardID) + blocks, err := store.GetBlocks(model.QueryBlocksOptions{BoardID: boardID}) require.NoError(t, err) blocksToInsert := []*model.Block{ @@ -686,65 +686,74 @@ func testGetBlocks(t *testing.T, store store.Store) { InsertBlocks(t, store, blocksToInsert, "user-id-1") defer DeleteBlocks(t, store, blocksToInsert, "test") - t.Run("not existing parent", func(t *testing.T) { + t.Run("not existing parent with type", func(t *testing.T) { time.Sleep(1 * time.Millisecond) - blocks, err = store.GetBlocksWithParentAndType(boardID, "not-exists", "test") + opts := model.QueryBlocksOptions{BoardID: boardID, ParentID: "not-exists", BlockType: model.BlockType("test")} + blocks, err = store.GetBlocks(opts) require.NoError(t, err) require.Empty(t, blocks) }) - t.Run("not existing type", func(t *testing.T) { + t.Run("not existing type with parent", func(t *testing.T) { time.Sleep(1 * time.Millisecond) - blocks, err = store.GetBlocksWithParentAndType(boardID, "block1", "not-existing") + opts := model.QueryBlocksOptions{BoardID: boardID, ParentID: "block1", BlockType: model.BlockType("not-existing")} + blocks, err = store.GetBlocks(opts) require.NoError(t, err) require.Empty(t, blocks) }) t.Run("valid parent and type", func(t *testing.T) { time.Sleep(1 * time.Millisecond) - blocks, err = store.GetBlocksWithParentAndType(boardID, "block1", "test") + opts := model.QueryBlocksOptions{BoardID: boardID, ParentID: "block1", BlockType: model.BlockType("test")} + blocks, err = store.GetBlocks(opts) require.NoError(t, err) require.Len(t, blocks, 2) }) t.Run("not existing parent", func(t *testing.T) { time.Sleep(1 * time.Millisecond) - blocks, err = store.GetBlocksWithParent(boardID, "not-exists") + opts := model.QueryBlocksOptions{BoardID: boardID, ParentID: "not-exists"} + blocks, err = store.GetBlocks(opts) require.NoError(t, err) require.Empty(t, blocks) }) t.Run("valid parent", func(t *testing.T) { time.Sleep(1 * time.Millisecond) - blocks, err = store.GetBlocksWithParent(boardID, "block1") + opts := model.QueryBlocksOptions{BoardID: boardID, ParentID: "block1"} + blocks, err = store.GetBlocks(opts) require.NoError(t, err) require.Len(t, blocks, 3) }) t.Run("not existing type", func(t *testing.T) { time.Sleep(1 * time.Millisecond) - blocks, err = store.GetBlocksWithType(boardID, "not-exists") + opts := model.QueryBlocksOptions{BoardID: boardID, BlockType: model.BlockType("not-exists")} + blocks, err = store.GetBlocks(opts) require.NoError(t, err) require.Empty(t, blocks) }) t.Run("valid type", func(t *testing.T) { time.Sleep(1 * time.Millisecond) - blocks, err = store.GetBlocksWithType(boardID, "test") + opts := model.QueryBlocksOptions{BoardID: boardID, BlockType: model.BlockType("test")} + blocks, err = store.GetBlocks(opts) require.NoError(t, err) require.Len(t, blocks, 4) }) t.Run("not existing board", func(t *testing.T) { time.Sleep(1 * time.Millisecond) - blocks, err = store.GetBlocksForBoard("not-exists") + opts := model.QueryBlocksOptions{BoardID: "not-exists"} + blocks, err = store.GetBlocks(opts) require.NoError(t, err) require.Empty(t, blocks) }) t.Run("all blocks of the a board", func(t *testing.T) { time.Sleep(1 * time.Millisecond) - blocks, err = store.GetBlocksForBoard(boardID) + opts := model.QueryBlocksOptions{BoardID: boardID} + blocks, err = store.GetBlocks(opts) require.NoError(t, err) require.Len(t, blocks, 5) }) @@ -863,7 +872,7 @@ func testDuplicateBlock(t *testing.T, store store.Store) { func testGetBlockMetadata(t *testing.T, store store.Store) { boardID := testBoardID - blocks, err := store.GetBlocksForBoard(boardID) + blocks, err := store.GetBlocks(model.QueryBlocksOptions{BoardID: boardID}) require.NoError(t, err) blocksToInsert := []*model.Block{ @@ -1082,12 +1091,20 @@ func testUndeleteBlockChildren(t *testing.T, store store.Store) { require.Nil(t, block) // ensure the card children were deleted - blocks, err := store.GetBlocksWithParentAndType(cardDelete.BoardID, cardDelete.ID, model.TypeText) + blocks, err := store.GetBlocks(model.QueryBlocksOptions{ + BoardID: cardDelete.BoardID, + ParentID: cardDelete.ID, + BlockType: model.TypeText}, + ) require.NoError(t, err) assert.Empty(t, blocks) // ensure the other card children remain. - blocks, err = store.GetBlocksWithParentAndType(cardKeep.BoardID, cardKeep.ID, model.TypeText) + blocks, err = store.GetBlocks(model.QueryBlocksOptions{ + BoardID: cardKeep.BoardID, + ParentID: cardKeep.ID, + BlockType: model.TypeText}, + ) require.NoError(t, err) assert.Len(t, blocks, len(blocksKeep)) @@ -1101,7 +1118,11 @@ func testUndeleteBlockChildren(t *testing.T, store store.Store) { require.NotNil(t, block) // ensure the card children were restored - blocks, err = store.GetBlocksWithParentAndType(cardDelete.BoardID, cardDelete.ID, model.TypeText) + blocks, err = store.GetBlocks(model.QueryBlocksOptions{ + BoardID: cardDelete.BoardID, + ParentID: cardDelete.ID, + BlockType: model.TypeText}, + ) require.NoError(t, err) assert.Len(t, blocks, len(blocksDelete)) }) @@ -1117,12 +1138,12 @@ func testUndeleteBlockChildren(t *testing.T, store store.Store) { require.Nil(t, board) // ensure all cards and blocks for the board were deleted - blocks, err := store.GetBlocksForBoard(boardDelete.ID) + blocks, err := store.GetBlocks(model.QueryBlocksOptions{BoardID: boardDelete.ID}) require.NoError(t, err) assert.Empty(t, blocks) // ensure the other board's cards and blocks remain. - blocks, err = store.GetBlocksForBoard(boardKeep.ID) + blocks, err = store.GetBlocks(model.QueryBlocksOptions{BoardID: boardKeep.ID}) require.NoError(t, err) assert.Len(t, blocks, len(blocksKeep)+len(cardsKeep)) @@ -1136,7 +1157,7 @@ func testUndeleteBlockChildren(t *testing.T, store store.Store) { require.NotNil(t, board) // ensure the board's cards and blocks were restored. - blocks, err = store.GetBlocksForBoard(boardDelete.ID) + blocks, err = store.GetBlocks(model.QueryBlocksOptions{BoardID: boardDelete.ID}) require.NoError(t, err) assert.Len(t, blocks, len(blocksDelete)+len(cardsDelete)) }) diff --git a/server/boards/services/store/storetests/data_retention.go b/server/boards/services/store/storetests/data_retention.go index 83901845ed..47b67b05d7 100644 --- a/server/boards/services/store/storetests/data_retention.go +++ b/server/boards/services/store/storetests/data_retention.go @@ -98,7 +98,7 @@ func LoadData(t *testing.T, store store.Store) { func testRunDataRetention(t *testing.T, store store.Store, batchSize int) { LoadData(t, store) - blocks, err := store.GetBlocksForBoard(boardID) + blocks, err := store.GetBlocks(model.QueryBlocksOptions{BoardID: boardID}) require.NoError(t, err) require.Len(t, blocks, 4) initialCount := len(blocks) @@ -115,7 +115,7 @@ func testRunDataRetention(t *testing.T, store store.Store, batchSize int) { require.True(t, deletions > int64(initialCount)) // expect all blocks to be deleted. - blocks, errBlocks := store.GetBlocksForBoard(boardID) + blocks, errBlocks := store.GetBlocks(model.QueryBlocksOptions{BoardID: boardID}) require.NoError(t, errBlocks) require.Equal(t, 0, len(blocks)) diff --git a/server/channels/api4/command.go b/server/channels/api4/command.go index baa3735637..5bce4b8169 100644 --- a/server/channels/api4/command.go +++ b/server/channels/api4/command.go @@ -353,7 +353,6 @@ func executeCommand(c *Context, w http.ResponseWriter, r *http.Request) { commandArgs.UserId = c.AppContext.Session().UserId commandArgs.T = c.AppContext.T commandArgs.SiteURL = c.GetSiteURLHeader() - commandArgs.Session = *c.AppContext.Session() response, err := c.App.ExecuteCommand(c.AppContext, &commandArgs) if err != nil { @@ -424,7 +423,6 @@ func listCommandAutocompleteSuggestions(c *Context, w http.ResponseWriter, r *ht RootId: query.Get("root_id"), UserId: c.AppContext.Session().UserId, T: c.AppContext.T, - Session: *c.AppContext.Session(), SiteURL: c.GetSiteURLHeader(), Command: userInput, } diff --git a/server/channels/api4/system.go b/server/channels/api4/system.go index 705f2680d3..00143beeb8 100644 --- a/server/channels/api4/system.go +++ b/server/channels/api4/system.go @@ -190,6 +190,8 @@ func getSystemPing(c *Context, w http.ResponseWriter, r *http.Request) { s["CanReceiveNotifications"] = c.App.SendTestPushNotification(deviceID) } + s["ActiveSearchBackend"] = c.App.ActiveSearchBackend() + if s[model.STATUS] != model.StatusOk { w.WriteHeader(http.StatusInternalServerError) } @@ -295,7 +297,7 @@ func databaseRecycle(c *Context, w http.ResponseWriter, r *http.Request) { return } - c.App.RecycleDatabaseConnection() + c.App.RecycleDatabaseConnection(c.AppContext) auditRec.Success() ReturnStatusOK(w) @@ -348,7 +350,7 @@ func queryLogs(c *Context, w http.ResponseWriter, r *http.Request) { return } - logs, logerr := c.App.QueryLogs(c.Params.Page, c.Params.LogsPerPage, logFilter) + logs, logerr := c.App.QueryLogs(c.AppContext, c.Params.Page, c.Params.LogsPerPage, logFilter) if logerr != nil { c.Err = logerr return @@ -387,7 +389,7 @@ func getLogs(c *Context, w http.ResponseWriter, r *http.Request) { return } - lines, appErr := c.App.GetLogs(c.Params.Page, c.Params.LogsPerPage) + lines, appErr := c.App.GetLogs(c.AppContext, c.Params.Page, c.Params.LogsPerPage) if appErr != nil { c.Err = appErr return diff --git a/server/channels/api4/team.go b/server/channels/api4/team.go index 510571f38d..0049b47c38 100644 --- a/server/channels/api4/team.go +++ b/server/channels/api4/team.go @@ -117,6 +117,11 @@ func createTeam(c *Context, w http.ResponseWriter, r *http.Request) { } } + if team.SchemeId != nil && !c.App.SessionHasPermissionTo(*c.AppContext.Session(), model.PermissionSysconsoleWriteUserManagementPermissions) { + c.SetPermissionError(model.PermissionSysconsoleWriteUserManagementPermissions) + return + } + rteam, err := c.App.CreateTeamWithUser(c.AppContext, &team, c.AppContext.Session().UserId) if err != nil { c.Err = err diff --git a/server/channels/api4/team_test.go b/server/channels/api4/team_test.go index 80d6839af4..f511ffe3f1 100644 --- a/server/channels/api4/team_test.go +++ b/server/channels/api4/team_test.go @@ -95,6 +95,39 @@ func TestCreateTeam(t *testing.T) { CheckForbiddenStatus(t, resp) }) + t.Run("should verify user permissions during team creation", func(t *testing.T) { + th.App.Srv().SetLicense(model.NewTestLicense("custom_permissions_schemes")) + th.App.SetPhase2PermissionsMigrationStatus(true) + + sc := th.SystemAdminClient + scheme, _, err := sc.CreateScheme(&model.Scheme{ + DisplayName: "dn_" + model.NewId(), + Name: model.NewId(), + Scope: model.SchemeScopeTeam, + }) + require.NoError(t, err) + + team, _, err := sc.CreateTeam(&model.Team{ + DisplayName: "dn_" + model.NewId(), + Name: GenerateTestTeamName(), + Email: th.GenerateTestEmail(), + Type: model.TeamOpen, + SchemeId: &scheme.Id, + }) + require.NoError(t, err) + require.Equal(t, scheme.Id, *team.SchemeId) + + _, r, err := th.Client.CreateTeam(&model.Team{ + DisplayName: "dn_" + model.NewId(), + Name: GenerateTestTeamName(), + Email: th.GenerateTestEmail(), + Type: model.TeamOpen, + SchemeId: &scheme.Id, + }) + require.Error(t, err) + CheckForbiddenStatus(t, r) + }) + t.Run("should take under consideration the server language when creating a new team", func(t *testing.T) { c := th.SystemAdminClient cfg, _, err := c.GetConfig() diff --git a/server/channels/app/admin.go b/server/channels/app/admin.go index 697e825812..fb3ab53000 100644 --- a/server/channels/app/admin.go +++ b/server/channels/app/admin.go @@ -11,17 +11,17 @@ import ( "time" "github.com/mattermost/mattermost-server/v6/model" + "github.com/mattermost/mattermost-server/v6/server/channels/app/request" "github.com/mattermost/mattermost-server/v6/server/platform/services/cache" "github.com/mattermost/mattermost-server/v6/server/platform/shared/i18n" "github.com/mattermost/mattermost-server/v6/server/platform/shared/mail" - "github.com/mattermost/mattermost-server/v6/server/platform/shared/mlog" ) var latestVersionCache = cache.NewLRU(cache.LRUOptions{ Size: 1, }) -func (s *Server) GetLogs(page, perPage int) ([]string, *model.AppError) { +func (s *Server) GetLogs(c request.CTX, page, perPage int) ([]string, *model.AppError) { var lines []string license := s.License() @@ -33,7 +33,7 @@ func (s *Server) GetLogs(page, perPage int) ([]string, *model.AppError) { lines = append(lines, "-----------------------------------------------------------------------------------------------------------") lines = append(lines, "-----------------------------------------------------------------------------------------------------------") } else { - mlog.Error("Could not get cluster info") + c.Logger().Error("Could not get cluster info") } } @@ -56,7 +56,7 @@ func (s *Server) GetLogs(page, perPage int) ([]string, *model.AppError) { return lines, nil } -func (s *Server) QueryLogs(page, perPage int, logFilter *model.LogFilter) (map[string][]string, *model.AppError) { +func (s *Server) QueryLogs(c request.CTX, page, perPage int, logFilter *model.LogFilter) (map[string][]string, *model.AppError) { logData := make(map[string][]string) serverName := "default" @@ -66,7 +66,7 @@ func (s *Server) QueryLogs(page, perPage int, logFilter *model.LogFilter) (map[s if info := s.platform.Cluster().GetMyClusterInfo(); info != nil { serverName = info.Hostname } else { - mlog.Error("Could not get cluster info") + c.Logger().Error("Could not get cluster info") } } @@ -111,12 +111,12 @@ func AddLocalLogs(logData map[string][]string, s *Server, page, perPage int, ser return nil } -func (a *App) QueryLogs(page, perPage int, logFilter *model.LogFilter) (map[string][]string, *model.AppError) { - return a.Srv().QueryLogs(page, perPage, logFilter) +func (a *App) QueryLogs(c request.CTX, page, perPage int, logFilter *model.LogFilter) (map[string][]string, *model.AppError) { + return a.Srv().QueryLogs(c, page, perPage, logFilter) } -func (a *App) GetLogs(page, perPage int) ([]string, *model.AppError) { - return a.Srv().GetLogs(page, perPage) +func (a *App) GetLogs(c request.CTX, page, perPage int) ([]string, *model.AppError) { + return a.Srv().GetLogs(c, page, perPage) } func (s *Server) GetLogsSkipSend(page, perPage int, logFilter *model.LogFilter) ([]string, *model.AppError) { @@ -146,15 +146,15 @@ func (s *Server) InvalidateAllCachesSkipSend() { } -func (a *App) RecycleDatabaseConnection() { - mlog.Info("Attempting to recycle database connections.") +func (a *App) RecycleDatabaseConnection(c request.CTX) { + c.Logger().Info("Attempting to recycle database connections.") // This works by setting 10 seconds as the max conn lifetime for all DB connections. // This allows in gradually closing connections as they expire. In future, we can think // of exposing this as a param from the REST api. a.Srv().Store().RecycleDBConnections(10 * time.Second) - mlog.Info("Finished recycling database connections.") + c.Logger().Info("Finished recycling database connections.") } func (a *App) TestSiteURL(siteURL string) *model.AppError { diff --git a/server/channels/app/app_iface.go b/server/channels/app/app_iface.go index eb30bc0779..b402409be2 100644 --- a/server/channels/app/app_iface.go +++ b/server/channels/app/app_iface.go @@ -264,8 +264,6 @@ type AppIface interface { // MoveChannel method is prone to data races if someone joins to channel during the move process. However this // function is only exposed to sysadmins and the possibility of this edge case is relatively small. MoveChannel(c request.CTX, team *model.Team, channel *model.Channel, user *model.User) *model.AppError - // NewWebConn returns a new WebConn instance. - NewWebConn(cfg *platform.WebConnConfig) *platform.WebConn // NotifySessionsExpired is called periodically from the job server to notify any mobile sessions that have expired. NotifySessionsExpired() error // OverrideIconURLIfEmoji changes the post icon override URL prop, if it has an emoji icon, @@ -402,6 +400,7 @@ type AppIface interface { VerifyPlugin(plugin, signature io.ReadSeeker) *model.AppError AccountMigration() einterfaces.AccountMigrationInterface ActivateMfa(userID, token string) *model.AppError + ActiveSearchBackend() string AddChannelsToRetentionPolicy(policyID string, channelIDs []string) *model.AppError AddConfigListener(listener func(*model.Config, *model.Config)) string AddDirectChannels(c request.CTX, teamID string, user *model.User) *model.AppError @@ -682,7 +681,7 @@ type AppIface interface { GetJobsPage(page int, perPage int) ([]*model.Job, *model.AppError) GetLatestTermsOfService() (*model.TermsOfService, *model.AppError) GetLatestVersion(latestVersionUrl string) (*model.GithubReleaseInfo, *model.AppError) - GetLogs(page, perPage int) ([]string, *model.AppError) + GetLogs(c request.CTX, page, perPage int) ([]string, *model.AppError) GetLogsSkipSend(page, perPage int, logFilter *model.LogFilter) ([]string, *model.AppError) GetMemberCountsByGroup(ctx context.Context, channelID string, includeTimezones bool) ([]*model.ChannelMemberCountByGroup, *model.AppError) GetMessageForNotification(post *model.Post, translateFunc i18n.TranslateFunc) string @@ -961,9 +960,9 @@ type AppIface interface { PublishUserTyping(userID, channelID, parentId string) *model.AppError PurgeBleveIndexes() *model.AppError PurgeElasticsearchIndexes() *model.AppError - QueryLogs(page, perPage int, logFilter *model.LogFilter) (map[string][]string, *model.AppError) + QueryLogs(c request.CTX, page, perPage int, logFilter *model.LogFilter) (map[string][]string, *model.AppError) ReadFile(path string) ([]byte, *model.AppError) - RecycleDatabaseConnection() + RecycleDatabaseConnection(c request.CTX) RegenCommandToken(cmd *model.Command) (*model.Command, *model.AppError) RegenOutgoingWebhookToken(hook *model.OutgoingWebhook) (*model.OutgoingWebhook, *model.AppError) RegenerateOAuthAppSecret(app *model.OAuthApp) (*model.OAuthApp, *model.AppError) diff --git a/server/channels/app/draft_test.go b/server/channels/app/draft_test.go index 4b52efd8e9..83c7d090d8 100644 --- a/server/channels/app/draft_test.go +++ b/server/channels/app/draft_test.go @@ -278,6 +278,7 @@ func TestGetDraftsForUser(t *testing.T) { assert.Nil(t, createDraftErr2) t.Run("get drafts", func(t *testing.T) { + t.Skip("MM-52088") draftResp, err := th.App.GetDraftsForUser(user.Id, th.BasicTeam.Id) assert.Nil(t, err) diff --git a/server/channels/app/opentracing/opentracing_layer.go b/server/channels/app/opentracing/opentracing_layer.go index 6e522bb971..48ff40a0ca 100644 --- a/server/channels/app/opentracing/opentracing_layer.go +++ b/server/channels/app/opentracing/opentracing_layer.go @@ -89,6 +89,23 @@ func (a *OpenTracingAppLayer) ActivateMfa(userID string, token string) *model.Ap return resultVar0 } +func (a *OpenTracingAppLayer) ActiveSearchBackend() string { + origCtx := a.ctx + span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.ActiveSearchBackend") + + a.ctx = newCtx + a.app.Srv().Store().SetContext(newCtx) + defer func() { + a.app.Srv().Store().SetContext(origCtx) + a.ctx = origCtx + }() + + defer span.Finish() + resultVar0 := a.app.ActiveSearchBackend() + + return resultVar0 +} + func (a *OpenTracingAppLayer) AddChannelMember(c request.CTX, userID string, channel *model.Channel, opts app.ChannelMemberOpts) (*model.ChannelMember, *model.AppError) { origCtx := a.ctx span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.AddChannelMember") @@ -7111,7 +7128,7 @@ func (a *OpenTracingAppLayer) GetLdapGroup(ldapGroupID string) (*model.Group, *m return resultVar0, resultVar1 } -func (a *OpenTracingAppLayer) GetLogs(page int, perPage int) ([]string, *model.AppError) { +func (a *OpenTracingAppLayer) GetLogs(c request.CTX, page int, perPage int) ([]string, *model.AppError) { origCtx := a.ctx span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.GetLogs") @@ -7123,7 +7140,7 @@ func (a *OpenTracingAppLayer) GetLogs(page int, perPage int) ([]string, *model.A }() defer span.Finish() - resultVar0, resultVar1 := a.app.GetLogs(page, perPage) + resultVar0, resultVar1 := a.app.GetLogs(c, page, perPage) if resultVar1 != nil { span.LogFields(spanlog.Error(resultVar1)) @@ -12761,23 +12778,6 @@ func (a *OpenTracingAppLayer) NewPluginAPI(c *request.Context, manifest *model.M return resultVar0 } -func (a *OpenTracingAppLayer) NewWebConn(cfg *platform.WebConnConfig) *platform.WebConn { - origCtx := a.ctx - span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.NewWebConn") - - a.ctx = newCtx - a.app.Srv().Store().SetContext(newCtx) - defer func() { - a.app.Srv().Store().SetContext(origCtx) - a.ctx = origCtx - }() - - defer span.Finish() - resultVar0 := a.app.NewWebConn(cfg) - - return resultVar0 -} - func (a *OpenTracingAppLayer) NotifyAndSetWarnMetricAck(warnMetricId string, sender *model.User, forceAck bool, isBot bool) *model.AppError { origCtx := a.ctx span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.NotifyAndSetWarnMetricAck") @@ -13624,7 +13624,7 @@ func (a *OpenTracingAppLayer) PurgeElasticsearchIndexes() *model.AppError { return resultVar0 } -func (a *OpenTracingAppLayer) QueryLogs(page int, perPage int, logFilter *model.LogFilter) (map[string][]string, *model.AppError) { +func (a *OpenTracingAppLayer) QueryLogs(c request.CTX, page int, perPage int, logFilter *model.LogFilter) (map[string][]string, *model.AppError) { origCtx := a.ctx span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.QueryLogs") @@ -13636,7 +13636,7 @@ func (a *OpenTracingAppLayer) QueryLogs(page int, perPage int, logFilter *model. }() defer span.Finish() - resultVar0, resultVar1 := a.app.QueryLogs(page, perPage, logFilter) + resultVar0, resultVar1 := a.app.QueryLogs(c, page, perPage, logFilter) if resultVar1 != nil { span.LogFields(spanlog.Error(resultVar1)) @@ -13668,7 +13668,7 @@ func (a *OpenTracingAppLayer) ReadFile(path string) ([]byte, *model.AppError) { return resultVar0, resultVar1 } -func (a *OpenTracingAppLayer) RecycleDatabaseConnection() { +func (a *OpenTracingAppLayer) RecycleDatabaseConnection(c request.CTX) { origCtx := a.ctx span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.RecycleDatabaseConnection") @@ -13680,7 +13680,7 @@ func (a *OpenTracingAppLayer) RecycleDatabaseConnection() { }() defer span.Finish() - a.app.RecycleDatabaseConnection() + a.app.RecycleDatabaseConnection(c) } func (a *OpenTracingAppLayer) RegenCommandToken(cmd *model.Command) (*model.Command, *model.AppError) { diff --git a/server/channels/app/plugin.go b/server/channels/app/plugin.go index 210002a3ff..64e9d176f9 100644 --- a/server/channels/app/plugin.go +++ b/server/channels/app/plugin.go @@ -352,7 +352,7 @@ func (ch *Channels) syncPlugins() *model.AppError { } mlog.Info("Syncing plugin from file store", mlog.String("bundle", plugin.path)) - if _, err := ch.installPluginLocally(reader, signature, installPluginLocallyAlways); err != nil { + if _, err := ch.installPluginLocally(reader, signature, installPluginLocallyAlways); err != nil && err.Id != "app.plugin.blocked.app_error" && err.Id != "app.plugin.skip_installation.app_error" { mlog.Error("Failed to sync plugin from file store", mlog.String("bundle", plugin.path), mlog.Err(err)) } }(plugin) @@ -952,6 +952,11 @@ func (ch *Channels) processPrepackagedPlugins(pluginsDir string) []*plugin.Prepa defer wg.Done() p, err := ch.processPrepackagedPlugin(psPath) if err != nil { + var appErr *model.AppError + // A log line already appears if the plugin is on the blocklist + if errors.As(err, &appErr) && (appErr.Id == "app.plugin.blocked.app_error" || appErr.Id == "app.plugin.skip_installation.app_error") { + return + } mlog.Error("Failed to install prepackaged plugin", mlog.String("path", psPath.path), mlog.Err(err)) return } diff --git a/server/channels/app/plugin_install.go b/server/channels/app/plugin_install.go index 5db3e2cb77..2d666c7d47 100644 --- a/server/channels/app/plugin_install.go +++ b/server/channels/app/plugin_install.go @@ -92,7 +92,10 @@ func (ch *Channels) installPluginFromData(data model.PluginEventData) { manifest, appErr := ch.installPluginLocally(reader, signature, installPluginLocallyAlways) if appErr != nil { - mlog.Error("Failed to sync plugin from file store", mlog.String("bundle", plugin.path), mlog.Err(appErr)) + // A log line already appears if the plugin is on the blocklist or skipped + if appErr.Id != "app.plugin.blocked.app_error" && appErr.Id != "app.plugin.skip_installation.app_error" { + mlog.Error("Failed to sync plugin from file store", mlog.String("bundle", plugin.path), mlog.Err(appErr)) + } return } @@ -330,8 +333,8 @@ func (ch *Channels) installExtractedPlugin(manifest *model.Manifest, fromPluginD // Check plugin id is not blocked if plugin.PluginIDIsBlocked(manifest.Id) { - mlog.Debug("Skipping installation of plugin since plugin is on blocklist", mlog.String("plugin_id", manifest.Id)) - return nil, nil + mlog.Debug("Skipping installation of plugin since plugin is on blocklist. Some plugins are blocked because they are built into this version of Mattermost.", mlog.String("plugin_id", manifest.Id)) + return nil, model.NewAppError("installExtractedPlugin", "app.plugin.blocked.app_error", map[string]any{"Id": manifest.Id}, "", http.StatusInternalServerError) } // Check for plugins installed with the same ID. @@ -365,7 +368,7 @@ func (ch *Channels) installExtractedPlugin(manifest *model.Manifest, fromPluginD if version.LTE(existingVersion) { mlog.Debug("Skipping local installation of plugin since existing version is newer", mlog.String("plugin_id", manifest.Id)) - return nil, nil + return nil, model.NewAppError("installExtractedPlugin", "app.plugin.skip_installation.app_error", map[string]any{"Id": manifest.Id}, "", http.StatusInternalServerError) } } diff --git a/server/channels/app/plugin_install_test.go b/server/channels/app/plugin_install_test.go index 5fde414bd6..ecbb75e164 100644 --- a/server/channels/app/plugin_install_test.go +++ b/server/channels/app/plugin_install_test.go @@ -172,10 +172,9 @@ func TestInstallPluginLocally(t *testing.T) { defer th.TearDown() cleanExistingBundles(t, th) - manifest, appErr := installPlugin(t, th, "playbooks", "0.0.1", installPluginLocallyAlways) - require.Nil(t, appErr) - require.Nil(t, manifest) - + _, appErr := installPlugin(t, th, "playbooks", "0.0.1", installPluginLocallyAlways) + require.NotNil(t, appErr) + require.Equal(t, "app.plugin.blocked.app_error", appErr.Id) assertBundleInfoManifests(t, th, []*model.Manifest{}) }) @@ -222,9 +221,9 @@ func TestInstallPluginLocally(t *testing.T) { require.Nil(t, appErr) require.NotNil(t, existingManifest) - manifest, appErr := installPlugin(t, th, "valid", "0.0.1", installPluginLocallyOnlyIfNewOrUpgrade) - require.Nil(t, appErr) - require.Nil(t, manifest) + _, appErr = installPlugin(t, th, "valid", "0.0.1", installPluginLocallyOnlyIfNewOrUpgrade) + require.NotNil(t, appErr) + require.Equal(t, "app.plugin.skip_installation.app_error", appErr.Id) assertBundleInfoManifests(t, th, []*model.Manifest{existingManifest}) }) @@ -238,9 +237,9 @@ func TestInstallPluginLocally(t *testing.T) { require.Nil(t, appErr) require.NotNil(t, existingManifest) - manifest, appErr := installPlugin(t, th, "valid", "0.0.2", installPluginLocallyOnlyIfNewOrUpgrade) - require.Nil(t, appErr) - require.Nil(t, manifest) + _, appErr = installPlugin(t, th, "valid", "0.0.2", installPluginLocallyOnlyIfNewOrUpgrade) + require.NotNil(t, appErr) + require.Equal(t, "app.plugin.skip_installation.app_error", appErr.Id) assertBundleInfoManifests(t, th, []*model.Manifest{existingManifest}) }) diff --git a/server/channels/app/post_metadata.go b/server/channels/app/post_metadata.go index 460354eaa5..9048f3c5d3 100644 --- a/server/channels/app/post_metadata.go +++ b/server/channels/app/post_metadata.go @@ -4,6 +4,7 @@ package app import ( + "bufio" "bytes" "fmt" "image" @@ -764,7 +765,24 @@ func cacheLinkMetadata(requestURL string, timestamp int64, og *opengraph.OpenGra platform.LinkCache().SetWithExpiry(strconv.FormatInt(model.GenerateLinkMetadataHash(requestURL, timestamp), 16), metadata, platform.LinkCacheDuration) } +// peekContentType peeks at the first 512 bytes of p, and attempts to detect +// the content type. Returns empty string if error occurs. +func peekContentType(p *bufio.Reader) string { + byt, err := p.Peek(512) + if err != nil && err != bufio.ErrBufferFull && err != io.EOF { + return "" + } + return http.DetectContentType(byt) +} + func (a *App) parseLinkMetadata(requestURL string, body io.Reader, contentType string) (*opengraph.OpenGraph, *model.PostImage, error) { + if contentType == "" { + bufRd := bufio.NewReader(body) + // If the content-type is missing we try to detect it from the actual data. + contentType = peekContentType(bufRd) + body = bufRd + } + if contentType == "image/svg+xml" { image := &model.PostImage{ Format: "svg", diff --git a/server/channels/app/post_metadata_test.go b/server/channels/app/post_metadata_test.go index 8ee5f71d3b..9b3e0602fa 100644 --- a/server/channels/app/post_metadata_test.go +++ b/server/channels/app/post_metadata_test.go @@ -2595,6 +2595,18 @@ func TestParseLinkMetadata(t *testing.T) { }, dimensions) }) + t.Run("image with no content-type given", func(t *testing.T) { + og, dimensions, err := th.App.parseLinkMetadata(imageURL, makeImageReader(), "") + assert.NoError(t, err) + + assert.Nil(t, og) + assert.Equal(t, &model.PostImage{ + Format: "png", + Width: 408, + Height: 336, + }, dimensions) + }) + t.Run("malformed image", func(t *testing.T) { og, dimensions, err := th.App.parseLinkMetadata(imageURL, makeOpenGraphReader(), "image/png") assert.Error(t, err) diff --git a/server/channels/app/searchengine.go b/server/channels/app/searchengine.go index d441662a5f..345edefb05 100644 --- a/server/channels/app/searchengine.go +++ b/server/channels/app/searchengine.go @@ -60,3 +60,7 @@ func (a *App) PurgeBleveIndexes() *model.AppError { } return nil } + +func (a *App) ActiveSearchBackend() string { + return a.ch.srv.platform.SearchEngine.ActiveEngine() +} diff --git a/server/channels/app/server.go b/server/channels/app/server.go index 6197c6c55b..65c3dbf371 100644 --- a/server/channels/app/server.go +++ b/server/channels/app/server.go @@ -260,8 +260,17 @@ func NewServer(options ...Option) (*Server, error) { product.CommandKey: app, } - // Step 4: Initialize products. - // Depends on s.httpService. + // It is important to initialize the hub only after the global logger is set + // to avoid race conditions while logging from inside the hub. + // Step 4: Start platform + s.platform.Start() + + // NOTE: There should be no call to App.Srv().Channels() before step 5 is done + // otherwise it will throw a panic. + + // Step 5: Initialize products. + // Depends on s.httpService, and depends on the hub to be initialized. + // Otherwise we run into race conditions. err = s.initializeProducts(product.GetProducts(), serviceMap) if err != nil { return nil, errors.Wrap(err, "failed to initialize products") @@ -275,11 +284,6 @@ func NewServer(options ...Option) (*Server, error) { } app.ch = channelsWrapper.app.ch - // It is important to initialize the hub only after the global logger is set - // to avoid race conditions while logging from inside the hub. - // Step 5: Start hub in platform which the hub depends on s.Channels() (step 4) - s.platform.Start() - // ------------------------------------------------------------------------- // Everything below this is not order sensitive and safe to be moved around. // If you are adding a new field that is non-channels specific, please add diff --git a/server/channels/app/web_conn.go b/server/channels/app/web_conn.go index f0c4bb94c5..43f1255cd9 100644 --- a/server/channels/app/web_conn.go +++ b/server/channels/app/web_conn.go @@ -13,8 +13,3 @@ import ( func (a *App) PopulateWebConnConfig(s *model.Session, cfg *platform.WebConnConfig, seqVal string) (*platform.WebConnConfig, error) { return a.Srv().Platform().PopulateWebConnConfig(s, cfg, seqVal) } - -// NewWebConn returns a new WebConn instance. -func (a *App) NewWebConn(cfg *platform.WebConnConfig) *platform.WebConn { - return a.Srv().Platform().NewWebConn(cfg, a, a.ch) -} diff --git a/server/channels/app/work_template_executor.go b/server/channels/app/work_template_executor.go index 400193ae02..a290434b37 100644 --- a/server/channels/app/work_template_executor.go +++ b/server/channels/app/work_template_executor.go @@ -10,7 +10,7 @@ import ( "regexp" "strings" - pbclient "github.com/mattermost/mattermost-plugin-playbooks/client" + pbclient "github.com/mattermost/mattermost-server/v6/server/playbooks/client" fb_model "github.com/mattermost/mattermost-server/v6/server/boards/model" diff --git a/server/channels/app/work_templates_test.go b/server/channels/app/work_templates_test.go index 1f67662f7a..6d90b33665 100644 --- a/server/channels/app/work_templates_test.go +++ b/server/channels/app/work_templates_test.go @@ -17,7 +17,7 @@ import ( "github.com/mattermost/mattermost-server/v6/server/channels/app/request" "github.com/mattermost/mattermost-server/v6/server/channels/app/worktemplates" - pbclient "github.com/mattermost/mattermost-plugin-playbooks/client" + pbclient "github.com/mattermost/mattermost-server/v6/server/playbooks/client" ) func TestGetWorkTemplateCategories(t *testing.T) { diff --git a/server/channels/app/worktemplates/model.go b/server/channels/app/worktemplates/model.go index 4d9699509b..88223820d3 100644 --- a/server/channels/app/worktemplates/model.go +++ b/server/channels/app/worktemplates/model.go @@ -6,7 +6,7 @@ import ( "errors" "net/http" - pbclient "github.com/mattermost/mattermost-plugin-playbooks/client" + pbclient "github.com/mattermost/mattermost-server/v6/server/playbooks/client" "github.com/mattermost/mattermost-server/v6/model" ) diff --git a/server/channels/app/worktemplates/model_test.go b/server/channels/app/worktemplates/model_test.go index ae6126f9d1..53e737a55c 100644 --- a/server/channels/app/worktemplates/model_test.go +++ b/server/channels/app/worktemplates/model_test.go @@ -10,7 +10,7 @@ import ( "github.com/mattermost/mattermost-server/v6/model" - pbclient "github.com/mattermost/mattermost-plugin-playbooks/client" + pbclient "github.com/mattermost/mattermost-server/v6/server/playbooks/client" ) func TestCanBeExecuted(t *testing.T) { diff --git a/server/i18n/en.json b/server/i18n/en.json index e91fbf2656..5f8740a548 100644 --- a/server/i18n/en.json +++ b/server/i18n/en.json @@ -5931,6 +5931,10 @@ "id": "app.oauth.update_app.updating.app_error", "translation": "We encountered an error updating the app." }, + { + "id": "app.plugin.blocked.app_error", + "translation": "Plugin {{.Id}} is on the block list. Some plugins are blocked because they are built into this version of Mattermost." + }, { "id": "app.plugin.cluster.save_config.app_error", "translation": "The plugin configuration in your config.json file must be updated manually when using ReadOnlyConfig with clustering enabled." @@ -6063,6 +6067,10 @@ "id": "app.plugin.signature_decode.app_error", "translation": "Unable to decode base64 signature." }, + { + "id": "app.plugin.skip_installation.app_error", + "translation": "Skipping installation of plugin {{.Id}} since existing version is equal or newer." + }, { "id": "app.plugin.store_bundle.app_error", "translation": "Unable to store the plugin to the configured file store." @@ -7787,6 +7795,10 @@ "id": "ent.elasticsearch.indexer.index_batch.nothing_left_to_index.error", "translation": "Trying to index a new batch when all the entities are completed" }, + { + "id": "ent.elasticsearch.max_version.app_error", + "translation": "Elasticsearch version {{.Version}} is higher than max supported version of {{.MaxVersion}}" + }, { "id": "ent.elasticsearch.not_started.error", "translation": "Elasticsearch is not started" @@ -7855,10 +7867,6 @@ "id": "ent.elasticsearch.search_users.unmarshall_user_failed", "translation": "Failed to decode search results" }, - { - "id": "ent.elasticsearch.start.already_started.app_error", - "translation": "Elasticsearch is already started." - }, { "id": "ent.elasticsearch.start.create_bulk_processor_failed.app_error", "translation": "Failed to create Elasticsearch bulk processor." diff --git a/server/i18n/en_AU.json b/server/i18n/en_AU.json index 8a71e91c0d..c1c5da8290 100644 --- a/server/i18n/en_AU.json +++ b/server/i18n/en_AU.json @@ -9837,5 +9837,337 @@ { "id": "api.templates.license_up_for_renewal_contact_sales", "translation": "Contact Sales" + }, + { + "id": "worktemplate.product_teams.sprint_planning.integration", + "translation": "Increase productivity in your channel by integrating your most commonly used tools such as Zoom. These will be downloaded for you." + }, + { + "id": "worktemplate.product_teams.sprint_planning.channel", + "translation": "Chat with your team in a channel that connects easily with your boards and integrations." + }, + { + "id": "worktemplate.product_teams.sprint_planning.board", + "translation": "Track your team's progress toward weekly goals with sprint breakdowns, prioritisation, owner assignment and comments." + }, + { + "id": "worktemplate.product_teams.product_roadmap.channel", + "translation": "Chat with your team about your customers' feedback, prioritisation and get aligned on progress together." + }, + { + "id": "worktemplate.product_teams.product_roadmap.board", + "translation": "Use the Product Roadmap board to manage user feedback, assign resources, view deliverables in a calendar view and prioritise issues." + }, + { + "id": "worktemplate.product_teams.goals_and_okrs.integration", + "translation": "Increase productivity in your channel by integrating your most commonly used tools such as Zoom to facilitate easy collaboration. These will be downloaded for you." + }, + { + "id": "worktemplate.product_teams.goals_and_okrs.channel", + "translation": "Chat about your goals and progress with your team, async or real-time and stay up to date with changes in a single channel." + }, + { + "id": "worktemplate.product_teams.goals_and_okrs.board", + "translation": "Track your team's progress toward organisational goals with the Goals and OKR board. Keep meetings on track with the Meeting Agenda board." + }, + { + "id": "worktemplate.product_teams.feature_release.description.board", + "translation": "Keep meetings on track with the Meeting Agenda board. Manage your workload with the Project Tasks board." + }, + { + "id": "worktemplate.product_teams.bug_bash.playbook", + "translation": "Use checklists to assign testing areas and automated tasks to run a comprehensive bug bash process. Use a retrospective to review your process and improve it for next time." + }, + { + "id": "worktemplate.product_teams.bug_bash.integration", + "translation": "Increase productivity in your channel by integrating your most commonly used tools such as Jira to track your bug bash progress. These will be downloaded for you." + }, + { + "id": "worktemplate.product_teams.bug_bash.channel", + "translation": "Plan and manage bug reports and resolutions in a single channel that’s easily accessible to your team and organisation." + }, + { + "id": "worktemplate.leadership.goals_and_okrs.integration", + "translation": "Increase productivity in your channel by integrating your most commonly used tools such as Zoom to facilitate easy collaboration. These will be downloaded for you." + }, + { + "id": "worktemplate.leadership.goals_and_okrs.channel", + "translation": "Chat about your goals and progress with your team, async or real-time and stay up to date with changes in a single channel." + }, + { + "id": "worktemplate.leadership.goals_and_okrs.board", + "translation": "Track your team's progress toward organisational goals with the Goals and OKR board. Keep meetings on track with the Meeting Agenda board." + }, + { + "id": "worktemplate.devops.product_release.playbook", + "translation": "Create repeatable workflows that are easy to follow and implement so product releases are reliable and on time." + }, + { + "id": "worktemplate.devops.product_release.channel", + "translation": "Chat with your team about daily milestones, any blockers and changes to deliverables, easily and quickly." + }, + { + "id": "worktemplate.devops.product_release.board", + "translation": "Use the Product Release board to support your release timeframe and process, ensuring everyone knows which tasks are due." + }, + { + "id": "worktemplate.devops.incident_resolution.description.playbook", + "translation": "Use checklists and automation to bring in key team members and share how your incident is tracking toward resolution." + }, + { + "id": "worktemplate.devops.incident_resolution.description.channel", + "translation": "Chat with your team about priorities, add stakeholders, provide updates and work toward a resolution in a single channel." + }, + { + "id": "worktemplate.devops.incident_resolution.description.board", + "translation": "Use the Incident Resolution board to support repeatable processes and assign defined tasks across the team." + }, + { + "id": "worktemplate.companywide.goals_and_okrs.integration", + "translation": "Increase productivity in your channel by integrating your most commonly used tools such as Zoom to facilitate easy collaboration. These will be downloaded for you." + }, + { + "id": "worktemplate.companywide.goals_and_okrs.channel", + "translation": "Chat about your goals and progress with your team, async or real-time and stay up to date with changes in a single channel." + }, + { + "id": "worktemplate.companywide.goals_and_okrs.board", + "translation": "Track your team's progress toward organisational goals with the Goals and OKR board. Keep meetings on track with the Meeting Agenda board." + }, + { + "id": "worktemplate.companywide.create_project.integration", + "translation": "Increase productivity in your channel by integrating your most commonly used tools. These will be downloaded for you." + }, + { + "id": "worktemplate.companywide.create_project.channel", + "translation": "Chat with your team about your new project and decide how you’re going to structure it in a collaborative channel." + }, + { + "id": "worktemplate.companywide.create_project.board", + "translation": "Use a Kanban board to define and track your project tasks and progress." + }, + { + "id": "model.license_record.is_valid.bytes.app_error", + "translation": "Invalid value for bytes when uploading a licence." + }, + { + "id": "app.user.run.update_status.title", + "translation": "Status update" + }, + { + "id": "app.user.run.update_status.submit_label", + "translation": "Update status" + }, + { + "id": "app.user.run.update_status.reminder_for_next_update", + "translation": "Reminder for next update" + }, + { + "id": "app.user.run.update_status.num_channel", + "translation": { + "one": "Provide an update to the stakeholders. This post will be broadcasted to {{.Count}} channel.", + "other": "Provide an update to the stakeholders. This post will be broadcasted to {{.Count}} channels." + } + }, + { + "id": "app.user.run.update_status.finish_run.placeholder", + "translation": "Also mark the run as finished" + }, + { + "id": "app.user.run.update_status.finish_run", + "translation": "Finish run" + }, + { + "id": "app.user.run.update_status.change_since_last_update", + "translation": "Change since last update" + }, + { + "id": "app.user.run.status_enable", + "translation": "@{{.Username}} enabled the status updates for [{{.RunName}}]({{.RunURL}})" + }, + { + "id": "app.user.run.status_disable", + "translation": "@{{.Username}} disabled the status updates for [{{.RunName}}]({{.RunURL}})" + }, + { + "id": "app.user.run.request_update", + "translation": "@here — @{{.Name}} requested a status update for [{{.RunName}}]({{.RunURL}}). \n" + }, + { + "id": "app.user.run.request_join_channel", + "translation": "@{{.Name}} is a run participant and wants join this channel. Any member of the channel can invite them.\n" + }, + { + "id": "app.user.run.confirm_finish.title", + "translation": "Confirm finish run" + }, + { + "id": "app.user.run.confirm_finish.submit_label", + "translation": "Finish run" + }, + { + "id": "app.user.run.confirm_finish.num_outstanding", + "translation": { + "one": "There is **{{.Count}} outstanding task**. Are you sure you want to finish the run *{{.RunName}}* for all participants?", + "other": "There are **{{.Count}} outstanding tasks**. Are you sure you want to finish the run *{{.RunName}}* for all participants?" + } + }, + { + "id": "app.user.run.add_to_timeline.title", + "translation": "Add to run timeline" + }, + { + "id": "app.user.run.add_to_timeline.summary.placeholder", + "translation": "Short summary shown in the timeline" + }, + { + "id": "app.user.run.add_to_timeline.summary.help", + "translation": "Max 64 characters" + }, + { + "id": "app.user.run.add_to_timeline.summary", + "translation": "Summary" + }, + { + "id": "app.user.run.add_to_timeline.submit_label", + "translation": "Add to run timeline" + }, + { + "id": "app.user.run.add_to_timeline.playbook_run", + "translation": "Playbook Run" + }, + { + "id": "app.user.run.add_checklist_item.title", + "translation": "Add new task" + }, + { + "id": "app.user.run.add_checklist_item.submit_label", + "translation": "Add task" + }, + { + "id": "app.user.run.add_checklist_item.name", + "translation": "Name" + }, + { + "id": "app.user.run.add_checklist_item.description", + "translation": "Description" + }, + { + "id": "app.user.new_run.title", + "translation": "Run playbook" + }, + { + "id": "app.user.new_run.submit_label", + "translation": "Start run" + }, + { + "id": "app.user.new_run.run_name", + "translation": "Run name" + }, + { + "id": "app.user.new_run.playbook", + "translation": "Playbook" + }, + { + "id": "app.user.new_run.intro", + "translation": "**Owner** {{.Username}}" + }, + { + "id": "app.user.digest.tasks.zero_assigned", + "translation": "You have 0 assigned tasks." + }, + { + "id": "app.user.digest.tasks.num_assigned_due_until_today", + "translation": { + "one": "You have {{.Count}} assigned task that is now due:", + "other": "You have {{.Count}} assigned tasks that are now due:" + } + }, + { + "id": "app.user.digest.tasks.num_assigned", + "translation": { + "one": "You have {{.Count}} assigned task:", + "other": "You have {{.Count}} total assigned tasks:" + } + }, + { + "id": "app.user.digest.tasks.heading", + "translation": "Your assigned tasks" + }, + { + "id": "app.user.digest.tasks.due_yesterday", + "translation": "Due yesterday" + }, + { + "id": "app.user.digest.tasks.due_x_days_ago", + "translation": "Due {{.Count}} days ago" + }, + { + "id": "app.user.digest.tasks.due_today", + "translation": "Due today" + }, + { + "id": "app.user.digest.tasks.due_in_x_days", + "translation": { + "one": "Due in {{.Count}} day", + "other": "Due in {{.Count}} days" + } + }, + { + "id": "app.user.digest.tasks.due_after_today", + "translation": { + "one": "You have **{{.Count}} assigned task due after today**.", + "other": "You have **{{.Count}} assigned tasks due after today**." + } + }, + { + "id": "app.user.digest.tasks.all_tasks_command", + "translation": "Please use `/playbook todo` to see all your tasks." + }, + { + "id": "app.user.digest.runs_in_progress.zero_in_progress", + "translation": "You have 0 runs currently in progress." + }, + { + "id": "app.user.digest.runs_in_progress.num_in_progress", + "translation": { + "one": "You have {{.Count}} run currently in progress:", + "other": "You have {{.Count}} runs currently in progress:" + } + }, + { + "id": "app.user.digest.runs_in_progress.heading", + "translation": "Runs in Progress" + }, + { + "id": "app.user.digest.overdue_status_updates.zero_overdue", + "translation": "You have 0 runs overdue." + }, + { + "id": "app.user.digest.overdue_status_updates.num_overdue", + "translation": { + "one": "You have {{.Count}} run overdue for a status update:", + "other": "You have {{.Count}} runs overdue for a status update:" + } + }, + { + "id": "app.user.digest.overdue_status_updates.heading", + "translation": "Overdue Status Updates" + }, + { + "id": "app.oauth.remove_auth_data_by_client_id.app_error", + "translation": "Unable to remove OAuth data." + }, + { + "id": "app.command.execute.error", + "translation": "Unable to execute command." + }, + { + "id": "api.server.cws.subscribe_to_newsletter.app_error", + "translation": "CWS Server failed to subscribe to newsletter." + }, + { + "id": "api.license.request-trial.bad-request.business-email", + "translation": "Invalid business email for trial" } ] diff --git a/server/i18n/nl.json b/server/i18n/nl.json index 95097c7095..2e19d757c6 100644 --- a/server/i18n/nl.json +++ b/server/i18n/nl.json @@ -9829,5 +9829,45 @@ { "id": "api.templates.license_up_for_renewal_contact_sales", "translation": "Contacteer de verkoopsafdeling" + }, + { + "id": "app.user.digest.tasks.due_today", + "translation": "Vandaag te voldoen" + }, + { + "id": "app.user.digest.tasks.all_tasks_command", + "translation": "Gebruik `/playbook todo` om al je taken te zien." + }, + { + "id": "app.user.digest.runs_in_progress.zero_in_progress", + "translation": "Je hebt momenteel 0 runs lopen." + }, + { + "id": "app.user.digest.runs_in_progress.heading", + "translation": "Runs in uitvoering" + }, + { + "id": "app.user.digest.overdue_status_updates.zero_overdue", + "translation": "Je hebt 0 runs achterstand." + }, + { + "id": "app.user.digest.overdue_status_updates.heading", + "translation": "Achterstallige statusupdates" + }, + { + "id": "app.command.execute.error", + "translation": "Kan commando niet uitvoeren." + }, + { + "id": "api.server.cws.subscribe_to_newsletter.app_error", + "translation": "CWS-server kan zich niet abonneren op nieuwsbrief." + }, + { + "id": "api.server.cws.needs_enterprise_edition", + "translation": "Dienst alleen beschikbaar in Mattermost Enterprise editie" + }, + { + "id": "api.license.request-trial.bad-request.business-email", + "translation": "Ongeldig zakelijk e-mailadres voor proefperiode" } ] diff --git a/server/i18n/tr.json b/server/i18n/tr.json index 218846ffc4..fd34c87165 100644 --- a/server/i18n/tr.json +++ b/server/i18n/tr.json @@ -1505,7 +1505,7 @@ }, { "id": "api.slackimport.slack_add_channels.added", - "translation": "\nKanallar eklendi:\n" + "translation": "\nEklenen kanallar:\n" }, { "id": "api.slackimport.slack_add_channels.failed_to_add_user", @@ -1521,7 +1521,7 @@ }, { "id": "api.slackimport.slack_add_users.created", - "translation": "\nKullanıcılar eklendi:\n" + "translation": "\nEklenen kullanıcılar:\n" }, { "id": "api.slackimport.slack_add_users.email_pwd", @@ -9508,7 +9508,7 @@ }, { "id": "worktemplate.category.product_teams", - "translation": "Ürün takımları" + "translation": "Ürün" }, { "id": "model.draft.is_valid.user_id.app_error", @@ -9833,5 +9833,345 @@ { "id": "api.command_templates.desc", "translation": "Kalıptan oluştur penceresini aç" + }, + { + "id": "worktemplate.product_teams.sprint_planning.board", + "translation": "Acil sorunlar, önceliklendirme, sahip atama ve yorumlarla ekibinizin haftalık hedeflere doğru ilerlemesini izleyin." + }, + { + "id": "worktemplate.product_teams.sprint_planning.integration", + "translation": "Zoom gibi sık kullandığınız araçlar ile bütünleştirerek kanalınızdaki üretkenliği artırın. Bunlar sizin için indirilir." + }, + { + "id": "worktemplate.product_teams.sprint_planning.channel", + "translation": "Panolarınız ve bütünleştirmelerinizle kolayca bağlantı kuran bir kanalda ekibinizle sohbet edin." + }, + { + "id": "worktemplate.product_teams.product_roadmap.channel", + "translation": "Müşterilerinizin geri bildirimleri ve önceliklendirme hakkında ekibinizle sohbet ederek birlikte ilerleme kaydedin." + }, + { + "id": "worktemplate.product_teams.product_roadmap.board", + "translation": "Kullanıcı geri bildirimlerini yönetmek, kaynak atamak, çıktıları takvimde görüntülemek ve sorunları önceliklendirmek için ürün yol haritası panosunu kullanın." + }, + { + "id": "worktemplate.product_teams.goals_and_okrs.integration", + "translation": "İşbirliğini kolaylaştırmak için Zoom gibi sık kullandığınız araçları bütünleştirin ve kanalınızdaki üretkenliği artırın. Bunlar sizin için indirilir." + }, + { + "id": "worktemplate.product_teams.goals_and_okrs.channel", + "translation": "Hedefleriniz ve ilerlemeniz hakkında ekibinizle farklı zamanlarda ya da gerçek zamanlı olarak sohbet edin ve değişiklikleri tek bir kanaldan izleyerek güncel kalın." + }, + { + "id": "worktemplate.product_teams.goals_and_okrs.board", + "translation": "Amaçlar ve anahtar sonuçlar (OKR) panosu ile ekibinizin kurumsal hedeflere doğru ilerlemesini izleyin. Toplantı gündemi panosu ile toplantıları izleyin." + }, + { + "id": "worktemplate.product_teams.feature_release.description.playbook", + "translation": "Özellik geliştirme sürecinizi destekleyen görev kontrol listeleri ve otomasyon ile işlevsel ekipler arasında işbirliğini artırın. İşiniz bittiğinde bir geçmiş değerlendirmesi yaparak ve süreci bir sonraki sürümünüz için iyileştirin." + }, + { + "id": "worktemplate.product_teams.feature_release.description.integration", + "translation": "Özellikleri yayınlamak için GitHub gibi sık kullandığınız araçları bütünleştirin ve kanalınızdaki üretkenliği artırın. Bunlar sizin için indirilir." + }, + { + "id": "worktemplate.product_teams.feature_release.description.channel", + "translation": "Panolarınıza, senaryolarınıza ve diğer bütünleştirmelere kolayca bağlanan bir kanalda sürüm engelleyicileri ve değişiklikler hakkında ekibinizle sohbet edin." + }, + { + "id": "worktemplate.product_teams.feature_release.description.board", + "translation": "Toplantı gündemi panosu ile toplantıları izleyin. Proje görevleri panosu ile iş yükünüzü yönetin." + }, + { + "id": "worktemplate.product_teams.bug_bash.playbook", + "translation": "Kapsamlı bir hata ayıklama süreci yürütmek için deneme alanları ve otomatik görevler atamak üzere kontrol listeleri kullanın. Sürecinizi gözden geçirmek ve gelecek sefer daha iyi olmasını sağlamak için bir geçmiş değerlendirmesi yapın." + }, + { + "id": "worktemplate.product_teams.bug_bash.integration", + "translation": "Hata ayıklama işlerinizi kolaylaştırmak için Jira gibi sık kullandığınız araçları bütünleştirin ve kanalınızdaki üretkenliği artırın. Bunlar sizin için indirilir." + }, + { + "id": "worktemplate.product_teams.bug_bash.channel", + "translation": "Hata raporlarını ve çözümlerini ekibinizin ve kuruluşunuzun kolayca erişebileceği tek bir kanalda planlayın ve yönetin." + }, + { + "id": "worktemplate.leadership.goals_and_okrs.integration", + "translation": "İşbirliğini kolaylaştırmak için Zoom gibi sık kullandığınız araçları bütünleştirin ve kanalınızdaki üretkenliği artırın. Bunlar sizin için indirilir." + }, + { + "id": "worktemplate.leadership.goals_and_okrs.channel", + "translation": "Hedefleriniz ve ilerlemeniz hakkında ekibinizle farklı zamanlarda ya da gerçek zamanlı olarak sohbet edin ve değişiklikleri tek bir kanaldan izleyerek güncel kalın." + }, + { + "id": "worktemplate.leadership.goals_and_okrs.board", + "translation": "Amaçlar ve anahtar sonuçlar (OKR) panosu ile ekibinizin kurumsal hedeflere doğru ilerlemesini izleyin. Toplantı gündemi panosu ile toplantıları izleyin." + }, + { + "id": "worktemplate.devops.product_release.playbook", + "translation": "Ürün çıkışlarının güvenilir ve zamanında olması için izlenmesi ve uygulanması kolay, yinelenebilir iş akışları oluşturun." + }, + { + "id": "worktemplate.devops.product_release.channel", + "translation": "Ekibinizle günlük kilometre taşları, engeller ve çıktılardaki değişiklikler hakkında kolay ve hızlı bir şekilde sohbet edin." + }, + { + "id": "worktemplate.devops.product_release.board", + "translation": "Sürüm zaman çerçevenizi ve sürecinizi desteklemek için ürün çıkarma panosunu kullanın ve herkesin hangi görevlerin bitiş zamanının geldiğini bilmesini sağlayın." + }, + { + "id": "worktemplate.devops.incident_resolution.description.playbook", + "translation": "Kilit ekip üyelerini bir araya getirmek için kontrol listeleri ve otomasyon kullanarak olayın çözüme doğru ilerlemesini paylaşın." + }, + { + "id": "worktemplate.devops.incident_resolution.description.channel", + "translation": "Ekibinizle tek bir kanal kullanarak öncelikler hakkında sohbet edin, paydaşlar ekleyin, güncellemeler yayınlayın ve çözüm için çalışın." + }, + { + "id": "worktemplate.devops.incident_resolution.description.board", + "translation": "Yinelenebilen süreçleri desteklemek ve ekip genelinde tanımlanmış görevler atamak için olay çözümleme panosunu kullanın." + }, + { + "id": "worktemplate.companywide.goals_and_okrs.integration", + "translation": "İşbirliğini kolaylaştırmak için Zoom gibi sık kullandığınız araçları bütünleştirin ve kanalınızdaki üretkenliği artırın. Bunlar sizin için indirilir." + }, + { + "id": "worktemplate.companywide.goals_and_okrs.channel", + "translation": "Hedefleriniz ve ilerlemeniz hakkında ekibinizle farklı zamanlarda ya da gerçek zamanlı olarak sohbet edin ve değişiklikleri tek bir kanaldan izleyerek güncel kalın." + }, + { + "id": "worktemplate.companywide.goals_and_okrs.board", + "translation": "Amaçlar ve anahtar sonuçlar (OKR) panosu ile ekibinizin kurumsal hedeflere doğru ilerlemesini izleyin. Toplantı gündemi panosu ile toplantıları izleyin." + }, + { + "id": "model.license_record.is_valid.bytes.app_error", + "translation": "Bir lisans yüklenirken bayt değeri geçersiz." + }, + { + "id": "worktemplate.companywide.create_project.integration", + "translation": "Sık kullandığınız araçlar ile bütünleştirerek kanalınızdaki üretkenliği artırın. Bunlar sizin için indirilir." + }, + { + "id": "worktemplate.companywide.create_project.channel", + "translation": "Ekibinizle yeni projeniz üzerine sohbet edin ve işbirlikli bir kanalda projeyi nasıl yapılandıracağınıza karar verin." + }, + { + "id": "worktemplate.companywide.create_project.board", + "translation": "Proje görevlerinizi ve ilerlemenizi tanımlamak ve izlemek için bir Kanban panosu kullanın." + }, + { + "id": "app.user.run.update_status.title", + "translation": "Durum güncellemesi" + }, + { + "id": "app.user.run.update_status.submit_label", + "translation": "Durumu güncelle" + }, + { + "id": "app.user.run.update_status.reminder_for_next_update", + "translation": "Sonraki güncelleme anımsatıcısı" + }, + { + "id": "app.user.run.update_status.num_channel", + "translation": { + "one": "Paydaşlara bir güncelleme duyurun. Bu gönderi {{.Count}} kanalında yayınlanacak.", + "other": "Paydaşlara bir güncelleme duyurun. Bu gönderi {{.Count}} kanalında yayınlanacak." + } + }, + { + "id": "app.user.run.update_status.finish_run.placeholder", + "translation": "Ayrıca oyunu da tamamlanmış olarak işaretle" + }, + { + "id": "app.user.run.update_status.finish_run", + "translation": "Oyunu tamamla" + }, + { + "id": "app.user.run.update_status.change_since_last_update", + "translation": "Son güncellemeden sonraki değişiklik" + }, + { + "id": "app.user.run.status_enable", + "translation": "@{{.Username}}, [{{.RunName}}]({{.RunURL}}) için durum güncellemelerini etkinleştirdi" + }, + { + "id": "app.user.run.status_disable", + "translation": "@{{.Username}}, [{{.RunName}}]({{.RunURL}}) için durum güncellemelerini devre dışı bıraktı" + }, + { + "id": "app.user.run.request_update", + "translation": "@here — @{{.Name}}, [{{.RunName}}]({{.RunURL}}) için bir durum güncellemesi istedi. \n" + }, + { + "id": "app.user.run.request_join_channel", + "translation": "@{{.Name}} bir oyun katılımcısı ve bu kanala katılmak istiyor. Kanalın herhangi bir üyesi onu çağırabilir.\n" + }, + { + "id": "app.user.run.confirm_finish.title", + "translation": "Oyunu tamamlamayı onayla" + }, + { + "id": "app.user.run.confirm_finish.submit_label", + "translation": "Oyunu tamamla" + }, + { + "id": "app.user.run.confirm_finish.num_outstanding", + "translation": { + "one": "Bekleyen **{{.Count}} görev** var. *{{.RunName}}* oyununu tüm katılımcılar için tamamlamak istediğinize emin misiniz?", + "other": "Bekleyen **{{.Count}} görev** var. *{{.RunName}}* oyununu tüm katılımcılar için tamamlamak istediğinize emin misiniz?" + } + }, + { + "id": "app.user.run.add_to_timeline.title", + "translation": "Oyun zaman akışına ekle" + }, + { + "id": "app.user.run.add_to_timeline.summary.placeholder", + "translation": "Zaman akışında görüntülenecek kısa açıklama" + }, + { + "id": "app.user.run.add_to_timeline.summary.help", + "translation": "En fazla 64 karakter" + }, + { + "id": "app.user.run.add_to_timeline.summary", + "translation": "Özet" + }, + { + "id": "app.user.run.add_to_timeline.submit_label", + "translation": "Oyun zaman akışına ekle" + }, + { + "id": "app.user.run.add_to_timeline.playbook_run", + "translation": "Senaryo oyunu" + }, + { + "id": "app.user.run.add_checklist_item.title", + "translation": "Yeni görev ekle" + }, + { + "id": "app.user.run.add_checklist_item.submit_label", + "translation": "Görev ekle" + }, + { + "id": "app.user.run.add_checklist_item.name", + "translation": "Ad" + }, + { + "id": "app.user.run.add_checklist_item.description", + "translation": "Açıklama" + }, + { + "id": "app.user.new_run.title", + "translation": "Senaryoyu oyna" + }, + { + "id": "app.user.new_run.submit_label", + "translation": "Oyunu başlat" + }, + { + "id": "app.user.new_run.run_name", + "translation": "Oyun adı" + }, + { + "id": "app.user.new_run.playbook", + "translation": "Senaryo" + }, + { + "id": "app.user.new_run.intro", + "translation": "**Sahibi** {{.Username}}" + }, + { + "id": "app.user.digest.tasks.zero_assigned", + "translation": "Size atanmış bir görev yok." + }, + { + "id": "app.user.digest.tasks.num_assigned_due_until_today", + "translation": { + "one": "Süresi dolmuş {{.Count}} atanmış göreviniz var:", + "other": "Süresi dolmuş {{.Count}} atanmış göreviniz var:" + } + }, + { + "id": "app.user.digest.tasks.num_assigned", + "translation": { + "one": "{{.Count}} atanmış göreviniz var:", + "other": "{{.Count}} atanmış göreviniz var:" + } + }, + { + "id": "app.user.digest.tasks.heading", + "translation": "Atanmış görevleriniz" + }, + { + "id": "app.user.digest.tasks.due_yesterday", + "translation": "Süresi dün doldu" + }, + { + "id": "app.user.digest.tasks.due_x_days_ago", + "translation": "Süresi {{.Count}} gün önce doldu" + }, + { + "id": "app.user.digest.tasks.due_today", + "translation": "Süresi bugün dolacak" + }, + { + "id": "app.user.digest.tasks.due_in_x_days", + "translation": { + "one": "{{.Count}} gün içinde süresi dolacak", + "other": "{{.Count}} gün içinde süresi dolacak" + } + }, + { + "id": "app.user.digest.tasks.due_after_today", + "translation": { + "one": "Bugünden sonra süresi dolacak **{{.Count}} göreviniz var**.", + "other": "Bugünden sonra süresi dolacak **{{.Count}} göreviniz var**." + } + }, + { + "id": "app.user.digest.tasks.all_tasks_command", + "translation": "Tüm görevlerinizi görüntülemek için `/playbook todo` kullanın." + }, + { + "id": "app.user.digest.runs_in_progress.zero_in_progress", + "translation": "Süren bir oyununuz yok." + }, + { + "id": "app.user.digest.runs_in_progress.num_in_progress", + "translation": { + "one": "Süren {{.Count}} oyununuz var:", + "other": "Süren {{.Count}} oyununuz var:" + } + }, + { + "id": "app.user.digest.runs_in_progress.heading", + "translation": "Süren oyunlar" + }, + { + "id": "app.user.digest.overdue_status_updates.zero_overdue", + "translation": "Gecikmiş bir oyununuz yok." + }, + { + "id": "app.user.digest.overdue_status_updates.num_overdue", + "translation": { + "one": "Bir durum güncellemesi için {{.Count}} oyun gecikmeniz var:", + "other": "Bir durum güncellemesi için {{.Count}} oyun gecikmeniz var:" + } + }, + { + "id": "app.user.digest.overdue_status_updates.heading", + "translation": "Gecikmiş durum güncellemeleri" + }, + { + "id": "app.command.execute.error", + "translation": "Komut yürütülemedi." + }, + { + "id": "api.server.cws.subscribe_to_newsletter.app_error", + "translation": "CWS sunucusu duyurulara abone olamadı." + }, + { + "id": "api.license.request-trial.bad-request.business-email", + "translation": "Deneme için iş e-postası geçersiz" } ] diff --git a/server/platform/services/searchengine/searchengine.go b/server/platform/services/searchengine/searchengine.go index 55948e98e8..6530b93723 100644 --- a/server/platform/services/searchengine/searchengine.go +++ b/server/platform/services/searchengine/searchengine.go @@ -45,8 +45,19 @@ func (seb *Broker) GetActiveEngines() []SearchEngineInterface { if seb.ElasticsearchEngine != nil && seb.ElasticsearchEngine.IsActive() { engines = append(engines, seb.ElasticsearchEngine) } - if seb.BleveEngine != nil && seb.BleveEngine.IsActive() { + if seb.BleveEngine != nil && seb.BleveEngine.IsActive() && seb.BleveEngine.IsIndexingEnabled() { engines = append(engines, seb.BleveEngine) } return engines } + +func (seb *Broker) ActiveEngine() string { + activeEngines := seb.GetActiveEngines() + if len(activeEngines) > 0 { + return activeEngines[0].GetName() + } + if *seb.cfg.SqlSettings.DisableDatabaseSearch { + return "none" + } + return "database" +} diff --git a/server/platform/services/searchengine/searchengine_test.go b/server/platform/services/searchengine/searchengine_test.go new file mode 100644 index 0000000000..00f806f3df --- /dev/null +++ b/server/platform/services/searchengine/searchengine_test.go @@ -0,0 +1,42 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +package searchengine + +import ( + "testing" + + "github.com/mattermost/mattermost-server/v6/model" + "github.com/mattermost/mattermost-server/v6/server/platform/services/searchengine/mocks" + "github.com/stretchr/testify/assert" +) + +func TestActiveEngine(t *testing.T) { + cfg := &model.Config{} + cfg.SetDefaults() + + b := NewBroker(cfg) + + esMock := &mocks.SearchEngineInterface{} + esMock.On("IsActive").Return(true) + esMock.On("GetName").Return("elasticsearch") + + bleveMock := &mocks.SearchEngineInterface{} + bleveMock.On("IsActive").Return(true) + bleveMock.On("IsIndexingEnabled").Return(true) + bleveMock.On("GetName").Return("bleve") + + assert.Equal(t, "database", b.ActiveEngine()) + + b.ElasticsearchEngine = esMock + assert.Equal(t, "elasticsearch", b.ActiveEngine()) + + b.ElasticsearchEngine = nil + b.BleveEngine = bleveMock + assert.Equal(t, "bleve", b.ActiveEngine()) + + b.BleveEngine = nil + *b.cfg.SqlSettings.DisableDatabaseSearch = true + + assert.Equal(t, "none", b.ActiveEngine()) +} diff --git a/server/playbooks/server/api/api.yaml b/server/playbooks/server/api/api.yaml index 7541ae930d..538c03ca79 100644 --- a/server/playbooks/server/api/api.yaml +++ b/server/playbooks/server/api/api.yaml @@ -1249,7 +1249,7 @@ paths: 500: $ref: "#/components/responses/500" - /runs/{id}/timeline/{event-id}/: + /runs/{id}/timeline/{event_id}/: delete: summary: Remove a timeline event from the playbook run operationId: removeTimelineEvent @@ -1265,7 +1265,7 @@ paths: example: zjy2q2iy2jafl0lo2oddos5xn7 schema: type: string - - name: event-id + - name: event_id in: path required: true description: ID of the timeline event to be deleted @@ -1405,6 +1405,10 @@ paths: type: boolean description: A boolean indicating whether the playbook runs created from this playbook should be public or private. example: true + public: + type: boolean + description: A boolean indicating whether the playbook is licensed as public or private. Required 'true' for free tier. + example: true checklists: type: array description: The stages defined by this playbook. diff --git a/webapp/.npmrc b/webapp/.npmrc index 7f56c3b1a7..1b78f1c6f2 100644 --- a/webapp/.npmrc +++ b/webapp/.npmrc @@ -1,3 +1,2 @@ save-exact=true legacy-peer-deps=true -global-style=true diff --git a/webapp/README.md b/webapp/README.md new file mode 100644 index 0000000000..dfb7d47a09 --- /dev/null +++ b/webapp/README.md @@ -0,0 +1,28 @@ +# Mattermost Web App + +This folder contains the client code for the Mattermost web app. It's broken up into multiple packages each of which either contains an area of the app (such as `playbooks` or `boards`) or shared logic used across other packages (such as the packages located in the `platform` directory). For anyone who's used to working in [the mattermost/mattermost-webapp repo](https://github.com/mattermost/mattermost-webapp), most of that is now located in `channels`. + +## npm Workspaces + +To interact with a workspace using npm, such as to add a dependency or run a script, use the `--workspace` (or `--workspaces`) flag. This can be done when using built-in npm commands such as `npm add` or when running scripts. Those commands should be run from this directory. + +```sh +# Add a dependency to a single package +npm add react --workspace=boards + +# Build multiple packages +npm run build --workspace=packages/client --workspace=packages/components + +# Test all workspaces +npm test --workspaces + +# Clean all workspaces that have a clean script defined +npm run clean --workspaces --if-present +``` + +To install dependencies for a workspace, simply run `npm install` from this folder as you would do normally. Most packages' dependencies will be included in the root `node_modules`, and all packages' dependencies will appear in the `package-lock.json`. A `node_modules` will only be created inside a package if one of its dependencies conflicts with that of another package. + +## Useful Links + +- [Developer setup](https://developers.mattermost.com/contribute/developer-setup/), now included with the Mattermost server developer setup +- [Web app developer documentation](https://developers.mattermost.com/contribute/more-info/webapp/) \ No newline at end of file diff --git a/webapp/boards/.eslintrc.json b/webapp/boards/.eslintrc.json index 38051b75e8..f31eeaf6c1 100644 --- a/webapp/boards/.eslintrc.json +++ b/webapp/boards/.eslintrc.json @@ -91,9 +91,6 @@ "error", { "allowSameFolder": true, "rootDir": "webapp/boards"} ], - /* "no-restricted-imports": ["error", { - "patterns": ["..*"] - }], */ "import-newlines/enforce": [ 2, 3 @@ -101,7 +98,8 @@ "object-curly-spacing": [ 2, "never" - ] + ], + "formatjs/no-multiple-whitespaces": 2 }, "overrides": [ { diff --git a/webapp/boards/NOTICE.txt b/webapp/boards/NOTICE.txt index 1fe6975ff0..acebeb67ec 100644 --- a/webapp/boards/NOTICE.txt +++ b/webapp/boards/NOTICE.txt @@ -2982,32 +2982,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: mini-create-react-context. A copy of the source code may be downloaded from https://github.com/StringEpsilon/mini-create-react-context. This software contains the following license and notice below: - -Copyright (c) 2019-present StringEpsilon - -Copyright (c) 2017-2019 James Kyle - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ------ - The following software may be included in this product: mkdirp. A copy of the source code may be downloaded from https://github.com/substack/node-mkdirp.git. This software contains the following license and notice below: Copyright 2010 James Halliday (mail@substack.net) diff --git a/webapp/boards/i18n/en.json b/webapp/boards/i18n/en.json index a913658a73..2fe9b2c5fa 100644 --- a/webapp/boards/i18n/en.json +++ b/webapp/boards/i18n/en.json @@ -453,4 +453,4 @@ "tutorial_tip.ok": "Next", "tutorial_tip.out": "Opt out of these tips.", "tutorial_tip.seen": "Seen this before?" -} \ No newline at end of file +} diff --git a/webapp/boards/i18n/fa.json b/webapp/boards/i18n/fa.json index d49f74c6b2..c875c9456a 100644 --- a/webapp/boards/i18n/fa.json +++ b/webapp/boards/i18n/fa.json @@ -1,5 +1,5 @@ { - "AppBar.Tooltip": "تغییر وضعیت تخته‌های مرتبط", + "AppBar.Tooltip": "تغییر وضعیت تابلوهای مرتبط", "Attachment.Attachment-title": "ضمیمه", "AttachmentBlock.DeleteAction": "حذف", "AttachmentBlock.addElement": "افزودن {type}", diff --git a/webapp/boards/i18n/ka.json b/webapp/boards/i18n/ka.json index 5623cbd56e..9d3b5d3553 100644 --- a/webapp/boards/i18n/ka.json +++ b/webapp/boards/i18n/ka.json @@ -5,7 +5,7 @@ "BoardComponent.hidden-columns": "დამალული სვეტები", "BoardComponent.hide": "დამალვა", "BoardComponent.new": "+ ახალი", - "BoardComponent.no-property": "არ არის {Property}", + "BoardComponent.no-property": "არ არის {property}", "BoardComponent.no-property-title": "ცარიელი {property} საკუთრების მქონე ელემენტები აქ წავა. ამ სვეტის წაშლა შეუძლებელია.", "BoardComponent.show": "ჩვენება", "BoardMember.schemeAdmin": "ადმინისტრატორი", diff --git a/webapp/boards/i18n/lt.json b/webapp/boards/i18n/lt.json index 0967ef424b..27c6f80214 100644 --- a/webapp/boards/i18n/lt.json +++ b/webapp/boards/i18n/lt.json @@ -1 +1,456 @@ -{} +{ + "AdminBadge.SystemAdmin": "Administratorius", + "AdminBadge.TeamAdmin": "Komandos administratorius", + "AppBar.Tooltip": "Perjungti susietas lentas", + "Attachment.Attachment-title": "Priedas", + "AttachmentBlock.DeleteAction": "Ištrinti", + "AttachmentBlock.addElement": "pridėti {type}", + "AttachmentBlock.delete": "Priedas ištrintas.", + "AttachmentBlock.failed": "Šio failo nepavyko įkelti, nes pasiektas failo dydžio limitas.", + "AttachmentBlock.upload": "Priedo įkėlimas.", + "AttachmentBlock.uploadSuccess": "Priedas įkeltas.", + "AttachmentElement.delete-confirmation-dialog-button-text": "Ištrinti", + "AttachmentElement.download": "Parsisiųsti", + "AttachmentElement.upload-percentage": "Įkeliama...({uploadPercent}%)", + "BoardComponent.add-a-group": "+ Pridėti grupę", + "BoardComponent.delete": "Ištrinti", + "BoardComponent.hidden-columns": "Paslėpti stulpeliai", + "BoardComponent.hide": "Slėpti", + "BoardComponent.new": "+ Naujas", + "BoardComponent.no-property": "Nėra {property}", + "BoardComponent.no-property-title": "Elementai su tuščia nuosavybe {property} pateks čia. Šio stulpelio pašalinti negalima.", + "BoardComponent.show": "Rodyti", + "BoardMember.schemeAdmin": "Administratorius", + "BoardMember.schemeCommenter": "Komentuotojas", + "BoardMember.schemeEditor": "Redaktorius", + "BoardMember.schemeNone": "Joks", + "BoardMember.schemeViewer": "Žiūriklis", + "BoardMember.unlinkChannel": "Atsieti", + "BoardPage.newVersion": "Yra nauja Boards versija. Spustelėkite čia, kad įkeltumėte iš naujo.", + "BoardPage.syncFailed": "Lenta gali būti ištrinta arba jos prieiga gali būti atšaukta.", + "BoardTemplateSelector.add-template": "Sukurti naują šabloną", + "BoardTemplateSelector.create-empty-board": "Sukurti tuščią lentą", + "BoardTemplateSelector.delete-template": "Ištrinti", + "BoardTemplateSelector.description": "Pridėkite lentą prie šoninės juostos naudodami bet kurį iš toliau nurodytų šablonų arba pradėkite nuo nulio.", + "BoardTemplateSelector.edit-template": "Redaguoti", + "BoardTemplateSelector.plugin.no-content-description": "Pridėkite lentą prie šoninės juostos naudodami bet kurį iš toliau nurodytų šablonų arba pradėkite nuo nulio.", + "BoardTemplateSelector.plugin.no-content-title": "Sukurti lentą", + "BoardTemplateSelector.title": "Sukurti lentą", + "BoardTemplateSelector.use-this-template": "Naudoti šį šabloną", + "BoardsSwitcher.Title": "Rasti lentas", + "BoardsUnfurl.Limited": "Papildoma informacija yra paslėpta, nes kortelė yra archyvuojama", + "BoardsUnfurl.Remainder": "+{remainder} dar", + "BoardsUnfurl.Updated": "Atnaujinta {time}", + "Calculations.Options.average.displayName": "Vidutinis", + "Calculations.Options.average.label": "Vidutinis", + "Calculations.Options.count.displayName": "Skaičius", + "Calculations.Options.count.label": "Skaičius", + "Calculations.Options.countChecked.displayName": "Pažymėta", + "Calculations.Options.countChecked.label": "Skaičius patikrintas", + "Calculations.Options.countUnchecked.displayName": "Nepažymėta", + "Calculations.Options.countUnchecked.label": "Skaičiaus žymėjimas panaikintas", + "Calculations.Options.countUniqueValue.displayName": "Unikalus", + "Calculations.Options.countUniqueValue.label": "Suskaičiuoti unikalias reikšmes", + "Calculations.Options.countValue.displayName": "Reikšmės", + "Calculations.Options.countValue.label": "Skaičius", + "Calculations.Options.dateRange.displayName": "Diapazonas", + "Calculations.Options.dateRange.label": "Diapazonas", + "Calculations.Options.earliest.displayName": "Anksčiausiai", + "Calculations.Options.earliest.label": "Anksčiausiai", + "Calculations.Options.latest.displayName": "Naujausias", + "Calculations.Options.latest.label": "Naujausias", + "Calculations.Options.max.displayName": "Maks.", + "Calculations.Options.max.label": "Maks.", + "Calculations.Options.median.displayName": "Mediana", + "Calculations.Options.median.label": "Mediana", + "Calculations.Options.min.displayName": "Min.", + "Calculations.Options.min.label": "Min.", + "Calculations.Options.none.displayName": "Apskaičiuoti", + "Calculations.Options.none.label": "Joks", + "Calculations.Options.percentChecked.displayName": "Pažymėta", + "Calculations.Options.percentChecked.label": "Patikrinta procentais", + "Calculations.Options.percentUnchecked.displayName": "Nepažymėta", + "Calculations.Options.percentUnchecked.label": "Nepažymėtas procentas", + "Calculations.Options.range.displayName": "Diapazonas", + "Calculations.Options.range.label": "Diapazonas", + "Calculations.Options.sum.displayName": "Iš viso", + "Calculations.Options.sum.label": "Iš viso", + "CalendarCard.untitled": "Be pavadinimo", + "CardActionsMenu.copiedLink": "Nukopijuota!", + "CardActionsMenu.copyLink": "Kopijuoti nuorodą", + "CardActionsMenu.delete": "Ištrinti", + "CardActionsMenu.duplicate": "Pasikartojantis", + "CardBadges.title-checkboxes": "Žymimieji langeliai", + "CardBadges.title-comments": "Komentarai", + "CardBadges.title-description": "Ši kortelė turi aprašymą", + "CardDetail.Attach": "Prisegti", + "CardDetail.Follow": "Sekti", + "CardDetail.Following": "Sekama", + "CardDetail.add-content": "Pridėti turinį", + "CardDetail.add-icon": "Pridėti piktogramą", + "CardDetail.add-property": "+ Pridėti savybę", + "CardDetail.addCardText": "pridėti kortelės tekstą", + "CardDetail.limited-body": "Naujovinkite į mūsų Professional arba Enterprise planą.", + "CardDetail.limited-button": "Patobulinti", + "CardDetail.limited-title": "Ši kortelė paslėpta", + "CardDetail.moveContent": "Perkelti kortelės turinį", + "CardDetail.new-comment-placeholder": "Pridėti komentarą...", + "CardDetailProperty.confirm-delete-heading": "Patvirtinkite nuosavybės ištrynimą", + "CardDetailProperty.confirm-delete-subtext": "Ar tikrai norite ištrinti savybę „{propertyName}“? Ją ištrynus, savybė bus ištrinta iš visų šios lentos kortelių.", + "CardDetailProperty.confirm-property-name-change-subtext": "Ar tikrai norite pakeisti savybę „{propertyName}“ {customText}? Tai turės įtakos {numOfCards} kortelės reikšmei (-ėms) šioje lentoje ir duomenys gali būti prarasti.", + "CardDetailProperty.confirm-property-type-change": "Patvirtinkite nuosavybės tipo pakeitimą", + "CardDetailProperty.delete-action-button": "Ištrinti", + "CardDetailProperty.property-change-action-button": "Keisti savybę", + "CardDetailProperty.property-changed": "Savybė sėkmingai pakeista!", + "CardDetailProperty.property-deleted": "{propertyName} sėkmingai ištrinta!", + "CardDetailProperty.property-name-change-subtext": "įveskite iš „{oldPropType}“ į „{newPropType}“", + "CardDetial.limited-link": "Sužinokite daugiau apie mūsų planus.", + "CardDialog.delete-confirmation-dialog-attachment": "Patvirtinkite priedo ištrynimą", + "CardDialog.delete-confirmation-dialog-button-text": "Ištrinti", + "CardDialog.delete-confirmation-dialog-heading": "Patvirtinkite kortelės ištrynimą", + "CardDialog.editing-template": "Jūs redaguojate šabloną.", + "CardDialog.nocard": "Šios kortelės nėra arba ji nepasiekiama.", + "Categories.CreateCategoryDialog.CancelText": "Atšaukti", + "Categories.CreateCategoryDialog.CreateText": "Sukurti", + "Categories.CreateCategoryDialog.Placeholder": "Pavadinkite savo kategoriją", + "Categories.CreateCategoryDialog.UpdateText": "Atnaujinti", + "CenterPanel.Login": "Prisijungti", + "CenterPanel.Share": "Bendrinti", + "ChannelIntro.CreateBoard": "Sukurti lentą", + "ColorOption.selectColor": "Pasirinkti {color} spalvą", + "Comment.delete": "Ištrinti", + "CommentsList.send": "Siųsti", + "ConfirmPerson.empty": "Tuščias", + "ConfirmPerson.search": "Ieškoti...", + "ConfirmationDialog.cancel-action": "Atšaukti", + "ConfirmationDialog.confirm-action": "Patvirtinti", + "ContentBlock.Delete": "Ištrinti", + "ContentBlock.DeleteAction": "Ištrinti", + "ContentBlock.addElement": "pridėti {type}", + "ContentBlock.checkbox": "žymimasis langelis", + "ContentBlock.divider": "skirtukas", + "ContentBlock.editCardCheckbox": "perjungtas žymimasis laukelis", + "ContentBlock.editCardCheckboxText": "redaguoti kortelės tekstą", + "ContentBlock.editCardText": "redaguoti kortelės tekstą", + "ContentBlock.editText": "Keisti tekstą...", + "ContentBlock.image": "Paveikslėlis", + "ContentBlock.insertAbove": "Įdėti aukščiau", + "ContentBlock.moveBlock": "perkelti kortelės turinį", + "ContentBlock.moveDown": "Perkelti žemyn", + "ContentBlock.moveUp": "Perkelti aukštyn", + "ContentBlock.text": "tekstas", + "DateFilter.empty": "Tuščias", + "DateRange.clear": "Išvalyti", + "DateRange.empty": "Tuščias", + "DateRange.endDate": "Pabaigos data", + "DateRange.today": "Šiandien", + "DeleteBoardDialog.confirm-cancel": "Atšaukti", + "DeleteBoardDialog.confirm-delete": "Ištrinti", + "DeleteBoardDialog.confirm-info": "Ar tikrai norite ištrinti lentą „{boardTitle}“? Ją ištrynus, bus ištrintos visos lentos kortelės.", + "DeleteBoardDialog.confirm-info-template": "Ar tikrai norite ištrinti lentos šabloną „{boardTitle}“?", + "DeleteBoardDialog.confirm-tite": "Patvirtinkite lentos ištrynimą", + "DeleteBoardDialog.confirm-tite-template": "Patvirtinkite lentos šablono ištrynimą", + "Dialog.closeDialog": "Uždaryti dialogo langą", + "EditableDayPicker.today": "Šiandien", + "Error.mobileweb": "Mobiliojo žiniatinklio palaikymas šiuo metu yra ankstyvoje beta versijoje. Gali būti ne visos funkcijos.", + "Error.websocket-closed": "Interneto lizdo ryšys uždarytas, ryšys nutrauktas. Jei tai išlieka, patikrinkite savo serverio arba žiniatinklio tarpinio serverio konfigūraciją.", + "Filter.contains": "turi", + "Filter.ends-with": "baigiasi", + "Filter.includes": "apima", + "Filter.is": "yra", + "Filter.is-after": "yra po", + "Filter.is-before": "yra prieš", + "Filter.is-empty": "yra tuščias", + "Filter.is-not-empty": "nėra tuščias", + "Filter.is-not-set": "nėra nustatytas", + "Filter.is-set": "yra nustatytas", + "Filter.isafter": "yra po", + "Filter.isbefore": "yra prieš", + "Filter.not-contains": "nėra", + "Filter.not-ends-with": "nesibaigia", + "Filter.not-includes": "neapima", + "Filter.not-starts-with": "neprasideda", + "Filter.starts-with": "prasideda", + "FilterByText.placeholder": "filtruoti tekstą", + "FilterComponent.add-filter": "+ Pridėti filtrą", + "FilterComponent.delete": "Ištrinti", + "FilterValue.empty": "(tuščia)", + "FindBoardsDialog.IntroText": "Ieškoti lentų", + "FindBoardsDialog.NoResultsFor": "Nėra rezultatų pagal „{searchQuery}“", + "FindBoardsDialog.NoResultsSubtext": "Patikrinkite rašybą arba pabandykite atlikti kitą paiešką.", + "FindBoardsDialog.SubTitle": "Įveskite, kad rastumėte lentą. Norėdami naršyti, naudokite AUKŠTYN / ŽEMYN. ENTER , kad pasirinktumėte, ESC , kad atsisakytumėte", + "FindBoardsDialog.Title": "Raskite lentas", + "GroupBy.hideEmptyGroups": "Slėpti {count} tuščias grupes", + "GroupBy.showHiddenGroups": "Rodyti paslėptas grupes: {count}", + "GroupBy.ungroup": "Išgrupuoti", + "HideBoard.MenuOption": "Paslėpti lentą", + "KanbanCard.untitled": "Be pavadinimo", + "MentionSuggestion.is-not-board-member": "(ne lentos narys)", + "Mutator.new-board-from-template": "nauja lenta pagal šabloną", + "Mutator.new-card-from-template": "nauja kortelė pagal šabloną", + "Mutator.new-template-from-card": "naujas šablonas pagal kortelę", + "OnboardingTour.AddComments.Body": "Galite komentuoti problemas ir net @paminėti kitus Mattermost naudotojus, kad atkreiptumėte jų dėmesį.", + "OnboardingTour.AddComments.Title": "Pridėti komentarų", + "OnboardingTour.AddDescription.Body": "Pridėkite aprašymą prie savo kortelės, kad komandos draugai žinotų, kam ji skirta.", + "OnboardingTour.AddDescription.Title": "Pridėti aprašymą", + "OnboardingTour.AddProperties.Body": "Pridėkite prie kortelių įvairių savybių, kad jos būtų dar galingesnės.", + "OnboardingTour.AddProperties.Title": "Pridėti savybių", + "OnboardingTour.AddView.Body": "Eikite čia, kad sukurtumėte naują rodinį ir galėtumėte tvarkyti lentą naudodami skirtingus išdėstymus.", + "OnboardingTour.AddView.Title": "Pridėti naują rodinį", + "OnboardingTour.CopyLink.Body": "Galite bendrinti savo korteles su komandos draugais nukopijuodami nuorodą ir įklijuodami ją į kanalą, tiesioginį pranešimą ar grupės pranešimą.", + "OnboardingTour.CopyLink.Title": "Kopijuoti nuorodą", + "OnboardingTour.OpenACard.Body": "Atidarykite kortelę, kad sužinotumėte, kokiais galingais būdais Boards gali padėti organizuoti darbą.", + "OnboardingTour.OpenACard.Title": "Atidaryti kortelę", + "OnboardingTour.ShareBoard.Body": "Galite bendrinti lentą viduje, savo komandoje arba paskelbti ją viešai, kad būtų matoma už organizacijos ribų.", + "OnboardingTour.ShareBoard.Title": "Bendrinti lentą", + "PersonProperty.board-members": "Lentos nariai", + "PersonProperty.me": "aš", + "PersonProperty.non-board-members": "Ne lentos nariai", + "PropertyMenu.Delete": "Ištrinti", + "PropertyMenu.changeType": "Pakeisti savybės tipą", + "PropertyMenu.selectType": "Pasirinkti savybės tipą", + "PropertyMenu.typeTitle": "Tipas", + "PropertyType.Checkbox": "Žymimasis langelis", + "PropertyType.CreatedBy": "Sukurta", + "PropertyType.CreatedTime": "Sukūrimo laikas", + "PropertyType.Date": "Data", + "PropertyType.Email": "El. paštas", + "PropertyType.MultiPerson": "Daugelio žmonių", + "PropertyType.MultiSelect": "Keletas pasirinkimų", + "PropertyType.Number": "Skaičius", + "PropertyType.Person": "Asmuo", + "PropertyType.Phone": "Telefonas", + "PropertyType.Select": "Pasirinkite", + "PropertyType.Text": "Tekstas", + "PropertyType.Unknown": "Nežinoma", + "PropertyType.UpdatedBy": "Paskutinį kartą atnaujino", + "PropertyType.UpdatedTime": "Paskutinio atnaujinimo laikas", + "PropertyType.Url": "URL", + "PropertyValueElement.empty": "Tuščias", + "RegistrationLink.confirmRegenerateToken": "Tai panaikins anksčiau bendrintas nuorodas. Tęsti?", + "RegistrationLink.copiedLink": "Nukopijuota!", + "RegistrationLink.copyLink": "Kopijuoti nuorodą", + "RegistrationLink.description": "Pasidalykite šia nuoroda, kad kiti galėtų susikurti paskyras:", + "RegistrationLink.regenerateToken": "Atkurti prieigos raktą", + "RegistrationLink.tokenRegenerated": "Registracijos nuoroda sugeneruota iš naujo", + "ShareBoard.PublishDescription": "Paskelbti ir bendrinti tik skaitomą nuorodą su visais žiniatinklio naudotojais.", + "ShareBoard.PublishTitle": "Paskelbti žiniatinklyje", + "ShareBoard.ShareInternal": "Bendrinti viduje", + "ShareBoard.ShareInternalDescription": "Leidimus turintys naudotojai galės naudotis šia nuoroda.", + "ShareBoard.Title": "Bendrinti lentą", + "ShareBoard.confirmRegenerateToken": "Tai panaikins anksčiau bendrintas nuorodas. Tęsti?", + "ShareBoard.copiedLink": "Nukopijuota!", + "ShareBoard.copyLink": "Kopijuoti nuorodą", + "ShareBoard.regenerate": "Atkurti prieigos raktą", + "ShareBoard.searchPlaceholder": "Ieškoti žmonių ir kanalų", + "ShareBoard.teamPermissionsText": "Visi {teamName} komandos nariai", + "ShareBoard.tokenRegenrated": "Prieigos raktas atkurtas", + "ShareBoard.userPermissionsRemoveMemberText": "Pašalinti narį", + "ShareBoard.userPermissionsYouText": "(Jūs)", + "ShareTemplate.Title": "Bendrinti šabloną", + "ShareTemplate.searchPlaceholder": "Ieškoti žmonių", + "Sidebar.delete-board": "Ištrinti lentą", + "Sidebar.duplicate-board": "Pasikartojanti lenta", + "Sidebar.export-archive": "Eksportuoti archyvą", + "Sidebar.import": "Importuoti", + "Sidebar.import-archive": "Importuoti archyvą", + "Sidebar.new-category.badge": "Naujas", + "Sidebar.new-category.drag-boards-cta": "Vilkite lentas čia...", + "Sidebar.no-boards-in-category": "Viduje nėra lentų", + "Sidebar.product-tour": "Produkto apžvalga", + "Sidebar.random-icons": "Atsitiktinės piktogramos", + "Sidebar.set-language": "Nustatyti kalbą", + "Sidebar.set-theme": "Nustatyti temą", + "Sidebar.settings": "Nustatymai", + "Sidebar.template-from-board": "Naujas šablonas pagal lentą", + "Sidebar.untitled-board": "(Lenta be pavadinimo)", + "Sidebar.untitled-view": "(Rodinys be pavadinimo)", + "SidebarCategories.BlocksMenu.Move": "Perkelti į...", + "SidebarCategories.CategoryMenu.CreateNew": "Sukurti naują kategoriją", + "SidebarCategories.CategoryMenu.Delete": "Ištrinti kategoriją", + "SidebarCategories.CategoryMenu.DeleteModal.Body": "{categoryName} lentos bus perkeltos atgal į lentų kategorijas. Jūs nesate pašalintas iš jokių lentų.", + "SidebarCategories.CategoryMenu.DeleteModal.Title": "Ištrinti šią kategoriją?", + "SidebarCategories.CategoryMenu.Update": "Pervadinti kategoriją", + "SidebarTour.ManageCategories.Body": "Kurkite ir tvarkykite pasirinktines kategorijas. Kategorijos priklauso nuo naudotojo, todėl lentos perkėlimas į kategoriją neturės įtakos kitiems nariams, naudojantiems tą pačią lentą.", + "SidebarTour.ManageCategories.Title": "Tvarkyti kategorijas", + "SidebarTour.SearchForBoards.Body": "Atidarykite lentos perjungiklį (Cmd / Ctrl + K), kad galėtumėte greitai ieškoti ir pridėti lentų šoninėje juostoje.", + "SidebarTour.SearchForBoards.Title": "Ieškoti lentų", + "SidebarTour.SidebarCategories.Body": "Visos Jūsų lentos dabar sutvarkytos naujoje šoninėje juostoje. Nebereikia perjungti darbo erdvių. Vienkartinės pasirinktinės kategorijos, pagrįstos ankstesnėmis darbo sritimis, gali būti automatiškai sukurtos Jums atnaujinant į 7.2 versiją. Jas galima pašalinti arba redaguoti pagal savo pageidavimus.", + "SidebarTour.SidebarCategories.Link": "Sužinoti daugiau", + "SidebarTour.SidebarCategories.Title": "Šoninės juostos kategorijos", + "SiteStats.total_boards": "Iš viso lentų", + "SiteStats.total_cards": "Iš viso kortelių", + "TableComponent.add-icon": "Pridėti piktogramą", + "TableComponent.name": "Pavadinimas", + "TableComponent.plus-new": "+ Naujas", + "TableHeaderMenu.delete": "Ištrinti", + "TableHeaderMenu.duplicate": "Pasikartojantis", + "TableHeaderMenu.hide": "Slėpti", + "TableHeaderMenu.insert-left": "Įdėkite kairėje", + "TableHeaderMenu.insert-right": "Įdėkite dešinėje", + "TableHeaderMenu.sort-ascending": "Rūšiuoti didėjančia tvarka", + "TableHeaderMenu.sort-descending": "Rūšiuoti mažėjančia tvarka", + "TableRow.DuplicateCard": "kortelės dublikatas", + "TableRow.MoreOption": "Daugiau veiksmų", + "TableRow.open": "Atverti", + "TopBar.give-feedback": "Palikti atsiliepimą", + "URLProperty.copiedLink": "Nukopijuota!", + "URLProperty.copy": "Kopijuoti", + "URLProperty.edit": "Redaguoti", + "UndoRedoHotKeys.canRedo": "Grąžinti", + "UndoRedoHotKeys.canRedo-with-description": "Perdaryti {description}", + "UndoRedoHotKeys.canUndo": "Anuliuoti", + "UndoRedoHotKeys.canUndo-with-description": "Anuliuoti {description}", + "UndoRedoHotKeys.cannotRedo": "Nėra ką perdaryti", + "UndoRedoHotKeys.cannotUndo": "Nėra ką anuliuoti", + "ValueSelector.noOptions": "Jokių parinkčių. Pradėkite rašyti, kad pridėtumėte pirmąją!", + "ValueSelector.valueSelector": "Reikšmės parinkiklis", + "ValueSelectorLabel.openMenu": "Atidaryti meniu", + "VersionMessage.help": "Patikrinkite, kas naujo šioje versijoje.", + "VersionMessage.learn-more": "Sužinoti daugiau", + "View.AddView": "Pridėti rodinį", + "View.Board": "Lenta", + "View.DeleteView": "Ištrinti rodinį", + "View.DuplicateView": "Pasikartojantis rodinys", + "View.Gallery": "Galerija", + "View.NewBoardTitle": "Lentos rodinys", + "View.NewCalendarTitle": "Kalendoriaus rodinys", + "View.NewGalleryTitle": "Galerijos vaizdas", + "View.NewTableTitle": "Lentelės rodinys", + "View.NewTemplateDefaultTitle": "Šablonas be pavadinimo", + "View.NewTemplateTitle": "Be pavadinimo", + "View.Table": "Lentelė", + "ViewHeader.add-template": "Naujas šablonas", + "ViewHeader.delete-template": "Ištrinti", + "ViewHeader.display-by": "Pateikė: {property}", + "ViewHeader.edit-template": "Redaguoti", + "ViewHeader.empty-card": "Tuščia kortelė", + "ViewHeader.export-board-archive": "Eksportuoti lentos archyvą", + "ViewHeader.export-complete": "Eksportas baigtas!", + "ViewHeader.export-csv": "Eksportuoti į CSV", + "ViewHeader.export-failed": "Eksportuoti nepavyko!", + "ViewHeader.filter": "Filtras", + "ViewHeader.group-by": "Grupuoti pagal: {property}", + "ViewHeader.new": "Naujas", + "ViewHeader.properties": "Savybės", + "ViewHeader.properties-menu": "Savybių meniu", + "ViewHeader.search-text": "Ieškoti kortelių", + "ViewHeader.select-a-template": "Pasirinkti šabloną", + "ViewHeader.set-default-template": "Nustatyti kaip numatytąjį", + "ViewHeader.sort": "Rūšiuoti", + "ViewHeader.untitled": "Be pavadinimo", + "ViewHeader.view-header-menu": "Žiūrėti antraštės meniu", + "ViewHeader.view-menu": "Žiūrėti meniu", + "ViewLimitDialog.Heading": "Pasiektas peržiūrų skaičius vienoje lentoje", + "ViewLimitDialog.PrimaryButton.Title.Admin": "Patobulinti", + "ViewLimitDialog.PrimaryButton.Title.RegularUser": "Pranešti administratoriui", + "ViewLimitDialog.Subtext.Admin": "Naujovinkite į mūsų Professional arba Enterprise planą.", + "ViewLimitDialog.Subtext.Admin.PricingPageLink": "Sužinokite daugiau apie mūsų planus.", + "ViewLimitDialog.Subtext.RegularUser": "Praneškite savo administratoriui, kad jis naujovintų į mūsų Professional arba Enterprise planą.", + "ViewLimitDialog.UpgradeImg.AltText": "atnaujinti vaizdą", + "ViewLimitDialog.notifyAdmin.Success": "Jūsų administratoriui buvo pranešta", + "ViewTitle.hide-description": "slėpti aprašymą", + "ViewTitle.pick-icon": "Pasirinkti piktogramą", + "ViewTitle.random-icon": "Atsitiktinis", + "ViewTitle.remove-icon": "Pašalinti piktogramą", + "ViewTitle.show-description": "rodyti aprašymą", + "ViewTitle.untitled-board": "Lenta be pavadinimo", + "WelcomePage.Description": "„Boards“ yra projektų valdymo įrankis, padedantis apibrėžti, organizuoti, sekti ir valdyti darbą įvairiose komandose, naudojant pažįstamą Kanban lentos vaizdą.", + "WelcomePage.Explore.Button": "Apžiūrėti", + "WelcomePage.Heading": "Sveiki atvykę į Boards", + "WelcomePage.NoThanks.Text": "Ne, ačiū, išsiaiškinsiu pats", + "WelcomePage.StartUsingIt.Text": "Pradėkite jį naudoti", + "Workspace.editing-board-template": "Redaguojate lentos šabloną.", + "badge.guest": "Svečias", + "boardPage.confirm-join-button": "Prisijungti", + "boardPage.confirm-join-text": "Jūs ketinate prisijungti prie privačios lentos, tačiau lentos administratorius Jūsų nepridėjo. Ar tikrai norite prisijungti prie šios privačios lentos?", + "boardPage.confirm-join-title": "Prisijunti prie privačios lentos", + "boardSelector.confirm-link-board": "Susieti lentą su kanalu", + "boardSelector.confirm-link-board-button": "Taip, susieti lentą", + "boardSelector.confirm-link-board-subtext": "Kai susiesite „{boardName}“ su kanalu, visi kanalo nariai (esami ir nauji) galės ją redaguoti. Tai neįtraukia narių, kurie yra svečiai. Galite bet kada atsieti lentą nuo kanalo.", + "boardSelector.confirm-link-board-subtext-with-other-channel": "Kai susiesite „{boardName}“ su kanalu, visi kanalo nariai (esami ir nauji) galės ją redaguoti. Tai neįtraukia narių, kurie yra svečiai.{lineBreak} Ši lenta šiuo metu susieta su kitu kanalu. Jis bus atsietas, jei pasirinksite susieti jį čia.", + "boardSelector.create-a-board": "Sukurti lentą", + "boardSelector.link": "nuoroda", + "boardSelector.search-for-boards": "Ieškoti lentų", + "boardSelector.title": "Susieti lentas", + "boardSelector.unlink": "Atsieti", + "calendar.month": "Mėnuo", + "calendar.today": "Šiandien", + "calendar.week": "Savaitė", + "centerPanel.undefined": "Nėra {propertyName}", + "centerPanel.unknown-user": "Nežinomas naudotojas", + "createImageBlock.failed": "Šio failo nepavyko įkelti, nes pasiektas failo dydžio limitas.", + "default-properties.badges": "Komentarai ir aprašymas", + "default-properties.title": "Pavadinimas", + "error.back-to-home": "Grįžti namo", + "error.back-to-team": "Atgal į komandą", + "error.board-not-found": "Lenta nerasta.", + "error.go-login": "Prisijungti", + "error.invalid-read-only-board": "Neturite prieigos prie šios lentos. Prisijunkite, kad pasiektumėte lentas.", + "error.not-logged-in": "Jūsų sesija gali būti pasibaigusi arba nesate prisijungę. Prisijunkite dar kartą, kad pasiektumėte lentas.", + "error.page.title": "Atsiprašome, kažkas nutiko", + "error.team-undefined": "Netinkama komanda.", + "error.unknown": "Įvyko klaida.", + "generic.previous": "Ankstesnis", + "guest-no-board.subtitle": "Dar neturite prieigos prie jokios šios komandos lentos, palaukite, kol kas nors jus įtrauks į bet kurią lentą.", + "guest-no-board.title": "Dar nėra jokių lentų", + "imagePaste.upload-failed": "Kai kurie failai nebuvo įkelti, nes pasiektas failo dydžio limitas.", + "limitedCard.title": "Paslėptos kortelės", + "login.log-in-button": "Prisijungti", + "login.log-in-title": "Prisijungti", + "login.register-button": "arba susikurkite paskyrą, jei jos neturite", + "new_channel_modal.create_board.empty_board_description": "Sukurti naują tuščią lentą", + "new_channel_modal.create_board.empty_board_title": "Tuščia lenta", + "new_channel_modal.create_board.select_template_placeholder": "Pasirinkti šabloną", + "new_channel_modal.create_board.title": "Sukurti šio kanalo lentą", + "notification-box-card-limit-reached.close-tooltip": "Snausti 10 dienų", + "notification-box-card-limit-reached.contact-link": "praneškite savo administratoriui", + "notification-box-card-limit-reached.link": "Atnaujinti į mokamą planą", + "notification-box-card-limit-reached.title": "{cards} kortelės paslėptos", + "notification-box-cards-hidden.title": "Šis veiksmas paslėpė kitą kortelę", + "notification-box.card-limit-reached.not-admin.text": "Norėdami pasiekti archyvuotas korteles, galite {contactLink} naujovinti į mokamą planą.", + "notification-box.card-limit-reached.text": "Pasiektas kortelių limitas, jei norite peržiūrėti senesnes korteles, {link}", + "person.add-user-to-board": "Pridėti {username} prie lentos", + "person.add-user-to-board-confirm-button": "Pridėti prie lentos", + "person.add-user-to-board-permissions": "Leidimai", + "person.add-user-to-board-question": "Ar norite pridėti {username} prie lentos?", + "person.add-user-to-board-warning": "{username} nėra lentos narys ir negaus apie tai jokių pranešimų.", + "register.login-button": "arba prisijunkite, jei jau turite paskyrą", + "register.signup-title": "Prisiregistruokite prie paskyros", + "rhs-board-non-admin-msg": "Jūs nesate lentos administratorius", + "rhs-boards.add": "Pridėti", + "rhs-boards.dm": "AŽ", + "rhs-boards.gm": "GŽ", + "rhs-boards.header.dm": "ši tiesioginė žinutė", + "rhs-boards.header.gm": "ši grupės žinutė", + "rhs-boards.last-update-at": "Paskutinį kartą atnaujinta: {datetime}", + "rhs-boards.link-boards-to-channel": "Susieti lentas su {channelName}", + "rhs-boards.linked-boards": "Susietos lentos", + "rhs-boards.no-boards-linked-to-channel": "Su {channelName} dar nėra susietų lentų", + "rhs-boards.no-boards-linked-to-channel-description": "„Boards“ yra projektų valdymo įrankis, padedantis apibrėžti, organizuoti, sekti ir valdyti darbą įvairiose komandose, naudojant pažįstamą Kanban lentos vaizdą.", + "rhs-boards.unlink-board": "Atsieti lentą", + "rhs-boards.unlink-board1": "Atsieti lentą", + "rhs-channel-boards-header.title": "Boards", + "share-board.publish": "Paskelbti", + "share-board.share": "Bendrinti", + "shareBoard.channels-select-group": "Kanalai", + "shareBoard.confirm-change-team-role.body": "Visi šioje lentoje esantys asmenys, turintys žemesnį nei „{role}“ vaidmenį , dabar bus paaukštinti į {role} . Ar tikrai norite pakeisti minimalų lentos vaidmenį?", + "shareBoard.confirm-change-team-role.confirmBtnText": "Pakeiskite minimalų lentos vaidmenį", + "shareBoard.confirm-change-team-role.title": "Pakeiskite minimalų lentos vaidmenį", + "shareBoard.confirm-link-channel": "Susieti lentą su kanalu", + "shareBoard.confirm-link-channel-button": "Susieti kanalą", + "shareBoard.confirm-link-channel-button-with-other-channel": "Atsieti ir susieti čia", + "shareBoard.confirm-link-channel-subtext": "Kai susiesite kanalą su lenta, visi kanalo nariai (esami ir nauji) galės ją redaguoti. Tai neįtraukia narių, kurie yra svečiai.", + "shareBoard.confirm-link-channel-subtext-with-other-channel": "Kai susiesite kanalą su lenta, visi kanalo nariai (esami ir nauji) galės jį redaguoti. Tai neįtraukia narių, kurie yra svečiai.{lineBreak}Ši lenta šiuo metu susieta su kitu kanalu. Jis bus atsietas, jei pasirinksite susieti jį čia.", + "shareBoard.confirm-unlink.body": "Kai atsiesite kanalą nuo lentos, visi kanalo nariai (esami ir nauji) praras prieigą prie jo, nebent jiems bus suteiktas atskiras leidimas.", + "shareBoard.confirm-unlink.confirmBtnText": "Atsieti kanalą", + "shareBoard.confirm-unlink.title": "Atsieti kanalą nuo lentos", + "shareBoard.lastAdmin": "Lentose turi būti bent vienas administratorius", + "shareBoard.members-select-group": "Nariai", + "shareBoard.unknown-channel-display-name": "Nežinomas kanalas", + "tutorial_tip.finish_tour": "Atlikta", + "tutorial_tip.got_it": "Supratau", + "tutorial_tip.ok": "Kitas", + "tutorial_tip.out": "Atsisakyti šių patarimų.", + "tutorial_tip.seen": "Matėte tai anksčiau?" +} diff --git a/webapp/boards/jest.config.js b/webapp/boards/jest.config.js index 05b4cd53e9..85b8e69719 100644 --- a/webapp/boards/jest.config.js +++ b/webapp/boards/jest.config.js @@ -7,7 +7,7 @@ const config = { transform: { "^.+\\.(t|j)sx?$": ["@swc/jest"] }, - moduleFileExtensions: [ + moduleFileExtensions: [ "ts", "tsx", "js", @@ -20,7 +20,6 @@ const config = { "/nanoevents/", "node_modules/(?!react-native|react-router|react-day-picker)" ], - maxWorkers: "80%", testEnvironment: "jsdom", collectCoverage: true, collectCoverageFrom: [ diff --git a/webapp/boards/package.json b/webapp/boards/package.json index bf2a0f36e2..6a16614cd5 100644 --- a/webapp/boards/package.json +++ b/webapp/boards/package.json @@ -1,10 +1,9 @@ { "name": "boards", - "version": "7.10.0", + "version": "7.9.1", "private": true, "description": "", "scripts": { - "i18n-extract": "formatjs extract \"src/**/*.{ts,tsx}\" --ignore \"**/*.d.ts\" \"../**/*.d.ts\" --out-file i18n/tmp.json && formatjs compile i18n/tmp.json --out-file i18n/en.json && npx rimraf i18n/tmp.json", "build": "webpack --mode=production", "build:watch": "webpack --mode=production --watch", "start:product": "webpack serve --mode=development", @@ -18,6 +17,7 @@ "check-types": "tsc -b", "check-types:fix": "npm run check-types -- --noEmit --fix", "check": "npm run check-lint && npm run check-style", + "i18n-extract": "formatjs extract \"src/**/*.{ts,tsx}\" --ignore \"**/*.d.ts\" --id-interpolation-pattern '[sha512:contenthash:base64:6]' --format simple --out-file i18n/en.json", "fix": "npm run check-lint:fix && npm run check-style:fix", "test": "cross-env TZ=Etc/UTC jest", "test:watch": "cross-env TZ=Etc/UTC jest --watch", @@ -46,7 +46,6 @@ "glob-parent": "6.0.2", "lodash": "^4.17.21", "marked": "4.0.17", - "mini-create-react-context": "^0.4.1", "moment": "^2.29.1", "nanoevents": "^5.1.13", "react": "17.0.2", @@ -59,7 +58,7 @@ "react-dom": "17.0.2", "react-hot-keys": "^2.7.1", "react-hotkeys-hook": "^3.4.4", - "react-intl": "^5.20.0", + "react-intl": "*", "react-redux": "^7.2.1", "react-router-dom": "^5.2.0", "react-select": "5.5.9", @@ -96,7 +95,6 @@ "@types/node": "16.11.7", "@types/react": "17.0.53", "@types/react-beautiful-dnd": "^13.1.2", - "@types/react-day-picker": "5.3.0", "@types/react-dom": "17.0.19", "@types/react-redux": "^7.1.23", "@types/react-router-dom": "^5.3.3", @@ -105,11 +103,9 @@ "@typescript-eslint/eslint-plugin": "5.57.1", "@typescript-eslint/parser": "5.57.1", "babel-eslint": "10.1.0", - "cross-env": "^7.0.3", "css-loader": "6.7.1", "eslint-import-resolver-webpack": "0.13.2", "eslint-plugin-babel": "^5.3.1", - "eslint-plugin-formatjs": "4.9.0", "eslint-plugin-header": "3.1.1", "eslint-plugin-import": "2.25.4", "eslint-plugin-import-newlines": "1.3.1", diff --git a/webapp/boards/src/components/boardsSwitcherDialog/boardSwitcherDialog.tsx b/webapp/boards/src/components/boardsSwitcherDialog/boardSwitcherDialog.tsx index f0325bf586..c45d87e5d0 100644 --- a/webapp/boards/src/components/boardsSwitcherDialog/boardSwitcherDialog.tsx +++ b/webapp/boards/src/components/boardsSwitcherDialog/boardSwitcherDialog.tsx @@ -39,7 +39,7 @@ const BoardSwitcherDialog = (props: Props): JSX.Element => { const team = useAppSelector(getCurrentTeam) const me = useAppSelector(getMe) const title = intl.formatMessage({id: 'FindBoardsDialog.Title', defaultMessage: 'Find Boards'}) - const subTitle = intl.formatMessage( + const subTitle = intl.formatMessage( { id: 'FindBoardsDialog.SubTitle', defaultMessage: 'Type to find a board. Use UP/DOWN to browse. ENTER to select, ESC to dismiss', diff --git a/webapp/boards/src/components/shareBoard/teamPermissionsRow.tsx b/webapp/boards/src/components/shareBoard/teamPermissionsRow.tsx index 1f7c1a5822..25a5a8a6c0 100644 --- a/webapp/boards/src/components/shareBoard/teamPermissionsRow.tsx +++ b/webapp/boards/src/components/shareBoard/teamPermissionsRow.tsx @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import React, {useState} from 'react' +import React, {ReactNode, useState} from 'react' import {useIntl} from 'react-intl' import MenuWrapper from 'src/widgets/menuWrapper' @@ -77,7 +77,7 @@ const TeamPermissionsRow = (): JSX.Element => { id: 'shareBoard.confirm-change-team-role.title', defaultMessage: 'Change minimum board role', }), - subText: intl.formatMessage({ + subText: intl.formatMessage({ id: 'shareBoard.confirm-change-team-role.body', defaultMessage: 'Everyone on this board with a lower permission than the "{role}" role will now be promoted to {role}. Are you sure you want to change the minimum role for the board?', }, { diff --git a/webapp/boards/src/components/sidebar/sidebarCategory.test.tsx b/webapp/boards/src/components/sidebar/sidebarCategory.test.tsx index 5b97525b25..ec233123dc 100644 --- a/webapp/boards/src/components/sidebar/sidebarCategory.test.tsx +++ b/webapp/boards/src/components/sidebar/sidebarCategory.test.tsx @@ -193,7 +193,10 @@ describe('components/sidebarCategory', () => { expect(mockTemplateClose).toBeCalled() }) - test('sidebar template close other', async () => { + // TODO: Remove when fetch is mocked correctly + // https://mattermost.atlassian.net/browse/MM-52212 + // eslint-disable-next-line no-only-tests/no-only-tests + test.skip('sidebar template close other', async () => { const mockStore = configureStore([]) const store = mockStore(state) diff --git a/webapp/boards/src/components/sidebar/sidebarCategory.tsx b/webapp/boards/src/components/sidebar/sidebarCategory.tsx index dc036fc180..5b54c8c7a9 100644 --- a/webapp/boards/src/components/sidebar/sidebarCategory.tsx +++ b/webapp/boards/src/components/sidebar/sidebarCategory.tsx @@ -1,6 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. import React, { + ReactNode, useCallback, useEffect, useMemo, @@ -167,7 +168,7 @@ const SidebarCategory = (props: Props) => { id: 'SidebarCategories.CategoryMenu.DeleteModal.Title', defaultMessage: 'Delete this category?', }), - subText: intl.formatMessage( + subText: intl.formatMessage( { id: 'SidebarCategories.CategoryMenu.DeleteModal.Body', defaultMessage: 'Boards in {categoryName} will move back to the Boards categories. You\'re not removed from any boards.', diff --git a/webapp/channels/.eslintrc.json b/webapp/channels/.eslintrc.json index cdc3b7bf18..644947847a 100644 --- a/webapp/channels/.eslintrc.json +++ b/webapp/channels/.eslintrc.json @@ -97,7 +97,7 @@ } ], "max-lines": ["warn", {"max": 800, "skipBlankLines": true, "skipComments": true}], - "formatjs/no-multiple-whitespaces": ["error"] + "formatjs/no-multiple-whitespaces": 2 }, "overrides": [ { diff --git a/webapp/channels/README.md b/webapp/channels/README.md deleted file mode 100644 index 48fcadb720..0000000000 --- a/webapp/channels/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# Mattermost Web App -# [![Mattermost](https://user-images.githubusercontent.com/7205829/137170381-fe86eef0-bccc-4fdd-8e92-b258884ebdd7.png)](https://mattermost.com) - -[Mattermost](https://mattermost.com) is an open source platform for secure collaboration across the entire software development lifecycle. This repo is the primary source for core development on the Mattermost platform; it's written in Golang and React, and runs as a single Linux binary with MySQL or PostgreSQL. A new compiled version is released under an MIT license every month on the 16th. - -mattermost-hero - -This repo hosts the webapp client code. If you'd like to report an issue with Mattermost, please create an issue on [mattermost-server](https://github.com/mattermost/mattermost-server), which hosts the server code. You can also look at the [Get Help With Mattermost](https://docs.mattermost.com/guides/get-help.html) guide to find the resources available to our community. - -- [Product documentation](https://docs.mattermost.com/) -- [Developer documentation](https://developers.mattermost.com/) -- [Download compiled version](https://mattermost.com/download) - -## Try out Mattermost - -- [Join the Mattermost Contributor's server](https://community.mattermost.com/signup_user_complete/?id=codoy5s743rq5mk18i7u5ksz7e) to join community discussions about contributions, development and more -- [Get started with Mattermost Cloud](https://customers.mattermost.com/cloud/signup) to try out Mattermost - -[![Deploy a Preview](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/mattermost/mattermost-heroku) - -_Note: Heroku preview does not include email or persistent storage._ - -## Install Mattermost - -- [Deploy Guide](https://docs.mattermost.com/guides/deployment.html) - Deploy Mattermost in minutes via Docker, Ubuntu, or tar. -- [Developer Machine Setup](https://developers.mattermost.com/contribute/server/developer-setup) - Follow this guide if you want to write code for Mattermost - -Other Install Guides: -- [Deploy Mattermost on Docker](https://docs.mattermost.com/install/install-docker.html) -- [Mattermost Omnibus](https://docs.mattermost.com/install/installing-mattermost-omnibus.html) -- [Install Mattermost from Tar](https://docs.mattermost.com/install/install-tar.html) -- [Ubuntu 20.04 LTS](https://docs.mattermost.com/install/installing-ubuntu-2004-LTS.html) -- [Kubernetes](https://docs.mattermost.com/install/install-kubernetes.html) -- [Helm](https://docs.mattermost.com/install/install-kubernetes.html#installing-the-operators-via-helm) -- [Debian Buster](https://docs.mattermost.com/install/install-debian.html) -- [RHEL 8](https://docs.mattermost.com/install/install-rhel-8.html) -- [More server install guides](https://docs.mattermost.com/guides/deployment.html) - -## Get Involved - -- [Contribute to Mattermost](https://handbook.mattermost.com/contributors/contributors/ways-to-contribute) -- [Find "Help Wanted" projects](https://github.com/mattermost/mattermost-server/issues?page=1&q=is%3Aissue+is%3Aopen+%22Help+Wanted%22&utf8=%E2%9C%93) -- [Join Developer Discussion on a Mattermost Server for contributors](https://docs.mattermost.com/guides/community-chat.html) -- [Get Help With Mattermost](https://docs.mattermost.com/guides/get-help.html) - -## Learn More - -- [API Options - webhooks, slash commands, drivers and web service](https://api.mattermost.com/) -- [Localization Guide](https://handbook.mattermost.com/contributors/contributors/localization) - -## Get the Latest News - -- **Twitter** - Follow [Mattermost](https://twitter.com/Mattermost) -- **Email** - Subscribe to our [newsletter](https://mattermost.com/community-newsletter/) - -Any other questions, mail us at [info@mattermost.com](mailto:info@mattermost.com). We'd love to meet you! diff --git a/webapp/channels/build/contrib/gitlab/.gitlab-ci.yml b/webapp/channels/build/contrib/gitlab/.gitlab-ci.yml index 66b2cef95e..9d9bb1c246 100644 --- a/webapp/channels/build/contrib/gitlab/.gitlab-ci.yml +++ b/webapp/channels/build/contrib/gitlab/.gitlab-ci.yml @@ -13,4 +13,4 @@ test: before_script: - npm ci --ignore-scripts script: - - npm run test:speed + - npm run test diff --git a/webapp/channels/package.json b/webapp/channels/package.json index 090f9bc96a..c2f702aa9b 100644 --- a/webapp/channels/package.json +++ b/webapp/channels/package.json @@ -3,7 +3,7 @@ "browser": { "./client/web_client.jsx": "./client/browser_web_client.jsx" }, - "version": "7.9.0", + "version": "7.9.1", "private": true, "dependencies": { "@floating-ui/react-dom": "1.0.0", @@ -51,7 +51,7 @@ "localforage": "1.10.0", "localforage-observable": "2.1.1", "lodash": "4.17.21", - "luxon": "3.0.4", + "luxon": "3.3.0", "mark.js": "8.11.1", "marked": "github:mattermost/marked#2ef7f28cc7718e3f551c4ce9ea75fdd7580c2008", "memoize-one": "6.0.0", @@ -70,7 +70,7 @@ "react-day-picker": "8.3.6", "react-dom": "17.0.2", "react-hot-loader": "4.13.0", - "react-intl": "5.20.10", + "react-intl": "*", "react-is": "17.0.2", "react-overlays": "0.9.3", "react-popper": "2.3.0", @@ -116,6 +116,7 @@ "@redux-devtools/extension": "3.2.3", "@testing-library/jest-dom": "5.16.4", "@testing-library/react": "12.1.4", + "@testing-library/user-event": "12.1.4", "@types/bootstrap": "4.5.0", "@types/country-list": "2.1.0", "@types/enzyme": "3.10.11", @@ -155,14 +156,12 @@ "babel-plugin-typescript-to-proptypes": "1.4.2", "bundle-loader": "0.2.0", "copy-webpack-plugin": "11.0.0", - "cross-env": "7.0.3", "css-loader": "5.2.6", "dotenv-webpack": "8.0.1", "enzyme": "3.11.0", "enzyme-adapter-react-17-updated": "1.0.2", "enzyme-to-json": "3.6.2", "eslint-import-resolver-webpack": "0.13.2", - "eslint-plugin-formatjs": "4.9.1", "eslint-plugin-header": "3.1.1", "eslint-plugin-import": "2.27.5", "eslint-plugin-mattermost": "github:mattermost/eslint-plugin-mattermost#5b0c972eacf19286e4c66221b39113bf8728a99e", @@ -215,15 +214,13 @@ "build": "cross-env NODE_ENV=production webpack", "run": "webpack --progress --watch", "dev-server": "webpack serve --mode development", - "test": "cross-env TZ=Etc/UTC jest --maxWorkers=50%", + "test": "cross-env TZ=Etc/UTC jest", + "test:watch": "cross-env TZ=Etc/UTC jest --watch", + "test:updatesnapshot": "cross-env TZ=Etc/UTC jest --updateSnapshot", + "test:debug": "cross-env TZ=Etc/UTC jest --forceExit --detectOpenHandles --verbose", "test-ci": "cross-env TZ=Etc/UTC jest --ci --maxWorkers=100%", "clean": "rm -rf dist node_modules .eslintcache .stylelintcache tsconfig.tsbuildinfo", "stats": "cross-env NODE_ENV=production webpack --profile --json > webpack_stats.json", - "updatesnapshot": "cross-env TZ=Etc/UTC jest --updateSnapshot", - "test:debug": "cross-env TZ=Etc/UTC jest --forceExit --detectOpenHandles", - "test:speed": "cross-env TZ=Etc/UTC jest", - "test:watch": "cross-env TZ=Etc/UTC jest --watch", - "test:coverage": "cross-env TZ=Etc/UTC jest --coverage", "mmjstool": "mmjstool", "i18n-extract": "npm run mmjstool -- i18n extract-webapp --webapp-dir ./src", "i18n-clean-empty": "npm run mmjstool -- i18n clean-empty --webapp-dir ./src", diff --git a/webapp/channels/src/actions/notification_actions.jsx b/webapp/channels/src/actions/notification_actions.jsx index 95e3d450e2..088cf1aedb 100644 --- a/webapp/channels/src/actions/notification_actions.jsx +++ b/webapp/channels/src/actions/notification_actions.jsx @@ -14,9 +14,11 @@ import {isSystemMessage, isUserAddedInChannel} from 'mattermost-redux/utils/post import {displayUsername} from 'mattermost-redux/utils/user_utils'; import {isThreadOpen} from 'selectors/views/threads'; +import {getChannelURL, getPermalinkURL} from 'selectors/urls'; import {getHistory} from 'utils/browser_history'; import Constants, {NotificationLevels, UserStatuses} from 'utils/constants'; +import * as NotificationSounds from 'utils/notification_sounds'; import {showNotification} from 'utils/notifications'; import {isDesktopApp, isMobileApp, isWindowsApp} from 'utils/user_agent'; import * as Utils from 'utils/utils'; @@ -178,17 +180,17 @@ export function sendDesktopNotification(post, msgProps) { if (notify) { const updatedState = getState(); - let url = Utils.getChannelURL(updatedState, channel, teamId); + let url = getChannelURL(updatedState, channel, teamId); if (isCrtReply) { - url = Utils.getPermalinkURL(updatedState, teamId, post.id); + url = getPermalinkURL(updatedState, teamId, post.id); } dispatch(notifyMe(title, body, channel, teamId, !sound, soundName, url)); //Don't add extra sounds on native desktop clients if (sound && !isDesktopApp() && !isMobileApp()) { - Utils.ding(soundName); + NotificationSounds.ding(soundName); } } }; diff --git a/webapp/channels/src/actions/notification_actions.test.js b/webapp/channels/src/actions/notification_actions.test.js index 56fbca06db..c8b5a70599 100644 --- a/webapp/channels/src/actions/notification_actions.test.js +++ b/webapp/channels/src/actions/notification_actions.test.js @@ -5,8 +5,8 @@ import testConfigureStore from 'tests/test_store'; import {getHistory} from 'utils/browser_history'; import Constants, {NotificationLevels, UserStatuses} from 'utils/constants'; +import * as NotificationSounds from 'utils/notification_sounds'; import * as utils from 'utils/notifications'; -import * as baseUtils from 'utils/utils'; import {sendDesktopNotification} from './notification_actions'; @@ -22,7 +22,7 @@ describe('notification_actions', () => { beforeEach(() => { spy = jest.spyOn(utils, 'showNotification'); - baseUtils.ding = jest.fn(); + NotificationSounds.ding = jest.fn(); crt = { user_id: 'current_user_id', @@ -315,7 +315,7 @@ describe('notification_actions', () => { }); test('should default sound when no sound is specified', () => { - const dingSpy = jest.spyOn(baseUtils, 'ding'); + const dingSpy = jest.spyOn(NotificationSounds, 'ding'); baseState.entities.users.profiles.current_user_id.notify_props.desktop_sound = 'true'; const store = testConfigureStore(baseState); return store.dispatch(sendDesktopNotification(post, msgProps)).then(() => { @@ -324,7 +324,7 @@ describe('notification_actions', () => { }); test('should use specified sound when specified', () => { - const dingSpy = jest.spyOn(baseUtils, 'ding'); + const dingSpy = jest.spyOn(NotificationSounds, 'ding'); baseState.entities.users.profiles.current_user_id.notify_props.desktop_sound = 'true'; baseState.entities.users.profiles.current_user_id.notify_props.desktop_notification_sound = 'Crackle'; const store = testConfigureStore(baseState); diff --git a/webapp/channels/src/components/__snapshots__/formatted_markdown_message.test.tsx.snap b/webapp/channels/src/components/__snapshots__/formatted_markdown_message.test.tsx.snap index 4c65f52555..07a4830b20 100644 --- a/webapp/channels/src/components/__snapshots__/formatted_markdown_message.test.tsx.snap +++ b/webapp/channels/src/components/__snapshots__/formatted_markdown_message.test.tsx.snap @@ -4,6 +4,7 @@ exports[`components/FormattedMarkdownMessage should allow to disable links 1`] = - - -`; - -exports[`components/AboutBuildModal should match snapshot for enterprise edition 1`] = ` - - - - - - - -
-
- -
-
-

- - Mattermost - - - -

-

- -

-
-
- - -  3.6.2 - -
-
- - -  77 - -
-
- -  Postgres -
-
-
- - - Mattermost Inc -
-
-
-
-
- - - mattermost.com - -
-
-
- -
-
- - - - - - - - -
-
-
-
-

- -

-
-
-

- - - abcdef1234567890 -
- - - 0123456789abcdef -

-

- - - 21 January 2017 -

-
-
-
-`; - -exports[`components/AboutBuildModal should match snapshot for team edition 1`] = ` - - - - - - - -
-
- -
-
-

- - Mattermost - - - -

-

- -

-
-
- - -  3.6.2 - -
-
- - -  77 - -
-
- -  Postgres -
-
-
-
-
-
- - - mattermost.com/community/ - -
-
-
- -
-
- - - - - - - - -
-
-
-
-

- -

-
-
-

- - - abcdef1234567890 -
- - -

-

- - - 21 January 2017 -

-
-
-
-`; - -exports[`components/AboutBuildModal should show ci if a ci build 1`] = ` - - - - - - - -
-
- -
-
-

- - Mattermost - - - -

-

- -

-
-
- - -  ci - -
-
- - -  77 - -
-
- - -  123 - -
-
- -  Postgres -
-
-
-
-
-
- - - mattermost.com/community/ - -
-
-
- -
-
- - - - - - - - -
-
-
-
-

- -

-
-
-

- - - abcdef1234567890 -
- - -

-

- - - 21 January 2017 -

-
-
-
-`; - -exports[`components/AboutBuildModal should show dev if this is a dev build 1`] = ` - - - - - - - -
-
- -
-
-

- - Mattermost - - - -

-

- -

-
-
- - -  dev - -
-
- - -  77 - -
-
- -  Postgres -
-
-
-
-
-
- - - mattermost.com/community/ - -
-
-
- -
-
- - - - - - - - -
-
-
-
-

- -

-
-
-

- - - abcdef1234567890 -
- - -

-

- - - 21 January 2017 -

-
-
-
-`; diff --git a/webapp/channels/src/components/about_build_modal/about_build_modal.test.tsx b/webapp/channels/src/components/about_build_modal/about_build_modal.test.tsx index 33241a3b7b..bff5e106b5 100644 --- a/webapp/channels/src/components/about_build_modal/about_build_modal.test.tsx +++ b/webapp/channels/src/components/about_build_modal/about_build_modal.test.tsx @@ -2,8 +2,6 @@ // See LICENSE.txt for license information. import React from 'react'; -import {Modal} from 'react-bootstrap'; -import {shallow} from 'enzyme'; import {Provider} from 'react-redux'; import mockStore from 'tests/test_store'; @@ -12,11 +10,13 @@ import {ClientConfig, ClientLicense} from '@mattermost/types/config'; import AboutBuildModal from 'components/about_build_modal/about_build_modal'; -import {mountWithIntl} from 'tests/helpers/intl-test-helper'; - import {AboutLinks} from 'utils/constants'; import AboutBuildModalCloud from './about_build_modal_cloud/about_build_modal_cloud'; +import {screen} from '@testing-library/react'; +import {renderWithIntl} from 'tests/react_testing_utils'; +import store from 'stores/redux_store'; +import userEvent from '@testing-library/user-event'; describe('components/AboutBuildModal', () => { const RealDate: DateConstructor = Date; @@ -60,10 +60,17 @@ describe('components/AboutBuildModal', () => { }); test('should match snapshot for enterprise edition', () => { - const wrapper = shallowAboutBuildModal({config, license}); - expect(wrapper.find('#versionString').text()).toBe('\u00a03.6.2'); - expect(wrapper.find('#dbversionString').text()).toBe('\u00a077'); - expect(wrapper).toMatchSnapshot(); + renderAboutBuildModal({config, license}); + expect(screen.getByTestId('aboutModalVersion')).toHaveTextContent('Mattermost Version: 3.6.2'); + expect(screen.getByTestId('aboutModalDBVersionString')).toHaveTextContent('Database Schema Version: 77'); + expect(screen.getByText('Mattermost Enterprise Edition')).toBeInTheDocument(); + expect(screen.getByText('Modern communication from behind your firewall.')).toBeInTheDocument(); + expect(screen.getByRole('link', {name: 'mattermost.com'})).toHaveAttribute('href', 'https://mattermost.com/?utm_source=mattermost&utm_medium=in-product&utm_content=about_build_modal&uid=&sid='); + expect(screen.getByText('EE Build Hash: 0123456789abcdef', {exact: false})).toBeInTheDocument(); + + expect(screen.getByRole('link', {name: 'server'})).toHaveAttribute('href', 'https://github.com/mattermost/mattermost-server/blob/master/NOTICE.txt'); + expect(screen.getByRole('link', {name: 'desktop'})).toHaveAttribute('href', 'https://github.com/mattermost/desktop/blob/master/NOTICE.txt'); + expect(screen.getByRole('link', {name: 'mobile'})).toHaveAttribute('href', 'https://github.com/mattermost/mattermost-mobile/blob/master/NOTICE.txt'); }); test('should match snapshot for team edition', () => { @@ -73,19 +80,25 @@ describe('components/AboutBuildModal', () => { BuildHashEnterprise: '', }; - const wrapper = shallowAboutBuildModal({config: teamConfig, license: {}}); - expect(wrapper.find('#versionString').text()).toBe('\u00a03.6.2'); - expect(wrapper.find('#dbversionString').text()).toBe('\u00a077'); - expect(wrapper).toMatchSnapshot(); + renderAboutBuildModal({config: teamConfig, license: {}}); + expect(screen.getByTestId('aboutModalVersion')).toHaveTextContent('Mattermost Version: 3.6.2'); + expect(screen.getByTestId('aboutModalDBVersionString')).toHaveTextContent('Database Schema Version: 77'); + expect(screen.getByText('Mattermost Team Edition')).toBeInTheDocument(); + expect(screen.getByText('All your team communication in one place, instantly searchable and accessible anywhere.')).toBeInTheDocument(); + expect(screen.getByRole('link', {name: 'mattermost.com/community/'})).toHaveAttribute('href', 'https://mattermost.com/community/?utm_source=mattermost&utm_medium=in-product&utm_content=about_build_modal&uid=&sid='); + expect(screen.queryByText('EE Build Hash: 0123456789abcdef')).not.toBeInTheDocument(); + + expect(screen.getByRole('link', {name: 'server'})).toHaveAttribute('href', 'https://github.com/mattermost/mattermost-server/blob/master/NOTICE.txt'); + expect(screen.getByRole('link', {name: 'desktop'})).toHaveAttribute('href', 'https://github.com/mattermost/desktop/blob/master/NOTICE.txt'); + expect(screen.getByRole('link', {name: 'mobile'})).toHaveAttribute('href', 'https://github.com/mattermost/mattermost-mobile/blob/master/NOTICE.txt'); }); test('should match snapshot for cloud edition', () => { if (license !== null) { license.Cloud = 'true'; } - const store = mockStore(); - const wrapper = shallow( + renderWithIntl( { /> , ); - expect(wrapper).toMatchSnapshot(); + + expect(screen.getByText('Mattermost Cloud')).toBeInTheDocument(); + expect(screen.getByText('High trust messaging for the enterprise')).toBeInTheDocument(); + + expect(screen.getByText('0123456789abcdef', {exact: false})).toBeInTheDocument(); + expect(screen.getByRole('link', {name: 'server'})).toHaveAttribute('href', 'https://github.com/mattermost/mattermost-server/blob/master/NOTICE.txt'); + expect(screen.getByRole('link', {name: 'desktop'})).toHaveAttribute('href', 'https://github.com/mattermost/desktop/blob/master/NOTICE.txt'); + expect(screen.getByRole('link', {name: 'mobile'})).toHaveAttribute('href', 'https://github.com/mattermost/mattermost-mobile/blob/master/NOTICE.txt'); }); test('should show dev if this is a dev build', () => { @@ -109,10 +129,18 @@ describe('components/AboutBuildModal', () => { BuildNumber: 'dev', }; - const wrapper = shallowAboutBuildModal({config: sameBuildConfig, license: {}}); - expect(wrapper).toMatchSnapshot(); - expect(wrapper.find('#versionString').text()).toBe('\u00a0dev'); - expect(wrapper.find('#dbversionString').text()).toBe('\u00a077'); + renderAboutBuildModal({config: sameBuildConfig, license: {}}); + + expect(screen.getByTestId('aboutModalVersion')).toHaveTextContent('Mattermost Version: dev'); + expect(screen.getByTestId('aboutModalDBVersionString')).toHaveTextContent('Database Schema Version: 77'); + expect(screen.getByText('Mattermost Team Edition')).toBeInTheDocument(); + expect(screen.getByText('All your team communication in one place, instantly searchable and accessible anywhere.')).toBeInTheDocument(); + expect(screen.getByRole('link', {name: 'mattermost.com/community/'})).toHaveAttribute('href', 'https://mattermost.com/community/?utm_source=mattermost&utm_medium=in-product&utm_content=about_build_modal&uid=&sid='); + expect(screen.queryByText('EE Build Hash: 0123456789abcdef')).not.toBeInTheDocument(); + + expect(screen.getByRole('link', {name: 'server'})).toHaveAttribute('href', 'https://github.com/mattermost/mattermost-server/blob/master/NOTICE.txt'); + expect(screen.getByRole('link', {name: 'desktop'})).toHaveAttribute('href', 'https://github.com/mattermost/desktop/blob/master/NOTICE.txt'); + expect(screen.getByRole('link', {name: 'mobile'})).toHaveAttribute('href', 'https://github.com/mattermost/mattermost-mobile/blob/master/NOTICE.txt'); }); test('should show ci if a ci build', () => { @@ -125,11 +153,19 @@ describe('components/AboutBuildModal', () => { BuildNumber: '123', }; - const wrapper = shallowAboutBuildModal({config: differentBuildConfig, license: {}}); - expect(wrapper).toMatchSnapshot(); - expect(wrapper.find('#versionString').text()).toBe('\u00a0ci'); - expect(wrapper.find('#dbversionString').text()).toBe('\u00a077'); - expect(wrapper.find('#buildnumberString').text()).toBe('\u00a0123'); + renderAboutBuildModal({config: differentBuildConfig, license: {}}); + + expect(screen.getByTestId('aboutModalVersion')).toHaveTextContent('Mattermost Version: ci'); + expect(screen.getByTestId('aboutModalDBVersionString')).toHaveTextContent('Database Schema Version: 77'); + expect(screen.getByTestId('aboutModalBuildNumber')).toHaveTextContent('Build Number: 123'); + expect(screen.getByText('Mattermost Team Edition')).toBeInTheDocument(); + expect(screen.getByText('All your team communication in one place, instantly searchable and accessible anywhere.')).toBeInTheDocument(); + expect(screen.getByRole('link', {name: 'mattermost.com/community/'})).toHaveAttribute('href', 'https://mattermost.com/community/?utm_source=mattermost&utm_medium=in-product&utm_content=about_build_modal&uid=&sid='); + expect(screen.queryByText('EE Build Hash: 0123456789abcdef')).not.toBeInTheDocument(); + + expect(screen.getByRole('link', {name: 'server'})).toHaveAttribute('href', 'https://github.com/mattermost/mattermost-server/blob/master/NOTICE.txt'); + expect(screen.getByRole('link', {name: 'desktop'})).toHaveAttribute('href', 'https://github.com/mattermost/desktop/blob/master/NOTICE.txt'); + expect(screen.getByRole('link', {name: 'mobile'})).toHaveAttribute('href', 'https://github.com/mattermost/mattermost-mobile/blob/master/NOTICE.txt'); }); test('should call onExited callback when the modal is hidden', () => { @@ -148,7 +184,7 @@ describe('components/AboutBuildModal', () => { }, }); - const wrapper = mountWithIntl( + renderWithIntl( { , ); - wrapper.find(Modal).first().props().onExited?.(document.createElement('div')); + userEvent.click(screen.getByText('Close')); expect(onExited).toHaveBeenCalledTimes(1); }); @@ -176,7 +212,7 @@ describe('components/AboutBuildModal', () => { }, }, }); - const wrapper = mountWithIntl( + renderWithIntl( { , ); - expect( - wrapper.find(AboutBuildModal).find('a#tosLink').props().href, - ).toBe( - AboutLinks.TERMS_OF_SERVICE + - '?utm_source=mattermost&utm_medium=in-product&utm_content=about_build_modal&uid=currentUserId&sid=', - ); - expect( - wrapper.find(AboutBuildModal).find('a#privacyLink').props().href, - ).toBe( - AboutLinks.PRIVACY_POLICY + - '?utm_source=mattermost&utm_medium=in-product&utm_content=about_build_modal&uid=currentUserId&sid=', - ); + expect(screen.getByRole('link', {name: 'Terms of Use'})).toHaveAttribute('href', `${AboutLinks.TERMS_OF_SERVICE}?utm_source=mattermost&utm_medium=in-product&utm_content=about_build_modal&uid=currentUserId&sid=`); - expect(wrapper.find(AboutBuildModal).find('a#tosLink').props().href).not.toBe(config?.TermsOfServiceLink); - expect(wrapper.find(AboutBuildModal).find('a#privacyLink').props().href).not.toBe(config?.PrivacyPolicyLink); + expect(screen.getByRole('link', {name: 'Privacy Policy'})).toHaveAttribute('href', `${AboutLinks.PRIVACY_POLICY}?utm_source=mattermost&utm_medium=in-product&utm_content=about_build_modal&uid=currentUserId&sid=`); + + expect(screen.getByRole('link', {name: 'Terms of Use'})).not.toHaveAttribute('href', config?.TermsOfServiceLink); + expect(screen.getByRole('link', {name: 'Privacy Policy'})).not.toHaveAttribute('href', config?.PrivacyPolicyLink); }); - function shallowAboutBuildModal(props = {}) { + function renderAboutBuildModal(props = {}) { const onExited = jest.fn(); const show = true; @@ -215,6 +242,6 @@ describe('components/AboutBuildModal', () => { ...props, }; - return shallow(); + return renderWithIntl(); } }); diff --git a/webapp/channels/src/components/about_build_modal/about_build_modal.tsx b/webapp/channels/src/components/about_build_modal/about_build_modal.tsx index ff7c7bd6ab..69ef4a84ea 100644 --- a/webapp/channels/src/components/about_build_modal/about_build_modal.tsx +++ b/webapp/channels/src/components/about_build_modal/about_build_modal.tsx @@ -49,6 +49,7 @@ export default class AboutBuildModal extends React.PureComponent { doHide = () => { this.setState({show: false}); + this.props.onExited(); }; render() { @@ -172,7 +173,7 @@ export default class AboutBuildModal extends React.PureComponent { // Only show build number if it's a number (so only builds from Jenkins) let buildnumber: JSX.Element | null = ( -
+
{ {subTitle}

-
+
{ {'\u00a0' + mmversion}
-
+
{ tabIndex={0} > - +
diff --git a/webapp/channels/src/components/admin_console/__snapshots__/database_settings.test.jsx.snap b/webapp/channels/src/components/admin_console/__snapshots__/database_settings.test.jsx.snap index 5685b6f279..ded545ccf4 100644 --- a/webapp/channels/src/components/admin_console/__snapshots__/database_settings.test.jsx.snap +++ b/webapp/channels/src/components/admin_console/__snapshots__/database_settings.test.jsx.snap @@ -353,6 +353,36 @@ exports[`components/DatabaseSettings should match snapshot 1`] = `
+
+ +
+ +
+ +
+
+
- - -`; diff --git a/webapp/channels/src/components/admin_console/billing/billing_history.test.tsx b/webapp/channels/src/components/admin_console/billing/billing_history.test.tsx index 424eb55c2b..34bb1d2a07 100644 --- a/webapp/channels/src/components/admin_console/billing/billing_history.test.tsx +++ b/webapp/channels/src/components/admin_console/billing/billing_history.test.tsx @@ -5,11 +5,9 @@ import React from 'react'; import {Provider} from 'react-redux'; -import {shallow} from 'enzyme'; import {screen} from '@testing-library/react'; -import {renderWithIntlAndStore} from 'tests/react_testing_utils'; -import {mountWithIntl} from 'tests/helpers/intl-test-helper'; +import {renderWithIntl, renderWithIntlAndStore} from 'tests/react_testing_utils'; import mockStore from 'tests/test_store'; import {CloudLinks, HostedCustomerLinks} from 'utils/constants'; @@ -35,7 +33,7 @@ const invoiceA = { quantity: 1, price_per_unit: 1000, description: - '1 × Cloud Professional (at $10.00 / month)', + '1 × Cloud Professional (at $10.00 / month)', type: 'onpremise', metadata: {}, }, @@ -59,7 +57,7 @@ const invoiceB = { quantity: 1, price_per_unit: 1000, description: - 'Trial period for Cloud Professional', + 'Trial period for Cloud Professional', type: 'onpremise', metadata: {}, }, @@ -98,13 +96,21 @@ describe('components/admin_console/billing/billing_history', () => { const store = mockStore(state); - test('should match snapshot', () => { - const wrapper = shallow( + test('should match the default state of the component with given props', () => { + renderWithIntl( , ); - expect(wrapper).toMatchSnapshot(); + + expect(screen.queryByText('Billing History')).toBeInTheDocument(); + expect(screen.queryByText('Transactions')).toBeInTheDocument(); + expect(screen.queryByText('All of your invoices will be shown here')).toBeInTheDocument(); + expect(screen.getByTestId(invoiceA.number)).toHaveTextContent((invoiceA.total / 100.0).toString()); + expect(screen.getByTestId(invoiceB.number)).toHaveTextContent((invoiceB.total / 100.0).toString()); + + expect(screen.getByTestId(invoiceA.id)).toHaveTextContent('Pending'); + expect(screen.getByTestId(invoiceB.id)).toHaveTextContent('Paid'); }); test('Billing history section shows template when no invoices have been emitted yet', () => { @@ -113,42 +119,54 @@ describe('components/admin_console/billing/billing_history', () => { entities: {...state.entities, cloud: {invoices: {}, errors: {}}}, }; const storeNoBillingHistory = mockStore(noBillingHistoryState); - const wrapper = mountWithIntl( + renderWithIntl( , ); - const legend = wrapper.find( - '.BillingHistory__cardHeaderText-bottom span', - ); - expect(legend.text()).toBe(NO_INVOICES_LEGEND); + expect(screen.queryByText('Date')).not.toBeInTheDocument(); + expect(screen.queryByText('Description')).not.toBeInTheDocument(); + expect(screen.queryByText('Total')).not.toBeInTheDocument(); + expect(screen.queryByText('Status')).not.toBeInTheDocument(); + + expect(screen.queryByTestId(invoiceA.number)).not.toBeInTheDocument(); + expect(screen.queryByTestId(invoiceB.number)).not.toBeInTheDocument(); + + expect(screen.queryByTestId(invoiceA.id)).not.toBeInTheDocument(); + expect(screen.queryByTestId(invoiceB.id)).not.toBeInTheDocument(); + + expect(screen.getByRole('link')).toHaveAttribute('href', 'https://docs.mattermost.com/cloud/cloud-billing/cloud-billing.html?utm_source=mattermost&utm_medium=in-product-cloud&utm_content=billing_history&uid=current_user_id&sid='); + expect(screen.getByRole('link')).toHaveTextContent('See how billing works'); + expect(screen.getByTestId('no-invoices')).toHaveTextContent(NO_INVOICES_LEGEND); }); test('Billing history section shows two invoices to download', () => { - const wrapper = mountWithIntl( + renderWithIntl( , ); - const invoiceTableRows = wrapper.find('table.BillingHistory__table tr.BillingHistory__table-row'); + expect(screen.queryByText('Date')).toBeInTheDocument(); + expect(screen.queryByText('Description')).toBeInTheDocument(); + expect(screen.queryByText('Total')).toBeInTheDocument(); + expect(screen.queryByText('Status')).toBeInTheDocument(); - expect(invoiceTableRows.length).toBe(2); + expect(screen.getAllByTestId('billingHistoryTableRow')).toHaveLength(2); }); test('Billing history section download button has the target property set as _self so it works well in desktop app', () => { - const wrapper = mountWithIntl( + renderWithIntl( , ); - const invoiceTableRow = wrapper.find('table.BillingHistory__table tr.BillingHistory__table-row').at(0); - - const downloadLink = invoiceTableRow.find('td.BillingHistory__table-invoice a'); - - expect(downloadLink.prop('target')).toBe('_self'); + expect(screen.getByTestId(`billingHistoryLink-${invoiceA.id}`)).toHaveAttribute('target', '_self'); + expect(screen.getByTestId(`billingHistoryLink-${invoiceB.id}`)).toHaveAttribute('target', '_self'); + expect(screen.getByTestId(`billingHistoryLink-${invoiceA.id}`)).toHaveAttribute('href', '/api/v4/cloud/subscription/invoices/in_1KNb3DI67GP2qpb4ueaJYBt8/pdf'); + expect(screen.getByTestId(`billingHistoryLink-${invoiceB.id}`)).toHaveAttribute('href', '/api/v4/cloud/subscription/invoices/in_1KIWNTI67GP2qpb4KjGj1KAy/pdf'); }); }); @@ -191,30 +209,42 @@ describe('BillingHistory -- self-hosted', () => { entities: {...state.entities, hostedCustomer: {invoices: {invoices: {}, invoicesLoaded: true}, errors: {}}}, }; const storeNoBillingHistory = mockStore(noBillingHistoryState); - const wrapper = mountWithIntl( + renderWithIntl( , ); - const legend = wrapper.find( - '.BillingHistory__cardHeaderText-bottom span', - ); - expect(legend.text()).toBe(NO_INVOICES_LEGEND); + expect(screen.queryByText('Date')).not.toBeInTheDocument(); + expect(screen.queryByText('Description')).not.toBeInTheDocument(); + expect(screen.queryByText('Total')).not.toBeInTheDocument(); + expect(screen.queryByText('Status')).not.toBeInTheDocument(); + + expect(screen.queryByTestId(invoiceA.number)).not.toBeInTheDocument(); + expect(screen.queryByTestId(invoiceB.number)).not.toBeInTheDocument(); + + expect(screen.queryByTestId(invoiceA.id)).not.toBeInTheDocument(); + expect(screen.queryByTestId(invoiceB.id)).not.toBeInTheDocument(); + + expect(screen.getByRole('link')).toHaveAttribute('href', 'https://docs.mattermost.com/manage/self-hosted-billing.html?utm_source=mattermost&utm_medium=in-product&utm_content=billing_history&uid=current_user_id&sid='); + expect(screen.getByRole('link')).toHaveTextContent('See how billing works'); + expect(screen.getByTestId('no-invoices')).toHaveTextContent(NO_INVOICES_LEGEND); }); test('Billing history section shows two invoices to download', () => { const store = mockStore(state); - const wrapper = mountWithIntl( + renderWithIntl( , ); - const invoiceTableRows = wrapper.find('table.BillingHistory__table tr.BillingHistory__table-row'); - - expect(invoiceTableRows.length).toBe(2); + expect(screen.queryByText('Date')).toBeInTheDocument(); + expect(screen.queryByText('Description')).toBeInTheDocument(); + expect(screen.queryByText('Total')).toBeInTheDocument(); + expect(screen.queryByText('Status')).toBeInTheDocument(); + expect(screen.getAllByTestId('billingHistoryTableRow')).toHaveLength(2); }); }); diff --git a/webapp/channels/src/components/admin_console/billing/billing_history.tsx b/webapp/channels/src/components/admin_console/billing/billing_history.tsx index 512cea1e9e..f89bf195c6 100644 --- a/webapp/channels/src/components/admin_console/billing/billing_history.tsx +++ b/webapp/channels/src/components/admin_console/billing/billing_history.tsx @@ -39,6 +39,7 @@ export const NoBillingHistorySection = (props: NoBillingHistorySectionProps) => />
{ defaultMessage='Transactions' />
-
+
- +
- + - {getPaymentStatus(invoice.status)} + {getPaymentStatus(invoice.status)} e.stopPropagation()} diff --git a/webapp/channels/src/components/admin_console/billing/billing_subscriptions/index.tsx b/webapp/channels/src/components/admin_console/billing/billing_subscriptions/index.tsx index ac6bdb6ef1..2f46aeb588 100644 --- a/webapp/channels/src/components/admin_console/billing/billing_subscriptions/index.tsx +++ b/webapp/channels/src/components/admin_console/billing/billing_subscriptions/index.tsx @@ -48,6 +48,7 @@ import { import LimitReachedBanner from './limit_reached_banner'; import CancelSubscription from './cancel_subscription'; import {ToYearlyNudgeBanner} from './to_yearly_nudge_banner'; +import {ToPaidNudgeBanner} from './to_paid_plan_nudge_banner'; import './billing_subscriptions.scss'; @@ -136,6 +137,7 @@ const BillingSubscriptions = () => { /> {shouldShowPaymentFailedBanner() && paymentFailedBanner()} {} + {} {showCreditCardBanner && isCardExpired && creditCardExpiredBanner(setShowCreditCardBanner)} diff --git a/webapp/channels/src/components/admin_console/billing/billing_subscriptions/to_paid_plan_nudge_banner.scss b/webapp/channels/src/components/admin_console/billing/billing_subscriptions/to_paid_plan_nudge_banner.scss new file mode 100644 index 0000000000..f49b2f2ab7 --- /dev/null +++ b/webapp/channels/src/components/admin_console/billing/billing_subscriptions/to_paid_plan_nudge_banner.scss @@ -0,0 +1,28 @@ +@import 'utils/mixins'; + +.ToPaidNudgeBanner { + &__actions { + padding-top: 12px; + } + + &__primary { + font-size: 12px; + + @include primary-button; + + &:hover { + color: var(--button-color); + } + } + + &__secondary { + margin-left: 4px; + font-size: 12px; + + @include tertiary-button; + + &:hover { + color: var(--button-bg); + } + } +} diff --git a/webapp/channels/src/components/admin_console/billing/billing_subscriptions/to_paid_plan_nudge_banner.test.tsx b/webapp/channels/src/components/admin_console/billing/billing_subscriptions/to_paid_plan_nudge_banner.test.tsx new file mode 100644 index 0000000000..ee783bcaaf --- /dev/null +++ b/webapp/channels/src/components/admin_console/billing/billing_subscriptions/to_paid_plan_nudge_banner.test.tsx @@ -0,0 +1,239 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React from 'react'; +import {screen} from '@testing-library/react'; + +import {renderWithIntlAndStore} from 'tests/react_testing_utils'; +import {CloudProducts} from 'utils/constants'; + +import {ToPaidNudgeBanner, ToPaidPlanBannerDismissable} from './to_paid_plan_nudge_banner'; + +const initialState = { + views: { + announcementBar: { + announcementBarState: { + announcementBarCount: 1, + }, + }, + }, + entities: { + general: { + config: { + CWSURL: '', + FeatureFlagDeprecateCloudFree: 'true', + }, + license: { + IsLicensed: 'true', + Cloud: 'true', + }, + }, + users: { + currentUserId: 'current_user_id', + profiles: { + current_user_id: {roles: 'system_user'}, + }, + }, + preferences: { + myPreferences: {}, + }, + cloud: {}, + }, +}; + +describe('ToPaidPlanBannerDismissable', () => { + test('should only show for admins on cloud free', () => { + const state = JSON.parse(JSON.stringify(initialState)); + state.entities.users.profiles = { + current_user_id: {roles: 'system_admin'}, + }; + state.entities.cloud = { + subscription: { + product_id: 'prod_starter', + is_free_trial: 'false', + trial_end_at: 1, + }, + products: { + prod_starter: { + id: 'prod_starter', + sku: CloudProducts.STARTER, + }, + }, + }; + + renderWithIntlAndStore(, state); + + screen.getByTestId('cloud-free-deprecation-announcement-bar'); + }); + + test('should NOT show for NON admins', () => { + const state = JSON.parse(JSON.stringify(initialState)); + state.entities.users.profiles = { + current_user_id: {roles: 'system_user'}, + }; + state.entities.cloud = { + subscription: { + product_id: 'prod_starter', + is_free_trial: 'false', + trial_end_at: 1, + }, + products: { + prod_starter: { + id: 'prod_starter', + sku: CloudProducts.STARTER, + }, + }, + }; + + renderWithIntlAndStore(, state); + + expect(() => screen.getByTestId('cloud-free-deprecation-announcement-bar')).toThrow(); + }); + + test('should NOT show for admins on cloud pro', () => { + const state = JSON.parse(JSON.stringify(initialState)); + state.entities.users.profiles = { + current_user_id: {roles: 'system_admin'}, + }; + state.entities.cloud = { + subscription: { + product_id: 'prod_pro', + is_free_trial: 'false', + trial_end_at: 1, + }, + products: { + prod_pro: { + id: 'prod_pro', + sku: CloudProducts.PROFESSIONAL, + }, + }, + }; + + renderWithIntlAndStore(, state); + + expect(() => screen.getByTestId('cloud-free-deprecation-announcement-bar')).toThrow(); + }); + + test('should NOT show for admins on cloud enterprise', () => { + const state = JSON.parse(JSON.stringify(initialState)); + state.entities.users.profiles = { + current_user_id: {roles: 'system_admin'}, + }; + state.entities.cloud = { + subscription: { + product_id: 'prod_enterprise', + is_free_trial: 'false', + trial_end_at: 1, + }, + products: { + prod_enterprise: { + id: 'prod_enterprise', + sku: CloudProducts.ENTERPRISE, + }, + }, + }; + + renderWithIntlAndStore(, state); + + expect(() => screen.getByTestId('cloud-free-deprecation-announcement-bar')).toThrow(); + }); + + test('should NOT show for admins when banner was dismissed in preferences', () => { + const state = JSON.parse(JSON.stringify(initialState)); + state.entities.users.profiles = { + current_user_id: {roles: 'system_admin'}, + }; + state.entities.preferences = { + myPreferences: { + 'to_paid_plan_nudge--nudge_to_paid_plan_snoozed': { + category: 'to_paid_plan_nudge', + name: 'nudge_to_paid_plan_snoozed', + value: '{"range": 0, "show": false}', + }, + }, + }; + + state.entities.cloud = { + subscription: { + product_id: 'prod_starter', + is_free_trial: 'false', + trial_end_at: 1, + }, + products: { + prod_starter: { + id: 'prod_starter', + sku: CloudProducts.STARTER, + }, + }, + }; + + renderWithIntlAndStore(, state); + + expect(() => screen.getByTestId('cloud-free-deprecation-announcement-bar')).toThrow(); + }); +}); + +describe('ToPaidNudgeBanner', () => { + test('should show only for cloud free', () => { + const state = JSON.parse(JSON.stringify(initialState)); + state.entities.cloud = { + subscription: { + product_id: 'prod_starter', + is_free_trial: 'false', + trial_end_at: 1, + }, + products: { + prod_starter: { + id: 'prod_starter', + sku: CloudProducts.STARTER, + }, + }, + }; + + renderWithIntlAndStore(, state); + + screen.getByTestId('cloud-free-deprecation-alert-banner'); + }); + + test('should NOT show for cloud professional', () => { + const state = JSON.parse(JSON.stringify(initialState)); + state.entities.cloud = { + subscription: { + product_id: 'prod_pro', + is_free_trial: 'false', + trial_end_at: 1, + }, + products: { + prod_pro: { + id: 'prod_pro', + sku: CloudProducts.PROFESSIONAL, + }, + }, + }; + + renderWithIntlAndStore(, state); + + expect(() => screen.getByTestId('cloud-free-deprecation-alert-banner')).toThrow(); + }); + + test('should NOT show for cloud enterprise', () => { + const state = JSON.parse(JSON.stringify(initialState)); + state.entities.cloud = { + subscription: { + product_id: 'prod_ent', + is_free_trial: 'false', + trial_end_at: 1, + }, + products: { + prod_ent: { + id: 'prod_ent', + sku: CloudProducts.ENTERPRISE, + }, + }, + }; + + renderWithIntlAndStore(, state); + + expect(() => screen.getByTestId('cloud-free-deprecation-alert-banner')).toThrow(); + }); +}); diff --git a/webapp/channels/src/components/admin_console/billing/billing_subscriptions/to_paid_plan_nudge_banner.tsx b/webapp/channels/src/components/admin_console/billing/billing_subscriptions/to_paid_plan_nudge_banner.tsx new file mode 100644 index 0000000000..06fda8eb9a --- /dev/null +++ b/webapp/channels/src/components/admin_console/billing/billing_subscriptions/to_paid_plan_nudge_banner.tsx @@ -0,0 +1,246 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React, {useEffect} from 'react'; +import {useDispatch, useSelector} from 'react-redux'; +import {useIntl, FormattedMessage} from 'react-intl'; +import moment from 'moment'; + +import AlertBanner from 'components/alert_banner'; +import useOpenPricingModal from 'components/common/hooks/useOpenPricingModal'; +import useOpenCloudPurchaseModal from 'components/common/hooks/useOpenCloudPurchaseModal'; +import useOpenSalesLink from 'components/common/hooks/useOpenSalesLink'; +import AnnouncementBar from 'components/announcement_bar/default_announcement_bar'; + +import {getSubscriptionProduct as selectSubscriptionProduct} from 'mattermost-redux/selectors/entities/cloud'; +import {getCurrentUser, isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users'; +import {savePreferences} from 'mattermost-redux/actions/preferences'; +import {deprecateCloudFree, get as getPreference} from 'mattermost-redux/selectors/entities/preferences'; + +import {AnnouncementBarTypes, CloudBanners, CloudProducts, Preferences} from 'utils/constants'; +import {t} from 'utils/i18n'; + +import {GlobalState} from '@mattermost/types/store'; + +import './to_paid_plan_nudge_banner.scss'; + +enum DismissShowRange { + GreaterThanEqual90 = '>=90', + BetweenNinetyAnd60 = '89-61', + SixtyTo31 = '60-31', + ThirtyTo11 = '30-11', + TenTo1 = '10-1', + Zero = '0' +} + +const cloudFreeCloseMoment = '20230727'; + +interface ToPaidPlanDismissPreference { + + // range represents the range for the days to the deprecation of cloud free e.g. in 30 to 10 days to deprecate cloud free + // Incase of dismissing the banner, range represents the time (days) period when this banner was dismissed. + // This is important because in case the banner was dismissed for a certain period, it helps us know that we should not show it again for that period. + range: DismissShowRange; + show: boolean; +} + +export const ToPaidPlanBannerDismissable = () => { + const dispatch = useDispatch(); + + const openPricingModal = useOpenPricingModal(); + + const currentUser = useSelector(getCurrentUser); + const isAdmin = useSelector(isCurrentUserSystemAdmin); + const product = useSelector(selectSubscriptionProduct); + const cloudFreeDeprecated = useSelector(deprecateCloudFree); + const currentProductStarter = product?.sku === CloudProducts.STARTER; + + const now = moment(Date.now()); + const cloudFreeEndDate = moment(cloudFreeCloseMoment, 'YYYYMMDD'); + const daysToCloudFreeEnd = cloudFreeEndDate.diff(now, 'days'); + + const snoozePreferenceVal = useSelector((state: GlobalState) => getPreference(state, Preferences.TO_PAID_PLAN_NUDGE, CloudBanners.NUDGE_TO_PAID_PLAN_SNOOZED, '{"range": 0, "show": true}')); + const snoozeInfo = JSON.parse(snoozePreferenceVal) as ToPaidPlanDismissPreference; + const show = snoozeInfo.show; + + const snoozedForRange = (range: DismissShowRange) => { + return snoozeInfo.range === range; + }; + + useEffect(() => { + if (!snoozeInfo.show) { + if (daysToCloudFreeEnd >= 90 && !snoozedForRange(DismissShowRange.GreaterThanEqual90)) { + showBanner(true); + } + + if (daysToCloudFreeEnd < 90 && daysToCloudFreeEnd > 60 && !snoozedForRange(DismissShowRange.BetweenNinetyAnd60)) { + showBanner(true); + } + + if (daysToCloudFreeEnd <= 60 && daysToCloudFreeEnd > 30 && !snoozedForRange(DismissShowRange.SixtyTo31)) { + showBanner(true); + } + + if (daysToCloudFreeEnd <= 30 && daysToCloudFreeEnd > 10 && !snoozedForRange(DismissShowRange.ThirtyTo11)) { + showBanner(true); + } + + if (daysToCloudFreeEnd <= 10) { + showBanner(true); + } + } + }, []); + + const showBanner = (show = false) => { + let dRange = DismissShowRange.Zero; + if (daysToCloudFreeEnd >= 90) { + dRange = DismissShowRange.GreaterThanEqual90; + } + + if (daysToCloudFreeEnd < 90 && daysToCloudFreeEnd > 60) { + dRange = DismissShowRange.BetweenNinetyAnd60; + } + + if (daysToCloudFreeEnd <= 60 && daysToCloudFreeEnd > 30) { + dRange = DismissShowRange.SixtyTo31; + } + + if (daysToCloudFreeEnd <= 30 && daysToCloudFreeEnd > 10) { + dRange = DismissShowRange.ThirtyTo11; + } + + // ideally this case should not happen because snooze button is not shown when TenTo1 days are remaining + if (daysToCloudFreeEnd <= 10 && daysToCloudFreeEnd > 0) { + dRange = DismissShowRange.TenTo1; + } + + const snoozeInfo: ToPaidPlanDismissPreference = { + range: dRange, + show, + }; + + dispatch(savePreferences(currentUser.id, [{ + category: Preferences.TO_PAID_PLAN_NUDGE, + name: CloudBanners.NUDGE_TO_PAID_PLAN_SNOOZED, + user_id: currentUser.id, + value: JSON.stringify(snoozeInfo), + }])); + }; + + if (!cloudFreeDeprecated) { + return null; + } + + if (!show) { + return null; + } + + if (!isAdmin) { + return null; + } + + if (!currentProductStarter) { + return null; + } + + let message = { + id: 'cloud_billing.nudge_to_paid.announcement_bar', + defaultMessage: 'Cloud Free will be deprecated on {date}. To keep your workspace, upgrade to a paid plan', + values: { + date: moment(cloudFreeCloseMoment, 'YYYYMMDD').format('MMMM DD, YYYY'), + }, + }; + + if (daysToCloudFreeEnd < 0) { + message = { + id: 'cloud_billing.nudge_to_paid.announcement_bar_deprecated', + defaultMessage: 'Cloud Free was deprecated. To keep your workspace, upgrade to a paid plan', + } as any; + } + + const announcementType = (daysToCloudFreeEnd <= 10) ? AnnouncementBarTypes.CRITICAL : AnnouncementBarTypes.ANNOUNCEMENT; + + return ( + 10} + onButtonClick={openPricingModal} + modalButtonText={t('cloud_billing.nudge_to_paid.view_plans')} + modalButtonDefaultText='View plans' + message={} + showLinkAsButton={true} + handleClose={showBanner} + /> + ); +}; + +export const ToPaidNudgeBanner = () => { + const {formatMessage} = useIntl(); + + const [openSalesLink] = useOpenSalesLink(); + const openPurchaseModal = useOpenCloudPurchaseModal({}); + + const product = useSelector(selectSubscriptionProduct); + const cloudFreeDeprecated = useSelector(deprecateCloudFree); + const currentProductStarter = product?.sku === CloudProducts.STARTER; + + if (!cloudFreeDeprecated) { + return null; + } + + if (!currentProductStarter) { + return null; + } + + const now = moment(Date.now()); + const cloudFreeEndDate = moment(cloudFreeCloseMoment, 'YYYYMMDD'); + const daysToCloudFreeEnd = cloudFreeEndDate.diff(now, 'days'); + + const title = ( + + ); + + const description = ( + + ); + + const viewPlansAction = ( + + ); + + const contactSalesAction = ( + + ); + + const bannerMode = (daysToCloudFreeEnd <= 10) ? 'danger' : 'info'; + + return ( + + ); +}; diff --git a/webapp/channels/src/components/admin_console/billing/billing_subscriptions/to_yearly_nudge_banner.test.tsx b/webapp/channels/src/components/admin_console/billing/billing_subscriptions/to_yearly_nudge_banner.test.tsx index af797c5f92..e9061333a5 100644 --- a/webapp/channels/src/components/admin_console/billing/billing_subscriptions/to_yearly_nudge_banner.test.tsx +++ b/webapp/channels/src/components/admin_console/billing/billing_subscriptions/to_yearly_nudge_banner.test.tsx @@ -2,11 +2,9 @@ // See LICENSE.txt for license information. import React from 'react'; +import {screen} from '@testing-library/react'; -import {Provider} from 'react-redux'; - -import {mountWithIntl} from 'tests/helpers/intl-test-helper'; -import mockStore from 'tests/test_store'; +import {renderWithIntlAndStore} from 'tests/react_testing_utils'; import {CloudProducts, RecurringIntervals} from 'utils/constants'; import {ToYearlyNudgeBanner, ToYearlyNudgeBannerDismissable} from './to_yearly_nudge_banner'; @@ -42,7 +40,7 @@ const initialState = { }, }; -describe('components/admin_console/billing/ToYearlyNudgeBannerDismissable', () => { +describe('ToYearlyNudgeBannerDismissable', () => { test('should show for admins cloud professional monthly', () => { const state = JSON.parse(JSON.stringify(initialState)); state.entities.users.profiles = { @@ -63,14 +61,9 @@ describe('components/admin_console/billing/ToYearlyNudgeBannerDismissable', () = }, }; - const store = mockStore(state); - const wrapper = mountWithIntl( - - - , - ); + renderWithIntlAndStore(, state); - expect(wrapper.find('AnnouncementBar').exists()).toBe(true); + screen.getByTestId('cloud-pro-monthly-deprecation-announcement-bar'); }); test('should NOT show for NON admins', () => { @@ -93,14 +86,9 @@ describe('components/admin_console/billing/ToYearlyNudgeBannerDismissable', () = }, }; - const store = mockStore(state); - const wrapper = mountWithIntl( - - - , - ); + renderWithIntlAndStore(, state); - expect(wrapper.find('AnnouncementBar').exists()).toBe(false); + expect(() => screen.getByTestId('cloud-pro-monthly-deprecation-announcement-bar')).toThrow(); }); test('should NOT show for admins on cloud free', () => { @@ -123,14 +111,9 @@ describe('components/admin_console/billing/ToYearlyNudgeBannerDismissable', () = }, }; - const store = mockStore(state); - const wrapper = mountWithIntl( - - - , - ); + renderWithIntlAndStore(, state); - expect(wrapper.find('AnnouncementBar').exists()).toBe(false); + expect(() => screen.getByTestId('cloud-pro-monthly-deprecation-announcement-bar')).toThrow(); }); test('should NOT show for admins on cloud enterprise', () => { @@ -153,14 +136,9 @@ describe('components/admin_console/billing/ToYearlyNudgeBannerDismissable', () = }, }; - const store = mockStore(state); - const wrapper = mountWithIntl( - - - , - ); + renderWithIntlAndStore(, state); - expect(wrapper.find('AnnouncementBar').exists()).toBe(false); + expect(() => screen.getByTestId('cloud-pro-monthly-deprecation-announcement-bar')).toThrow(); }); test('should NOT show for admins on cloud pro annual', () => { @@ -182,15 +160,9 @@ describe('components/admin_console/billing/ToYearlyNudgeBannerDismissable', () = }, }, }; + renderWithIntlAndStore(, state); - const store = mockStore(state); - const wrapper = mountWithIntl( - - - , - ); - - expect(wrapper.find('AnnouncementBar').exists()).toBe(false); + expect(() => screen.getByTestId('cloud-pro-monthly-deprecation-announcement-bar')).toThrow(); }); test('should NOT show for admins when banner was dismissed in preferences', () => { @@ -200,10 +172,10 @@ describe('components/admin_console/billing/ToYearlyNudgeBannerDismissable', () = }; state.entities.preferences = { myPreferences: { - 'cloud_yearly_nudge_banner--nudge_to_yearly_banner_dismissed': { - category: 'cloud_yearly_nudge_banner', - name: 'nudge_to_yearly_banner_dismissed', - value: 'true', + 'to_cloud_yearly_plan_nudge--nudge_to_cloud_yearly_plan_snoozed': { + category: 'to_cloud_yearly_plan_nudge', + name: 'nudge_to_cloud_yearly_plan_snoozed', + value: '{"range": 0, "show": false}', }, }, }; @@ -221,19 +193,13 @@ describe('components/admin_console/billing/ToYearlyNudgeBannerDismissable', () = }, }, }; + renderWithIntlAndStore(, state); - const store = mockStore(state); - const wrapper = mountWithIntl( - - - , - ); - - expect(wrapper.find('AnnouncementBar').exists()).toBe(false); + expect(() => screen.getByTestId('cloud-pro-monthly-deprecation-announcement-bar')).toThrow(); }); }); -describe('components/admin_console/billing/ToYearlyNudgeBanner', () => { +describe('ToYearlyNudgeBanner', () => { test('should show for cloud professional monthly', () => { const state = JSON.parse(JSON.stringify(initialState)); state.entities.cloud = { @@ -251,14 +217,9 @@ describe('components/admin_console/billing/ToYearlyNudgeBanner', () => { }, }; - const store = mockStore(state); - const wrapper = mountWithIntl( - - - , - ); + renderWithIntlAndStore(, state); - expect(wrapper.find('AlertBanner').exists()).toBe(true); + screen.getByTestId('cloud-pro-monthly-deprecation-alert-banner'); }); test('should NOT show for non cloud professional monthly', () => { @@ -278,13 +239,9 @@ describe('components/admin_console/billing/ToYearlyNudgeBanner', () => { }, }; - const store = mockStore(state); - const wrapper = mountWithIntl( - - - , - ); + renderWithIntlAndStore(, state); - expect(wrapper.find('AlertBanner').exists()).toBe(false); + expect(() => screen.getByTestId('cloud-pro-monthly-deprecation-alert-banner')).toThrow(); }); }); + diff --git a/webapp/channels/src/components/admin_console/billing/billing_subscriptions/to_yearly_nudge_banner.tsx b/webapp/channels/src/components/admin_console/billing/billing_subscriptions/to_yearly_nudge_banner.tsx index 3cc1e8aa75..f2eac86e69 100644 --- a/webapp/channels/src/components/admin_console/billing/billing_subscriptions/to_yearly_nudge_banner.tsx +++ b/webapp/channels/src/components/admin_console/billing/billing_subscriptions/to_yearly_nudge_banner.tsx @@ -1,9 +1,10 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import React from 'react'; +import React, {useEffect} from 'react'; import {useDispatch, useSelector} from 'react-redux'; import {useIntl, FormattedMessage} from 'react-intl'; +import moment from 'moment'; import AlertBanner from 'components/alert_banner'; import useOpenCloudPurchaseModal from 'components/common/hooks/useOpenCloudPurchaseModal'; @@ -22,12 +23,35 @@ import {GlobalState} from '@mattermost/types/store'; import './to_yearly_nudge_banner.scss'; +enum DismissShowRange { + GreaterThanEqual90 = '>=90', + BetweenNinetyAnd60 = '89-61', + SixtyTo31 = '60-31', + ThirtyTo11 = '30-11', + TenTo1 = '10-1', + Zero = '0' +} + +const cloudProMonthlyCloseMoment = '20230727'; + +interface ToYearlyPlanDismissPreference { + + // range represents the range for the days to the deprecation of cloud free e.g. in 30 to 10 days to deprecate cloud free + // Incase of dismissing the banner, range represents the time (days) period when this banner was dismissed. + // This is important because in case the banner was dismissed for a certain period, it helps us know that we should not show it again for that period. + range: DismissShowRange; + show: boolean; +} + const ToYearlyNudgeBannerDismissable = () => { const dispatch = useDispatch(); const openPurchaseModal = useOpenCloudPurchaseModal({}); - const nudgeDismissed = useSelector((state: GlobalState) => getPreference(state, Preferences.CLOUD_YEARLY_NUDGE_BANNER, CloudBanners.NUDGE_TO_YEARLY_BANNER_DISMISSED)) === 'true'; + const snoozePreferenceVal = useSelector((state: GlobalState) => getPreference(state, Preferences.TO_CLOUD_YEARLY_PLAN_NUDGE, CloudBanners.NUDGE_TO_CLOUD_YEARLY_PLAN_SNOOZED, '{"range": 0, "show": true}')); + const snoozeInfo = JSON.parse(snoozePreferenceVal) as ToYearlyPlanDismissPreference; + const show = snoozeInfo.show; + const currentUser = useSelector(getCurrentUser); const isAdmin = useSelector(isCurrentUserSystemAdmin); const product = useSelector(selectSubscriptionProduct); @@ -35,16 +59,75 @@ const ToYearlyNudgeBannerDismissable = () => { const currentProductIsMonthly = product?.recurring_interval === RecurringIntervals.MONTH; const currentProductProMonthly = currentProductProfessional && currentProductIsMonthly; - const savedDismissedPref = () => { + const now = moment(Date.now()); + const proMonthlyEndDate = moment(cloudProMonthlyCloseMoment, 'YYYYMMDD'); + const daysToProMonthlyEnd = proMonthlyEndDate.diff(now, 'days'); + + const snoozedForRange = (range: DismissShowRange) => { + return snoozeInfo.range === range; + }; + + useEffect(() => { + if (!snoozeInfo.show) { + if (daysToProMonthlyEnd >= 90 && !snoozedForRange(DismissShowRange.GreaterThanEqual90)) { + showBanner(true); + } + + if (daysToProMonthlyEnd < 90 && daysToProMonthlyEnd > 60 && !snoozedForRange(DismissShowRange.BetweenNinetyAnd60)) { + showBanner(true); + } + + if (daysToProMonthlyEnd <= 60 && daysToProMonthlyEnd > 30 && !snoozedForRange(DismissShowRange.SixtyTo31)) { + showBanner(true); + } + + if (daysToProMonthlyEnd <= 30 && daysToProMonthlyEnd > 10 && !snoozedForRange(DismissShowRange.ThirtyTo11)) { + showBanner(true); + } + + if (daysToProMonthlyEnd <= 10) { + showBanner(true); + } + } + }, []); + + const showBanner = (show = false) => { + let dRange = DismissShowRange.Zero; + if (daysToProMonthlyEnd >= 90) { + dRange = DismissShowRange.GreaterThanEqual90; + } + + if (daysToProMonthlyEnd < 90 && daysToProMonthlyEnd > 60) { + dRange = DismissShowRange.BetweenNinetyAnd60; + } + + if (daysToProMonthlyEnd <= 60 && daysToProMonthlyEnd > 30) { + dRange = DismissShowRange.SixtyTo31; + } + + if (daysToProMonthlyEnd <= 30 && daysToProMonthlyEnd > 10) { + dRange = DismissShowRange.ThirtyTo11; + } + + // ideally this case should not happen because snooze button is not shown when TenTo1 days are remaining + if (daysToProMonthlyEnd <= 10 && daysToProMonthlyEnd > 0) { + dRange = DismissShowRange.TenTo1; + } + + const snoozeInfo: ToYearlyPlanDismissPreference = { + range: dRange, + show, + }; + dispatch(savePreferences(currentUser.id, [{ - category: Preferences.CLOUD_YEARLY_NUDGE_BANNER, - name: CloudBanners.NUDGE_TO_YEARLY_BANNER_DISMISSED, + category: Preferences.TO_CLOUD_YEARLY_PLAN_NUDGE, + name: CloudBanners.NUDGE_TO_CLOUD_YEARLY_PLAN_SNOOZED, user_id: currentUser.id, - value: 'true', + value: JSON.stringify(snoozeInfo), }])); }; - if (nudgeDismissed) { + if (!show) { return null; } @@ -56,21 +139,30 @@ const ToYearlyNudgeBannerDismissable = () => { return null; } - const message = { - id: 'cloud_billing.nudge_to_yearly.announcement_bar', - defaultMessage: 'Simplify your billing and switch to an annual plan today', - }; + const message = ( + + ); + + const announcementType = (daysToProMonthlyEnd <= 10) ? AnnouncementBarTypes.CRITICAL : AnnouncementBarTypes.ANNOUNCEMENT; return ( 10} onButtonClick={() => openPurchaseModal({trackingLocation: 'to_yearly_nudge_annoucement_bar'})} modalButtonText={t('cloud_billing.nudge_to_yearly.learn_more')} modalButtonDefaultText='Learn more' - message={} + message={message} showLinkAsButton={true} - handleClose={savedDismissedPref} + handleClose={showBanner} /> ); }; @@ -90,17 +182,22 @@ const ToYearlyNudgeBanner = () => { return null; } + const now = moment(Date.now()); + const proMonthlyEndDate = moment(cloudProMonthlyCloseMoment, 'YYYYMMDD'); + const daysToProMonthlyEnd = proMonthlyEndDate.diff(now, 'days'); + const title = ( ); const description = ( ); @@ -122,9 +219,12 @@ const ToYearlyNudgeBanner = () => { ); + const bannerMode = (daysToProMonthlyEnd <= 10) ? 'danger' : 'info'; + return ( void; @@ -28,23 +28,35 @@ const DeleteFeedbackModal = (props: Props) => { defaultMessage: 'Delete Workspace', }); - const deleteFeedbackOptions = [ - props.intl.formatMessage({ - id: 'feedback.deleteWorkspace.feedbackNoValue', - defaultMessage: 'No longer found value', - }), - props.intl.formatMessage({ - id: 'feedback.deleteWorkspace.feedbackMoving', - defaultMessage: 'Moving to a different solution', - }), - props.intl.formatMessage({ - id: 'feedback.deleteWorkspace.feedbackMistake', - defaultMessage: 'Created a workspace by mistake', - }), - props.intl.formatMessage({ - id: 'feedback.deleteWorkspace.feedbackHosting', - defaultMessage: 'Moving to hosting my own Mattermost instance (self-hosted)', - }), + const deleteFeedbackOptions: FeedbackOption[] = [ + { + translatedMessage: props.intl.formatMessage({ + id: 'feedback.deleteWorkspace.feedbackNoValue', + defaultMessage: 'No longer found value', + }), + submissionValue: 'No longer found value', + }, + { + translatedMessage: props.intl.formatMessage({ + id: 'feedback.deleteWorkspace.feedbackMoving', + defaultMessage: 'Moving to a different solution', + }), + submissionValue: 'Moving to a different solution', + }, + { + translatedMessage: props.intl.formatMessage({ + id: 'feedback.deleteWorkspace.feedbackMistake', + defaultMessage: 'Created a workspace by mistake', + }), + submissionValue: 'Created a workspace by mistake', + }, + { + translatedMessage: props.intl.formatMessage({ + id: 'feedback.deleteWorkspace.feedbackHosting', + defaultMessage: 'Moving to hosting my own Mattermost instance (self-hosted)', + }), + submissionValue: 'Moving to hosting my own Mattermost instance (self-hosted)', + }, ]; return ( diff --git a/webapp/channels/src/components/admin_console/database_settings.jsx b/webapp/channels/src/components/admin_console/database_settings.jsx index e75e100c89..520cb8e2a7 100644 --- a/webapp/channels/src/components/admin_console/database_settings.jsx +++ b/webapp/channels/src/components/admin_console/database_settings.jsx @@ -4,7 +4,7 @@ import React from 'react'; import {FormattedMessage} from 'react-intl'; -import {recycleDatabaseConnection} from 'actions/admin_actions.jsx'; +import {recycleDatabaseConnection, ping} from 'actions/admin_actions'; import * as Utils from 'utils/utils'; import {t} from 'utils/i18n'; @@ -19,6 +19,15 @@ import TextSetting from './text_setting'; import MigrationsTable from './database'; export default class DatabaseSettings extends AdminSettings { + constructor(props) { + super(props); + + this.state = { + ...this.state, + searchBackend: '', + }; + } + getConfigFromState = (config) => { // driverName and dataSource are read-only from the UI @@ -34,6 +43,17 @@ export default class DatabaseSettings extends AdminSettings { return config; }; + componentDidMount() { + this.getSearchBackend().then((searchBackend) => { + this.setState({searchBackend}); + }); + } + + async getSearchBackend() { + const res = await ping()(); + return res.ActiveSearchBackend; + } + getStateFromConfig(config) { return { driverName: config.SqlSettings.DriverName, @@ -368,6 +388,30 @@ export default class DatabaseSettings extends AdminSettings {
+
+ +
+ +
+ +
+
+
); }; diff --git a/webapp/channels/src/components/admin_console/database_settings.test.jsx b/webapp/channels/src/components/admin_console/database_settings.test.jsx index b6e98f8a6c..936ee41d13 100644 --- a/webapp/channels/src/components/admin_console/database_settings.test.jsx +++ b/webapp/channels/src/components/admin_console/database_settings.test.jsx @@ -7,8 +7,14 @@ import {shallow} from 'enzyme'; import DatabaseSettings from 'components/admin_console/database_settings.jsx'; jest.mock('actions/admin_actions.jsx', () => { + const pingFn = () => { + return jest.fn(() => { + return {ActiveSearchBackend: 'none'}; + }); + }; return { recycleDatabaseConnection: jest.fn(), + ping: pingFn, }; }); diff --git a/webapp/channels/src/components/admin_console/schema_admin_settings.jsx b/webapp/channels/src/components/admin_console/schema_admin_settings.jsx index d1b8886a8e..b35db711ef 100644 --- a/webapp/channels/src/components/admin_console/schema_admin_settings.jsx +++ b/webapp/channels/src/components/admin_console/schema_admin_settings.jsx @@ -671,7 +671,7 @@ export default class SchemaAdminSettings extends React.PureComponent { }; handleGeneratedChange = (id, s) => { - this.handleChange(id, s.replace('+', '-').replace('/', '_')); + this.handleChange(id, s.replace(/\+/g, '-').replace(/\//g, '_')); }; handleChange = (id, value, confirm = false, doSubmit = false, warning = false) => { diff --git a/webapp/channels/src/components/admin_console/team_channel_settings/team/details/__snapshots__/team_profile.test.tsx.snap b/webapp/channels/src/components/admin_console/team_channel_settings/team/details/__snapshots__/team_profile.test.tsx.snap index f3da9ea817..a714b14a38 100644 --- a/webapp/channels/src/components/admin_console/team_channel_settings/team/details/__snapshots__/team_profile.test.tsx.snap +++ b/webapp/channels/src/components/admin_console/team_channel_settings/team/details/__snapshots__/team_profile.test.tsx.snap @@ -213,9 +213,11 @@ exports[`admin_console/team_channel_settings/team/TeamProfile__Cloud restore sho content="name" intl={ Object { + "$t": [Function], "defaultFormats": Object {}, "defaultLocale": "en", "defaultRichTextElements": undefined, + "fallbackOnEmptyString": true, "formatDate": [Function], "formatDateTimeRange": [Function], "formatDateToParts": [Function], @@ -242,6 +244,7 @@ exports[`admin_console/team_channel_settings/team/TeamProfile__Cloud restore sho "locale": "en", "messages": Object {}, "onError": [Function], + "onWarn": [Function], "textComponent": "span", "timeZone": "Etc/UTC", "wrapRichTextChunksInFragment": undefined, @@ -457,9 +460,11 @@ exports[`admin_console/team_channel_settings/team/TeamProfile__Cloud should matc content="name" intl={ Object { + "$t": [Function], "defaultFormats": Object {}, "defaultLocale": "en", "defaultRichTextElements": undefined, + "fallbackOnEmptyString": true, "formatDate": [Function], "formatDateTimeRange": [Function], "formatDateToParts": [Function], @@ -486,6 +491,7 @@ exports[`admin_console/team_channel_settings/team/TeamProfile__Cloud should matc "locale": "en", "messages": Object {}, "onError": [Function], + "onWarn": [Function], "textComponent": "span", "timeZone": "Etc/UTC", "wrapRichTextChunksInFragment": undefined, @@ -603,9 +609,11 @@ exports[`admin_console/team_channel_settings/team/TeamProfile__Cloud should matc id="sharedTooltip" intl={ Object { + "$t": [Function], "defaultFormats": Object {}, "defaultLocale": "en", "defaultRichTextElements": undefined, + "fallbackOnEmptyString": true, "formatDate": [Function], "formatDateTimeRange": [Function], "formatDateToParts": [Function], @@ -632,6 +640,7 @@ exports[`admin_console/team_channel_settings/team/TeamProfile__Cloud should matc "locale": "en", "messages": Object {}, "onError": [Function], + "onWarn": [Function], "textComponent": "span", "timeZone": "Etc/UTC", "wrapRichTextChunksInFragment": undefined, @@ -834,9 +843,11 @@ exports[`admin_console/team_channel_settings/team/TeamProfile__Cloud should matc content="name" intl={ Object { + "$t": [Function], "defaultFormats": Object {}, "defaultLocale": "en", "defaultRichTextElements": undefined, + "fallbackOnEmptyString": true, "formatDate": [Function], "formatDateTimeRange": [Function], "formatDateToParts": [Function], @@ -863,6 +874,7 @@ exports[`admin_console/team_channel_settings/team/TeamProfile__Cloud should matc "locale": "en", "messages": Object {}, "onError": [Function], + "onWarn": [Function], "textComponent": "span", "timeZone": "Etc/UTC", "wrapRichTextChunksInFragment": undefined, diff --git a/webapp/channels/src/components/admin_console/workspace-optimization/chips_list.test.tsx b/webapp/channels/src/components/admin_console/workspace-optimization/chips_list.test.tsx index 3953977204..514597a354 100644 --- a/webapp/channels/src/components/admin_console/workspace-optimization/chips_list.test.tsx +++ b/webapp/channels/src/components/admin_console/workspace-optimization/chips_list.test.tsx @@ -6,7 +6,7 @@ import {shallow} from 'enzyme'; import ChipsList, {ChipsInfoType} from 'components/admin_console/workspace-optimization/chips_list'; -import {ItemStatus} from './dashboard.data'; +import {ItemStatus} from './dashboard.type'; describe('components/admin_console/workspace-optimization/chips_list', () => { const overallScoreChips: ChipsInfoType = { diff --git a/webapp/channels/src/components/admin_console/workspace-optimization/chips_list.tsx b/webapp/channels/src/components/admin_console/workspace-optimization/chips_list.tsx index 2dd06b5bc1..d9911f749b 100644 --- a/webapp/channels/src/components/admin_console/workspace-optimization/chips_list.tsx +++ b/webapp/channels/src/components/admin_console/workspace-optimization/chips_list.tsx @@ -6,7 +6,7 @@ import {FormattedMessage} from 'react-intl'; import Chip from 'components/common/chip/chip'; -import {ItemStatus} from './dashboard.data'; +import {ItemStatus} from './dashboard.type'; import './dashboard.scss'; diff --git a/webapp/channels/src/components/admin_console/workspace-optimization/dashboard.data.tsx b/webapp/channels/src/components/admin_console/workspace-optimization/dashboard.data.tsx index dd5ee9b565..93bfad13b8 100644 --- a/webapp/channels/src/components/admin_console/workspace-optimization/dashboard.data.tsx +++ b/webapp/channels/src/components/admin_console/workspace-optimization/dashboard.data.tsx @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import React from 'react'; +import React, {useEffect, useMemo, useState} from 'react'; import {useIntl} from 'react-intl'; import {useSelector} from 'react-redux'; @@ -14,56 +14,23 @@ import { AccountMultipleOutlineIcon, } from '@mattermost/compass-icons/components'; -import {getLicense} from 'mattermost-redux/selectors/entities/general'; +import {getLicense, getServerVersion} from 'mattermost-redux/selectors/entities/general'; import {GlobalState} from '@mattermost/types/store'; -import {CloudLinks, ConsolePages, DocLinks} from 'utils/constants'; +import {ConsolePages} from 'utils/constants'; import {daysToLicenseExpire, isEnterpriseOrE20License, getIsStarterLicense} from '../../../utils/license_utils'; import useOpenSalesLink from 'components/common/hooks/useOpenSalesLink'; +import {AdminConfig} from '@mattermost/types/config'; +import {runConfigChecks} from './dashboard_checks/config'; +import {DataModel, ItemStatus, Options} from './dashboard.type'; +import {runAccessChecks} from './dashboard_checks/access'; +import {runDataPrivacyChecks} from './dashboard_checks/data_privacy'; +import {runPerformanceChecks} from './dashboard_checks/performance'; +import {runEaseOfUseChecks} from './dashboard_checks/easy_management'; +import {runUpdateChecks} from './dashboard_checks/updates'; -export type DataModel = { - [key: string]: { - title: string; - description: string; - descriptionOk: string; - items: ItemModel[]; - icon: React.ReactNode; - hide?: boolean; - }; -} - -export enum ItemStatus { - NONE = 'none', - OK = 'ok', - INFO = 'info', - WARNING = 'warning', - ERROR = 'error', -} - -export type ItemModel = { - id: string; - title: string; - description: string; - status: ItemStatus; - scoreImpact: number; - impactModifier: number; - configUrl?: string; - configText?: string; - telemetryAction?: string; - infoUrl?: string; - infoText?: string; -} - -export type UpdatesParam = { - serverVersion: { - type: string; - status: ItemStatus; - description: string; - }; -} - -const impactModifiers: Record = { +export const impactModifiers: Record = { [ItemStatus.NONE]: 1, [ItemStatus.OK]: 1, [ItemStatus.INFO]: 0.5, @@ -71,11 +38,191 @@ const impactModifiers: Record = { [ItemStatus.ERROR]: 0, }; -const useMetricsData = () => { +const getUpdatesData = async ( + config: Partial, + formatMessage: ReturnType['formatMessage'], + options: Options, +) => ({ + title: formatMessage({ + id: 'admin.reporting.workspace_optimization.updates.title', + defaultMessage: 'Server updates', + }), + description: formatMessage({ + id: 'admin.reporting.workspace_optimization.updates.description', + defaultMessage: 'An update is available.', + }), + descriptionOk: formatMessage({ + id: 'admin.reporting.workspace_optimization.updates.descriptionOk', + defaultMessage: 'Your workspace is completely up to date!', + }), + icon: ( +
+ +
+ ), + items: await runUpdateChecks(config, formatMessage, options), +}); + +const getConfigurationData = async ( + config: Partial, + formatMessage: ReturnType['formatMessage'], + options: Options, +) => ({ + title: formatMessage({ + id: 'admin.reporting.workspace_optimization.configuration.title', + defaultMessage: 'Configuration', + }), + description: formatMessage({ + id: 'admin.reporting.workspace_optimization.configuration.description', + defaultMessage: 'You have configuration issues to resolve', + }), + hide: options.isCloud, + descriptionOk: formatMessage({ + id: 'admin.reporting.workspace_optimization.configuration.descriptionOk', + defaultMessage: 'You\'ve successfully configured SSL and Session Lengths!', + }), + icon: ( +
+ +
+ ), + items: await runConfigChecks(config, formatMessage, options), +}); + +const getAccessData = async ( + config: Partial, + formatMessage: ReturnType['formatMessage'], + options: Options, +) => ({ + title: formatMessage({ + id: 'admin.reporting.workspace_optimization.access.title', + defaultMessage: 'Workspace access', + }), + description: formatMessage({ + id: 'admin.reporting.workspace_optimization.access.description', + defaultMessage: 'Web server configuration may be affecting access to your Mattermost workspace.', + }), + hide: options.isCloud, + descriptionOk: formatMessage({ + id: 'admin.reporting.workspace_optimization.access.descriptionOk', + defaultMessage: 'Your web server configuration is passing a live URL test!', + }), + icon: ( +
+ +
+ ), + items: await runAccessChecks(config, formatMessage), +}); + +const getPerformanceData = async ( + config: Partial, + formatMessage: ReturnType['formatMessage'], + options: Options, +) => ({ + title: formatMessage({ + id: 'admin.reporting.workspace_optimization.performance.title', + defaultMessage: 'Performance', + }), + description: formatMessage({ + id: 'admin.reporting.workspace_optimization.performance.description', + defaultMessage: 'Your server would benefit from some performance tweaks.', + }), + hide: options.isCloud, + descriptionOk: formatMessage({ + id: 'admin.reporting.workspace_optimization.performance.descriptionOk', + defaultMessage: 'Your search performance suits your workspace usage!', + }), + icon: ( +
+ +
+ ), + items: await runPerformanceChecks(config, formatMessage, options), +}); + +const getDataPrivacyData = async ( + config: Partial, + formatMessage: ReturnType['formatMessage'], + options: Options, +) => ({ + title: formatMessage({ + id: 'admin.reporting.workspace_optimization.data_privacy.title', + defaultMessage: 'Data privacy', + }), + description: formatMessage({ + id: 'admin.reporting.workspace_optimization.data_privacy.description', + defaultMessage: 'Get better insight and control over your data.', + }), + descriptionOk: formatMessage({ + id: 'admin.reporting.workspace_optimization.data_privacy.descriptionOk', + defaultMessage: 'You\'ve enabled data retention and compliance features!', + }), + icon: ( +
+ +
+ ), + items: await runDataPrivacyChecks(config, formatMessage, options), +}); + +const getEaseOfManagementData = async ( + config: Partial, + formatMessage: ReturnType['formatMessage'], + options: Options, +) => ({ + title: formatMessage({ + id: 'admin.reporting.workspace_optimization.ease_of_management.title', + defaultMessage: 'Ease of management', + }), + description: formatMessage({ + id: 'admin.reporting.workspace_optimization.ease_of_management.description', + defaultMessage: 'Make it easier to manage your Mattermost workspace.', + }), + descriptionOk: formatMessage({ + id: 'admin.reporting.workspace_optimization.ease_of_management.descriptionOk', + defaultMessage: 'Your user authentication setup is appropriate based on your current usage!', + }), + icon: ( +
+ +
+ ), + items: await runEaseOfUseChecks(config, formatMessage, options), +}); + +const useMetricsData = ( + config: Partial, +) => { + const [loading, setLoading] = useState(true); + const [data, setData] = useState(undefined); + const {formatMessage} = useIntl(); const prevTrialLicense = useSelector((state: GlobalState) => state.entities.admin.prevTrialLicense); const license = useSelector(getLicense); + // get the currently installed server version + const installedVersion = useSelector((state: GlobalState) => getServerVersion(state)); + const analytics = useSelector((state: GlobalState) => state.entities.admin.analytics) as unknown as Options['analytics']; + const canStartTrial = license?.IsLicensed !== 'true' && prevTrialLicense?.IsLicensed !== 'true'; const daysUntilExpiration = daysToLicenseExpire(license) || -1; @@ -87,358 +234,46 @@ const useMetricsData = () => { const [, contactSalesLink] = useOpenSalesLink(); - const trialOrEnterpriseCtaConfig = { + const trialOrEnterpriseCtaConfig = useMemo(() => ({ configUrl: canStartTrial ? ConsolePages.LICENSE : contactSalesLink, configText: canStartTrial ? formatMessage({id: 'admin.reporting.workspace_optimization.cta.startTrial', defaultMessage: 'Start trial'}) : formatMessage({id: 'admin.reporting.workspace_optimization.cta.upgradeLicense', defaultMessage: 'Contact sales'}), + }), [canStartTrial, contactSalesLink, formatMessage]); + + const options: Options = useMemo(() => ({ + isLicensed, + isEnterpriseLicense, + trialOrEnterpriseCtaConfig, + isStarterLicense, + isCloud, + analytics, + installedVersion, + }), [isLicensed, isEnterpriseLicense, trialOrEnterpriseCtaConfig, isStarterLicense, isCloud, analytics, installedVersion]); + + useEffect(() => { + setLoading(true); + const refreshData = async () => { + const data = { + updates: await getUpdatesData(config, formatMessage, options), + configuration: await getConfigurationData(config, formatMessage, options), + access: await getAccessData(config, formatMessage, options), + performance: await getPerformanceData(config, formatMessage, options), + dataPrivacy: await getDataPrivacyData(config, formatMessage, options), + easyManagement: await getEaseOfManagementData(config, formatMessage, options), + }; + + return data; + }; + + refreshData().then((data) => { + setData(data); + setLoading(false); + }); + }, [config, formatMessage, options]); + + return { + data, + loading, }; - - const getUpdatesData = (data: UpdatesParam) => ({ - title: formatMessage({ - id: 'admin.reporting.workspace_optimization.updates.title', - defaultMessage: 'Server updates', - }), - description: formatMessage({ - id: 'admin.reporting.workspace_optimization.updates.description', - defaultMessage: 'An update is available.', - }), - descriptionOk: formatMessage({ - id: 'admin.reporting.workspace_optimization.updates.descriptionOk', - defaultMessage: 'Your workspace is completely up to date!', - }), - icon: ( -
- -
- ), - items: [ - { - id: 'server_version', - title: formatMessage({ - id: 'admin.reporting.workspace_optimization.updates.server_version.status.title', - defaultMessage: '{type} version update available.', - }, {type: data.serverVersion.type}), - description: data.serverVersion.description, - configUrl: CloudLinks.DOWNLOAD_UPDATE, - configText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.downloadUpdate', defaultMessage: 'Download update'}), - infoUrl: DocLinks.UPGRADE_SERVER, - infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}), - telemetryAction: 'server-version', - status: data.serverVersion.status, - scoreImpact: 15, - impactModifier: impactModifiers[data.serverVersion.status], - }, - ], - }); - - type ConfigurationParam = { - ssl: { - status: ItemStatus; - }; - sessionLength: { - status: ItemStatus; - }; - } - - const getConfigurationData = (data: ConfigurationParam) => ({ - title: formatMessage({ - id: 'admin.reporting.workspace_optimization.configuration.title', - defaultMessage: 'Configuration', - }), - description: formatMessage({ - id: 'admin.reporting.workspace_optimization.configuration.description', - defaultMessage: 'You have configuration issues to resolve', - }), - hide: isCloud, - descriptionOk: formatMessage({ - id: 'admin.reporting.workspace_optimization.configuration.descriptionOk', - defaultMessage: 'You\'ve successfully configured SSL and Session Lengths!', - }), - icon: ( -
- -
- ), - items: [ - { - id: 'ssl', - title: formatMessage({ - id: 'admin.reporting.workspace_optimization.configuration.ssl.title', - defaultMessage: 'Configure SSL to make your server more secure', - }), - description: formatMessage({ - id: 'admin.reporting.workspace_optimization.configuration.ssl.description', - defaultMessage: 'We strongly recommend securing your Mattermost workspace by configuring SSL in production environments.', - }), - infoUrl: DocLinks.SSL_CERTIFICATE, - infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}), - telemetryAction: 'ssl', - status: data.ssl.status, - scoreImpact: 25, - impactModifier: impactModifiers[data.ssl.status], - }, - { - id: 'session-length', - title: formatMessage({ - id: 'admin.reporting.workspace_optimization.configuration.session_length.title', - defaultMessage: 'Session lengths is set to default', - }), - description: formatMessage({ - id: 'admin.reporting.workspace_optimization.configuration.session_length.description', - defaultMessage: 'Your session length is set to the default of 30 days. A longer session length provides convenience, and a shorter session provides tighter security. We recommend adjusting this based on your organization\'s security policies.', - }), - configUrl: ConsolePages.SESSION_LENGTHS, - configText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.configureSessionLength', defaultMessage: 'Configure session length'}), - infoUrl: DocLinks.SESSION_LENGTHS, - infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}), - telemetryAction: 'session-length', - status: data.sessionLength.status, - scoreImpact: 8, - impactModifier: impactModifiers[data.sessionLength.status], - }, - ], - }); - - type AccessParam = { - siteUrl: { - status: ItemStatus; - }; - } - - const getAccessData = (data: AccessParam) => ({ - title: formatMessage({ - id: 'admin.reporting.workspace_optimization.access.title', - defaultMessage: 'Workspace access', - }), - description: formatMessage({ - id: 'admin.reporting.workspace_optimization.access.description', - defaultMessage: 'Web server configuration may be affecting access to your Mattermost workspace.', - }), - hide: isCloud, - descriptionOk: formatMessage({ - id: 'admin.reporting.workspace_optimization.access.descriptionOk', - defaultMessage: 'Your web server configuration is passing a live URL test!', - }), - icon: ( -
- -
- ), - items: [ - { - id: 'site-url', - title: formatMessage({ - id: 'admin.reporting.workspace_optimization.access.site_url.title', - defaultMessage: 'Misconfigured web server', - }), - description: formatMessage({ - id: 'admin.reporting.workspace_optimization.access.site_url.description', - defaultMessage: 'Your web server settings aren\'t passing a live URL test which means your workspace may not be accessible to users. We recommend updating your web server settings.', - }), - configUrl: ConsolePages.WEB_SERVER, - configText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.configureWebServer', defaultMessage: 'Configure web server'}), - infoUrl: DocLinks.SITE_URL, - infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}), - telemetryAction: 'site-url', - status: data.siteUrl.status, - scoreImpact: 12, - impactModifier: impactModifiers[data.siteUrl.status], - }, - ], - }); - - type PerformanceParam = { - search: { - status: ItemStatus; - }; - } - - const getPerformanceData = (data: PerformanceParam) => ({ - title: formatMessage({ - id: 'admin.reporting.workspace_optimization.performance.title', - defaultMessage: 'Performance', - }), - description: formatMessage({ - id: 'admin.reporting.workspace_optimization.performance.description', - defaultMessage: 'Your server would benefit from some performance tweaks.', - }), - hide: isCloud, - descriptionOk: formatMessage({ - id: 'admin.reporting.workspace_optimization.performance.descriptionOk', - defaultMessage: 'Your search performance suits your workspace usage!', - }), - icon: ( -
- -
- ), - items: [ - { - id: 'search', - title: formatMessage({ - id: 'admin.reporting.workspace_optimization.performance.search.title', - defaultMessage: 'Search performance', - }), - description: formatMessage({ - id: 'admin.reporting.workspace_optimization.performance.search.description', - defaultMessage: 'Your server has reached over 500 users and 2 million posts which can result in slow search performance. We recommend enabling Elasticsearch for better performance.', - }), - ...(isLicensed && isEnterpriseLicense ? { - configUrl: ConsolePages.ELASTICSEARCH, - configText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.configureElasticsearch', defaultMessage: 'Try Elasticsearch'}), - } : trialOrEnterpriseCtaConfig), - infoUrl: DocLinks.ELASTICSEARCH, - infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}), - telemetryAction: 'search-optimization', - status: data.search.status, - scoreImpact: 20, - impactModifier: impactModifiers[data.search.status], - }, - ], - }); - - type DataPrivacyParam = { - retention: { - status: ItemStatus; - }; - } - - // TBD - const getDataPrivacyData = (data: DataPrivacyParam) => ({ - title: formatMessage({ - id: 'admin.reporting.workspace_optimization.data_privacy.title', - defaultMessage: 'Data privacy', - }), - description: formatMessage({ - id: 'admin.reporting.workspace_optimization.data_privacy.description', - defaultMessage: 'Get better insight and control over your data.', - }), - descriptionOk: formatMessage({ - id: 'admin.reporting.workspace_optimization.data_privacy.descriptionOk', - defaultMessage: 'You\'ve enabled data retention and compliance features!', - }), - icon: ( -
- -
- ), - items: [ - { - id: 'data-retention', - title: formatMessage({ - id: 'admin.reporting.workspace_optimization.data_privacy.retention.title', - defaultMessage: 'Become more data aware', - }), - description: formatMessage({ - id: 'admin.reporting.workspace_optimization.data_privacy.retention.description', - defaultMessage: 'Organizations in highly regulated industries require more control and insight with their data. We recommend enabling Data Retention and Compliance features.', - }), - ...(isLicensed && isEnterpriseLicense ? { - configUrl: ConsolePages.DATA_RETENTION, - configText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.configureDataRetention', defaultMessage: 'Try data retention'}), - } : trialOrEnterpriseCtaConfig), - infoUrl: DocLinks.DATA_RETENTION_POLICY, - infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}), - telemetryAction: 'data-retention', - status: data.retention.status, - scoreImpact: 16, - impactModifier: impactModifiers[data.retention.status], - }, - ], - }); - - type EaseOfManagementParam = { - ldap: { - status: ItemStatus; - }; - guestAccounts?: { - status: ItemStatus; - }; - } - - // TBD - const getEaseOfManagementData = (data: EaseOfManagementParam) => ({ - title: formatMessage({ - id: 'admin.reporting.workspace_optimization.ease_of_management.title', - defaultMessage: 'Ease of management', - }), - description: formatMessage({ - id: 'admin.reporting.workspace_optimization.ease_of_management.description', - defaultMessage: 'Make it easier to manage your Mattermost workspace.', - }), - descriptionOk: formatMessage({ - id: 'admin.reporting.workspace_optimization.ease_of_management.descriptionOk', - defaultMessage: 'Your user authentication setup is appropriate based on your current usage!', - }), - icon: ( -
- -
- ), - items: [ - { - id: 'ad-ldap', - title: formatMessage({ - id: 'admin.reporting.workspace_optimization.ease_of_management.ldap.title', - defaultMessage: 'AD/LDAP integration recommended', - }), - description: formatMessage({ - id: 'admin.reporting.workspace_optimization.ease_of_management.ldap.description', - defaultMessage: 'You\'ve reached over 100 users! We recommend setting up AD/LDAP user authentication for easier onboarding as well as automated deactivations and role assignments.', - }), - ...(isLicensed && !isStarterLicense ? { - configUrl: ConsolePages.AD_LDAP, - configText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.configureLDAP', defaultMessage: 'Try AD/LDAP'}), - } : trialOrEnterpriseCtaConfig), - infoUrl: DocLinks.AD_LDAP, - infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}), - telemetryAction: 'ad-ldap', - status: data.ldap.status, - scoreImpact: 22, - impactModifier: impactModifiers[data.ldap.status], - }, - - // commented out for now. - // @see discussion here: https://github.com/mattermost/mattermost-webapp/pull/9822#discussion_r806879385 - // { - // id: 'guest-accounts', - // title: formatMessage({ - // id: 'admin.reporting.workspace_optimization.ease_of_management.guests_accounts.title', - // defaultMessage: 'Guest Accounts recommended', - // }), - // description: formatMessage({ - // id: 'admin.reporting.workspace_optimization.ease_of_management.guests_accounts.description', - // defaultMessage: 'Several user accounts are using different domains than your Site URL. You can control user access to channels and teams with guest accounts. We recommend starting an Enterprise trial and enabling Guest Access.', - // }), - // ...trialOrEnterpriseCtaConfig, - // infoUrl: 'https://docs.mattermost.com/onboard/guest-accounts.html', - // infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}), - // telemetryAction: 'guest-accounts', - // status: data.guestAccounts.status, - // scoreImpact: 6, - // impactModifier: impactModifiers[data.guestAccounts.status], - // }, - ], - }); - - return {getAccessData, getConfigurationData, getUpdatesData, getPerformanceData, getDataPrivacyData, getEaseOfManagementData, isLicensed, isEnterpriseLicense}; }; export default useMetricsData; diff --git a/webapp/channels/src/components/admin_console/workspace-optimization/dashboard.tsx b/webapp/channels/src/components/admin_console/workspace-optimization/dashboard.tsx index 6fcbd8b6f3..2409601512 100644 --- a/webapp/channels/src/components/admin_console/workspace-optimization/dashboard.tsx +++ b/webapp/channels/src/components/admin_console/workspace-optimization/dashboard.tsx @@ -4,17 +4,11 @@ import {CheckIcon} from '@mattermost/compass-icons/components'; import classNames from 'classnames'; -import React, {useEffect, useState} from 'react'; -import {useIntl} from 'react-intl'; -import {useSelector} from 'react-redux'; +import React from 'react'; import styled from 'styled-components'; -import {GlobalState} from '@mattermost/types/store'; -import {getServerVersion} from 'mattermost-redux/selectors/entities/general'; -import {Client4} from 'mattermost-redux/client'; import Accordion, {AccordionItemType} from 'components/common/accordion/accordion'; -import {elasticsearchTest, ldapTest, testSiteURL} from '../../../actions/admin_actions'; import LoadingScreen from '../../loading_screen'; import FormattedAdminHeader from '../../widgets/admin_console/formatted_admin_header'; import {Props} from '../admin_console'; @@ -22,10 +16,11 @@ import {Props} from '../admin_console'; import ChipsList, {ChipsInfoType} from './chips_list'; import CtaButtons from './cta_buttons'; -import useMetricsData, {DataModel, ItemStatus, UpdatesParam} from './dashboard.data'; +import useMetricsData from './dashboard.data'; import './dashboard.scss'; import OverallScore from './overall-score'; +import {ItemStatus} from './dashboard.type'; const AccordionItem = styled.div` padding: 12px; @@ -49,180 +44,7 @@ const successIcon = ( ); const WorkspaceOptimizationDashboard = (props: Props) => { - const [loading, setLoading] = useState(true); - const [versionData, setVersionData] = useState({type: '', description: '', status: ItemStatus.NONE}); - - // const [guestAccountStatus, setGuestAccountStatus] = useState('none'); - const [liveUrlStatus, setLiveUrlStatus] = useState(ItemStatus.ERROR); - const [elastisearchStatus, setElasticsearchStatus] = useState(ItemStatus.INFO); - const [ldapStatus, setLdapStatus] = useState(ItemStatus.INFO); - const [dataRetentionStatus, setDataRetentionStatus] = useState(ItemStatus.INFO); - const {formatMessage} = useIntl(); - const {getAccessData, getConfigurationData, getUpdatesData, getPerformanceData, getDataPrivacyData, getEaseOfManagementData, isLicensed, isEnterpriseLicense} = useMetricsData(); - - // get the currently installed server version - const installedVersion = useSelector((state: GlobalState) => getServerVersion(state)); - const analytics = useSelector((state: GlobalState) => state.entities.admin.analytics); - const {TOTAL_USERS: totalUsers, TOTAL_POSTS: totalPosts} = analytics!; - - // gather locally available data - const { - ServiceSettings, - DataRetentionSettings, - ElasticsearchSettings, - LdapSettings, - - // TeamSettings, - // GuestAccountsSettings, - } = props.config; - const {location} = document; - - const sessionLengthWebInHours = ServiceSettings?.SessionLengthWebInHours || -1; - - const testURL = () => { - if (!ServiceSettings?.SiteURL) { - return Promise.resolve(); - } - - const onSuccess = ({status}: any) => setLiveUrlStatus(status === 'OK' ? ItemStatus.OK : ItemStatus.ERROR); - const onError = () => setLiveUrlStatus(ItemStatus.ERROR); - return testSiteURL(onSuccess, onError, ServiceSettings?.SiteURL); - }; - - const testDataRetention = async () => { - if (!isLicensed || !isEnterpriseLicense) { - return Promise.resolve(); - } - - if (DataRetentionSettings?.EnableMessageDeletion || DataRetentionSettings?.EnableFileDeletion) { - setDataRetentionStatus(ItemStatus.OK); - return Promise.resolve(); - } - - const result = await fetch(`${Client4.getBaseRoute()}/data_retention/policies?page=0&per_page=0`).then((result) => result.json()); - - setDataRetentionStatus(result.total_count > 0 ? ItemStatus.OK : ItemStatus.INFO); - return Promise.resolve(); - }; - - const fetchVersion = async () => { - const result = await fetch(`${Client4.getBaseRoute()}/latest_version`).then((result) => result.json()); - - if (result.tag_name) { - const sanitizedVersion = result.tag_name.startsWith('v') ? result.tag_name.slice(1) : result.tag_name; - const newVersionParts = sanitizedVersion.split('.'); - const installedVersionParts = installedVersion.split('.').slice(0, 3); - - // quick general check if a newer version is available - let type = ''; - let status: ItemStatus = ItemStatus.OK; - - if (newVersionParts.join('') > installedVersionParts.join('')) { - // get correct values to be inserted into the accordion item - switch (true) { - case newVersionParts[0] > installedVersionParts[0]: - type = formatMessage({ - id: 'admin.reporting.workspace_optimization.updates.server_version.update_type.major', - defaultMessage: 'Major', - }); - status = ItemStatus.ERROR; - break; - case newVersionParts[1] > installedVersionParts[1]: - type = formatMessage({ - id: 'admin.reporting.workspace_optimization.updates.server_version.update_type.minor', - defaultMessage: 'Minor', - }); - status = ItemStatus.WARNING; - break; - case newVersionParts[2] > installedVersionParts[2]: - type = formatMessage({ - id: 'admin.reporting.workspace_optimization.updates.server_version.update_type.patch', - defaultMessage: 'Patch', - }); - status = ItemStatus.INFO; - break; - } - } - - setVersionData({type, description: result.body, status}); - } - }; - - const testElasticsearch = () => { - if (!isLicensed || !isEnterpriseLicense || !(ElasticsearchSettings?.EnableIndexing && ElasticsearchSettings?.EnableSearching)) { - return Promise.resolve(); - } - - const onSuccess = ({status}: any) => setElasticsearchStatus(status === 'OK' ? ItemStatus.OK : ItemStatus.INFO); - const onError = () => setElasticsearchStatus(ItemStatus.INFO); - - return elasticsearchTest(props.config, onSuccess, onError); - }; - - const testLdap = () => { - if (!isLicensed || !LdapSettings?.Enable) { - return Promise.resolve(); - } - - const onSuccess = ({status}: any) => setLdapStatus(status === 'OK' ? ItemStatus.OK : ItemStatus.INFO); - const onError = () => setLdapStatus(ItemStatus.INFO); - - return ldapTest(onSuccess, onError); - }; - - // commented out for now. - // @see discussion here: https://github.com/mattermost/mattermost-webapp/pull/9822#discussion_r806879385 - // const fetchGuestAccounts = async () => { - // if (TeamSettings?.EnableOpenServer && GuestAccountsSettings?.Enable) { - // let usersArray = await fetch(`${Client4.getBaseRoute()}/users/invalid_emails`).then((result) => result.json()); - // - // // this setting is just a string with a list of domains, or an empty string - // if (GuestAccountsSettings?.RestrictCreationToDomains) { - // const domainList = GuestAccountsSettings?.RestrictCreationToDomains; - // usersArray = usersArray.filter(({email}: Record) => domainList.includes((email as string).split('@')[1])); - // } - // - // // if guest accounts make up more than 5% of the user base show the info accordion - // if (usersArray.length > (totalUsers as number * 0.05)) { - // setGuestAccountStatus(ItemStatus.INFO); - // return; - // } - // } - // - // setGuestAccountStatus(ItemStatus.OK); - // }; - - useEffect(() => { - const promises = []; - promises.push(testURL()); - promises.push(testLdap()); - promises.push(fetchVersion()); - promises.push(testElasticsearch()); - promises.push(testDataRetention()); - - // promises.push(fetchGuestAccounts()); - Promise.all(promises).then(() => setLoading(false)); - }, [props.config, isLicensed, isEnterpriseLicense]); - - const data: DataModel = { - updates: getUpdatesData({serverVersion: versionData}), - configuration: getConfigurationData({ - ssl: {status: location.protocol === 'https:' ? ItemStatus.OK : ItemStatus.ERROR}, - sessionLength: {status: sessionLengthWebInHours === 720 ? ItemStatus.INFO : ItemStatus.OK}, - }), - access: getAccessData({siteUrl: {status: liveUrlStatus}}), - performance: getPerformanceData({ - search: { - status: totalPosts < 2_000_000 && totalUsers < 500 ? ItemStatus.OK : elastisearchStatus, - }, - }), - dataPrivacy: getDataPrivacyData({retention: {status: dataRetentionStatus}}), - easyManagement: getEaseOfManagementData({ - ldap: {status: totalUsers < 100 ? ItemStatus.OK : ldapStatus}, - - // guestAccounts: {status: guestAccountStatus}, - }), - }; + const {data, loading} = useMetricsData(props.config); const overallScoreChips: ChipsInfoType = { [ItemStatus.INFO]: 0, @@ -236,7 +58,7 @@ const WorkspaceOptimizationDashboard = (props: Props) => { }; // eslint-disable-next-line @typescript-eslint/no-unused-vars - const accData: AccordionItemType[] = Object.entries(data).filter(([_, y]) => !y.hide).map(([accordionKey, accordionData]) => { + const accordionItemsData: AccordionItemType[] | undefined = data && Object.entries(data).filter(([_, y]) => !y.hide).map(([accordionKey, accordionData]) => { const accordionDataChips: ChipsInfoType = { [ItemStatus.INFO]: 0, [ItemStatus.WARNING]: 0, @@ -297,7 +119,7 @@ const WorkspaceOptimizationDashboard = (props: Props) => { }; }); - return loading ? : ( + return loading || !accordionItemsData ? : (
{ chartValue={Math.floor((overallScore.current / overallScore.max) * 100)} />
diff --git a/webapp/channels/src/components/admin_console/workspace-optimization/dashboard.type.ts b/webapp/channels/src/components/admin_console/workspace-optimization/dashboard.type.ts new file mode 100644 index 0000000000..b87c9d1bdd --- /dev/null +++ b/webapp/channels/src/components/admin_console/workspace-optimization/dashboard.type.ts @@ -0,0 +1,75 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +export type DataModel = { + [key: string]: { + title: string; + description: string; + descriptionOk: string; + items: ItemModel[]; + icon: React.ReactNode; + hide?: boolean; + }; +} + +export enum ItemStatus { + + /** Return NONE if it's not relevant, not configured, or not an option */ + NONE = 'none', + + /** Return OK if all checks for this have passed */ + OK = 'ok', + + /** Return info if it might not be relevant to them, but they could utilize it */ + INFO = 'info', + WARNING = 'warning', + ERROR = 'error', +} + +export type ItemModel = { + id: string; + title: string; + description: string; + status: ItemStatus; + scoreImpact: number; + impactModifier: number; + configUrl?: string; + configText?: string; + telemetryAction?: string; + infoUrl?: string; + infoText?: string; +} + +export type UpdatesParam = { + serverVersion: { + type: string; + status: ItemStatus; + description: string; + }; +} + +type Analytics = { + DAILY_ACTIVE_USERS: number; + MONTHLY_ACTIVE_USERS: number; + TOTAL_INACTIVE_USERS: number; + TOTAL_MASTER_DB_CONNECTIONS: number; + TOTAL_POSTS: number; + TOTAL_PRIVATE_GROUPS: number; + TOTAL_PUBLIC_CHANNELS: number; + TOTAL_READ_DB_CONNECTIONS: number; + TOTAL_TEAMS: number; + TOTAL_USERS: number; + TOTAL_WEBSOCKET_CONNECTIONS: number; +} +export type Options = { + isLicensed: boolean; + isEnterpriseLicense: boolean; + trialOrEnterpriseCtaConfig: { + configUrl: string; + configText: string; + }; + isCloud: boolean; + isStarterLicense: boolean; + analytics: Analytics | undefined; + installedVersion: string; +}; diff --git a/webapp/channels/src/components/admin_console/workspace-optimization/dashboard_checks/access.ts b/webapp/channels/src/components/admin_console/workspace-optimization/dashboard_checks/access.ts new file mode 100644 index 0000000000..e8f37024bb --- /dev/null +++ b/webapp/channels/src/components/admin_console/workspace-optimization/dashboard_checks/access.ts @@ -0,0 +1,66 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {useIntl} from 'react-intl'; +import {ItemModel, ItemStatus} from '../dashboard.type'; +import {ConsolePages, DocLinks} from 'utils/constants'; +import {impactModifiers} from '../dashboard.data'; +import {AdminConfig} from '@mattermost/types/config'; +import {testSiteURL} from 'actions/admin_actions'; + +/** + * + * @description Checking to see if the siteURL is configured correctly by running it through the same "check siteURL" button that exists on the webserver page. + */ +const siteURLCheck = async (config: Partial, formatMessage: ReturnType['formatMessage']): Promise => { + let status = ItemStatus.OK; + const testURL = async () => { + if (!config.ServiceSettings?.SiteURL) { + status = ItemStatus.ERROR; + } + + const onSuccess = ({status: s}: any) => { + if (s === 'OK') { + status = ItemStatus.OK; + } + }; + const onError = () => { + status = ItemStatus.ERROR; + }; + await testSiteURL(onSuccess, onError, config.ServiceSettings?.SiteURL); + }; + + await testURL(); + return { + id: 'site-url', + title: formatMessage({ + id: 'admin.reporting.workspace_optimization.access.site_url.title', + defaultMessage: 'Misconfigured web server', + }), + description: formatMessage({ + id: 'admin.reporting.workspace_optimization.access.site_url.description', + defaultMessage: 'Your web server settings aren\'t passing a live URL test which means your workspace may not be accessible to users. We recommend updating your web server settings.', + }), + configUrl: ConsolePages.WEB_SERVER, + configText: formatMessage({id: 'admin.reporting.workspace_optimization.access.site_url.cta', defaultMessage: 'Configure web server'}), + infoUrl: DocLinks.SITE_URL, + infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}), + telemetryAction: 'site-url', + status, + scoreImpact: 12, + impactModifier: impactModifiers[status], + }; +}; + +const checks = [ + siteURLCheck, +]; + +export const runAccessChecks = async ( + config: Partial, + formatMessage: ReturnType['formatMessage'], +) => { + const results = await Promise.all(checks.map((check) => check(config, formatMessage))); + return results; +}; + diff --git a/webapp/channels/src/components/admin_console/workspace-optimization/dashboard_checks/config.ts b/webapp/channels/src/components/admin_console/workspace-optimization/dashboard_checks/config.ts new file mode 100644 index 0000000000..3cc59e7939 --- /dev/null +++ b/webapp/channels/src/components/admin_console/workspace-optimization/dashboard_checks/config.ts @@ -0,0 +1,84 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +/* eslint-disable @typescript-eslint/no-unused-vars */ + +import {AdminConfig} from '@mattermost/types/config'; +import {useIntl} from 'react-intl'; +import {ConsolePages, DocLinks} from 'utils/constants'; +import {ItemModel, ItemStatus, Options} from '../dashboard.type'; +import {impactModifiers} from '../dashboard.data'; + +/** + * + * @description This checks to see if the user's active session is done over https. This does not check if the server is configured to use https. + */ +const ssl = ( + config: Partial, + formatMessage: ReturnType['formatMessage'], + options: Options, +): ItemModel => { + const status = document.location.protocol === 'https:' ? ItemStatus.OK : ItemStatus.ERROR; + + return { + id: 'ssl', + title: formatMessage({ + id: 'admin.reporting.workspace_optimization.configuration.ssl.title', + defaultMessage: 'Configure SSL to make your server more secure', + }), + description: formatMessage({ + id: 'admin.reporting.workspace_optimization.configuration.ssl.description', + defaultMessage: 'We strongly recommend securing your Mattermost workspace by configuring SSL in production environments.', + }), + infoUrl: DocLinks.SSL_CERTIFICATE, + infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}), + telemetryAction: 'ssl', + status, + scoreImpact: 25, + impactModifier: impactModifiers[status], + }; +}; + +/** + * + * @description This checks to see if the user has adjusted the default session lengths to something other than 720 hours. + */ +const sessionLength = ( + config: Partial, + formatMessage: ReturnType['formatMessage'], + options: Options, +): ItemModel => { + const status = config.ServiceSettings?.SessionLengthMobileInHours === 720 ? ItemStatus.INFO : ItemStatus.OK; + return { + id: 'session-length', + title: formatMessage({ + id: 'admin.reporting.workspace_optimization.configuration.session_length.title', + defaultMessage: 'Session lengths is set to default', + }), + description: formatMessage({ + id: 'admin.reporting.workspace_optimization.configuration.session_length.description', + defaultMessage: 'Your session length is set to the default of 30 days. A longer session length provides convenience, and a shorter session provides tighter security. We recommend adjusting this based on your organization\'s security policies.', + }), + configUrl: ConsolePages.SESSION_LENGTHS, + configText: formatMessage({id: 'admin.reporting.workspace_optimization.configuration.session_length.cta', defaultMessage: 'Configure session length'}), + infoUrl: DocLinks.SESSION_LENGTHS, + infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}), + telemetryAction: 'session-length', + status, + scoreImpact: 8, + impactModifier: impactModifiers[status], + }; +}; + +export const runConfigChecks = async ( + config: Partial, + formatMessage: ReturnType['formatMessage'], + options: Options, +) => { + const checks = [ + ssl, + sessionLength, + ]; + const results = await Promise.all(checks.map((check) => check(config, formatMessage, options))); + return results; +}; diff --git a/webapp/channels/src/components/admin_console/workspace-optimization/dashboard_checks/data_privacy.ts b/webapp/channels/src/components/admin_console/workspace-optimization/dashboard_checks/data_privacy.ts new file mode 100644 index 0000000000..049f90015c --- /dev/null +++ b/webapp/channels/src/components/admin_console/workspace-optimization/dashboard_checks/data_privacy.ts @@ -0,0 +1,70 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {useIntl} from 'react-intl'; +import {impactModifiers} from '../dashboard.data'; +import {ConsolePages, DocLinks} from 'utils/constants'; +import {Client4} from 'mattermost-redux/client'; +import {ItemStatus, Options} from '../dashboard.type'; +import {AdminConfig} from '@mattermost/types/config'; + +/** + * + * @description Checks if they they have a global policy deletion enabled, or if a custom policy has been created. + */ +const dataRetentionCheck = async ( + config: Partial, + formatMessage: ReturnType['formatMessage'], + options: Options, +) => { + const testDataRetention = async ( + config: Partial, + options: Options, + ) => { + if (!options.isLicensed || !options.isEnterpriseLicense) { + return ItemStatus.INFO; + } + + if (config.DataRetentionSettings?.EnableMessageDeletion || config.DataRetentionSettings?.EnableFileDeletion) { + return ItemStatus.OK; + } + + const policyCount: {total_count: number} = await fetch(`${Client4.getBaseRoute()}/data_retention/policies_count`).then((result) => result.json()); + return policyCount.total_count > 0 ? ItemStatus.OK : ItemStatus.INFO; + }; + + const status = await testDataRetention(config, options); + return { + id: 'data-retention', + title: formatMessage({ + id: 'admin.reporting.workspace_optimization.data_privacy.retention.title', + defaultMessage: 'Become more data aware', + }), + description: formatMessage({ + id: 'admin.reporting.workspace_optimization.data_privacy.retention.description', + defaultMessage: 'Organizations in highly regulated industries require more control and insight with their data. We recommend enabling Data Retention and Compliance features.', + }), + ...(options.isLicensed && options.isEnterpriseLicense ? { + configUrl: ConsolePages.DATA_RETENTION, + configText: formatMessage({id: 'admin.reporting.workspace_optimization.data_privacy.retention.cta', defaultMessage: 'Try data retention'}), + } : options.trialOrEnterpriseCtaConfig), + infoUrl: DocLinks.DATA_RETENTION_POLICY, + infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}), + telemetryAction: 'data-retention', + status, + scoreImpact: 16, + impactModifier: impactModifiers[status], + }; +}; + +export const runDataPrivacyChecks = async ( + config: Partial, + formatMessage: ReturnType['formatMessage'], + options: Options, +) => { + const checks = [ + dataRetentionCheck, + ]; + const results = await Promise.all(checks.map((check) => check(config, formatMessage, options))); + return results; +}; diff --git a/webapp/channels/src/components/admin_console/workspace-optimization/dashboard_checks/easy_management.ts b/webapp/channels/src/components/admin_console/workspace-optimization/dashboard_checks/easy_management.ts new file mode 100644 index 0000000000..1a959918ad --- /dev/null +++ b/webapp/channels/src/components/admin_console/workspace-optimization/dashboard_checks/easy_management.ts @@ -0,0 +1,129 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {AdminConfig} from '@mattermost/types/config'; +import {useIntl} from 'react-intl'; +import {ItemModel, ItemStatus, Options} from '../dashboard.type'; +import {ConsolePages, DocLinks} from 'utils/constants'; +import {impactModifiers} from '../dashboard.data'; + +// import {Client4} from 'mattermost-redux/client'; +// import {AnalyticsRow} from '@mattermost/types/admin'; +import {ldapTest} from 'actions/admin_actions'; + +const usesLDAP = async ( + config: Partial, + formatMessage: ReturnType['formatMessage'], + options: Options, +): Promise => { + const testLdap = async ( + config: Partial, + options: Options, + ): Promise => { + let check = ItemStatus.INFO; + + if (!options.isLicensed || !config.LdapSettings?.Enable) { + return check; + } + + const onSuccess = ({status}: any) => { + if (status === 'OK') { + check = ItemStatus.OK; + } + }; + + await ldapTest(onSuccess); + + return check; + }; + + // something feels flawed in this check. + const status = options.analytics?.TOTAL_USERS as number > 100 ? await testLdap(config, options) : ItemStatus.OK; + + return { + id: 'ad-ldap', + title: formatMessage({ + id: 'admin.reporting.workspace_optimization.ease_of_management.ldap.title', + defaultMessage: 'AD/LDAP integration recommended', + }), + description: formatMessage({ + id: 'admin.reporting.workspace_optimization.ease_of_management.ldap.description', + defaultMessage: 'You\'ve reached over 100 users! We recommend setting up AD/LDAP user authentication for easier onboarding as well as automated deactivations and role assignments.', + }), + ...(options.isLicensed && !options.isStarterLicense ? { + configUrl: ConsolePages.AD_LDAP, + configText: formatMessage({id: 'admin.reporting.workspace_optimization.ease_of_management.ldap.cta', defaultMessage: 'Try AD/LDAP'}), + } : options.trialOrEnterpriseCtaConfig), + infoUrl: DocLinks.AD_LDAP, + infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}), + telemetryAction: 'ad-ldap', + status, + scoreImpact: 22, + impactModifier: impactModifiers[status], + }; +}; + +// // commented out for now. +// // @see discussion here: https://github.com/mattermost/mattermost-webapp/pull/9822#discussion_r806879385 +// const fetchGuestAccounts = async ( +// config: Partial, +// analytics: Record | undefined, +// ) => { +// if (config.TeamSettings?.EnableOpenServer && config.GuestAccountsSettings?.Enable) { +// let usersArray = await fetch(`${Client4.getBaseRoute()}/users/invalid_emails`).then((result) => result.json()); + +// // this setting is just a string with a list of domains, or an empty string +// if (config.GuestAccountsSettings?.RestrictCreationToDomains) { +// const domainList = config.GuestAccountsSettings?.RestrictCreationToDomains; +// usersArray = usersArray.filter(({email}: Record) => domainList.includes((email as string).split('@')[1])); +// } + +// // if guest accounts make up more than 5% of the user base show the info accordion +// if (analytics && usersArray.length > (analytics.totalUsers as number * 0.05)) { +// return ItemStatus.INFO; +// } +// } + +// return ItemStatus.OK; +// }; + +// const guestAccounts = async ( +// config: Partial, +// formatMessage: ReturnType['formatMessage'], +// options: Options, +// ): Promise => { +// const status = await fetchGuestAccounts(config, options.analytics); +// return { +// id: 'guest-accounts', +// title: formatMessage({ +// id: 'admin.reporting.workspace_optimization.ease_of_management.guests_accounts.title', +// defaultMessage: 'Guest Accounts recommended', +// }), +// description: formatMessage({ +// id: 'admin.reporting.workspace_optimization.ease_of_management.guests_accounts.description', +// defaultMessage: 'Several user accounts are using different domains than your Site URL. You can control user access to channels and teams with guest accounts. We recommend starting an Enterprise trial and enabling Guest Access.', +// }), +// ...options.trialOrEnterpriseCtaConfig, +// infoUrl: 'https://docs.mattermost.com/onboard/guest-accounts.html', +// infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}), +// telemetryAction: 'guest-accounts', +// status, +// scoreImpact: 6, +// impactModifier: impactModifiers[status], +// }; +// }; + +export const runEaseOfUseChecks = async ( + config: Partial, + formatMessage: ReturnType['formatMessage'], + options: Options, +): Promise => { + const checks = [ + usesLDAP, + + // guestAccounts, + ]; + + const results = await Promise.all(checks.map((check) => check(config, formatMessage, options))); + return results; +}; diff --git a/webapp/channels/src/components/admin_console/workspace-optimization/dashboard_checks/performance.ts b/webapp/channels/src/components/admin_console/workspace-optimization/dashboard_checks/performance.ts new file mode 100644 index 0000000000..50d7f6f662 --- /dev/null +++ b/webapp/channels/src/components/admin_console/workspace-optimization/dashboard_checks/performance.ts @@ -0,0 +1,72 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {AdminConfig} from '@mattermost/types/config'; +import {ItemModel, ItemStatus, Options} from '../dashboard.type'; +import {elasticsearchTest} from 'actions/admin_actions'; +import {useIntl} from 'react-intl'; +import {ConsolePages, DocLinks} from 'utils/constants'; +import {impactModifiers} from '../dashboard.data'; + +const search = async ( + config: Partial, + formatMessage: ReturnType['formatMessage'], + options: Options, +): Promise => { + const testElasticsearch = async ( + config: Partial, + options: Options, + ) => { + let check = ItemStatus.INFO; + + if (!options.isLicensed || !options.isEnterpriseLicense || !(config.ElasticsearchSettings?.EnableIndexing && config.ElasticsearchSettings?.EnableSearching)) { + return check; + } + + const onSuccess = ({status}: any) => { + if (status === 'OK') { + check = ItemStatus.OK; + } + }; + await elasticsearchTest(config, onSuccess); + return check; + }; + + const totalPosts = options.analytics?.TOTAL_POSTS as number; + const totalUsers = options.analytics?.TOTAL_USERS as number; + const status = totalPosts < 2_000_000 && totalUsers < 500 ? ItemStatus.OK : await testElasticsearch(config, options); + return { + id: 'search', + title: formatMessage({ + id: 'admin.reporting.workspace_optimization.performance.search.title', + defaultMessage: 'Search performance', + }), + description: formatMessage({ + id: 'admin.reporting.workspace_optimization.performance.search.description', + defaultMessage: 'Your server has reached over 500 users and 2 million posts which can result in slow search performance. We recommend enabling Elasticsearch for better performance.', + }), + ...(options.isLicensed && options.isEnterpriseLicense ? { + configUrl: ConsolePages.ELASTICSEARCH, + configText: formatMessage({id: 'admin.reporting.workspace_optimization.search.cta', defaultMessage: 'Try Elasticsearch'}), + } : options.trialOrEnterpriseCtaConfig), + infoUrl: DocLinks.ELASTICSEARCH, + infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}), + telemetryAction: 'search-optimization', + status, + scoreImpact: 20, + impactModifier: impactModifiers[status], + }; +}; + +export const runPerformanceChecks = async ( + config: Partial, + formatMessage: ReturnType['formatMessage'], + options: Options, +) => { + const checks = [ + search, + ]; + + const results = await Promise.all(checks.map((check) => check(config, formatMessage, options))); + return results; +}; diff --git a/webapp/channels/src/components/admin_console/workspace-optimization/dashboard_checks/updates.ts b/webapp/channels/src/components/admin_console/workspace-optimization/dashboard_checks/updates.ts new file mode 100644 index 0000000000..438e358f6d --- /dev/null +++ b/webapp/channels/src/components/admin_console/workspace-optimization/dashboard_checks/updates.ts @@ -0,0 +1,94 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {Client4} from 'mattermost-redux/client'; +import {ItemStatus, Options} from '../dashboard.type'; +import {useIntl} from 'react-intl'; +import {AdminConfig} from '@mattermost/types/config'; +import {CloudLinks, DocLinks} from 'utils/constants'; +import {impactModifiers} from '../dashboard.data'; + +const testServerVersion = async ( + config: Partial, + formatMessage: ReturnType['formatMessage'], + options: Options, +) => { + const fetchVersion = async ( + installedVersion: string, + formatMessage: ReturnType['formatMessage'], + ) => { + const result = await fetch(`${Client4.getBaseRoute()}/latest_version`).then((result) => result.json()); + + if (result.tag_name) { + const sanitizedVersion = result.tag_name.startsWith('v') ? result.tag_name.slice(1) : result.tag_name; + const newVersionParts = sanitizedVersion.split('.'); + const installedVersionParts = installedVersion.split('.').slice(0, 3); + + // quick general check if a newer version is available + let type = ''; + let status: ItemStatus = ItemStatus.OK; + + if (newVersionParts.join('') > installedVersionParts.join('')) { + // get correct values to be inserted into the accordion item + switch (true) { + case newVersionParts[0] > installedVersionParts[0]: + type = formatMessage({ + id: 'admin.reporting.workspace_optimization.updates.server_version.update_type.major', + defaultMessage: 'Major', + }); + status = ItemStatus.ERROR; + break; + case newVersionParts[1] > installedVersionParts[1]: + type = formatMessage({ + id: 'admin.reporting.workspace_optimization.updates.server_version.update_type.minor', + defaultMessage: 'Minor', + }); + status = ItemStatus.WARNING; + break; + case newVersionParts[2] > installedVersionParts[2]: + type = formatMessage({ + id: 'admin.reporting.workspace_optimization.updates.server_version.update_type.patch', + defaultMessage: 'Patch', + }); + status = ItemStatus.INFO; + break; + } + } + + return {type, description: result.body, status}; + } + + return {type: '', description: '', status: ItemStatus.OK}; + }; + + const serverVersion = await fetchVersion(options.installedVersion, formatMessage); + return { + id: 'server_version', + title: formatMessage({ + id: 'admin.reporting.workspace_optimization.updates.server_version.status.title', + defaultMessage: '{type} version update available.', + }, {type: serverVersion.type}), + description: serverVersion.description, + configUrl: CloudLinks.DOWNLOAD_UPDATE, + configText: formatMessage({id: 'admin.reporting.workspace_optimization.updates.server_version.cta', defaultMessage: 'Download update'}), + infoUrl: DocLinks.UPGRADE_SERVER, + infoText: formatMessage({id: 'admin.reporting.workspace_optimization.cta.learnMore', defaultMessage: 'Learn more'}), + telemetryAction: 'server-version', + status: serverVersion.status, + scoreImpact: 15, + impactModifier: impactModifiers[serverVersion.status], + }; +}; + +export const runUpdateChecks = async ( + config: Partial, + formatMessage: ReturnType['formatMessage'], + options: Options, +) => { + const checks = [ + testServerVersion, + ]; + + const results = await Promise.all(checks.map((check) => check(config, formatMessage, options))); + return results; +}; diff --git a/webapp/channels/src/components/advanced_create_comment/advanced_create_comment.tsx b/webapp/channels/src/components/advanced_create_comment/advanced_create_comment.tsx index b0679ea814..a484dc4bb2 100644 --- a/webapp/channels/src/components/advanced_create_comment/advanced_create_comment.tsx +++ b/webapp/channels/src/components/advanced_create_comment/advanced_create_comment.tsx @@ -13,6 +13,7 @@ import * as GlobalActions from 'actions/global_actions'; import Constants, {AdvancedTextEditor as AdvancedTextEditorConst, Locations, ModalIdentifiers, Preferences} from 'utils/constants'; import {PreferenceType} from '@mattermost/types/preferences'; +import * as Keyboard from 'utils/keyboard'; import * as UserAgent from 'utils/user_agent'; import * as Utils from 'utils/utils'; import { @@ -819,11 +820,11 @@ class AdvancedCreateComment extends React.PureComponent { handleKeyDown = (e: React.KeyboardEvent) => { const ctrlOrMetaKeyPressed = e.ctrlKey || e.metaKey; - const lastMessageReactionKeyCombo = ctrlOrMetaKeyPressed && e.shiftKey && Utils.isKeyPressed(e, KeyCodes.BACK_SLASH); + const lastMessageReactionKeyCombo = ctrlOrMetaKeyPressed && e.shiftKey && Keyboard.isKeyPressed(e, KeyCodes.BACK_SLASH); - const ctrlKeyCombo = Utils.cmdOrCtrlPressed(e) && !e.altKey && !e.shiftKey; - const ctrlAltCombo = Utils.cmdOrCtrlPressed(e, true) && e.altKey; - const shiftAltCombo = !Utils.cmdOrCtrlPressed(e) && e.shiftKey && e.altKey; + const ctrlKeyCombo = Keyboard.cmdOrCtrlPressed(e) && !e.altKey && !e.shiftKey; + const ctrlAltCombo = Keyboard.cmdOrCtrlPressed(e, true) && e.altKey; + const shiftAltCombo = !Keyboard.cmdOrCtrlPressed(e) && e.shiftKey && e.altKey; // listen for line break key combo and insert new line character if (Utils.isUnhandledLineBreakKeyCombo(e)) { @@ -838,7 +839,7 @@ class AdvancedCreateComment extends React.PureComponent { if ( (this.props.ctrlSend || this.props.codeBlockOnCtrlEnter) && - Utils.isKeyPressed(e, KeyCodes.ENTER) && + Keyboard.isKeyPressed(e, KeyCodes.ENTER) && (e.ctrlKey || e.metaKey) ) { this.setShowPreview(false); @@ -849,7 +850,7 @@ class AdvancedCreateComment extends React.PureComponent { const draft = this.state.draft!; const {message} = draft; - if (Utils.isKeyPressed(e, KeyCodes.ESCAPE)) { + if (Keyboard.isKeyPressed(e, KeyCodes.ESCAPE)) { this.textboxRef.current?.blur(); } @@ -858,7 +859,7 @@ class AdvancedCreateComment extends React.PureComponent { !e.metaKey && !e.altKey && !e.shiftKey && - Utils.isKeyPressed(e, KeyCodes.UP) && + Keyboard.isKeyPressed(e, KeyCodes.UP) && message === '' ) { e.preventDefault(); @@ -879,13 +880,13 @@ class AdvancedCreateComment extends React.PureComponent { } = e.target as TextboxElement; if (ctrlKeyCombo) { - if (Utils.isKeyPressed(e, KeyCodes.UP)) { + if (Keyboard.isKeyPressed(e, KeyCodes.UP)) { e.preventDefault(); this.props.onMoveHistoryIndexBack(); - } else if (Utils.isKeyPressed(e, KeyCodes.DOWN)) { + } else if (Keyboard.isKeyPressed(e, KeyCodes.DOWN)) { e.preventDefault(); this.props.onMoveHistoryIndexForward(); - } else if (Utils.isKeyPressed(e, KeyCodes.B)) { + } else if (Keyboard.isKeyPressed(e, KeyCodes.B)) { e.stopPropagation(); e.preventDefault(); this.applyMarkdown({ @@ -894,7 +895,7 @@ class AdvancedCreateComment extends React.PureComponent { selectionEnd, message: value, }); - } else if (Utils.isKeyPressed(e, KeyCodes.I)) { + } else if (Keyboard.isKeyPressed(e, KeyCodes.I)) { e.stopPropagation(); e.preventDefault(); this.applyMarkdown({ @@ -905,7 +906,7 @@ class AdvancedCreateComment extends React.PureComponent { }); } } else if (ctrlAltCombo) { - if (Utils.isKeyPressed(e, KeyCodes.K)) { + if (Keyboard.isKeyPressed(e, KeyCodes.K)) { e.stopPropagation(); e.preventDefault(); this.applyMarkdown({ @@ -914,7 +915,7 @@ class AdvancedCreateComment extends React.PureComponent { selectionEnd, message: value, }); - } else if (Utils.isKeyPressed(e, KeyCodes.C)) { + } else if (Keyboard.isKeyPressed(e, KeyCodes.C)) { e.stopPropagation(); e.preventDefault(); this.applyMarkdown({ @@ -923,21 +924,21 @@ class AdvancedCreateComment extends React.PureComponent { selectionEnd, message: value, }); - } else if (Utils.isKeyPressed(e, KeyCodes.E)) { + } else if (Keyboard.isKeyPressed(e, KeyCodes.E)) { e.stopPropagation(); e.preventDefault(); this.toggleEmojiPicker(); - } else if (Utils.isKeyPressed(e, KeyCodes.T)) { + } else if (Keyboard.isKeyPressed(e, KeyCodes.T)) { e.stopPropagation(); e.preventDefault(); this.toggleAdvanceTextEditor(); - } else if (Utils.isKeyPressed(e, KeyCodes.P) && draft.message.length) { + } else if (Keyboard.isKeyPressed(e, KeyCodes.P) && draft.message.length) { e.stopPropagation(); e.preventDefault(); this.setShowPreview(!this.props.shouldShowPreview); } } else if (shiftAltCombo) { - if (Utils.isKeyPressed(e, KeyCodes.X)) { + if (Keyboard.isKeyPressed(e, KeyCodes.X)) { e.stopPropagation(); e.preventDefault(); this.applyMarkdown({ @@ -946,7 +947,7 @@ class AdvancedCreateComment extends React.PureComponent { selectionEnd, message: value, }); - } else if (Utils.isKeyPressed(e, KeyCodes.SEVEN)) { + } else if (Keyboard.isKeyPressed(e, KeyCodes.SEVEN)) { e.preventDefault(); this.applyMarkdown({ markdownMode: 'ol', @@ -954,7 +955,7 @@ class AdvancedCreateComment extends React.PureComponent { selectionEnd, message: value, }); - } else if (Utils.isKeyPressed(e, KeyCodes.EIGHT)) { + } else if (Keyboard.isKeyPressed(e, KeyCodes.EIGHT)) { e.preventDefault(); this.applyMarkdown({ markdownMode: 'ul', @@ -962,7 +963,7 @@ class AdvancedCreateComment extends React.PureComponent { selectionEnd, message: value, }); - } else if (Utils.isKeyPressed(e, KeyCodes.NINE)) { + } else if (Keyboard.isKeyPressed(e, KeyCodes.NINE)) { e.preventDefault(); this.applyMarkdown({ markdownMode: 'quote', diff --git a/webapp/channels/src/components/advanced_create_post/advanced_create_post.tsx b/webapp/channels/src/components/advanced_create_post/advanced_create_post.tsx index 630ad71188..a8bcd5bbba 100644 --- a/webapp/channels/src/components/advanced_create_post/advanced_create_post.tsx +++ b/webapp/channels/src/components/advanced_create_post/advanced_create_post.tsx @@ -22,6 +22,7 @@ import Constants, { Preferences, AdvancedTextEditor as AdvancedTextEditorConst, } from 'utils/constants'; +import * as Keyboard from 'utils/keyboard'; import { containsAtChannel, specialMentionsInText, @@ -34,7 +35,6 @@ import { } from 'utils/post_utils'; import {getTable, hasHtmlLink, formatMarkdownMessage, formatGithubCodePaste, isGitHubCodeBlock} from 'utils/paste'; import * as UserAgent from 'utils/user_agent'; -import {isMac} from 'utils/utils'; import * as Utils from 'utils/utils'; import EmojiMap from 'utils/emoji_map'; import {applyMarkdown, ApplyMarkdownOptions} from 'utils/markdown/apply_markdown'; @@ -1096,7 +1096,7 @@ class AdvancedCreatePost extends React.PureComponent { documentKeyHandler = (e: KeyboardEvent) => { const ctrlOrMetaKeyPressed = e.ctrlKey || e.metaKey; - const lastMessageReactionKeyCombo = ctrlOrMetaKeyPressed && e.shiftKey && Utils.isKeyPressed(e, KeyCodes.BACK_SLASH); + const lastMessageReactionKeyCombo = ctrlOrMetaKeyPressed && e.shiftKey && Keyboard.isKeyPressed(e, KeyCodes.BACK_SLASH); if (lastMessageReactionKeyCombo) { this.reactToLastMessage(e); return; @@ -1134,12 +1134,12 @@ class AdvancedCreatePost extends React.PureComponent { const ctrlOrMetaKeyPressed = e.ctrlKey || e.metaKey; const ctrlEnterKeyCombo = (this.props.ctrlSend || this.props.codeBlockOnCtrlEnter) && - Utils.isKeyPressed(e, KeyCodes.ENTER) && + Keyboard.isKeyPressed(e, KeyCodes.ENTER) && ctrlOrMetaKeyPressed; - const ctrlKeyCombo = Utils.cmdOrCtrlPressed(e) && !e.altKey && !e.shiftKey; - const ctrlAltCombo = Utils.cmdOrCtrlPressed(e, true) && e.altKey; - const shiftAltCombo = !Utils.cmdOrCtrlPressed(e) && e.shiftKey && e.altKey; + const ctrlKeyCombo = Keyboard.cmdOrCtrlPressed(e) && !e.altKey && !e.shiftKey; + const ctrlAltCombo = Keyboard.cmdOrCtrlPressed(e, true) && e.altKey; + const shiftAltCombo = !Keyboard.cmdOrCtrlPressed(e) && e.shiftKey && e.altKey; // listen for line break key combo and insert new line character if (Utils.isUnhandledLineBreakKeyCombo(e)) { @@ -1155,7 +1155,7 @@ class AdvancedCreatePost extends React.PureComponent { const {message} = this.state; - if (Utils.isKeyPressed(e, KeyCodes.ESCAPE)) { + if (Keyboard.isKeyPressed(e, KeyCodes.ESCAPE)) { this.textboxRef.current?.blur(); } @@ -1164,7 +1164,7 @@ class AdvancedCreatePost extends React.PureComponent { !e.metaKey && !e.altKey && !e.shiftKey && - Utils.isKeyPressed(e, KeyCodes.UP) && + Keyboard.isKeyPressed(e, KeyCodes.UP) && message === '' ) { e.preventDefault(); @@ -1182,15 +1182,15 @@ class AdvancedCreatePost extends React.PureComponent { } = e.target as TextboxElement; if (ctrlKeyCombo) { - if (draftMessageIsEmpty && Utils.isKeyPressed(e, KeyCodes.UP)) { + if (draftMessageIsEmpty && Keyboard.isKeyPressed(e, KeyCodes.UP)) { e.stopPropagation(); e.preventDefault(); this.loadPrevMessage(e); - } else if (draftMessageIsEmpty && Utils.isKeyPressed(e, KeyCodes.DOWN)) { + } else if (draftMessageIsEmpty && Keyboard.isKeyPressed(e, KeyCodes.DOWN)) { e.stopPropagation(); e.preventDefault(); this.loadNextMessage(e); - } else if (Utils.isKeyPressed(e, KeyCodes.B)) { + } else if (Keyboard.isKeyPressed(e, KeyCodes.B)) { e.stopPropagation(); e.preventDefault(); this.applyMarkdown({ @@ -1199,7 +1199,7 @@ class AdvancedCreatePost extends React.PureComponent { selectionEnd, message: value, }); - } else if (Utils.isKeyPressed(e, KeyCodes.I)) { + } else if (Keyboard.isKeyPressed(e, KeyCodes.I)) { e.stopPropagation(); e.preventDefault(); this.applyMarkdown({ @@ -1210,7 +1210,7 @@ class AdvancedCreatePost extends React.PureComponent { }); } } else if (ctrlAltCombo) { - if (Utils.isKeyPressed(e, KeyCodes.K)) { + if (Keyboard.isKeyPressed(e, KeyCodes.K)) { e.stopPropagation(); e.preventDefault(); this.applyMarkdown({ @@ -1219,7 +1219,7 @@ class AdvancedCreatePost extends React.PureComponent { selectionEnd, message: value, }); - } else if (Utils.isKeyPressed(e, KeyCodes.C)) { + } else if (Keyboard.isKeyPressed(e, KeyCodes.C)) { e.stopPropagation(); e.preventDefault(); this.applyMarkdown({ @@ -1228,21 +1228,21 @@ class AdvancedCreatePost extends React.PureComponent { selectionEnd, message: value, }); - } else if (Utils.isKeyPressed(e, KeyCodes.E)) { + } else if (Keyboard.isKeyPressed(e, KeyCodes.E)) { e.stopPropagation(); e.preventDefault(); this.toggleEmojiPicker(); - } else if (Utils.isKeyPressed(e, KeyCodes.T)) { + } else if (Keyboard.isKeyPressed(e, KeyCodes.T)) { e.stopPropagation(); e.preventDefault(); this.toggleAdvanceTextEditor(); - } else if (Utils.isKeyPressed(e, KeyCodes.P) && message.length) { + } else if (Keyboard.isKeyPressed(e, KeyCodes.P) && message.length) { e.stopPropagation(); e.preventDefault(); this.setShowPreview(!this.props.shouldShowPreview); } } else if (shiftAltCombo) { - if (Utils.isKeyPressed(e, KeyCodes.X)) { + if (Keyboard.isKeyPressed(e, KeyCodes.X)) { e.stopPropagation(); e.preventDefault(); this.applyMarkdown({ @@ -1251,7 +1251,7 @@ class AdvancedCreatePost extends React.PureComponent { selectionEnd, message: value, }); - } else if (Utils.isKeyPressed(e, KeyCodes.SEVEN)) { + } else if (Keyboard.isKeyPressed(e, KeyCodes.SEVEN)) { e.preventDefault(); this.applyMarkdown({ markdownMode: 'ol', @@ -1259,7 +1259,7 @@ class AdvancedCreatePost extends React.PureComponent { selectionEnd, message: value, }); - } else if (Utils.isKeyPressed(e, KeyCodes.EIGHT)) { + } else if (Keyboard.isKeyPressed(e, KeyCodes.EIGHT)) { e.preventDefault(); this.applyMarkdown({ markdownMode: 'ul', @@ -1267,7 +1267,7 @@ class AdvancedCreatePost extends React.PureComponent { selectionEnd, message: value, }); - } else if (Utils.isKeyPressed(e, KeyCodes.NINE)) { + } else if (Keyboard.isKeyPressed(e, KeyCodes.NINE)) { e.preventDefault(); this.applyMarkdown({ markdownMode: 'quote', @@ -1277,21 +1277,21 @@ class AdvancedCreatePost extends React.PureComponent { }); } } - const upKeyOnly = !ctrlOrMetaKeyPressed && !e.altKey && !e.shiftKey && Utils.isKeyPressed(e, KeyCodes.UP); - const shiftUpKeyCombo = !ctrlOrMetaKeyPressed && !e.altKey && e.shiftKey && Utils.isKeyPressed(e, KeyCodes.UP); - const ctrlShiftCombo = Utils.cmdOrCtrlPressed(e, true) && e.shiftKey; + const upKeyOnly = !ctrlOrMetaKeyPressed && !e.altKey && !e.shiftKey && Keyboard.isKeyPressed(e, KeyCodes.UP); + const shiftUpKeyCombo = !ctrlOrMetaKeyPressed && !e.altKey && e.shiftKey && Keyboard.isKeyPressed(e, KeyCodes.UP); + const ctrlShiftCombo = Keyboard.cmdOrCtrlPressed(e, true) && e.shiftKey; if (upKeyOnly && messageIsEmpty) { this.editLastPost(e); } else if (shiftUpKeyCombo && messageIsEmpty) { this.replyToLastPost(e); - } else if (ctrlShiftCombo && Utils.isKeyPressed(e, KeyCodes.E)) { + } else if (ctrlShiftCombo && Keyboard.isKeyPressed(e, KeyCodes.E)) { e.stopPropagation(); e.preventDefault(); this.toggleEmojiPicker(); - } else if (((isMac() && ctrlShiftCombo) || (!isMac() && ctrlAltCombo)) && Utils.isKeyPressed(e, KeyCodes.P) && this.state.message.length) { + } else if (((UserAgent.isMac() && ctrlShiftCombo) || (!UserAgent.isMac() && ctrlAltCombo)) && Keyboard.isKeyPressed(e, KeyCodes.P) && this.state.message.length) { this.setShowPreview(!this.props.shouldShowPreview); - } else if (ctrlAltCombo && Utils.isKeyPressed(e, KeyCodes.T)) { + } else if (ctrlAltCombo && Keyboard.isKeyPressed(e, KeyCodes.T)) { this.toggleAdvanceTextEditor(); } }; diff --git a/webapp/channels/src/components/alert_banner.tsx b/webapp/channels/src/components/alert_banner.tsx index ebd3adaae8..b091a555ec 100644 --- a/webapp/channels/src/components/alert_banner.tsx +++ b/webapp/channels/src/components/alert_banner.tsx @@ -21,6 +21,7 @@ import './alert_banner.scss'; export type ModeType = 'danger' | 'warning' | 'info' | 'success'; export type AlertBannerProps = { + id?: string; mode: ModeType; title?: React.ReactNode; message?: React.ReactNode; @@ -35,6 +36,7 @@ export type AlertBannerProps = { } const AlertBanner = ({ + id, mode, title, message, @@ -70,6 +72,7 @@ const AlertBanner = ({ return (
{ let cloudDelinquencyAnnouncementBar = null; let notifyAdminDowngradeDelinquencyBar = null; let toYearlyNudgeBannerDismissable = null; + let toPaidPlanNudgeBannerDismissable = null; if (this.props.license?.Cloud === 'true') { paymentAnnouncementBar = ( @@ -89,6 +91,7 @@ class AnnouncementBarController extends React.PureComponent { ); toYearlyNudgeBannerDismissable = (); + toPaidPlanNudgeBannerDismissable = (); } let autoStartTrialModal = null; @@ -108,6 +111,7 @@ class AnnouncementBarController extends React.PureComponent { {cloudDelinquencyAnnouncementBar} {notifyAdminDowngradeDelinquencyBar} {toYearlyNudgeBannerDismissable} + {toPaidPlanNudgeBannerDismissable} {this.props.license?.Cloud !== 'true' && } {autoStartTrialModal} diff --git a/webapp/channels/src/components/announcement_bar/cloud_trial_announcement_bar/cloud_trial_announcement_bar.tsx b/webapp/channels/src/components/announcement_bar/cloud_trial_announcement_bar/cloud_trial_announcement_bar.tsx index e9fcd6ba46..8224463d43 100644 --- a/webapp/channels/src/components/announcement_bar/cloud_trial_announcement_bar/cloud_trial_announcement_bar.tsx +++ b/webapp/channels/src/components/announcement_bar/cloud_trial_announcement_bar/cloud_trial_announcement_bar.tsx @@ -18,6 +18,8 @@ import PricingModal from 'components/pricing_modal'; import {ModalData} from 'types/actions'; +import {AlertCircleOutlineIcon, AlertOutlineIcon} from '@mattermost/compass-icons/components'; + import { Preferences, CloudBanners, @@ -38,6 +40,7 @@ type Props = { daysLeftOnTrial: number; isCloud: boolean; subscription?: Subscription; + reverseTrial: boolean; actions: { savePreferences: (userId: string, preferences: PreferenceType[]) => void; getCloudSubscription: () => void; @@ -132,7 +135,7 @@ class CloudTrialAnnouncementBar extends React.PureComponent { return null; } - const trialMoreThan3DaysMsg = ( + let trialMoreThan7DaysMsg = ( { /> ); - const trialLessThan3DaysMsg = ( + let modalButtonText = t('admin.billing.subscription.cloudTrial.subscribeButton'); + let modalButtonDefaultText = 'Upgrade Now'; + + if (this.props.reverseTrial) { + modalButtonText = t('admin.billing.subscription.cloudReverseTrial.subscribeButton'); + modalButtonDefaultText = 'Review your options'; + } + + if (this.props.reverseTrial) { + const trialEnd = getLocaleDateFromUTC((this.props.subscription?.trial_end_at as number / 1000), 'MMMM Do'); + trialMoreThan7DaysMsg = ( + + ); + } + + let trialLessThan7DaysMsg = ( { /> ); - const userEndTrialDate = getLocaleDateFromUTC((this.props.subscription?.trial_end_at as number / 1000), 'MMMM Do YYYY'); - const userEndTrialHour = getLocaleDateFromUTC((this.props.subscription?.trial_end_at as number / 1000), 'HH:mm:ss', this.props.currentUser.timezone?.automaticTimezone as string); + if (this.props.reverseTrial) { + trialLessThan7DaysMsg = ( + + ); + } - const trialLastDaysMsg = ( + const userEndTrialDate = getLocaleDateFromUTC((this.props.subscription?.trial_end_at as number / 1000), 'MMMM Do YYYY'); + const userEndTrialHour = getLocaleDateFromUTC((this.props.subscription?.trial_end_at as number / 1000), 'HH:mm', this.props.currentUser.timezone?.automaticTimezone as string); + + let trialLastDaysMsg = ( { /> ); + if (this.props.reverseTrial) { + trialLastDaysMsg = ( + + ); + } + let bannerMessage; let icon; - switch (daysLeftOnTrial) { - case TrialPeriodDays.TRIAL_WARNING_THRESHOLD: - case TrialPeriodDays.TRIAL_2_DAYS: - bannerMessage = trialLessThan3DaysMsg; - break; - case TrialPeriodDays.TRIAL_1_DAY: - case TrialPeriodDays.TRIAL_0_DAYS: + + if (daysLeftOnTrial >= TrialPeriodDays.TRIAL_2_DAYS && daysLeftOnTrial <= TrialPeriodDays.TRIAL_WARNING_THRESHOLD) { + bannerMessage = trialLessThan7DaysMsg; + icon = ; + } else if (daysLeftOnTrial <= TrialPeriodDays.TRIAL_1_DAY && daysLeftOnTrial >= TrialPeriodDays.TRIAL_0_DAYS) { bannerMessage = trialLastDaysMsg; - break; - default: - bannerMessage = trialMoreThan3DaysMsg; - icon = ; - break; + icon = ; + } else { + bannerMessage = trialMoreThan7DaysMsg; + icon = ; } const dismissable = this.isDismissable(); @@ -184,8 +223,8 @@ class CloudTrialAnnouncementBar extends React.PureComponent { showCloseButton={dismissable} handleClose={this.handleClose} onButtonClick={this.showModal} - modalButtonText={t('admin.billing.subscription.cloudTrial.subscribeButton')} - modalButtonDefaultText={'Upgrade Now'} + modalButtonText={modalButtonText} + modalButtonDefaultText={modalButtonDefaultText} message={bannerMessage} showLinkAsButton={true} icon={icon} diff --git a/webapp/channels/src/components/announcement_bar/cloud_trial_announcement_bar/index.ts b/webapp/channels/src/components/announcement_bar/cloud_trial_announcement_bar/index.ts index 9b6bbfc443..3d7e4fd871 100644 --- a/webapp/channels/src/components/announcement_bar/cloud_trial_announcement_bar/index.ts +++ b/webapp/channels/src/components/announcement_bar/cloud_trial_announcement_bar/index.ts @@ -21,6 +21,7 @@ import {Preferences, TrialPeriodDays} from 'utils/constants'; import {getRemainingDaysFromFutureTimestamp} from 'utils/utils'; import CloudTrialAnnouncementBar from './cloud_trial_announcement_bar'; +import {getConfig} from 'mattermost-redux/selectors/entities/admin'; function mapStateToProps(state: GlobalState) { const getCategory = makeGetCategory(); @@ -29,6 +30,7 @@ function mapStateToProps(state: GlobalState) { const isCloud = getLicense(state).Cloud === 'true'; let isFreeTrial = false; let daysLeftOnTrial = 0; + const config = getConfig(state); if (isCloud && subscription?.is_free_trial === 'true') { isFreeTrial = true; @@ -46,6 +48,7 @@ function mapStateToProps(state: GlobalState) { isCloud, subscription, preferences: getCategory(state, Preferences.CLOUD_TRIAL_BANNER), + reverseTrial: Boolean(config.FeatureFlags?.CloudReverseTrial), }; } diff --git a/webapp/channels/src/components/announcement_bar/configuration_bar/configuration_bar.tsx b/webapp/channels/src/components/announcement_bar/configuration_bar/configuration_bar.tsx index b6a0a0b572..5c8ef4c5f1 100644 --- a/webapp/channels/src/components/announcement_bar/configuration_bar/configuration_bar.tsx +++ b/webapp/channels/src/components/announcement_bar/configuration_bar/configuration_bar.tsx @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import React from 'react'; +import React, {ReactNode} from 'react'; import {FormattedMessage, injectIntl, IntlShape} from 'react-intl'; import {Link} from 'react-router-dom'; @@ -395,7 +395,7 @@ const ConfigurationAnnouncementBar = (props: Props) => { defaultMessage = 'Please configure your site URL on the System Console.'; } - const values = { + const values: Record = { linkSite: (msg: string) => ( { style={barStyle} // eslint-disable-next-line react/no-unknown-property css={{gridArea: 'announcement'}} + data-testid={this.props.id} > { const {formatMessage} = useIntl(); @@ -48,10 +46,7 @@ const AppBarMarketplace = () => { aria-label={label} onClick={handleOpenMarketplace} > - + ); diff --git a/webapp/channels/src/components/at_mention/at_mention.tsx b/webapp/channels/src/components/at_mention/at_mention.tsx index 4bb914369f..e8e51ca423 100644 --- a/webapp/channels/src/components/at_mention/at_mention.tsx +++ b/webapp/channels/src/components/at_mention/at_mention.tsx @@ -12,9 +12,10 @@ import {Group} from '@mattermost/types/groups'; import ProfilePopover from 'components/profile_popover'; import {popOverOverlayPosition} from 'utils/position_utils'; +import {isKeyPressed} from 'utils/keyboard'; import {getUserOrGroupFromMentionName} from 'utils/post_utils'; import Constants from 'utils/constants'; -import {getViewportSize, isKeyPressed} from 'utils/utils'; +import {getViewportSize} from 'utils/utils'; import AtMentionGroup from 'components/at_mention/at_mention_group'; diff --git a/webapp/channels/src/components/at_mention/at_mention_group.tsx b/webapp/channels/src/components/at_mention/at_mention_group.tsx index aaa449eef9..fa1fd3abd5 100644 --- a/webapp/channels/src/components/at_mention/at_mention_group.tsx +++ b/webapp/channels/src/components/at_mention/at_mention_group.tsx @@ -12,8 +12,9 @@ import ProfilePopover from 'components/profile_popover'; import UserGroupPopover from 'components/user_group_popover'; import Constants, {A11yCustomEventTypes, A11yFocusEventDetail} from 'utils/constants'; +import {isKeyPressed} from 'utils/keyboard'; import {popOverOverlayPosition} from 'utils/position_utils'; -import {getViewportSize, isKeyPressed} from 'utils/utils'; +import {getViewportSize} from 'utils/utils'; import {MAX_LIST_HEIGHT, getListHeight, VIEWPORT_SCALE_FACTOR} from 'components/user_group_popover/group_member_list/group_member_list'; diff --git a/webapp/channels/src/components/channel_members_rhs/action_bar.tsx b/webapp/channels/src/components/channel_members_rhs/action_bar.tsx index 90d08d9064..44e4d80796 100644 --- a/webapp/channels/src/components/channel_members_rhs/action_bar.tsx +++ b/webapp/channels/src/components/channel_members_rhs/action_bar.tsx @@ -6,7 +6,7 @@ import {FormattedMessage} from 'react-intl'; import styled from 'styled-components'; import Constants from 'utils/constants'; -import {isKeyPressed} from 'utils/utils'; +import {isKeyPressed} from 'utils/keyboard'; const Title = styled.div` flex:1; diff --git a/webapp/channels/src/components/cloud_subscribe_result_modal/__snapshots__/error.test.tsx.snap b/webapp/channels/src/components/cloud_subscribe_result_modal/__snapshots__/error.test.tsx.snap index acaf5d5d19..11d2ecaa22 100644 --- a/webapp/channels/src/components/cloud_subscribe_result_modal/__snapshots__/error.test.tsx.snap +++ b/webapp/channels/src/components/cloud_subscribe_result_modal/__snapshots__/error.test.tsx.snap @@ -29,9 +29,11 @@ exports[`components/pricing_modal/downgrade_team_removal_modal matches snapshot forwardedRef={null} intl={ Object { + "$t": [Function], "defaultFormats": Object {}, "defaultLocale": "en", "defaultRichTextElements": undefined, + "fallbackOnEmptyString": true, "formatDate": [Function], "formatDateTimeRange": [Function], "formatDateToParts": [Function], @@ -58,6 +60,7 @@ exports[`components/pricing_modal/downgrade_team_removal_modal matches snapshot "locale": "en", "messages": Object {}, "onError": [Function], + "onWarn": [Function], "textComponent": "span", "timeZone": "Etc/UTC", "wrapRichTextChunksInFragment": undefined, diff --git a/webapp/channels/src/components/cloud_subscribe_result_modal/__snapshots__/success.test.tsx.snap b/webapp/channels/src/components/cloud_subscribe_result_modal/__snapshots__/success.test.tsx.snap index 10328e6da5..42691638be 100644 --- a/webapp/channels/src/components/cloud_subscribe_result_modal/__snapshots__/success.test.tsx.snap +++ b/webapp/channels/src/components/cloud_subscribe_result_modal/__snapshots__/success.test.tsx.snap @@ -29,9 +29,11 @@ exports[`components/pricing_modal/downgrade_team_removal_modal matches snapshot forwardedRef={null} intl={ Object { + "$t": [Function], "defaultFormats": Object {}, "defaultLocale": "en", "defaultRichTextElements": undefined, + "fallbackOnEmptyString": true, "formatDate": [Function], "formatDateTimeRange": [Function], "formatDateToParts": [Function], @@ -58,6 +60,7 @@ exports[`components/pricing_modal/downgrade_team_removal_modal matches snapshot "locale": "en", "messages": Object {}, "onError": [Function], + "onWarn": [Function], "textComponent": "span", "timeZone": "Etc/UTC", "wrapRichTextChunksInFragment": undefined, diff --git a/webapp/channels/src/components/code_block/__snapshots__/code_block.test.tsx.snap b/webapp/channels/src/components/code_block/__snapshots__/code_block.test.tsx.snap index ad8a1dc2ce..5dd6346344 100644 --- a/webapp/channels/src/components/code_block/__snapshots__/code_block.test.tsx.snap +++ b/webapp/channels/src/components/code_block/__snapshots__/code_block.test.tsx.snap @@ -4,10 +4,12 @@ exports[`codeBlock should render html code block with proper indentation after s { id="copyButton" intl={ Object { + "$t": [Function], "defaultFormats": Object {}, "defaultLocale": "en", "defaultRichTextElements": undefined, + "fallbackOnEmptyString": true, "formatDate": [Function], "formatDateTimeRange": [Function], "formatDateToParts": [Function], @@ -321,6 +330,7 @@ const myFunction = () => { "locale": "en", "messages": Object {}, "onError": [Function], + "onWarn": [Function], "textComponent": Symbol(react.fragment), "timeZone": undefined, "wrapRichTextChunksInFragment": undefined, @@ -452,10 +462,12 @@ exports[`codeBlock should render unknown language after syntax highlighting 1`] { const isShiftKeyPressed = e.shiftKey; switch (true) { - case Utils.isKeyPressed(e, Constants.KeyCodes.R): + case Keyboard.isKeyPressed(e, Constants.KeyCodes.R): this.handleCommentClick(e); this.handleDropdownOpened(false); break; // edit post - case Utils.isKeyPressed(e, Constants.KeyCodes.E): + case Keyboard.isKeyPressed(e, Constants.KeyCodes.E): this.handleEditMenuItemActivated(e); this.handleDropdownOpened(false); break; // follow thread - case Utils.isKeyPressed(e, Constants.KeyCodes.F) && !isShiftKeyPressed: + case Keyboard.isKeyPressed(e, Constants.KeyCodes.F) && !isShiftKeyPressed: this.handleSetThreadFollow(e); this.handleDropdownOpened(false); break; // forward post - case Utils.isKeyPressed(e, Constants.KeyCodes.F) && isShiftKeyPressed: + case Keyboard.isKeyPressed(e, Constants.KeyCodes.F) && isShiftKeyPressed: this.handleForwardMenuItemActivated(e); this.handleDropdownOpened(false); break; // copy link - case Utils.isKeyPressed(e, Constants.KeyCodes.K): + case Keyboard.isKeyPressed(e, Constants.KeyCodes.K): this.copyLink(e); this.handleDropdownOpened(false); break; // copy text - case Utils.isKeyPressed(e, Constants.KeyCodes.C): + case Keyboard.isKeyPressed(e, Constants.KeyCodes.C): this.copyText(e); this.handleDropdownOpened(false); break; // delete post - case Utils.isKeyPressed(e, Constants.KeyCodes.DELETE): + case Keyboard.isKeyPressed(e, Constants.KeyCodes.DELETE): this.handleDeleteMenuItemActivated(e); this.handleDropdownOpened(false); break; // pin / unpin - case Utils.isKeyPressed(e, Constants.KeyCodes.P): + case Keyboard.isKeyPressed(e, Constants.KeyCodes.P): this.handlePinMenuItemActivated(e); this.handleDropdownOpened(false); break; // save / unsave - case Utils.isKeyPressed(e, Constants.KeyCodes.S): + case Keyboard.isKeyPressed(e, Constants.KeyCodes.S): this.handleFlagMenuItemActivated(e); this.handleDropdownOpened(false); break; // mark as unread - case Utils.isKeyPressed(e, Constants.KeyCodes.U): + case Keyboard.isKeyPressed(e, Constants.KeyCodes.U): this.handleMarkPostAsUnread(e); this.handleDropdownOpened(false); break; diff --git a/webapp/channels/src/components/drafts/channel_draft/index.ts b/webapp/channels/src/components/drafts/channel_draft/index.ts index e34d66c351..b3722f1cdf 100644 --- a/webapp/channels/src/components/drafts/channel_draft/index.ts +++ b/webapp/channels/src/components/drafts/channel_draft/index.ts @@ -6,7 +6,7 @@ import {connect} from 'react-redux'; import {makeGetChannel} from 'mattermost-redux/selectors/entities/channels'; import {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams'; -import {getChannelURL} from 'utils/utils'; +import {getChannelURL} from 'selectors/urls'; import {GlobalState} from 'types/store'; diff --git a/webapp/channels/src/components/drafts/panel/__snapshots__/panel_body.test.tsx.snap b/webapp/channels/src/components/drafts/panel/__snapshots__/panel_body.test.tsx.snap index 3026f7a40e..b173fc6031 100644 --- a/webapp/channels/src/components/drafts/panel/__snapshots__/panel_body.test.tsx.snap +++ b/webapp/channels/src/components/drafts/panel/__snapshots__/panel_body.test.tsx.snap @@ -73,9 +73,11 @@ exports[`components/drafts/panel/panel_body should have called handleFormattedTe hide={[Function]} intl={ Object { + "$t": [Function], "defaultFormats": Object {}, "defaultLocale": "en", "defaultRichTextElements": undefined, + "fallbackOnEmptyString": true, "formatDate": [Function], "formatDateTimeRange": [Function], "formatDateToParts": [Function], @@ -102,6 +104,7 @@ exports[`components/drafts/panel/panel_body should have called handleFormattedTe "locale": "en", "messages": Object {}, "onError": [Function], + "onWarn": [Function], "textComponent": "span", "timeZone": "Etc/UTC", "wrapRichTextChunksInFragment": undefined, @@ -351,9 +354,11 @@ exports[`components/drafts/panel/panel_body should match snapshot 1`] = ` hide={[Function]} intl={ Object { + "$t": [Function], "defaultFormats": Object {}, "defaultLocale": "en", "defaultRichTextElements": undefined, + "fallbackOnEmptyString": true, "formatDate": [Function], "formatDateTimeRange": [Function], "formatDateToParts": [Function], @@ -380,6 +385,7 @@ exports[`components/drafts/panel/panel_body should match snapshot 1`] = ` "locale": "en", "messages": Object {}, "onError": [Function], + "onWarn": [Function], "textComponent": "span", "timeZone": "Etc/UTC", "wrapRichTextChunksInFragment": undefined, @@ -635,9 +641,11 @@ exports[`components/drafts/panel/panel_body should match snapshot for priority 1 hide={[Function]} intl={ Object { + "$t": [Function], "defaultFormats": Object {}, "defaultLocale": "en", "defaultRichTextElements": undefined, + "fallbackOnEmptyString": true, "formatDate": [Function], "formatDateTimeRange": [Function], "formatDateToParts": [Function], @@ -664,6 +672,7 @@ exports[`components/drafts/panel/panel_body should match snapshot for priority 1 "locale": "en", "messages": Object {}, "onError": [Function], + "onWarn": [Function], "textComponent": "span", "timeZone": "Etc/UTC", "wrapRichTextChunksInFragment": undefined, @@ -989,9 +998,11 @@ exports[`components/drafts/panel/panel_body should match snapshot for requested_ hide={[Function]} intl={ Object { + "$t": [Function], "defaultFormats": Object {}, "defaultLocale": "en", "defaultRichTextElements": undefined, + "fallbackOnEmptyString": true, "formatDate": [Function], "formatDateTimeRange": [Function], "formatDateToParts": [Function], @@ -1018,6 +1029,7 @@ exports[`components/drafts/panel/panel_body should match snapshot for requested_ "locale": "en", "messages": Object {}, "onError": [Function], + "onWarn": [Function], "textComponent": "span", "timeZone": "Etc/UTC", "wrapRichTextChunksInFragment": undefined, diff --git a/webapp/channels/src/components/edit_channel_header_modal/edit_channel_header_modal.tsx b/webapp/channels/src/components/edit_channel_header_modal/edit_channel_header_modal.tsx index c61e3a48db..655084b44c 100644 --- a/webapp/channels/src/components/edit_channel_header_modal/edit_channel_header_modal.tsx +++ b/webapp/channels/src/components/edit_channel_header_modal/edit_channel_header_modal.tsx @@ -13,8 +13,9 @@ import Textbox, {TextboxElement} from 'components/textbox'; import TextboxClass from 'components/textbox/textbox'; import TextboxLinks from 'components/textbox/textbox_links'; import Constants from 'utils/constants'; +import {isKeyPressed} from 'utils/keyboard'; import {isMobile} from 'utils/user_agent'; -import {insertLineBreakFromKeyEvent, isKeyPressed, isUnhandledLineBreakKeyCombo, localizeMessage} from 'utils/utils'; +import {insertLineBreakFromKeyEvent, isUnhandledLineBreakKeyCombo, localizeMessage} from 'utils/utils'; const KeyCodes = Constants.KeyCodes; diff --git a/webapp/channels/src/components/edit_channel_purpose_modal/edit_channel_purpose_modal.tsx b/webapp/channels/src/components/edit_channel_purpose_modal/edit_channel_purpose_modal.tsx index 0f932581e0..e7fbc1abd6 100644 --- a/webapp/channels/src/components/edit_channel_purpose_modal/edit_channel_purpose_modal.tsx +++ b/webapp/channels/src/components/edit_channel_purpose_modal/edit_channel_purpose_modal.tsx @@ -9,6 +9,7 @@ import {Channel} from '@mattermost/types/channels'; import {ActionResult} from 'mattermost-redux/types/actions'; import Constants from 'utils/constants'; +import * as Keyboard from 'utils/keyboard'; import * as Utils from 'utils/utils'; type Actions = { @@ -68,10 +69,10 @@ export class EditChannelPurposeModal extends React.PureComponent { if (Utils.isUnhandledLineBreakKeyCombo(e)) { e.preventDefault(); this.setState({purpose: Utils.insertLineBreakFromKeyEvent(e as React.KeyboardEvent)}); - } else if (ctrlSend && Utils.isKeyPressed(e, Constants.KeyCodes.ENTER) && e.ctrlKey) { + } else if (ctrlSend && Keyboard.isKeyPressed(e, Constants.KeyCodes.ENTER) && e.ctrlKey) { e.preventDefault(); this.handleSave(); - } else if (!ctrlSend && Utils.isKeyPressed(e, Constants.KeyCodes.ENTER) && !e.shiftKey && !e.altKey) { + } else if (!ctrlSend && Keyboard.isKeyPressed(e, Constants.KeyCodes.ENTER) && !e.shiftKey && !e.altKey) { e.preventDefault(); this.handleSave(); } diff --git a/webapp/channels/src/components/edit_post/edit_post.tsx b/webapp/channels/src/components/edit_post/edit_post.tsx index 9a467ebbbf..81c9ea4667 100644 --- a/webapp/channels/src/components/edit_post/edit_post.tsx +++ b/webapp/channels/src/components/edit_post/edit_post.tsx @@ -10,6 +10,7 @@ import {Post} from '@mattermost/types/posts'; import {Emoji, SystemEmoji} from '@mattermost/types/emojis'; import {AppEvents, Constants, ModalIdentifiers, StoragePrefixes} from 'utils/constants'; +import * as Keyboard from 'utils/keyboard'; import { formatGithubCodePaste, formatMarkdownMessage, @@ -220,7 +221,13 @@ const EditPost = ({editingPost, actions, canEditPost, config, channelId, draft, actions.unsetEditingPost(); }; - const handleAutomatedRefocusAndExit = () => handleRefocusAndExit(editingPost.refocusId || null); + const handleAutomatedRefocusAndExit = () => { + draftRef.current = { + ...draftRef.current, + message: '', + }; + handleRefocusAndExit(editingPost.refocusId || null); + }; const handleEdit = async () => { if (!editingPost.post || isSaveDisabled()) { @@ -302,13 +309,13 @@ const EditPost = ({editingPost, actions, canEditPost, config, channelId, draft, const {ctrlSend, codeBlockOnCtrlEnter} = rest; const ctrlOrMetaKeyPressed = e.ctrlKey || e.metaKey; - const ctrlKeyCombo = Utils.cmdOrCtrlPressed(e) && !e.altKey && !e.shiftKey; - const ctrlAltCombo = Utils.cmdOrCtrlPressed(e, true) && e.altKey; + const ctrlKeyCombo = Keyboard.cmdOrCtrlPressed(e) && !e.altKey && !e.shiftKey; + const ctrlAltCombo = Keyboard.cmdOrCtrlPressed(e, true) && e.altKey; const ctrlEnterKeyCombo = (ctrlSend || codeBlockOnCtrlEnter) && - Utils.isKeyPressed(e, KeyCodes.ENTER) && + Keyboard.isKeyPressed(e, KeyCodes.ENTER) && ctrlOrMetaKeyPressed; - const markdownLinkKey = Utils.isKeyPressed(e, KeyCodes.K); + const markdownLinkKey = Keyboard.isKeyPressed(e, KeyCodes.K); // listen for line break key combo and insert new line character if (Utils.isUnhandledLineBreakKeyCombo(e)) { @@ -316,7 +323,7 @@ const EditPost = ({editingPost, actions, canEditPost, config, channelId, draft, setEditText(Utils.insertLineBreakFromKeyEvent(e as React.KeyboardEvent)); } else if (ctrlEnterKeyCombo) { handleEdit(); - } else if (Utils.isKeyPressed(e, KeyCodes.ESCAPE) && !showEmojiPicker) { + } else if (Keyboard.isKeyPressed(e, KeyCodes.ESCAPE) && !showEmojiPicker) { handleAutomatedRefocusAndExit(); } else if (ctrlAltCombo && markdownLinkKey) { applyHotkeyMarkdown({ @@ -325,14 +332,14 @@ const EditPost = ({editingPost, actions, canEditPost, config, channelId, draft, selectionEnd: e.currentTarget.selectionEnd, message: e.currentTarget.value, }); - } else if (ctrlKeyCombo && Utils.isKeyPressed(e, KeyCodes.B)) { + } else if (ctrlKeyCombo && Keyboard.isKeyPressed(e, KeyCodes.B)) { applyHotkeyMarkdown({ markdownMode: 'bold', selectionStart: e.currentTarget.selectionStart, selectionEnd: e.currentTarget.selectionEnd, message: e.currentTarget.value, }); - } else if (ctrlKeyCombo && Utils.isKeyPressed(e, KeyCodes.I)) { + } else if (ctrlKeyCombo && Keyboard.isKeyPressed(e, KeyCodes.I)) { applyHotkeyMarkdown({ markdownMode: 'italic', selectionStart: e.currentTarget.selectionStart, diff --git a/webapp/channels/src/components/edit_post/edit_post_footer.tsx b/webapp/channels/src/components/edit_post/edit_post_footer.tsx index 12971eb2cc..432c27eebe 100644 --- a/webapp/channels/src/components/edit_post/edit_post_footer.tsx +++ b/webapp/channels/src/components/edit_post/edit_post_footer.tsx @@ -8,7 +8,7 @@ import {FormattedMessage} from 'react-intl'; import {getBool} from 'mattermost-redux/selectors/entities/preferences'; import {Preferences} from 'mattermost-redux/constants'; -import {isMac} from 'utils/utils'; +import {isMac} from 'utils/user_agent'; import {GlobalState} from 'types/store'; type Props = { diff --git a/webapp/channels/src/components/feedback_modal/downgrade_feedback.tsx b/webapp/channels/src/components/feedback_modal/downgrade_feedback.tsx index 65174c147f..9b0fa90739 100644 --- a/webapp/channels/src/components/feedback_modal/downgrade_feedback.tsx +++ b/webapp/channels/src/components/feedback_modal/downgrade_feedback.tsx @@ -6,7 +6,7 @@ import React from 'react'; import {injectIntl, WrappedComponentProps} from 'react-intl'; import {Feedback} from '@mattermost/types/cloud'; -import FeedbackModal from 'components/feedback_modal/feedback'; +import FeedbackModal, {FeedbackOption} from 'components/feedback_modal/feedback'; type Props = { onSubmit: (downgradeFeedback: Feedback) => void; @@ -28,23 +28,35 @@ const DowngradeFeedbackModal = (props: Props) => { defaultMessage: 'Downgrade', }); - const downgradeFeedbackOptions = [ - props.intl.formatMessage({ - id: 'feedback.downgradeWorkspace.technicalIssues', - defaultMessage: 'Experienced technical issues', - }), - props.intl.formatMessage({ - id: 'feedback.downgradeWorkspace.noLongerNeeded', - defaultMessage: 'No longer need Cloud Professional features', - }), - props.intl.formatMessage({ - id: 'feedback.downgradeWorkspace.exploringOptions', - defaultMessage: 'Exploring other solutions', - }), - props.intl.formatMessage({ - id: 'feedback.downgradeWorkspace.tooExpensive', - defaultMessage: 'Too expensive', - }), + const downgradeFeedbackOptions: FeedbackOption[] = [ + { + translatedMessage: props.intl.formatMessage({ + id: 'feedback.downgradeWorkspace.technicalIssues', + defaultMessage: 'Experienced technical issues', + }), + submissionValue: 'Experienced technical issues', + }, + { + translatedMessage: props.intl.formatMessage({ + id: 'feedback.downgradeWorkspace.noLongerNeeded', + defaultMessage: 'No longer need Cloud Professional features', + }), + submissionValue: 'No longer need Cloud Professional features', + }, + { + translatedMessage: props.intl.formatMessage({ + id: 'feedback.downgradeWorkspace.exploringOptions', + defaultMessage: 'Exploring other solutions', + }), + submissionValue: 'Exploring other solutions', + }, + { + translatedMessage: props.intl.formatMessage({ + id: 'feedback.downgradeWorkspace.tooExpensive', + defaultMessage: 'Too expensive', + }), + submissionValue: 'Too expensive', + }, ]; return ( diff --git a/webapp/channels/src/components/feedback_modal/feedback.tsx b/webapp/channels/src/components/feedback_modal/feedback.tsx index af8daaac91..3f612017be 100644 --- a/webapp/channels/src/components/feedback_modal/feedback.tsx +++ b/webapp/channels/src/components/feedback_modal/feedback.tsx @@ -15,18 +15,23 @@ import {ModalIdentifiers} from 'utils/constants'; import './feedback.scss'; +export interface FeedbackOption { + translatedMessage: string; + submissionValue: string; +} + type Props = { onSubmit: (deleteFeedback: Feedback) => void; title: string; submitText: string; - feedbackOptions: string[]; + feedbackOptions: FeedbackOption[]; freeformTextPlaceholder: string; } & WrappedComponentProps function FeedbackModal(props: Props) { const maxFreeFormTextLength = 500; - const optionOther = props.intl.formatMessage({id: 'feedback.other', defaultMessage: 'Other'}); - const feedbackModalOptions: string[] = [ + const optionOther = {translatedMessage: props.intl.formatMessage({id: 'feedback.other', defaultMessage: 'Other'}), submissionValue: 'Other'}; + const feedbackModalOptions: FeedbackOption[] = [ ...props.feedbackOptions, optionOther, ]; @@ -34,9 +39,9 @@ function FeedbackModal(props: Props) { const [reason, setReason] = useState(''); const [comments, setComments] = useState(''); const reasonNotSelected = reason === ''; - const reasonOther = reason === optionOther; + const reasonOther = reason === optionOther.submissionValue; const commentsNotProvided = comments.trim() === ''; - const submitDisabled = reasonNotSelected || (reason === optionOther && commentsNotProvided); + const submitDisabled = reasonNotSelected || (reasonOther && commentsNotProvided); const dispatch = useDispatch(); @@ -71,15 +76,15 @@ function FeedbackModal(props: Props) { testId='FeedbackModalRadioGroup' values={feedbackModalOptions.map((option) => { return { - value: option, - key: option, - testId: option, + value: option.submissionValue, + key: option.translatedMessage, + testId: option.submissionValue, }; })} value={reason} onChange={(e) => setReason(e.target.value)} /> - {reason === optionOther && + {reasonOther && <>