├── .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 | [](https://travis-ci.org/KingYes/wp-linker) [](https://david-dm.org/KingYes/wp-linker#info=devDependencies) [](https://wordpress.org/plugins/linker/) [](https://wordpress.org/plugins/linker/) [](https://wordpress.org/plugins/linker/) [](https://wordpress.org/plugins/linker/) [](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 | 
67 |
68 | ### 2. New Link ###
69 | 
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( '{label}
', 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( '%s ', $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( '{label}
{options_html}
{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 | }
--------------------------------------------------------------------------------