diff --git a/.distignore b/.distignore index 8464e8a..fcfa1dc 100644 --- a/.distignore +++ b/.distignore @@ -1,8 +1,10 @@ # A set of files you probably don't want in your WordPress.org distribution .babelrc .deployignore +.direnv .distignore .editorconfig +.envrc .eslintignore .eslintrc .git @@ -47,3 +49,6 @@ docker-compose.yml output.log dist .circleci +flake.nix +flake.lock +Dockerfile-php-build diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..8f1d500 --- /dev/null +++ b/.envrc @@ -0,0 +1,6 @@ +use flake + +# add your HONEYCOMB_API_KEY and HONEYCOMB_DATASET in .env.local to test HONEYCOMB +if [ -f .env.local ]; then + source .env.local +fi diff --git a/.gitignore b/.gitignore index f58f876..4d0696c 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ node_modules/ *.zip /vendor/ /generated/ +.direnv diff --git a/README.md b/README.md index b313ea4..91fa146 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## Development ``` -git clone git@github.com:GaloyMoney/galoy-woocommerce.git +git clone git@github.com:blinkbitcoin/blink-for-woocommerce.git ``` **Install dependencies with Composer:** diff --git a/assets/js/frontend/blocks.js b/assets/js/frontend/blocks.js index e3c3b1a..86e1e6b 100644 --- a/assets/js/frontend/blocks.js +++ b/assets/js/frontend/blocks.js @@ -1,17 +1,17 @@ -const settings = window.wc.wcSettings.getSetting( 'galoy_blink_default_data', {} ); -const label = window.wp.htmlEntities.decodeEntities( settings.title ); +const settings = window.wc.wcSettings.getSetting('blink_default_data', {}); +const label = window.wp.htmlEntities.decodeEntities(settings.title); const Content = () => { - return window.wp.htmlEntities.decodeEntities( settings.description || '' ); + return window.wp.htmlEntities.decodeEntities(settings.description || ''); }; const Block_Gateway = { - name: 'galoy_blink_default', - label: label, - content: Object( window.wp.element.createElement )( Content, null ), - edit: Object( window.wp.element.createElement )( Content, null ), - canMakePayment: () => true, - ariaLabel: label, - supports: { - features: settings.supports, - }, + name: 'blink_default', + label: label, + content: Object(window.wp.element.createElement)(Content, null), + edit: Object(window.wp.element.createElement)(Content, null), + canMakePayment: () => true, + ariaLabel: label, + supports: { + features: settings.supports, + }, }; -window.wc.wcBlocksRegistry.registerPaymentMethod( Block_Gateway ); +window.wc.wcBlocksRegistry.registerPaymentMethod(Block_Gateway); diff --git a/blink-for-woocommerce.php b/blink-for-woocommerce.php index 6f149e5..977ccd0 100644 --- a/blink-for-woocommerce.php +++ b/blink-for-woocommerce.php @@ -3,10 +3,10 @@ * Plugin Name: Blink For Woocommerce * Plugin URI: https://wordpress.org/plugins/blink-for-woocommerce/ * Description: Blink is a free and open-source bitcoin wallet which allows you to receive payments in Bitcoin and stablesats directly, with no fees, transaction cost or a middleman. - * Author: Galoy - Blink + * Author: Blink * Author URI: https://blink.sv * License: MIT - * License URI: https://github.com/GaloyMoney/blink-woocommerce/blob/main/license.txt + * License URI: https://github.com/blinkbitcoin/blink-for-woocommerce/blob/main/license.txt * Text Domain: blink-for-woocommerce * Domain Path: /languages * Version: 0.1.0 @@ -20,7 +20,7 @@ defined('ABSPATH') || exit(); define('BLINK_VERSION', '0.1.0'); -define('BLINK_VERSION_KEY', 'galoy_blink_version'); +define('BLINK_VERSION_KEY', 'blink_version'); define('BLINK_PLUGIN_FILE_PATH', plugin_dir_path(__FILE__)); define('BLINK_PLUGIN_URL', plugin_dir_url(__FILE__)); define('BLINK_PLUGIN_ID', 'blink-for-woocommerce'); @@ -32,12 +32,12 @@ public function __construct() { $this->includes(); add_action( - 'woocommerce_thankyou_galoy_blink_default', + 'woocommerce_thankyou_blink_default', ['BlinkWCPlugin', 'orderStatusThankYouPage'], 10, 1 ); - add_action('wp_ajax_galoy_blink_notifications', [$this, 'processAjaxNotification']); + add_action('wp_ajax_blink_notifications', [$this, 'processAjaxNotification']); add_action('admin_enqueue_scripts', [$this, 'enqueueAdminScripts']); // TODO: add process to run the updates. @@ -75,15 +75,15 @@ public function includes(): void { */ public function enqueueAdminScripts(): void { wp_enqueue_script( - 'galoy-blink-notifications', + 'blink-notifications', plugin_dir_url(__FILE__) . 'assets/js/backend/notifications.js', ['jquery'], BLINK_VERSION, true ); - wp_localize_script('galoy-blink-notifications', 'BlinkNotifications', [ + wp_localize_script('blink-notifications', 'BlinkNotifications', [ 'ajax_url' => admin_url('admin-ajax.php'), - 'nonce' => wp_create_nonce('galoy-blink-notifications-nonce'), + 'nonce' => wp_create_nonce('blink-notifications-nonce'), ]); } @@ -96,9 +96,9 @@ public static function initPaymentGateways($gateways): array { * Handles the AJAX callback to dismiss review notification. */ public function processAjaxNotification() { - check_ajax_referer('galoy-blink-notifications-nonce', 'nonce'); + check_ajax_referer('blink-notifications-nonce', 'nonce'); // Dismiss review notice for 30 days. - set_transient('galoy_blink_review_dismissed', true, DAY_IN_SECONDS * 30); + set_transient('blink_review_dismissed', true, DAY_IN_SECONDS * 30); wp_send_json_success(); } @@ -134,7 +134,7 @@ public function dependenciesNotification() { * Displays notice (and link to config page) on admin dashboard if the plugin is not configured yet. */ public function notConfiguredNotification(): void { - if (!\Blink\WC\Helpers\GaloyApiHelper::getConfig()) { + if (!\Blink\WC\Helpers\BlinkApiHelper::getConfig()) { $message = sprintf( 'Plugin not configured yet, please %1$sconfigure the plugin here%2$s', '', @@ -254,9 +254,9 @@ function init_blink_plugin() { // Setting up and handling custom endpoint for api key redirect from Blink. add_rewrite_endpoint('blink-settings-callback', EP_ROOT); // Flush rewrite rules only once after activation. - if (!get_option('galoy_blink_permalinks_flushed')) { + if (!get_option('blink_permalinks_flushed')) { flush_rewrite_rules(false); - update_option('galoy_blink_permalinks_flushed', 1); + update_option('blink_permalinks_flushed', 1); } }); @@ -308,7 +308,7 @@ function ($links) { // Installation routine. register_activation_hook(__FILE__, function () { - update_option('galoy_blink_permalinks_flushed', 0); + update_option('blink_permalinks_flushed', 0); update_option(BLINK_VERSION_KEY, BLINK_VERSION); }); diff --git a/composer.json b/composer.json index 3bfac6c..342e146 100755 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "galoy/blink-for-woocommerce", + "name": "blink/blink-for-woocommerce", "type": "project", "license": "MIT", "autoload": { diff --git a/composer.lock b/composer.lock index d3cc19a..2094bd7 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6cddb0a2410705c42cd0ccf5d4639501", + "content-hash": "9e59f0e40f4f2e3e5a120aca1e35ed26", "packages": [ { "name": "guzzlehttp/guzzle", @@ -606,10 +606,10 @@ "packages-dev": [], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, - "platform": [], - "platform-dev": [], + "platform": {}, + "platform-dev": {}, "plugin-api-version": "2.6.0" } diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..f3cfe0f --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1726560853, + "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1728888510, + "narHash": "sha256-nsNdSldaAyu6PE3YUA+YQLqUDJh+gRbBooMMekZJwvI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "a3c0b3b21515f74fd2665903d4ce6bc4dc81c77c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..544dc64 --- /dev/null +++ b/flake.nix @@ -0,0 +1,34 @@ +{ + description = "Blink Woocommerce plugin development environment"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { self, nixpkgs, flake-utils }: + flake-utils.lib.eachDefaultSystem (system: + let + pkgs = import nixpkgs { + inherit system; + config.allowUnfree = true; + }; + in + { + devShell = pkgs.mkShell { + buildInputs = with pkgs; [ + php83 + php83Packages.composer + nodejs_20 + ]; + + shellHook = '' + echo "Blink Woocommerce plugin development environment" + echo "PHP version: $(php --version | head -n 1)" + echo "Composer version: $(composer --version | cut -d' ' -f3)" + echo "Node.js version: $(node --version)" + ''; + }; + } + ); +} diff --git a/languages/blink-for-woocommerce-es.po b/languages/blink-for-woocommerce-es.po index fe77266..fcd7107 100644 --- a/languages/blink-for-woocommerce-es.po +++ b/languages/blink-for-woocommerce-es.po @@ -1,9 +1,9 @@ -# Copyright (C) 2024 Galoy - Blink +# Copyright (C) 2024 Blink # This file is distributed under the same license as the Blink For Woocommerce package. msgid "" msgstr "" "Project-Id-Version: Blink For Woocommerce 0.1.0\n" -"Report-Msgid-Bugs-To: https://chat.galoy.io\n" +"Report-Msgid-Bugs-To: https://chat.blink.sv\n" "POT-Creation-Date: 2024-05-29 00:37:58+00:00\n" "PO-Revision-Date: 2024-05-29 00:23-0500\n" "Last-Translator: \n" @@ -153,8 +153,8 @@ msgstr "" "o intermediarios." #. Author of the plugin/theme -msgid "Galoy - Blink" -msgstr "Galoy - Blink" +msgid "Blink" +msgstr "Blink" #. Author URI of the plugin/theme msgid "https://blink.sv" @@ -235,10 +235,10 @@ msgid "" "This plugin version is %s and your PHP version is %s. Check out our installation instructions. If you need assistance, please come on our " -"chat. Thank you for " +"chat. Thank you for " "using Blink!" msgstr "" "Esta versión del plugin es %s y tu versión de PHP es %s. Consulta nuestras instrucciones de instalación. Si necesitas ayuda, por favor, únete a nuestro " -"chat. ¡Gracias por usar Blink!" +"chat. ¡Gracias por usar Blink!" diff --git a/languages/blink-for-woocommerce.pot b/languages/blink-for-woocommerce.pot index 8aaac4a..fe8ca18 100644 --- a/languages/blink-for-woocommerce.pot +++ b/languages/blink-for-woocommerce.pot @@ -1,11 +1,11 @@ -# Copyright (C) 2024 Galoy - Blink +# Copyright (C) 2024 Blink # This file is distributed under the MIT. msgid "" msgstr "" "Project-Id-Version: Blink For Woocommerce 0.1.0\n" "Report-Msgid-Bugs-To: " -"https://wordpress.org/support/plugin/blink-woocommerce\n" -"POT-Creation-Date: 2024-09-23 19:56:16+00:00\n" +"https://wordpress.org/support/plugin/blink-for-woocommerce\n" +"POT-Creation-Date: 2024-10-16 04:48:07+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -41,7 +41,7 @@ msgid "" msgstr "" #. Author of the plugin/theme -msgid "Galoy - Blink" +msgid "Blink" msgstr "" #. Author URI of the plugin/theme diff --git a/license.txt b/license.txt index 5d3a99e..623d422 100644 --- a/license.txt +++ b/license.txt @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 Galoy Inc +Copyright (c) 2024 Blink LLC Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..c11ef6f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1291 @@ +{ + "name": "blink-for-woocommerce", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "blink-for-woocommerce", + "version": "0.1.0", + "devDependencies": { + "@prettier/plugin-php": "^0.22.2", + "grunt": "^1.6.1", + "grunt-wp-i18n": "^1.0.3", + "grunt-wp-readme-to-markdown": "^2.1.0", + "prettier": "^3.3.3" + } + }, + "node_modules/@prettier/plugin-php": { + "version": "0.22.2", + "resolved": "https://registry.npmjs.org/@prettier/plugin-php/-/plugin-php-0.22.2.tgz", + "integrity": "sha512-md0+7tNbsP0oy+wIP3KZZc6fzx1k1jtWaMjOy/gM8yU9f2BDYEi+iHOc/UNPihYvPI28zFTbjvlhH4QXQjQwNg==", + "dev": true, + "dependencies": { + "linguist-languages": "^7.27.0", + "php-parser": "^3.1.5" + }, + "peerDependencies": { + "prettier": "^3.0.0" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", + "dev": true + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getobject": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", + "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/gettext-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-3.1.1.tgz", + "integrity": "sha512-vNhWcqXEtZPs5Ft1ReA34g7ByWotpcOIeJvXVy2jF3/G2U9v6W0wG4Z4hXzcU8R//jArqkgHcVCGgGqa4vxVlQ==", + "dev": true, + "dependencies": { + "encoding": "^0.1.12", + "readable-stream": "^3.2.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/grunt": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.6.1.tgz", + "integrity": "sha512-/ABUy3gYWu5iBmrUSRBP97JLpQUm0GgVveDCp6t3yRNIoltIYw7rEj3g5y1o2PGPR2vfTRGa7WC/LZHLTXnEzA==", + "dev": true, + "dependencies": { + "dateformat": "~4.6.2", + "eventemitter2": "~0.4.13", + "exit": "~0.1.2", + "findup-sync": "~5.0.0", + "glob": "~7.1.6", + "grunt-cli": "~1.4.3", + "grunt-known-options": "~2.0.0", + "grunt-legacy-log": "~3.0.0", + "grunt-legacy-util": "~2.0.1", + "iconv-lite": "~0.6.3", + "js-yaml": "~3.14.0", + "minimatch": "~3.0.4", + "nopt": "~3.0.6" + }, + "bin": { + "grunt": "bin/grunt" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/grunt-cli": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", + "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", + "dev": true, + "dependencies": { + "grunt-known-options": "~2.0.0", + "interpret": "~1.1.0", + "liftup": "~3.0.1", + "nopt": "~4.0.1", + "v8flags": "~3.2.0" + }, + "bin": { + "grunt": "bin/grunt" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-cli/node_modules/nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/grunt-known-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", + "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-legacy-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", + "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", + "dev": true, + "dependencies": { + "colors": "~1.1.2", + "grunt-legacy-log-utils": "~2.1.0", + "hooker": "~0.2.3", + "lodash": "~4.17.19" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/grunt-legacy-log-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", + "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", + "dev": true, + "dependencies": { + "chalk": "~4.1.0", + "lodash": "~4.17.19" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-legacy-util": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", + "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", + "dev": true, + "dependencies": { + "async": "~3.2.0", + "exit": "~0.1.2", + "getobject": "~1.0.0", + "hooker": "~0.2.3", + "lodash": "~4.17.21", + "underscore.string": "~3.3.5", + "which": "~2.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-wp-i18n": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/grunt-wp-i18n/-/grunt-wp-i18n-1.0.3.tgz", + "integrity": "sha512-CJNbEKeBeOSAPeaJ9B8iCgSwtaG63UR9/uT46a4OsIqnFhOJpeAi138JTlvjfIbnDVoBrzvdrKJe1svveLjUtA==", + "dev": true, + "dependencies": { + "grunt": "^1.0.3", + "node-wp-i18n": "^1.2.2" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/grunt-wp-readme-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-wp-readme-to-markdown/-/grunt-wp-readme-to-markdown-2.1.0.tgz", + "integrity": "sha512-32OYDYNaKgykI2vxVsbqzvYBA9xHJI3XqXHSwXbLzUd1wa0ZepoceHYCs4rYFLo3ZxKpPExxvVuH3gLUS/Fq1Q==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + }, + "peerDependencies": { + "grunt": ">=0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==", + "dev": true + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/liftup": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", + "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "dev": true, + "dependencies": { + "extend": "^3.0.2", + "findup-sync": "^4.0.0", + "fined": "^1.2.0", + "flagged-respawn": "^1.0.1", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.1", + "rechoir": "^0.7.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/liftup/node_modules/findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/linguist-languages": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/linguist-languages/-/linguist-languages-7.27.0.tgz", + "integrity": "sha512-Wzx/22c5Jsv2ag+uKy+ITanGA5hzvBZngrNGDXLTC7ZjGM6FLCYGgomauTkxNJeP9of353OM0pWqngYA180xgw==", + "dev": true + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-wp-i18n": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/node-wp-i18n/-/node-wp-i18n-1.2.7.tgz", + "integrity": "sha512-4X+890+Irj8sY+6WKkFx+4wk/GGu9mGLDY1PVPF9AWF1zTKWClLA83QikcQKX55rjjKpN1jSZEQoEANNVSSBYw==", + "dev": true, + "dependencies": { + "bluebird": "^3.4.1", + "gettext-parser": "^3.1.0", + "glob": "^7.0.5", + "lodash": "^4.14.2", + "minimist": "^1.2.5", + "mkdirp": "^1.0.4", + "tmp": "^0.2.1" + }, + "bin": { + "wpi18n": "bin/wpi18n" + } + }, + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dev": true, + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/php-parser": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/php-parser/-/php-parser-3.1.5.tgz", + "integrity": "sha512-jEY2DcbgCm5aclzBdfW86GM6VEIWcSlhTBSHN1qhJguVePlYe28GhwS0yoeLYXpM2K8y6wzLwrbq814n2PHSoQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/underscore.string": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", + "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", + "dev": true, + "dependencies": { + "sprintf-js": "^1.1.1", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/underscore.string/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + } + } +} diff --git a/package.json b/package.json index 728f17c..b815fa2 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "blink-for-woocommerce", "version": "0.1.0", "main": "Gruntfile.js", - "author": "Galoy Inc", + "author": "Blink", "scripts": { "prettier:check": "prettier -c blink-for-woocommerce.php src", "prettier:fix": "prettier -w blink-for-woocommerce.php src", @@ -15,10 +15,12 @@ "grunt": "^1.6.1", "grunt-wp-i18n": "^1.0.3", "grunt-wp-readme-to-markdown": "^2.1.0", - "prettier": "^3.2.5" + "prettier": "^3.3.3" }, "prettier": { - "plugins": ["@prettier/plugin-php"], + "plugins": [ + "@prettier/plugin-php" + ], "printWidth": 90, "useTabs": false, "tabWidth": 2, diff --git a/readme.txt b/readme.txt index 04e5be0..8428cfb 100644 --- a/readme.txt +++ b/readme.txt @@ -1,12 +1,12 @@ === Blink For WooCommerce === -Contributors: galoy +Contributors: blink Tags: Bitcoin, Lightning Network, WooCommerce, payment gateway Requires at least: 4.5 Tested up to: 6.6.1 Requires PHP: 5.6 Stable tag: 0.1.0 License: MIT -License URI: https://github.com/GaloyMoney/blink-woocommerce/blob/main/license.txt +License URI: https://github.com/blinkbitcoin/blink-for-woocommerce/blob/main/license.txt A simple, fast and secure Bitcoin payment gateway for WooCommerce using [Blink](https://www.blink.sv/). @@ -21,7 +21,7 @@ Key features of Blink For WooCommerce include: * Stablesats Integration: Offers the ability to receive payments in Bitcoin while maintaining a stable value pegged to the US Dollar, reducing volatility risks. * Easy Integration: Simple setup and configuration within WooCommerce, allowing you to start accepting Bitcoin payments quickly and easily. -For more information please visit [Plugin Repository](https://github.com/GaloyMoney/blink-woocommerce/). +For more information please visit [Plugin Repository](https://github.com/blinkbitcoin/blink-for-woocommerce/). ### Important Notice @@ -43,7 +43,7 @@ Please review these links to ensure that you are compliant with all legal requir This section describes how to install the plugin and get it working. -1. Upload and unzip `blink-woocommerce.zip` to the `/wp-content/plugins/` directory. +1. Upload and unzip `blink-for-woocommerce.zip` to the `/wp-content/plugins/` directory. 2. Activate the plugin through the 'Plugins' menu in WordPress. 3. Configure the plugin settings via the WooCommerce settings page. 4. Ensure your Blink or Staging account is set up and linked with the plugin. diff --git a/resources/js/backend/notifications.js b/resources/js/backend/notifications.js index 7b4ece6..06c25d5 100644 --- a/resources/js/backend/notifications.js +++ b/resources/js/backend/notifications.js @@ -1,12 +1,12 @@ -jQuery(document).ready(function($) { - jQuery(document).on('click', '.blink-review-notice button.notice-dismiss', function() { - $.ajax({ - url: BlinkNotifications.ajax_url, - type: 'post', - data: { - action: 'galoy_blink_notifications', - nonce: BlinkNotifications.nonce - } - }); - }); +jQuery(document).ready(function ($) { + jQuery(document).on('click', '.blink-review-notice button.notice-dismiss', function () { + $.ajax({ + url: BlinkNotifications.ajax_url, + type: 'post', + data: { + action: 'blink_notifications', + nonce: BlinkNotifications.nonce, + }, + }); + }); }); diff --git a/src/Admin/GlobalSettings.php b/src/Admin/GlobalSettings.php index 3425838..f049497 100644 --- a/src/Admin/GlobalSettings.php +++ b/src/Admin/GlobalSettings.php @@ -6,15 +6,15 @@ use Blink\WC\Helpers\Logger; use Blink\WC\Helpers\OrderStates; -use Blink\WC\Helpers\GaloyApiHelper; +use Blink\WC\Helpers\BlinkApiHelper; class GlobalSettings extends \WC_Settings_Page { - private GaloyApiHelper $apiHelper; + private BlinkApiHelper $apiHelper; public function __construct() { $this->id = 'blink_settings'; $this->label = 'Blink Settings'; - $this->apiHelper = new GaloyApiHelper(); + $this->apiHelper = new BlinkApiHelper(); // Register custom field type order_states with OrderStatesField class. add_action('woocommerce_admin_field_order_states', [ @@ -28,20 +28,20 @@ public function __construct() { if (is_admin()) { // Register and include JS. - wp_enqueue_script('galoy_blink_global_settings'); - wp_localize_script('galoy_blink_global_settings', 'BlinkGlobalSettings', [ + wp_enqueue_script('blink_global_settings'); + wp_localize_script('blink_global_settings', 'BlinkGlobalSettings', [ 'url' => admin_url('admin-ajax.php'), - 'apiNonce' => wp_create_nonce('galoy-blink-api-url-nonce'), + 'apiNonce' => wp_create_nonce('blink-api-url-nonce'), ]); // Register and include CSS. wp_register_style( - 'galoy_blink_admin_styles', + 'blink_admin_styles', BLINK_PLUGIN_URL . 'assets/css/admin.css', [], BLINK_VERSION ); - wp_enqueue_style('galoy_blink_admin_styles'); + wp_enqueue_style('blink_admin_styles'); } parent::__construct(); } @@ -60,14 +60,14 @@ public function getGlobalSettings(): array { Logger::debug('Entering Global Settings form.'); // Check setup status and prepare output. - $storedApiKey = get_option('galoy_blink_api_key'); - $storedGaloyEnv = get_option('galoy_blink_env'); + $storedApiKey = get_option('blink_api_key'); + $storedBlinkEnv = get_option('blink_env'); $setupStatus = ''; - if ($storedGaloyEnv && $storedApiKey) { - if (GaloyApiHelper::verifyApiKey($storedGaloyEnv, $storedApiKey)) { + if ($storedBlinkEnv && $storedApiKey) { + if (BlinkApiHelper::verifyApiKey($storedBlinkEnv, $storedApiKey)) { $setupStatus = ''; } } @@ -78,25 +78,25 @@ public function getGlobalSettings(): array { 'title' => 'Connection settings', 'type' => 'title', 'desc' => sprintf( - 'This plugin version is %1$s and your PHP version is %2$s. Check out our installation instructions. If you need assistance, please come on our chat. Thank you for using Blink!', + 'This plugin version is %1$s and your PHP version is %2$s. Check out our installation instructions. If you need assistance, please come on our chat. Thank you for using Blink!', BLINK_VERSION, PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION ), - 'id' => 'galoy_blink_connection', + 'id' => 'blink_connection', ], - 'galoy_env' => [ + 'blink_env' => [ 'title' => 'Blink Environment', 'type' => 'select', 'options' => [ 'blink' => 'Blink', - 'staging' => 'Galoy Staging', + 'staging' => 'Staging', ], 'default' => 'Blink', - 'desc' => 'Galoy instance.', + 'desc' => 'Blink instance.', 'desc_tip' => true, - 'id' => 'galoy_blink_env', + 'id' => 'blink_env', ], - 'galoy_wallet_type' => [ + 'blink_wallet_type' => [ 'title' => 'Blink Wallet', 'type' => 'select', 'options' => [ @@ -104,9 +104,9 @@ public function getGlobalSettings(): array { 'stablesats' => 'Stablesats', ], 'default' => 'Blink', - 'desc' => 'Galoy/Blink Wallet', + 'desc' => 'Blink Wallet', 'desc_tip' => true, - 'id' => 'galoy_blink_wallet_type', + 'id' => 'blink_wallet_type', ], 'api_key' => [ 'title' => 'Blink API Key', @@ -114,25 +114,25 @@ public function getGlobalSettings(): array { 'desc' => 'Your Blink API Key. If you do not have any yet use Blink dashboard to get a new one.', 'default' => '', - 'id' => 'galoy_blink_api_key', + 'id' => 'blink_api_key', ], 'webhook_url' => [ 'title' => 'Webhook Url', 'type' => 'custom_markup', 'markup' => - WC()->api_request_url('galoy_blink_default') . + WC()->api_request_url('blink_default') . '

