From 44a5713f63244777ca3c6bd2ca2668a31d9f20e0 Mon Sep 17 00:00:00 2001 From: Sultan Nasir Uddin Date: Sun, 1 Jan 2023 20:22:46 +0600 Subject: [PATCH] prepare release v1.4.2 --- .eslintrc.js | 1 + .gitignore | 88 +- assets/css/settings.scss | 0 assets/js/admin-script.js | 158 +- assets/js/settings.js | 0 composer.json | 17 +- examples/api-test.php | 6 +- .../class-wc-serial-numbers-admin-menus.php | 22 - ...class-wc-serial-numbers-admin-settings.php | 135 - .../admin/class-wc-serial-numbers-admin.php | 36 - ...c-serial-numbers-serial-numbers-screen.php | 2 +- .../wc-serial-numbers-settings-general.php | 138 - .../wc-serial-numbers-settings-help.php | 38 - .../settings/wc-serials-settings-updates.php | 0 includes/class-wc-serial-numbers-ajax.php | 132 - .../class-wc-serial-numbers-installer.php | 320 -- includes/updates/update-1.0.1.php | 27 - includes/updates/update-1.0.6.php | 61 - includes/updates/update-1.0.8.php | 14 - includes/updates/update-1.1.2.php | 17 - includes/updates/update-1.2.0.php | 94 - includes/updates/update-1.2.1.php | 9 - .../wc-serial-numbers.pot | 743 +++- package-lock.json | 3734 ----------------- package.json | 6 +- phpcs.xml | 1 + src/AJAX.php | 114 + src/Admin/Admin.php | 137 + src/Admin/Menus.php | 76 + src/Admin/Notices.php | 64 + src/Admin/Settings.php | 205 + src/Installer.php | 335 ++ src/Plugin.php | 163 + src/Scripts.php | 73 + src/functions.php | 19 + tests/_support/Helper/Functional.php | 4 +- tests/wpunit/KeyTest.php | 13 - wc-serial-numbers.php | 336 +- webpack.config.js | 4 +- 39 files changed, 1895 insertions(+), 5447 deletions(-) delete mode 100644 assets/css/settings.scss delete mode 100644 assets/js/settings.js delete mode 100644 includes/admin/class-wc-serial-numbers-admin-settings.php delete mode 100644 includes/admin/settings/wc-serial-numbers-settings-general.php delete mode 100644 includes/admin/settings/wc-serial-numbers-settings-help.php delete mode 100644 includes/admin/settings/wc-serials-settings-updates.php delete mode 100644 includes/class-wc-serial-numbers-ajax.php delete mode 100644 includes/class-wc-serial-numbers-installer.php delete mode 100644 includes/updates/update-1.0.1.php delete mode 100644 includes/updates/update-1.0.6.php delete mode 100644 includes/updates/update-1.0.8.php delete mode 100644 includes/updates/update-1.1.2.php delete mode 100644 includes/updates/update-1.2.0.php delete mode 100644 includes/updates/update-1.2.1.php rename {i18n/languages => languages}/wc-serial-numbers.pot (59%) delete mode 100644 package-lock.json create mode 100644 src/AJAX.php create mode 100644 src/Admin/Admin.php create mode 100644 src/Admin/Menus.php create mode 100644 src/Admin/Notices.php create mode 100644 src/Admin/Settings.php create mode 100644 src/Installer.php create mode 100644 src/Plugin.php create mode 100644 src/Scripts.php create mode 100644 src/functions.php delete mode 100644 tests/wpunit/KeyTest.php diff --git a/.eslintrc.js b/.eslintrc.js index 2e6ac132..25cf8b90 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -8,6 +8,7 @@ module.exports = { globals: { wp: true, es6: true, + wc_serial_numbers_vars: true, }, rules: { camelcase: 0, diff --git a/.gitignore b/.gitignore index 85efa34a..a4aa2bab 100644 --- a/.gitignore +++ b/.gitignore @@ -1,54 +1,56 @@ -# Editors -project.xml -project.properties -/nbproject/private/ -.buildpath -.project -.settings* -.idea -.vscode -*.sublime-project -*.sublime-workspace -.sublimelinterrc - -# Grunt -/node_modules/ -none - -# Sass -.sass-cache/ - -# OS X metadata +# IDEs +/.settings +/.project +/.idea +*.esproj +*.tmproj +*.tmproject +tmtags +.*.sw[a-z] +*.un~ +Session.vim +*.swp + +# Mac OSX .DS_Store +._* +.Spotlight-V100 +.Trashes -# Windows junk +# Windows Thumbs.db +Desktop.ini -# ApiGen -/wc-apidocs/ +# NPM packages used by Grunt.js +node_modules +bower_components +.idea +*.log +npm-debug.log -# Behat/CLI Tests -tests/cli/installer -tests/cli/composer.phar -tests/cli/composer.lock -tests/cli/composer.json -tests/cli/vendor +# Composer +/vendor -# Unit tests +# PHPUnit /tmp -/tests/bin/tmp -/tests/e2e-tests/config/local-*.json -/tests/e2e-tests/config/local.json -# Logs -/logs +# Misc +*.zip +.cache +.sass-cache* +.husky +*.lock + +# Tests +codeception.yml +.env +/tests/_data/dump.sql +.env.testing + +# Framework +lib -# Composer -/vendor/ -contributors.md -# Screenshots for e2e tests failures -/screenshots/ +# Build +assets/dist -#build -build \ No newline at end of file diff --git a/assets/css/settings.scss b/assets/css/settings.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/assets/js/admin-script.js b/assets/js/admin-script.js index 1fc86643..06f53b6f 100644 --- a/assets/js/admin-script.js +++ b/assets/js/admin-script.js @@ -5,50 +5,89 @@ * Copyright (c) 2018 pluginever * Licensed under the GPLv2+ license. */ - -(function ($, window) { +/* global jQuery, wc_serial_numbers_vars */ +( function( $, window ) { 'use strict'; - $.wc_serial_numbers_admin = function () { - var plugin = this; - plugin.init = function () { - plugin.init_select2('.wc-serial-numbers-select-product', 'wc_serial_numbers_search_products', wc_serial_numbers_admin_i10n.i18n.search_product); - plugin.init_datepicker('.wc-serial-numbers-select-date'); - plugin.encrypt_decrypt(); - }; - plugin.init_select2 = function (el, action, placeholder) { - placeholder = placeholder || 'Select..'; - $(el).select2({ + if ( typeof wc_serial_numbers_vars === 'undefined' ) { + return false; + } + + var wc_serial_numbers_admin = { + init: function() { + this.select2( '.wc_serial_numbers_search_product', 'wc_serial_numbers_search_product' ); + $(document).on('click', '.wc-serial-numbers-decrypt-key', this.encrypt_decrypt_key); + this.init_datepicker('.wc-serial-numbers-select-date'); + }, + select2: function( el, action ) { + var $el = $( el ); + console.log($el); + if ( ! $el.length ) { + return; + } + $el.select2( { ajax: { cache: true, delay: 500, - url: window.wc_serial_numbers_admin_i10n.ajaxurl, + url: window.wc_serial_numbers_vars.ajaxurl, method: 'POST', dataType: 'json', - data: function (params) { + data( params ) { return { - action: action, - nonce: window.wc_serial_numbers_admin_i10n.nonce, + action, + nonce: window.wc_serial_numbers_vars.search_nonce, search: params.term, - page: params.page + page: params.page, }; }, - processResults: function (data, params) { - params.page = params.page || 1; - return { - results: data.results, - pagination: { - more: data.pagination.more - } - }; - } }, - placeholder: placeholder, + placeholder: $( el ).attr( 'placeholder' ), minimumInputLength: 1, - allowClear: true + allowClear: true, + } ); + $( document.body ).trigger( 'wc_serial_numbers_init_select2_' + action, { $el: $el } ); + }, + encrypt_decrypt_key: function( e ) { + e.preventDefault(); + var self = $(this); + var id = self.data('serial-id'); + var nonce = self.data('nonce') || null; + var td = self.closest('td'); + var code = td.find('.serial-key'); + var spinner = td.find('.serial-spinner'); + spinner.show(); + if (!code.hasClass('encrypted')) { + code.addClass('encrypted'); + spinner.hide(); + code.text(''); + self.text(wc_serial_numbers_vars.i18n.show); + return false; + } + wp.ajax.send('wc_serial_numbers_decrypt_key', { + data: { + serial_id: id, + nonce: nonce + }, + success: function (res) { + code.text(res.key); + spinner.hide(); + code.removeClass('encrypted'); + self.text(wc_serial_numbers_vars.i18n.hide); + }, + error: function () { + spinner.hide(); + code.text(''); + code.addClass('encrypted'); + self.text(wc_serial_numbers_vars.i18n.show); + alert('Decrypting key failed'); + } }); - }; - plugin.init_datepicker = function (el) { + }, + init_datepicker: function(el) { + // If datepicker is not defined, exit. + if ( typeof $.fn.datepicker === 'undefined' ) { + return; + } $(el).datepicker({ changeMonth: true, changeYear: true, @@ -56,57 +95,12 @@ firstDay: 7, minDate: new Date() }); - }; - - - plugin.encrypt_decrypt = function () { - //show decrypted value - $(document).on('click', '.wc-serial-numbers-decrypt-key', function (e) { - e.preventDefault(); - var self = $(this); - var id = self.data('serial-id'); - var nonce = self.data('nonce') || null; - var td = self.closest('td'); - var code = td.find('.serial-key'); - var spinner = td.find('.serial-spinner'); - spinner.show(); - if (!code.hasClass('encrypted')) { - code.addClass('encrypted'); - spinner.hide(); - code.text(''); - self.text(wc_serial_numbers_admin_i10n.i18n.show); - return false; - } - wp.ajax.send('wc_serial_numbers_decrypt_key', { - data: { - serial_id: id, - nonce: nonce - }, - success: function (res) { - code.text(res.key); - spinner.hide(); - code.removeClass('encrypted'); - self.text(wc_serial_numbers_admin_i10n.i18n.hide); - }, - error: function () { - spinner.hide(); - code.text(''); - code.addClass('encrypted'); - self.text(wc_serial_numbers_admin_i10n.i18n.show); - alert('Decrypting key failed'); - } - }); - - return false; - }); - }; - plugin.init(); - }; + } + } - //$.fn - $.fn.wc_serial_numbers_admin = function () { - return new $.wc_serial_numbers_admin(); - }; + // Initialize the script on document ready. + $( document ).ready( function() { + wc_serial_numbers_admin.init(); + } ); - $.wc_serial_numbers_admin(); -})(jQuery, window); +}( jQuery, window ) ); diff --git a/assets/js/settings.js b/assets/js/settings.js deleted file mode 100644 index e69de29b..00000000 diff --git a/composer.json b/composer.json index c2be15ca..72fc5299 100644 --- a/composer.json +++ b/composer.json @@ -14,11 +14,14 @@ { "url": "git@github.com:pluginever/framework-plugin.git", "type": "github" + }, + { + "url": "git@github.com:pluginever/framework-settings.git", + "type": "github" } ], "require": { - "php": ">=7.2", - "illuminate/database": "^8.83" + "php": ">=7.0" }, "require-dev": { "byteever/byteever-sniffs": "dev-master", @@ -34,7 +37,8 @@ "coenjacobs/mozart": "^0.7.1", "lucatume/wp-browser": "^3.1", "phpcompatibility/php-compatibility": "9.3.5", - "pluginever/framework-plugin": "dev-master" + "pluginever/framework-plugin": "dev-master", + "pluginever/framework-settings": "dev-master" }, "config": { "optimize-autoloader": true, @@ -80,12 +84,13 @@ "extra": { "mozart": { "dep_namespace": "WooCommerceSerialNumbers\\", - "dep_directory": "/src/", - "classmap_directory": "/src/classes/", + "dep_directory": "/lib/", + "classmap_directory": "/lib/classes/", "classmap_prefix": "WooCommerceSerialNumbers_", "delete_vendor_directories": true, "packages": [ - "pluginever/framework-plugin" + "pluginever/framework-plugin", + "pluginever/framework-settings" ] } } diff --git a/examples/api-test.php b/examples/api-test.php index 3a2d4d37..6b32b44e 100644 --- a/examples/api-test.php +++ b/examples/api-test.php @@ -4,9 +4,9 @@ if ( ! current_user_can( 'manage_options' ) ) die(); -// API variables, please override -$base_url = 'http://wcdevelop.test'; -$email = 'manikdrmc@gmail.com'; +// API variables, please override. +$base_url = 'http://domain.com'; +$email = 'example@domain.com'; $product_id = '24'; $license_key = 'Serial-0000000001163'; $instance = '15924263261'; diff --git a/includes/admin/class-wc-serial-numbers-admin-menus.php b/includes/admin/class-wc-serial-numbers-admin-menus.php index 42915472..e27e5dad 100644 --- a/includes/admin/class-wc-serial-numbers-admin-menus.php +++ b/includes/admin/class-wc-serial-numbers-admin-menus.php @@ -60,28 +60,6 @@ public function register_pages() { 'wc-serial-numbers-activations', array( 'WC_Serial_Numbers_Admin_Activations_Screen', 'output' ) ); - - add_submenu_page( - 'wc-serial-numbers', - __( 'Settings', 'wc-serial-numbers' ), - __( 'Settings', 'wc-serial-numbers' ), - $role, - 'wc-serial-numbers-settings', - array( 'WC_Serial_Numbers_Admin_Settings', 'output' ) - ); - - if ( ! defined( 'WC_SERIAL_NUMBER_PRO_PLUGIN_VERSION' ) ) { - add_submenu_page( - 'wc-serial-numbers', - '', - ' ' . __( 'Go Pro', 'wc-serial-numbers' ) . '', - 'edit_others_posts', - 'go_wcsn_pro', - array( $this, 'go_pro_redirect' ) - ); - } - - add_action( 'load-' . $serial_number_page, array( $this, 'load_serial_numbers_page' ) ); } diff --git a/includes/admin/class-wc-serial-numbers-admin-settings.php b/includes/admin/class-wc-serial-numbers-admin-settings.php deleted file mode 100644 index f1f42045..00000000 --- a/includes/admin/class-wc-serial-numbers-admin-settings.php +++ /dev/null @@ -1,135 +0,0 @@ -plugin_path() . '/includes/admin/class-wc-admin-settings.php' ); - -class WC_Serial_Numbers_Admin_Settings extends WC_Admin_Settings { - private static $settings = array(); - private static $errors = array(); - private static $messages = array(); - - /** - * Include the settings page classes - */ - public static function get_settings_pages() { - if ( empty( self::$settings ) ) { - $settings = array(); - - include_once( WC()->plugin_path() . '/includes/admin/settings/class-wc-settings-page.php' ); - - $settings[] = include( 'settings/wc-serial-numbers-settings-general.php' ); - $settings[] = include( 'settings/wc-serial-numbers-settings-help.php' ); - - self::$settings = apply_filters( 'wc_serial_numbers_get_settings_pages', $settings ); - } - - return self::$settings; - } - - - /** - * Save the settings - */ - public static function save() { - global $current_section, $current_tab; - - if ( empty( $_REQUEST['_wpnonce'] ) || ! wp_verify_nonce( $_REQUEST['_wpnonce'], 'wc-serial-numbers-settings' ) ) { - die( __( 'Action failed. Please refresh the page and retry.', 'wc-serial-numbers' ) ); - } - - // Trigger actions - do_action( 'wc_serial_numbers_settings_save_' . $current_tab ); - do_action( 'wc_serial_numbers_update_options_' . $current_tab ); - do_action( 'wc_serial_numbers_update_options' ); - - self::add_message( __( 'Your settings have been saved.', 'wc-serial-numbers' ) ); - - // Re-add endpoints and flush rules - WC()->query->init_query_vars(); - WC()->query->add_endpoints(); - flush_rewrite_rules(); - - do_action( 'wc_serial_numbers_settings_saved' ); - } - - /** - * Add a message - * - * @param string $text - */ - public static function add_message( $text ) { - self::$messages[] = $text; - } - - /** - * Add an error - * - * @param string $text - */ - public static function add_error( $text ) { - self::$errors[] = $text; - } - - /** - * Output messages + errors - */ - public static function show_messages() { - if ( sizeof( self::$errors ) > 0 ) { - foreach ( self::$errors as $error ) { - echo '

' . esc_html( $error ) . '

'; - } - } elseif ( sizeof( self::$messages ) > 0 ) { - foreach ( self::$messages as $message ) { - echo '

' . esc_html( $message ) . '

'; - } - } - } - - /** - * Settings page. - * - * Handles the display of the main settings page in admin. - * - * @access public - * @return void - */ - public static function output() { - global $current_section, $current_tab; - - wp_enqueue_script( 'woocommerce_settings', WC()->plugin_url() . '/assets/js/admin/settings.min.js', array( 'jquery', 'jquery-ui-datepicker', 'jquery-ui-sortable', 'iris' ), WC()->version, true ); - - wp_localize_script( 'woocommerce_settings', 'woocommerce_settings_params', array( - 'i18n_nav_warning' => __( 'The changes you made will be lost if you navigate away from this page.', 'wc-serial-numbers' ) - ) ); - - // Include settings pages - self::get_settings_pages(); - - // Get current tab/section - $current_tab = empty( $_GET['tab'] ) ? 'general' : sanitize_title( $_GET['tab'] ); - $current_section = empty( $_REQUEST['section'] ) ? '' : sanitize_title( $_REQUEST['section'] ); - - // Save settings if data has been posted - if ( ! empty( $_POST ) ) { - self::save(); - } - - // Add any posted messages - if ( ! empty( $_GET['wc_error'] ) ) { - self::add_error( stripslashes( $_GET['wc_error'] ) ); - } - - if ( ! empty( $_GET['wc_message'] ) ) { - self::add_message( stripslashes( $_GET['wc_message'] ) ); - } - - self::show_messages(); - - // Get tabs for the settings page - $tabs = apply_filters( 'wc_serial_numbers_settings_tabs_array', array() ); - - include 'views/html-admin-settings.php'; - } - - -} diff --git a/includes/admin/class-wc-serial-numbers-admin.php b/includes/admin/class-wc-serial-numbers-admin.php index 5200c7de..b14497a4 100644 --- a/includes/admin/class-wc-serial-numbers-admin.php +++ b/includes/admin/class-wc-serial-numbers-admin.php @@ -8,7 +8,6 @@ class WC_Serial_Numbers_Admin { */ public function __construct() { add_action( 'init', array( __CLASS__, 'includes' ) ); - add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts' ) ); add_action( 'admin_head', array( __CLASS__, 'print_style' ) ); add_filter( 'manage_edit-shop_order_columns', array( __CLASS__, 'add_order_serial_column' ) ); add_action( 'manage_shop_order_posts_custom_column', array( __CLASS__, 'add_order_serial_column_content' ), 20, 2 ); @@ -20,7 +19,6 @@ public function __construct() { */ public static function includes() { require_once dirname( __FILE__ ) . '/class-wc-serial-numbers-admin-metaboxes.php'; - require_once dirname( __FILE__ ) . '/class-wc-serial-numbers-admin-settings.php'; require_once dirname( __FILE__ ) . '/class-wc-serial-numbers-admin-menus.php'; require_once dirname( __FILE__ ) . '/class-wc-serial-numbers-admin-notice.php'; require_once dirname( __FILE__ ) . '/class-wc-serial-numbers-admin-actions.php'; @@ -28,40 +26,6 @@ public static function includes() { require_once dirname( __FILE__ ) . '/screen/class-wc-serial-numbers-serial-numbers-screen.php'; } - /** - * Enqueue admin related assets - * - * @param $hook - * - * @since 1.2.0 - */ - public function admin_scripts( $hook ) { - if ( ! wc_serial_numbers()->is_wc_active() ) { - return; - } - - $css_url = wc_serial_numbers()->plugin_url() . '/assets/css'; - $js_url = wc_serial_numbers()->plugin_url() . '/assets/js'; - $version = wc_serial_numbers()->get_version(); - - - wp_enqueue_style( 'wc-serial-numbers-admin', $css_url . '/wc-serial-numbers-admin.css', array( 'woocommerce_admin_styles', 'jquery-ui-style' ), $version ); - wp_enqueue_style( 'jquery-ui-style' ); - wp_enqueue_style( 'select2' ); - wp_enqueue_script( 'jquery-ui-datepicker' ); - wp_enqueue_script( 'wc-serial-numbers-admin', $js_url . '/wc-serial-numbers-admin.js', [ 'jquery', 'wp-util', 'select2', ], $version, true ); - - wp_localize_script( 'wc-serial-numbers-admin', 'wc_serial_numbers_admin_i10n', array( - 'i18n' => array( - 'search_product' => __( 'Search product by name', 'wc-serial-numbers' ), - 'search_order' => __( 'Search order', 'wc-serial-numbers' ), - 'show' => __( 'Show', 'wc-serial-numbers' ), - 'hide' => __( 'Hide', 'wc-serial-numbers' ), - ), - 'nonce' => wp_create_nonce( 'wc_serial_numbers_admin_js_nonce' ), - 'ajaxurl' => admin_url( 'admin-ajax.php' ), - ) ); - } /** * @param $columns diff --git a/includes/admin/screen/class-wc-serial-numbers-serial-numbers-screen.php b/includes/admin/screen/class-wc-serial-numbers-serial-numbers-screen.php index 5e74334b..d0c272a5 100644 --- a/includes/admin/screen/class-wc-serial-numbers-serial-numbers-screen.php +++ b/includes/admin/screen/class-wc-serial-numbers-serial-numbers-screen.php @@ -73,7 +73,7 @@ public static function render_add( $action ) { diff --git a/includes/admin/settings/wc-serial-numbers-settings-general.php b/includes/admin/settings/wc-serial-numbers-settings-general.php deleted file mode 100644 index 5298eef3..00000000 --- a/includes/admin/settings/wc-serial-numbers-settings-general.php +++ /dev/null @@ -1,138 +0,0 @@ -id = 'general'; - $this->label = __( 'General', 'wc-serial-numbers' ); - - add_filter( 'wc_serial_numbers_settings_tabs_array', array( $this, 'add_settings_page' ), 20 ); - add_action( 'wc_serial_numbers_settings_' . $this->id, array( $this, 'output' ) ); - add_action( 'wc_serial_numbers_settings_save_' . $this->id, array( $this, 'save' ) ); - } - - /** - * Get settings array - * - * @return array - */ - public function get_settings() { - global $woocommerce, $wp_roles; - $settings = array( - [ - 'title' => __( 'General settings', 'wc-serial-numbers' ), - 'type' => 'title', - 'desc' => __( 'The following options affect how the serial numbers will work.', 'wc-serial-numbers' ), - 'id' => 'section_serial_numbers' - ], - [ - 'title' => __( 'Auto-complete order', 'wc-serial-numbers' ), - 'id' => 'wc_serial_numbers_autocomplete_order', - 'desc' => __( 'Automatically completes orders after successfull payments.', 'wc-serial-numbers' ), - 'type' => 'checkbox', - 'default' => 'no', - ], - [ - 'title' => __( 'Reuse serial number', 'wc-serial-numbers' ), - 'id' => 'wc_serial_numbers_reuse_serial_number', - 'desc' => __( 'Recover failed, refunded serial numbers for selling again.', 'wc-serial-numbers' ), - 'type' => 'checkbox', - ], - [ - 'title' => __( 'Revoke status', 'wc-serial-numbers' ), - 'desc' => __( 'Cancelled', 'wc-serial-numbers' ), - 'id' => 'wc_serial_numbers_revoke_status_cancelled', - 'default' => 'yes', - 'type' => 'checkbox', - 'checkboxgroup' => 'start', - 'show_if_checked' => 'option', - ], - [ - 'desc' => __( 'Refunded', 'wc-serial-numbers' ), - 'id' => 'wc_serial_numbers_revoke_status_refunded', - 'default' => 'yes', - 'type' => 'checkbox', - 'checkboxgroup' => '', - - ], - [ - 'desc' => __( 'Failed', 'wc-serial-numbers' ), - 'id' => 'wc_serial_numbers_revoke_status_failed', - 'default' => 'yes', - 'type' => 'checkbox', - 'checkboxgroup' => 'end', - - ], - [ - 'title' => __( 'Hide serial number', 'wc-serial-numbers' ), - 'id' => 'wc_serial_numbers_hide_serial_number', - 'desc' => __( 'All serial numbers will be hidden and only displayed when the "Show" button is clicked.', 'wc-serial-numbers' ), - 'default' => 'yes', - 'type' => 'checkbox', - ], - [ - 'title' => __( 'Disable software support', 'wc-serial-numbers' ), - 'id' => 'wc_serial_numbers_disable_software_support', - 'desc' => __( 'Disable Software Licensing support & API functionalities.', 'wc-serial-numbers' ), - 'default' => 'yes', - 'type' => 'checkbox', - ], - [ - 'type' => 'sectionend', - 'id' => 'section_serial_numbers' - ], - [ - 'title' => __( 'Stock notification', 'wc-serial-numbers' ), - 'type' => 'title', - 'desc' => __( 'The following options affects how stock notification will work.', 'wc-serial-numbers' ), - 'id' => 'stock_section' - ], - [ - 'title' => __( 'Stock notification email', 'wc-serial-numbers' ), - 'id' => 'wc_serial_numbers_enable_stock_notification', - 'desc' => __( 'Sends notification emails when product stock is low.', 'wc-serial-numbers' ), - 'type' => 'checkbox', - 'sanitize_callback' => 'intval', - ], - array( - 'title' => __( 'Stock threshold', 'wc-serial-numbers' ), - 'id' => 'wc_serial_numbers_stock_threshold', - 'desc' => __( 'When stock goes below the above number, it will send notification email.', 'wc-serial-numbers' ), - 'type' => 'number', - 'default' => '5', - ), - array( - 'title' => __( 'Notification recipient email', 'wc-serial-numbers' ), - 'id' => 'wc_serial_numbers_notification_recipient', - 'desc' => __( 'The email address to be used for sending the email notifications.', 'wc-serial-numbers' ), - 'type' => 'text', - 'default' => get_option( 'admin_email' ), - ), - [ - 'type' => 'sectionend', - 'id' => 'stock_section' - ], - ); - - return apply_filters( 'wc_serial_numbers_general_settings_fields', $settings ); - } - - /** - * Save settings - */ - public function save() { - $settings = $this->get_settings(); - WC_Serial_Numbers_Admin_Settings::save_fields( $settings ); - } - } - -endif; - -return new WC_Serial_Numbers_Settings_General(); diff --git a/includes/admin/settings/wc-serial-numbers-settings-help.php b/includes/admin/settings/wc-serial-numbers-settings-help.php deleted file mode 100644 index c02e70ff..00000000 --- a/includes/admin/settings/wc-serial-numbers-settings-help.php +++ /dev/null @@ -1,38 +0,0 @@ -id = 'help'; - $this->label = __( 'Help', 'wc-serial-numbers' ); - add_filter('wc_serial_numbers_settings_tabs_array', array($this, 'add_settings_page'), 99); - add_action('wc_serial_numbers_settings_' . $this->id, array($this, 'output')); - add_action('wc_serial_numbers_settings_save_' . $this->id, array($this, 'save')); - } - - public function output() { - $GLOBALS['hide_save_button'] = true; - include dirname( __DIR__ ) . '/views/html-admin-help.php'; - } - - public function save() { - - } -} - -return new WC_Serial_Numbers_Settings_Help(); diff --git a/includes/admin/settings/wc-serials-settings-updates.php b/includes/admin/settings/wc-serials-settings-updates.php deleted file mode 100644 index e69de29b..00000000 diff --git a/includes/class-wc-serial-numbers-ajax.php b/includes/class-wc-serial-numbers-ajax.php deleted file mode 100644 index eaafe501..00000000 --- a/includes/class-wc-serial-numbers-ajax.php +++ /dev/null @@ -1,132 +0,0 @@ -verify_nonce( 'wc_serial_numbers_admin_js_nonce', 'nonce' ); - $this->check_permission(); - $search = isset( $_REQUEST['search'] ) ? sanitize_text_field( $_REQUEST['search'] ) : ''; - $page = isset( $_REQUEST['page'] ) ? absint( $_REQUEST['page'] ) : 1; - $types = apply_filters( 'wc_serial_numbers_product_types', array( 'product' ) ); - global $wpdb; - $query = WC_Serial_Numbers_Query::init()->table( 'posts' ) - ->where( 'post_status', 'publish' ) - ->whereRaw( 'post_type IN ("' . implode( '","', $types ) . '")' ) - ->whereRaw( "ID NOT IN (SELECT DISTINCT post_parent FROM {$wpdb->posts} WHERE post_type='product_variation') " ) - ->search( sanitize_text_field( $search ), array( 'post_title' ) ) - ->page( $page ); - $more = false; - if ( $query->count() > ( 20 * $page ) ) { - $more = true; - } - $product_ids = $query->column( 0 ); - $results = array(); - foreach ( $product_ids as $product_id ) { - $product = wc_get_product( $product_id ); - - if ( ! $product ) { - continue; - } - - $text = sprintf( - '(#%1$s) %2$s', - $product->get_id(), - strip_tags( $product->get_formatted_name() ) - ); - - $results[] = array( - 'id' => $product->get_id(), - 'text' => $text - ); - } - wp_send_json( - array( - 'page' => $page, - 'results' => $results, - 'pagination' => array( - 'more' => $more - ) - ) - ); - } - - /** - * Decrypt key - * @since 1.2.0 - */ - public function decrypt_key() { - $this->verify_nonce( 'wc_serial_numbers_decrypt_key', 'nonce' ); - $this->check_permission(); - $serial_id = isset( $_REQUEST['serial_id'] ) ? sanitize_text_field( $_REQUEST['serial_id'] ) : ''; - if ( empty( $serial_id ) ) { - $this->send_error( [ 'message' => __( 'Could not detect the serial number to decrypt', 'wc-serial-numbers' ) ] ); - } - - $serial_number = wc_serial_numbers_get_serial_number( $serial_id ); - if ( empty( $serial_number ) ) { - $this->send_error( [ 'message' => __( 'Could not find the serial number to decrypt', 'wc-serial-numbers' ) ] ); - } - - $this->send_success( [ 'key' => wc_serial_numbers_decrypt_key( $serial_number->serial_key ) ] ); - - } - - /** - * Check permission - * - * since 1.0.0 - */ - public function check_permission() { - if ( ! current_user_can( 'manage_woocommerce' ) ) { - self::send_error( __( 'Error: You are not allowed to do this.', 'wc-serial-numbers' ) ); - } - } - - /** - * Verify nonce request - * since 1.0.0 - * - * @param $action - */ - public function verify_nonce( $action, $field = '_wpnonce' ) { - if ( ! isset( $_REQUEST[ $field ] ) || ! wp_verify_nonce( $_REQUEST[ $field ], $action ) ) { - self::send_error( __( 'Error: Nonce verification failed', 'wc-serial-numbers' ) ); - } - } - - /** - * Wrapper function for sending success response - * since 1.0.0 - * - * @param null $data - */ - public function send_success( $data = null ) { - wp_send_json_success( $data ); - } - - /** - * Wrapper function for sending error - * since 1.0.0 - * - * @param null $data - */ - public function send_error( $data = null ) { - wp_send_json_error( $data ); - } -} - -new WC_Serial_Numbers_AJAX(); diff --git a/includes/class-wc-serial-numbers-installer.php b/includes/class-wc-serial-numbers-installer.php deleted file mode 100644 index 1cac880e..00000000 --- a/includes/class-wc-serial-numbers-installer.php +++ /dev/null @@ -1,320 +0,0 @@ - 'update-1.0.1.php', - '1.0.6' => 'update-1.0.6.php', - '1.0.8' => 'update-1.0.8.php', - '1.1.2' => 'update-1.1.2.php', - '1.2.0' => 'update-1.2.0.php', - '1.2.1' => 'update-1.2.1.php', - ); - - /** - * Current plugin version. - * - * @since 1.2.0 - * @var string - */ - private static $current_version; - - /** - * Installer constructor. - */ - public static function init() { - //Get plugin version - self::$current_version = get_option( 'wc_serial_numbers_version', null ); - - // Installation and DB updates handling. - add_action( 'init', array( __CLASS__, 'maybe_install' ) ); - add_action( 'admin_init', array( __CLASS__, 'maybe_update' ) ); - - // Show row meta on the plugin screen. - add_filter( 'plugin_row_meta', array( __CLASS__, 'plugin_row_meta' ), 10, 2 ); - add_filter( 'plugin_action_links_wc-serial-numbers/wc-serial-numbers.php', array( __CLASS__, 'action_links' ) ); - - //cron actions - add_filter( 'cron_schedules', array( __CLASS__, 'custom_cron_schedules' ), 20 ); - - } - - /** - * Installation possible? - * - * @return boolean - * @since 1.1.6 - * - */ - private static function can_install() { - return ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) && ! defined( 'IFRAME_REQUEST' ) && ! 'yes' === get_transient( 'wc_serial_numbers_installing' ); - } - - /** - * Installation needed? - * - * @return boolean - * @since 1.1.6 - * - */ - private static function should_install() { - return empty( get_option( 'woocommerceserialnumbers_version' ) ) && empty( 'wc_serial_numbers_version' ); - } - - /** - * Check version and run the installer if necessary. - * - * @since 1.1.6 - */ - public static function maybe_install() { - if ( self::can_install() && self::should_install() ) { - self::install(); - } - } - - /** - * Install Plugin. - */ - public static function install() { - if ( ! is_blog_installed() ) { - return; - } - - // Running for the first time? Set a transient now. Used in 'can_install' to prevent race conditions. - set_transient( 'wc_serial_numbers_installing', 'yes', 10 ); - - // Create tables. - self::create_tables(); - $settings = array( - 'wc_serial_numbers_autocomplete_order' => 'yes', - 'wc_serial_numbers_reuse_serial_number' => 'no', - 'wc_serial_numbers_disable_software_support' => 'no', - 'wc_serial_numbers_enable_stock_notification' => 'yes', - 'wc_serial_numbers_hide_serial_number' => 'yes', - 'wc_serial_numbers_revoke_status_failed' => 'yes', - 'wc_serial_numbers_revoke_status_refunded' => 'yes', - 'wc_serial_numbers_revoke_status_cancelled' => 'yes', - 'wc_serial_numbers_stock_threshold' => '5', - 'wc_serial_numbers_notification_recipient' => get_option( 'admin_email' ), - ); - - foreach ( $settings as $key => $value ) { - if ( empty( get_option( $key ) ) ) { - update_option( $key, $value ); - } - } - - //setup transient actions - if ( false === wp_next_scheduled( 'wc_serial_numbers_hourly_event' ) ) { - wp_schedule_event( time(), 'hourly', 'wc_serial_numbers_hourly_event' ); - } - - if ( false === wp_next_scheduled( 'wc_serial_numbers_daily_event' ) ) { - wp_schedule_event( time(), 'daily', 'wc_serial_numbers_daily_event' ); - } - - // Update plugin version - once set, 'maybe_install' will not call 'install' again. - self::update_version(); - } - - /** - * Set up the database tables which the plugin needs to function. - * - * Tables: - * wcsn_serial_numbers - * wcsn_activations - */ - private static function create_tables() { - global $wpdb; - $wpdb->hide_errors(); - require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); - $tables = self::get_schema(); - - foreach ( $tables as $table ) { - dbDelta( $table ); - } - } - - /** - * Get table schema. - * - * @return array - */ - private static function get_schema() { - global $wpdb; - $schema = [ - "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}serial_numbers( - id bigint(20) NOT NULL AUTO_INCREMENT, - serial_key longtext DEFAULT NULL, - product_id bigint(20) NOT NULL, - activation_limit int(9) NOT NULL DEFAULT 0, - activation_count int(9) NOT NULL DEFAULT 0, - order_id bigint(20) DEFAULT NULL, - vendor_id bigint(20) DEFAULT NULL, - status varchar(50) DEFAULT 'available', - validity varchar(200) DEFAULT NULL, - expire_date DATETIME NULL DEFAULT NULL, - order_date DATETIME NULL DEFAULT NULL, - source varchar(50) DEFAULT 'custom_source', - created_date DATETIME NULL DEFAULT NULL, - PRIMARY KEY (id), - key product_id (product_id), - key order_id (order_id), - key vendor_id (vendor_id), - key activation_limit (activation_limit), - key status (status) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ", - "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}serial_numbers_activations( - id bigint(20) NOT NULL auto_increment, - serial_id bigint(20) NOT NULL, - instance varchar(200) NOT NULL, - active int(1) NOT NULL DEFAULT 1, - platform varchar(200) DEFAULT NULL, - activation_time DATETIME NULL DEFAULT NULL, - PRIMARY KEY (id), - key serial_id (serial_id), - key active (active) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8;" - ]; - - return $schema; - } - - /** - * Update plugin version to current. - */ - private static function update_version() { - delete_option( 'wc_serial_numbers_version' ); - add_option( 'wc_serial_numbers_version', wc_serial_numbers()->get_version() ); - } - - - /** - * Show row meta on the plugin screen. - * - * @param mixed $links - * @param mixed $file - * - * @return array - */ - public static function plugin_row_meta( $links, $file ) { - - if ( $file == wc_serial_numbers()->plugin_basename() ) { - $row_meta = array( - 'docs' => '' . __( 'Documentation', 'wc-serial-numbers' ) . '', - ); - - if ( wc_serial_numbers()->is_pro_active() ) { - unset( $row_meta['upgrade'] ); - } - - return array_merge( $links, $row_meta ); - } - - return $links; - } - - /** - * Perform all the necessary upgrade routines. - * - * @return bool - * @since 1.0.0 - */ - public static function maybe_update() { - $key = 'woocommerceserialnumbers_version'; - $installed_version = get_option( $key ); - - // may be it's the first install - if ( ! $installed_version ) { - return false; - } - - if ( version_compare( $installed_version, wc_serial_numbers()->get_version(), '<' ) ) { - $path = trailingslashit( dirname( __FILE__ ) . '/updates' ); - - foreach ( self::$updates as $version => $file ) { - if ( version_compare( $installed_version, $version, '<' ) ) { - include $path . $file; - update_option( $key, $version ); - } - } - - delete_option( $key ); - update_option( $key, wc_serial_numbers()->get_version() ); - update_option( 'wc_serial_numbers_version', wc_serial_numbers()->get_version() ); - } - - return true; - } - - /** - * Add custom cron schedule - * - * @param $schedules - * - * @return array - * @since 1.0.0 - * - */ - public static function custom_cron_schedules( $schedules ) { - $schedules ['once_a_minute'] = array( - 'interval' => 60, - 'display' => __( 'Once a Minute', 'wc-serial-numbers' ) - ); - - return $schedules; - } - - - /** - * Get all tables. - * - * @return string[] - * @since 1.2.0 - */ - public static function get_tables() { - global $wpdb; - - $tables = array( - "{$wpdb->prefix}serial_numbers", - "{$wpdb->prefix}serial_numbers_activations", - ); - - return $tables; - } - - /** - * Plugin action links - * - * @param array $links - * - * @return array - */ - public static function action_links( $links ) { - $action_links = array( - 'settings' => '' . esc_html__( 'Settings', 'wc-serial-numbers' ) . '', - ); - - $links = array_merge( $action_links, $links ); - - if ( ! wc_serial_numbers()->is_pro_active() ) { - $upgrade_link = 'https://www.pluginever.com/plugins/woocommerce-serial-numbers-pro'; - $upgrade_links = array( - 'upgrade' => '' . __( 'Go Pro', 'wc-serial-numbers' ) . '', - ); - - $links = array_merge( $links, $upgrade_links ); - } - - return $links; - } - -} - -WC_Serial_Numbers_Installer::init(); diff --git a/includes/updates/update-1.0.1.php b/includes/updates/update-1.0.1.php deleted file mode 100644 index a95b20b6..00000000 --- a/includes/updates/update-1.0.1.php +++ /dev/null @@ -1,27 +0,0 @@ - 'wsn_serial_number', - 'nopaging' => true, - ) ); - - foreach ( $serial_numbers as $post ) { - $validity = get_post_meta( $post->ID, 'validity', true ); - $order = get_post_meta( $post->ID, 'order', true ); - $data = array( - 'serial_key' => $post->post_title, - 'license_image' => ! empty( $_POST['license_image'] ) ? sanitize_text_field( $_POST['license_image'] ) : '', - 'product_id' => get_post_meta( $post->ID, 'product', true ), - 'activation_limit' => get_post_meta( $post->ID, 'max_instance', true ), - 'validity' => is_numeric( $validity ) ? $validity : 0, - 'expire_date' => is_string( $validity ) && ( strtotime( $validity ) > strtotime( '2019-01-01' ) ) ? date( 'Y-m-d', strtotime( $validity ) ) : 0, - 'status' => empty( intval( $order ) ) ? 'new' : 'active', - 'order_id' => intval( $order ), - ); - wcsn()->serial_number->insert( $data ); - } -} - -wcsn_update_1_0_1(); diff --git a/includes/updates/update-1.0.6.php b/includes/updates/update-1.0.6.php deleted file mode 100644 index 1e403e16..00000000 --- a/includes/updates/update-1.0.6.php +++ /dev/null @@ -1,61 +0,0 @@ -has_cap( 'collation' ) ) { - if ( ! empty( $wpdb->charset ) ) { - $collate .= "DEFAULT CHARACTER SET $wpdb->charset"; - } - if ( ! empty( $wpdb->collate ) ) { - $collate .= " COLLATE $wpdb->collate"; - } - } - - $tables = [ - "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}wcsn_tmp_serial_numbers( - id bigint(20) NOT NULL AUTO_INCREMENT, - serial_key longtext DEFAULT NULL, - serial_image varchar(200) DEFAULT NULL, - product_id bigint(20) NOT NULL, - activation_limit int(9) NULL, - order_id bigint(20) NOT NULL DEFAULT 0, - activation_email varchar(200) DEFAULT NULL, - status varchar(50) DEFAULT 'available', - validity varchar(200) DEFAULT NULL, - expire_date DATETIME DEFAULT '0000-00-00 00:00:00' NOT NULL, - order_date DATETIME DEFAULT '0000-00-00 00:00:00' NOT NULL, - created DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, - PRIMARY KEY (id) - ) $collate;", - ]; - - require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); - - foreach ( $tables as $table ) { - dbDelta( $table ); - } - - - - $serial_numbers = wcsn_get_serial_numbers( array( - 'number' => -1, - ) ); - foreach( $serial_numbers as $serial_number ) { - wcsn()->tmp_serial_number->insert( $serial_number ); - } - foreach( $serial_numbers as $serial_number ) { - $serial_number = (array) $serial_number; - - if ( ! empty( $serial_number['serial_key'] ) ) { - $serial_number['serial_key'] = wcsn_encrypt( $serial_number['serial_key'] ); - } - - wcsn()->serial_number->update( $serial_number['id'], $serial_number ); - } -} - -wcsn_update_1_0_6(); \ No newline at end of file diff --git a/includes/updates/update-1.0.8.php b/includes/updates/update-1.0.8.php deleted file mode 100644 index ba0a8537..00000000 --- a/includes/updates/update-1.0.8.php +++ /dev/null @@ -1,14 +0,0 @@ -query( "ALTER TABLE {$wpdb->prefix}wcsn_serial_numbers ADD KEY product_id(`product_id`)" ); - $wpdb->query( "ALTER TABLE {$wpdb->prefix}wcsn_serial_numbers ADD KEY order_id (`order_id`)" ); - $wpdb->query( "ALTER TABLE {$wpdb->prefix}wcsn_serial_numbers ADD KEY status (`status`)" ); - - $wpdb->query( "ALTER TABLE {$wpdb->prefix}wcsn_serial_numbers CHANGE expire_date expire_date DATETIME DEFAULT NULL" ); - $wpdb->query( "ALTER TABLE {$wpdb->prefix}wcsn_serial_numbers CHANGE order_date order_date DATETIME DEFAULT NULL" ); - $wpdb->query( "UPDATE {$wpdb->prefix}wcsn_serial_numbers set expire_date=NULL WHERE expire_date='0000-00-00 00:00:00'" ); - $wpdb->query( "UPDATE {$wpdb->prefix}wcsn_serial_numbers set order_date=NULL WHERE order_date='0000-00-00 00:00:00'" ); - - $wpdb->query( "ALTER TABLE {$wpdb->prefix}wcsn_activations ADD KEY serial_id (`serial_id`)" ); - -} - -wcsn_update_1_1_2(); diff --git a/includes/updates/update-1.2.0.php b/includes/updates/update-1.2.0.php deleted file mode 100644 index 026ca380..00000000 --- a/includes/updates/update-1.2.0.php +++ /dev/null @@ -1,94 +0,0 @@ -prefix; - $wpdb->query( "RENAME TABLE `{$prefix}wcsn_serial_numbers` TO `{$prefix}serial_numbers`" ); - $wpdb->query( "RENAME TABLE `{$prefix}wcsn_activations` TO `{$prefix}serial_numbers_activations`" ); - - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers DROP COLUMN `serial_image`;" ); - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers DROP COLUMN `activation_email`;" ); - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers CHANGE `created` `created_date` DATETIME NULL DEFAULT NULL;" ); - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers ADD vendor_id bigint(20) NOT NULL DEFAULT 0" ); - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers ADD activation_count int(9) NOT NULL DEFAULT 0" ); - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers ADD KEY vendor_id(`vendor_id`)" ); - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers ADD source varchar(200) NOT NULL default 'custom_source'" ); - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers_activations CHANGE platform platform varchar(200) DEFAULT NULL" ); - //status update - $wpdb->query( $wpdb->prepare( "UPDATE {$prefix}serial_numbers set status=%s WHERE status=%s AND order_id=0", 'available', 'new' ) ); - $wpdb->query( $wpdb->prepare( "UPDATE {$prefix}serial_numbers set status=%s WHERE status=%s AND order_id != 0", 'sold', 'active' ) ); - $wpdb->query( $wpdb->prepare( "UPDATE {$prefix}serial_numbers set status=%s WHERE status=%s", 'cancelled', 'pending' ) ); - $wpdb->query( $wpdb->prepare( "UPDATE {$prefix}serial_numbers set status=%s WHERE status=%s", 'cancelled', 'rejected' ) ); - global $current_user; - if ( ! empty( $current_user->ID ) && current_user_can( 'manage_options' ) ) { - $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->prefix}serial_numbers set vendor_id=%d", $current_user->ID ) ); - } - - $activations = $wpdb->get_results( "select serial_id, count(id) as active_count from {$wpdb->prefix}serial_numbers_activations where active='1' GROUP BY serial_id" ); - foreach ( $activations as $activation ) { - global $wpdb; - $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->prefix}serial_numbers SET activation_count = %d WHERE id=%d", intval( $activation->active_count ), intval( $activation->serial_id ) ) ); - } - - $wpdb->query( "UPDATE {$wpdb->prefix}serial_numbers set status='available', order_date='0000-00-00 00:00:00', order_id='0' WHERE status !='available' AND order_id='0' AND expire_date='0000-00-00 00:00:00'" ); - - //settings update - $heading_text = wcsn_update_1_2_0_get_option( 'heading_text', 'Serial Numbers', 'wsn_delivery_settings' ); - $serial_col_heading = wcsn_update_1_2_0_get_option( 'table_column_heading', 'Serial Number', 'wsn_delivery_settings' ); - $serial_key_label = wcsn_update_1_2_0_get_option( 'serial_key_label', 'Serial Number', 'wsn_delivery_settings' ); - $serial_email_label = wcsn_update_1_2_0_get_option( 'serial_email_label', 'Activation Email', 'wsn_delivery_settings' ); - $show_validity = 'yes' == wcsn_update_1_2_0_get_option( 'show_validity', 'yes', 'wsn_delivery_settings' ); - $show_activation_limit = 'yes' == wcsn_update_1_2_0_get_option( 'show_activation_limit', 'yes', 'wsn_delivery_settings' ); - $license = get_option( 'woocommerce_serial_numbers_pro_pluginever_license' ); - $options = [ - 'wc_serial_numbers_autocomplete_order' => wcsn_update_1_2_0_get_option( 'wsn_auto_complete_order', 'yes', 'wsn_delivery_settings' ), - 'wc_serial_numbers_reuse_serial_number' => wcsn_update_1_2_0_get_option( 'wsn_re_use_serial', 'no', 'wsn_delivery_settings' ), - 'wc_serial_numbers_disable_software_support' => 'no', - 'wc_serial_numbers_manual_delivery' => 'no', - 'wc_serial_numbers_hide_serial_number' => 'yes', - 'wc_serial_numbers_revoke_status_cancelled' => in_array( 'cancelled', wcsn_update_1_2_0_get_option( 'wsn_revoke_serial_number', [], 'wsn_delivery_settings' ) ) ? 'yes' : 'no', - 'wc_serial_numbers_revoke_status_refunded' => in_array( 'refunded', wcsn_update_1_2_0_get_option( 'wsn_revoke_serial_number', [], 'wsn_delivery_settings' ) ) ? 'yes' : 'no', - 'wc_serial_numbers_revoke_status_failed' => in_array( 'failed', wcsn_update_1_2_0_get_option( 'wsn_revoke_serial_number', [], 'wsn_delivery_settings' ) ) ? 'yes' : 'no', - 'wc_serial_numbers_enable_stock_notification' => wcsn_update_1_2_0_get_option( 'wsn_admin_bar_notification_send_email', 'yes', 'wsn_notification_settings' ), - 'wc_serial_numbers_stock_threshold' => wcsn_update_1_2_0_get_option( 'wsn_admin_bar_notification_number', '5', 'wsn_notification_settings' ), - 'wc_serial_numbers_notification_recipient' => wcsn_update_1_2_0_get_option( 'wsn_admin_bar_notification_email', get_option( 'admin_email' ), 'wsn_notification_settings' ), - 'wc_serial_numbers_order_table_heading' => $heading_text, - 'wc_serial_numbers_order_table_col_product_label' => 'Product', - 'wc_serial_numbers_order_table_col_key_label' => $serial_key_label, - 'wc_serial_numbers_order_table_col_email_label' => $serial_email_label, - 'wc_serial_numbers_order_table_col_limit_label' => 'Activation Limit', - 'wc_serial_numbers_order_table_col_expires_label' => 'Expire Date', - 'wc_serial_numbers_order_table_col_product' => 'yes', - 'wc_serial_numbers_order_table_col_key' => 'yes', - 'wc_serial_numbers_order_table_col_email' => 'no', - 'wc_serial_numbers_order_table_col_limit' => $show_activation_limit ? 'yes' : 'no', - 'wc_serial_numbers_order_table_col_expires' => $show_validity ? 'yes' : 'no', - 'wc_serial_numbers_install_time' => get_option( 'woocommerceserialnumbers_install_time' ), - 'woocommerce-serial-numbers-pro_license_key' => array_key_exists( 'key', $license ) ? $license['key'] : '', - 'woocommerce-serial-numbers-pro_license_status' => array_key_exists( 'license', $license ) ? $license['license'] : '', - ]; - foreach ( $options as $key => $option ) { - update_option( $key, $option ); - } - -} - -wcsn_update_1_2_0(); - -function wcsn_update_1_2_0_get_option( $key, $default = '', $section = 'serial_numbers_settings' ) { - $settings = get_option( $section, [] ); - - return ! empty( $settings[ $key ] ) ? $settings[ $key ] : $default; -} diff --git a/includes/updates/update-1.2.1.php b/includes/updates/update-1.2.1.php deleted file mode 100644 index a7962864..00000000 --- a/includes/updates/update-1.2.1.php +++ /dev/null @@ -1,9 +0,0 @@ -prefix; - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers CHANGE order_id order_id bigint(20) DEFAULT NULL" ); - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers CHANGE vendor_id vendor_id bigint(20) DEFAULT NULL" ); -} - -wcsn_update_1_2_1(); diff --git a/i18n/languages/wc-serial-numbers.pot b/languages/wc-serial-numbers.pot similarity index 59% rename from i18n/languages/wc-serial-numbers.pot rename to languages/wc-serial-numbers.pot index 1a59d084..efc27954 100644 --- a/i18n/languages/wc-serial-numbers.pot +++ b/languages/wc-serial-numbers.pot @@ -1,17 +1,27 @@ -# Copyright (C) 2022 pluginever +# Copyright (C) 2023 PluginEver # This file is distributed under the GPLv2+. msgid "" msgstr "" -"Project-Id-Version: WooCommerce Serial Numbers 1.3.11\n" -"Report-Msgid-Bugs-To: " -"https://wordpress.org/support/plugin/wc-serial-numbers\n" -"POT-Creation-Date: 2022-10-26 15:19:31+00:00\n" +"Project-Id-Version: Serial Numbers for WooCommerce 1.0.0\n" +"Report-Msgid-Bugs-To: https://pluginever.com/plugins/wc-serial-numbers/\n" +"POT-Creation-Date: 2023-01-01 14:17:12+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2022-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: 2023-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" +"Language-Team: LANGUAGE \n" +"Language: en\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-Country: United States\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: " +"__;_e;_x:1,2c;_ex:1,2c;_n:1,2;_nx:1,2,4c;_n_noop:1,2;_nx_noop:1,2,3c;esc_" +"attr__;esc_html__;esc_attr_e;esc_html_e;esc_attr_x:1,2c;esc_html_x:1,2c;\n" +"X-Poedit-Basepath: ../\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-Bookmarks: \n" +"X-Textdomain-Support: yes\n" "X-Generator: grunt-wp-i18n 1.0.3\n" #: includes/admin/class-wc-serial-numbers-admin-actions.php:47 @@ -37,86 +47,73 @@ msgstr "" msgid "Activations" msgstr "" -#: includes/admin/class-wc-serial-numbers-admin-menus.php:66 -#: includes/admin/class-wc-serial-numbers-admin-menus.php:67 -#: includes/class-wc-serial-numbers-installer.php:301 -msgid "Settings" -msgstr "" - -#: includes/admin/class-wc-serial-numbers-admin-menus.php:77 -#: includes/class-wc-serial-numbers-installer.php:309 -msgid "Go Pro" -msgstr "" - -#: includes/admin/class-wc-serial-numbers-admin-menus.php:90 +#: includes/admin/class-wc-serial-numbers-admin-menus.php:68 msgid "Serials per page" msgstr "" -#: includes/admin/class-wc-serial-numbers-admin-menus.php:96 +#: includes/admin/class-wc-serial-numbers-admin-menus.php:74 #: includes/admin/class-wc-serial-numbers-admin-metaboxes.php:116 #: includes/admin/tables/class-wc-serial-numbers-serial-numbers-list-table.php:201 #: includes/wc-serial-numbers-functions.php:113 msgid "Available" msgstr "" -#: includes/admin/class-wc-serial-numbers-admin-menus.php:96 +#: includes/admin/class-wc-serial-numbers-admin-menus.php:74 msgid "Serial Numbers are valid and available for sell" msgstr "" -#: includes/admin/class-wc-serial-numbers-admin-menus.php:97 +#: includes/admin/class-wc-serial-numbers-admin-menus.php:75 #: includes/admin/tables/class-wc-serial-numbers-serial-numbers-list-table.php:202 #: includes/wc-serial-numbers-functions.php:114 msgid "Sold" msgstr "" -#: includes/admin/class-wc-serial-numbers-admin-menus.php:97 +#: includes/admin/class-wc-serial-numbers-admin-menus.php:75 msgid "Serial Numbers are sold and active" msgstr "" -#: includes/admin/class-wc-serial-numbers-admin-menus.php:98 -#: includes/admin/settings/wc-serial-numbers-settings-general.php:58 +#: includes/admin/class-wc-serial-numbers-admin-menus.php:76 #: includes/admin/tables/class-wc-serial-numbers-serial-numbers-list-table.php:203 -#: includes/wc-serial-numbers-functions.php:115 +#: includes/wc-serial-numbers-functions.php:115 src/Admin/Settings.php:76 msgid "Refunded" msgstr "" -#: includes/admin/class-wc-serial-numbers-admin-menus.php:98 +#: includes/admin/class-wc-serial-numbers-admin-menus.php:76 msgid "Serial Numbers are sold then refunded" msgstr "" -#: includes/admin/class-wc-serial-numbers-admin-menus.php:99 -#: includes/admin/settings/wc-serial-numbers-settings-general.php:50 +#: includes/admin/class-wc-serial-numbers-admin-menus.php:77 #: includes/admin/tables/class-wc-serial-numbers-serial-numbers-list-table.php:204 -#: includes/wc-serial-numbers-functions.php:116 +#: includes/wc-serial-numbers-functions.php:116 src/Admin/Settings.php:68 msgid "Cancelled" msgstr "" -#: includes/admin/class-wc-serial-numbers-admin-menus.php:99 +#: includes/admin/class-wc-serial-numbers-admin-menus.php:77 msgid "Serial Numbers are sold then cancelled" msgstr "" -#: includes/admin/class-wc-serial-numbers-admin-menus.php:100 +#: includes/admin/class-wc-serial-numbers-admin-menus.php:78 #: includes/admin/tables/class-wc-serial-numbers-serial-numbers-list-table.php:205 #: includes/wc-serial-numbers-functions.php:117 msgid "Expired" msgstr "" -#: includes/admin/class-wc-serial-numbers-admin-menus.php:100 +#: includes/admin/class-wc-serial-numbers-admin-menus.php:78 msgid "Serial Numbers are sold then expired" msgstr "" -#: includes/admin/class-wc-serial-numbers-admin-menus.php:101 +#: includes/admin/class-wc-serial-numbers-admin-menus.php:79 #: includes/admin/tables/class-wc-serial-numbers-activations-table.php:140 #: includes/admin/tables/class-wc-serial-numbers-serial-numbers-list-table.php:207 #: includes/wc-serial-numbers-functions.php:119 msgid "Inactive" msgstr "" -#: includes/admin/class-wc-serial-numbers-admin-menus.php:101 +#: includes/admin/class-wc-serial-numbers-admin-menus.php:79 msgid "Serial Numbers are are npt available for sell " msgstr "" -#: includes/admin/class-wc-serial-numbers-admin-menus.php:107 +#: includes/admin/class-wc-serial-numbers-admin-menus.php:85 msgid "Statuses" msgstr "" @@ -221,48 +218,19 @@ msgstr "" msgid "Let's go!" msgstr "" -#: includes/admin/class-wc-serial-numbers-admin-settings.php:37 -msgid "Action failed. Please refresh the page and retry." -msgstr "" - -#: includes/admin/class-wc-serial-numbers-admin-settings.php:45 -msgid "Your settings have been saved." -msgstr "" - -#: includes/admin/class-wc-serial-numbers-admin-settings.php:102 -msgid "The changes you made will be lost if you navigate away from this page." -msgstr "" - -#: includes/admin/class-wc-serial-numbers-admin.php:56 -msgid "Search product by name" -msgstr "" - -#: includes/admin/class-wc-serial-numbers-admin.php:57 -msgid "Search order" -msgstr "" - #: includes/admin/class-wc-serial-numbers-admin.php:58 -#: includes/admin/tables/class-wc-serial-numbers-serial-numbers-list-table.php:309 -msgid "Show" -msgstr "" - -#: includes/admin/class-wc-serial-numbers-admin.php:59 -msgid "Hide" -msgstr "" - -#: includes/admin/class-wc-serial-numbers-admin.php:94 msgid "Order assigned all serial numbers." msgstr "" -#: includes/admin/class-wc-serial-numbers-admin.php:97 +#: includes/admin/class-wc-serial-numbers-admin.php:61 msgid "Order partially missing serial numbers(%d)" msgstr "" -#: includes/admin/class-wc-serial-numbers-admin.php:100 +#: includes/admin/class-wc-serial-numbers-admin.php:64 msgid "Order missing serial numbers(%d)" msgstr "" -#: includes/admin/class-wc-serial-numbers-admin.php:176 +#: includes/admin/class-wc-serial-numbers-admin.php:140 msgid "" "If you like WooCommerce Serial Numbers please leave us a " "★★★★★ " @@ -372,98 +340,6 @@ msgstr "" msgid "Add New" msgstr "" -#: includes/admin/settings/wc-serial-numbers-settings-general.php:14 -msgid "General" -msgstr "" - -#: includes/admin/settings/wc-serial-numbers-settings-general.php:30 -msgid "General settings" -msgstr "" - -#: includes/admin/settings/wc-serial-numbers-settings-general.php:32 -msgid "The following options affect how the serial numbers will work." -msgstr "" - -#: includes/admin/settings/wc-serial-numbers-settings-general.php:36 -msgid "Auto-complete order" -msgstr "" - -#: includes/admin/settings/wc-serial-numbers-settings-general.php:38 -msgid "Automatically completes orders after successfull payments." -msgstr "" - -#: includes/admin/settings/wc-serial-numbers-settings-general.php:43 -msgid "Reuse serial number" -msgstr "" - -#: includes/admin/settings/wc-serial-numbers-settings-general.php:45 -msgid "Recover failed, refunded serial numbers for selling again." -msgstr "" - -#: includes/admin/settings/wc-serial-numbers-settings-general.php:49 -msgid "Revoke status" -msgstr "" - -#: includes/admin/settings/wc-serial-numbers-settings-general.php:66 -#: includes/admin/tables/class-wc-serial-numbers-serial-numbers-list-table.php:206 -#: includes/wc-serial-numbers-functions.php:118 -msgid "Failed" -msgstr "" - -#: includes/admin/settings/wc-serial-numbers-settings-general.php:74 -msgid "Hide serial number" -msgstr "" - -#: includes/admin/settings/wc-serial-numbers-settings-general.php:76 -msgid "" -"All serial numbers will be hidden and only displayed when the \"Show\" " -"button is clicked." -msgstr "" - -#: includes/admin/settings/wc-serial-numbers-settings-general.php:81 -msgid "Disable software support" -msgstr "" - -#: includes/admin/settings/wc-serial-numbers-settings-general.php:83 -msgid "Disable Software Licensing support & API functionalities." -msgstr "" - -#: includes/admin/settings/wc-serial-numbers-settings-general.php:92 -msgid "Stock notification" -msgstr "" - -#: includes/admin/settings/wc-serial-numbers-settings-general.php:94 -msgid "The following options affects how stock notification will work." -msgstr "" - -#: includes/admin/settings/wc-serial-numbers-settings-general.php:98 -msgid "Stock notification email" -msgstr "" - -#: includes/admin/settings/wc-serial-numbers-settings-general.php:100 -msgid "Sends notification emails when product stock is low." -msgstr "" - -#: includes/admin/settings/wc-serial-numbers-settings-general.php:105 -msgid "Stock threshold" -msgstr "" - -#: includes/admin/settings/wc-serial-numbers-settings-general.php:107 -msgid "When stock goes below the above number, it will send notification email." -msgstr "" - -#: includes/admin/settings/wc-serial-numbers-settings-general.php:112 -msgid "Notification recipient email" -msgstr "" - -#: includes/admin/settings/wc-serial-numbers-settings-general.php:114 -msgid "The email address to be used for sending the email notifications." -msgstr "" - -#: includes/admin/settings/wc-serial-numbers-settings-help.php:22 -msgid "Help" -msgstr "" - #: includes/admin/tables/class-wc-serial-numbers-activations-table.php:47 #: includes/admin/tables/class-wc-serial-numbers-serial-numbers-list-table.php:247 msgid "Activation" @@ -552,6 +428,11 @@ msgstr "" msgid "Expired serial numbers" msgstr "" +#: includes/admin/tables/class-wc-serial-numbers-serial-numbers-list-table.php:206 +#: includes/wc-serial-numbers-functions.php:118 src/Admin/Settings.php:84 +msgid "Failed" +msgstr "" + #: includes/admin/tables/class-wc-serial-numbers-serial-numbers-list-table.php:207 msgid "Inactive serial numbers" msgstr "" @@ -588,6 +469,11 @@ msgstr "" msgid "Validity" msgstr "" +#: includes/admin/tables/class-wc-serial-numbers-serial-numbers-list-table.php:309 +#: src/Scripts.php:63 +msgid "Show" +msgstr "" + #: includes/admin/tables/class-wc-serial-numbers-serial-numbers-list-table.php:378 msgid "%s Day
After purchase" msgid_plural "%s Days
After purchase" @@ -621,7 +507,7 @@ msgid "" "products using the plugin." msgstr "" -#: includes/admin/views/html-admin-help.php:12 +#: includes/admin/views/html-admin-help.php:12 lib/Lib/Plugin.php:536 msgid "Support" msgstr "" @@ -641,8 +527,7 @@ msgid "Submit a ticket" msgstr "" #: includes/admin/views/html-admin-help.php:20 -#: includes/admin/views/html-admin-help.php:22 -#: includes/class-wc-serial-numbers-installer.php:210 +#: includes/admin/views/html-admin-help.php:22 lib/Lib/Plugin.php:529 msgid "Documentation" msgstr "" @@ -657,22 +542,6 @@ msgstr "" msgid "Save changes" msgstr "" -#: includes/class-wc-serial-numbers-ajax.php:76 -msgid "Could not detect the serial number to decrypt" -msgstr "" - -#: includes/class-wc-serial-numbers-ajax.php:81 -msgid "Could not find the serial number to decrypt" -msgstr "" - -#: includes/class-wc-serial-numbers-ajax.php:95 -msgid "Error: You are not allowed to do this." -msgstr "" - -#: includes/class-wc-serial-numbers-ajax.php:107 -msgid "Error: Nonce verification failed" -msgstr "" - #: includes/class-wc-serial-numbers-api.php:24 msgid "Email is required" msgstr "" @@ -733,14 +602,6 @@ msgstr "" msgid "Serial Numbers stock running low" msgstr "" -#: includes/class-wc-serial-numbers-installer.php:268 -msgid "Once a Minute" -msgstr "" - -#: includes/class-wc-serial-numbers-installer.php:301 -msgid "View Serial number settings" -msgstr "" - #: includes/class-wc-serial-numbers-order-handler.php:63 msgid "" "Sorry, There is not enough serial numbers available for %s, Please remove " @@ -841,73 +702,505 @@ msgstr "" msgid "Expires" msgstr "" -#: lib/Framework/Settings_Page.php:310 +#: lib/Lib/Plugin.php:228 src/Admin/Menus.php:56 +msgid "Go Pro" +msgstr "" + +#: lib/Lib/Plugin.php:543 +msgid "Review" +msgstr "" + +#: lib/Lib/Plugin.php:549 +msgid "More Plugins" +msgstr "" + +#: lib/Lib/Plugin.php:566 src/Admin/Menus.php:36 src/Admin/Menus.php:37 +msgid "Settings" +msgstr "" + +#: lib/Lib/Settings.php:69 msgid "Settings saved." msgstr "" -#: lib/Framework/WP_Background_Process.php:426 -msgid "Every %d Minutes" +#: lib/Lib/Settings.php:226 lib/Lib/Settings.php:314 lib/Lib/Settings.php:323 +#: lib/Lib/Settings.php:332 +msgid "Recommended" +msgstr "" + +#: lib/Lib/Settings.php:227 lib/Lib/Settings.php:315 lib/Lib/Settings.php:324 +#: lib/Lib/Settings.php:333 +msgid "Install Now" +msgstr "" + +#: lib/Lib/Settings.php:285 +msgid "Need Help?" +msgstr "" + +#: lib/Lib/Settings.php:347 +msgid "Join our Community" +msgstr "" + +#: lib/Lib/Settings.php:351 +msgid "Request a Feature" +msgstr "" + +#: lib/Lib/Settings.php:355 +msgid "Report a Bug" +msgstr "" + +#: src/AJAX.php:96 src/AJAX.php:104 +msgid "Could not detect the serial number to decrypt" msgstr "" -#: wc-serial-numbers.php:164 +#: src/Admin/Admin.php:64 +#. translators: 1: Plugin name 2: WordPress msgid "" -"WooCommerce Serial Numbers requires " -"WooCommerce installed and activated. Please Install %s " -"WooCommerce. %s" +"Thank you for using %1$s. If you like it, please leave us a %2$s rating. A " +"huge thank you from PluginEver in advance!" msgstr "" -#: wc-serial-numbers.php:197 wc-serial-numbers.php:208 -msgid "Cheatin’ huh?" +#: src/Admin/Admin.php:66 +msgid "Thanks :)" msgstr "" -#. Plugin Name of the plugin/theme -msgid "WooCommerce Serial Numbers" +#: src/Admin/Admin.php:84 +#. translators: 1: Plugin version +msgid "Version %s" msgstr "" -#. Plugin URI of the plugin/theme -msgid "https://www.pluginever.com/plugins/wocommerce-serial-numbers-pro/" +#: src/Admin/Notices.php:44 +#. translators: %1$s: link to the plugin page, %2$s: link to the plugin page +msgid "" +"%s is not functional because you are using outdated version of the plugin, " +"please update to the version 1.1.9 or higher." msgstr "" -#. Description of the plugin/theme +#: src/Admin/Settings.php:25 +msgid "General" +msgstr "" + +#: src/Admin/Settings.php:46 +msgid "General settings" +msgstr "" + +#: src/Admin/Settings.php:48 +msgid "The following options affect how the serial numbers will work." +msgstr "" + +#: src/Admin/Settings.php:52 +msgid "Auto-complete order" +msgstr "" + +#: src/Admin/Settings.php:54 +msgid "Automatically completes orders after successfull payments." +msgstr "" + +#: src/Admin/Settings.php:59 +msgid "Reuse serial number" +msgstr "" + +#: src/Admin/Settings.php:61 +msgid "Recover failed, refunded serial numbers for selling again." +msgstr "" + +#: src/Admin/Settings.php:62 msgid "" -"The best WooCommerce Plugin to sell license keys, redeem cards and other " -"secret numbers!" +"If you enable this option, the serial number will be available for selling " +"again if the order is refunded or failed." msgstr "" -#. Author of the plugin/theme -msgid "pluginever" +#: src/Admin/Settings.php:67 +msgid "Revoke status" msgstr "" -#. Author URI of the plugin/theme -msgid "http://pluginever.com" +#: src/Admin/Settings.php:92 +msgid "Hide serial number" msgstr "" -#: lib/Framework/Plugin.php:272 -msgctxt "aria-label: settings link" -msgid "settings" +#: src/Admin/Settings.php:94 +msgid "" +"All serial numbers will be hidden and only displayed when the \"Show\" " +"button is clicked." msgstr "" -#: lib/Framework/Plugin.php:273 -msgctxt "plugin action link" -msgid "Settings" +#: src/Admin/Settings.php:99 +msgid "Disable software support" msgstr "" -#: lib/Framework/Plugin.php:302 -msgctxt "noun" -msgid "More Plugins" +#: src/Admin/Settings.php:101 +msgid "Disable Software Licensing support & API functionalities." msgstr "" -#: lib/Framework/Plugin.php:310 -msgctxt "noun" -msgid "Docs" +#: src/Admin/Settings.php:110 +msgid "Stock notification" msgstr "" -#: lib/Framework/Plugin.php:318 -msgctxt "noun" -msgid "Support" +#: src/Admin/Settings.php:112 +msgid "The following options affects how stock notification will work." msgstr "" -#: lib/Framework/Plugin.php:326 -msgctxt "noun" -msgid "Review" +#: src/Admin/Settings.php:116 +msgid "Stock notification email" +msgstr "" + +#: src/Admin/Settings.php:118 +msgid "Sends notification emails when product stock is low." +msgstr "" + +#: src/Admin/Settings.php:124 +msgid "Stock threshold" +msgstr "" + +#: src/Admin/Settings.php:126 +msgid "When stock goes below the above number, it will send notification email." +msgstr "" + +#: src/Admin/Settings.php:131 +msgid "Notification recipient email" +msgstr "" + +#: src/Admin/Settings.php:133 +msgid "The email address to be used for sending the email notifications." +msgstr "" + +#: src/Admin/Settings.php:167 +msgid "Create and assign license keys for WooCommerce variable products." +msgstr "" + +#: src/Admin/Settings.php:168 +msgid "Generate bulk license keys with your custom key generator rule." +msgstr "" + +#: src/Admin/Settings.php:169 +msgid "Random & sequential order for the generator rules." +msgstr "" + +#: src/Admin/Settings.php:170 +msgid "Automatic license key generator to auto-create & assign keys with orders." +msgstr "" + +#: src/Admin/Settings.php:171 +msgid "License key management option from the order page with required actions." +msgstr "" + +#: src/Admin/Settings.php:172 +msgid "Support for bulk import/export of license keys from/to CSV." +msgstr "" + +#: src/Admin/Settings.php:173 +msgid "" +"Option to sell license keys even if there are no available keys in the " +"stock." +msgstr "" + +#: src/Admin/Settings.php:174 +msgid "Custom deliverable quantity to deliver multiple keys with a single product." +msgstr "" + +#: src/Admin/Settings.php:175 +msgid "" +"Manual delivery option to manually deliver license keys instead of " +"automatic." +msgstr "" + +#: src/Admin/Settings.php:176 +msgid "" +"Email Template to easily and quickly customize the order confirmation & low " +"stock alert email." +msgstr "" + +#: src/Admin/Settings.php:177 +msgid "Many more ..." +msgstr "" + +#: src/Admin/Settings.php:181 +msgid "Want More?" +msgstr "" + +#: src/Admin/Settings.php:182 +msgid "" +"This plugin offers a premium version which comes with the following " +"features:" +msgstr "" + +#: src/Admin/Settings.php:188 +msgid "Upgrade to PRO" +msgstr "" + +#: src/Installer.php:50 +msgid "Once a Minute" +msgstr "" + +#: src/Installer.php:101 +#. translators: 1: plugin name 2: version number +msgid "%1$s updated to version %2$s successfully." +msgstr "" + +#: src/Plugin.php:75 +#. translators: 1: plugin name 2: WooCommerce +msgid "%1$s requires %2$s to be installed and active." +msgstr "" + +#: src/Plugin.php:77 +msgid "WooCommerce" +msgstr "" + +#: src/Scripts.php:61 +msgid "Search product by name" +msgstr "" + +#: src/Scripts.php:62 +msgid "Search order" +msgstr "" + +#: src/Scripts.php:64 +msgid "Hide" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/internationalized-plugin.php:11 +msgid "This is a dummy plugin" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/parsers.php:42 +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/parsers.php:72 +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/parsers.php:80 +msgid "There was an error when reading this WXR file" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/parsers.php:43 +msgid "" +"Details are shown above. The importer will now try again with a different " +"parser..." +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/parsers.php:84 +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/parsers.php:89 +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/parsers.php:306 +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/parsers.php:495 +msgid "This does not appear to be a WXR file, missing/invalid WXR version number" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:132 +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:141 +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:192 +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:196 +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:205 +msgid "Sorry, there has been an error." +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:133 +msgid "The file does not exist, please try again." +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:176 +msgid "All done." +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:176 +msgid "Have fun!" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:177 +msgid "Remember to update the passwords and roles of imported users." +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:197 +msgid "" +"The export file could not be found at %s. It is likely that " +"this was caused by a permissions problem." +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:213 +msgid "" +"This WXR file (version %s) may not be supported by this version of the " +"importer. Please consider updating." +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:238 +msgid "" +"Failed to import author %s. Their posts will be attributed to the current " +"user." +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:264 +msgid "Assign Authors" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:265 +msgid "" +"To make it easier for you to edit and save the imported content, you may " +"want to reassign the author of the imported item to an existing user of " +"this site. For example, you may want to import all the entries as " +"admins entries." +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:267 +msgid "" +"If a new user is created by WordPress, a new password will be randomly " +"generated and the new user’s role will be set as %s. Manually " +"changing the new user’s details will be necessary." +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:277 +msgid "Import Attachments" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:280 +msgid "Download and import file attachments" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:284 +msgid "Submit" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:297 +msgid "Import author:" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:308 +msgid "or create new user with login name:" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:311 +msgid "as a new user:" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:319 +msgid "assign posts to an existing user:" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:321 +msgid "or assign posts to an existing user:" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:322 +msgid "- Select -" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:372 +msgid "" +"Failed to create new user for %s. Their posts will be attributed to the " +"current user." +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:424 +msgid "Failed to import category %s" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:467 +msgid "Failed to import post tag %s" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:516 +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:738 +msgid "Failed to import %s %s" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:605 +msgid "Failed to import “%s”: Invalid post type %s" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:642 +msgid "%s “%s” already exists." +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:704 +msgid "Failed to import %s “%s”" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:869 +msgid "Menu item skipped due to missing menu slug" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:876 +msgid "Menu item skipped due to invalid menu slug: %s" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:939 +msgid "Fetching attachments is not enabled" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:952 +msgid "Invalid file type" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:996 +msgid "Remote server did not respond" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:1002 +msgid "Remote server returned error response %1$d %2$s" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:1009 +msgid "Remote file is incorrect size" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:1014 +msgid "Zero size file downloaded" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:1020 +msgid "Remote file is too large, limit is %s" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:1119 +msgid "Import WordPress" +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:1126 +msgid "" +"A new version of this importer is available. Please update to version %s to " +"ensure compatibility with newer export files." +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:1141 +msgid "" +"Howdy! Upload your WordPress eXtended RSS (WXR) file and we’ll import " +"the posts, pages, comments, custom fields, categories, and tags into this " +"site." +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:1142 +msgid "Choose a WXR (.xml) file to upload, then click Upload file and import." +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:1216 +msgid "" +"Import posts, pages, comments, custom fields, categories, and " +"tags from a WordPress export file." +msgstr "" + +#: vendor/lucatume/wp-browser/src/data/themedir1/internationalized-theme/functions.php:7 +msgid "This is a dummy theme" +msgstr "" + +#: vendor/wp-cli/wp-cli/php/utils-wp.php:230 +msgid "Inactive Widgets" +msgstr "" + +#: vendor/wp-cli/wp-cli/php/utils-wp.php:233 +msgid "Drag widgets here to remove them from the sidebar but keep their settings." +msgstr "" + +#. Plugin Name of the plugin/theme +msgid "Serial Numbers for WooCommerce" +msgstr "" + +#. Plugin URI of the plugin/theme +msgid "https://www.pluginever.com/plugins/wocommerce-serial-numbers-pro/" +msgstr "" + +#. Description of the plugin/theme +msgid "" +"The best WooCommerce extension to sell license & serial keys, gift cards " +"and other secret numbers!" +msgstr "" + +#. Author of the plugin/theme +msgid "PluginEver" +msgstr "" + +#. Author URI of the plugin/theme +msgid "http://pluginever.com" msgstr "" \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index b4ae2e75..00000000 --- a/package-lock.json +++ /dev/null @@ -1,3734 +0,0 @@ -{ - "name": "wc-serial-number", - "version": "1.3.11", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - }, - "@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "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 - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - } - } - }, - "array-differ": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "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 - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "async": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", - "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==", - "dev": true - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "autoprefixer": { - "version": "9.8.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", - "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "picocolors": "^0.2.1", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, - "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 - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "body": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", - "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=", - "dev": true, - "requires": { - "continuable-cache": "^0.3.1", - "error": "^7.0.0", - "raw-body": "~1.1.0", - "safe-json-parse": "~1.0.1" - } - }, - "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, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - }, - "dependencies": { - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - } - } - }, - "bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", - "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "caniuse-lite": { - "version": "1.0.30001289", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001289.tgz", - "integrity": "sha512-hV6x4IfrYViN8cJbGFVbjD7KCrhS/O7wfDgvevYRanJ/IN+hhxpTcXXqaxy3CzPNFe5rlqdimdEB/k7H0YzxHg==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "clean-css": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.2.tgz", - "integrity": "sha512-/eR8ru5zyxKzpBLv9YZvMXgTSSQn7AdkMItMYynsFgGwTveCRVam9IUPFloE85B4vAIj05IuKmmEoV7/AQjT0w==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", - "dev": true, - "requires": { - "exit": "0.1.2", - "glob": "^7.1.1" - } - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "^1.0.1" - } - }, - "cli-width": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-1.1.1.tgz", - "integrity": "sha1-pNKT72frt7iNSk1CwMzwDE0eNm0=", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "continuable-cache": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", - "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=", - "dev": true - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "dependencies": { - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "electron-to-chromium": { - "version": "1.4.24", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.24.tgz", - "integrity": "sha512-erwx5r69B/WFfFuF2jcNN0817BfDBdC4765kQ6WltOMuwsimlQo3JTEq0Cle+wpHralwdeX3OfAtw/mHxPK0Wg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "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, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true - }, - "error": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", - "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", - "dev": true, - "requires": { - "string-template": "~0.2.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", - "dev": true - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", - "dev": true, - "requires": { - "glob": "~5.0.0" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "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, - "requires": { - "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" - } - }, - "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 - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "requires": { - "globule": "^1.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "getobject": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", - "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "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, - "requires": { - "encoding": "^0.1.12", - "readable-stream": "^3.2.0", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "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, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "globule": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz", - "integrity": "sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==", - "dev": true, - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - } - }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "grunt": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.4.1.tgz", - "integrity": "sha512-ZXIYXTsAVrA7sM+jZxjQdrBOAg7DyMUplOMhTaspMRExei+fD0BTwdWXnn0W5SXqhb/Q/nlkzXclSi3IH55PIA==", - "dev": true, - "requires": { - "dateformat": "~3.0.3", - "eventemitter2": "~0.4.13", - "exit": "~0.1.2", - "findup-sync": "~0.3.0", - "glob": "~7.1.6", - "grunt-cli": "~1.4.2", - "grunt-known-options": "~2.0.0", - "grunt-legacy-log": "~3.0.0", - "grunt-legacy-util": "~2.0.1", - "iconv-lite": "~0.4.13", - "js-yaml": "~3.14.0", - "minimatch": "~3.0.4", - "mkdirp": "~1.0.4", - "nopt": "~3.0.6", - "rimraf": "~3.0.2" - }, - "dependencies": { - "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, - "requires": { - "grunt-known-options": "~2.0.0", - "interpret": "~1.1.0", - "liftup": "~3.0.1", - "nopt": "~4.0.1", - "v8flags": "~3.2.0" - }, - "dependencies": { - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - } - } - } - } - }, - "grunt-checktextdomain": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/grunt-checktextdomain/-/grunt-checktextdomain-1.0.1.tgz", - "integrity": "sha1-slTQHh3pEwBdTbHFMD2QI7mD4Zs=", - "dev": true, - "requires": { - "chalk": "~0.2.1", - "text-table": "~0.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-0.2.0.tgz", - "integrity": "sha1-NZq0sV3NZLptdHNLcsNjYKmvLBk=", - "dev": true - }, - "chalk": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.2.1.tgz", - "integrity": "sha1-dhPhV1FFshOGSD9/SFql/6jL0Qw=", - "dev": true, - "requires": { - "ansi-styles": "~0.2.0", - "has-color": "~0.1.0" - } - } - } - }, - "grunt-contrib-concat": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-2.0.0.tgz", - "integrity": "sha512-/cfWwsGiprVTOl7c2bZwMdQ8hIf3e1f4szm1i7qhY9hOnR/X2KL+Xe7dynNweTYHa6aWPZx2B5GPsUpxAXNCaA==", - "dev": true, - "requires": { - "chalk": "^4.1.2", - "source-map": "^0.5.3" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "grunt-contrib-cssmin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-4.0.0.tgz", - "integrity": "sha512-jXU+Zlk8Q8XztOGNGpjYlD/BDQ0n95IHKrQKtFR7Gd8hZrzgqiG1Ra7cGYc8h2DD9vkSFGNlweb9Q00rBxOK2w==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "clean-css": "^5.0.1", - "maxmin": "^3.0.0" - }, - "dependencies": { - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" - } - }, - "maxmin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-3.0.0.tgz", - "integrity": "sha512-wcahMInmGtg/7c6a75fr21Ch/Ks1Tb+Jtoan5Ft4bAI0ZvJqyOw8kkM7e7p8hDSzY805vmxwHT50KcjGwKyJ0g==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "figures": "^3.2.0", - "gzip-size": "^5.1.1", - "pretty-bytes": "^5.3.0" - } - }, - "pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true - } - } - }, - "grunt-contrib-jshint": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-3.1.1.tgz", - "integrity": "sha512-EwMY6L91FqTcMlZTVoDeeq/EZL+7MoFyo1rxIea9sxyv73geVggeE37jcUhNbu5hLbxHE82CGIUqitHuR2/q+g==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "hooker": "^0.2.3", - "jshint": "~2.13.0" - } - }, - "grunt-contrib-uglify": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-5.0.1.tgz", - "integrity": "sha512-T/aXZ4WIpAtoswZqb6HROKg7uq9QbKwl+lUuOwK4eoFj3tFv9/a/oMyd3/qvetV29Pbf8P1YYda1gDwZppr60A==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "maxmin": "^2.1.0", - "uglify-js": "^3.13.3", - "uri-path": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "grunt-contrib-watch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz", - "integrity": "sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg==", - "dev": true, - "requires": { - "async": "^2.6.0", - "gaze": "^1.1.0", - "lodash": "^4.17.10", - "tiny-lr": "^1.1.1" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - } - } - }, - "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 - }, - "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, - "requires": { - "colors": "~1.1.2", - "grunt-legacy-log-utils": "~2.1.0", - "hooker": "~0.2.3", - "lodash": "~4.17.19" - } - }, - "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, - "requires": { - "chalk": "~4.1.0", - "lodash": "~4.17.19" - } - }, - "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, - "requires": { - "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" - }, - "dependencies": { - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "grunt-postcss": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/grunt-postcss/-/grunt-postcss-0.9.0.tgz", - "integrity": "sha512-lglLcVaoOIqH0sFv7RqwUKkEFGQwnlqyAKbatxZderwZGV1nDyKHN7gZS9LUiTx1t5GOvRBx0BEalHMyVwFAIA==", - "dev": true, - "requires": { - "chalk": "^2.1.0", - "diff": "^3.0.0", - "postcss": "^6.0.11" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "grunt-prompt": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/grunt-prompt/-/grunt-prompt-1.3.3.tgz", - "integrity": "sha1-xbQ77DqimqaWKsZhGolnEvy6Z5E=", - "dev": true, - "requires": { - "inquirer": "^0.11.0", - "lodash": "^3.10.1" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - } - } - }, - "grunt-sass": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/grunt-sass/-/grunt-sass-3.1.0.tgz", - "integrity": "sha512-90s27H7FoCDcA8C8+R0GwC+ntYD3lG6S/jqcavWm3bn9RiJTmSfOvfbFa1PXx4NbBWuiGQMLfQTj/JvvqT5w6A==", - "dev": true - }, - "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, - "requires": { - "grunt": "^1.0.3", - "node-wp-i18n": "^1.2.2" - } - }, - "gzip-size": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", - "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", - "dev": true, - "requires": { - "duplexer": "^0.1.1" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", - "dev": true - }, - "hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dev": true, - "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - }, - "dependencies": { - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true - } - } - }, - "http-parser-js": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", - "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==", - "dev": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "inquirer": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.11.4.tgz", - "integrity": "sha1-geM3ToNhvq/y2XAWIG01nQsy+k0=", - "dev": true, - "requires": { - "ansi-escapes": "^1.1.0", - "ansi-regex": "^2.0.0", - "chalk": "^1.0.0", - "cli-cursor": "^1.0.1", - "cli-width": "^1.0.1", - "figures": "^1.3.5", - "lodash": "^3.3.1", - "readline2": "^1.0.1", - "run-async": "^0.1.0", - "rx-lite": "^3.1.2", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "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, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "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, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "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 - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "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, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "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, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "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 - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "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, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jshint": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.1.tgz", - "integrity": "sha512-vymzfR3OysF5P774x6zYv0bD4EpH6NWRxpq54wO9mA9RuY49yb1teKSICkLx2Ryx+mfzlVVNNbTBtsRtg78t7g==", - "dev": true, - "requires": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "~4.17.21", - "minimatch": "~3.0.2", - "shelljs": "0.3.x", - "strip-json-comments": "1.0.x" - } - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "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 - }, - "liftup": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", - "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "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, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^4.0.2", - "resolve-dir": "^1.0.1" - } - } - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "livereload-js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", - "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", - "dev": true - }, - "load-grunt-tasks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-5.1.0.tgz", - "integrity": "sha512-oNj0Jlka1TsfDe+9He0kcA1cRln+TMoTsEByW7ij6kyktNLxBKJtslCFEvFrLC2Dj0S19IWJh3fOCIjLby2Xrg==", - "dev": true, - "requires": { - "arrify": "^2.0.1", - "multimatch": "^4.0.0", - "pkg-up": "^3.1.0", - "resolve-pkg": "^2.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "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, - "requires": { - "kind-of": "^6.0.2" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true - }, - "maxmin": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-2.1.0.tgz", - "integrity": "sha1-TTsiCQPZXu5+t6x/qGTnLcCaMWY=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "figures": "^1.0.1", - "gzip-size": "^3.0.0", - "pretty-bytes": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - } - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, - "requires": { - "mime-db": "1.51.0" - } - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - } - } - }, - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "multimatch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", - "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", - "dev": true, - "requires": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" - } - }, - "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", - "dev": true - }, - "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "dev": true - }, - "node-gyp": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - }, - "dependencies": { - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true - }, - "node-sass": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-7.0.0.tgz", - "integrity": "sha512-6yUnsD3L8fVbgMX6nKQqZkjRcG7a/PpmF0pEyeWf+BgbTj2ToJlCYrnUifL2KbjV5gIY22I3oppahBWA3B+jUg==", - "dev": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "lodash": "^4.17.15", - "meow": "^9.0.0", - "nan": "^2.13.2", - "node-gyp": "^7.1.0", - "npmlog": "^5.0.0", - "request": "^2.88.0", - "sass-graph": "2.2.5", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - } - }, - "node-wp-i18n": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/node-wp-i18n/-/node-wp-i18n-1.2.6.tgz", - "integrity": "sha512-aLutjDB1rMJ3FNlNcs/XjmaejED1/y30uLYQrmkXpeUj1NH/SA6pI94CUz3iI7fbQd63lTGg0YNvOQAT8cWdIw==", - "dev": true, - "requires": { - "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" - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dev": true, - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "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, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "dev": true - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "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 - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "pretty-bytes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", - "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.2.tgz", - "integrity": "sha512-mSIdjzqznWgfd4pMii7sHtaYF8rx8861hBO80SraY5GT0XQibWZWJSid0avzHGkDIZLImux2S5mXO0Hfct2QCw==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, - "raw-body": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", - "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=", - "dev": true, - "requires": { - "bytes": "1", - "string_decoder": "0.10" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "mute-stream": "0.0.5" - } - }, - "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "requires": { - "resolve": "^1.9.0" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "resolve-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz", - "integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", - "dev": true, - "requires": { - "once": "^1.3.0" - } - }, - "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", - "dev": true - }, - "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 - }, - "safe-json-parse": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", - "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sass-graph": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", - "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^13.3.2" - } - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "dev": true, - "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "string-template": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", - "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "tiny-lr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", - "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==", - "dev": true, - "requires": { - "body": "^5.1.0", - "debug": "^3.1.0", - "faye-websocket": "~0.10.0", - "livereload-js": "^2.3.0", - "object-assign": "^4.1.0", - "qs": "^6.4.0" - } - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } - }, - "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, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "dev": true, - "requires": { - "glob": "^7.1.2" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - }, - "uglify-js": { - "version": "3.14.5", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.5.tgz", - "integrity": "sha512-qZukoSxOG0urUTvjc2ERMTcAy+BiFh3weWAkeurLwjrCba73poHmG3E36XEjd/JGukMzwTL7uCxZiAexj8ppvQ==", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "underscore.string": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", - "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", - "dev": true, - "requires": { - "sprintf-js": "^1.0.3", - "util-deprecate": "^1.0.2" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "uri-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", - "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "v8flags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", - "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - } - } - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - } - } -} diff --git a/package.json b/package.json index 8c06d064..5276b9f4 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "devDependencies": { "@lodder/time-grunt": "^4.0.0", "@wordpress/prettier-config": "^1.4.0", - "@wordpress/scripts": "^23.3.0", + "@wordpress/scripts": "^19.1.0", "clean-webpack-plugin": "^4.0.0", "grunt": "^1.5.3", "grunt-checktextdomain": "^1.0.1", @@ -38,10 +38,6 @@ "webpack-remove-empty-scripts": "^0.8.1", "wp-prettier": "^2.6.2" }, - "engines": { - "node": "^16.13.1", - "pnpm": "^6.24.2" - }, "stylelint": { "extends": "@wordpress/stylelint-config", "defaultSeverity": "warning" diff --git a/phpcs.xml b/phpcs.xml index 69cf092e..09c6f26e 100644 --- a/phpcs.xml +++ b/phpcs.xml @@ -9,6 +9,7 @@ assets/ dist/ bin/ + includes/ */node_modules/* */vendor/* *\.(css|js|xml) diff --git a/src/AJAX.php b/src/AJAX.php new file mode 100644 index 00000000..c8e76e15 --- /dev/null +++ b/src/AJAX.php @@ -0,0 +1,114 @@ + [ 'product' ], + 'posts_per_page' => $per_page, + 's' => $search, + 'fields' => 'ids', + 'tax_query' => array( // @codingStandardsIgnoreLine + 'relation' => 'OR', + array( + 'taxonomy' => 'product_type', + 'field' => 'slug', + 'terms' => [ 'simple' ], + 'operator' => 'IN', + ), + ), + ); + $the_query = new \WP_Query( apply_filters( 'wc_serial_numbers_products_query_args', $args ) ); + $product_ids = $the_query->get_posts(); + $results = array(); + foreach ( $product_ids as $product_id ) { + $product = wc_get_product( $product_id ); + + if ( ! $product ) { + continue; + } + + $text = sprintf( + '(#%1$s) %2$s', + $product->get_id(), + wp_strip_all_tags( $product->get_formatted_name() ) + ); + + $results[] = array( + 'id' => $product->get_id(), + 'text' => $text, + ); + } + + wp_send_json( + array( + 'page' => $page, + 'results' => $results, + 'pagination' => array( + 'more' => false, + ), + ) + ); + wp_die(); + } + + /** + * Decrypt key + * + * @since 1.2.0 + */ + public static function decrypt_key() { + check_ajax_referer( 'wc_serial_numbers_decrypt_key', 'nonce' ); + $serial_id = isset( $_REQUEST['serial_id'] ) ? sanitize_text_field( $_REQUEST['serial_id'] ) : ''; + if ( empty( $serial_id ) ) { + wp_send_json_error( + array( + 'message' => __( 'Could not detect the serial number to decrypt', 'wc-serial-numbers' ), + ) + ); + } + $serial_number = wc_serial_numbers_get_serial_number( $serial_id ); + if ( empty( $serial_number ) ) { + wp_send_json_error( + array( + 'message' => __( 'Could not detect the serial number to decrypt', 'wc-serial-numbers' ), + ) + ); + } + wp_send_json_success( + array( + 'key' => wc_serial_numbers_decrypt_key( $serial_number->serial_key ), + ) + ); + } +} diff --git a/src/Admin/Admin.php b/src/Admin/Admin.php new file mode 100644 index 00000000..b6095e30 --- /dev/null +++ b/src/Admin/Admin.php @@ -0,0 +1,137 @@ +get_review_url() && in_array( get_current_screen()->id, self::get_screen_ids(), true ) ) { + $footer_text = sprintf( + /* translators: 1: Plugin name 2: WordPress */ + __( 'Thank you for using %1$s. If you like it, please leave us a %2$s rating. A huge thank you from PluginEver in advance!', 'wc-serial-numbers' ), + '' . esc_html( wc_serial_numbers()->get_name() ) . '', + '★★★★★' + ); + } + + return $footer_text; + } + + /** + * Update footer. + * + * @param string $footer_text Footer text. + * + * @since 1.0.0 + * @return string + */ + public function update_footer( $footer_text ) { + if ( in_array( get_current_screen()->id, self::get_screen_ids(), true ) ) { + /* translators: 1: Plugin version */ + $footer_text = sprintf( esc_html__( 'Version %s', 'wc-serial-numbers' ), wc_serial_numbers()->get_version() ); + } + + return $footer_text; + } + + /** + * Get screen ids. + * + * @since 1.0.0 + * @return array + */ + public static function get_screen_ids() { + $screen_ids = [ + 'toplevel_page_wc-serial-numbers', + 'serial-numbers_page_wc-serial-numbers-products', + 'serial-numbers_page_wc-serial-numbers-settings', + ]; + + return apply_filters( 'wc_serial_numbers_screen_ids', $screen_ids ); + } + + /** + * Render a view. + * + * @param string $view The name of the view to render. + * @param array $args The arguments to pass to the view. + * @param string $path The path to the view file. + * + * @since 1.0.0 + * @return void + */ + public static function render( $view, $args = [], $path = '' ) { + if ( empty( $path ) ) { + $path = __DIR__ . '/views/'; + } + // replace .php extension if it was added. + $view = str_replace( '.php', '', $view ); + $view = ltrim( $view, '/' ); + $path = rtrim( $path, '/' ); + + $file = $path . '/' . $view . '.php'; + + if ( ! file_exists( $file ) ) { + return; + } + + if ( $args && is_array( $args ) ) { + extract( $args ); // phpcs:ignore WordPress.PHP.DontExtract.extract_extract + } + + include $file; + } +} diff --git a/src/Admin/Menus.php b/src/Admin/Menus.php new file mode 100644 index 00000000..9bc0e237 --- /dev/null +++ b/src/Admin/Menus.php @@ -0,0 +1,76 @@ +is_premium_active() ) { + add_submenu_page( + 'wc-serial-numbers', + '', + ' ' . __( 'Go Pro', 'wc-serial-numbers' ) . '', + $role, + 'go_wcsn_pro', + array( $this, 'go_pro_redirect' ) + ); + } + } + + /** + * Redirect to pro page. + * + * @since 1.0.0 + * @return void + */ + public function go_pro_redirect() { + if ( isset( $_GET['page'] ) && 'go_wcsn_pro' === $_GET['page'] ) { + wp_redirect( 'https://www.pluginever.com/plugins/woocommerce-serial-numbers-pro/?utm_source=wp-menu&utm_campaign=gopro&utm_medium=wp-dash' ); + die; + } + } +} diff --git a/src/Admin/Notices.php b/src/Admin/Notices.php new file mode 100644 index 00000000..935d3de9 --- /dev/null +++ b/src/Admin/Notices.php @@ -0,0 +1,64 @@ + 'error', + 'message' => sprintf( + /* translators: %1$s: link to the plugin page, %2$s: link to the plugin page */ + __( '%s is not functional because you are using outdated version of the plugin, please update to the version 1.1.9 or higher.', 'wc-serial-numbers' ), + 'WooCommerce Serial Numbers Pro' + ), + ); + } + + /** + * Admin notices. + * + * @since 1.0.0 + */ + public function output_notices() { + foreach ( $this->notices as $notice ) { + ?> +
+

