├── .gitignore ├── .jshintrc ├── .travis.yml ├── Gruntfile.js ├── README.md ├── assets └── css │ └── styles.css ├── bin └── install-wp-tests.sh ├── classes ├── class-linker-cpt.php └── class-linker-maintenance.php ├── composer.json ├── language ├── linker-he_IL.mo ├── linker-he_IL.po ├── linker-id_ID.mo ├── linker-id_ID.po ├── linker-pt_BR.mo ├── linker-pt_BR.po ├── linker.pot └── string.php ├── linker.php ├── package-lock.json ├── package.json ├── phpunit.xml ├── readme.txt ├── screenshot-1.jpg ├── screenshot-2.jpg └── tests ├── bootstrap.php └── test-base.php /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | node_modules/ 3 | build/ 4 | vendor/ 5 | npm-debug.log 6 | .DS_Store 7 | composer.lock -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "bitwise": true, 3 | "browser": true, 4 | "curly": true, 5 | "eqeqeq": true, 6 | "eqnull": true, 7 | "esnext": true, 8 | "immed": true, 9 | "jquery": true, 10 | "latedef": true, 11 | "newcap": true, 12 | "noarg": true, 13 | "node": true, 14 | "strict": false, 15 | "trailing": true 16 | } -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # Travis CI Configuration File 2 | 3 | # Tell Travis CI we're using PHP 4 | language: php 5 | 6 | # PHP version used in first build configuration. 7 | php: 8 | - 5.3 9 | - 5.4 10 | - 5.5 11 | - 5.6 12 | - 7.0 13 | 14 | # WordPress version used in first build configuration. 15 | env: 16 | - WP_VERSION=latest WP_MULTISITE=0 17 | - WP_VERSION=latest WP_MULTISITE=1 18 | - WP_VERSION=4.3 WP_MULTISITE=0 19 | - WP_VERSION=4.3 WP_MULTISITE=1 20 | - WP_VERSION=4.4 WP_MULTISITE=0 21 | - WP_VERSION=4.4 WP_MULTISITE=1 22 | - WP_VERSION=4.5 WP_MULTISITE=0 23 | - WP_VERSION=4.5 WP_MULTISITE=1 24 | 25 | before_script: 26 | - bash bin/install-wp-tests.sh wordpress_test root '' localhost $WP_VERSION 27 | 28 | before_install: 29 | - pip install --user codecov 30 | 31 | after_success: 32 | - codecov 33 | 34 | script: phpunit -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WP-Linker Makefile 3 | */ 4 | 'use strict'; 5 | 6 | module.exports = function(grunt) { 7 | 8 | require('matchdep').filterDev('grunt-*').forEach( grunt.loadNpmTasks ); 9 | 10 | // Project configuration. 11 | grunt.initConfig( { 12 | pkg: grunt.file.readJSON('package.json'), 13 | 14 | checktextdomain: { 15 | standard: { 16 | options:{ 17 | text_domain: 'linker', 18 | correct_domain: true, 19 | keywords: [ 20 | // WordPress keywords 21 | '__:1,2d', 22 | '_e:1,2d', 23 | '_x:1,2c,3d', 24 | 'esc_html__:1,2d', 25 | 'esc_html_e:1,2d', 26 | 'esc_html_x:1,2c,3d', 27 | 'esc_attr__:1,2d', 28 | 'esc_attr_e:1,2d', 29 | 'esc_attr_x:1,2c,3d', 30 | '_ex:1,2c,3d', 31 | '_n:1,2,4d', 32 | '_nx:1,2,4c,5d', 33 | '_n_noop:1,2,3d', 34 | '_nx_noop:1,2,3c,4d' 35 | ] 36 | }, 37 | files: [ { 38 | src: [ 39 | '**/*.php', 40 | '!node_modules/**', 41 | '!build/**', 42 | '!tests/**', 43 | '!vendor/**', 44 | '!*~' 45 | ], 46 | expand: true 47 | } ] 48 | } 49 | }, 50 | 51 | pot: { 52 | options:{ 53 | text_domain: 'linker', 54 | dest: 'language/', 55 | keywords: [ 56 | // WordPress keywords 57 | '__:1', 58 | '_e:1', 59 | '_x:1,2c', 60 | 'esc_html__:1', 61 | 'esc_html_e:1', 62 | 'esc_html_x:1,2c', 63 | 'esc_attr__:1', 64 | 'esc_attr_e:1', 65 | 'esc_attr_x:1,2c', 66 | '_ex:1,2c', 67 | '_n:1,2', 68 | '_nx:1,2,4c', 69 | '_n_noop:1,2', 70 | '_nx_noop:1,2,3c' 71 | ] 72 | }, 73 | files:{ 74 | src: [ 75 | '**/*.php', 76 | '!node_modules/**', 77 | '!build/**', 78 | '!tests/**', 79 | '!vendor/**', 80 | '!*~' 81 | ], 82 | expand: true 83 | } 84 | }, 85 | 86 | bumpup: { 87 | options: { 88 | updateProps: { 89 | pkg: 'package.json' 90 | } 91 | }, 92 | file: 'package.json' 93 | }, 94 | 95 | replace: { 96 | plugin_main: { 97 | src: [ 'linker.php' ], 98 | overwrite: true, 99 | replacements: [ 100 | { 101 | from: /Version: \d{1,1}\.\d{1,2}\.\d{1,2}/g, 102 | to: 'Version: <%= pkg.version %>' 103 | } 104 | ] 105 | }, 106 | 107 | readme: { 108 | src: [ 'readme.txt' ], 109 | overwrite: true, 110 | replacements: [ 111 | { 112 | from: /Stable tag: \d{1,1}\.\d{1,2}\.\d{1,2}/g, 113 | to: 'Stable tag: <%= pkg.version %>' 114 | } 115 | ] 116 | } 117 | }, 118 | 119 | shell: { 120 | git_add_all : { 121 | command: [ 122 | 'git add --all', 123 | 'git commit -m "Bump to <%= pkg.version %>"' 124 | ].join( '&&' ) 125 | } 126 | }, 127 | 128 | release: { 129 | options: { 130 | bump: false, 131 | npm: false, 132 | commit: false, 133 | tagName: 'v<%= version %>', 134 | commitMessage: 'released v<%= version %>', 135 | tagMessage: 'Tagged as v<%= version %>' 136 | } 137 | }, 138 | 139 | wp_readme_to_markdown: { 140 | github: { 141 | options: { 142 | wordpressPluginSlug: 'linker', 143 | travisUrlRepo: 'https://travis-ci.org/KingYes/wp-linker', 144 | gruntDependencyStatusUrl: 'https://david-dm.org/KingYes/wp-linker' 145 | }, 146 | files: { 147 | 'README.md': 'readme.txt' 148 | } 149 | } 150 | }, 151 | 152 | copy: { 153 | main: { 154 | src: [ 155 | '**', 156 | '!node_modules/**', 157 | '!build/**', 158 | '!bin/**', 159 | '!.git/**', 160 | '!tests/**', 161 | '!.travis.yml', 162 | '!README.md', 163 | '!phpunit.xml', 164 | '!vendor/**', 165 | '!Gruntfile.js', 166 | '!package.json', 167 | '!.gitignore', 168 | '!.gitmodules', 169 | '!*~' 170 | ], 171 | expand: true, 172 | dest: 'build/' 173 | } 174 | }, 175 | 176 | clean: { 177 | //Clean up build folder 178 | main: [ 179 | 'build' 180 | ] 181 | }, 182 | 183 | wp_deploy: { 184 | deploy:{ 185 | options: { 186 | plugin_slug: '<%= pkg.slug %>', 187 | svn_user: 'KingYes', 188 | build_dir: 'build/' 189 | } 190 | } 191 | }, 192 | 193 | phpunit: { 194 | classes: { 195 | dir: '' 196 | }, 197 | options: { 198 | bin: 'phpunit', 199 | bootstrap: 'tests/bootstrap.php', 200 | colors: true 201 | } 202 | } 203 | 204 | } ); 205 | 206 | // Default task(s). 207 | grunt.registerTask( 'default', [ 208 | 'checktextdomain', 209 | //'pot', 210 | //'phpunit', 211 | 'wp_readme_to_markdown' 212 | ] ); 213 | 214 | grunt.registerTask( 'build', [ 215 | 'default', 216 | 'clean', 217 | 'copy' 218 | ] ); 219 | 220 | grunt.registerTask( 'publish', [ 221 | 'checktextdomain', 222 | //'pot', 223 | //'phpunit', 224 | 'bumpup', 225 | 'replace', 226 | 'wp_readme_to_markdown', 227 | 'shell:git_add_all', 228 | 'release' 229 | ] ); 230 | }; 231 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Linker # 2 | [![Build Status](https://travis-ci.org/KingYes/wp-linker.svg?branch=master)](https://travis-ci.org/KingYes/wp-linker) [![Dependency Status](https://david-dm.org/KingYes/wp-linker/dev-status.svg)](https://david-dm.org/KingYes/wp-linker#info=devDependencies) [![WordPress](https://img.shields.io/wordpress/v/linker.svg?style=flat-square)](https://wordpress.org/plugins/linker/) [![WordPress](https://img.shields.io/wordpress/plugin/r/linker.svg?style=flat-square)](https://wordpress.org/plugins/linker/) [![WordPress](https://img.shields.io/wordpress/plugin/v/linker.svg?style=flat-square)](https://wordpress.org/plugins/linker/) [![WordPress](https://img.shields.io/wordpress/plugin/dt/linker.svg?style=flat-square)](https://wordpress.org/plugins/linker/) [![Built with Grunt](https://cdn.gruntjs.com/builtwith.svg)](http://gruntjs.com/) 3 | 4 | **Contributors:** pojo.me, KingYes, ariel.k 5 | **Tags:** automation, 301, Google Analytics by Yoast, affiliates, click tracking, custom post types, external-links, google analytics, link manager, links, outbound links, pretty links, redirect, affiliate, affiliates, click, clicks, link, links, marketing, redirect, rewrite, seo, shortlink, shorturl, shrink, shrinking, slug, stat, statistics, stats, tiny, tinyurl, track, tracking, tweet, twitter, url 6 | **Requires at least:** 3.5 7 | **Tested up to:** 6.5 8 | **Stable tag:** 1.3.0 9 | **License:** GPLv2 or later 10 | 11 | **Track Outbound Link Clicks Easily:** Shorten & track your site links by using your own domain name. e.g. "your-domain.com/go/link" 12 | 13 | ## Description ## 14 | 15 | Through Linker's short url tool you can know on which links your visitors are clicking. Linker is the easiest tool to use in order to create a short link in your own domain & track outbound link clicks from your website, using software like Google Analytics. 16 | Create short links to your post, manage your 301 redirects, track affiliate links and do many other URL related tasks easily. 17 | 18 |

Major Features

19 | * Create Short and clean URLs, using your own domain. 20 | * Redirect links to any location, both inbound and outbound, using 301 redirects. 21 | * Track outbound link clicks, with internal reporting for Hits per link. 22 | * Enjoy an intuitive and User Friendly Admin Interface 23 | * Setup tracking easily using Linker's out of the box functionality. 24 | 25 |

How it Works?

26 | Linker adds a new custom post type to your Admin menu, where you can create, edit, delete, and manage Links by 301 redirects. What's great about Linker is that it tracks click counts and saves them as a custom field. it's really simple & cool and there is no setup involved. It works seamlessly straight out of the box for whichever theme and plugins you are using. 27 | 28 | **Link Example:** Just to make it extra clear, here's how the Linker plugin works. 29 | 30 | * Original URL: https://wordpress.org/plugins/linker/ 31 | * New URL with Linker: https://pojo.me/go/linker/ 32 | 33 |

Integration with Google Analytics by Yoast