Please use Blink dashboard to set it up.

', - 'id' => 'galoy_blink_webhook_url', + 'id' => 'blink_webhook_url', ], 'status' => [ 'title' => 'Setup status', 'type' => 'custom_markup', 'markup' => $setupStatus, - 'id' => 'galoy_blink_status', + 'id' => 'blink_status', ], 'sectionend_connection' => [ 'type' => 'sectionend', - 'id' => 'galoy_blink_connection', + 'id' => 'blink_connection', ], // Section general. 'title' => [ @@ -147,11 +147,11 @@ public function getGlobalSettings(): array { 'Message to explain how the customer will be paying for the purchase. Can be overwritten on a per gateway basis.', 'default' => 'You will be redirected to Blink to complete your purchase.', 'desc_tip' => true, - 'id' => 'galoy_blink_default_description', + 'id' => 'blink_default_description', ], 'order_states' => [ 'type' => 'order_states', - 'id' => 'galoy_blink_order_states', + 'id' => 'blink_order_states', ], 'protect_orders' => [ 'title' => 'Protect order status', @@ -159,7 +159,7 @@ public function getGlobalSettings(): array { 'default' => 'yes', 'desc' => 'Protects order status from changing if it is already "processing" or "completed". This will protect against orders getting cancelled via webhook if they were paid in the meantime with another payment gateway. Default is ON.', - 'id' => 'galoy_blink_protect_order_status', + 'id' => 'blink_protect_order_status', ], 'debug' => [ 'title' => 'Debug Log', @@ -169,7 +169,7 @@ public function getGlobalSettings(): array { 'Enable logging View Logs', Logger::getLogFileUrl() ), - 'id' => 'galoy_blink_debug', + 'id' => 'blink_debug', ], 'sectionend' => [ 'type' => 'sectionend', @@ -186,11 +186,11 @@ public function save() { Logger::debug('Saving GlobalSettings.'); // nonce validation is not required here because it is done by parent::save() - if (!empty($_POST['galoy_blink_env']) && !empty($_POST['galoy_blink_api_key'])) { - $apiEnv = sanitize_text_field(wp_unslash($_POST['galoy_blink_env'])); - $apiKey = sanitize_text_field(wp_unslash($_POST['galoy_blink_api_key'])); + if (!empty($_POST['blink_env']) && !empty($_POST['blink_api_key'])) { + $apiEnv = sanitize_text_field(wp_unslash($_POST['blink_env'])); + $apiKey = sanitize_text_field(wp_unslash($_POST['blink_api_key'])); - if (!GaloyApiHelper::verifyApiKey($apiEnv, $apiKey)) { + if (!BlinkApiHelper::verifyApiKey($apiEnv, $apiKey)) { $messageException = 'Error fetching data for this API key from server. Please check if the API key is valid.'; Notice::addNotice('error', $messageException); diff --git a/src/Blocks/BlinkLnGatewayBlocks.php b/src/Blocks/BlinkLnGatewayBlocks.php index f35096e..b550c56 100644 --- a/src/Blocks/BlinkLnGatewayBlocks.php +++ b/src/Blocks/BlinkLnGatewayBlocks.php @@ -7,7 +7,7 @@ use Blink\WC\Helpers\Logger; /** - * Galoy - Blink payment method integration + * Blink payment method integration * * @since 3.0.0 */ @@ -20,13 +20,13 @@ final class BlinkLnGatewayBlocks extends AbstractPaymentMethodType { /** * Payment method name/id/slug. */ - protected $name = 'galoy_blink_default'; + protected $name = 'blink_default'; /** * Initializes the payment method type. */ public function initialize(): void { - $this->settings = get_option('woocommerce_galoy_blink_default_settings', []); + $this->settings = get_option('woocommerce_blink_default_settings', []); $gateways = \WC()->payment_gateways->payment_gateways(); $this->gateway = $gateways[$this->name]; } diff --git a/src/Gateway/BlinkLnGateway.php b/src/Gateway/BlinkLnGateway.php index 132eeac..4d00fa2 100644 --- a/src/Gateway/BlinkLnGateway.php +++ b/src/Gateway/BlinkLnGateway.php @@ -5,7 +5,7 @@ namespace Blink\WC\Gateway; use Blink\WC\Helpers\Logger; -use Blink\WC\Helpers\GaloyApiHelper; +use Blink\WC\Helpers\BlinkApiHelper; use Blink\WC\Helpers\OrderStates; class BlinkLnGateway extends \WC_Payment_Gateway { @@ -16,7 +16,7 @@ class BlinkLnGateway extends \WC_Payment_Gateway { public function __construct() { // Set the id first. - $this->id = 'galoy_blink_default'; + $this->id = 'blink_default'; // Debugging & informational settings. $this->debug_php_version = PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION; @@ -38,7 +38,7 @@ public function __construct() { $this->method_title = 'Blink (Lightning)'; $this->method_description = 'Blink Bitcoin Lightning gateway.'; - $this->apiHelper = new GaloyApiHelper(); + $this->apiHelper = new BlinkApiHelper(); // Actions. add_action('woocommerce_update_options_payment_gateways_' . $this->getId(), [ @@ -146,7 +146,7 @@ public function process_admin_options() { public function process_payment($order_id) { if (!$this->apiHelper->configured) { Logger::debug( - 'Galoy/Blink API connection not configured, aborting. Please go to settings and set it up.' + 'Blink API connection not configured, aborting. Please go to settings and set it up.' ); throw new \Exception( "Can't process order. Please contact us if the problem persists." @@ -162,9 +162,9 @@ public function process_payment($order_id) { // Check for existing invoice and redirect instead. if ($this->validInvoiceExists($order)) { - $existingInvoiceId = $order->get_meta('galoy_id'); + $existingInvoiceId = $order->get_meta('blink_id'); Logger::debug( - 'Found existing Galoy/Blink invoice and redirecting to it. Invoice id: ' . + 'Found existing Blink invoice and redirecting to it. Invoice id: ' . $existingInvoiceId ); @@ -180,7 +180,7 @@ public function process_payment($order_id) { } // Create an invoice. - Logger::debug('Creating invoice on Galoy/Blink'); + Logger::debug('Creating invoice on Blink'); if ($invoice = $this->createInvoice($order)) { Logger::debug('Invoice creation successful, redirecting user.'); return [ @@ -202,31 +202,31 @@ public function process_refund($order_id, $amount = null, $reason = '') { } /** - * Process webhooks from Galoy/Blink. + * Process webhooks from Blink. */ public function processWebhook() { - Logger::debug('Galoy/Blink Webhook handler'); + Logger::debug('Blink Webhook handler'); try { $data = json_decode(file_get_contents('php://input'), true); // Check if the required fields are set in the $_POST array if (!isset($data['transaction']['initiationVia']['paymentHash'])) { - Logger::debug('No Galoy/Blink invoiceId provided, aborting.'); - wp_die('No Galoy/Blink invoiceId provided, aborting.', '', ['response' => 200]); + Logger::debug('No Blink invoiceId provided, aborting.'); + wp_die('No Blink invoiceId provided, aborting.', '', ['response' => 200]); } $invoiceId = sanitize_text_field( $data['transaction']['initiationVia']['paymentHash'] ); if (empty($invoiceId)) { - Logger::error('No Galoy/Blink invoiceId provided.'); - wp_die('No Galoy/Blink invoiceId provided, aborting.'); + Logger::error('No Blink invoiceId provided.'); + wp_die('No Blink invoiceId provided, aborting.'); } // Load the order by metadata field Blink_id $orders = wc_get_orders([ - 'meta_key' => 'galoy_id', + 'meta_key' => 'blink_id', 'meta_value' => $invoiceId, ]); @@ -253,7 +253,7 @@ public function processWebhook() { } /** - * Checks if the order has already a Galoy/Blink invoice set and checks if it is still + * Checks if the order has already a Blink invoice set and checks if it is still * valid to avoid creating multiple invoices for the same order on Blink end. * * @param int $orderId @@ -261,10 +261,10 @@ public function processWebhook() { * @return mixed Returns false if no valid invoice found or the invoice id. */ protected function validInvoiceExists(\WC_Order $order): bool { - if ($invoiceId = $order->get_meta('galoy_id')) { + if ($invoiceId = $order->get_meta('blink_id')) { try { Logger::debug( - 'Trying to fetch existing invoice from Galoy/Blink for hash ' . $invoiceId + 'Trying to fetch existing invoice from Blink for hash ' . $invoiceId ); $invoice = $this->apiHelper->getInvoice($invoiceId); $invalidStates = ['EXPIRED']; @@ -282,7 +282,7 @@ protected function validInvoiceExists(\WC_Order $order): bool { } /** - * Create an invoice on Galoy/Blink. + * Create an invoice on Blink. */ protected function createInvoice(\WC_Order $order) { // In case some plugins customizing the order number we need to pass that along, defaults to internal ID. @@ -303,9 +303,9 @@ protected function createInvoice(\WC_Order $order) { Logger::debug('Creating invoice with currency: ' . $currency); $invoice = $this->apiHelper->createInvoice($amount, $currency, $orderNumber); - $order->update_meta_data('galoy_redirect', $invoice['redirectUrl']); - $order->update_meta_data('galoy_id', $invoice['paymentHash']); - $order->update_meta_data('galoy_payment_request', $invoice['paymentRequest']); + $order->update_meta_data('blink_redirect', $invoice['redirectUrl']); + $order->update_meta_data('blink_id', $invoice['paymentHash']); + $order->update_meta_data('blink_payment_request', $invoice['paymentRequest']); $order->save(); return $invoice; @@ -319,7 +319,7 @@ protected function createInvoice(\WC_Order $order) { protected function processOrderStatus(\WC_Order $order) { Logger::debug('Updating status for order: ' . $order->get_id()); // Check if the order is already in a final state, if so do not update it if the orders are protected. - $protectOrders = get_option('galoy_blink_protect_order_status', 'no'); + $protectOrders = get_option('blink_protect_order_status', 'no'); Logger::debug('Protect order: ' . $protectOrders); @@ -327,22 +327,22 @@ protected function processOrderStatus(\WC_Order $order) { // Check if the order status is either 'processing' or 'completed' if ($order->has_status(['processing', 'completed'])) { $note = - 'Webhook received from Galoy/Blink, but the order is already processing or completed, skipping to update order status. Please manually check if everything is alright.'; + 'Webhook received from Blink, but the order is already processing or completed, skipping to update order status. Please manually check if everything is alright.'; $order->add_order_note($note); return; } } - if ($invoiceId = $order->get_meta('galoy_id')) { + if ($invoiceId = $order->get_meta('blink_id')) { // Get configured order states or fall back to defaults. - if (!($configuredOrderStates = get_option('galoy_blink_order_states'))) { + if (!($configuredOrderStates = get_option('blink_order_states'))) { $configuredOrderStates = (new OrderStates())->getDefaultOrderStateMappings(); } Logger::debug('Configured Order States: ' . implode(', ', $configuredOrderStates)); try { Logger::debug( - 'Trying to fetch existing invoice from Galoy/Blink for hash ' . $invoiceId + 'Trying to fetch existing invoice from Blink for hash ' . $invoiceId ); $invoice = $this->apiHelper->getInvoice($invoiceId); $invoiceStatus = $invoice['status']; diff --git a/src/Helpers/GaloyApiClient.php b/src/Helpers/BlinkApiClient.php similarity index 99% rename from src/Helpers/GaloyApiClient.php rename to src/Helpers/BlinkApiClient.php index 10ac1f6..584e4a7 100644 --- a/src/Helpers/GaloyApiClient.php +++ b/src/Helpers/BlinkApiClient.php @@ -4,7 +4,7 @@ namespace Blink\WC\Helpers; -class GaloyApiClient { +class BlinkApiClient { private $apiUrl; private $token; diff --git a/src/Helpers/GaloyApiHelper.php b/src/Helpers/BlinkApiHelper.php similarity index 92% rename from src/Helpers/GaloyApiHelper.php rename to src/Helpers/BlinkApiHelper.php index 898e5c4..2bce718 100644 --- a/src/Helpers/GaloyApiHelper.php +++ b/src/Helpers/BlinkApiHelper.php @@ -5,9 +5,9 @@ namespace Blink\WC\Helpers; use Blink\WC\Admin\Notice; -use Blink\WC\Helpers\GaloyApiClient; +use Blink\WC\Helpers\BlinkApiClient; -class GaloyApiHelper { +class BlinkApiHelper { public $configured = false; public $env; public $apiKey; @@ -45,9 +45,9 @@ public static function getPayUrl(string $env = null): string { } public static function getConfig(): array { - $env = get_option('galoy_blink_env'); - $key = get_option('galoy_blink_api_key'); - $walletType = get_option('galoy_blink_wallet_type'); + $env = get_option('blink_env'); + $key = get_option('blink_api_key'); + $walletType = get_option('blink_wallet_type'); if (!$env || !$key || !$walletType) { return []; } @@ -87,7 +87,7 @@ public static function verifyApiKey(string $env = null, string $apiKey = null): } try { - $client = new GaloyApiClient($config['url'], $config['api_key']); + $client = new BlinkApiClient($config['url'], $config['api_key']); $scopes = $client->getAuthorizationScopes(); $hasReceive = in_array('RECEIVE', $scopes); $hasWrite = in_array('WRITE', $scopes); @@ -114,7 +114,7 @@ public function getInvoice(string $paymentHash) { try { $config = self::getConfig(); - $client = new GaloyApiClient($config['url'], $config['api_key']); + $client = new BlinkApiClient($config['url'], $config['api_key']); $invoice = $client->getInvoiceStatus($paymentHash); Logger::debug('End getInvoice for ' . $paymentHash); return $invoice; @@ -140,7 +140,7 @@ public function createInvoice($amount, $currency, $orderNumber) { $config = self::getConfig(); $walletType = $config['wallet_type']; - $client = new GaloyApiClient($config['url'], $config['api_key']); + $client = new BlinkApiClient($config['url'], $config['api_key']); $walletsAmounts = $client->currencyConversionEstimation($amount, $currency); $walletCurrency = 'BTC'; diff --git a/src/Helpers/Logger.php b/src/Helpers/Logger.php index dcccba8..421b36e 100755 --- a/src/Helpers/Logger.php +++ b/src/Helpers/Logger.php @@ -6,7 +6,7 @@ class Logger { public static function debug(string $message, $force = false): void { - if (get_option('galoy_blink_debug') === 'yes' || $force) { + if (get_option('blink_debug') === 'yes' || $force) { // Convert message to string if (!is_string($message)) { $message = wc_print_r($message, true);