+
+ __( 'General', 'wc-serial-numbers' ), + ); + + return apply_filters( 'wc_serial_numbers_settings_tabs', $tabs ); + } + + /** + * Get settings. + * + * @param string $tab Current tab. + * + * @since 1.0.0 + * @return array + */ + public function get_settings( $tab ) { + $settings = array(); + + switch ( $tab ) { + case 'general': + $settings = array( + [ + 'title' => __( 'General settings', 'wc-serial-numbers' ), + 'type' => 'title', + 'desc' => __( 'The following options affect how the serial numbers will work.', 'wc-serial-numbers' ), + 'id' => 'section_serial_numbers', + ], + [ + 'title' => __( 'Auto-complete order', 'wc-serial-numbers' ), + 'id' => 'wc_serial_numbers_autocomplete_order', + 'desc' => __( 'Automatically completes orders after successfull payments.', 'wc-serial-numbers' ), + 'type' => 'checkbox', + 'default' => 'no', + ], + [ + 'title' => __( 'Reuse serial number', 'wc-serial-numbers' ), + 'id' => 'wc_serial_numbers_reuse_serial_number', + 'desc' => __( 'Recover failed, refunded serial numbers for selling again.', 'wc-serial-numbers' ), + 'desc_tip' => __( 'If you enable this option, the serial number will be available for selling again if the order is refunded or failed.', 'wc-serial-numbers' ), + 'type' => 'checkbox', + 'default' => 'no', + ], + [ + 'title' => __( 'Revoke status', 'wc-serial-numbers' ), + 'desc' => __( 'Cancelled', 'wc-serial-numbers' ), + 'id' => 'wc_serial_numbers_revoke_status_cancelled', + 'default' => 'yes', + 'type' => 'checkbox', + 'checkboxgroup' => 'start', + 'show_if_checked' => 'option', + ], + [ + 'desc' => __( 'Refunded', 'wc-serial-numbers' ), + 'id' => 'wc_serial_numbers_revoke_status_refunded', + 'default' => 'yes', + 'type' => 'checkbox', + 'checkboxgroup' => '', + + ], + [ + 'desc' => __( 'Failed', 'wc-serial-numbers' ), + 'id' => 'wc_serial_numbers_revoke_status_failed', + 'default' => 'yes', + 'type' => 'checkbox', + 'checkboxgroup' => 'end', + + ], + [ + 'title' => __( 'Hide serial number', 'wc-serial-numbers' ), + 'id' => 'wc_serial_numbers_hide_serial_number', + 'desc' => __( 'All serial numbers will be hidden and only displayed when the "Show" button is clicked.', 'wc-serial-numbers' ), + 'default' => 'yes', + 'type' => 'checkbox', + ], + [ + 'title' => __( 'Disable software support', 'wc-serial-numbers' ), + 'id' => 'wc_serial_numbers_disable_software_support', + 'desc' => __( 'Disable Software Licensing support & API functionalities.', 'wc-serial-numbers' ), + 'default' => 'no', + 'type' => 'checkbox', + ], + [ + 'type' => 'sectionend', + 'id' => 'section_serial_numbers', + ], + [ + 'title' => __( 'Stock notification', 'wc-serial-numbers' ), + 'type' => 'title', + 'desc' => __( 'The following options affects how stock notification will work.', 'wc-serial-numbers' ), + 'id' => 'stock_section', + ], + [ + 'title' => __( 'Stock notification email', 'wc-serial-numbers' ), + 'id' => 'wc_serial_numbers_enable_stock_notification', + 'desc' => __( 'Sends notification emails when product stock is low.', 'wc-serial-numbers' ), + 'type' => 'checkbox', + 'sanitize_callback' => 'intval', + 'default' => 'yes', + ], + array( + 'title' => __( 'Stock threshold', 'wc-serial-numbers' ), + 'id' => 'wc_serial_numbers_stock_threshold', + 'desc' => __( 'When stock goes below the above number, it will send notification email.', 'wc-serial-numbers' ), + 'type' => 'number', + 'default' => '5', + ), + array( + 'title' => __( 'Notification recipient email', 'wc-serial-numbers' ), + 'id' => 'wc_serial_numbers_notification_recipient', + 'desc' => __( 'The email address to be used for sending the email notifications.', 'wc-serial-numbers' ), + 'type' => 'text', + 'default' => get_option( 'admin_email' ), + ), + [ + 'type' => 'sectionend', + 'id' => 'stock_section', + ], + ); + break; + } + /** + * Filter the settings for the plugin. + * + * @param array $settings The settings. + * + * @deprecated 1.4.1 + */ + $settings = apply_filters( 'wc_serial_numbers_' . $tab . '_settings_fields', $settings ); + + return apply_filters( 'wc_serial_numbers_get_settings_' . $tab, $settings ); + } + + /** + * Output premium widget. + * + * @since 1.0.0 + * @return void + */ + protected function output_premium_widget() { + if ( wc_serial_numbers()->is_premium_active() ) { + return; + } + $features = array( + __( 'Create and assign license keys for WooCommerce variable products.', 'wc-serial-numbers' ), + __( 'Generate bulk license keys with your custom key generator rule.', 'wc-serial-numbers' ), + __( 'Random & sequential order for the generator rules.', 'wc-serial-numbers' ), + __( 'Automatic license key generator to auto-create & assign keys with orders.', 'wc-serial-numbers' ), + __( 'License key management option from the order page with required actions.', 'wc-serial-numbers' ), + __( 'Support for bulk import/export of license keys from/to CSV.', 'wc-serial-numbers' ), + __( 'Option to sell license keys even if there are no available keys in the stock.', 'wc-serial-numbers' ), + __( 'Custom deliverable quantity to deliver multiple keys with a single product.', 'wc-serial-numbers' ), + __( 'Manual delivery option to manually deliver license keys instead of automatic.', 'wc-serial-numbers' ), + __( 'Email Template to easily and quickly customize the order confirmation & low stock alert email.', 'wc-serial-numbers' ), + __( 'Many more ...', 'wc-serial-numbers' ), + ); + ?> +
+

+

+
    + +
  • -
  • + +
+ +
+ get_meta_links(), + parent::get_support_links() + ); + } +} diff --git a/src/Installer.php b/src/Installer.php new file mode 100644 index 00000000..d7786493 --- /dev/null +++ b/src/Installer.php @@ -0,0 +1,335 @@ + 'update_112', + '1.2.0' => 'update_120', + '1.2.1' => 'update_121', + ); + + /** + * Installer constructor. + * + * @since 1.4.2 + */ + protected function __construct() { + add_filter( 'cron_schedules', array( __CLASS__, 'custom_cron_schedules' ), 20 ); // phpcs:ignore WordPress.WP.CronInterval.CronSchedulesInterval + add_action( 'init', array( $this, 'check_update' ), 0 ); + } + + /** + * Add custom cron schedule + * + * @param array $schedules list of cron schedules. + * + * @since 1.0.0 + * @return array + */ + public static function custom_cron_schedules( $schedules ) { + $schedules ['once_a_minute'] = array( + 'interval' => 60, + 'display' => esc_html__( 'Once a Minute', 'wc-serial-numbers' ), + ); + + return $schedules; + } + + /** + * Check the plugin version and run the updater if necessary. + * + * This check is done on all requests and runs if the versions do not match. + * + * @since 1.4.2 + * @return void + */ + public function check_update() { + $db_version = get_option( 'wc_serial_numbers_version' ); + $current_version = wc_serial_numbers()->get_version(); + $requires_update = version_compare( $db_version, $current_version, '<' ); + $can_install = ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) && ! defined( 'IFRAME_REQUEST' ); + if ( $can_install && $requires_update ) { + static::install(); + + $update_versions = array_keys( $this->updates ); + usort( $update_versions, 'version_compare' ); + if ( ! is_null( $db_version ) && version_compare( $db_version, end( $update_versions ), '<' ) ) { + $this->update(); + } else { + update_option( 'wc_serial_numbers_version', $current_version ); + } + } + } + + /** + * Update the plugin. + * + * @since 1.4.2 + * @return void + */ + public function update() { + $db_version = get_option( 'wc_serial_numbers_version' ); + foreach ( $this->updates as $version => $callbacks ) { + $callbacks = (array) $callbacks; + if ( version_compare( $db_version, $version, '<' ) ) { + foreach ( $callbacks as $callback ) { + wc_serial_numbers()->log( sprintf( 'Updating to %s from %s', $version, $db_version ) ); + // if the callback return false then we need to update the db version. + $continue = call_user_func( array( $this, $callback ) ); + if ( ! $continue ) { + update_option( 'wc_serial_numbers_version', $version ); + $notice = sprintf( + /* translators: 1: plugin name 2: version number */ + __( '%1$s updated to version %2$s successfully.', 'wc-serial-numbers' ), + 'Serial Numbers for WooCommerce', + '' . $version . '' + ); + wc_serial_numbers()->add_notice( $notice, 'success' ); + } + } + } + } + } + + /** + * Install the plugin. + * + * @since 1.4.2 + * @return void + */ + public static function install() { + if ( ! is_blog_installed() ) { + return; + } + + self::create_tables(); + self::create_cron_jobs(); + Admin\Settings::get_instance()->save_defaults(); + add_option( 'wc_serial_numbers_version', wc_serial_numbers()->get_version() ); + add_option( 'wc_serial_numbers_install_date', current_time( 'mysql' ) ); + set_transient( 'wc_serial_numbers_activated', true, 30 ); + set_transient( 'wc_serial_numbers_activation_redirect', true, 30 ); + } + + /** + * Create tables. + * + * @return void + */ + public static function create_tables() { + global $wpdb; + $wpdb->hide_errors(); + $tables = [ + "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}serial_numbers( + id bigint(20) NOT NULL AUTO_INCREMENT, + serial_key longtext DEFAULT NULL, + product_id bigint(20) NOT NULL, + activation_limit int(9) NOT NULL DEFAULT 0, + activation_count int(9) NOT NULL DEFAULT 0, + order_id bigint(20) DEFAULT NULL, + vendor_id bigint(20) DEFAULT NULL, + status varchar(50) DEFAULT 'available', + validity varchar(200) DEFAULT NULL, + expire_date DATETIME NULL DEFAULT NULL, + order_date DATETIME NULL DEFAULT NULL, + source varchar(50) DEFAULT 'custom_source', + created_date DATETIME NULL DEFAULT NULL, + PRIMARY KEY (id), + key product_id (product_id), + key order_id (order_id), + key vendor_id (vendor_id), + key activation_limit (activation_limit), + key status (status) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ", + "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}serial_numbers_activations( + id bigint(20) NOT NULL auto_increment, + serial_id bigint(20) NOT NULL, + instance varchar(200) NOT NULL, + active int(1) NOT NULL DEFAULT 1, + platform varchar(200) DEFAULT NULL, + activation_time DATETIME NULL DEFAULT NULL, + PRIMARY KEY (id), + key serial_id (serial_id), + key active (active) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8;", + ]; + + require_once ABSPATH . 'wp-admin/includes/upgrade.php'; + foreach ( $tables as $table ) { + dbDelta( $table ); + } + } + + /** + * Create cron jobs (clear them first). + * + * @since 1.0.0 + * @return void + */ + public static function create_cron_jobs() { + // setup transient actions. + if ( false === wp_next_scheduled( 'wc_serial_numbers_hourly_event' ) ) { + wp_schedule_event( time(), 'hourly', 'wc_serial_numbers_hourly_event' ); + } + + if ( false === wp_next_scheduled( 'wc_serial_numbers_daily_event' ) ) { + wp_schedule_event( time(), 'daily', 'wc_serial_numbers_daily_event' ); + } + } + + /** + * Update to version 1.1.2 + * + * @since 1.1.2 + * @return void + */ + protected function update_112() { + global $wpdb; + $wpdb->query( "ALTER TABLE {$wpdb->prefix}wcsn_serial_numbers ADD KEY product_id(`product_id`)" ); + $wpdb->query( "ALTER TABLE {$wpdb->prefix}wcsn_serial_numbers ADD KEY order_id (`order_id`)" ); + $wpdb->query( "ALTER TABLE {$wpdb->prefix}wcsn_serial_numbers ADD KEY status (`status`)" ); + + $wpdb->query( "ALTER TABLE {$wpdb->prefix}wcsn_serial_numbers CHANGE expire_date expire_date DATETIME DEFAULT NULL" ); + $wpdb->query( "ALTER TABLE {$wpdb->prefix}wcsn_serial_numbers CHANGE order_date order_date DATETIME DEFAULT NULL" ); + $wpdb->query( "UPDATE {$wpdb->prefix}wcsn_serial_numbers set expire_date=NULL WHERE expire_date='0000-00-00 00:00:00'" ); + $wpdb->query( "UPDATE {$wpdb->prefix}wcsn_serial_numbers set order_date=NULL WHERE order_date='0000-00-00 00:00:00'" ); + + $wpdb->query( "ALTER TABLE {$wpdb->prefix}wcsn_activations ADD KEY serial_id (`serial_id`)" ); + } + + /** + * Update to version 1.2.0 + * + * @since 1.2.0 + * @return void + */ + protected function update_120() { + wp_clear_scheduled_hook( 'wcsn_per_minute_event' ); + wp_clear_scheduled_hook( 'wcsn_daily_event' ); + wp_clear_scheduled_hook( 'wcsn_hourly_event' ); + + if ( ! wp_next_scheduled( 'wc_serial_numbers_hourly_event' ) ) { + wp_schedule_event( time(), 'hourly', 'wc_serial_numbers_hourly_event' ); + } + + if ( ! wp_next_scheduled( 'wc_serial_numbers_daily_event' ) ) { + wp_schedule_event( time(), 'daily', 'wc_serial_numbers_daily_event' ); + } + + global $wpdb; + $prefix = $wpdb->prefix; + $wpdb->query( "RENAME TABLE `{$prefix}wcsn_serial_numbers` TO `{$prefix}serial_numbers`" ); + $wpdb->query( "RENAME TABLE `{$prefix}wcsn_activations` TO `{$prefix}serial_numbers_activations`" ); + + $wpdb->query( "ALTER TABLE {$prefix}serial_numbers DROP COLUMN `serial_image`;" ); + $wpdb->query( "ALTER TABLE {$prefix}serial_numbers DROP COLUMN `activation_email`;" ); + $wpdb->query( "ALTER TABLE {$prefix}serial_numbers CHANGE `created` `created_date` DATETIME NULL DEFAULT NULL;" ); + $wpdb->query( "ALTER TABLE {$prefix}serial_numbers ADD vendor_id bigint(20) NOT NULL DEFAULT 0" ); + $wpdb->query( "ALTER TABLE {$prefix}serial_numbers ADD activation_count int(9) NOT NULL DEFAULT 0" ); + $wpdb->query( "ALTER TABLE {$prefix}serial_numbers ADD KEY vendor_id(`vendor_id`)" ); + $wpdb->query( "ALTER TABLE {$prefix}serial_numbers ADD source varchar(200) NOT NULL default 'custom_source'" ); + $wpdb->query( "ALTER TABLE {$prefix}serial_numbers_activations CHANGE platform platform varchar(200) DEFAULT NULL" ); + // status update + $wpdb->query( $wpdb->prepare( "UPDATE {$prefix}serial_numbers set status=%s WHERE status=%s AND order_id=0", 'available', 'new' ) ); + $wpdb->query( $wpdb->prepare( "UPDATE {$prefix}serial_numbers set status=%s WHERE status=%s AND order_id != 0", 'sold', 'active' ) ); + $wpdb->query( $wpdb->prepare( "UPDATE {$prefix}serial_numbers set status=%s WHERE status=%s", 'cancelled', 'pending' ) ); + $wpdb->query( $wpdb->prepare( "UPDATE {$prefix}serial_numbers set status=%s WHERE status=%s", 'cancelled', 'rejected' ) ); + global $current_user; + if ( ! empty( $current_user->ID ) && current_user_can( 'manage_options' ) ) { + $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->prefix}serial_numbers set vendor_id=%d", $current_user->ID ) ); + } + + $activations = $wpdb->get_results( "select serial_id, count(id) as active_count from {$wpdb->prefix}serial_numbers_activations where active='1' GROUP BY serial_id" ); + foreach ( $activations as $activation ) { + global $wpdb; + $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->prefix}serial_numbers SET activation_count = %d WHERE id=%d", intval( $activation->active_count ), intval( $activation->serial_id ) ) ); + } + + $wpdb->query( "UPDATE {$wpdb->prefix}serial_numbers set status='available', order_date='0000-00-00 00:00:00', order_id='0' WHERE status !='available' AND order_id='0' AND expire_date='0000-00-00 00:00:00'" ); + + // settings update + $heading_text = $this->update_1_2_0_get_option( 'heading_text', 'Serial Numbers', 'wsn_delivery_settings' ); + $serial_col_heading = $this->update_1_2_0_get_option( 'table_column_heading', 'Serial Number', 'wsn_delivery_settings' ); + $serial_key_label = $this->update_1_2_0_get_option( 'serial_key_label', 'Serial Number', 'wsn_delivery_settings' ); + $serial_email_label = $this->update_1_2_0_get_option( 'serial_email_label', 'Activation Email', 'wsn_delivery_settings' ); + $show_validity = 'yes' === $this->update_1_2_0_get_option( 'show_validity', 'yes', 'wsn_delivery_settings' ); + $show_activation_limit = 'yes' === $this->update_1_2_0_get_option( 'show_activation_limit', 'yes', 'wsn_delivery_settings' ); + $license = get_option( 'woocommerce_serial_numbers_pro_pluginever_license' ); + $options = [ + 'wc_serial_numbers_autocomplete_order' => $this->update_1_2_0_get_option( 'wsn_auto_complete_order', 'yes', 'wsn_delivery_settings' ), + 'wc_serial_numbers_reuse_serial_number' => $this->update_1_2_0_get_option( 'wsn_re_use_serial', 'no', 'wsn_delivery_settings' ), + 'wc_serial_numbers_disable_software_support' => 'no', + 'wc_serial_numbers_manual_delivery' => 'no', + 'wc_serial_numbers_hide_serial_number' => 'yes', + 'wc_serial_numbers_revoke_status_cancelled' => in_array( 'cancelled', $this->update_1_2_0_get_option( 'wsn_revoke_serial_number', [], 'wsn_delivery_settings' ), true ) ? 'yes' : 'no', + 'wc_serial_numbers_revoke_status_refunded' => in_array( 'refunded', $this->update_1_2_0_get_option( 'wsn_revoke_serial_number', [], 'wsn_delivery_settings' ), true ) ? 'yes' : 'no', + 'wc_serial_numbers_revoke_status_failed' => in_array( 'failed', $this->update_1_2_0_get_option( 'wsn_revoke_serial_number', [], 'wsn_delivery_settings' ), true ) ? 'yes' : 'no', + 'wc_serial_numbers_enable_stock_notification' => $this->update_1_2_0_get_option( 'wsn_admin_bar_notification_send_email', 'yes', 'wsn_notification_settings' ), + 'wc_serial_numbers_stock_threshold' => $this->update_1_2_0_get_option( 'wsn_admin_bar_notification_number', '5', 'wsn_notification_settings' ), + 'wc_serial_numbers_notification_recipient' => $this->update_1_2_0_get_option( 'wsn_admin_bar_notification_email', get_option( 'admin_email' ), 'wsn_notification_settings' ), + 'wc_serial_numbers_order_table_heading' => $heading_text, + 'wc_serial_numbers_order_table_col_product_label' => 'Product', + 'wc_serial_numbers_order_table_col_key_label' => $serial_key_label, + 'wc_serial_numbers_order_table_col_email_label' => $serial_email_label, + 'wc_serial_numbers_order_table_col_limit_label' => 'Activation Limit', + 'wc_serial_numbers_order_table_col_expires_label' => 'Expire Date', + 'wc_serial_numbers_order_table_col_product' => 'yes', + 'wc_serial_numbers_order_table_col_key' => 'yes', + 'wc_serial_numbers_order_table_col_email' => 'no', + 'wc_serial_numbers_order_table_col_limit' => $show_activation_limit ? 'yes' : 'no', + 'wc_serial_numbers_order_table_col_expires' => $show_validity ? 'yes' : 'no', + 'wc_serial_numbers_install_time' => get_option( 'woocommerceserialnumbers_install_time' ), + 'woocommerce-serial-numbers-pro_license_key' => array_key_exists( 'key', $license ) ? $license['key'] : '', + 'woocommerce-serial-numbers-pro_license_status' => array_key_exists( 'license', $license ) ? $license['license'] : '', + ]; + foreach ( $options as $key => $option ) { + add_option( $key, $option ); + } + } + + /** + * Get option from old settings. + * + * @param string $option_name Option name. + * @param string $default Default value. + * @param string $section Section name. + * + * @return string + */ + protected function update_1_2_0_get_option( $option_name, $default, $section = 'serial_numbers_settings' ) { + $settings = get_option( $section, [] ); + + return ! empty( $settings[ $option_name ] ) ? $settings[ $option_name ] : $default; + } + + /** + * Update to version 1.2.1 + * + * @since 1.2.1 + * @return void + */ + protected function update_121() { + global $wpdb; + $prefix = $wpdb->prefix; + $wpdb->query( "ALTER TABLE {$prefix}serial_numbers CHANGE order_id order_id bigint(20) DEFAULT NULL" ); + $wpdb->query( "ALTER TABLE {$prefix}serial_numbers CHANGE vendor_id vendor_id bigint(20) DEFAULT NULL" ); + } +} diff --git a/src/Plugin.php b/src/Plugin.php new file mode 100644 index 00000000..2bce3380 --- /dev/null +++ b/src/Plugin.php @@ -0,0 +1,163 @@ +includes(); + $this->init_hooks(); + } + + /** + * Include required files. + * + * @since 1.0.0 + * @return void + */ + public function includes() { + require_once __DIR__ . '/functions.php'; + require_once dirname( __FILE__, 2 ) . '/includes/wc-serial-numbers-functions.php'; + require_once dirname( __FILE__, 2 ) . '/includes/wc-serial-numbers-misc-functions.php'; + require_once dirname( __FILE__, 2 ) . '/includes/class-wc-serial-numbers-query.php'; + require_once dirname( __FILE__, 2 ) . '/includes/class-wc-serial-numbers-encryption.php'; + require_once dirname( __FILE__, 2 ) . '/includes/class-wc-serial-numbers-order-handler.php'; + require_once dirname( __FILE__, 2 ) . '/includes/class-wc-serial-numbers-api.php'; + require_once dirname( __FILE__, 2 ) . '/includes/class-wc-serial-numbers-cron.php'; + require_once dirname( __FILE__, 2 ) . '/includes/class-wc-serial-numbers-compat.php'; + + if ( is_admin() ) { + require_once dirname( __FILE__, 2 ) . '/includes/admin/class-wc-serial-numbers-admin.php'; + } + do_action( 'wc_serial_numbers__loaded' ); + } + + /** + * Hook into actions and filters. + * + * @since 1.0.0 + * @return void + */ + public function init_hooks() { + register_activation_hook( $this->get_file(), array( Installer::class, 'install' ) ); + add_action( 'admin_notices', array( $this, 'dependencies_notices' ) ); + add_action( 'woocommerce_loaded', array( $this, 'init' ), 0 ); + } + + /** + * Missing dependencies notice. + * + * @since 1.0.0 + * @return void + */ + public function dependencies_notices() { + if ( $this->is_plugin_active( 'woocommerce' ) ) { + return; + } + $notice = sprintf( + /* translators: 1: plugin name 2: WooCommerce */ + __( '%1$s requires %2$s to be installed and active.', 'wc-serial-numbers' ), + '' . esc_html( $this->get_name() ) . '', + '' . esc_html__( 'WooCommerce', 'wc-serial-numbers' ) . '' + ); + + echo '

' . wp_kses_post( $notice ) . '

'; + } + + /** + * Init the plugin after plugins_loaded so environment variables are set. + * + * @since 1.0.0 + * @return void + */ + public function init() { + Installer::instantiate(); + Scripts::instantiate(); + AJAX::instantiate(); + + if ( is_admin() || ( defined( 'WP_CLI' ) && WP_CLI ) ) { + Admin\Admin::instantiate(); + } + // Init action. + do_action( 'wc_serial_numbers_loaded' ); + } + + /** + * Determines if the pro version active. + * + * @since 1.0.0 + * @return bool + * @deprecated 1.4.0 + */ + public static function is_pro_active() { + _deprecated_function( __METHOD__, '1.4.0', 'Plugin::is_premium_active()' ); + + return self::$instance->is_premium_active(); + } + + /** + * Determines if the wc is active. + * + * @since 1.0.0 + * @return bool + * @deprecated 1.4.0 + */ + public function is_wc_active() { + return $this->is_plugin_active( 'woocommerce/woocommerce.php' ); + } + + /** + * Plugin URL getter. + * + * @since 1.2.0 + * @return string + * @deprecated 1.4.0 + */ + public function plugin_url() { + _deprecated_function( __METHOD__, '1.4.0', 'Plugin::get_url()' ); + + return $this->get_url(); + } + + /** + * Plugin path getter. + * + * @since 1.2.0 + * @return string + * @deprecated 1.4.0 + */ + public function plugin_path() { + _deprecated_function( __METHOD__, '1.4.0', 'Plugin::get_path()' ); + + return $this->get_path(); + } + + /** + * Plugin base path name getter. + * + * @since 1.2.0 + * @return string + * @deprecated 1.4.2 + */ + public function plugin_basename() { + _deprecated_function( __METHOD__, '1.4.2', 'Plugin::get_basename()' ); + + return $this->get_basename(); + } +} diff --git a/src/Scripts.php b/src/Scripts.php new file mode 100644 index 00000000..b126a99e --- /dev/null +++ b/src/Scripts.php @@ -0,0 +1,73 @@ +get_screen_ids(); + if ( ! in_array( $hook, $screen_ids, true ) ) { + return; + } + wp_enqueue_style( 'jquery-ui-style' ); + wp_enqueue_style( 'select2' ); + wp_enqueue_script( 'jquery-ui-datepicker' ); + + wc_serial_numbers()->enqueue_style( 'wc-serial-numbers-admin', 'css/admin-style.css' ); + wc_serial_numbers()->enqueue_script( 'wc-serial-numbers-admin', 'js/admin-script.js', array( 'jquery', 'jquery-ui-datepicker', 'select2' ) ); + wp_localize_script( + 'wc-serial-numbers-admin', + 'wc_serial_numbers_vars', + array( + 'i18n' => array( + 'search_product' => __( 'Search product by name', 'wc-serial-numbers' ), + 'search_order' => __( 'Search order', 'wc-serial-numbers' ), + 'show' => __( 'Show', 'wc-serial-numbers' ), + 'hide' => __( 'Hide', 'wc-serial-numbers' ), + ), + 'search_nonce' => wp_create_nonce( 'wc_serial_numbers_search_nonce' ), + 'ajaxurl' => admin_url( 'admin-ajax.php' ), + ) + ); + } + + +} diff --git a/src/functions.php b/src/functions.php new file mode 100644 index 00000000..20310bef --- /dev/null +++ b/src/functions.php @@ -0,0 +1,19 @@ +version; - } - - /** - * Plugin URL getter. - * - * @return string - * @since 1.2.0 - */ - public function plugin_url() { - return untrailingslashit( plugins_url( '/', __FILE__ ) ); - } - - /** - * Plugin path getter. - * - * @return string - * @since 1.2.0 - */ - public function plugin_path() { - return untrailingslashit( plugin_dir_path( __FILE__ ) ); - } - - /** - * Plugin base path name getter. - * - * @return string - * @since 1.2.0 - */ - public function plugin_basename() { - return plugin_basename( __FILE__ ); - } - - /** - * Initialize plugin for localization - * - * @return void - * @since 1.0.0 - * - */ - public function localization_setup() { - load_plugin_textdomain( 'wc-serial-numbers', false, plugin_basename( dirname( __FILE__ ) ) . '/i18n/languages' ); - } - - /** - * Determines if the pro version active. - * - * @return bool - * @since 1.0.0 - * - */ - public function is_pro_active() { - include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); - - return is_plugin_active( 'wc-serial-numbers-pro/wc-serial-numbers-pro.php' ) == true; - } - - /** - * Determines if the wc active. - * - * @return bool - * @since 1.0.0 - * - */ - public function is_wc_active() { - include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); - - return is_plugin_active( 'woocommerce/woocommerce.php' ) == true; - } - - /** - * WooCommerce plugin dependency notice - * @since 1.2.0 - */ - public function wc_missing_notice() { - if ( ! $this->is_wc_active() ) { - $message = sprintf( __( 'WooCommerce Serial Numbers requires WooCommerce installed and activated. Please Install %s WooCommerce. %s', 'wc-serial-numbers' ), - '', '' ); - echo sprintf( '

%s

', $message ); - } - } - - /** - * Define constant if not already defined - * - * @param string $name - * @param string|bool $value - * - * @return void - * @since 1.2.0 - * - */ - private function define( $name, $value ) { - if ( ! defined( $name ) ) { - define( $name, $value ); - } +function wc_serial_numbers_autoload( $class_name ) { + // Bail out if the class name doesn't start with our prefix. + if ( strpos( $class_name, 'WooCommerceSerialNumbers\\' ) !== 0 ) { + return; } - /** - * Throw error on object clone - * - * The whole idea of the singleton design pattern is that there is a single - * object therefore, we don't want the object to be cloned. - * - * @access protected - * @return void - */ - - public function __clone() { - _doing_it_wrong( __FUNCTION__, __( 'Cheatin’ huh?', 'wc-serial-numbers' ), '1.0.0' ); - } + // Remove the prefix from the class name. + $class_name = substr( $class_name, strlen( 'WooCommerceSerialNumbers\\' ) ); - /** - * Disable unserializing of the class - * - * @access protected - * @return void - */ + // Replace the namespace separator with the directory separator. + $class_name = str_replace( '\\', DIRECTORY_SEPARATOR, $class_name ); - public function __wakeup() { - _doing_it_wrong( __FUNCTION__, __( 'Cheatin’ huh?', 'wc-serial-numbers' ), '1.0.0' ); - } - - /** - * WC_Serial_Numbers constructor. - */ - private function __construct() { - $this->define_constants(); - register_activation_hook( __FILE__, array( $this, 'activate_plugin' ) ); - register_deactivation_hook( __FILE__, array( $this, 'deactivate_plugin' ) ); - - add_action( 'woocommerce_loaded', array( $this, 'init_plugin' ) ); - add_action( 'admin_notices', array( $this, 'wc_missing_notice' ) ); - } - - /** - * Define all constants - * @return void - * @since 1.2.0 - */ - public function define_constants() { - $this->define( 'WC_SERIAL_NUMBER_PLUGIN_VERSION', $this->version ); - $this->define( 'WC_SERIAL_NUMBER_PLUGIN_FILE', __FILE__ ); - $this->define( 'WC_SERIAL_NUMBER_PLUGIN_DIR', dirname( __FILE__ ) ); - $this->define( 'WC_SERIAL_NUMBER_PLUGIN_INC_DIR', dirname( __FILE__ ) . '/includes' ); - } - - /** - * Activate plugin. - * - * @return void - * @since 1.2.0 - */ - public function activate_plugin() { - require_once dirname( __FILE__ ) . '/includes/class-wc-serial-numbers-installer.php'; - WC_Serial_Numbers_Installer::install(); - } + // Add the .php extension. + $class_name = $class_name . '.php'; - /** - * Deactivate plugin. - * - * @return void - * @since 1.2.0 - */ - public function deactivate_plugin() { + $file_paths = array( + __DIR__ . DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR . $class_name, + __DIR__ . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR . $class_name, + ); - } - - /** - * Load the plugin when WooCommerce loaded. - * - * @return void - * @since 1.2.0 - */ - public function init_plugin() { - $this->includes(); - $this->init_hooks(); - } - - - /** - * Include required core files used in admin and on the frontend. - * @since 1.2.0 - */ - public function includes() { - require_once dirname( __FILE__ ) . '/includes/wc-serial-numbers-functions.php'; - require_once dirname( __FILE__ ) . '/includes/wc-serial-numbers-misc-functions.php'; - require_once dirname( __FILE__ ) . '/includes/class-wc-serial-numbers-query.php'; - require_once dirname( __FILE__ ) . '/includes/class-wc-serial-numbers-installer.php'; - require_once dirname( __FILE__ ) . '/includes/class-wc-serial-numbers-order-handler.php'; - require_once dirname( __FILE__ ) . '/includes/class-wc-serial-numbers-encryption.php'; - require_once dirname( __FILE__ ) . '/includes/class-wc-serial-numbers-ajax.php'; - require_once dirname( __FILE__ ) . '/includes/class-wc-serial-numbers-api.php'; - require_once dirname( __FILE__ ) . '/includes/class-wc-serial-numbers-cron.php'; - require_once dirname( __FILE__ ) . '/includes/class-wc-serial-numbers-compat.php'; - - if ( is_admin() ) { - require_once dirname( __FILE__ ) . '/includes/admin/class-wc-serial-numbers-admin.php'; + foreach ( $file_paths as $file_path ) { + if ( file_exists( $file_path ) ) { + require_once $file_path; + break; } - do_action( 'wc_serial_numbers__loaded' ); - } - - - /** - * Hook into actions and filters. - * - * @since 1.0.0 - */ - private function init_hooks() { - add_action( 'plugins_loaded', array( $this, 'localization_setup' ) ); - //add_action( 'plugins_loaded', array( $this, 'on_plugins_loaded' ), - 1 ); } - - - /** - * When WP has loaded all plugins, trigger the `wc_serial_numbers__loaded` hook. - * - * This ensures `wc_serial_numbers__loaded` is called only after all other plugins - * are loaded, to avoid issues caused by plugin directory naming changing - * - * @since 1.0.0 - */ - public function on_plugins_loaded() { - do_action( 'wc_serial_numbers__loaded' ); - } - } +spl_autoload_register( 'wc_serial_numbers_autoload' ); /** - * The main function responsible for returning the one true WC Serial Numbers - * Instance to functions everywhere. - * - * Use this function like you would a global variable, except without needing - * to declare the global. + * Get the plugin instance. * - * @return WC_Serial_Numbers - * @since 1.2.0 + * @since 1.0.0 + * @return Plugin */ function wc_serial_numbers() { - return WC_Serial_Numbers::init(); + $data = array( + 'file' => __FILE__, + 'settings_url' => admin_url( 'admin.php?page=wc-serial-numbers-settings' ), + 'support_url' => 'https://pluginever.com/support/', + 'docs_url' => 'https://pluginever.com/docs/wocommerce-serial-numbers/', + 'premium_url' => 'https://pluginever.com/plugins/wc-serial-numbers/', + 'premium_slug' => 'wc-serial-numbers-pro', + 'review_url' => 'https://wordpress.org/support/plugin/wc-serial-numbers/reviews/?filter=5#new-post', + ); + + return Plugin::create( $data ); } -//lets go. +// Initialize the plugin. wc_serial_numbers(); diff --git a/webpack.config.js b/webpack.config.js index 21e99777..ee8c8e47 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -10,9 +10,7 @@ module.exports = { ...defaultConfig, entry: { 'css/admin-style': './assets/css/admin-style.scss', - 'js/admin-script': './assets/js/admin-script.js', - 'css/settings': './assets/css/settings.scss', - 'js/settings': './assets/js/settings.js', + 'js/admin-script': './assets/js/admin-script.js' }, output: { clean: true,