34 | Linker works well with [Google Analytics for WordPress](http://wordpress.org/plugins/google-analytics-for-wordpress/) by Yoast. 35 | 36 | In order to setup tracking for Google Analytics by Yoast, you need to first go to the Setting page. 37 | 38 | 1. General Tab > "Track outbound click and downloads" Checkbox > check it 39 | 1. Advanced Tab > "Set path for internal links to track as outbound links" Field > enter `/go/` 40 | 1. Advanced Tab > "Label for those links" Field > Choose which Label to use (Not required). 41 | 42 | Now all of your website outbound clicks will show up automatically in Google Analytics. To view them, go to your account in Google Analytics. 43 |
44 | **Under:** Content > Event Tracking > Categories, you’ll see the Label that you used for each link. That's all there is to it! 45 | 46 |

Translators:

47 | * Hebrew (he_IL) + RTL Support - [Pojo.me](http://pojo.me/) 48 | * Brazilian Portuguese (pt_BR) - Rhenan Cardozo 49 | * Indonesian (id_ID) - YiiBooster 50 | 51 |

Contributions:

52 | Would you like to like to contribute to Linker? You are more than welcome to submit your pull requests on the [GitHub repo](https://github.com/KingYes/wp-linker). Also, if you have any notes about the code, please open a ticket on the issue tracker. 53 | 54 | ## Installation ## 55 | 56 | 1. Upload plugin files to your plugins folder or install using WordPress built-in Add New Plugin installer 57 | 1. Activate the plugin 58 | 1. Navigate to Settings > Permalinks and save them. Yes, just click Save Changes. 59 | 1. Go to the Linker Menu under the Pages 60 | 1. Create a new Link and publish 61 | 1. Now you can track how many times clicked on each link 62 | 63 | ## Screenshots ## 64 | 65 | ### 1. All Links ### 66 | ![All Links](http://s.wordpress.org/extend/plugins/linker/screenshot-1.png) 67 | 68 | ### 2. New Link ### 69 | ![New Link](http://s.wordpress.org/extend/plugins/linker/screenshot-2.png) 70 | 71 | 72 | ## Frequently Asked Questions ## 73 | 74 | ### Can I change the Link structure other than /go/ ? ### 75 | * Sure. Just use with `linker_prefix_slug` filter. 76 | 77 | ### Requirements ### 78 | * __Requires PHP5__ for list management functionality. 79 | 80 | ### What is the plugin license? ### 81 | * This plugin is released under a GPL license. 82 | 83 | 84 | ## Changelog ## 85 | 86 | ### 1.3.0 ### 87 | * New: Introducing URL Parameters forwarding for improved tracking on every redirection 88 | 89 | ### 1.2.2 ### 90 | * Security Fix: Add escaping data in the admin area 91 | 92 | ### 1.2.1 ### 93 | * Tweak! - Adjust format number 94 | * Tweak! - Added support for other CPT view 95 | 96 | ### 1.2.0 ### 97 | * New! - Added filter to manage the cpt slug for linker 98 | 99 | ### 1.1.3 ### 100 | * Tweak! - Exclude links from search 101 | 102 | ### 1.1.2 ### 103 | * Tested up to WordPress v4.4.2 104 | 105 | ### 1.1.1 ### 106 | * Added translate: Indonesian (id_ID) Thanks to YiiBooster ([#20](https://github.com/KingYes/wp-linker/pull/20)) 107 | 108 | ### 1.1.0 ### 109 | * Added filter by Author ([#16](https://github.com/KingYes/wp-linker/pull/16)) 110 | * Added readonly field for Copy-Paste linker 111 | * Updated Dashboard Output 112 | * Dashboard info and CSS external file 113 | * Tested up to WordPress v4.3 114 | 115 | ### 1.0.7 ### 116 | * Tweak! - Exclude links from search 117 | 118 | ### 1.0.6 ### 119 | * Added Dashboard Widget and Orderby clicks ([#13](https://github.com/KingYes/wp-linker/pull/13)). 120 | 121 | ### 1.0.5 ### 122 | * Added translate: Brazilian Portuguese (pt_BR) Thanks to Rhenan Cardozo 123 | * Tested up to WordPress v4.2.2 124 | 125 | ### 1.0.4 ### 126 | * The plugin flush the permalinks automation. 127 | * Tested up to WordPress v4.2 128 | 129 | ### 1.0.3 ### 130 | * Tested up to WordPress v4.1 131 | 132 | ### 1.0.2 ### 133 | * Tested up to WordPress v4.0 134 | 135 | ### 1.0.1 ### 136 | * Added translate: Hebrew (he_IL) - Thanks to [Pojo.me](http://pojo.me/) 137 | 138 | ### 1.0.0 ### 139 | * Blastoff! 140 | -------------------------------------------------------------------------------- /assets/css/styles.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | 3 | #adminmenu #menu-posts-linker div.wp-menu-image:before { 4 | content: "\f103"; 5 | } 6 | 7 | .fixed .column-linker_clicks { 8 | width: 10%; 9 | } 10 | 11 | #linker_dashboard_widget tr td.border-bottom { 12 | padding: 4px 0 4px 0; 13 | border-bottom: 1pt solid #dddddd; 14 | } 15 | 16 | th#linker_permalink { 17 | width: 30%; 18 | } 19 | 20 | input.linker-permalink-copy-paste { 21 | width: 100%; 22 | } -------------------------------------------------------------------------------- /bin/install-wp-tests.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | if [ $# -lt 3 ]; then 4 | echo "usage: $0 [db-host] [wp-version]" 5 | exit 1 6 | fi 7 | 8 | DB_NAME=$1 9 | DB_USER=$2 10 | DB_PASS=$3 11 | DB_HOST=${4-localhost} 12 | WP_VERSION=${5-latest} 13 | 14 | WP_TESTS_DIR=${WP_TESTS_DIR-/tmp/wordpress-tests-lib} 15 | WP_CORE_DIR=${WP_CORE_DIR-/tmp/wordpress/} 16 | 17 | download() { 18 | if [ `which curl` ]; then 19 | curl -s "$1" > "$2"; 20 | elif [ `which wget` ]; then 21 | wget -nv -O "$2" "$1" 22 | fi 23 | } 24 | 25 | if [[ $WP_VERSION =~ [0-9]+\.[0-9]+(\.[0-9]+)? ]]; then 26 | WP_TESTS_TAG="tags/$WP_VERSION" 27 | else 28 | # http serves a single offer, whereas https serves multiple. we only want one 29 | download http://api.wordpress.org/core/version-check/1.7/ /tmp/wp-latest.json 30 | grep '[0-9]+\.[0-9]+(\.[0-9]+)?' /tmp/wp-latest.json 31 | LATEST_VERSION=$(grep -o '"version":"[^"]*' /tmp/wp-latest.json | sed 's/"version":"//') 32 | if [[ -z "$LATEST_VERSION" ]]; then 33 | echo "Latest WordPress version could not be found" 34 | exit 1 35 | fi 36 | WP_TESTS_TAG="tags/$LATEST_VERSION" 37 | fi 38 | 39 | set -ex 40 | 41 | install_wp() { 42 | 43 | if [ -d $WP_CORE_DIR ]; then 44 | return; 45 | fi 46 | 47 | mkdir -p $WP_CORE_DIR 48 | 49 | if [ $WP_VERSION == 'latest' ]; then 50 | local ARCHIVE_NAME='latest' 51 | else 52 | local ARCHIVE_NAME="wordpress-$WP_VERSION" 53 | fi 54 | 55 | download https://wordpress.org/${ARCHIVE_NAME}.tar.gz /tmp/wordpress.tar.gz 56 | tar --strip-components=1 -zxmf /tmp/wordpress.tar.gz -C $WP_CORE_DIR 57 | 58 | download https://raw.github.com/markoheijnen/wp-mysqli/master/db.php $WP_CORE_DIR/wp-content/db.php 59 | } 60 | 61 | install_test_suite() { 62 | # portable in-place argument for both GNU sed and Mac OSX sed 63 | if [[ $(uname -s) == 'Darwin' ]]; then 64 | local ioption='-i .bak' 65 | else 66 | local ioption='-i' 67 | fi 68 | 69 | # set up testing suite if it doesn't yet exist 70 | if [ ! -d $WP_TESTS_DIR ]; then 71 | # set up testing suite 72 | mkdir -p $WP_TESTS_DIR 73 | svn co --quiet https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/includes/ $WP_TESTS_DIR/includes 74 | fi 75 | 76 | cd $WP_TESTS_DIR 77 | 78 | if [ ! -f wp-tests-config.php ]; then 79 | download https://develop.svn.wordpress.org/${WP_TESTS_TAG}/wp-tests-config-sample.php "$WP_TESTS_DIR"/wp-tests-config.php 80 | sed $ioption "s:dirname( __FILE__ ) . '/src/':'$WP_CORE_DIR':" "$WP_TESTS_DIR"/wp-tests-config.php 81 | sed $ioption "s/youremptytestdbnamehere/$DB_NAME/" "$WP_TESTS_DIR"/wp-tests-config.php 82 | sed $ioption "s/yourusernamehere/$DB_USER/" "$WP_TESTS_DIR"/wp-tests-config.php 83 | sed $ioption "s/yourpasswordhere/$DB_PASS/" "$WP_TESTS_DIR"/wp-tests-config.php 84 | sed $ioption "s|localhost|${DB_HOST}|" "$WP_TESTS_DIR"/wp-tests-config.php 85 | fi 86 | 87 | } 88 | 89 | install_db() { 90 | # parse DB_HOST for port or socket references 91 | local PARTS=(${DB_HOST//\:/ }) 92 | local DB_HOSTNAME=${PARTS[0]}; 93 | local DB_SOCK_OR_PORT=${PARTS[1]}; 94 | local EXTRA="" 95 | 96 | if ! [ -z $DB_HOSTNAME ] ; then 97 | if [ $(echo $DB_SOCK_OR_PORT | grep -e '^[0-9]\{1,\}$') ]; then 98 | EXTRA=" --host=$DB_HOSTNAME --port=$DB_SOCK_OR_PORT --protocol=tcp" 99 | elif ! [ -z $DB_SOCK_OR_PORT ] ; then 100 | EXTRA=" --socket=$DB_SOCK_OR_PORT" 101 | elif ! [ -z $DB_HOSTNAME ] ; then 102 | EXTRA=" --host=$DB_HOSTNAME --protocol=tcp" 103 | fi 104 | fi 105 | 106 | # create database 107 | mysqladmin create $DB_NAME --user="$DB_USER" --password="$DB_PASS"$EXTRA 108 | } 109 | 110 | install_wp 111 | install_test_suite 112 | install_db -------------------------------------------------------------------------------- /classes/class-linker-cpt.php: -------------------------------------------------------------------------------- 1 | __( 'Linker', 'linker' ), 15 | 'singular_name' => __( 'Link', 'linker' ), 16 | 'add_new' => __( 'Add New', 'linker' ), 17 | 'add_new_item' => __( 'Add New Link', 'linker' ), 18 | 'edit' => __( 'Edit', 'linker' ), 19 | 'edit_item' => __( 'Edit Link', 'linker' ), 20 | 'new_item' => __( 'New Link', 'linker' ), 21 | 'view' => __( 'View Link', 'linker' ), 22 | 'view_item' => __( 'View Link', 'linker' ), 23 | 'search_items' => __( 'Search Link', 'linker' ), 24 | 'not_found' => __( 'No Links found', 'linker' ), 25 | 'not_found_in_trash' => __( 'No Links found in Trash', 'linker' ), 26 | ); 27 | 28 | $args = array( 29 | 'labels' => $labels, 30 | 'public' => true, 31 | 'query_var' => true, 32 | 'capability_type' => 'post', 33 | 'has_archive' => false, 34 | 'hierarchical' => false, 35 | 'exclude_from_search' => true, 36 | 'menu_position' => 30, 37 | 'supports' => array( 'title', 'author' ), 38 | 'rewrite' => array( 39 | 'slug' => apply_filters( 'linker_prefix_slug', 'go' ), 40 | 'with_front' => false, 41 | ), 42 | ); 43 | 44 | register_post_type( $this->slug, 45 | apply_filters( 'linker_register_post_type_args', $args ) 46 | ); 47 | } 48 | 49 | public function post_updated_messages( $messages ) { 50 | global $post; 51 | 52 | $messages[ $this->slug ] = array( 53 | 0 => '', // Unused. Messages start at index 1. 54 | 1 => __( 'Link updated.', 'linker' ), 55 | 2 => __( 'Custom field updated.', 'linker' ), 56 | 3 => __( 'Custom field deleted.', 'linker' ), 57 | 4 => __( 'Link updated.', 'linker' ), 58 | /* translators: %s: date and time of the revision */ 59 | 5 => isset( $_GET['revision'] ) ? sprintf( __( 'Link restored to revision from %s', 'linker' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, 60 | 6 => __( 'Link published.', 'linker' ), 61 | 7 => __( 'Link saved.', 'linker' ), 62 | 8 => __( 'Link submitted.', 'linker' ), 63 | 9 => sprintf( __( 'Post scheduled for: %1$s.', 'linker' ), 64 | // translators: Publish box date format, see http://php.net/date 65 | date_i18n( __( 'M j, Y @ G:i', 'linker' ), strtotime( $post->post_date ) ) ), 66 | 10 => __( 'Link draft updated.', 'linker' ), 67 | ); 68 | 69 | return $messages; 70 | } 71 | 72 | public function plugin_action_links( $links ) { 73 | $settings_link = sprintf( '%s', 'https://github.com/KingYes/wp-linker', __( 'GitHub', 'linker' ) ); 74 | array_unshift( $links, $settings_link ); 75 | 76 | return $links; 77 | } 78 | 79 | public function admin_cpt_columns( $columns ) { 80 | return array( 81 | 'cb' => '', 82 | 'title' => __( 'Title', 'linker' ), 83 | 'linker_url' => __( 'Redirect to', 'linker' ), 84 | 'linker_permalink' => __( 'Permalink', 'linker' ), 85 | 'linker_clicks' => __( 'Clicks', 'linker' ), 86 | 'author' => __( 'Author', 'linker' ), 87 | 'date' => __( 'Date', 'linker' ), 88 | ); 89 | } 90 | 91 | public function custom_columns( $column ) { 92 | global $post; 93 | 94 | switch ( $column ) { 95 | case 'linker_url' : 96 | echo make_clickable( esc_url( get_post_meta( $post->ID, '_linker_redirect', true ) ) ); 97 | break; 98 | 99 | case 'linker_permalink' : 100 | echo ''; 101 | break; 102 | 103 | case 'linker_clicks' : 104 | echo number_format_i18n( absint( get_post_meta( $post->ID, '_linker_count', true ) ) ); 105 | break; 106 | } 107 | } 108 | 109 | public function register_meta_box() { 110 | add_meta_box( 111 | 'linker-url-information', 112 | __( 'Link Info', 'linker' ), 113 | array( &$this, 'render_meta_box' ), 114 | $this->slug, 115 | 'normal', 116 | 'high' 117 | ); 118 | } 119 | 120 | public function render_meta_box( $post ) { 121 | wp_nonce_field( basename( __FILE__ ), '_linker_meta_box_nonce' ); 122 | 123 | $field_id = '_linker_redirect'; 124 | echo strtr( '

', array( 125 | '{label}' => __( 'Redirect Link:', 'linker' ), 126 | '{name}' => $field_id, 127 | '{placeholder}' => __( 'https://your-link.com/', 'linker' ), 128 | '{value}' => esc_attr( get_post_meta( $post->ID, $field_id, true ) ), 129 | ) ); 130 | 131 | $options = array( 132 | '' => __( 'Don\'t forward', 'linker' ), 133 | 'add_n_override' => __( 'Forward & Override', 'linker' ), 134 | 'add_only' => __( 'Forward Without Overriding', 'linker' ), 135 | ); 136 | 137 | $field_id = '_linker_query_params'; 138 | 139 | $query_params_selected = get_post_meta( $post->ID, $field_id, true ); 140 | 141 | $options_html = ''; 142 | foreach ( $options as $key => $label ) { 143 | $options_html .= sprintf( '', $key, selected( $query_params_selected, $key, false ), $label ); 144 | } 145 | 146 | $description = '
    '; 147 | $description .= '
  • '; 148 | $description .= __( "Don't forward - Do not include URL parameters from the referrer when redirecting.", 'linker' ); 149 | $description .= '
  • '; 150 | $description .= __( 'Forward & Override - Forward URL parameters while replacing existing ones in the destination URL in case of conflict.', 'linker' ); 151 | $description .= '
  • '; 152 | $description .= __( 'Forward Without Overriding - Include new URL parameters without modifying those already present in the destination URL.', 'linker' ); 153 | $description .= '
  • '; 154 | $description .= '
'; 155 | 156 | echo strtr( '

{description}

', array( 157 | '{label}' => __( 'Forward URL Parameters:', 'linker' ), 158 | '{name}' => $field_id, 159 | '{options_html}' => $options_html, 160 | '{description}' => $description, 161 | ) ); 162 | 163 | $counter = absint( get_post_meta( $post->ID, '_linker_count', true ) ); 164 | printf( '

' . __( 'This Link has been accessed %d times.', 'linker' ) . '

', $counter ); 165 | } 166 | 167 | public function save_post( $post_id ) { 168 | if ( ! isset( $_POST['_linker_meta_box_nonce'] ) || ! wp_verify_nonce( $_POST['_linker_meta_box_nonce'], basename( __FILE__ ) ) ) { 169 | return; 170 | } 171 | 172 | if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { 173 | return; 174 | } 175 | 176 | if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { 177 | return; 178 | } 179 | 180 | if ( defined( 'DOING_CRON' ) && DOING_CRON ) { 181 | return; 182 | } 183 | 184 | if ( isset( $_POST['_linker_redirect'] ) ) { 185 | update_post_meta( $post_id, '_linker_redirect', $_POST['_linker_redirect'] ); 186 | } else { 187 | delete_post_meta( $post_id, '_linker_redirect' ); 188 | } 189 | 190 | if ( ! empty( $_POST['_linker_query_params'] ) ) { 191 | update_post_meta( $post_id, '_linker_query_params', $_POST['_linker_query_params'] ); 192 | } else { 193 | delete_post_meta( $post_id, '_linker_query_params' ); 194 | } 195 | } 196 | 197 | public function count_and_redirect() { 198 | if ( ! is_singular( $this->slug ) ) { 199 | return; 200 | } 201 | 202 | $counter = absint( get_post_meta( get_the_ID(), '_linker_count', true ) ); 203 | update_post_meta( get_the_ID(), '_linker_count', ++$counter ); 204 | 205 | $redirect_url = esc_url_raw( get_post_meta( get_the_ID(), '_linker_redirect', true ) ); 206 | 207 | $query_params = get_post_meta( get_the_ID(), '_linker_query_params', true ); 208 | 209 | if ( ! empty( $query_params ) && ! empty( $_GET ) ) { 210 | $url_parse = wp_parse_url( $redirect_url, PHP_URL_QUERY ); 211 | parse_str( $url_parse, $redirect_query_params ); 212 | 213 | $query = array(); 214 | if ( 'add_n_override' === $query_params ) { 215 | $query = array_merge( $redirect_query_params, $_GET ); 216 | } elseif ( 'add_only' === $query_params ) { 217 | $query = array_merge( $_GET, $redirect_query_params ); 218 | } 219 | 220 | $redirect_url = add_query_arg( $query, $redirect_url ); 221 | } 222 | 223 | if ( ! empty( $redirect_url ) ) { 224 | wp_redirect( $redirect_url, 301 ); 225 | } else { 226 | wp_redirect( home_url(), 302 ); 227 | } 228 | 229 | die(); 230 | } 231 | 232 | /** 233 | * Add Dashboard Widget for Linker 234 | */ 235 | public function linker_add_dashboard_widget() { 236 | wp_add_dashboard_widget( 237 | 'linker_dashboard_widget', 238 | __( 'Linker - Top 10', 'linker' ), 239 | array( &$this, 'linker_dashboard_widget_function' ) 240 | ); 241 | } 242 | 243 | /** 244 | * Add Dashboard Function for Linker 245 | */ 246 | public function linker_dashboard_widget_function() { 247 | $posts = get_posts( 248 | array( 249 | 'post_type' => $this->slug, 250 | 'post_status' => 'publish', 251 | 'fields' => 'ids', 252 | 'meta_key' => '_linker_count', 253 | 'orderby' => 'meta_value_num', 254 | 'order' => 'DESC', 255 | 'posts_per_page' => 10, 256 | ) 257 | ); 258 | 259 | if ( empty( $posts ) ) { 260 | echo '

' . __( 'There are no stats available yet!', 'linker' ) . '

'; 261 | return; 262 | } 263 | ?> 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 |
288 | get( 'orderby' ); 315 | 316 | if ( 'linker_clicks' == $orderby ) { 317 | $query->set( 'meta_key', '_linker_count' ); 318 | $query->set( 'orderby', 'meta_value_num' ); 319 | } 320 | } 321 | 322 | /** 323 | * Add filter by Author 324 | */ 325 | public function linker_filter_by_author() { 326 | global $typenow; 327 | 328 | if ( ! $this->slug === $typenow ) { 329 | return; 330 | } 331 | 332 | wp_dropdown_users( 333 | array( 334 | 'name' => 'author', 335 | 'show_option_all' => __( 'View all authors', 'linker' ), 336 | ) 337 | ); 338 | } 339 | 340 | /** 341 | * Add external CSS Stylesheet file 342 | * 343 | * @param $hook 344 | */ 345 | public function dashboard_widget_linker_external_css( $hook ) { 346 | global $typenow; 347 | 348 | $include_style = false; 349 | if ( 'index.php' === $hook ) { 350 | $include_style = true; 351 | } 352 | 353 | if ( 'edit.php' === $hook && $this->slug === $typenow ) { 354 | $include_style = true; 355 | } 356 | 357 | if ( ! $include_style ) { 358 | return; 359 | } 360 | 361 | wp_enqueue_style( 'linker-dashboard-widget-styles', LINKER_PLUGIN_URL . '/assets/css/styles.css' ); 362 | } 363 | 364 | public function __construct() { 365 | $this->slug = apply_filters( 'linker_post_type_slug', $this->slug ); 366 | 367 | add_action( 'init', array( &$this, 'register_post_type' ) ); 368 | add_filter( 'post_updated_messages', array( &$this, 'post_updated_messages' ) ); 369 | 370 | add_action( 'admin_menu', array( &$this, 'register_meta_box' ) ); 371 | add_filter( 'plugin_action_links_' . LINKER_BASE, array( &$this, 'plugin_action_links' ) ); 372 | 373 | add_filter( "manage_edit-{$this->slug}_columns", array( &$this, 'admin_cpt_columns' ) ); 374 | add_action( 'manage_posts_custom_column', array( &$this, 'custom_columns' ) ); 375 | add_action( 'save_post', array( &$this, 'save_post' ) ); 376 | add_action( 'template_redirect', array( &$this, 'count_and_redirect' ) ); 377 | 378 | // Add Dashboard Widget for Linker 379 | add_action( 'wp_dashboard_setup', array( &$this, 'linker_add_dashboard_widget' ) ); 380 | 381 | // Add order by Clicks 382 | add_action( 'pre_get_posts', array( &$this, 'clicks_orderby' ) ); 383 | add_filter( "manage_edit-{$this->slug}_sortable_columns", array( &$this, 'sortable_linker_clicks_column' ) ); 384 | 385 | // Add filter by Author 386 | add_action( 'restrict_manage_posts', array( &$this, 'linker_filter_by_author' ) ); 387 | 388 | // Add external CSS Stylesheet file 389 | add_action( 'admin_enqueue_scripts', array( &$this, 'dashboard_widget_linker_external_css' ) ); 390 | } 391 | } 392 | -------------------------------------------------------------------------------- /classes/class-linker-maintenance.php: -------------------------------------------------------------------------------- 1 | cpt->register_post_type(); 8 | flush_rewrite_rules(); 9 | } 10 | } 11 | 12 | register_activation_hook( LINKER__FILE__, array( 'Linker_Maintenance', 'activation' ) ); 13 | register_uninstall_hook( LINKER__FILE__, 'flush_rewrite_rules' ); 14 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "KingYes/wp-linker", 3 | "description": " Manage, create and track outbound links by custom pretty links with your domain.", 4 | "minimum-stability": "dev", 5 | "license": "gpl2", 6 | "authors": [ 7 | { 8 | "name": "Yakir Sitbon", 9 | "email": "yakir@pojo.me" 10 | } 11 | ], 12 | "require": { 13 | "phpunit/phpunit": "4.8.8" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /language/linker-he_IL.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pojome/wp-linker/69273c42e5d0edf85bfdfa4760e325a6e2682f65/language/linker-he_IL.mo -------------------------------------------------------------------------------- /language/linker-he_IL.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: Linker 1.0.0\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2015-08-09 10:21+0300\n" 11 | "PO-Revision-Date: 2015-08-09 10:25+0300\n" 12 | "Last-Translator: Yakir Sitbon \n" 13 | "Language-Team: \n" 14 | "Language: he_IL\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "X-Generator: Poedit 1.8.2\n" 19 | 20 | #: classes/class-linker-cpt.php:8 language/string.php:4 21 | msgid "Linker" 22 | msgstr "לינקר" 23 | 24 | #: classes/class-linker-cpt.php:9 25 | msgid "Link" 26 | msgstr "קישור" 27 | 28 | #: classes/class-linker-cpt.php:10 29 | msgid "Add New" 30 | msgstr "הוספת חדש" 31 | 32 | #: classes/class-linker-cpt.php:11 33 | msgid "Add New Link" 34 | msgstr "הוספת קישור חדש" 35 | 36 | #: classes/class-linker-cpt.php:12 classes/class-linker-cpt.php:200 37 | #: classes/class-linker-cpt.php:214 38 | msgid "Edit" 39 | msgstr "עריכה" 40 | 41 | #: classes/class-linker-cpt.php:13 42 | msgid "Edit Link" 43 | msgstr "עריכת קישור" 44 | 45 | #: classes/class-linker-cpt.php:14 46 | msgid "New Link" 47 | msgstr "קישור חדש" 48 | 49 | #: classes/class-linker-cpt.php:15 classes/class-linker-cpt.php:16 50 | msgid "View Link" 51 | msgstr "הצגת קישור" 52 | 53 | #: classes/class-linker-cpt.php:17 54 | msgid "Search Link" 55 | msgstr "חיפוש קישור" 56 | 57 | #: classes/class-linker-cpt.php:18 58 | msgid "No Links found" 59 | msgstr "לא נמצאו קישורים" 60 | 61 | #: classes/class-linker-cpt.php:19 62 | msgid "No Links found in Trash" 63 | msgstr "לא נמצאו קישורים" 64 | 65 | #: classes/class-linker-cpt.php:47 classes/class-linker-cpt.php:50 66 | msgid "Link updated." 67 | msgstr "קישור עודכן." 68 | 69 | #: classes/class-linker-cpt.php:48 70 | msgid "Custom field updated." 71 | msgstr "" 72 | 73 | #: classes/class-linker-cpt.php:49 74 | msgid "Custom field deleted." 75 | msgstr "" 76 | 77 | #: classes/class-linker-cpt.php:52 78 | #, php-format 79 | msgid "Link restored to revision from %s" 80 | msgstr "" 81 | 82 | #: classes/class-linker-cpt.php:53 83 | msgid "Link published." 84 | msgstr "קישור פורסם." 85 | 86 | #: classes/class-linker-cpt.php:54 87 | msgid "Link saved." 88 | msgstr "קישור נשמר." 89 | 90 | #: classes/class-linker-cpt.php:55 91 | msgid "Link submitted." 92 | msgstr "קישור נרשם." 93 | 94 | #: classes/class-linker-cpt.php:56 95 | #, php-format 96 | msgid "Post scheduled for: %1$s." 97 | msgstr "" 98 | 99 | #. //php.net/date 100 | #: classes/class-linker-cpt.php:58 101 | msgid "M j, Y @ G:i" 102 | msgstr "" 103 | 104 | #: classes/class-linker-cpt.php:59 105 | msgid "Link draft updated." 106 | msgstr "טיוטת קישור עודכנה." 107 | 108 | #: classes/class-linker-cpt.php:66 109 | msgid "GitHub" 110 | msgstr "" 111 | 112 | #: classes/class-linker-cpt.php:75 113 | msgid "Title" 114 | msgstr "כותרת" 115 | 116 | #: classes/class-linker-cpt.php:76 classes/class-linker-cpt.php:199 117 | msgid "Redirect to" 118 | msgstr "הפניה אל" 119 | 120 | #: classes/class-linker-cpt.php:77 121 | msgid "Permalink" 122 | msgstr "קישור" 123 | 124 | #: classes/class-linker-cpt.php:78 classes/class-linker-cpt.php:201 125 | msgid "Clicks" 126 | msgstr "קליקים" 127 | 128 | #: classes/class-linker-cpt.php:79 129 | msgid "Author" 130 | msgstr "מחבר" 131 | 132 | #: classes/class-linker-cpt.php:80 133 | msgid "Date" 134 | msgstr "תאריך" 135 | 136 | #: classes/class-linker-cpt.php:105 137 | msgid "Link Info" 138 | msgstr "מידע קישור" 139 | 140 | #: classes/class-linker-cpt.php:118 141 | msgid "Redirect Link:" 142 | msgstr "קישור הפניה:" 143 | 144 | #: classes/class-linker-cpt.php:120 145 | msgid "http://your-link.com/" 146 | msgstr "" 147 | 148 | #: classes/class-linker-cpt.php:125 149 | #, php-format 150 | msgid "This Link has been accessed %d times." 151 | msgstr "דרך קישור זה עברו בהצלחה %d פעמים." 152 | 153 | #: classes/class-linker-cpt.php:170 154 | msgid "Linker - Top 10" 155 | msgstr "לינקר - 10 המובילים" 156 | 157 | #: classes/class-linker-cpt.php:192 158 | msgid "There are no stats available yet!" 159 | msgstr "עדיין אין סטטיסטיקות זמינות!" 160 | 161 | #: classes/class-linker-cpt.php:263 162 | msgid "View all authors" 163 | msgstr "הצגת כל המחברים" 164 | 165 | #: linker.php:67 linker.php:78 166 | msgid "Cheatin’ huh?" 167 | msgstr "" 168 | -------------------------------------------------------------------------------- /language/linker-id_ID.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pojome/wp-linker/69273c42e5d0edf85bfdfa4760e325a6e2682f65/language/linker-id_ID.mo -------------------------------------------------------------------------------- /language/linker-id_ID.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: Linker 1.1.0\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2016-01-12 11:22+0700\n" 11 | "PO-Revision-Date: 2016-01-17 14:55+0200\n" 12 | "Language-Team: YiiBooster - YiiBooster.com \n" 13 | "MIME-Version: 1.0\n" 14 | "Content-Type: text/plain; charset=UTF-8\n" 15 | "Content-Transfer-Encoding: 8bit\n" 16 | "X-Generator: Poedit 1.8.6\n" 17 | "Last-Translator: Yakir Sitbon \n" 18 | "Plural-Forms: nplurals=1; plural=0;\n" 19 | "Language: id_ID\n" 20 | "X-Poedit-SourceCharset: UTF-8\n" 21 | 22 | #: classes/class-linker-cpt.php:8 language/string.php:4 23 | msgid "Linker" 24 | msgstr "Linker" 25 | 26 | #: classes/class-linker-cpt.php:9 27 | msgid "Link" 28 | msgstr "Link" 29 | 30 | #: classes/class-linker-cpt.php:10 31 | msgid "Add New" 32 | msgstr "Tambah Baru" 33 | 34 | #: classes/class-linker-cpt.php:11 35 | msgid "Add New Link" 36 | msgstr "Tambah Link Baru" 37 | 38 | #: classes/class-linker-cpt.php:12 classes/class-linker-cpt.php:200 39 | #: classes/class-linker-cpt.php:214 40 | msgid "Edit" 41 | msgstr "Ubah" 42 | 43 | #: classes/class-linker-cpt.php:13 44 | msgid "Edit Link" 45 | msgstr "Ubah Link" 46 | 47 | #: classes/class-linker-cpt.php:14 48 | msgid "New Link" 49 | msgstr "Link Baru" 50 | 51 | #: classes/class-linker-cpt.php:15 classes/class-linker-cpt.php:16 52 | msgid "View Link" 53 | msgstr "Lihat Link" 54 | 55 | #: classes/class-linker-cpt.php:17 56 | msgid "Search Link" 57 | msgstr "Cari Link" 58 | 59 | #: classes/class-linker-cpt.php:18 60 | msgid "No Links found" 61 | msgstr "Tidak Ada Link Yang Ditemukan" 62 | 63 | #: classes/class-linker-cpt.php:19 64 | msgid "No Links found in Trash" 65 | msgstr "Tidak ada ling dalam kategori sampah" 66 | 67 | #: classes/class-linker-cpt.php:47 classes/class-linker-cpt.php:50 68 | msgid "Link updated." 69 | msgstr "Link Diperbaharui." 70 | 71 | #: classes/class-linker-cpt.php:48 72 | msgid "Custom field updated." 73 | msgstr "Field Ubah Sesuaian telah diperbaharui." 74 | 75 | #: classes/class-linker-cpt.php:49 76 | msgid "Custom field deleted." 77 | msgstr "Field Ubah Sesuaian Telah Dihapus." 78 | 79 | #: classes/class-linker-cpt.php:52 80 | #, php-format 81 | msgid "Link restored to revision from %s" 82 | msgstr "Ling di kembalikan untuk revisi dari %s" 83 | 84 | #: classes/class-linker-cpt.php:53 85 | msgid "Link published." 86 | msgstr "Link berhasil di publis." 87 | 88 | #: classes/class-linker-cpt.php:54 89 | msgid "Link saved." 90 | msgstr "Link berhasil di simpan." 91 | 92 | #: classes/class-linker-cpt.php:55 93 | msgid "Link submitted." 94 | msgstr "Link berhasil di tambahkan." 95 | 96 | #: classes/class-linker-cpt.php:56 97 | #, php-format 98 | msgid "Post scheduled for: %1$s." 99 | msgstr "Pos di jadwalkan untuk: %1$s." 100 | 101 | #. //php.net/date 102 | #: classes/class-linker-cpt.php:58 103 | msgid "M j, Y @ G:i" 104 | msgstr "M j, Y @ G:i" 105 | 106 | #: classes/class-linker-cpt.php:59 107 | msgid "Link draft updated." 108 | msgstr "Draft Link berhasil di perbaharui." 109 | 110 | #: classes/class-linker-cpt.php:66 111 | msgid "GitHub" 112 | msgstr "GitHub" 113 | 114 | #: classes/class-linker-cpt.php:75 115 | msgid "Title" 116 | msgstr "Judul" 117 | 118 | #: classes/class-linker-cpt.php:76 classes/class-linker-cpt.php:199 119 | msgid "Redirect to" 120 | msgstr "Dialihkan ke" 121 | 122 | #: classes/class-linker-cpt.php:77 123 | msgid "Permalink" 124 | msgstr "Permalink" 125 | 126 | #: classes/class-linker-cpt.php:78 classes/class-linker-cpt.php:201 127 | msgid "Clicks" 128 | msgstr "Klik" 129 | 130 | #: classes/class-linker-cpt.php:79 131 | msgid "Author" 132 | msgstr "Pengarang" 133 | 134 | #: classes/class-linker-cpt.php:80 135 | msgid "Date" 136 | msgstr "Tanggal" 137 | 138 | #: classes/class-linker-cpt.php:105 139 | msgid "Link Info" 140 | msgstr "Info Link" 141 | 142 | #: classes/class-linker-cpt.php:118 143 | msgid "Redirect Link:" 144 | msgstr "Pengalihan Link:" 145 | 146 | #: classes/class-linker-cpt.php:120 147 | msgid "http://your-link.com/" 148 | msgstr "http://link-kamu.com/" 149 | 150 | #: classes/class-linker-cpt.php:125 151 | #, php-format 152 | msgid "This Link has been accessed %d times." 153 | msgstr "Link ini sudah di akses %d kali." 154 | 155 | #: classes/class-linker-cpt.php:170 156 | msgid "Linker - Top 10" 157 | msgstr "Linker - Top 10" 158 | 159 | #: classes/class-linker-cpt.php:192 160 | msgid "There are no stats available yet!" 161 | msgstr "Belum ada stats yang terekam!" 162 | 163 | #: classes/class-linker-cpt.php:263 164 | msgid "View all authors" 165 | msgstr "Lihat semua pengarang" 166 | 167 | #: linker.php:67 linker.php:78 168 | msgid "Cheatin’ huh?" 169 | msgstr "Cheat’ Mau apa?" 170 | -------------------------------------------------------------------------------- /language/linker-pt_BR.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pojome/wp-linker/69273c42e5d0edf85bfdfa4760e325a6e2682f65/language/linker-pt_BR.mo -------------------------------------------------------------------------------- /language/linker-pt_BR.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: Linker 1.0.4\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2015-04-24 08:48+0300\n" 11 | "PO-Revision-Date: 2015-05-12 02:34-0300\n" 12 | "MIME-Version: 1.0\n" 13 | "Content-Type: text/plain; charset=UTF-8\n" 14 | "Content-Transfer-Encoding: 8bit\n" 15 | "Last-Translator: Rhenan Cardozo \n" 16 | "Language-Team: \n" 17 | "X-Generator: Poedit 1.7.6\n" 18 | "Plural-Forms: nplurals=2; plural=(n > 1);\n" 19 | "Language: pt_BR\n" 20 | 21 | #: classes/class-linker-cpt.php:8 language/string.php:4 22 | msgid "Linker" 23 | msgstr "Linker" 24 | 25 | #: classes/class-linker-cpt.php:9 26 | msgid "Link" 27 | msgstr "Link" 28 | 29 | #: classes/class-linker-cpt.php:10 30 | msgid "Add New" 31 | msgstr "Adicionar Novo" 32 | 33 | #: classes/class-linker-cpt.php:11 34 | msgid "Add New Link" 35 | msgstr "Adicionar Novo Link" 36 | 37 | #: classes/class-linker-cpt.php:12 38 | msgid "Edit" 39 | msgstr "Editar" 40 | 41 | #: classes/class-linker-cpt.php:13 42 | msgid "Edit Link" 43 | msgstr "Editar Link" 44 | 45 | #: classes/class-linker-cpt.php:14 46 | msgid "New Link" 47 | msgstr "Novo Link" 48 | 49 | #: classes/class-linker-cpt.php:15 classes/class-linker-cpt.php:16 50 | msgid "View Link" 51 | msgstr "Ver Link" 52 | 53 | #: classes/class-linker-cpt.php:17 54 | msgid "Search Link" 55 | msgstr "Pesquisar Link" 56 | 57 | #: classes/class-linker-cpt.php:18 58 | msgid "No Links found" 59 | msgstr "Não foram encontrados Links" 60 | 61 | #: classes/class-linker-cpt.php:19 62 | msgid "No Links found in Trash" 63 | msgstr "Não foram encontrados Links na Lixeira" 64 | 65 | #: classes/class-linker-cpt.php:47 classes/class-linker-cpt.php:50 66 | msgid "Link updated." 67 | msgstr "Link atualizado" 68 | 69 | #: classes/class-linker-cpt.php:48 70 | msgid "Custom field updated." 71 | msgstr "Campo personalizado atualizado." 72 | 73 | #: classes/class-linker-cpt.php:49 74 | msgid "Custom field deleted." 75 | msgstr "Campo personalizado deletado." 76 | 77 | #: classes/class-linker-cpt.php:52 78 | #, php-format 79 | msgid "Link restored to revision from %s" 80 | msgstr "Link restaurado para revisão por %s" 81 | 82 | #: classes/class-linker-cpt.php:53 83 | msgid "Link published." 84 | msgstr "Link publicado." 85 | 86 | #: classes/class-linker-cpt.php:54 87 | msgid "Link saved." 88 | msgstr "Link salvo." 89 | 90 | #: classes/class-linker-cpt.php:55 91 | msgid "Link submitted." 92 | msgstr "Link enviado." 93 | 94 | #: classes/class-linker-cpt.php:56 95 | #, php-format 96 | msgid "Post scheduled for: %1$s." 97 | msgstr "Artigo agendado para %1$s" 98 | 99 | #. //php.net/date 100 | #: classes/class-linker-cpt.php:58 101 | msgid "M j, Y @ G:i" 102 | msgstr "j M, Y @ G:i" 103 | 104 | #: classes/class-linker-cpt.php:59 105 | msgid "Link draft updated." 106 | msgstr "Rascunho do Link atualizado." 107 | 108 | #: classes/class-linker-cpt.php:66 109 | msgid "GitHub" 110 | msgstr "GitHub" 111 | 112 | #: classes/class-linker-cpt.php:75 113 | msgid "Title" 114 | msgstr "Título" 115 | 116 | #: classes/class-linker-cpt.php:76 117 | msgid "Redirect to" 118 | msgstr "Redirecionar para" 119 | 120 | #: classes/class-linker-cpt.php:77 121 | msgid "Permalink" 122 | msgstr "Link Permanente" 123 | 124 | #: classes/class-linker-cpt.php:78 125 | msgid "Clicks" 126 | msgstr "Cliques" 127 | 128 | #: classes/class-linker-cpt.php:79 129 | msgid "Author" 130 | msgstr "Autor" 131 | 132 | #: classes/class-linker-cpt.php:80 133 | msgid "Date" 134 | msgstr "Data" 135 | 136 | #: classes/class-linker-cpt.php:105 137 | msgid "Link Info" 138 | msgstr "Informação do Link" 139 | 140 | #: classes/class-linker-cpt.php:131 141 | msgid "Redirect Link:" 142 | msgstr "Redirecionar Link" 143 | 144 | #: classes/class-linker-cpt.php:133 145 | msgid "http://your-link.com/" 146 | msgstr "http://seu-link.com/" 147 | 148 | #: classes/class-linker-cpt.php:138 149 | #, php-format 150 | msgid "This Link has been accessed %d times." 151 | msgstr "Este Link foi acessado %d vezes." 152 | 153 | #: linker.php:66 linker.php:77 154 | msgid "Cheatin’ huh?" 155 | msgstr "" 156 | -------------------------------------------------------------------------------- /language/linker.pot: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: Linker 1.2.0\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2016-05-26 17:23+0300\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "Language: \n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=CHARSET\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | 20 | #: classes/class-linker-cpt.php:15 language/string.php:4 21 | msgid "Linker" 22 | msgstr "" 23 | 24 | #: classes/class-linker-cpt.php:16 25 | msgid "Link" 26 | msgstr "" 27 | 28 | #: classes/class-linker-cpt.php:17 29 | msgid "Add New" 30 | msgstr "" 31 | 32 | #: classes/class-linker-cpt.php:18 33 | msgid "Add New Link" 34 | msgstr "" 35 | 36 | #: classes/class-linker-cpt.php:19 classes/class-linker-cpt.php:208 37 | #: classes/class-linker-cpt.php:222 38 | msgid "Edit" 39 | msgstr "" 40 | 41 | #: classes/class-linker-cpt.php:20 42 | msgid "Edit Link" 43 | msgstr "" 44 | 45 | #: classes/class-linker-cpt.php:21 46 | msgid "New Link" 47 | msgstr "" 48 | 49 | #: classes/class-linker-cpt.php:22 classes/class-linker-cpt.php:23 50 | msgid "View Link" 51 | msgstr "" 52 | 53 | #: classes/class-linker-cpt.php:24 54 | msgid "Search Link" 55 | msgstr "" 56 | 57 | #: classes/class-linker-cpt.php:25 58 | msgid "No Links found" 59 | msgstr "" 60 | 61 | #: classes/class-linker-cpt.php:26 62 | msgid "No Links found in Trash" 63 | msgstr "" 64 | 65 | #: classes/class-linker-cpt.php:55 classes/class-linker-cpt.php:58 66 | msgid "Link updated." 67 | msgstr "" 68 | 69 | #: classes/class-linker-cpt.php:56 70 | msgid "Custom field updated." 71 | msgstr "" 72 | 73 | #: classes/class-linker-cpt.php:57 74 | msgid "Custom field deleted." 75 | msgstr "" 76 | 77 | #: classes/class-linker-cpt.php:60 78 | #, php-format 79 | msgid "Link restored to revision from %s" 80 | msgstr "" 81 | 82 | #: classes/class-linker-cpt.php:61 83 | msgid "Link published." 84 | msgstr "" 85 | 86 | #: classes/class-linker-cpt.php:62 87 | msgid "Link saved." 88 | msgstr "" 89 | 90 | #: classes/class-linker-cpt.php:63 91 | msgid "Link submitted." 92 | msgstr "" 93 | 94 | #: classes/class-linker-cpt.php:64 95 | #, php-format 96 | msgid "Post scheduled for: %1$s." 97 | msgstr "" 98 | 99 | #: classes/class-linker-cpt.php:66 100 | msgid "M j, Y @ G:i" 101 | msgstr "" 102 | 103 | #: classes/class-linker-cpt.php:67 104 | msgid "Link draft updated." 105 | msgstr "" 106 | 107 | #: classes/class-linker-cpt.php:74 108 | msgid "GitHub" 109 | msgstr "" 110 | 111 | #: classes/class-linker-cpt.php:83 112 | msgid "Title" 113 | msgstr "" 114 | 115 | #: classes/class-linker-cpt.php:84 classes/class-linker-cpt.php:207 116 | msgid "Redirect to" 117 | msgstr "" 118 | 119 | #: classes/class-linker-cpt.php:85 120 | msgid "Permalink" 121 | msgstr "" 122 | 123 | #: classes/class-linker-cpt.php:86 classes/class-linker-cpt.php:209 124 | msgid "Clicks" 125 | msgstr "" 126 | 127 | #: classes/class-linker-cpt.php:87 128 | msgid "Author" 129 | msgstr "" 130 | 131 | #: classes/class-linker-cpt.php:88 132 | msgid "Date" 133 | msgstr "" 134 | 135 | #: classes/class-linker-cpt.php:113 136 | msgid "Link Info" 137 | msgstr "" 138 | 139 | #: classes/class-linker-cpt.php:126 140 | msgid "Redirect Link:" 141 | msgstr "" 142 | 143 | #: classes/class-linker-cpt.php:128 144 | msgid "http://your-link.com/" 145 | msgstr "" 146 | 147 | #: classes/class-linker-cpt.php:133 148 | #, php-format 149 | msgid "This Link has been accessed %d times." 150 | msgstr "" 151 | 152 | #: classes/class-linker-cpt.php:178 153 | msgid "Linker - Top 10" 154 | msgstr "" 155 | 156 | #: classes/class-linker-cpt.php:200 157 | msgid "There are no stats available yet!" 158 | msgstr "" 159 | 160 | #: classes/class-linker-cpt.php:271 161 | msgid "View all authors" 162 | msgstr "" 163 | 164 | #: linker.php:67 linker.php:78 165 | msgid "Cheatin’ huh?" 166 | msgstr "" 167 | -------------------------------------------------------------------------------- /language/string.php: -------------------------------------------------------------------------------- 1 | cpt = new Linker_CPT(); 94 | 95 | add_action( 'plugins_loaded', array( &$this, 'load_textdomain' ) ); 96 | } 97 | } 98 | 99 | if ( ! defined( 'POJO_LINKER_TESTS' ) ) { 100 | Linker_Main::instance(); 101 | } 102 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Linker", 3 | "version": "1.2.2", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "Linker", 9 | "version": "1.2.2", 10 | "devDependencies": { 11 | "grunt": "~0.4.5", 12 | "grunt-bumpup": "~0.6.3", 13 | "grunt-checktextdomain": "~1.0.0", 14 | "grunt-contrib-clean": "~1.0.0", 15 | "grunt-contrib-copy": "~1.0.0", 16 | "grunt-phpunit": "~0.3.6", 17 | "grunt-pot": "~0.2.1", 18 | "grunt-release": "~0.13.0", 19 | "grunt-shell": "~1.2.1", 20 | "grunt-text-replace": "~0.4.0", 21 | "grunt-wp-deploy": "~1.1.0", 22 | "grunt-wp-readme-to-markdown-with-extra": "~0.7.3", 23 | "matchdep": "~1.0.1" 24 | } 25 | }, 26 | "node_modules/abbrev": { 27 | "version": "1.1.1", 28 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 29 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 30 | "dev": true 31 | }, 32 | "node_modules/ansi-regex": { 33 | "version": "2.1.1", 34 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 35 | "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", 36 | "dev": true, 37 | "engines": { 38 | "node": ">=0.10.0" 39 | } 40 | }, 41 | "node_modules/ansi-styles": { 42 | "version": "0.2.0", 43 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-0.2.0.tgz", 44 | "integrity": "sha512-YyQBeLj0juxUC9uUXRpQ1ZAzPT1dnsn5vVeJLHYFq4Ct1p0rymUSyvckKCXCH9I0bh3jWDIETA5nXIaZVKlDyA==", 45 | "dev": true, 46 | "engines": { 47 | "node": ">=0.8.0" 48 | } 49 | }, 50 | "node_modules/argparse": { 51 | "version": "0.1.16", 52 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", 53 | "integrity": "sha512-LjmC2dNpdn2L4UzyoaIr11ELYoLn37ZFy9zObrQFHsSuOepeUEMKnM8w5KL4Tnrp2gy88rRuQt6Ky8Bjml+Baw==", 54 | "dev": true, 55 | "dependencies": { 56 | "underscore": "~1.7.0", 57 | "underscore.string": "~2.4.0" 58 | } 59 | }, 60 | "node_modules/argparse/node_modules/underscore.string": { 61 | "version": "2.4.0", 62 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", 63 | "integrity": "sha512-yxkabuCaIBnzfIvX3kBxQqCs0ar/bfJwDnFEHJUm/ZrRVhT3IItdRF5cZjARLzEnyQYtIUhsZ2LG2j3HidFOFQ==", 64 | "dev": true, 65 | "engines": { 66 | "node": "*" 67 | } 68 | }, 69 | "node_modules/arr-diff": { 70 | "version": "2.0.0", 71 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", 72 | "integrity": "sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==", 73 | "dev": true, 74 | "dependencies": { 75 | "arr-flatten": "^1.0.1" 76 | }, 77 | "engines": { 78 | "node": ">=0.10.0" 79 | } 80 | }, 81 | "node_modules/arr-flatten": { 82 | "version": "1.1.0", 83 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 84 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", 85 | "dev": true, 86 | "engines": { 87 | "node": ">=0.10.0" 88 | } 89 | }, 90 | "node_modules/array-unique": { 91 | "version": "0.2.1", 92 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", 93 | "integrity": "sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==", 94 | "dev": true, 95 | "engines": { 96 | "node": ">=0.10.0" 97 | } 98 | }, 99 | "node_modules/async": { 100 | "version": "0.1.22", 101 | "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", 102 | "integrity": "sha512-2tEzliJmf5fHNafNwQLJXUasGzQCVctvsNkXmnlELHwypU0p08/rHohYvkqKIjyXpx+0rkrYv6QbhJ+UF4QkBg==", 103 | "dev": true, 104 | "engines": { 105 | "node": "*" 106 | } 107 | }, 108 | "node_modules/balanced-match": { 109 | "version": "1.0.2", 110 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 111 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 112 | "dev": true 113 | }, 114 | "node_modules/brace-expansion": { 115 | "version": "1.1.11", 116 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 117 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 118 | "dev": true, 119 | "dependencies": { 120 | "balanced-match": "^1.0.0", 121 | "concat-map": "0.0.1" 122 | } 123 | }, 124 | "node_modules/braces": { 125 | "version": "1.8.5", 126 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", 127 | "integrity": "sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==", 128 | "dev": true, 129 | "dependencies": { 130 | "expand-range": "^1.8.1", 131 | "preserve": "^0.2.0", 132 | "repeat-element": "^1.1.2" 133 | }, 134 | "engines": { 135 | "node": ">=0.10.0" 136 | } 137 | }, 138 | "node_modules/chalk": { 139 | "version": "0.2.1", 140 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.2.1.tgz", 141 | "integrity": "sha512-nmVapomwGksziCuynboy7I+dtW4ytIdqXPlrfY/ySx8l8EqFRGHyA04q6NMNpOri8XliGUGwXyfScVl48zFHbw==", 142 | "dev": true, 143 | "dependencies": { 144 | "ansi-styles": "~0.2.0", 145 | "has-color": "~0.1.0" 146 | }, 147 | "engines": { 148 | "node": ">=0.8.0" 149 | } 150 | }, 151 | "node_modules/cli-color": { 152 | "version": "0.2.3", 153 | "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-0.2.3.tgz", 154 | "integrity": "sha512-f4DFHXdoe2rGMwuVO+DTBM6CkSt4m9R4a0vjnq5CJkSCKaXbrHbslCmyjG6cz/o50HP2wkjO3G1mXvc7G3V1LQ==", 155 | "dev": true, 156 | "dependencies": { 157 | "es5-ext": "~0.9.2", 158 | "memoizee": "~0.2.5" 159 | }, 160 | "engines": { 161 | "node": ">=0.1.103" 162 | } 163 | }, 164 | "node_modules/coffee-script": { 165 | "version": "1.3.3", 166 | "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz", 167 | "integrity": "sha512-QjQ1T4BqyHv19k6XSfdhy/QLlIOhywz0ekBUCa9h71zYMJlfDTGan/Z1JXzYkZ6v8R+GhvL/p4FZPbPW8WNXlg==", 168 | "deprecated": "CoffeeScript on NPM has moved to \"coffeescript\" (no hyphen)", 169 | "dev": true, 170 | "bin": { 171 | "cake": "bin/cake", 172 | "coffee": "bin/coffee" 173 | }, 174 | "engines": { 175 | "node": ">=0.4.0" 176 | } 177 | }, 178 | "node_modules/colors": { 179 | "version": "0.6.2", 180 | "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", 181 | "integrity": "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==", 182 | "dev": true, 183 | "engines": { 184 | "node": ">=0.1.90" 185 | } 186 | }, 187 | "node_modules/combined-stream": { 188 | "version": "1.0.8", 189 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 190 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 191 | "dev": true, 192 | "dependencies": { 193 | "delayed-stream": "~1.0.0" 194 | }, 195 | "engines": { 196 | "node": ">= 0.8" 197 | } 198 | }, 199 | "node_modules/component-emitter": { 200 | "version": "1.2.1", 201 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", 202 | "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==", 203 | "dev": true 204 | }, 205 | "node_modules/concat-map": { 206 | "version": "0.0.1", 207 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 208 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 209 | "dev": true 210 | }, 211 | "node_modules/cookiejar": { 212 | "version": "2.0.6", 213 | "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.0.6.tgz", 214 | "integrity": "sha512-X9IsySmsr1heROBZCpyEYhqJyU7CXNJoVxIlQ5bBb7DskYUx0mQ+g2f7yPYajceZeGJWHQbIfGB6j0hywV/ARQ==", 215 | "dev": true 216 | }, 217 | "node_modules/core-util-is": { 218 | "version": "1.0.3", 219 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 220 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", 221 | "dev": true 222 | }, 223 | "node_modules/dateformat": { 224 | "version": "1.0.2-1.2.3", 225 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", 226 | "integrity": "sha512-AXvW8g7tO4ilk5HgOWeDmPi/ZPaCnMJ+9Cg1I3p19w6mcvAAXBuuGEXAxybC+Djj1PSZUiHUcyoYu7WneCX8gQ==", 227 | "dev": true, 228 | "engines": { 229 | "node": "*" 230 | } 231 | }, 232 | "node_modules/debug": { 233 | "version": "2.6.9", 234 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 235 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 236 | "dev": true, 237 | "dependencies": { 238 | "ms": "2.0.0" 239 | } 240 | }, 241 | "node_modules/delayed-stream": { 242 | "version": "1.0.0", 243 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 244 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 245 | "dev": true, 246 | "engines": { 247 | "node": ">=0.4.0" 248 | } 249 | }, 250 | "node_modules/es5-ext": { 251 | "version": "0.9.2", 252 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.9.2.tgz", 253 | "integrity": "sha512-wP3OSxZ0L/qK76t6qxPR8gWr2o5F4SzNF9qS5F/mOfVY3Ezcg07v6hSkETDmoekXIzn8xhQbHpp+tVlOE+qOAg==", 254 | "dev": true, 255 | "engines": { 256 | "node": ">=0.4" 257 | } 258 | }, 259 | "node_modules/escape-string-regexp": { 260 | "version": "1.0.5", 261 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 262 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 263 | "dev": true, 264 | "engines": { 265 | "node": ">=0.8.0" 266 | } 267 | }, 268 | "node_modules/esprima": { 269 | "version": "1.0.4", 270 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", 271 | "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==", 272 | "dev": true, 273 | "bin": { 274 | "esparse": "bin/esparse.js", 275 | "esvalidate": "bin/esvalidate.js" 276 | }, 277 | "engines": { 278 | "node": ">=0.4.0" 279 | } 280 | }, 281 | "node_modules/event-emitter": { 282 | "version": "0.2.2", 283 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.2.2.tgz", 284 | "integrity": "sha512-kdjfxF6jYJ5m/OEe3ZNNJzbCEcagF4lNJeuhgrBSRnlitpdxICDKzCel+Z5Wbl7K9UhBN/7k2MzXBvCvSwfzzg==", 285 | "dev": true, 286 | "dependencies": { 287 | "es5-ext": "~0.9.2" 288 | }, 289 | "engines": { 290 | "node": ">=0.4" 291 | } 292 | }, 293 | "node_modules/eventemitter2": { 294 | "version": "0.4.14", 295 | "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", 296 | "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", 297 | "dev": true 298 | }, 299 | "node_modules/exit": { 300 | "version": "0.1.2", 301 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 302 | "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", 303 | "dev": true, 304 | "engines": { 305 | "node": ">= 0.8.0" 306 | } 307 | }, 308 | "node_modules/expand-brackets": { 309 | "version": "0.1.5", 310 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", 311 | "integrity": "sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==", 312 | "dev": true, 313 | "dependencies": { 314 | "is-posix-bracket": "^0.1.0" 315 | }, 316 | "engines": { 317 | "node": ">=0.10.0" 318 | } 319 | }, 320 | "node_modules/expand-range": { 321 | "version": "1.8.2", 322 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", 323 | "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", 324 | "dev": true, 325 | "dependencies": { 326 | "fill-range": "^2.1.0" 327 | }, 328 | "engines": { 329 | "node": ">=0.10.0" 330 | } 331 | }, 332 | "node_modules/extend": { 333 | "version": "3.0.0", 334 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", 335 | "integrity": "sha512-5mYyg57hpD+sFaJmgNL9BidQ5C7dmJE3U5vzlRWbuqG+8dytvYEoxvKs6Tj5cm3LpMsFvRt20qz1ckezmsOUgQ==", 336 | "dev": true 337 | }, 338 | "node_modules/extglob": { 339 | "version": "0.3.2", 340 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", 341 | "integrity": "sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==", 342 | "dev": true, 343 | "dependencies": { 344 | "is-extglob": "^1.0.0" 345 | }, 346 | "engines": { 347 | "node": ">=0.10.0" 348 | } 349 | }, 350 | "node_modules/file-sync-cmp": { 351 | "version": "0.1.1", 352 | "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", 353 | "integrity": "sha512-0k45oWBokCqh2MOexeYKpyqmGKG+8mQ2Wd8iawx+uWd/weWJQAZ6SoPybagdCI4xFisag8iAR77WPm4h3pTfxA==", 354 | "dev": true 355 | }, 356 | "node_modules/filename-regex": { 357 | "version": "2.0.1", 358 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", 359 | "integrity": "sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==", 360 | "dev": true, 361 | "engines": { 362 | "node": ">=0.10.0" 363 | } 364 | }, 365 | "node_modules/fill-range": { 366 | "version": "2.2.4", 367 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", 368 | "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", 369 | "dev": true, 370 | "dependencies": { 371 | "is-number": "^2.1.0", 372 | "isobject": "^2.0.0", 373 | "randomatic": "^3.0.0", 374 | "repeat-element": "^1.1.2", 375 | "repeat-string": "^1.5.2" 376 | }, 377 | "engines": { 378 | "node": ">=0.10.0" 379 | } 380 | }, 381 | "node_modules/findup-sync": { 382 | "version": "0.1.3", 383 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", 384 | "integrity": "sha512-yjftfYnF4ThYEvKEV/kEFR15dmtyXTAh3vQnzpJUoc7Naj5y1P0Ck7Zs1+Vroa00E3KT3IYsk756S+8WA5dNLw==", 385 | "dev": true, 386 | "dependencies": { 387 | "glob": "~3.2.9", 388 | "lodash": "~2.4.1" 389 | }, 390 | "engines": { 391 | "node": ">= 0.6.0" 392 | } 393 | }, 394 | "node_modules/findup-sync/node_modules/glob": { 395 | "version": "3.2.11", 396 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", 397 | "integrity": "sha512-hVb0zwEZwC1FXSKRPFTeOtN7AArJcJlI6ULGLtrstaswKNlrTJqAA+1lYlSUop4vjA423xlBzqfVS3iWGlqJ+g==", 398 | "dev": true, 399 | "dependencies": { 400 | "inherits": "2", 401 | "minimatch": "0.3" 402 | }, 403 | "engines": { 404 | "node": "*" 405 | } 406 | }, 407 | "node_modules/findup-sync/node_modules/inherits": { 408 | "version": "2.0.4", 409 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 410 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 411 | "dev": true 412 | }, 413 | "node_modules/findup-sync/node_modules/lodash": { 414 | "version": "2.4.2", 415 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", 416 | "integrity": "sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==", 417 | "dev": true, 418 | "engines": [ 419 | "node", 420 | "rhino" 421 | ] 422 | }, 423 | "node_modules/findup-sync/node_modules/minimatch": { 424 | "version": "0.3.0", 425 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", 426 | "integrity": "sha512-WFX1jI1AaxNTZVOHLBVazwTWKaQjoykSzCBNXB72vDTCzopQGtyP91tKdFK5cv1+qMwPyiTu1HqUriqplI8pcA==", 427 | "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", 428 | "dev": true, 429 | "dependencies": { 430 | "lru-cache": "2", 431 | "sigmund": "~1.0.0" 432 | }, 433 | "engines": { 434 | "node": "*" 435 | } 436 | }, 437 | "node_modules/for-in": { 438 | "version": "1.0.2", 439 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 440 | "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", 441 | "dev": true, 442 | "engines": { 443 | "node": ">=0.10.0" 444 | } 445 | }, 446 | "node_modules/for-own": { 447 | "version": "0.1.5", 448 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", 449 | "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==", 450 | "dev": true, 451 | "dependencies": { 452 | "for-in": "^1.0.1" 453 | }, 454 | "engines": { 455 | "node": ">=0.10.0" 456 | } 457 | }, 458 | "node_modules/form-data": { 459 | "version": "1.0.0-rc3", 460 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", 461 | "integrity": "sha512-Z5JWXWsFDI8x73Rt/Dc7SK/EvKBzudhqIVBtEhcAhtoevCTqO3YJmctGBLzT0Ggg39xFcefkXt00t1TYLz6D0w==", 462 | "dev": true, 463 | "dependencies": { 464 | "async": "^1.4.0", 465 | "combined-stream": "^1.0.5", 466 | "mime-types": "^2.1.3" 467 | }, 468 | "engines": { 469 | "node": ">= 0.10" 470 | } 471 | }, 472 | "node_modules/form-data/node_modules/async": { 473 | "version": "1.5.2", 474 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 475 | "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", 476 | "dev": true 477 | }, 478 | "node_modules/formidable": { 479 | "version": "1.0.17", 480 | "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.17.tgz", 481 | "integrity": "sha512-95MFT5qipMvUiesmuvGP1BI4hh5XWCzyTapiNJ/k8JBQda7rPy7UCWYItz2uZEdTgGNy1eInjzlL9Wx1O9fedg==", 482 | "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", 483 | "dev": true, 484 | "engines": { 485 | "node": ">=0.8.0" 486 | } 487 | }, 488 | "node_modules/fs.realpath": { 489 | "version": "1.0.0", 490 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 491 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 492 | "dev": true 493 | }, 494 | "node_modules/getobject": { 495 | "version": "0.1.0", 496 | "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", 497 | "integrity": "sha512-hIGEBfnHcZpWkXPsAVeVmpYDvfy/matVl03yOY91FPmnpCC12Lm5izNxCjO3lHAeO6uaTwMxu7g450Siknlhig==", 498 | "dev": true, 499 | "engines": { 500 | "node": ">= 0.8.0" 501 | } 502 | }, 503 | "node_modules/glob": { 504 | "version": "3.1.21", 505 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", 506 | "integrity": "sha512-ANhy2V2+tFpRajE3wN4DhkNQ08KDr0Ir1qL12/cUe5+a7STEK8jkW4onUYuY8/06qAFuT5je7mjAqzx0eKI2tQ==", 507 | "dev": true, 508 | "dependencies": { 509 | "graceful-fs": "~1.2.0", 510 | "inherits": "1", 511 | "minimatch": "~0.2.11" 512 | }, 513 | "engines": { 514 | "node": "*" 515 | } 516 | }, 517 | "node_modules/glob-base": { 518 | "version": "0.3.0", 519 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", 520 | "integrity": "sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==", 521 | "dev": true, 522 | "dependencies": { 523 | "glob-parent": "^2.0.0", 524 | "is-glob": "^2.0.0" 525 | }, 526 | "engines": { 527 | "node": ">=0.10.0" 528 | } 529 | }, 530 | "node_modules/glob-parent": { 531 | "version": "2.0.0", 532 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", 533 | "integrity": "sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==", 534 | "dev": true, 535 | "dependencies": { 536 | "is-glob": "^2.0.0" 537 | } 538 | }, 539 | "node_modules/graceful-fs": { 540 | "version": "1.2.3", 541 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", 542 | "integrity": "sha512-iiTUZ5vZ+2ZV+h71XAgwCSu6+NAizhFU3Yw8aC/hH5SQ3SnISqEqAek40imAFGtDcwJKNhXvSY+hzIolnLwcdQ==", 543 | "deprecated": "please upgrade to graceful-fs 4 for compatibility with current and future versions of Node.js", 544 | "dev": true, 545 | "engines": { 546 | "node": ">=0.4.0" 547 | } 548 | }, 549 | "node_modules/grunt": { 550 | "version": "0.4.5", 551 | "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", 552 | "integrity": "sha512-1iq3ylLjzXqz/KSq1OAE2qhnpcbkF2WyhsQcavZt+YmgvHu0EbPMEhGhy2gr0FP67isHpRdfwjB5WVeXXcJemQ==", 553 | "dev": true, 554 | "dependencies": { 555 | "async": "~0.1.22", 556 | "coffee-script": "~1.3.3", 557 | "colors": "~0.6.2", 558 | "dateformat": "1.0.2-1.2.3", 559 | "eventemitter2": "~0.4.13", 560 | "exit": "~0.1.1", 561 | "findup-sync": "~0.1.2", 562 | "getobject": "~0.1.0", 563 | "glob": "~3.1.21", 564 | "grunt-legacy-log": "~0.1.0", 565 | "grunt-legacy-util": "~0.2.0", 566 | "hooker": "~0.2.3", 567 | "iconv-lite": "~0.2.11", 568 | "js-yaml": "~2.0.5", 569 | "lodash": "~0.9.2", 570 | "minimatch": "~0.2.12", 571 | "nopt": "~1.0.10", 572 | "rimraf": "~2.2.8", 573 | "underscore.string": "~2.2.1", 574 | "which": "~1.0.5" 575 | }, 576 | "engines": { 577 | "node": ">= 0.8.0" 578 | } 579 | }, 580 | "node_modules/grunt-bumpup": { 581 | "version": "0.6.3", 582 | "resolved": "https://registry.npmjs.org/grunt-bumpup/-/grunt-bumpup-0.6.3.tgz", 583 | "integrity": "sha512-WRIqlm0HrwfwaPbJMpOphKKsqdIjEH8emCKQKbx6/BD6H4PyYggGCV3c+RaqydC9BuJ3DsXYcpi77yhDdkGwlg==", 584 | "dev": true, 585 | "dependencies": { 586 | "moment": "^2.8.3", 587 | "semver": "^4.0.3" 588 | }, 589 | "engines": { 590 | "node": ">=0.8.0" 591 | }, 592 | "peerDependencies": { 593 | "grunt": ">=0.4.0" 594 | } 595 | }, 596 | "node_modules/grunt-checktextdomain": { 597 | "version": "1.0.1", 598 | "resolved": "https://registry.npmjs.org/grunt-checktextdomain/-/grunt-checktextdomain-1.0.1.tgz", 599 | "integrity": "sha512-WX6EMOnvrhj8MDqmWJAlZRpM1rE/Mmqy9DCYYeWB1pFV+JotP6pNx2uO58+uHFOEFTcoridr4ECJ6aqGnLmgJw==", 600 | "dev": true, 601 | "dependencies": { 602 | "chalk": "~0.2.1", 603 | "text-table": "~0.2.0" 604 | }, 605 | "engines": { 606 | "node": ">= 0.8.0" 607 | }, 608 | "peerDependencies": { 609 | "grunt": ">=0.4.1" 610 | } 611 | }, 612 | "node_modules/grunt-contrib-clean": { 613 | "version": "1.0.0", 614 | "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.0.0.tgz", 615 | "integrity": "sha512-53igYwhP+AUWdIfO1R+L9r4O48FSnA5ImYPWdXUNU+YQruOpprmMb+N74P7fAZLL3w9lsFin4B234NUrWx/RrQ==", 616 | "dev": true, 617 | "dependencies": { 618 | "async": "^1.5.2", 619 | "rimraf": "^2.5.1" 620 | }, 621 | "engines": { 622 | "node": ">= 0.10.0" 623 | }, 624 | "peerDependencies": { 625 | "grunt": ">= 0.4.5" 626 | } 627 | }, 628 | "node_modules/grunt-contrib-clean/node_modules/async": { 629 | "version": "1.5.2", 630 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 631 | "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", 632 | "dev": true 633 | }, 634 | "node_modules/grunt-contrib-clean/node_modules/glob": { 635 | "version": "7.2.3", 636 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 637 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 638 | "dev": true, 639 | "dependencies": { 640 | "fs.realpath": "^1.0.0", 641 | "inflight": "^1.0.4", 642 | "inherits": "2", 643 | "minimatch": "^3.1.1", 644 | "once": "^1.3.0", 645 | "path-is-absolute": "^1.0.0" 646 | }, 647 | "engines": { 648 | "node": "*" 649 | }, 650 | "funding": { 651 | "url": "https://github.com/sponsors/isaacs" 652 | } 653 | }, 654 | "node_modules/grunt-contrib-clean/node_modules/inherits": { 655 | "version": "2.0.4", 656 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 657 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 658 | "dev": true 659 | }, 660 | "node_modules/grunt-contrib-clean/node_modules/minimatch": { 661 | "version": "3.1.2", 662 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 663 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 664 | "dev": true, 665 | "dependencies": { 666 | "brace-expansion": "^1.1.7" 667 | }, 668 | "engines": { 669 | "node": "*" 670 | } 671 | }, 672 | "node_modules/grunt-contrib-clean/node_modules/rimraf": { 673 | "version": "2.7.1", 674 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 675 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 676 | "dev": true, 677 | "dependencies": { 678 | "glob": "^7.1.3" 679 | }, 680 | "bin": { 681 | "rimraf": "bin.js" 682 | } 683 | }, 684 | "node_modules/grunt-contrib-copy": { 685 | "version": "1.0.0", 686 | "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", 687 | "integrity": "sha512-gFRFUB0ZbLcjKb67Magz1yOHGBkyU6uL29hiEW1tdQ9gQt72NuMKIy/kS6dsCbV0cZ0maNCb0s6y+uT1FKU7jA==", 688 | "dev": true, 689 | "dependencies": { 690 | "chalk": "^1.1.1", 691 | "file-sync-cmp": "^0.1.0" 692 | }, 693 | "engines": { 694 | "node": ">=0.10.0" 695 | } 696 | }, 697 | "node_modules/grunt-contrib-copy/node_modules/ansi-styles": { 698 | "version": "2.2.1", 699 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 700 | "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", 701 | "dev": true, 702 | "engines": { 703 | "node": ">=0.10.0" 704 | } 705 | }, 706 | "node_modules/grunt-contrib-copy/node_modules/chalk": { 707 | "version": "1.1.3", 708 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 709 | "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", 710 | "dev": true, 711 | "dependencies": { 712 | "ansi-styles": "^2.2.1", 713 | "escape-string-regexp": "^1.0.2", 714 | "has-ansi": "^2.0.0", 715 | "strip-ansi": "^3.0.0", 716 | "supports-color": "^2.0.0" 717 | }, 718 | "engines": { 719 | "node": ">=0.10.0" 720 | } 721 | }, 722 | "node_modules/grunt-legacy-log": { 723 | "version": "0.1.3", 724 | "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", 725 | "integrity": "sha512-qYs/uM0ImdzwIXLhS4O5WLV5soAM+PEqqHI/hzSxlo450ERSccEhnXqoeDA9ZozOdaWuYnzTOTwRcVRogleMxg==", 726 | "dev": true, 727 | "dependencies": { 728 | "colors": "~0.6.2", 729 | "grunt-legacy-log-utils": "~0.1.1", 730 | "hooker": "~0.2.3", 731 | "lodash": "~2.4.1", 732 | "underscore.string": "~2.3.3" 733 | }, 734 | "engines": { 735 | "node": ">= 0.8.0" 736 | } 737 | }, 738 | "node_modules/grunt-legacy-log-utils": { 739 | "version": "0.1.1", 740 | "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", 741 | "integrity": "sha512-D0vbUX00TFYCKNZtcZzemMpwT8TR/FdRs1pmfiBw6qnUw80PfsjV+lhIozY/3eJ3PSG2zj89wd2mH/7f4tNAlw==", 742 | "dev": true, 743 | "dependencies": { 744 | "colors": "~0.6.2", 745 | "lodash": "~2.4.1", 746 | "underscore.string": "~2.3.3" 747 | }, 748 | "engines": { 749 | "node": ">= 0.8.0" 750 | } 751 | }, 752 | "node_modules/grunt-legacy-log-utils/node_modules/lodash": { 753 | "version": "2.4.2", 754 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", 755 | "integrity": "sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==", 756 | "dev": true, 757 | "engines": [ 758 | "node", 759 | "rhino" 760 | ] 761 | }, 762 | "node_modules/grunt-legacy-log-utils/node_modules/underscore.string": { 763 | "version": "2.3.3", 764 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", 765 | "integrity": "sha512-hbD5MibthuDAu4yA5wxes5bzFgqd3PpBJuClbRxaNddxfdsz+qf+1kHwrGQFrmchmDHb9iNU+6EHDn8uj0xDJg==", 766 | "dev": true, 767 | "engines": { 768 | "node": "*" 769 | } 770 | }, 771 | "node_modules/grunt-legacy-log/node_modules/lodash": { 772 | "version": "2.4.2", 773 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", 774 | "integrity": "sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==", 775 | "dev": true, 776 | "engines": [ 777 | "node", 778 | "rhino" 779 | ] 780 | }, 781 | "node_modules/grunt-legacy-log/node_modules/underscore.string": { 782 | "version": "2.3.3", 783 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", 784 | "integrity": "sha512-hbD5MibthuDAu4yA5wxes5bzFgqd3PpBJuClbRxaNddxfdsz+qf+1kHwrGQFrmchmDHb9iNU+6EHDn8uj0xDJg==", 785 | "dev": true, 786 | "engines": { 787 | "node": "*" 788 | } 789 | }, 790 | "node_modules/grunt-legacy-util": { 791 | "version": "0.2.0", 792 | "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", 793 | "integrity": "sha512-cXPbfF8aM+pvveQeN1K872D5fRm30xfJWZiS63Y8W8oyIPLClCsmI8bW96Txqzac9cyL4lRqEBhbhJ3n5EzUUQ==", 794 | "dev": true, 795 | "dependencies": { 796 | "async": "~0.1.22", 797 | "exit": "~0.1.1", 798 | "getobject": "~0.1.0", 799 | "hooker": "~0.2.3", 800 | "lodash": "~0.9.2", 801 | "underscore.string": "~2.2.1", 802 | "which": "~1.0.5" 803 | }, 804 | "engines": { 805 | "node": ">= 0.8.0" 806 | } 807 | }, 808 | "node_modules/grunt-phpunit": { 809 | "version": "0.3.6", 810 | "resolved": "https://registry.npmjs.org/grunt-phpunit/-/grunt-phpunit-0.3.6.tgz", 811 | "integrity": "sha512-++VzrN+oS0xI9x5jv2NzmKGLirqnHumAQ0ROlrhgjyJDaLOtJq9xl4SThjeusNJ+rYYCALoti1K9k8AtOkAu4w==", 812 | "dev": true, 813 | "engines": { 814 | "node": "0.10.x" 815 | } 816 | }, 817 | "node_modules/grunt-pot": { 818 | "version": "0.2.1", 819 | "resolved": "https://registry.npmjs.org/grunt-pot/-/grunt-pot-0.2.1.tgz", 820 | "integrity": "sha512-Bauq0rrXQugAfs1ox/qE25DNfwM+V/uDQqpaUFohmVm+QZvFaH3Hva2impjM3esQqqNMD5IePXS9PHap9C+7Aw==", 821 | "dev": true, 822 | "engines": { 823 | "node": ">= 0.8.0" 824 | }, 825 | "peerDependencies": { 826 | "grunt": "~0.4.1" 827 | } 828 | }, 829 | "node_modules/grunt-release": { 830 | "version": "0.13.1", 831 | "resolved": "https://registry.npmjs.org/grunt-release/-/grunt-release-0.13.1.tgz", 832 | "integrity": "sha512-R9DCxGpt6WhIcTSR9zfXMyDkD9oTRCn9X6njd5s6QFdYEHlyoo3OIeKW6fBtg8R4z1x71JNFUtnpruw/Ogl9gA==", 833 | "dev": true, 834 | "dependencies": { 835 | "q": "^1.4.1", 836 | "semver": "^4.3.6", 837 | "shelljs": "^0.5.1", 838 | "superagent": "^1.2.0" 839 | }, 840 | "engines": { 841 | "node": ">=0.10" 842 | }, 843 | "peerDependencies": { 844 | "grunt": ">=0.4.0" 845 | } 846 | }, 847 | "node_modules/grunt-shell": { 848 | "version": "1.2.1", 849 | "resolved": "https://registry.npmjs.org/grunt-shell/-/grunt-shell-1.2.1.tgz", 850 | "integrity": "sha512-byLcxf7NfYulPgWHFkbRtD0WreSxdbV5QJPixqXQhVOl3HQmCw0W0YjXVW2FkxryKo1rZxp1xSpxGwONWIx7RQ==", 851 | "dev": true, 852 | "dependencies": { 853 | "chalk": "^1.0.0" 854 | }, 855 | "engines": { 856 | "node": ">=0.10.0" 857 | }, 858 | "peerDependencies": { 859 | "grunt": ">=0.4" 860 | } 861 | }, 862 | "node_modules/grunt-shell/node_modules/ansi-styles": { 863 | "version": "2.2.1", 864 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 865 | "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", 866 | "dev": true, 867 | "engines": { 868 | "node": ">=0.10.0" 869 | } 870 | }, 871 | "node_modules/grunt-shell/node_modules/chalk": { 872 | "version": "1.1.3", 873 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 874 | "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", 875 | "dev": true, 876 | "dependencies": { 877 | "ansi-styles": "^2.2.1", 878 | "escape-string-regexp": "^1.0.2", 879 | "has-ansi": "^2.0.0", 880 | "strip-ansi": "^3.0.0", 881 | "supports-color": "^2.0.0" 882 | }, 883 | "engines": { 884 | "node": ">=0.10.0" 885 | } 886 | }, 887 | "node_modules/grunt-text-replace": { 888 | "version": "0.4.0", 889 | "resolved": "https://registry.npmjs.org/grunt-text-replace/-/grunt-text-replace-0.4.0.tgz", 890 | "integrity": "sha512-A4dFGpOaD/TQpeOlDK/zP962X1qG7KcOqPiSXOWOIeAKMzzpoDJYZ8Sz56iazI5+kTqeTa+IaEEl5c4sk+QN+Q==", 891 | "dev": true, 892 | "engines": { 893 | "node": ">= 0.8.0" 894 | } 895 | }, 896 | "node_modules/grunt-wp-deploy": { 897 | "version": "1.1.0", 898 | "resolved": "https://registry.npmjs.org/grunt-wp-deploy/-/grunt-wp-deploy-1.1.0.tgz", 899 | "integrity": "sha512-n5rPUs9FVGeHfI+OsTSiypl8KhTGnl8lTMNMfN/XXo/bbD/s4FvpDZJY/D8zy1UVRpfmrQKgNprCo4niw6MXLw==", 900 | "dev": true, 901 | "dependencies": { 902 | "inquirer": "~0.2.1" 903 | }, 904 | "engines": { 905 | "node": ">= 0.8.0" 906 | }, 907 | "peerDependencies": { 908 | "grunt": "~0.4.1" 909 | } 910 | }, 911 | "node_modules/grunt-wp-readme-to-markdown-with-extra": { 912 | "version": "0.7.3", 913 | "resolved": "https://registry.npmjs.org/grunt-wp-readme-to-markdown-with-extra/-/grunt-wp-readme-to-markdown-with-extra-0.7.3.tgz", 914 | "integrity": "sha512-1pZ0l4y6/JIuGoSeyG3Hmzd2x06r7PfFWnpjY4Z5P1Je2xf0a0lf6GAKa05KthEo+LSdzqa5NabVjj0MPD6wDg==", 915 | "dev": true, 916 | "engines": { 917 | "node": ">= 0.8.0" 918 | }, 919 | "peerDependencies": { 920 | "grunt": "~0.4.1" 921 | } 922 | }, 923 | "node_modules/has-ansi": { 924 | "version": "2.0.0", 925 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 926 | "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", 927 | "dev": true, 928 | "dependencies": { 929 | "ansi-regex": "^2.0.0" 930 | }, 931 | "engines": { 932 | "node": ">=0.10.0" 933 | } 934 | }, 935 | "node_modules/has-color": { 936 | "version": "0.1.7", 937 | "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", 938 | "integrity": "sha512-kaNz5OTAYYmt646Hkqw50/qyxP2vFnTVu5AQ1Zmk22Kk5+4Qx6BpO8+u7IKsML5fOsFk0ZT0AcCJNYwcvaLBvw==", 939 | "dev": true, 940 | "engines": { 941 | "node": ">=0.10.0" 942 | } 943 | }, 944 | "node_modules/hooker": { 945 | "version": "0.2.3", 946 | "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", 947 | "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==", 948 | "dev": true, 949 | "engines": { 950 | "node": "*" 951 | } 952 | }, 953 | "node_modules/iconv-lite": { 954 | "version": "0.2.11", 955 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", 956 | "integrity": "sha512-KhmFWgaQZY83Cbhi+ADInoUQ8Etn6BG5fikM9syeOjQltvR45h7cRKJ/9uvQEuD61I3Uju77yYce0/LhKVClQw==", 957 | "dev": true, 958 | "engines": { 959 | "node": ">=0.4.0" 960 | } 961 | }, 962 | "node_modules/inflight": { 963 | "version": "1.0.6", 964 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 965 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 966 | "dev": true, 967 | "dependencies": { 968 | "once": "^1.3.0", 969 | "wrappy": "1" 970 | } 971 | }, 972 | "node_modules/inherits": { 973 | "version": "1.0.2", 974 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", 975 | "integrity": "sha512-Al67oatbRSo3RV5hRqIoln6Y5yMVbJSIn4jEJNL7VCImzq/kLr7vvb6sFRJXqr8rpHc/2kJOM+y0sPKN47VdzA==", 976 | "dev": true 977 | }, 978 | "node_modules/inquirer": { 979 | "version": "0.2.5", 980 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.2.5.tgz", 981 | "integrity": "sha512-AgCZjM1LcGSiFeh4d893OPTKYSpkK6v92qEO1kvj5SHqaaK1sLKFJKWkZpSwdBowNEletOKWyKd6JnhUs+qMsQ==", 982 | "dev": true, 983 | "dependencies": { 984 | "async": "~0.2.8", 985 | "cli-color": "~0.2.2", 986 | "lodash": "~1.2.1", 987 | "mute-stream": "0.0.3" 988 | } 989 | }, 990 | "node_modules/inquirer/node_modules/async": { 991 | "version": "0.2.10", 992 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", 993 | "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", 994 | "dev": true 995 | }, 996 | "node_modules/inquirer/node_modules/lodash": { 997 | "version": "1.2.1", 998 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.2.1.tgz", 999 | "integrity": "sha512-EKI82Edm8glH3FUu17sQIF+Ly1cW2ROPc0qgf1L4DBUysBlQVL+/b+WtufJw0O8FtMo7Vq9KTrzUboyWSgW/tg==", 1000 | "dev": true, 1001 | "engines": [ 1002 | "node", 1003 | "rhino" 1004 | ] 1005 | }, 1006 | "node_modules/is-buffer": { 1007 | "version": "1.1.6", 1008 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1009 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 1010 | "dev": true 1011 | }, 1012 | "node_modules/is-dotfile": { 1013 | "version": "1.0.3", 1014 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", 1015 | "integrity": "sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==", 1016 | "dev": true, 1017 | "engines": { 1018 | "node": ">=0.10.0" 1019 | } 1020 | }, 1021 | "node_modules/is-equal-shallow": { 1022 | "version": "0.1.3", 1023 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", 1024 | "integrity": "sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==", 1025 | "dev": true, 1026 | "dependencies": { 1027 | "is-primitive": "^2.0.0" 1028 | }, 1029 | "engines": { 1030 | "node": ">=0.10.0" 1031 | } 1032 | }, 1033 | "node_modules/is-extendable": { 1034 | "version": "0.1.1", 1035 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1036 | "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", 1037 | "dev": true, 1038 | "engines": { 1039 | "node": ">=0.10.0" 1040 | } 1041 | }, 1042 | "node_modules/is-extglob": { 1043 | "version": "1.0.0", 1044 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 1045 | "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", 1046 | "dev": true, 1047 | "engines": { 1048 | "node": ">=0.10.0" 1049 | } 1050 | }, 1051 | "node_modules/is-glob": { 1052 | "version": "2.0.1", 1053 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 1054 | "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", 1055 | "dev": true, 1056 | "dependencies": { 1057 | "is-extglob": "^1.0.0" 1058 | }, 1059 | "engines": { 1060 | "node": ">=0.10.0" 1061 | } 1062 | }, 1063 | "node_modules/is-number": { 1064 | "version": "2.1.0", 1065 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", 1066 | "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", 1067 | "dev": true, 1068 | "dependencies": { 1069 | "kind-of": "^3.0.2" 1070 | }, 1071 | "engines": { 1072 | "node": ">=0.10.0" 1073 | } 1074 | }, 1075 | "node_modules/is-posix-bracket": { 1076 | "version": "0.1.1", 1077 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", 1078 | "integrity": "sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==", 1079 | "dev": true, 1080 | "engines": { 1081 | "node": ">=0.10.0" 1082 | } 1083 | }, 1084 | "node_modules/is-primitive": { 1085 | "version": "2.0.0", 1086 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", 1087 | "integrity": "sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==", 1088 | "dev": true, 1089 | "engines": { 1090 | "node": ">=0.10.0" 1091 | } 1092 | }, 1093 | "node_modules/isarray": { 1094 | "version": "1.0.0", 1095 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1096 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", 1097 | "dev": true 1098 | }, 1099 | "node_modules/isobject": { 1100 | "version": "2.1.0", 1101 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 1102 | "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", 1103 | "dev": true, 1104 | "dependencies": { 1105 | "isarray": "1.0.0" 1106 | }, 1107 | "engines": { 1108 | "node": ">=0.10.0" 1109 | } 1110 | }, 1111 | "node_modules/js-yaml": { 1112 | "version": "2.0.5", 1113 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", 1114 | "integrity": "sha512-VEKcIksckDBUhg2JS874xVouiPkywVUh4yyUmLCDe1Zg3bCd6M+F1eGPenPeHLc2XC8pp9G8bsuofK0NeEqRkA==", 1115 | "dev": true, 1116 | "dependencies": { 1117 | "argparse": "~ 0.1.11", 1118 | "esprima": "~ 1.0.2" 1119 | }, 1120 | "bin": { 1121 | "js-yaml": "bin/js-yaml.js" 1122 | }, 1123 | "engines": { 1124 | "node": ">= 0.6.0" 1125 | } 1126 | }, 1127 | "node_modules/kind-of": { 1128 | "version": "3.2.2", 1129 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1130 | "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", 1131 | "dev": true, 1132 | "dependencies": { 1133 | "is-buffer": "^1.1.5" 1134 | }, 1135 | "engines": { 1136 | "node": ">=0.10.0" 1137 | } 1138 | }, 1139 | "node_modules/lodash": { 1140 | "version": "0.9.2", 1141 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", 1142 | "integrity": "sha512-LVbt/rjK62gSbhehDVKL0vlaime4Y1IBixL+bKeNfoY4L2zab/jGrxU6Ka05tMA/zBxkTk5t3ivtphdyYupczw==", 1143 | "dev": true, 1144 | "engines": [ 1145 | "node", 1146 | "rhino" 1147 | ] 1148 | }, 1149 | "node_modules/lru-cache": { 1150 | "version": "2.7.3", 1151 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", 1152 | "integrity": "sha512-WpibWJ60c3AgAz8a2iYErDrcT2C7OmKnsWhIcHOjkUHFjkXncJhtLxNSqUmxRxRunpb5I8Vprd7aNSd2NtksJQ==", 1153 | "dev": true 1154 | }, 1155 | "node_modules/matchdep": { 1156 | "version": "1.0.1", 1157 | "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-1.0.1.tgz", 1158 | "integrity": "sha512-HRR5DqKZ2Lx/QqNHSsCcS72Bn6VY1EmZt0T8j/CCWmYbfHxg7ilXPdwOV/NqE1aXQG/zElnp4UEeuFrp0vCI8Q==", 1159 | "dev": true, 1160 | "dependencies": { 1161 | "findup-sync": "~0.3.0", 1162 | "micromatch": "^2.3.7", 1163 | "resolve": "~1.1.6", 1164 | "stack-trace": "0.0.9" 1165 | }, 1166 | "engines": { 1167 | "node": ">= 0.10.0" 1168 | } 1169 | }, 1170 | "node_modules/matchdep/node_modules/findup-sync": { 1171 | "version": "0.3.0", 1172 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", 1173 | "integrity": "sha512-z8Nrwhi6wzxNMIbxlrTzuUW6KWuKkogZ/7OdDVq+0+kxn77KUH1nipx8iU6suqkHqc4y6n7a9A8IpmxY/pTjWg==", 1174 | "dev": true, 1175 | "dependencies": { 1176 | "glob": "~5.0.0" 1177 | }, 1178 | "engines": { 1179 | "node": ">= 0.6.0" 1180 | } 1181 | }, 1182 | "node_modules/matchdep/node_modules/glob": { 1183 | "version": "5.0.15", 1184 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 1185 | "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", 1186 | "dev": true, 1187 | "dependencies": { 1188 | "inflight": "^1.0.4", 1189 | "inherits": "2", 1190 | "minimatch": "2 || 3", 1191 | "once": "^1.3.0", 1192 | "path-is-absolute": "^1.0.0" 1193 | }, 1194 | "engines": { 1195 | "node": "*" 1196 | } 1197 | }, 1198 | "node_modules/matchdep/node_modules/inherits": { 1199 | "version": "2.0.4", 1200 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1201 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1202 | "dev": true 1203 | }, 1204 | "node_modules/matchdep/node_modules/minimatch": { 1205 | "version": "3.1.2", 1206 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1207 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1208 | "dev": true, 1209 | "dependencies": { 1210 | "brace-expansion": "^1.1.7" 1211 | }, 1212 | "engines": { 1213 | "node": "*" 1214 | } 1215 | }, 1216 | "node_modules/math-random": { 1217 | "version": "1.0.4", 1218 | "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", 1219 | "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", 1220 | "dev": true 1221 | }, 1222 | "node_modules/memoizee": { 1223 | "version": "0.2.6", 1224 | "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.2.6.tgz", 1225 | "integrity": "sha512-0VZI0btwyGk6FSDnJGuJtso4M/eSxhVb5ID5AZNWMFFgT2LexCV18hHI764V4ELKlyfnQ5KMQ+q5H3uvFN3MLw==", 1226 | "dev": true, 1227 | "dependencies": { 1228 | "es5-ext": "~0.9.2", 1229 | "event-emitter": "~0.2.2", 1230 | "next-tick": "0.1.x" 1231 | }, 1232 | "engines": { 1233 | "node": ">=0.4" 1234 | } 1235 | }, 1236 | "node_modules/methods": { 1237 | "version": "1.1.2", 1238 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1239 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 1240 | "dev": true, 1241 | "engines": { 1242 | "node": ">= 0.6" 1243 | } 1244 | }, 1245 | "node_modules/micromatch": { 1246 | "version": "2.3.11", 1247 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", 1248 | "integrity": "sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==", 1249 | "dev": true, 1250 | "dependencies": { 1251 | "arr-diff": "^2.0.0", 1252 | "array-unique": "^0.2.1", 1253 | "braces": "^1.8.2", 1254 | "expand-brackets": "^0.1.4", 1255 | "extglob": "^0.3.1", 1256 | "filename-regex": "^2.0.0", 1257 | "is-extglob": "^1.0.0", 1258 | "is-glob": "^2.0.1", 1259 | "kind-of": "^3.0.2", 1260 | "normalize-path": "^2.0.1", 1261 | "object.omit": "^2.0.0", 1262 | "parse-glob": "^3.0.4", 1263 | "regex-cache": "^0.4.2" 1264 | }, 1265 | "engines": { 1266 | "node": ">=0.10.0" 1267 | } 1268 | }, 1269 | "node_modules/mime": { 1270 | "version": "1.3.4", 1271 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", 1272 | "integrity": "sha512-sAaYXszED5ALBt665F0wMQCUXpGuZsGdopoqcHPdL39ZYdi7uHoZlhrfZfhv8WzivhBzr/oXwaj+yiK5wY8MXQ==", 1273 | "dev": true, 1274 | "bin": { 1275 | "mime": "cli.js" 1276 | } 1277 | }, 1278 | "node_modules/mime-db": { 1279 | "version": "1.52.0", 1280 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1281 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1282 | "dev": true, 1283 | "engines": { 1284 | "node": ">= 0.6" 1285 | } 1286 | }, 1287 | "node_modules/mime-types": { 1288 | "version": "2.1.35", 1289 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1290 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1291 | "dev": true, 1292 | "dependencies": { 1293 | "mime-db": "1.52.0" 1294 | }, 1295 | "engines": { 1296 | "node": ">= 0.6" 1297 | } 1298 | }, 1299 | "node_modules/minimatch": { 1300 | "version": "0.2.14", 1301 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", 1302 | "integrity": "sha512-zZ+Jy8lVWlvqqeM8iZB7w7KmQkoJn8djM585z88rywrEbzoqawVa9FR5p2hwD+y74nfuKOjmNvi9gtWJNLqHvA==", 1303 | "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", 1304 | "dev": true, 1305 | "dependencies": { 1306 | "lru-cache": "2", 1307 | "sigmund": "~1.0.0" 1308 | }, 1309 | "engines": { 1310 | "node": "*" 1311 | } 1312 | }, 1313 | "node_modules/moment": { 1314 | "version": "2.29.4", 1315 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", 1316 | "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", 1317 | "dev": true, 1318 | "engines": { 1319 | "node": "*" 1320 | } 1321 | }, 1322 | "node_modules/ms": { 1323 | "version": "2.0.0", 1324 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1325 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 1326 | "dev": true 1327 | }, 1328 | "node_modules/mute-stream": { 1329 | "version": "0.0.3", 1330 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.3.tgz", 1331 | "integrity": "sha512-yNRDZXxblEoO9SKEEmPB0ewZpizBJMcpujzPI0vIFesC8hyk5QpbIyjcby6804c7cVuddcNxLaYJDQN/g7sRUQ==", 1332 | "dev": true 1333 | }, 1334 | "node_modules/next-tick": { 1335 | "version": "0.1.0", 1336 | "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.1.0.tgz", 1337 | "integrity": "sha512-I44QWeGCHJTx2D3buhnljvSjmPgJua3zdPGtlCQEvA45t9kS/CaHnlVqidTzHwq8LGXhD2SMezjk4hQgP+32Lg==", 1338 | "dev": true, 1339 | "engines": { 1340 | "node": ">=0.4" 1341 | } 1342 | }, 1343 | "node_modules/nopt": { 1344 | "version": "1.0.10", 1345 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 1346 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", 1347 | "dev": true, 1348 | "dependencies": { 1349 | "abbrev": "1" 1350 | }, 1351 | "bin": { 1352 | "nopt": "bin/nopt.js" 1353 | }, 1354 | "engines": { 1355 | "node": "*" 1356 | } 1357 | }, 1358 | "node_modules/normalize-path": { 1359 | "version": "2.1.1", 1360 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 1361 | "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", 1362 | "dev": true, 1363 | "dependencies": { 1364 | "remove-trailing-separator": "^1.0.1" 1365 | }, 1366 | "engines": { 1367 | "node": ">=0.10.0" 1368 | } 1369 | }, 1370 | "node_modules/object.omit": { 1371 | "version": "2.0.1", 1372 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", 1373 | "integrity": "sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==", 1374 | "dev": true, 1375 | "dependencies": { 1376 | "for-own": "^0.1.4", 1377 | "is-extendable": "^0.1.1" 1378 | }, 1379 | "engines": { 1380 | "node": ">=0.10.0" 1381 | } 1382 | }, 1383 | "node_modules/once": { 1384 | "version": "1.4.0", 1385 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1386 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1387 | "dev": true, 1388 | "dependencies": { 1389 | "wrappy": "1" 1390 | } 1391 | }, 1392 | "node_modules/parse-glob": { 1393 | "version": "3.0.4", 1394 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", 1395 | "integrity": "sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==", 1396 | "dev": true, 1397 | "dependencies": { 1398 | "glob-base": "^0.3.0", 1399 | "is-dotfile": "^1.0.0", 1400 | "is-extglob": "^1.0.0", 1401 | "is-glob": "^2.0.0" 1402 | }, 1403 | "engines": { 1404 | "node": ">=0.10.0" 1405 | } 1406 | }, 1407 | "node_modules/path-is-absolute": { 1408 | "version": "1.0.1", 1409 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1410 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1411 | "dev": true, 1412 | "engines": { 1413 | "node": ">=0.10.0" 1414 | } 1415 | }, 1416 | "node_modules/preserve": { 1417 | "version": "0.2.0", 1418 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", 1419 | "integrity": "sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==", 1420 | "dev": true, 1421 | "engines": { 1422 | "node": ">=0.10.0" 1423 | } 1424 | }, 1425 | "node_modules/q": { 1426 | "version": "1.5.1", 1427 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 1428 | "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", 1429 | "dev": true, 1430 | "engines": { 1431 | "node": ">=0.6.0", 1432 | "teleport": ">=0.2.0" 1433 | } 1434 | }, 1435 | "node_modules/qs": { 1436 | "version": "2.3.3", 1437 | "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz", 1438 | "integrity": "sha512-f5M0HQqZWkzU8GELTY8LyMrGkr3bPjKoFtTkwUEqJQbcljbeK8M7mliP9Ia2xoOI6oMerp+QPS7oYJtpGmWe/A==", 1439 | "dev": true 1440 | }, 1441 | "node_modules/randomatic": { 1442 | "version": "3.1.1", 1443 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", 1444 | "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", 1445 | "dev": true, 1446 | "dependencies": { 1447 | "is-number": "^4.0.0", 1448 | "kind-of": "^6.0.0", 1449 | "math-random": "^1.0.1" 1450 | }, 1451 | "engines": { 1452 | "node": ">= 0.10.0" 1453 | } 1454 | }, 1455 | "node_modules/randomatic/node_modules/is-number": { 1456 | "version": "4.0.0", 1457 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", 1458 | "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", 1459 | "dev": true, 1460 | "engines": { 1461 | "node": ">=0.10.0" 1462 | } 1463 | }, 1464 | "node_modules/randomatic/node_modules/kind-of": { 1465 | "version": "6.0.3", 1466 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 1467 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", 1468 | "dev": true, 1469 | "engines": { 1470 | "node": ">=0.10.0" 1471 | } 1472 | }, 1473 | "node_modules/readable-stream": { 1474 | "version": "1.0.27-1", 1475 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.27-1.tgz", 1476 | "integrity": "sha512-uQE31HGhpMrqZwtDjRliOs2aC3XBi+DdkhLs+Xa0dvVD5eDiZr3+k8rKVZcyTzxosgtMw7B/twQsK3P1KTZeVg==", 1477 | "dev": true, 1478 | "dependencies": { 1479 | "core-util-is": "~1.0.0", 1480 | "inherits": "~2.0.1", 1481 | "isarray": "0.0.1", 1482 | "string_decoder": "~0.10.x" 1483 | } 1484 | }, 1485 | "node_modules/readable-stream/node_modules/inherits": { 1486 | "version": "2.0.4", 1487 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1488 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1489 | "dev": true 1490 | }, 1491 | "node_modules/readable-stream/node_modules/isarray": { 1492 | "version": "0.0.1", 1493 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 1494 | "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", 1495 | "dev": true 1496 | }, 1497 | "node_modules/reduce-component": { 1498 | "version": "1.0.1", 1499 | "resolved": "https://registry.npmjs.org/reduce-component/-/reduce-component-1.0.1.tgz", 1500 | "integrity": "sha512-y0wyCcdQul3hI3xHfIs0vg/jSbboQc/YTOAqaxjFG7At+XSexduuOqBVL9SmOLSwa/ldkbzVzdwuk9s2EKTAZg==", 1501 | "dev": true 1502 | }, 1503 | "node_modules/regex-cache": { 1504 | "version": "0.4.4", 1505 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", 1506 | "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", 1507 | "dev": true, 1508 | "dependencies": { 1509 | "is-equal-shallow": "^0.1.3" 1510 | }, 1511 | "engines": { 1512 | "node": ">=0.10.0" 1513 | } 1514 | }, 1515 | "node_modules/remove-trailing-separator": { 1516 | "version": "1.1.0", 1517 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 1518 | "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", 1519 | "dev": true 1520 | }, 1521 | "node_modules/repeat-element": { 1522 | "version": "1.1.4", 1523 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", 1524 | "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", 1525 | "dev": true, 1526 | "engines": { 1527 | "node": ">=0.10.0" 1528 | } 1529 | }, 1530 | "node_modules/repeat-string": { 1531 | "version": "1.6.1", 1532 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 1533 | "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", 1534 | "dev": true, 1535 | "engines": { 1536 | "node": ">=0.10" 1537 | } 1538 | }, 1539 | "node_modules/resolve": { 1540 | "version": "1.1.7", 1541 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 1542 | "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", 1543 | "dev": true 1544 | }, 1545 | "node_modules/rimraf": { 1546 | "version": "2.2.8", 1547 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", 1548 | "integrity": "sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg==", 1549 | "dev": true, 1550 | "bin": { 1551 | "rimraf": "bin.js" 1552 | } 1553 | }, 1554 | "node_modules/semver": { 1555 | "version": "4.3.6", 1556 | "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", 1557 | "integrity": "sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==", 1558 | "dev": true, 1559 | "bin": { 1560 | "semver": "bin/semver" 1561 | } 1562 | }, 1563 | "node_modules/shelljs": { 1564 | "version": "0.5.3", 1565 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.5.3.tgz", 1566 | "integrity": "sha512-C2FisSSW8S6TIYHHiMHN0NqzdjWfTekdMpA2FJTbRWnQMLO1RRIXEB9eVZYOlofYmjZA7fY3ChoFu09MeI3wlQ==", 1567 | "dev": true, 1568 | "bin": { 1569 | "shjs": "bin/shjs" 1570 | }, 1571 | "engines": { 1572 | "node": ">=0.8.0" 1573 | } 1574 | }, 1575 | "node_modules/sigmund": { 1576 | "version": "1.0.1", 1577 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", 1578 | "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==", 1579 | "dev": true 1580 | }, 1581 | "node_modules/stack-trace": { 1582 | "version": "0.0.9", 1583 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", 1584 | "integrity": "sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ==", 1585 | "dev": true, 1586 | "engines": { 1587 | "node": "*" 1588 | } 1589 | }, 1590 | "node_modules/string_decoder": { 1591 | "version": "0.10.31", 1592 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1593 | "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", 1594 | "dev": true 1595 | }, 1596 | "node_modules/strip-ansi": { 1597 | "version": "3.0.1", 1598 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1599 | "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", 1600 | "dev": true, 1601 | "dependencies": { 1602 | "ansi-regex": "^2.0.0" 1603 | }, 1604 | "engines": { 1605 | "node": ">=0.10.0" 1606 | } 1607 | }, 1608 | "node_modules/superagent": { 1609 | "version": "1.8.5", 1610 | "resolved": "https://registry.npmjs.org/superagent/-/superagent-1.8.5.tgz", 1611 | "integrity": "sha512-4h4R6fISQXvgjIqZ8DjONYy3y2XPxgZO0LgHsBI6tDAEhzJLpWuK+thM60SmUiERJOEJzmxlIGx/GP6+azky/A==", 1612 | "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", 1613 | "dev": true, 1614 | "dependencies": { 1615 | "component-emitter": "~1.2.0", 1616 | "cookiejar": "2.0.6", 1617 | "debug": "2", 1618 | "extend": "3.0.0", 1619 | "form-data": "1.0.0-rc3", 1620 | "formidable": "~1.0.14", 1621 | "methods": "~1.1.1", 1622 | "mime": "1.3.4", 1623 | "qs": "2.3.3", 1624 | "readable-stream": "1.0.27-1", 1625 | "reduce-component": "1.0.1" 1626 | }, 1627 | "engines": { 1628 | "node": ">= 0.8" 1629 | } 1630 | }, 1631 | "node_modules/supports-color": { 1632 | "version": "2.0.0", 1633 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1634 | "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", 1635 | "dev": true, 1636 | "engines": { 1637 | "node": ">=0.8.0" 1638 | } 1639 | }, 1640 | "node_modules/text-table": { 1641 | "version": "0.2.0", 1642 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1643 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 1644 | "dev": true 1645 | }, 1646 | "node_modules/underscore": { 1647 | "version": "1.7.0", 1648 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", 1649 | "integrity": "sha512-cp0oQQyZhUM1kpJDLdGO1jPZHgS/MpzoWYfe9+CM2h/QGDZlqwT2T3YGukuBdaNJ/CAPoeyAZRRHz8JFo176vA==", 1650 | "dev": true 1651 | }, 1652 | "node_modules/underscore.string": { 1653 | "version": "2.2.1", 1654 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", 1655 | "integrity": "sha512-3FVmhXqelrj6gfgp3Bn6tOavJvW0dNH2T+heTD38JRxIrAbiuzbqjknszoOYj3DyFB1nWiLj208Qt2no/L4cIA==", 1656 | "dev": true, 1657 | "engines": { 1658 | "node": "*" 1659 | } 1660 | }, 1661 | "node_modules/which": { 1662 | "version": "1.0.9", 1663 | "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", 1664 | "integrity": "sha512-E87fdQ/eRJr9W1X4wTPejNy9zTW3FI2vpCZSJ/HAY+TkjKVC0TUm1jk6vn2Z7qay0DQy0+RBGdXxj+RmmiGZKQ==", 1665 | "dev": true, 1666 | "bin": { 1667 | "which": "bin/which" 1668 | } 1669 | }, 1670 | "node_modules/wrappy": { 1671 | "version": "1.0.2", 1672 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1673 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1674 | "dev": true 1675 | } 1676 | } 1677 | } 1678 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Linker", 3 | "slug": "linker", 4 | "homepage": "http://pojo.me/", 5 | "description": "Manage, create and track outbound links by custom pretty links with your domain.", 6 | "version": "1.3.0", 7 | "devDependencies": { 8 | "grunt": "~0.4.5", 9 | "grunt-checktextdomain": "~1.0.0", 10 | "grunt-pot": "~0.2.1", 11 | "grunt-wp-readme-to-markdown-with-extra": "~0.7.3", 12 | "grunt-phpunit": "~0.3.6", 13 | "grunt-bumpup": "~0.6.3", 14 | "grunt-shell": "~1.2.1", 15 | "grunt-text-replace": "~0.4.0", 16 | "grunt-release": "~0.13.0", 17 | "grunt-contrib-copy": "~1.0.0", 18 | "grunt-contrib-clean": "~1.0.0", 19 | "grunt-wp-deploy": "~1.1.0", 20 | "matchdep": "~1.0.1" 21 | } 22 | } -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | ./tests/ 16 | 17 | 18 | 19 | 20 | 21 | ./ 22 | 23 | tests 24 | vendor 25 | node_modules 26 | language 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /readme.txt: -------------------------------------------------------------------------------- 1 | === Linker - URL shortener & track outbound link clicks === 2 | Contributors: elemntor, KingYes, ariel.k 3 | Tags: 301, click tracking, redirect, shortlinks, link shortener, 4 | Requires at least: 6.0 5 | Requires PHP: 7.0 6 | Tested up to: 6.7 7 | Stable tag: 1.3.0 8 | License: GPLv2 or later 9 | 10 | Track Outbound Link Clicks Easily: Shorten & track your site links by using your own domain name. e.g. "your-domain.com/go/link" 11 | 12 | == Description == 13 | 14 | Manage, create and track outbound links by custom pretty links with your domain. 15 | 16 | Through Linker's short url tool you can know on which links your visitors are clicking. Linker is the easiest tool to use in order to create a short link in your own domain & track outbound link clicks from your website, using software like Google Analytics. 17 | Create short links to your post, manage your 301 redirects, track affiliate links and do many other URL related tasks easily. 18 | 19 |

Major Features

20 | * Create Short and clean URLs, using your own domain 21 | * Redirect links to any location, both inbound and outbound, using 301 redirects 22 | * Track outbound link clicks, with internal reporting for Hits per link 23 | * Enjoy an intuitive and User Friendly Admin Interface 24 | * Setup tracking easily using Linker's out of the box functionality 25 | * Set URL Parameters forwarding for improved tracking on every redirection 26 | 27 |

How it Works?

28 | Linker adds a new custom post type to your Admin menu, where you can create, edit, delete, and manage Links by 301 redirects. What's great about Linker is that it tracks click counts and saves them as a custom field. it's really simple & cool and there is no setup involved. It works seamlessly straight out of the box for whichever theme and plugins you are using. 29 | 30 | Link Example: Just to make it extra clear, here's how the Linker plugin works. 31 | 32 | * Original URL: https://wordpress.org/plugins/linker/ 33 | * New URL with Linker: https://pojo.me/go/linker/ 34 | 35 |

Contributions:

36 | Would you like to contribute to this plugin? You’re more than welcome to submit your pull requests on the [GitHub repo](https://github.com/pojome/wp-linker). And, if you have any notes about the code, please open a ticket on the issue tracker. 37 | 38 | == Installation == 39 | 40 | 1. Upload plugin files to your plugins folder, or install using WordPress' built-in Add New Plugin installer 41 | 1. Activate the plugin 42 | 1. Navigate to Settings > Permalinks and save them. Yes, just click Save Changes 43 | 1. Go to the Linker menu under the pages 44 | 1. Create a new link and publish 45 | 1. Now you can track how many times clicked on each link 46 | 47 | == Screenshots == 48 | 49 | 1. All Links 50 | 2. New Link 51 | 52 | == Frequently Asked Questions == 53 | 54 | = Can I change the Link structure other than /go/ ? = 55 | * Sure. Just use with `linker_prefix_slug` filter. 56 | 57 | = Requirements = 58 | * __Requires PHP 7.0__ for list management functionality. 59 | 60 | = What is the plugin license? = 61 | 62 | * This plugin is released under a GPL license. 63 | 64 | 65 | == Changelog == 66 | 67 | = 1.3.0 = 68 | * New: Introducing URL Parameters forwarding for improved tracking on every redirection 69 | 70 | = 1.2.2 = 71 | * Security Fix: Add escaping data in the admin area 72 | 73 | = 1.2.1 = 74 | * Tweak! - Adjust format number 75 | * Tweak! - Added support for other CPT view 76 | 77 | = 1.2.0 = 78 | * New! - Added filter to manage the cpt slug for linker 79 | 80 | = 1.1.3 = 81 | * Tweak! - Exclude links from search 82 | 83 | = 1.1.2 = 84 | * Tested up to WordPress v4.4.2 85 | 86 | = 1.1.1 = 87 | * Added translate: Indonesian (id_ID) Thanks to YiiBooster ([#20](https://github.com/KingYes/wp-linker/pull/20)) 88 | 89 | = 1.1.0 = 90 | * Added filter by Author ([#16](https://github.com/KingYes/wp-linker/pull/16)) 91 | * Added readonly field for Copy-Paste linker 92 | * Updated Dashboard Output 93 | * Dashboard info and CSS external file 94 | * Tested up to WordPress v4.3 95 | 96 | = 1.0.7 = 97 | * Tweak! - Exclude links from search 98 | 99 | = 1.0.6 = 100 | * Added Dashboard Widget and Orderby clicks ([#13](https://github.com/KingYes/wp-linker/pull/13)). 101 | 102 | = 1.0.5 = 103 | * Added translate: Brazilian Portuguese (pt_BR) Thanks to Rhenan Cardozo 104 | * Tested up to WordPress v4.2.2 105 | 106 | = 1.0.4 = 107 | * The plugin flush the permalinks automation. 108 | * Tested up to WordPress v4.2 109 | 110 | = 1.0.3 = 111 | * Tested up to WordPress v4.1 112 | 113 | = 1.0.2 = 114 | * Tested up to WordPress v4.0 115 | 116 | = 1.0.1 = 117 | * Added translate: Hebrew (he_IL) - Thanks to [Pojo.me](http://pojo.me/) 118 | 119 | = 1.0.0 = 120 | * Blastoff! 121 | -------------------------------------------------------------------------------- /screenshot-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pojome/wp-linker/69273c42e5d0edf85bfdfa4760e325a6e2682f65/screenshot-1.jpg -------------------------------------------------------------------------------- /screenshot-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pojome/wp-linker/69273c42e5d0edf85bfdfa4760e325a6e2682f65/screenshot-2.jpg -------------------------------------------------------------------------------- /tests/bootstrap.php: -------------------------------------------------------------------------------- 1 | array( PLUGIN_PATH ), 18 | ); 19 | 20 | require_once $_tests_dir . '/includes/functions.php'; 21 | 22 | tests_add_filter( 23 | 'muplugins_loaded', 24 | function() { 25 | // Manually load plugin 26 | require dirname( __DIR__ ) . '/' . PLUGIN_FILE; 27 | } 28 | ); 29 | 30 | // Removes all sql tables on shutdown 31 | // Do this action last 32 | tests_add_filter( 'shutdown', 'drop_tables', 999999 ); 33 | 34 | require $_tests_dir . '/includes/bootstrap.php'; -------------------------------------------------------------------------------- /tests/test-base.php: -------------------------------------------------------------------------------- 1 | assertInstanceOf( 'Linker_Main', Linker_Main::instance() ); 16 | } 17 | 18 | /** 19 | * @expectedIncorrectUsage __clone 20 | */ 21 | public function test_Clone() { 22 | $obj_cloned = clone Linker_Main::instance(); 23 | } 24 | 25 | /** 26 | * @expectedIncorrectUsage __wakeup 27 | */ 28 | public function test_Wakeup() { 29 | unserialize( serialize( Linker_Main::instance() ) ); 30 | } 31 | } --------------------------------------------------------------------------------