diff --git a/.github/workflows/develop-test.yml b/.github/workflows/develop-test.yml index 4e85f9664..7d54e8eb3 100644 --- a/.github/workflows/develop-test.yml +++ b/.github/workflows/develop-test.yml @@ -10,11 +10,14 @@ on: jobs: php_unit: - name: php unit test runs-on: ubuntu-latest strategy: matrix: - php: [7.3, 7.4] + # これが先にdevelopにマージされたら 8.0 を追加して 8.0 でおそらく baloon関連のテストでエラーになるので修正する + php-versions: ['7.3', '7.4'] + # これが先にdevelopにマージされたら 5.8.4 不具合修正のブランチ( https://github.com/vektor-inc/vk-blocks-pro/pull/1372 )にマージして '5.8.4' を追加 + wp-versions: ['6.0.1','5.9.3','5.8.4'] + name: PHP Unit test ${{ matrix.php-versions }} / WP ${{ matrix.wp-versions }} Test on ${{ matrix.operating-system }} services: mysql: image: mysql:5.7 @@ -43,11 +46,11 @@ jobs: uses: actions/cache@v2 with: path: vendor - key: ${{ runner.os }}-php${{ matrix.php }}-${{ hashFiles('**/composer.lock') }} - - name: Setup PHP ${{ matrix.php }} + key: ${{ runner.os }}-php${{ matrix.php-versions }}-${{ hashFiles('**/composer.lock') }} + - name: Setup PHP ${{ matrix.php-versions }} uses: shivammathur/setup-php@v2 with: - php-version: ${{ matrix.php }} + php-version: ${{ matrix.php-versions }} - name: install npm scripts run: npm install - name: install Composer Package @@ -57,14 +60,15 @@ jobs: curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar chmod +x wp-cli.phar mv wp-cli.phar /usr/local/bin/wp - + - name: Install several WordPress version by wp-env.override.json + run: WP_ENV_PHP_VERSION=${{ matrix.php-versions }} WP_ENV_CORE=WordPress/WordPress#${{ matrix.wp-versions }} npm run wp-env start --update + - name: Check WordPress Version + run: npm run wp-env run cli wp core version # dist の中で build は実行している - name: Build and Dist run: npm run dist # PHPUnit - - name: Run @wordpress/env - run: npx wp-env start - name: PHP Unit Test run: npm run phpunit diff --git a/inc/vk-blocks/class-vk-blocks-options.php b/inc/vk-blocks/class-vk-blocks-options.php index 27eda8bb2..9b36ba23a 100644 --- a/inc/vk-blocks/class-vk-blocks-options.php +++ b/inc/vk-blocks/class-vk-blocks-options.php @@ -122,7 +122,7 @@ public static function balloon_image_number() { * * @return $balloon_meta_schema */ - public function balloon_meta_schema() { + public static function balloon_meta_schema() { $number = self::balloon_image_number(); $return_array = array(); $return_array['default_icons'] = array( @@ -188,17 +188,9 @@ public static function get_properties( $schema ) { * @return options */ public static function get_balloon_meta_options() { - $options = get_option( 'vk_blocks_balloon_meta' ); - $number = self::balloon_image_number(); - $defaults = array(); - $defaults['default_icons'] = array(); - for ( $i = 1; $i <= $number; $i++ ) { - $defaults['default_icons'][ $i ] = array( - 'name' => null, - 'src' => null, - ); - }; - $options = wp_parse_args( $options, $defaults ); + $options = get_option( 'vk_blocks_balloon_meta' ); + $defaults = self::get_properties( self::balloon_meta_schema() ); + $options = wp_parse_args( $options, $defaults ); return $options; } diff --git a/inc/vk-blocks/load-bootstrap.php b/inc/vk-blocks/load-bootstrap.php index de9f58da3..a3c27b32e 100644 --- a/inc/vk-blocks/load-bootstrap.php +++ b/inc/vk-blocks/load-bootstrap.php @@ -36,11 +36,13 @@ function vk_blocks_load_bootstrap( $hook_suffix ) { * @return void */ function vk_blocks_load_bootstrap_for_site_editor() { - if ( wp_is_block_theme() && is_admin() ) { - $style_path = wp_normalize_path( VK_BLOCKS_DIR_PATH . '/build/bootstrap_vk_using.css' ); - if ( file_exists( $style_path ) ) { - $dynamic_css = file_get_contents( $style_path ); - wp_add_inline_style( 'wp-edit-blocks', $dynamic_css ); + if ( function_exists( 'wp_is_block_theme' ) ) { // Cope with bofore WP5.8. + if ( wp_is_block_theme() && is_admin() ) { + $style_path = wp_normalize_path( VK_BLOCKS_DIR_PATH . '/build/bootstrap_vk_using.css' ); + if ( file_exists( $style_path ) ) { + $dynamic_css = file_get_contents( $style_path ); + wp_add_inline_style( 'wp-edit-blocks', $dynamic_css ); + } } } } diff --git a/package-lock.json b/package-lock.json index 723269106..ac3363166 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2254,9 +2254,9 @@ }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -4459,9 +4459,9 @@ } }, "@wordpress/env": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@wordpress/env/-/env-4.2.2.tgz", - "integrity": "sha512-mv9UIaz8XX/YDK/kn+sijQ3E1totVo0eHxpWyu4fe/WvyyOt4Y450MzU8/f4/LN6W3nuHVxFuuBPn2JbRYoLPw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@wordpress/env/-/env-4.9.0.tgz", + "integrity": "sha512-C2g5aOYxl1Bd9lypvEMjXZ1s1Gx/JHpFWuPlCAI8gAzwzB9jCIZkqpU85GsGScpZLAANS/N7wF3LMY68UkN9fQ==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -4473,7 +4473,7 @@ "js-yaml": "^3.13.1", "ora": "^4.0.2", "rimraf": "^3.0.2", - "simple-git": "^2.35.0", + "simple-git": "^3.5.0", "terminal-link": "^2.0.0", "yargs": "^17.3.0" }, @@ -4594,9 +4594,9 @@ "dev": true }, "yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -4609,9 +4609,9 @@ } }, "yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true } } @@ -7221,9 +7221,9 @@ } }, "cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", + "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", "dev": true }, "cli-table": { @@ -7266,7 +7266,7 @@ "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true }, "clone-buffer": { @@ -8501,7 +8501,7 @@ "defaults": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", "dev": true, "requires": { "clone": "^1.0.2" @@ -10358,7 +10358,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true } } @@ -20881,20 +20881,20 @@ "dev": true }, "simple-git": { - "version": "2.48.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.48.0.tgz", - "integrity": "sha512-z4qtrRuaAFJS4PUd0g+xy7aN4y+RvEt/QTJpR184lhJguBA1S/LsVlvE/CM95RsYMOFJG3NGGDjqFCzKU19S/A==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.12.0.tgz", + "integrity": "sha512-cy1RSRFHGZSrlYa3MnUuNVOXLUdifEZD2X8+AZjg8mKCdRvtCFSga6acq5N2g0ggb8lH3jBi369MrFZ+Y6sfsA==", "dev": true, "requires": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.2" + "debug": "^4.3.4" }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -23234,7 +23234,7 @@ "wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "requires": { "defaults": "^1.0.3" diff --git a/package.json b/package.json index e6186cfab..4069f3cef 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,8 @@ "update:savedVersion": "bash -c 'npm run cli wp post meta update $0 _vkb_saved_block_version $1'", "packages-update": "npx wp-scripts packages-update", "reinstall": "rm -rf node_modules/ && npm install && npm run build", - "prepare": "husky install" + "prepare": "husky install", + "wp-env": "wp-env" }, "author": "", "license": "MIT", @@ -56,7 +57,7 @@ "@wordpress/e2e-test-utils": "^6.0.2", "@wordpress/edit-post": "^6.0.2", "@wordpress/element": "^4.1.1", - "@wordpress/env": "^4.2.2", + "@wordpress/env": "^4.9.0", "@wordpress/hooks": "^3.3.1", "@wordpress/i18n": "^4.3.1", "@wordpress/icons": "^7.0.1", @@ -101,4 +102,4 @@ "rimraf": "^3.0.2", "sass": "1.32.12" } -} +} \ No newline at end of file diff --git a/readme.txt b/readme.txt index 6ff7d9eb7..4c04e9148 100644 --- a/readme.txt +++ b/readme.txt @@ -64,7 +64,10 @@ e.g. == Changelog == += 1.41.2 = [ Improvement ][ Page list from ancestor ] Fix behavior site editor. +[ Other ] Add PHPUnit test on Several PHP and WordPress versions +[ Bug Fix ] Fatal error in WordPress 5.8 [ Bug Fix ][ highlighter ] cope with color palette with alpha. [ Bug Fix ][ button ] buttonColorCustom clear convert to primary. diff --git a/test/phpunit/free/test-page-content.php b/test/phpunit/free/test-page-content.php index 376163b78..618dc3b6a 100644 --- a/test/phpunit/free/test-page-content.php +++ b/test/phpunit/free/test-page-content.php @@ -20,7 +20,7 @@ class PageContentBlockTest extends WP_UnitTestCase { /** * 各テストケースの実行直前に呼ばれる */ - public function setUp() { + public function setUp(): void { parent::setUp(); $page = array( @@ -35,7 +35,7 @@ public function setUp() { /** * Tear down each test method. */ - public function tearDown() { + public function tearDown(): void { wp_delete_post( $this->page_id, true ); $this->page_id = 0; } diff --git a/test/phpunit/pro/test-breadcrumb.php b/test/phpunit/pro/test-breadcrumb.php index 43136efc1..6a4404111 100644 --- a/test/phpunit/pro/test-breadcrumb.php +++ b/test/phpunit/pro/test-breadcrumb.php @@ -27,7 +27,7 @@ class Breadcrumb extends WP_UnitTestCase { /** * 各テストケースの実行直前に呼ばれる */ - public function setUp() { + public function setUp() : void { parent::setUp(); $catarr = array( @@ -56,7 +56,7 @@ public function setUp() { /** * Tear down each test method. */ - public function tearDown() { + public function tearDown(): void { wp_delete_post( $this->page_id, true ); $this->page_id = 0; @@ -106,7 +106,7 @@ public function test_breadcrumb() { * @param string $role administrator, editor, author, contributor ... * @return void */ - public function set_current_user( $role ) { + public function set_current_user( $role ) : void { $user = $this->factory()->user->create_and_get( array( 'role' => $role, diff --git a/test/phpunit/pro/test-child-page.php b/test/phpunit/pro/test-child-page.php index 81e006dea..7e5b9bf74 100644 --- a/test/phpunit/pro/test-child-page.php +++ b/test/phpunit/pro/test-child-page.php @@ -27,7 +27,7 @@ class ChildPageBlockTest extends WP_UnitTestCase { /** * 各テストケースの実行直前に呼ばれる */ - public function setUp() { + public function setUp(): void { parent::setUp(); $page = array( @@ -51,7 +51,7 @@ public function setUp() { /** * Tear down each test method. */ - public function tearDown() { + public function tearDown(): void { wp_delete_post( $this->page_id, true ); $this->page_id = 0; diff --git a/test/phpunit/pro/test-get-options.php b/test/phpunit/pro/test-get-options.php index fe1516a99..1e9106578 100644 --- a/test/phpunit/pro/test-get-options.php +++ b/test/phpunit/pro/test-get-options.php @@ -8,7 +8,49 @@ class GetOptionsTest extends WP_UnitTestCase { public function test_vk_blocks_get_options() { + /** + * option値を追加した場合 + * ・プラグインインストール初期状態 + * ・他のoption値が保存されている状態から追加したoption値の初期値がmargeされるか + * ・全てのオプション値を変更した時 + * の3つのテストを追加してください + * + * たとえば、次にoption値を追加するは + * 1.ライセンスキーのところのテストをコピー + * array( + * 'option_check_target' => 'vk_blocks_pro_license_key', + * 'option' => array( + * 'display_vk_block_template' => 'hide', + * 'new_faq_accordion' => 'open', + * 'balloon_border_width' => 2, + * 'margin_unit' => 'px', + * 'margin_size' => array( + * 'lg' => array( + * 'mobile' => 1, + * 'tablet' => 2, + * 'pc' => 3, + * ), + * 'md' => array( + * 'mobile' => 1, + * 'tablet' => 2, + * 'pc' => 3, + * ), + * 'sm' => array( + * 'mobile' => 1, + * 'tablet' => 2, + * 'pc' => 3, + * ), + * ), + * 'load_separate_option' => true, + * ), + * 'correct' => null + * ), + * 2. その下に貼り付ける + * 3. optionにvk_blocks_pro_license_keyと保存される値を追加 + * 4. option_check_targetに追加したoptionのキー、correctを新しいoptionの初期値を設定してください + */ $test_data = array( + // プラグインインストール初期状態 array( 'option' => null, 'correct' => array( @@ -37,6 +79,135 @@ public function test_vk_blocks_get_options() { 'new_faq_accordion' => 'disable', ), ), + // デフォルトの表示非表示調整 v0.44.13 + // https://github.com/vektor-inc/vk-blocks-pro/commit/b17c2ae4097a5530eb88a7fdcf03885d89ece643#diff-9b75d117946ae115e35175fb160346351a75f98e850679a65de42680bd4611e1 + array( + 'option_check_target' => 'display_vk_block_template', + 'option' => array( + 'hide_wp_block_template' => true, + 'hide_vk_block_template' => false, + ), + 'correct' => 'display', + ), + // hide_wp_block_template,hide_vk_block_templateは廃止されたので以降のテストでは追加していない + + // New FAQ アコーディオン機能 v0.46.0 + // https://github.com/vektor-inc/vk-blocks-pro/pull/21 + array( + 'option_check_target' => 'new_faq_accordion', + 'option' => array( + 'display_vk_block_template' => 'hide', + ), + 'correct' => 'disable', + ), + // 吹き出し線の太さ v0.55.0 + // https://github.com/vektor-inc/vk-blocks-pro/commit/e0ede110ada73f0eb65af611382d899469b8d84b + array( + 'option_check_target' => 'balloon_border_width', + 'option' => array( + 'display_vk_block_template' => 'hide', + 'new_faq_accordion' => 'open', + ), + 'correct' => 1, + ), + // 余白 単位 margin_unit v1.7.1 + // https://github.com/vektor-inc/vk-blocks-pro/pull/584/ + array( + 'option_check_target' => 'margin_unit', + 'option' => array( + 'display_vk_block_template' => 'hide', + 'new_faq_accordion' => 'open', + 'balloon_border_width' => 2, + ), + 'correct' => 'rem' + ), + // 余白の共通サイズ設定 margin_size v1.7.1 + // https://github.com/vektor-inc/vk-blocks-pro/pull/584/ + array( + 'option_check_target' => 'margin_size', + 'option' => array( + 'display_vk_block_template' => 'hide', + 'new_faq_accordion' => 'open', + 'balloon_border_width' => 2, + ), + 'correct' => array( + 'lg' => array( + 'mobile' => null, + 'tablet' => null, + 'pc' => null, + ), + 'md' => array( + 'mobile' => null, + 'tablet' => null, + 'pc' => null, + ), + 'sm' => array( + 'mobile' => null, + 'tablet' => null, + 'pc' => null, + ), + ), + ), + // 分割読み込み load_separate_option v1.21.0 + // https://github.com/vektor-inc/vk-blocks-pro/commit/b6f3575cb2ebcb4e64ecb8070b81ccd391abc13c + array( + 'option_check_target' => 'load_separate_option', + 'option' => array( + 'display_vk_block_template' => 'hide', + 'new_faq_accordion' => 'open', + 'balloon_border_width' => 2, + 'margin_unit' => 'px', + 'margin_size' => array( + 'lg' => array( + 'mobile' => 1, + 'tablet' => 2, + 'pc' => 3, + ), + 'md' => array( + 'mobile' => 1, + 'tablet' => 2, + 'pc' => 3, + ), + 'sm' => array( + 'mobile' => 1, + 'tablet' => 2, + 'pc' => 3, + ), + ), + ), + 'correct' => false + ), + // ライセンスキー v1.32.0 + // https://github.com/vektor-inc/vk-blocks-pro/pull/1166 + array( + 'option_check_target' => 'vk_blocks_pro_license_key', + 'option' => array( + 'display_vk_block_template' => 'hide', + 'new_faq_accordion' => 'open', + 'balloon_border_width' => 2, + 'margin_unit' => 'px', + 'margin_size' => array( + 'lg' => array( + 'mobile' => 1, + 'tablet' => 2, + 'pc' => 3, + ), + 'md' => array( + 'mobile' => 1, + 'tablet' => 2, + 'pc' => 3, + ), + 'sm' => array( + 'mobile' => 1, + 'tablet' => 2, + 'pc' => 3, + ), + ), + 'load_separate_option' => true, + ), + 'correct' => null + ), + // 全てのオプション値を変更した時 array( 'option' => array( 'balloon_border_width' => 2, @@ -113,7 +284,15 @@ public function test_vk_blocks_get_options() { // print PHP_EOL; // var_dump( $correct ); // print PHP_EOL; - $this->assertSame( $correct, $return ); + + if ( $test_value['option_check_target'] ) { + $this->assertSame( $correct, $return[ $test_value['option_check_target'] ] ); + } else { + $this->assertSame( $correct, $return ); + } + + // 他のテストに影響が出ないようにオプション値を削除する + delete_option( 'vk_blocks_options' ); } } diff --git a/test/phpunit/pro/test-post-list.php b/test/phpunit/pro/test-post-list.php index fb60fa913..572863ba3 100644 --- a/test/phpunit/pro/test-post-list.php +++ b/test/phpunit/pro/test-post-list.php @@ -27,7 +27,7 @@ class PostListBlockTest extends WP_UnitTestCase { /** * 各テストケースの実行直前に呼ばれる */ - public function setUp() { + public function setUp(): void { parent::setUp(); $catarr = array( @@ -56,7 +56,7 @@ public function setUp() { /** * Tear down each test method. */ - public function tearDown() { + public function tearDown(): void { wp_delete_post( $this->page_id, true ); $this->page_id = 0; diff --git a/vk-blocks.php b/vk-blocks.php index e992d24c7..1782c89f4 100644 --- a/vk-blocks.php +++ b/vk-blocks.php @@ -3,7 +3,7 @@ * Plugin Name: VK Blocks Pro * Plugin URI: https://github.com/vektor-inc/vk-blocks * Description: This is a plugin that extends Gutenberg's blocks. - * Version: 1.41.1.0 + * Version: 1.41.2.0 * Stable tag: 1.40.1.1 * Requires at least: 5.8 * Author: Vektor,Inc.