Plugin Directory

Changeset 2901887


Ignore:
Timestamp:
04/20/2023 03:43:09 PM (3 years ago)
Author:
cartboss
Message:

3.6.5 release

Location:
cartboss/trunk
Files:
6 added
47 edited

Legend:

Unmodified
Added
Removed
  • cartboss/trunk/README.txt

    r2897230 r2901887  
    1 === SMS Abandoned Cart Recovery - CartBoss ===
     1=== SMS Abandoned Cart Recovery CartBoss ===
    22Contributors: Cart DATA Ltd.
    33Donate link: https://www.cartboss.io
     
    1414Boost your sales by recovering abandoned carts with pre-prepared & translated text messages!
    1515
    16 
    1716== Description ==
    1817🔥**Start sending abandoned cart text messages (SMS), improve your customer lifetime value, and reduce dead stock in less than 5 minutes**
    1918
    2019Boost your sales by recovering abandoned carts with pre-prepared & translated text messages.
    21 ====================
     20
     21Recover lost sales, increase customer loyalty, and reduce inventory waste with the power of SMS! In just under 5 minutes, you can start using our SMS abandoned cart solution to achieve all these goals without having to worry about writing messages, translating them, or setting up discount codes. Our user-friendly system works right out of the box, automatically detecting the recipient's language and generating discounts on the spot.
    2222
    2323## When we say Plug & Play, we mean it!
  • cartboss/trunk/admin/partials/cartboss-admin-display.php

    r2718232 r2901887  
    4646                                    <li>Latest version: <?php echo Cartboss_Options::get_latest_version() ?></li>
    4747                                    <li>API key valid: <?php echo Cartboss_Options::get_is_valid_api_key() ? "✅️" : "❌"; ?></li>
    48                                     <li>Sending events: <?php echo Cartboss_Options::is_enabled() ? "✅️" : "❌"; ?></li>
    4948                                </ul>
    5049                            </div>
  • cartboss/trunk/cartboss.php

    r2847751 r2901887  
    1717 * Plugin URI:        https://www.cartboss.io
    1818 * Description:       Send abandoned cart notifications, offer discounts and special offers - all with text messages.
    19  * Version:           3.6.1
     19 * Version:           3.6.5
    2020 * Author:            Cart DATA Ltd.
    2121 * Author URI:        https://www.cartboss.io
     
    4646 */
    4747
    48 define('CARTBOSS_VERSION', '3.6.1');
     48define('CARTBOSS_VERSION', '3.6.5');
    4949define('CARTBOSS_PLUGIN_NAME', plugin_basename(__FILE__));
    5050
  • cartboss/trunk/changelog.txt

    r2847751 r2901887  
    11# Changelog
    22All notable changes to this project will be documented in this file.
     3
     4## [3.6.5] - 02-03-2023
     5 - meta data fix
    36
    47## [3.6.1] - 04-01-2023
  • cartboss/trunk/classes/ajax/class-cartboss-ajax-checkout.php

    r2847751 r2901887  
    22
    33
     4use League\Uri\Uri;
    45use League\Uri\UriModifier;
    56
     
    2829                }
    2930
    30                 $action = Cartboss_Utils::get_array_value($_POST, 'action');
    31                 if ($action != $this->action) {
    32                     wp_send_json_error(array('message' => "Invalid action for this handler"));
    33 
    34                     return;
    35                 }
    36 
    37                 if (empty(WC()->session)) {
    38                     Cartboss_Api_manager::instance()->log_error("[Checkout AJAX Handler]: WC()->session not initialized");
    39 
    40                     wp_send_json_error(array('message' => "Session inaccessible"));
    41 
    42                     return;
    43                 }
    44 
    4531                if (empty(WC()->cart)) {
    4632                    Cartboss_Api_manager::instance()->log_error("[Checkout AJAX Handler]: WC()->cart not initialized");
     
    5137                }
    5238
    53                 if (WC()->cart->is_empty()) {
    54                     wp_send_json_success(array('message' => "Cart empty"));
     39                if (!Cartboss_Utils::is_cart_full()) {
     40                    wp_send_json_error(array('message' => "Cart empty"));
    5541
    5642                    return;
     
    128114                $cb_order->shipping_address = $cb_address;
    129115
     116                $js_checkout_redirect_url = Cartboss_Utils::get_array_value($_POST, 'checkout_redirect_url', wp_get_referer());
     117                $js_checkout_host = Uri::createFromString($js_checkout_redirect_url)->getHost();
     118
    130119                // checkout url
    131120                $checkout_url = Cartboss_Hook_Handler_Order_Restore::get_order_restore_url();
     121                if (!str_contains($checkout_url, $js_checkout_host)) {
     122                    $checkout_url = Uri::createFromString($checkout_url);
     123                    $checkout_url = $checkout_url->withHost($js_checkout_host);
     124                }
     125
    132126                $checkout_url = UriModifier::appendQuery($checkout_url, Cartboss_Session_Manager::QUERY_VAR . '=' . $session_token);
    133127                $cb_order->checkout_url = $checkout_url->jsonSerialize();
    134128
    135129                // metadata
    136                 $cb_order->metadata = array(
    137                     Cartboss_Constants::CB_METADATA_CHECKOUT_REDIRECT_URL => Cartboss_Utils::get_array_value($_POST, 'current_url', wp_get_referer()),
    138                     Cartboss_Constants::CB_METADATA_LOCAL_SESSION_ID => WC()->session->get_customer_id(),
     130                $metadata = array(
     131                    Cartboss_Constants::CB_METADATA_CHECKOUT_REDIRECT_URL => $js_checkout_redirect_url,
    139132                    Cartboss_Constants::CB_METADATA_ORDER_COMMENTS => sanitize_text_field(Cartboss_Utils::get_array_value($_POST, 'order_comments', '')),
    140133                    Cartboss_Constants::CB_METADATA_ACCEPTS_MARKETING => Cartboss_Utils::is_true(Cartboss_Utils::get_array_value($_POST, 'cartboss_accepts_marketing', false)),
    141 //                    Cartboss_Constants::CB_METADATA_SHIP_TO_DIFFERENT_ADDRESS => Cartboss_Utils::is_true(Cartboss_Utils::get_array_value($_POST, 'ship_to_different_address', false)),
     134                    Cartboss_Constants::CB_METADATA_EXTRA_FIELDS => serialize(stripslashes(Cartboss_Utils::get_array_value($_POST, 'extra_fields'))),
    142135                );
     136
     137                try {
     138                    if (isset(WC()->session)) {
     139                        $metadata[Cartboss_Constants::CB_METADATA_LOCAL_SESSION_ID] = WC()->session->get_customer_id();
     140                    }
     141                } catch (\Throwable $th) {
     142                }
     143
     144                $cb_order->metadata = $metadata;
    143145
    144146                // cart
     
    166168                $cb_event->order = $cb_order;
    167169
     170                // add to local db
     171                Cartboss_Order_Database_Manager::instance()->insert($session_token, $cb_order->serialize());
     172
     173                // check if can be inserted as event
    168174                $previous = Cartboss_Event_Database_Manager::instance()->get($session_token);
    169175                if (!$previous || $previous->priority != Cartboss_Event_Database_Manager::PRIORITY_HIGH) {
    170176                    Cartboss_Event_Database_Manager::instance()->insert($session_token, $cb_event->serialize(), Cartboss_Config::instance()->get('sync_delay_atc', 0), Cartboss_Event_Database_Manager::PRIORITY_NORMAL);
    171                 }
    172 
    173 //                Cartboss_Cart_Database_Manager::instance()->insert($session_token, serialize($cb_order));
    174 
    175                 try {
    176                     // store phone to WP session, sometimes paypal or other providers clear this field when order is purchased, and we need it to pass it to purchase event
    177                     WC()->session->set(Cartboss_Constants::CB_METADATA_PHONE, $cb_contact->phone);
    178                     WC()->session->save_data();
    179                     WC()->session->set_customer_session_cookie(true);
    180 
    181                 } catch (Throwable $e) {
    182177                }
    183178
  • cartboss/trunk/classes/ajax/class-cartboss-ajax.php

    r2595210 r2901887  
    22
    33
    4 if ( ! defined( 'ABSPATH' ) ) {
    5     exit;
     4if (!defined('ABSPATH')) {
     5    exit;
    66} // Exit if accessed directly
    77
    8 if ( ! class_exists( 'Cartboss_Ajax' ) ) :
     8if (!class_exists('Cartboss_Ajax')) :
    99
    10     abstract class Cartboss_Ajax extends Cartboss_Singleton {
    11         var $action = '';
    12         var $public = false;
     10    abstract class Cartboss_Ajax extends Cartboss_Singleton {
     11        var $action = '';
     12        var $public = false;
    1313
    14         function __construct() {
    15             $this->initialize();
    16             $this->add_actions();
    17         }
     14        function __construct() {
     15            $this->initialize();
     16            $this->add_actions();
     17        }
    1818
    19         function initialize() {
    20             /* do nothing */
    21         }
     19        function initialize() {
     20            /* do nothing */
     21        }
    2222
    23         function add_actions() {
    24             // add action for logged-in users
    25             add_action( "wp_ajax_{$this->action}", array( $this, 'request' ) );
     23        function add_actions() {
     24            add_action("wc_ajax_{$this->action}", array($this, 'request'), Cartboss_Constants::CB_PRIORITY_MAX);
    2625
    27             // add action for non logged-in users
    28             if ( $this->public ) {
    29                 add_action( "wp_ajax_nopriv_{$this->action}", array( $this, 'request' ) );
    30             }
    31         }
     26//            // add action for logged-in users
     27//          add_action( "wp_ajax_{$this->action}", array( $this, 'request' ) );
     28//
     29//          // add action for non logged-in users
     30//          if ( $this->public ) {
     31//              add_action( "wp_ajax_nopriv_{$this->action}", array( $this, 'request' ) );
     32//          }
     33        }
    3234
    33         function request() {
    34             try {
    35                 $this->handle_request( wp_unslash( $_REQUEST ) );
    36             } catch ( Throwable $e ) {
    37                 Cartboss_Api_manager::instance()->log_error( "AJAX handler '{$this->action}' failed: {$e->getMessage()}" );
    38             }
    39         }
     35        function request() {
     36            try {
     37                $this->handle_request(wp_unslash($_REQUEST));
     38            } catch (Throwable $e) {
     39                Cartboss_Api_manager::instance()->log_error("AJAX handler '{$this->action}' failed: {$e->getMessage()}");
     40            }
     41        }
    4042
    41         function handle_request( $request ) {
    42             return true;
    43         }
    44     }
     43        function handle_request($request) {
     44            return true;
     45        }
     46
     47        function get_action() {
     48            return $this->action;
     49        }
     50    }
    4551
    4652endif; // class_exists check
  • cartboss/trunk/classes/class-cartboss-database.php

    r2745744 r2901887  
    2525    protected function do_query($stmt) {
    2626        $res = $this->wpdb->query($stmt);
    27         if (!$res && $this->wpdb->last_error) {
     27        if ($res === false && $this->wpdb->last_error) {
    2828            if (str_contains($this->wpdb->last_error, "Unknown column")) {
    2929                $this->drop_table();
  • cartboss/trunk/classes/class-cartboss-utils.php

    r2847751 r2901887  
    8181    }
    8282
    83     public static function get_home_url() {
    84         try {
    85             return apply_filters('wpml_home_url', get_option('home'));
    86         } catch (Exception $e) {
    87             try {
    88                 return home_url();
    89             } catch (Exception $e) {
    90                 return "/";
    91             }
    92         }
     83    public static function get_i18n() {
     84        global $sitepress, $q_config, $polylang;
     85
     86        if (!empty($sitepress) && is_object($sitepress) && method_exists($sitepress, 'get_active_languages')) {
     87            // WPML.
     88            return 'wpml';
     89        }
     90
     91        if (!empty($polylang) && function_exists('pll_languages_list')) {
     92            $languages = pll_languages_list();
     93
     94            if (empty($languages)) {
     95                return false;
     96            }
     97
     98            // Polylang, Polylang Pro.
     99            return 'polylang';
     100        }
     101
     102        if (!empty($q_config) && is_array($q_config)) {
     103            if (function_exists('qtranxf_convertURL')) {
     104                // qTranslate-x.
     105                return 'qtranslate-x';
     106            }
     107
     108            if (function_exists('qtrans_convertURL')) {
     109                // qTranslate.
     110                return 'qtranslate';
     111            }
     112        }
     113
     114        return false;
     115    }
     116
     117    public static function get_home_url($lang = '') {
     118        $i18n_plugin = self::get_i18n();
     119
     120        if (!$i18n_plugin) {
     121            return home_url();
     122        }
     123
     124        switch ($i18n_plugin) {
     125            // WPML.
     126            case 'wpml':
     127                return $GLOBALS['sitepress']->language_url($lang);
     128            // qTranslate.
     129            case 'qtranslate':
     130                return qtrans_convertURL(home_url(), $lang, true);
     131            // qTranslate-x.
     132            case 'qtranslate-x':
     133                return qtranxf_convertURL(home_url(), $lang, true);
     134            // Polylang, Polylang Pro.
     135            case 'polylang':
     136                $pll = function_exists('PLL') ? PLL() : $GLOBALS['polylang'];
     137
     138                if (!empty($pll->options['force_lang']) && isset($pll->links)) {
     139                    return pll_home_url($lang);
     140                }
     141        }
     142
     143        return home_url();
     144    }
     145
     146    public static function is_cart_full() {
     147        try {
     148            if (!WC()->cart->is_empty()) {
     149                return true;
     150            }
     151            if (WC()->cart->get_cart_contents_count() > 0) {
     152                return true;
     153            }
     154        } catch (Throwable $e) {
     155        }
     156        return false;
    93157    }
    94158
  • cartboss/trunk/classes/cron/class-cartboss-cron-clean.php

    r2847751 r2901887  
    1818            Cartboss_Event_Database_Manager::instance()->purge();
    1919            Cartboss_Token_Database_Manager::instance()->purge();
     20            Cartboss_Order_Database_Manager::instance()->purge();
    2021//          Cartboss_Cart_Database_Manager::instance()->purge();
    2122
  • cartboss/trunk/classes/handlers/class-cartboss-handler-order-create.php

    r2847751 r2901887  
    3636                try {
    3737                    // PHONE NUMBER
    38                     if (!empty(WC()->session->get(Cartboss_Constants::CB_METADATA_PHONE, null))) {
    39                         $wc_order->update_meta_data(self::ORDER_META_PHONE, WC()->session->get(Cartboss_Constants::CB_METADATA_PHONE));
    40 
    41                         // remove phone from session (important)
    42                         WC()->session->set(Cartboss_Constants::CB_METADATA_PHONE, null);
    43                         WC()->session->save_data();
    44                         WC()->session->set_customer_session_cookie(true);
     38                    if (empty($wc_order->get_meta(self::ORDER_META_PHONE))) {
     39                        $cb_local_cart = Cartboss_Order_Database_Manager::instance()->get(Cartboss_Session_Manager::instance()->get_token());
     40                        if (isset($cb_local_cart)) {
     41                            $cb_cart_payload = $cb_local_cart->payload;
     42                            if (!empty($cb_cart_payload)) {
     43                                $meta_phone = Cartboss_Utils::get_array_value(Cartboss_Utils::get_array_value(json_decode($cb_cart_payload, true), 'billing_address', array()), 'phone', null);
     44                                if (!empty($meta_phone)) {
     45                                    $wc_order->update_meta_data(self::ORDER_META_PHONE, $meta_phone);
     46                                }
     47                            }
     48                        }
    4549                    }
    4650                } catch (Throwable $e) {
  • cartboss/trunk/classes/handlers/class-cartboss-handler-order-restore.php

    r2847751 r2901887  
    3030
    3131        public static function get_order_restore_url() {
    32             return UriModifier::appendSegment(Uri::createFromString(get_home_url()), self::WP_URL_PATH_RESTORE_CART);
     32            return UriModifier::appendSegment(Uri::createFromString(Cartboss_Utils::get_home_url()), self::WP_URL_PATH_RESTORE_CART);
    3333        }
    3434
     
    4040//            }
    4141
    42 
    4342            $session_token = Cartboss_Utils::get_array_value($_GET, Cartboss_Session_Manager::QUERY_VAR, null);
    4443
     
    5756                Cartboss_Api_manager::instance()->log_error("[Order Restore Handler] Invalid session token received '{$session_token}'");
    5857
    59                 wp_redirect(Cartboss_Utils::get_home_url(), 303);
    60                 exit();
    61             }
     58                $this->redirect_home('cb-err-inv-sess');
     59                exit();
     60            }
     61
    6262            // fetch order info from server
    63             try {
    64                 $response = Cartboss_Api_Manager::instance()->get_order($session_token);
    65 
     63            $order_data = null;
     64            try {
     65                $response_record = Cartboss_Order_Database_Manager::instance()->get($session_token);
     66                $order_data = json_decode($response_record->payload);
    6667            } catch (Exception $e) {
    67                 Cartboss_Api_manager::instance()->log_error("[Order Restore Handler] Fetching order '{$session_token}' failed with error {$e->getMessage()}");
    68 
    69                 wp_redirect(Cartboss_Utils::get_home_url(), 303);
     68                Cartboss_Api_manager::instance()->log_error("[Order Restore Handler] Fetching order '{$session_token}' from DB failed with error {$e->getMessage()}");
     69            }
     70
     71            // fetch order info from remote
     72            if (empty($order_data)) {
     73                try {
     74                    $order_data = Cartboss_Api_Manager::instance()->get_order($session_token);
     75                } catch (Exception $e) {
     76                    Cartboss_Api_manager::instance()->log_error("[Order Restore Handler] Fetching order '{$session_token}' from REMOTE failed with error {$e->getMessage()}");
     77                }
     78            }
     79
     80            if (empty($order_data)) {
     81                $this->redirect_home('cb-err-no-order');
    7082                exit();
    7183            }
     
    96108                );
    97109
    98                 $cb_order = $serializer->deserialize(json_encode($response), Cartboss_OrderExtended_Model::class, 'json');
     110                $cb_order = $serializer->deserialize(json_encode($order_data), Cartboss_OrderExtended_Model::class, 'json');
    99111
    100112            } catch (Throwable $e) {
    101113                Cartboss_Api_manager::instance()->log_error("[Order Restore Handler] Deserialize failed: {$e->getMessage()}");
    102 
    103                 wp_redirect(Cartboss_Utils::get_home_url(), 303);
     114                $this->redirect_home('cb-err-des');
    104115                exit();
    105116            }
     
    107118            if (empty($cb_order)) {
    108119                Cartboss_Api_manager::instance()->log_error("[Order Restore Handler] Order not fetched and/or deserialized");
    109 
    110                 wp_redirect(Cartboss_Utils::get_home_url(), 303);
     120                $this->redirect_home('cb-err-no-order-des');
    111121                exit();
    112122            }
    113123
    114124            // if order is not abandoned, go away
    115             if (!$cb_order->is_abandoned()) {
    116                 wp_redirect(Cartboss_Utils::get_home_url(), 303);
    117                 exit();
    118             }
     125//            if (!$cb_order->is_abandoned()) {
     126//                error_log(4);
     127//                wp_redirect(Cartboss_Utils::get_home_url(), 303);
     128//                exit();
     129//            }
    119130
    120131            // remove previous session bcoz of possible order duplicates
     
    129140            } catch (Exception $e) {
    130141                Cartboss_Api_manager::instance()->log_error("[Order Restore Handler] Removing old session failed: {$e->getMessage()}");
     142            }
     143
     144            // remove possible current user session, before creating a new one from scratch
     145            try {
     146                WC()->session->destroy_session();
     147            } catch (Exception $ex) {
    131148            }
    132149
     
    177194                    }
    178195                }
    179 
    180                 // if cart is still empty, go away
    181                 if (WC()->cart->is_empty()) {
    182                     Cartboss_Api_manager::instance()->log_error("[Order Restore Handler] Cart still empty after restoring for '{$session_token}'");
    183 
    184                     wp_redirect(Cartboss_Utils::get_home_url(), 303);
    185                     exit();
    186                 }
    187196            } else {
    188197                Cartboss_Api_manager::instance()->log_error("[Order Restore Handler] WC()->cart not initialized");
    189198            }
    190199
    191             // restore customer
    192             if (!empty(WC()->customer)) {
     200            if (WC()->customer) {
    193201                try {
    194202                    Cartboss_Utils::set_wc_customer_field(WC()->customer, 'billing', 'email', $cb_order->billing_address->email);
     
    223231            }
    224232
    225             if (!empty(WC()->session)) {
    226                 try {
    227                     WC()->session->set(Cartboss_Constants::CB_METADATA_ACCEPTS_MARKETING, Cartboss_Utils::get_array_value($cb_order->metadata, Cartboss_Constants::CB_METADATA_ACCEPTS_MARKETING, false));
    228 //                    WC()->session->set(Cartboss_Constants::CB_METADATA_SHIP_TO_DIFFERENT_ADDRESS, Cartboss_Utils::get_array_value($cb_order->metadata, Cartboss_Constants::CB_METADATA_SHIP_TO_DIFFERENT_ADDRESS, false));
    229                     WC()->session->set(Cartboss_Constants::CB_METADATA_ORDER_COMMENTS, Cartboss_Utils::get_array_value($cb_order->metadata, Cartboss_Constants::CB_METADATA_ORDER_COMMENTS, ''));
    230                     WC()->session->save_data();
    231                     WC()->session->set_customer_session_cookie(true);
    232                 } catch (Exception $ee) {
    233                     Cartboss_Api_manager::instance()->log_error("[Order Restore Handler] Saving metadata to WC()->session failed: {$ee->getMessage()}");
    234                 }
    235             } else {
    236                 Cartboss_Api_manager::instance()->log_error("[Order Restore Handler] WC()->session not initialized");
    237             }
    238 
    239233            // extract query params and remove CB ones
    240234            $current_uri = Uri::createFromServer($_SERVER);
     
    251245                // add query params; eg. utm_* to the checkout url
    252246                $redirect_uri = Uri::createFromString($checkout_url);
    253                 $redirect_uri = $redirect_uri->withFragment("cb_restore");
     247//                $redirect_uri = $redirect_uri->withFragment("cb_restore"); we dont want this
    254248                $redirect_uri = UriModifier::appendQuery($redirect_uri, $current_query);
    255249
     
    261255            exit();
    262256        }
     257
     258        function redirect_home($reason = null) {
     259            $redirect_uri = Uri::createFromString(Cartboss_Utils::get_home_url());
     260            if (isset($reason))
     261                $redirect_uri = $redirect_uri->withFragment($reason);
     262
     263            wp_redirect($redirect_uri, 303);
     264            exit();
     265        }
    263266    }
    264267
  • cartboss/trunk/classes/handlers/class-cartboss-handler-prefill-checkout-fields.php

    r2806369 r2901887  
    2424            }
    2525
    26             if (!empty(WC()->session)) {
    27 //                // restore ship to diff address
    28 //                if (Cartboss_Utils::is_true(WC()->session->get(Cartboss_Constants::CB_METADATA_SHIP_TO_DIFFERENT_ADDRESS, false))) {
    29 //                    add_filter('woocommerce_ship_to_different_address_checked', '__return_true');
    30 //                } else {
    31 //                    add_filter('woocommerce_ship_to_different_address_checked', '__return_false');
    32 //                }
     26            // restore order notes
     27            $order_notes_value = Cartboss_Meta_Storage_Manager::instance()->get_value(Cartboss_Constants::CB_SESSION_ORDER_METADATA, '');
     28            if (array_key_exists('order', $fields) && array_key_exists('order_comments', $fields['order']) && !empty($order_notes_value)) {
     29                $fields['order']['order_comments']['default'] = sanitize_text_field($order_notes_value);
     30            }
    3331
    34                 // restore order notes
    35                 $order_notes_value = WC()->session->get(Cartboss_Constants::CB_SESSION_ORDER_METADATA, '');
    36                 if (array_key_exists('order', $fields) && array_key_exists('order_comments', $fields['order']) && !empty($order_notes_value)) {
    37                     $fields['order']['order_comments']['default'] = sanitize_text_field($order_notes_value);
    38                 }
    39 
    40                 // accepts marketing
    41                 if (array_key_exists('billing', $fields) && key_exists(Cartboss_Constants::CB_FIELD_ACCEPTS_MARKETING, $fields['billing'])) {
    42                     $fields['billing'][Cartboss_Constants::CB_FIELD_ACCEPTS_MARKETING]['default'] = Cartboss_Utils::is_true(!empty(WC()->session) ? WC()->session->get(Cartboss_Constants::CB_METADATA_ACCEPTS_MARKETING, false) : false);
    43                 }
     32            // accepts marketing
     33            if (array_key_exists('billing', $fields) && key_exists(Cartboss_Constants::CB_FIELD_ACCEPTS_MARKETING, $fields['billing'])) {
     34                $fields['billing'][Cartboss_Constants::CB_FIELD_ACCEPTS_MARKETING]['default'] = Cartboss_Utils::is_true(Cartboss_Meta_Storage_Manager::instance()->get_value(Cartboss_Constants::CB_METADATA_ACCEPTS_MARKETING, false));
    4435            }
    4536
  • cartboss/trunk/classes/handlers/class-cartboss-handler-session-reset.php

    r2847751 r2901887  
    2323
    2424        public static function get_session_reset_url() {
    25             return UriModifier::appendSegment(Uri::createFromString(get_home_url()), self::WP_URL_PATH_RESET_SESSION);
     25            return UriModifier::appendSegment(Uri::createFromString(Cartboss_Utils::get_home_url()), self::WP_URL_PATH_RESET_SESSION);
    2626        }
    2727
  • cartboss/trunk/classes/managers/class-cartboss-session-manager.php

    r2847751 r2901887  
    6565            Cartboss_Discount_Manager::instance()->reset();
    6666            Cartboss_Attribution_Manager::instance()->reset();
     67            Cartboss_Meta_Storage_Manager::instance()->reset();
    6768        }
    6869
  • cartboss/trunk/classes/managers/class-cartboss-token-database-manager.php

    r2847751 r2901887  
    99    class Cartboss_Token_Database_Manager extends Cartboss_Database {
    1010        const TABLE_NAME = 'cb_consumed_session_tokens';
    11         const EXPIRES_IN_SECONDS = 60 * 60 * 24 * 31;
     11        const EXPIRES_IN_SECONDS = 60 * 60 * 24 * 90;
    1212
    1313        public function create_table() {
  • cartboss/trunk/classes/models/class-cartboss-order-model.php

    r2595210 r2901887  
    22
    33
    4 class Cartboss_Order_Model extends Cartboss_Base_Model
    5 {
     4use Symfony\Component\Serializer\Encoder\JsonEncoder;
     5use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
     6use Symfony\Component\Serializer\Serializer;
     7
     8class Cartboss_Order_Model extends Cartboss_Base_Model {
    69    /**
    710     * @var string|null
    811     */
    912    public $id;
    10     /**
    11     * @var string|null
    12     */
    13     public $number;
     13    /**
     14    * @var string|null
     15    */
     16    public $number;
    1417    /**
    1518     * @var float
     
    4548    public $shipping_address;
    4649
    47     public function addCartItem(Cartboss_Order_Cart_Item_Model $cart_item)
    48     {
     50    /**
     51     * @var Serializer
     52     */
     53    private $serializer;
     54
     55    public function __construct() {
     56        $this->serializer = new Serializer([new ObjectNormalizer()], [new JsonEncoder()]);
     57    }
     58
     59    public function addCartItem(Cartboss_Order_Cart_Item_Model $cart_item) {
    4960        array_push($this->items, $cart_item);
     61    }
     62
     63    public final function serialize(): string {
     64        return $this->serializer->serialize($this, 'json', []);
    5065    }
    5166}
    5267
    53 class Cartboss_OrderExtended_Model extends Cartboss_Order_Model
    54 {
     68class Cartboss_OrderExtended_Model extends Cartboss_Order_Model {
    5569    /**
    5670     * @var string|null
     
    6579     * @return bool
    6680     */
    67     public function is_abandoned(): bool
    68     {
     81    public function is_abandoned(): bool {
    6982        return $this->state == 'abandoned';
    7083    }
     
    7386     * @return bool
    7487     */
    75     public function is_paid(): bool
    76     {
     88    public function is_paid(): bool {
    7789        return $this->state == 'paid';
    7890    }
     
    8092
    8193
    82 class Cartboss_Order_Cart_Item_Model extends Cartboss_Base_Model
    83 {
     94class Cartboss_Order_Cart_Item_Model extends Cartboss_Base_Model {
    8495    /**
    8596     * @var string|null
     
    108119}
    109120
    110 class Cartboss_Order_Address_Model extends Cartboss_Base_Model
    111 {
     121class Cartboss_Order_Address_Model extends Cartboss_Base_Model {
    112122    /**
    113123     * @var string|null
  • cartboss/trunk/composer.lock

    r2847751 r2901887  
    99        {
    1010            "name": "jaybizzle/crawler-detect",
    11             "version": "v1.2.112",
     11            "version": "v1.2.113",
    1212            "source": {
    1313                "type": "git",
    1414                "url": "https://github.com/JayBizzle/Crawler-Detect.git",
    15                 "reference": "2c555ce35a07a5c1c808cee7d5bb52c41a4c7b2f"
    16             },
    17             "dist": {
    18                 "type": "zip",
    19                 "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/2c555ce35a07a5c1c808cee7d5bb52c41a4c7b2f",
    20                 "reference": "2c555ce35a07a5c1c808cee7d5bb52c41a4c7b2f",
     15                "reference": "6710b75871da2b718550c2bc33388315a3b20151"
     16            },
     17            "dist": {
     18                "type": "zip",
     19                "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/6710b75871da2b718550c2bc33388315a3b20151",
     20                "reference": "6710b75871da2b718550c2bc33388315a3b20151",
    2121                "shasum": ""
    2222            },
     
    5555            "support": {
    5656                "issues": "https://github.com/JayBizzle/Crawler-Detect/issues",
    57                 "source": "https://github.com/JayBizzle/Crawler-Detect/tree/v1.2.112"
    58             },
    59             "time": "2022-10-05T21:52:44+00:00"
     57                "source": "https://github.com/JayBizzle/Crawler-Detect/tree/v1.2.113"
     58            },
     59            "time": "2023-02-02T21:01:40+00:00"
    6060        },
    6161        {
     
    838838        {
    839839            "name": "symfony/property-access",
    840             "version": "v5.4.15",
     840            "version": "v5.4.21",
    841841            "source": {
    842842                "type": "git",
    843843                "url": "https://github.com/symfony/property-access.git",
    844                 "reference": "0f3e8f40a1d3da90f674b3dd772e4777ccde4273"
    845             },
    846             "dist": {
    847                 "type": "zip",
    848                 "url": "https://api.github.com/repos/symfony/property-access/zipball/0f3e8f40a1d3da90f674b3dd772e4777ccde4273",
    849                 "reference": "0f3e8f40a1d3da90f674b3dd772e4777ccde4273",
     844                "reference": "bbd4442bfbdf3992550772539ba743d6d834534f"
     845            },
     846            "dist": {
     847                "type": "zip",
     848                "url": "https://api.github.com/repos/symfony/property-access/zipball/bbd4442bfbdf3992550772539ba743d6d834534f",
     849                "reference": "bbd4442bfbdf3992550772539ba743d6d834534f",
    850850                "shasum": ""
    851851            },
     
    899899            ],
    900900            "support": {
    901                 "source": "https://github.com/symfony/property-access/tree/v5.4.15"
     901                "source": "https://github.com/symfony/property-access/tree/v5.4.21"
    902902            },
    903903            "funding": [
     
    915915                }
    916916            ],
    917             "time": "2022-10-27T07:55:40+00:00"
     917            "time": "2023-02-16T09:33:00+00:00"
    918918        },
    919919        {
    920920            "name": "symfony/property-info",
    921             "version": "v5.4.17",
     921            "version": "v5.4.21",
    922922            "source": {
    923923                "type": "git",
    924924                "url": "https://github.com/symfony/property-info.git",
    925                 "reference": "12e1f7b3d73b1f3690aa524b92b5de9937507361"
    926             },
    927             "dist": {
    928                 "type": "zip",
    929                 "url": "https://api.github.com/repos/symfony/property-info/zipball/12e1f7b3d73b1f3690aa524b92b5de9937507361",
    930                 "reference": "12e1f7b3d73b1f3690aa524b92b5de9937507361",
     925                "reference": "722737086d76b4edabfc2d50a48cebd4b8cd5546"
     926            },
     927            "dist": {
     928                "type": "zip",
     929                "url": "https://api.github.com/repos/symfony/property-info/zipball/722737086d76b4edabfc2d50a48cebd4b8cd5546",
     930                "reference": "722737086d76b4edabfc2d50a48cebd4b8cd5546",
    931931                "shasum": ""
    932932            },
     
    990990            ],
    991991            "support": {
    992                 "source": "https://github.com/symfony/property-info/tree/v5.4.17"
     992                "source": "https://github.com/symfony/property-info/tree/v5.4.21"
    993993            },
    994994            "funding": [
     
    10061006                }
    10071007            ],
    1008             "time": "2022-12-20T11:10:57+00:00"
     1008            "time": "2023-02-16T09:33:00+00:00"
    10091009        },
    10101010        {
    10111011            "name": "symfony/serializer",
    1012             "version": "v5.4.17",
     1012            "version": "v5.4.21",
    10131013            "source": {
    10141014                "type": "git",
    10151015                "url": "https://github.com/symfony/serializer.git",
    1016                 "reference": "4ac4fae1cbad2655a0b05f327e7ce8ef310239fb"
    1017             },
    1018             "dist": {
    1019                 "type": "zip",
    1020                 "url": "https://api.github.com/repos/symfony/serializer/zipball/4ac4fae1cbad2655a0b05f327e7ce8ef310239fb",
    1021                 "reference": "4ac4fae1cbad2655a0b05f327e7ce8ef310239fb",
     1016                "reference": "e35b42d69a8b447cc3e6c9b3f98938c596b6c60a"
     1017            },
     1018            "dist": {
     1019                "type": "zip",
     1020                "url": "https://api.github.com/repos/symfony/serializer/zipball/e35b42d69a8b447cc3e6c9b3f98938c596b6c60a",
     1021                "reference": "e35b42d69a8b447cc3e6c9b3f98938c596b6c60a",
    10221022                "shasum": ""
    10231023            },
     
    10931093            "homepage": "https://symfony.com",
    10941094            "support": {
    1095                 "source": "https://github.com/symfony/serializer/tree/v5.4.17"
     1095                "source": "https://github.com/symfony/serializer/tree/v5.4.21"
    10961096            },
    10971097            "funding": [
     
    11091109                }
    11101110            ],
    1111             "time": "2022-12-20T11:10:57+00:00"
     1111            "time": "2023-02-21T19:46:44+00:00"
    11121112        },
    11131113        {
    11141114            "name": "symfony/string",
    1115             "version": "v5.4.17",
     1115            "version": "v5.4.21",
    11161116            "source": {
    11171117                "type": "git",
    11181118                "url": "https://github.com/symfony/string.git",
    1119                 "reference": "55733a8664b8853b003e70251c58bc8cb2d82a6b"
    1120             },
    1121             "dist": {
    1122                 "type": "zip",
    1123                 "url": "https://api.github.com/repos/symfony/string/zipball/55733a8664b8853b003e70251c58bc8cb2d82a6b",
    1124                 "reference": "55733a8664b8853b003e70251c58bc8cb2d82a6b",
     1119                "reference": "edac10d167b78b1d90f46a80320d632de0bd9f2f"
     1120            },
     1121            "dist": {
     1122                "type": "zip",
     1123                "url": "https://api.github.com/repos/symfony/string/zipball/edac10d167b78b1d90f46a80320d632de0bd9f2f",
     1124                "reference": "edac10d167b78b1d90f46a80320d632de0bd9f2f",
    11251125                "shasum": ""
    11261126            },
     
    11791179            ],
    11801180            "support": {
    1181                 "source": "https://github.com/symfony/string/tree/v5.4.17"
     1181                "source": "https://github.com/symfony/string/tree/v5.4.21"
    11821182            },
    11831183            "funding": [
     
    11951195                }
    11961196            ],
    1197             "time": "2022-12-12T15:54:21+00:00"
     1197            "time": "2023-02-22T08:00:55+00:00"
    11981198        }
    11991199    ],
  • cartboss/trunk/config/class-cartboss-constants.php

    r2847751 r2901887  
    1515//    const CB_METADATA_SHIP_TO_DIFFERENT_ADDRESS = 'ship_elsewhere';
    1616    const CB_METADATA_ACCEPTS_MARKETING = 'accepts_marketing';
     17    const CB_METADATA_EXTRA_FIELDS = 'extra_fields';
    1718    const CB_METADATA_PHONE = 'phone';
    1819
  • cartboss/trunk/config/class-cartboss-options.php

    r2806369 r2901887  
    33
    44class Cartboss_Options {
    5     const DEFAULT_ROLES = array('administrator', 'shop_manager', 'editor', 'author');
     5//    const DEFAULT_ROLES = array('administrator', 'shop_manager', 'editor', 'author');
     6    const DEFAULT_ROLES = array();
    67
    78    const API_KEY = 'cb_api_key';
     
    3435
    3536    public static function is_enabled(): bool {
    36         return self::get_is_valid_api_key() && self::get_has_balance() && self::get_is_website_active();
     37//        return self::get_is_valid_api_key() && self::get_has_balance() && self::get_is_website_active();
     38        return self::get_is_valid_api_key();
    3739    }
    3840
  • cartboss/trunk/includes/class-cartboss-activator.php

    r2847751 r2901887  
    1313        Cartboss_Event_Database_Manager::instance()->create_table();
    1414        Cartboss_Token_Database_Manager::instance()->create_table();
     15        Cartboss_Order_Database_Manager::instance()->create_table();
    1516//      Cartboss_Cart_Database_Manager::instance()->create_table();
    1617
  • cartboss/trunk/includes/class-cartboss-deactivator.php

    r2847751 r2901887  
    55        Cartboss_Event_Database_Manager::instance()->drop_table();
    66        Cartboss_Token_Database_Manager::instance()->drop_table();
     7        Cartboss_Order_Database_Manager::instance()->drop_table();
    78//      Cartboss_Cart_Database_Manager::instance()->drop_table();
    89
  • cartboss/trunk/includes/class-cartboss.php

    r2847751 r2901887  
    3636        cartboss_include('classes/class-cartboss-api-client.php');
    3737        cartboss_include('classes/libs/class-cartboss-cookie-helper.php');
     38        cartboss_include('classes/libs/class-cartboss-session-helper.php');
    3839
    3940        // ajax
    4041        cartboss_include('classes/ajax/class-cartboss-ajax.php');
    4142        cartboss_include('classes/ajax/class-cartboss-ajax-checkout.php');
     43        cartboss_include('classes/ajax/class-cartboss-ajax-checkout-fields.php');
    4244
    4345        // cron
     
    5153        cartboss_include('classes/managers/class-cartboss-event-database-manager.php');
    5254        cartboss_include('classes/managers/class-cartboss-token-database-manager.php');
     55        cartboss_include('classes/managers/class-cartboss-order-database-manager.php');
    5356//        cartboss_include('classes/managers/class-cartboss-cart-database-manager.php');
     57        cartboss_include('classes/managers/class-cartboss-meta-storage-manager.php');
    5458        cartboss_include('classes/managers/class-cartboss-session-manager.php');
    5559        cartboss_include('classes/managers/class-cartboss-attribution-manager.php');
     
    7478        cartboss_include('classes/handlers/class-cartboss-handler-session-reset.php');
    7579        cartboss_include('classes/handlers/class-cartboss-handler-customize-checkout-fields.php');
    76         cartboss_include('classes/handlers/class-cartboss-handler-prefill-checkout-fields.php');
     80//        cartboss_include('classes/handlers/class-cartboss-handler-prefill-checkout-fields.php');
    7781
    7882        // load appropriate config
     
    9498        Cartboss_Event_Database_Manager::instance();
    9599        Cartboss_Token_Database_Manager::instance();
     100        Cartboss_Order_Database_Manager::instance();
    96101//        Cartboss_Cart_Database_Manager::instance();
    97102        Cartboss_Api_Manager::init(Cartboss_Config::instance()->get('api_host'), Cartboss_Options::get_api_key(), $this->version);
     
    99104        Cartboss_Attribution_Manager::init();
    100105        Cartboss_Session_Manager::init();
     106        Cartboss_Meta_Storage_Manager::init();
    101107
    102108        // init crons
     
    112118        Cartboss_Hook_Handler_Session_Reset::instance();
    113119        Cartboss_Hook_Handler_Customize_Checkout_Fields::instance();
    114         Cartboss_Hook_Handler_Prefill_Checkout_Fields::instance();
     120        // Cartboss_Hook_Handler_Prefill_Checkout_Fields::instance();
    115121
    116122        // init ajax
    117123        Cartboss_Ajax_Checkout::instance();
     124        Cartboss_Ajax_Checkout_Fields::instance();
    118125
    119126        $this->load_dependencies();
  • cartboss/trunk/public/class-cartboss-public.php

    r2847751 r2901887  
    4747        // checkout helper, only on checkout page
    4848//        if (Cartboss_Utils::is_actual_checkout_page()) {
    49             wp_enqueue_script(
    50                 'cb-tracking-script',
    51                 plugin_dir_url(__FILE__) . 'js/cartboss-checkout.min.js',
    52                 array('jquery'),
    53                 $assets_version,
    54                 true
    55             );
     49        wp_enqueue_script(
     50            'cb-tracking-script',
     51            plugin_dir_url(__FILE__) . 'js/cartboss-checkout2.min.js',
     52            array('jquery'),
     53            $assets_version,
     54            true
     55        );
    5656
    57             $handler = new Cartboss_Ajax_Checkout();
    58             $data = array(
    59                 'ajaxurl' => admin_url('admin-ajax.php'),
    60                 'nonce' => wp_create_nonce('ajax-nonce'),
    61                 'action' => $handler->action,
    62                 'debug' => $is_debug,
    63                 'preset_fields' => array()
    64             );
     57        $data = array(
     58            'endpoint_abandon' => WC_AJAX::get_endpoint(Cartboss_Ajax_Checkout::instance()->get_action()),
     59            'endpoint_populate' => WC_AJAX::get_endpoint(Cartboss_Ajax_Checkout_Fields::instance()->get_action()),
     60            'nonce' => wp_create_nonce('ajax-nonce'),
     61            'debug' => $is_debug,
     62            'preset_fields' => array()
     63        );
    6564
    66             if (!empty(WC()->customer)) {
    67                 foreach (WC()->customer->get_billing() as $key => $value) {
    68                     $data['preset_fields']['billing_' . $key] = $value;
    69                 }
    70                 foreach (WC()->customer->get_shipping() as $key => $value) {
    71                     $data['preset_fields']['shipping_' . $key] = $value;
    72                 }
    73             }
    74 
    75             if (!empty(WC()->session)) {
    76                 $data['preset_fields'][Cartboss_Constants::CB_FIELD_ACCEPTS_MARKETING] = Cartboss_Utils::is_true(WC()->session->get(Cartboss_Constants::CB_METADATA_ACCEPTS_MARKETING, false));
    77 //            $data['preset_fields']['ship_to_different_address'] = Cartboss_Utils::is_true(WC()->session->get(Cartboss_Constants::CB_METADATA_SHIP_TO_DIFFERENT_ADDRESS, false));
    78                 $data['preset_fields']['order_comments'] = sanitize_text_field(WC()->session->get(Cartboss_Constants::CB_METADATA_ORDER_COMMENTS, ''));
    79             }
    80 
    81             wp_localize_script(
    82                 'cb-tracking-script',
    83                 'cb_checkout_data',
    84                 $data
    85             );
     65        wp_localize_script(
     66            'cb-tracking-script',
     67            'cb_checkout_data',
     68            $data
     69        );
    8670//        }
    8771    }
  • cartboss/trunk/vendor/composer/installed.json

    r2847751 r2901887  
    33        {
    44            "name": "jaybizzle/crawler-detect",
    5             "version": "v1.2.112",
    6             "version_normalized": "1.2.112.0",
     5            "version": "v1.2.113",
     6            "version_normalized": "1.2.113.0",
    77            "source": {
    88                "type": "git",
    99                "url": "https://github.com/JayBizzle/Crawler-Detect.git",
    10                 "reference": "2c555ce35a07a5c1c808cee7d5bb52c41a4c7b2f"
    11             },
    12             "dist": {
    13                 "type": "zip",
    14                 "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/2c555ce35a07a5c1c808cee7d5bb52c41a4c7b2f",
    15                 "reference": "2c555ce35a07a5c1c808cee7d5bb52c41a4c7b2f",
     10                "reference": "6710b75871da2b718550c2bc33388315a3b20151"
     11            },
     12            "dist": {
     13                "type": "zip",
     14                "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/6710b75871da2b718550c2bc33388315a3b20151",
     15                "reference": "6710b75871da2b718550c2bc33388315a3b20151",
    1616                "shasum": ""
    1717            },
     
    2222                "phpunit/phpunit": "^4.8|^5.5|^6.5|^9.4"
    2323            },
    24             "time": "2022-10-05T21:52:44+00:00",
     24            "time": "2023-02-02T21:01:40+00:00",
    2525            "type": "library",
    2626            "installation-source": "dist",
     
    5252            "support": {
    5353                "issues": "https://github.com/JayBizzle/Crawler-Detect/issues",
    54                 "source": "https://github.com/JayBizzle/Crawler-Detect/tree/v1.2.112"
     54                "source": "https://github.com/JayBizzle/Crawler-Detect/tree/v1.2.113"
    5555            },
    5656            "install-path": "../jaybizzle/crawler-detect"
     
    865865        {
    866866            "name": "symfony/property-access",
    867             "version": "v5.4.15",
    868             "version_normalized": "5.4.15.0",
     867            "version": "v5.4.21",
     868            "version_normalized": "5.4.21.0",
    869869            "source": {
    870870                "type": "git",
    871871                "url": "https://github.com/symfony/property-access.git",
    872                 "reference": "0f3e8f40a1d3da90f674b3dd772e4777ccde4273"
    873             },
    874             "dist": {
    875                 "type": "zip",
    876                 "url": "https://api.github.com/repos/symfony/property-access/zipball/0f3e8f40a1d3da90f674b3dd772e4777ccde4273",
    877                 "reference": "0f3e8f40a1d3da90f674b3dd772e4777ccde4273",
     872                "reference": "bbd4442bfbdf3992550772539ba743d6d834534f"
     873            },
     874            "dist": {
     875                "type": "zip",
     876                "url": "https://api.github.com/repos/symfony/property-access/zipball/bbd4442bfbdf3992550772539ba743d6d834534f",
     877                "reference": "bbd4442bfbdf3992550772539ba743d6d834534f",
    878878                "shasum": ""
    879879            },
     
    890890                "psr/cache-implementation": "To cache access methods."
    891891            },
    892             "time": "2022-10-27T07:55:40+00:00",
     892            "time": "2023-02-16T09:33:00+00:00",
    893893            "type": "library",
    894894            "installation-source": "dist",
     
    929929            ],
    930930            "support": {
    931                 "source": "https://github.com/symfony/property-access/tree/v5.4.15"
     931                "source": "https://github.com/symfony/property-access/tree/v5.4.21"
    932932            },
    933933            "funding": [
     
    949949        {
    950950            "name": "symfony/property-info",
    951             "version": "v5.4.17",
    952             "version_normalized": "5.4.17.0",
     951            "version": "v5.4.21",
     952            "version_normalized": "5.4.21.0",
    953953            "source": {
    954954                "type": "git",
    955955                "url": "https://github.com/symfony/property-info.git",
    956                 "reference": "12e1f7b3d73b1f3690aa524b92b5de9937507361"
    957             },
    958             "dist": {
    959                 "type": "zip",
    960                 "url": "https://api.github.com/repos/symfony/property-info/zipball/12e1f7b3d73b1f3690aa524b92b5de9937507361",
    961                 "reference": "12e1f7b3d73b1f3690aa524b92b5de9937507361",
     956                "reference": "722737086d76b4edabfc2d50a48cebd4b8cd5546"
     957            },
     958            "dist": {
     959                "type": "zip",
     960                "url": "https://api.github.com/repos/symfony/property-info/zipball/722737086d76b4edabfc2d50a48cebd4b8cd5546",
     961                "reference": "722737086d76b4edabfc2d50a48cebd4b8cd5546",
    962962                "shasum": ""
    963963            },
     
    987987                "symfony/serializer": "To use Serializer metadata"
    988988            },
    989             "time": "2022-12-20T11:10:57+00:00",
     989            "time": "2023-02-16T09:33:00+00:00",
    990990            "type": "library",
    991991            "installation-source": "dist",
     
    10231023            ],
    10241024            "support": {
    1025                 "source": "https://github.com/symfony/property-info/tree/v5.4.17"
     1025                "source": "https://github.com/symfony/property-info/tree/v5.4.21"
    10261026            },
    10271027            "funding": [
     
    10431043        {
    10441044            "name": "symfony/serializer",
    1045             "version": "v5.4.17",
    1046             "version_normalized": "5.4.17.0",
     1045            "version": "v5.4.21",
     1046            "version_normalized": "5.4.21.0",
    10471047            "source": {
    10481048                "type": "git",
    10491049                "url": "https://github.com/symfony/serializer.git",
    1050                 "reference": "4ac4fae1cbad2655a0b05f327e7ce8ef310239fb"
    1051             },
    1052             "dist": {
    1053                 "type": "zip",
    1054                 "url": "https://api.github.com/repos/symfony/serializer/zipball/4ac4fae1cbad2655a0b05f327e7ce8ef310239fb",
    1055                 "reference": "4ac4fae1cbad2655a0b05f327e7ce8ef310239fb",
     1050                "reference": "e35b42d69a8b447cc3e6c9b3f98938c596b6c60a"
     1051            },
     1052            "dist": {
     1053                "type": "zip",
     1054                "url": "https://api.github.com/repos/symfony/serializer/zipball/e35b42d69a8b447cc3e6c9b3f98938c596b6c60a",
     1055                "reference": "e35b42d69a8b447cc3e6c9b3f98938c596b6c60a",
    10561056                "shasum": ""
    10571057            },
     
    11011101                "symfony/yaml": "For using the default YAML mapping loader."
    11021102            },
    1103             "time": "2022-12-20T11:10:57+00:00",
     1103            "time": "2023-02-21T19:46:44+00:00",
    11041104            "type": "library",
    11051105            "installation-source": "dist",
     
    11291129            "homepage": "https://symfony.com",
    11301130            "support": {
    1131                 "source": "https://github.com/symfony/serializer/tree/v5.4.17"
     1131                "source": "https://github.com/symfony/serializer/tree/v5.4.21"
    11321132            },
    11331133            "funding": [
     
    11491149        {
    11501150            "name": "symfony/string",
    1151             "version": "v5.4.17",
    1152             "version_normalized": "5.4.17.0",
     1151            "version": "v5.4.21",
     1152            "version_normalized": "5.4.21.0",
    11531153            "source": {
    11541154                "type": "git",
    11551155                "url": "https://github.com/symfony/string.git",
    1156                 "reference": "55733a8664b8853b003e70251c58bc8cb2d82a6b"
    1157             },
    1158             "dist": {
    1159                 "type": "zip",
    1160                 "url": "https://api.github.com/repos/symfony/string/zipball/55733a8664b8853b003e70251c58bc8cb2d82a6b",
    1161                 "reference": "55733a8664b8853b003e70251c58bc8cb2d82a6b",
     1156                "reference": "edac10d167b78b1d90f46a80320d632de0bd9f2f"
     1157            },
     1158            "dist": {
     1159                "type": "zip",
     1160                "url": "https://api.github.com/repos/symfony/string/zipball/edac10d167b78b1d90f46a80320d632de0bd9f2f",
     1161                "reference": "edac10d167b78b1d90f46a80320d632de0bd9f2f",
    11621162                "shasum": ""
    11631163            },
     
    11791179                "symfony/var-exporter": "^4.4|^5.0|^6.0"
    11801180            },
    1181             "time": "2022-12-12T15:54:21+00:00",
     1181            "time": "2023-02-22T08:00:55+00:00",
    11821182            "type": "library",
    11831183            "installation-source": "dist",
     
    12181218            ],
    12191219            "support": {
    1220                 "source": "https://github.com/symfony/string/tree/v5.4.17"
     1220                "source": "https://github.com/symfony/string/tree/v5.4.21"
    12211221            },
    12221222            "funding": [
  • cartboss/trunk/vendor/composer/installed.php

    r2847751 r2901887  
    66        'install_path' => __DIR__ . '/../../',
    77        'aliases' => array(),
    8         'reference' => 'afb2156322e0cda38f3fc1607431a567739c4637',
     8        'reference' => 'e796c2a0731225e329df8fce1bd2f75a625ef37a',
    99        'name' => '__root__',
    1010        'dev' => true,
     
    1717            'install_path' => __DIR__ . '/../../',
    1818            'aliases' => array(),
    19             'reference' => 'afb2156322e0cda38f3fc1607431a567739c4637',
     19            'reference' => 'e796c2a0731225e329df8fce1bd2f75a625ef37a',
    2020            'dev_requirement' => false,
    2121        ),
    2222        'jaybizzle/crawler-detect' => array(
    23             'pretty_version' => 'v1.2.112',
    24             'version' => '1.2.112.0',
     23            'pretty_version' => 'v1.2.113',
     24            'version' => '1.2.113.0',
    2525            'type' => 'library',
    2626            'install_path' => __DIR__ . '/../jaybizzle/crawler-detect',
    2727            'aliases' => array(),
    28             'reference' => '2c555ce35a07a5c1c808cee7d5bb52c41a4c7b2f',
     28            'reference' => '6710b75871da2b718550c2bc33388315a3b20151',
    2929            'dev_requirement' => false,
    3030        ),
     
    120120        ),
    121121        'symfony/property-access' => array(
    122             'pretty_version' => 'v5.4.15',
    123             'version' => '5.4.15.0',
     122            'pretty_version' => 'v5.4.21',
     123            'version' => '5.4.21.0',
    124124            'type' => 'library',
    125125            'install_path' => __DIR__ . '/../symfony/property-access',
    126126            'aliases' => array(),
    127             'reference' => '0f3e8f40a1d3da90f674b3dd772e4777ccde4273',
     127            'reference' => 'bbd4442bfbdf3992550772539ba743d6d834534f',
    128128            'dev_requirement' => false,
    129129        ),
    130130        'symfony/property-info' => array(
    131             'pretty_version' => 'v5.4.17',
    132             'version' => '5.4.17.0',
     131            'pretty_version' => 'v5.4.21',
     132            'version' => '5.4.21.0',
    133133            'type' => 'library',
    134134            'install_path' => __DIR__ . '/../symfony/property-info',
    135135            'aliases' => array(),
    136             'reference' => '12e1f7b3d73b1f3690aa524b92b5de9937507361',
     136            'reference' => '722737086d76b4edabfc2d50a48cebd4b8cd5546',
    137137            'dev_requirement' => false,
    138138        ),
    139139        'symfony/serializer' => array(
    140             'pretty_version' => 'v5.4.17',
    141             'version' => '5.4.17.0',
     140            'pretty_version' => 'v5.4.21',
     141            'version' => '5.4.21.0',
    142142            'type' => 'library',
    143143            'install_path' => __DIR__ . '/../symfony/serializer',
    144144            'aliases' => array(),
    145             'reference' => '4ac4fae1cbad2655a0b05f327e7ce8ef310239fb',
     145            'reference' => 'e35b42d69a8b447cc3e6c9b3f98938c596b6c60a',
    146146            'dev_requirement' => false,
    147147        ),
    148148        'symfony/string' => array(
    149             'pretty_version' => 'v5.4.17',
    150             'version' => '5.4.17.0',
     149            'pretty_version' => 'v5.4.21',
     150            'version' => '5.4.21.0',
    151151            'type' => 'library',
    152152            'install_path' => __DIR__ . '/../symfony/string',
    153153            'aliases' => array(),
    154             'reference' => '55733a8664b8853b003e70251c58bc8cb2d82a6b',
     154            'reference' => 'edac10d167b78b1d90f46a80320d632de0bd9f2f',
    155155            'dev_requirement' => false,
    156156        ),
  • cartboss/trunk/vendor/jaybizzle/crawler-detect/.github/workflows/test.yml

    r2635800 r2901887  
    1313      fail-fast: true
    1414      matrix:
    15         php: [5.3, 5.4, 5.5, 5.6, 7.0, 7.1, 7.2, 7.3, 7.4, 8.0, 8.1]
     15        php: [5.3, 5.4, 5.5, 5.6, 7.0, 7.1, 7.2, 7.3, 7.4, 8.0, 8.1, 8.2]
    1616
    1717    name: PHP:${{ matrix.php }}
  • cartboss/trunk/vendor/jaybizzle/crawler-detect/src/CrawlerDetect.php

    r2652208 r2901887  
    185185        return isset($this->matches[0]) ? $this->matches[0] : null;
    186186    }
     187
     188
     189    /**
     190     * @return string|null
     191     */
     192    public function getUserAgent()
     193    {
     194        return $this->userAgent;
     195    }
    187196}
  • cartboss/trunk/vendor/symfony/property-access/LICENSE

    r2718232 r2901887  
    1 Copyright (c) 2004-2022 Fabien Potencier
     1Copyright (c) 2004-present Fabien Potencier
    22
    33Permission is hereby granted, free of charge, to any person obtaining a copy
  • cartboss/trunk/vendor/symfony/property-info/Extractor/PhpDocExtractor.php

    r2638936 r2901887  
    6161    {
    6262        if (!class_exists(DocBlockFactory::class)) {
    63             throw new \LogicException(sprintf('Unable to use the "%s" class as the "phpdocumentor/reflection-docblock" package is not installed.', __CLASS__));
     63            throw new \LogicException(sprintf('Unable to use the "%s" class as the "phpdocumentor/reflection-docblock" package is not installed. Try running composer require "phpdocumentor/reflection-docblock".', __CLASS__));
    6464        }
    6565
     
    201201        }
    202202
    203         if (!isset($types[0])) {
     203        if (!isset($types[0]) || [] === $types[0]) {
    204204            return null;
    205205        }
  • cartboss/trunk/vendor/symfony/property-info/Extractor/PhpStanExtractor.php

    r2718232 r2901887  
    1212namespace Symfony\Component\PropertyInfo\Extractor;
    1313
     14use phpDocumentor\Reflection\Types\ContextFactory;
    1415use PHPStan\PhpDocParser\Ast\PhpDoc\InvalidTagValueNode;
    1516use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;
     
    6061    public function __construct(array $mutatorPrefixes = null, array $accessorPrefixes = null, array $arrayMutatorPrefixes = null)
    6162    {
     63        if (!class_exists(ContextFactory::class)) {
     64            throw new \LogicException(sprintf('Unable to use the "%s" class as the "phpdocumentor/type-resolver" package is not installed. Try running composer require "phpdocumentor/type-resolver".', __CLASS__));
     65        }
     66
     67        if (!class_exists(PhpDocParser::class)) {
     68            throw new \LogicException(sprintf('Unable to use the "%s" class as the "phpstan/phpdoc-parser" package is not installed. Try running composer require "phpstan/phpdoc-parser".', __CLASS__));
     69        }
     70
    6271        $this->phpStanTypeHelper = new PhpStanTypeHelper();
    6372        $this->mutatorPrefixes = $mutatorPrefixes ?? ReflectionExtractor::$defaultMutatorPrefixes;
  • cartboss/trunk/vendor/symfony/property-info/LICENSE

    r2718232 r2901887  
    1 Copyright (c) 2015-2022 Fabien Potencier
     1Copyright (c) 2015-present Fabien Potencier
    22
    33Permission is hereby granted, free of charge, to any person obtaining a copy
  • cartboss/trunk/vendor/symfony/property-info/Util/PhpDocTypeHelper.php

    r2847751 r2901887  
    174174                return 'bool';
    175175
    176             // real is not part of the PHPDoc standard, so we ignore it
     176                // real is not part of the PHPDoc standard, so we ignore it
    177177            case 'double':
    178178                return 'float';
  • cartboss/trunk/vendor/symfony/serializer/Encoder/CsvEncoder.php

    r2718232 r2901887  
    168168                } else {
    169169                    foreach ($cols as $col) {
    170                         $header = explode($keySeparator, $col);
     170                        $header = explode($keySeparator, $col ?? '');
    171171                        $headers[] = $header;
    172172                        $headerCount[] = \count($header);
  • cartboss/trunk/vendor/symfony/serializer/LICENSE

    r2718232 r2901887  
    1 Copyright (c) 2004-2022 Fabien Potencier
     1Copyright (c) 2004-present Fabien Potencier
    22
    33Permission is hereby granted, free of charge, to any person obtaining a copy
  • cartboss/trunk/vendor/symfony/serializer/Normalizer/AbstractNormalizer.php

    r2806369 r2901887  
    214214     * @param bool          $attributesAsString If false, return an array of {@link AttributeMetadataInterface}
    215215     *
     216     * @return string[]|AttributeMetadataInterface[]|bool
     217     *
    216218     * @throws LogicException if the 'allow_extra_attributes' context variable is false and no class metadata factory is provided
    217      *
    218      * @return string[]|AttributeMetadataInterface[]|bool
    219219     */
    220220    protected function getAllowedAttributes($classOrObject, array $context, bool $attributesAsString = false)
  • cartboss/trunk/vendor/symfony/serializer/Normalizer/BackedEnumNormalizer.php

    r2806369 r2901887  
    2626     * {@inheritdoc}
    2727     *
     28     * @return int|string
     29     *
    2830     * @throws InvalidArgumentException
    29      *
    30      * @return int|string
    3131     */
    3232    public function normalize($object, string $format = null, array $context = [])
  • cartboss/trunk/vendor/symfony/serializer/Normalizer/CustomNormalizer.php

    r2595210 r2901887  
    4545     * Checks if the given class implements the NormalizableInterface.
    4646     *
    47      * @param mixed  $data   Data to normalize
    48      * @param string $format The format being (de-)serialized from or into
     47     * @param mixed       $data   Data to normalize
     48     * @param string|null $format The format being (de-)serialized from or into
    4949     *
    5050     * @return bool
     
    5858     * Checks if the given class implements the DenormalizableInterface.
    5959     *
    60      * @param mixed  $data   Data to denormalize from
    61      * @param string $type   The class to which the data should be denormalized
    62      * @param string $format The format being deserialized from
     60     * @param mixed       $data   Data to denormalize from
     61     * @param string      $type   The class to which the data should be denormalized
     62     * @param string|null $format The format being deserialized from
    6363     *
    6464     * @return bool
  • cartboss/trunk/vendor/symfony/serializer/Normalizer/DataUriNormalizer.php

    r2638936 r2901887  
    8989     * @see https://gist.github.com/bgrins/6194623
    9090     *
     91     * @return \SplFileInfo
     92     *
    9193     * @throws InvalidArgumentException
    9294     * @throws NotNormalizableValueException
    93      *
    94      * @return \SplFileInfo
    9595     */
    9696    public function denormalize($data, string $type, string $format = null, array $context = [])
  • cartboss/trunk/vendor/symfony/serializer/Normalizer/DateIntervalNormalizer.php

    r2595210 r2901887  
    3737     * {@inheritdoc}
    3838     *
     39     * @return string
     40     *
    3941     * @throws InvalidArgumentException
    40      *
    41      * @return string
    4242     */
    4343    public function normalize($object, string $format = null, array $context = [])
     
    6969     * {@inheritdoc}
    7070     *
     71     * @return \DateInterval
     72     *
    7173     * @throws InvalidArgumentException
    7274     * @throws UnexpectedValueException
    73      *
    74      * @return \DateInterval
    7575     */
    7676    public function denormalize($data, string $type, string $format = null, array $context = [])
  • cartboss/trunk/vendor/symfony/serializer/Normalizer/DateTimeNormalizer.php

    r2806369 r2901887  
    5151     * {@inheritdoc}
    5252     *
     53     * @return string
     54     *
    5355     * @throws InvalidArgumentException
    54      *
    55      * @return string
    5656     */
    5757    public function normalize($object, string $format = null, array $context = [])
     
    8383     * {@inheritdoc}
    8484     *
     85     * @return \DateTimeInterface
     86     *
    8587     * @throws NotNormalizableValueException
    86      *
    87      * @return \DateTimeInterface
    8888     */
    8989    public function denormalize($data, string $type, string $format = null, array $context = [])
  • cartboss/trunk/vendor/symfony/serializer/Normalizer/DateTimeZoneNormalizer.php

    r2638936 r2901887  
    2626     * {@inheritdoc}
    2727     *
     28     * @return string
     29     *
    2830     * @throws InvalidArgumentException
    29      *
    30      * @return string
    3131     */
    3232    public function normalize($object, string $format = null, array $context = [])
     
    5050     * {@inheritdoc}
    5151     *
     52     * @return \DateTimeZone
     53     *
    5254     * @throws NotNormalizableValueException
    53      *
    54      * @return \DateTimeZone
    5555     */
    5656    public function denormalize($data, string $type, string $format = null, array $context = [])
  • cartboss/trunk/vendor/symfony/serializer/Normalizer/DenormalizerInterface.php

    r2638936 r2901887  
    3030     * Denormalizes data back into an object of the given class.
    3131     *
    32      * @param mixed  $data    Data to restore
    33      * @param string $type    The expected class to instantiate
    34      * @param string $format  Format the given data was extracted from
    35      * @param array  $context Options available to the denormalizer
     32     * @param mixed       $data    Data to restore
     33     * @param string      $type    The expected class to instantiate
     34     * @param string|null $format  Format the given data was extracted from
     35     * @param array       $context Options available to the denormalizer
    3636     *
    3737     * @return mixed
     
    5050     * Checks whether the given class is supported for denormalization by this normalizer.
    5151     *
    52      * @param mixed  $data   Data to denormalize from
    53      * @param string $type   The class to which the data should be denormalized
    54      * @param string $format The format being deserialized from
     52     * @param mixed       $data   Data to denormalize from
     53     * @param string      $type   The class to which the data should be denormalized
     54     * @param string|null $format The format being deserialized from
    5555     *
    5656     * @return bool
  • cartboss/trunk/vendor/symfony/serializer/Normalizer/GetSetMethodNormalizer.php

    r2847751 r2901887  
    153153
    154154        if (!isset(self::$setterAccessibleCache[$key])) {
    155             try {
    156                 // We have to use is_callable() here since method_exists()
    157                 // does not "see" protected/private methods
    158                 self::$setterAccessibleCache[$key] = \is_callable([$object, $setter]) && !(new \ReflectionMethod($object, $setter))->isStatic();
    159             } catch (\ReflectionException $e) {
    160                 // Method does not exist in the class, probably a magic method
    161                 self::$setterAccessibleCache[$key] = false;
    162             }
     155            self::$setterAccessibleCache[$key] = method_exists($object, $setter) && \is_callable([$object, $setter]) && !(new \ReflectionMethod($object, $setter))->isStatic();
    163156        }
    164157
  • cartboss/trunk/vendor/symfony/serializer/Normalizer/NormalizerInterface.php

    r2595210 r2901887  
    2525     * Normalizes an object into a set of arrays/scalars.
    2626     *
    27      * @param mixed  $object  Object to normalize
    28      * @param string $format  Format the normalization result will be encoded as
    29      * @param array  $context Context options for the normalizer
     27     * @param mixed       $object  Object to normalize
     28     * @param string|null $format  Format the normalization result will be encoded as
     29     * @param array       $context Context options for the normalizer
    3030     *
    3131     * @return array|string|int|float|bool|\ArrayObject|null \ArrayObject is used to make sure an empty object is encoded as an object not an array
     
    4242     * Checks whether the given class is supported for normalization by this normalizer.
    4343     *
    44      * @param mixed  $data   Data to normalize
    45      * @param string $format The format being (de-)serialized from or into
     44     * @param mixed       $data   Data to normalize
     45     * @param string|null $format The format being (de-)serialized from or into
    4646     *
    4747     * @return bool
  • cartboss/trunk/vendor/symfony/serializer/Serializer.php

    r2806369 r2901887  
    258258     * Returns a matching normalizer.
    259259     *
    260      * @param mixed  $data    Data to get the serializer for
    261      * @param string $format  Format name, present to give the option to normalizers to act differently based on formats
    262      * @param array  $context Options available to the normalizer
     260     * @param mixed       $data    Data to get the serializer for
     261     * @param string|null $format  Format name, present to give the option to normalizers to act differently based on formats
     262     * @param array       $context Options available to the normalizer
    263263     */
    264264    private function getNormalizer($data, ?string $format, array $context): ?NormalizerInterface
     
    296296     * Returns a matching denormalizer.
    297297     *
    298      * @param mixed  $data    Data to restore
    299      * @param string $class   The expected class to instantiate
    300      * @param string $format  Format name, present to give the option to normalizers to act differently based on formats
    301      * @param array  $context Options available to the denormalizer
     298     * @param mixed       $data    Data to restore
     299     * @param string      $class   The expected class to instantiate
     300     * @param string|null $format  Format name, present to give the option to normalizers to act differently based on formats
     301     * @param array       $context Options available to the denormalizer
    302302     */
    303303    private function getDenormalizer($data, string $class, ?string $format, array $context): ?DenormalizerInterface
  • cartboss/trunk/vendor/symfony/string/AbstractUnicodeString.php

    r2806369 r2901887  
    3838
    3939    // the subset of folded case mappings that is not in lower case mappings
    40     private const FOLD_FROM = ['İ', 'µ', 'ſ', "\xCD\x85", 'ς', 'ϐ', 'ϑ', 'ϕ', 'ϖ', 'ϰ', 'ϱ', 'ϵ', 'ẛ', "\xE1\xBE\xBE", 'ß', 'İ', 'ʼn', 'ǰ', 'ΐ', 'ΰ', 'և', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'ẚ', 'ẞ', 'ὐ', 'ὒ', 'ὔ', 'ὖ', 'ᾀ', 'ᾁ', 'ᾂ', 'ᾃ', 'ᾄ', 'ᾅ', 'ᾆ', 'ᾇ', 'ᾈ', 'ᾉ', 'ᾊ', 'ᾋ', 'ᾌ', 'ᾍ', 'ᾎ', 'ᾏ', 'ᾐ', 'ᾑ', 'ᾒ', 'ᾓ', 'ᾔ', 'ᾕ', 'ᾖ', 'ᾗ', 'ᾘ', 'ᾙ', 'ᾚ', 'ᾛ', 'ᾜ', 'ᾝ', 'ᾞ', 'ᾟ', 'ᾠ', 'ᾡ', 'ᾢ', 'ᾣ', 'ᾤ', 'ᾥ', 'ᾦ', 'ᾧ', 'ᾨ', 'ᾩ', 'ᾪ', 'ᾫ', 'ᾬ', 'ᾭ', 'ᾮ', 'ᾯ', 'ᾲ', 'ᾳ', 'ᾴ', 'ᾶ', 'ᾷ', 'ᾼ', 'ῂ', 'ῃ', 'ῄ', 'ῆ', 'ῇ', 'ῌ', 'ῒ', 'ΐ', 'ῖ', 'ῗ', 'ῢ', 'ΰ', 'ῤ', 'ῦ', 'ῧ', 'ῲ', 'ῳ', 'ῴ', 'ῶ', 'ῷ', 'ῼ', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'ſt', 'st', 'ﬓ', 'ﬔ', 'ﬕ', 'ﬖ', 'ﬗ'];
    41     private const FOLD_TO = ['i̇', 'μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', 'ṡ', 'ι', 'ss', 'i̇', 'ʼn', 'ǰ', 'ΐ', 'ΰ', 'եւ', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'aʾ', 'ss', 'ὐ', 'ὒ', 'ὔ', 'ὖ', 'ἀι', 'ἁι', 'ἂι', 'ἃι', 'ἄι', 'ἅι', 'ἆι', 'ἇι', 'ἀι', 'ἁι', 'ἂι', 'ἃι', 'ἄι', 'ἅι', 'ἆι', 'ἇι', 'ἠι', 'ἡι', 'ἢι', 'ἣι', 'ἤι', 'ἥι', 'ἦι', 'ἧι', 'ἠι', 'ἡι', 'ἢι', 'ἣι', 'ἤι', 'ἥι', 'ἦι', 'ἧι', 'ὠι', 'ὡι', 'ὢι', 'ὣι', 'ὤι', 'ὥι', 'ὦι', 'ὧι', 'ὠι', 'ὡι', 'ὢι', 'ὣι', 'ὤι', 'ὥι', 'ὦι', 'ὧι', 'ὰι', 'αι', 'άι', 'ᾶ', 'ᾶι', 'αι', 'ὴι', 'ηι', 'ήι', 'ῆ', 'ῆι', 'ηι', 'ῒ', 'ΐ', 'ῖ', 'ῗ', 'ῢ', 'ΰ', 'ῤ', 'ῦ', 'ῧ', 'ὼι', 'ωι', 'ώι', 'ῶ', 'ῶι', 'ωι', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'st', 'st', 'մն', 'մե', 'մի', 'վն', 'մխ'];
     40    private const FOLD_FROM = ['İ', 'µ', 'ſ', "\xCD\x85", 'ς', 'ϐ', 'ϑ', 'ϕ', 'ϖ', 'ϰ', 'ϱ', 'ϵ', 'ẛ', "\xE1\xBE\xBE", 'ß', 'ʼn', 'ǰ', 'ΐ', 'ΰ', 'և', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'ẚ', 'ẞ', 'ὐ', 'ὒ', 'ὔ', 'ὖ', 'ᾀ', 'ᾁ', 'ᾂ', 'ᾃ', 'ᾄ', 'ᾅ', 'ᾆ', 'ᾇ', 'ᾈ', 'ᾉ', 'ᾊ', 'ᾋ', 'ᾌ', 'ᾍ', 'ᾎ', 'ᾏ', 'ᾐ', 'ᾑ', 'ᾒ', 'ᾓ', 'ᾔ', 'ᾕ', 'ᾖ', 'ᾗ', 'ᾘ', 'ᾙ', 'ᾚ', 'ᾛ', 'ᾜ', 'ᾝ', 'ᾞ', 'ᾟ', 'ᾠ', 'ᾡ', 'ᾢ', 'ᾣ', 'ᾤ', 'ᾥ', 'ᾦ', 'ᾧ', 'ᾨ', 'ᾩ', 'ᾪ', 'ᾫ', 'ᾬ', 'ᾭ', 'ᾮ', 'ᾯ', 'ᾲ', 'ᾳ', 'ᾴ', 'ᾶ', 'ᾷ', 'ᾼ', 'ῂ', 'ῃ', 'ῄ', 'ῆ', 'ῇ', 'ῌ', 'ῒ', 'ῖ', 'ῗ', 'ῢ', 'ῤ', 'ῦ', 'ῧ', 'ῲ', 'ῳ', 'ῴ', 'ῶ', 'ῷ', 'ῼ', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'ſt', 'st', 'ﬓ', 'ﬔ', 'ﬕ', 'ﬖ', 'ﬗ'];
     41    private const FOLD_TO = ['i̇', 'μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', 'ṡ', 'ι', 'ss', 'ʼn', 'ǰ', 'ΐ', 'ΰ', 'եւ', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'aʾ', 'ss', 'ὐ', 'ὒ', 'ὔ', 'ὖ', 'ἀι', 'ἁι', 'ἂι', 'ἃι', 'ἄι', 'ἅι', 'ἆι', 'ἇι', 'ἀι', 'ἁι', 'ἂι', 'ἃι', 'ἄι', 'ἅι', 'ἆι', 'ἇι', 'ἠι', 'ἡι', 'ἢι', 'ἣι', 'ἤι', 'ἥι', 'ἦι', 'ἧι', 'ἠι', 'ἡι', 'ἢι', 'ἣι', 'ἤι', 'ἥι', 'ἦι', 'ἧι', 'ὠι', 'ὡι', 'ὢι', 'ὣι', 'ὤι', 'ὥι', 'ὦι', 'ὧι', 'ὠι', 'ὡι', 'ὢι', 'ὣι', 'ὤι', 'ὥι', 'ὦι', 'ὧι', 'ὰι', 'αι', 'άι', 'ᾶ', 'ᾶι', 'αι', 'ὴι', 'ηι', 'ήι', 'ῆ', 'ῆι', 'ηι', 'ῒ', 'ῖ', 'ῗ', 'ῢ', 'ῤ', 'ῦ', 'ῧ', 'ὼι', 'ωι', 'ώι', 'ῶ', 'ῶι', 'ωι', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'st', 'st', 'մն', 'մե', 'մի', 'վն', 'մխ'];
    4242
    4343    // the subset of upper case mappings that map one code point to many code points
  • cartboss/trunk/vendor/symfony/string/LICENSE

    r2718232 r2901887  
    1 Copyright (c) 2019-2022 Fabien Potencier
     1Copyright (c) 2019-present Fabien Potencier
    22
    33Permission is hereby granted, free of charge, to any person obtaining a copy
Note: See TracChangeset for help on using the changeset viewer.