ACF Content Analysis for Yoast SEO - Version 2.1.0

Version Description

Released July 10th, 2018

Bugfixes: * Fixes a bug where attempting to get the ACF version, wouldn't always be reliable. This would lead the plugin to think that a newer version was installed than what was actually present. * Fixes potential conflicts with other plugins due to generic variable naming. * Fixes a bug where the YoastSEO ACF Content analysis would attempted to be loaded, although it wasn't available.

Other: * Adds filter examples to the readme.

Download this release

Release Info

Developer Yoast
Plugin Icon 128x128 ACF Content Analysis for Yoast SEO
Version 2.1.0
Comparing to
See all releases

Code changes from version 2.0.1 to 2.1.0

Files changed (69) hide show
  1. .eslintrc +12 -0
  2. inc/{class-ac-yoast-acf-content-analysis.php → ac-yoast-seo-acf-content-analysis.php} +14 -17
  3. inc/{class-yoast-acf-analysis-assets.php → assets.php} +15 -3
  4. inc/configuration/{class-yoast-acf-analysis-configuration.php → configuration.php} +29 -5
  5. inc/configuration/{class-yoast-acf-analysis-string-store.php → string-store.php} +10 -1
  6. inc/dependencies/{class-yoast-acf-analysis-dependency-afc.php → dependency-acf.php} +8 -0
  7. inc/dependencies/{interface-yoast-acf-analysis-depencency.php → dependency-interface.php} +8 -0
  8. inc/dependencies/{class-yoast-acf-analysis-dependency-yoast-seo.php → dependency-yoast-seo.php} +8 -0
  9. inc/{class-yoast-acf-analysis-facade.php → facade.php} +7 -3
  10. inc/{class-yoast-acf-analysis-registry.php → registry.php} +9 -0
  11. inc/{class-yoast-acf-analysis-requirements.php → requirements.php} +10 -2
  12. js/src/app.js +64 -63
  13. js/src/cache/cache.attachments.js +33 -36
  14. js/src/cache/cache.js +28 -34
  15. js/src/collect/collect-v4.js +14 -14
  16. js/src/collect/collect-v5.js +54 -66
  17. js/src/collect/collect.js +47 -56
  18. js/src/config/config.js +2 -1
  19. js/src/helper.js +2 -2
  20. js/src/main.js +9 -14
  21. js/src/replacevars.js +39 -40
  22. js/src/scraper-store.js +65 -62
  23. js/src/scraper/scraper.email.js +11 -16
  24. js/src/scraper/scraper.gallery.js +25 -33
  25. js/src/scraper/scraper.image.js +20 -26
  26. js/src/scraper/scraper.link.js +33 -0
  27. js/src/scraper/scraper.taxonomy.js +49 -61
  28. js/src/scraper/scraper.text.js +33 -41
  29. js/src/scraper/scraper.textarea.js +11 -16
  30. js/src/scraper/scraper.url.js +11 -16
  31. js/src/scraper/scraper.wysiwyg.js +41 -46
  32. js/yoast-acf-analysis.js +582 -617
  33. license.txt +22 -1
  34. package-lock.json +0 -3407
  35. readme.txt +45 -4
  36. renovate.json +12 -0
  37. ruleset.xml +0 -23
  38. tests/js/system/data/acf4.php +8 -0
  39. tests/js/system/data/acf5.php +25 -1
  40. tests/js/system/data/test-data-loader-functions.php +32 -0
  41. tests/js/system/nightwatch.conf.example.js +2 -2
  42. tests/js/system/nightwatch.json +1 -1
  43. tests/js/system/pages/WordPressHelper.js +3 -1
  44. tests/js/system/tests/acf5/content-pro.js +33 -0
  45. tests/js/system/tests/acf5/relational.js +4 -4
  46. tests/js/system/tests/general/basic.js +2 -1
  47. tests/js/system/tests/general/filters.js +2 -2
  48. tests/php/unit/Configuration/StringStoreTest.php +0 -118
  49. tests/php/unit/Configuration/{ConfigurationTest.php → configuration-test.php} +34 -20
  50. tests/php/unit/Configuration/string-store-test.php +117 -0
  51. tests/php/unit/Dependencies/ACFClass.php +0 -5
  52. tests/php/unit/Dependencies/{ACFDependencyTest.php → acf-dependency-test.php} +13 -7
  53. tests/php/unit/Dependencies/acf.php +13 -0
  54. tests/php/unit/Dependencies/{YoastSEODependencyTest.php → yoast-seo-dependency-test.php} +13 -7
  55. tests/php/unit/Doubles/failing-dependency.php +22 -0
  56. tests/php/unit/Doubles/passing-dependency.php +22 -0
  57. tests/php/unit/RequirementsTest.php +0 -90
  58. tests/php/unit/{AssetsTest.php → assets-test.php} +13 -7
  59. tests/php/unit/{MainTest.php → main-test.php} +13 -15
  60. tests/php/unit/{RegistryTest.php → registry-test.php} +13 -10
  61. tests/php/unit/requirements-test.php +58 -0
  62. vendor/autoload.php +1 -1
  63. vendor/autoload_52.php +1 -1
  64. vendor/composer/ClassLoader.php +2 -2
  65. vendor/composer/autoload_classmap.php +10 -10
  66. vendor/composer/autoload_real.php +4 -4
  67. vendor/composer/autoload_real_52.php +3 -3
  68. vendor/composer/autoload_static.php +143 -0
  69. yoast-acf-analysis.php +41 -32
.eslintrc ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ extends: yoast
2
+
3
+ rules:
4
+ complexity: [1, 6]
5
+ camelcase: 1
6
+ brace-style: 2
7
+ max-len: 1
8
+ max-statements: 1
9
+ valid-jsdoc: 2
10
+ global-require: 1
11
+ strict: 1
12
+ keyword-spacing: 2
inc/{class-ac-yoast-acf-content-analysis.php → ac-yoast-seo-acf-content-analysis.php} RENAMED
@@ -1,8 +1,11 @@
1
  <?php
2
-
3
  /**
4
- * Class Yoast_ACF_Analysis
5
  *
 
 
 
 
6
  * Adds ACF data to the content analyses of WordPress SEO.
7
  */
8
  class AC_Yoast_SEO_ACF_Content_Analysis {
@@ -30,10 +33,6 @@ class AC_Yoast_SEO_ACF_Content_Analysis {
30
 
31
  $this->boot();
32
 
33
- if ( defined( 'AC_YOAST_ACF_ANALYSIS_ENVIRONMENT' ) && 'development' === AC_YOAST_ACF_ANALYSIS_ENVIRONMENT ) {
34
- $this->boot_dev();
35
- }
36
-
37
  $this->register_config_filters();
38
 
39
  $assets = new Yoast_ACF_Analysis_Assets();
@@ -78,21 +77,13 @@ class AC_Yoast_SEO_ACF_Content_Analysis {
78
  $registry->add( 'config', $configuration );
79
  }
80
 
81
- /**
82
- * Boots the plugin for dev environment.
83
- */
84
- public function boot_dev() {
85
- $version = ( -1 === version_compare( get_option( 'acf_version' ), 5 ) ) ? '4' : '5';
86
- require_once AC_SEO_ACF_ANALYSIS_PLUGIN_PATH . '/tests/js/system/data/acf' . $version . '.php';
87
- }
88
-
89
  /**
90
  * Filters the Scraper Configuration to add the headlines configuration for the text scraper.
91
  */
92
  protected function register_config_filters() {
93
  add_filter(
94
  Yoast_ACF_Analysis_Facade::get_filter_name( 'scraper_config' ),
95
- array( $this, 'filter_scraper_config')
96
  );
97
  }
98
 
@@ -207,8 +198,14 @@ class AC_Yoast_SEO_ACF_Content_Analysis {
207
  $blacklist->add( $type );
208
  }
209
 
210
- if ( -1 === version_compare( get_option( 'acf_version' ), 5 ) ) {
211
- // It is not worth supporting the Pro Addons to v4, as Pro users can just switch to v5.
 
 
 
 
 
 
212
  $blacklist->remove( 'gallery' );
213
  $blacklist->remove( 'repeater' );
214
  $blacklist->remove( 'flexible_content' );
1
  <?php
 
2
  /**
3
+ * ACF Content Analysis for Yoast SEO plugin file.
4
  *
5
+ * @package YoastACFAnalysis
6
+ */
7
+
8
+ /**
9
  * Adds ACF data to the content analyses of WordPress SEO.
10
  */
11
  class AC_Yoast_SEO_ACF_Content_Analysis {
33
 
34
  $this->boot();
35
 
 
 
 
 
36
  $this->register_config_filters();
37
 
38
  $assets = new Yoast_ACF_Analysis_Assets();
77
  $registry->add( 'config', $configuration );
78
  }
79
 
 
 
 
 
 
 
 
 
80
  /**
81
  * Filters the Scraper Configuration to add the headlines configuration for the text scraper.
82
  */
83
  protected function register_config_filters() {
84
  add_filter(
85
  Yoast_ACF_Analysis_Facade::get_filter_name( 'scraper_config' ),
86
+ array( $this, 'filter_scraper_config' )
87
  );
88
  }
89
 
198
  $blacklist->add( $type );
199
  }
200
 
201
+ /**
202
+ * Disable Pro fields for anything but ACF 5 pro.
203
+ *
204
+ * - It is not worth supporting the Pro Addons to v4, as Pro users can just switch to v5.
205
+ * - ACF v5 FREE on the other hand does not support these fields either.
206
+ */
207
+ if ( ! defined( 'ACF_PRO' ) || ! ACF_PRO ) {
208
+
209
  $blacklist->remove( 'gallery' );
210
  $blacklist->remove( 'repeater' );
211
  $blacklist->remove( 'flexible_content' );
inc/{class-yoast-acf-analysis-assets.php → assets.php} RENAMED
@@ -1,12 +1,20 @@
1
  <?php
2
-
 
 
 
 
3
 
4
  /**
5
  * Class Yoast_ACF_Analysis_Frontend
6
  */
7
  class Yoast_ACF_Analysis_Assets {
8
 
9
- /** @var array Plugin information. */
 
 
 
 
10
  protected $plugin_data;
11
 
12
  /**
@@ -24,7 +32,11 @@ class Yoast_ACF_Analysis_Assets {
24
  public function enqueue_scripts() {
25
  global $pagenow;
26
 
27
- /* @var $config Yoast_ACF_Analysis_Configuration */
 
 
 
 
28
  $config = Yoast_ACF_Analysis_Facade::get_registry()->get( 'config' );
29
 
30
  // Post page enqueue.
1
  <?php
2
+ /**
3
+ * ACF Content Analysis for Yoast SEO plugin file.
4
+ *
5
+ * @package YoastACFAnalysis
6
+ */
7
 
8
  /**
9
  * Class Yoast_ACF_Analysis_Frontend
10
  */
11
  class Yoast_ACF_Analysis_Assets {
12
 
13
+ /**
14
+ * Plugin information.
15
+ *
16
+ * @var array
17
+ */
18
  protected $plugin_data;
19
 
20
  /**
32
  public function enqueue_scripts() {
33
  global $pagenow;
34
 
35
+ /**
36
+ * Yoast ACF plugin configuration.
37
+ *
38
+ * @var \Yoast_ACF_Analysis_Configuration
39
+ */
40
  $config = Yoast_ACF_Analysis_Facade::get_registry()->get( 'config' );
41
 
42
  // Post page enqueue.
inc/configuration/{class-yoast-acf-analysis-configuration.php → configuration.php} RENAMED
@@ -1,5 +1,9 @@
1
  <?php
2
-
 
 
 
 
3
 
4
  /**
5
  * Class Yoast_ACF_Analysis_Configuration_Default
@@ -21,13 +25,23 @@ class Yoast_ACF_Analysis_Configuration {
21
  */
22
  protected $field_selectors;
23
 
24
- /** @var int Refresh rate to use */
 
 
 
 
25
  protected $refresh_rate = 1000;
26
 
27
- /** @var array Scraper configuration */
 
 
 
 
28
  protected $scraper_config = array();
29
 
30
  /**
 
 
31
  * @param Yoast_ACF_Analysis_String_Store $blacklist_type Blacklist Type Configuration Object.
32
  * @param Yoast_ACF_Analysis_String_Store $blacklist_name Blacklist Name Configuration Object.
33
  * @param Yoast_ACF_Analysis_String_Store $field_selectors Field Selectors Configuration Object.
@@ -48,7 +62,13 @@ class Yoast_ACF_Analysis_Configuration {
48
  * @return string The ACF version.
49
  */
50
  public function get_acf_version() {
51
- return get_option( 'acf_version' );
 
 
 
 
 
 
52
  }
53
 
54
  /**
@@ -131,7 +151,9 @@ class Yoast_ACF_Analysis_Configuration {
131
  }
132
 
133
  /**
134
- * @return bool
 
 
135
  */
136
  public function is_debug() {
137
  return ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG === true );
@@ -222,6 +244,8 @@ class Yoast_ACF_Analysis_Configuration {
222
  }
223
 
224
  /**
 
 
225
  * @return array
226
  */
227
  public function to_array() {
1
  <?php
2
+ /**
3
+ * ACF Content Analysis for Yoast SEO plugin file.
4
+ *
5
+ * @package YoastACFAnalysis
6
+ */
7
 
8
  /**
9
  * Class Yoast_ACF_Analysis_Configuration_Default
25
  */
26
  protected $field_selectors;
27
 
28
+ /**
29
+ * Refresh rate to use.
30
+ *
31
+ * @var int
32
+ */
33
  protected $refresh_rate = 1000;
34
 
35
+ /**
36
+ * Scraper configuration.
37
+ *
38
+ * @var array
39
+ */
40
  protected $scraper_config = array();
41
 
42
  /**
43
+ * Yoast_ACF_Analysis_Configuration constructor.
44
+ *
45
  * @param Yoast_ACF_Analysis_String_Store $blacklist_type Blacklist Type Configuration Object.
46
  * @param Yoast_ACF_Analysis_String_Store $blacklist_name Blacklist Name Configuration Object.
47
  * @param Yoast_ACF_Analysis_String_Store $field_selectors Field Selectors Configuration Object.
62
  * @return string The ACF version.
63
  */
64
  public function get_acf_version() {
65
+ // ACF 5 introduces `acf_get_setting`, so this might not always be available.
66
+ if ( function_exists( 'acf_get_setting' ) ) {
67
+ return acf_get_setting( 'version' );
68
+ }
69
+
70
+ // Fall back on filter use.
71
+ return apply_filters( 'acf/get_info', 'version' );
72
  }
73
 
74
  /**
151
  }
152
 
153
  /**
154
+ * Determines if debug mode is enabled.
155
+ *
156
+ * @return bool True if debug mode is enabled. False otherwise.
157
  */
158
  public function is_debug() {
159
  return ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG === true );
244
  }
245
 
246
  /**
247
+ * Retrieves an array representation of the current object.
248
+ *
249
  * @return array
250
  */
251
  public function to_array() {
inc/configuration/{class-yoast-acf-analysis-string-store.php → string-store.php} RENAMED
@@ -1,4 +1,9 @@
1
  <?php
 
 
 
 
 
2
 
3
  /**
4
  * Class Yoast_ACF_Analysis_String_Store
@@ -7,7 +12,11 @@
7
  */
8
  class Yoast_ACF_Analysis_String_Store {
9
 
10
- /** @var array List of stored items. */
 
 
 
 
11
  protected $items = array();
12
 
13
  /**
1
  <?php
2
+ /**
3
+ * ACF Content Analysis for Yoast SEO plugin file.
4
+ *
5
+ * @package YoastACFAnalysis
6
+ */
7
 
8
  /**
9
  * Class Yoast_ACF_Analysis_String_Store
12
  */
13
  class Yoast_ACF_Analysis_String_Store {
14
 
15
+ /**
16
+ * List of stored items.
17
+ *
18
+ * @var array
19
+ */
20
  protected $items = array();
21
 
22
  /**
inc/dependencies/{class-yoast-acf-analysis-dependency-afc.php → dependency-acf.php} RENAMED
@@ -1,5 +1,13 @@
1
  <?php
 
 
 
 
 
2
 
 
 
 
3
  final class Yoast_ACF_Analysis_Dependency_ACF implements Yoast_ACF_Analysis_Dependency {
4
 
5
  /**
1
  <?php
2
+ /**
3
+ * ACF Content Analysis for Yoast SEO plugin file.
4
+ *
5
+ * @package YoastACFAnalysis
6
+ */
7
 
8
+ /**
9
+ * Checks wether ACF is installed.
10
+ */
11
  final class Yoast_ACF_Analysis_Dependency_ACF implements Yoast_ACF_Analysis_Dependency {
12
 
13
  /**
inc/dependencies/{interface-yoast-acf-analysis-depencency.php → dependency-interface.php} RENAMED
@@ -1,5 +1,13 @@
1
  <?php
 
 
 
 
 
2
 
 
 
 
3
  interface Yoast_ACF_Analysis_Dependency {
4
  /**
5
  * Checks if this dependency is met.
1
  <?php
2
+ /**
3
+ * ACF Content Analysis for Yoast SEO plugin file.
4
+ *
5
+ * @package YoastACFAnalysis
6
+ */
7
 
8
+ /**
9
+ * Interface Yoast_ACF_Analysis_Dependency.
10
+ */
11
  interface Yoast_ACF_Analysis_Dependency {
12
  /**
13
  * Checks if this dependency is met.
inc/dependencies/{class-yoast-acf-analysis-dependency-yoast-seo.php → dependency-yoast-seo.php} RENAMED
@@ -1,5 +1,13 @@
1
  <?php
 
 
 
 
 
2
 
 
 
 
3
  final class Yoast_ACF_Analysis_Dependency_Yoast_SEO implements Yoast_ACF_Analysis_Dependency {
4
 
5
  const MINIMAL_REQUIRED_VERSION = 3.2;
1
  <?php
2
+ /**
3
+ * ACF Content Analysis for Yoast SEO plugin file.
4
+ *
5
+ * @package YoastACFAnalysis
6
+ */
7
 
8
+ /**
9
+ * Checks for the required Yoast SEO version.
10
+ */
11
  final class Yoast_ACF_Analysis_Dependency_Yoast_SEO implements Yoast_ACF_Analysis_Dependency {
12
 
13
  const MINIMAL_REQUIRED_VERSION = 3.2;
inc/{class-yoast-acf-analysis-facade.php → facade.php} RENAMED
@@ -1,9 +1,13 @@
1
  <?php
 
 
 
 
 
2
 
3
  /**
4
  * Class Yoast_ACF_Analysis_Facade
5
  */
6
-
7
  class Yoast_ACF_Analysis_Facade {
8
 
9
  /**
@@ -23,7 +27,7 @@ class Yoast_ACF_Analysis_Facade {
23
  public static function get_registry() {
24
  static $registry = null;
25
 
26
- if( null === $registry ) {
27
  $registry = new Yoast_ACF_Analysis_Registry();
28
  }
29
 
@@ -38,7 +42,7 @@ class Yoast_ACF_Analysis_Facade {
38
  * @return string Full filter name to use.
39
  */
40
  public static function get_filter_name( $filter_name ) {
41
- // Example: yoast-acf-analysis/refresh_rate
42
  return sprintf( '%1$s/%2$s', self::get_plugin_name(), ltrim( $filter_name, '/' ) );
43
  }
44
  }
1
  <?php
2
+ /**
3
+ * ACF Content Analysis for Yoast SEO plugin file.
4
+ *
5
+ * @package YoastACFAnalysis
6
+ */
7
 
8
  /**
9
  * Class Yoast_ACF_Analysis_Facade
10
  */
 
11
  class Yoast_ACF_Analysis_Facade {
12
 
13
  /**
27
  public static function get_registry() {
28
  static $registry = null;
29
 
30
+ if ( null === $registry ) {
31
  $registry = new Yoast_ACF_Analysis_Registry();
32
  }
33
 
42
  * @return string Full filter name to use.
43
  */
44
  public static function get_filter_name( $filter_name ) {
45
+ // Example: yoast-acf-analysis/refresh_rate.
46
  return sprintf( '%1$s/%2$s', self::get_plugin_name(), ltrim( $filter_name, '/' ) );
47
  }
48
  }
inc/{class-yoast-acf-analysis-registry.php → registry.php} RENAMED
@@ -1,4 +1,9 @@
1
  <?php
 
 
 
 
 
2
 
3
  /**
4
  * Class Yoast_ACF_Analysis_Registry
@@ -13,6 +18,8 @@ class Yoast_ACF_Analysis_Registry {
13
  private $storage = array();
14
 
15
  /**
 
 
16
  * @param string|int $id Registry index.
17
  * @param mixed $item Item to store in the registry.
18
  */
@@ -21,6 +28,8 @@ class Yoast_ACF_Analysis_Registry {
21
  }
22
 
23
  /**
 
 
24
  * @param string|int $id Registry index.
25
  *
26
  * @return object|null Object if a class is registered for the ID, otherwise null.
1
  <?php
2
+ /**
3
+ * ACF Content Analysis for Yoast SEO plugin file.
4
+ *
5
+ * @package YoastACFAnalysis
6
+ */
7
 
8
  /**
9
  * Class Yoast_ACF_Analysis_Registry
18
  private $storage = array();
19
 
20
  /**
21
+ * Adds an item to the registry.
22
+ *
23
  * @param string|int $id Registry index.
24
  * @param mixed $item Item to store in the registry.
25
  */
28
  }
29
 
30
  /**
31
+ * Retrieves an item from the registry.
32
+ *
33
  * @param string|int $id Registry index.
34
  *
35
  * @return object|null Object if a class is registered for the ID, otherwise null.
inc/{class-yoast-acf-analysis-requirements.php → requirements.php} RENAMED
@@ -1,12 +1,20 @@
1
  <?php
2
-
 
 
 
 
3
 
4
  /**
5
  * Class Yoast_ACF_Analysis_Requirements
6
  */
7
  class Yoast_ACF_Analysis_Requirements {
8
 
9
- /** @var Yoast_ACF_Analysis_Dependency[] List of registered dependencies. */
 
 
 
 
10
  protected $dependencies = array();
11
 
12
  /**
1
  <?php
2
+ /**
3
+ * ACF Content Analysis for Yoast SEO plugin file.
4
+ *
5
+ * @package YoastACFAnalysis
6
+ */
7
 
8
  /**
9
  * Class Yoast_ACF_Analysis_Requirements
10
  */
11
  class Yoast_ACF_Analysis_Requirements {
12
 
13
+ /**
14
+ * List of registered dependencies.
15
+ *
16
+ * @var Yoast_ACF_Analysis_Dependency[]
17
+ */
18
  protected $dependencies = array();
19
 
20
  /**
js/src/app.js CHANGED
@@ -1,4 +1,4 @@
1
- /* global YoastSEO */
2
  var config = require( "./config/config.js" );
3
  var helper = require( "./helper.js" );
4
  var collect = require( "./collect/collect.js" );
@@ -6,81 +6,82 @@ var replaceVars = require( "./replacevars.js" );
6
 
7
  var analysisTimeout = 0;
8
 
9
- var App = function(){
 
10
 
11
- YoastSEO.app.registerPlugin(config.pluginName, {status: 'ready'});
12
-
13
- YoastSEO.app.registerModification('content', collect.append.bind(collect), config.pluginName);
14
-
15
- this.bindListeners();
16
 
 
17
  };
18
 
19
- App.prototype.bindListeners = function(){
20
-
21
- var _self = this;
22
-
23
- if(helper.acf_version >= 5){
24
-
25
- jQuery(function(){
26
-
27
- replaceVars.updateReplaceVars(collect);
28
-
29
- acf.add_action('change remove append sortstop', _self.maybeRefresh);
30
- acf.add_action('change remove append sortstop', replaceVars.updateReplaceVars.bind(_self, collect));
31
-
32
- });
33
-
34
- }else{
35
-
36
- var fieldSelectors = config.fieldSelectors.slice(0);
37
- var wysiwygSelector = 'textarea[id^=wysiwyg-acf]';
38
-
39
- // Ignore Wysiwyg fields because they trigger a refresh in Yoast SEO itself
40
- fieldSelectorsWithoutWysiwyg = _.without(fieldSelectors, wysiwygSelector);
41
-
42
- jQuery(document).on('acf/setup_fields', function(){
43
-
44
- replaceVars.updateReplaceVars(collect);
45
-
46
- var fieldsWithoutWysiwyg = jQuery('#post-body, #edittag').find(fieldSelectorsWithoutWysiwyg.join(','));
47
- var fields = jQuery('#post-body, #edittag').find(fieldSelectors.join(','));
48
-
49
- fieldsWithoutWysiwyg.on('change', _self.maybeRefresh.bind(_self) );
50
- // Do not ignore Wysiwyg fields for the purpose of Replace Vars.
51
- fields.on('change', replaceVars.updateReplaceVars.bind(_self, collect));
52
-
53
- if (YoastSEO.wp._tinyMCEHelper) {
54
-
55
- jQuery(wysiwygSelector).each( function () {
56
- YoastSEO.wp._tinyMCEHelper.addEventHandler(this.id, [ 'input', 'change', 'cut', 'paste' ],
57
- replaceVars.updateReplaceVars.bind(_self, collect));
58
- });
59
-
60
- }
61
 
62
- //Also refresh on media close as attachment data might have changed
63
- wp.media.frame.on('close', _self.maybeRefresh.bind(_self) );
64
- });
 
 
 
 
65
 
66
- }
 
67
  };
68
 
69
- App.prototype.maybeRefresh = function(){
 
 
 
 
 
70
 
71
- if ( analysisTimeout ) {
72
- window.clearTimeout(analysisTimeout);
73
- }
74
 
75
- analysisTimeout = window.setTimeout( function() {
 
 
76
 
77
- if(config.debug){
78
- console.log('Recalculate...' + new Date() + '(Internal)');
79
- }
 
80
 
81
- YoastSEO.app.pluginReloaded(config.pluginName);
82
- }, config.refreshRate );
 
 
83
 
 
 
84
  };
85
 
86
  module.exports = App;
1
+ /* global YoastSEO, acf, _, jQuery, wp */
2
  var config = require( "./config/config.js" );
3
  var helper = require( "./helper.js" );
4
  var collect = require( "./collect/collect.js" );
6
 
7
  var analysisTimeout = 0;
8
 
9
+ var App = function() {
10
+ YoastSEO.app.registerPlugin( config.pluginName, { status: "ready" } );
11
 
12
+ YoastSEO.app.registerModification( "content", collect.append.bind( collect ), config.pluginName );
 
 
 
 
13
 
14
+ this.bindListeners();
15
  };
16
 
17
+ /**
18
+ * ACF 4 Listener.
19
+ *
20
+ * @param {Array} fieldSelectors List of field selectors.
21
+ * @param {string} wysiwygSelector Element selector for WYSIWYG fields.
22
+ * @param {Array} fieldSelectorsWithoutWysiwyg List of fields.
23
+ *
24
+ * @returns {void}
25
+ */
26
+ App.prototype.acf4Listener = function( fieldSelectors, wysiwygSelector, fieldSelectorsWithoutWysiwyg ) {
27
+ replaceVars.updateReplaceVars( collect );
28
+
29
+ var fieldsWithoutWysiwyg = jQuery( "#post-body, #edittag" ).find( fieldSelectorsWithoutWysiwyg.join( "," ) );
30
+ var fields = jQuery( "#post-body, #edittag" ).find( fieldSelectors.join( "," ) );
31
+
32
+ fieldsWithoutWysiwyg.on( "change", this.maybeRefresh.bind( this ) );
33
+ // Do not ignore Wysiwyg fields for the purpose of Replace Vars.
34
+ fields.on( "change", replaceVars.updateReplaceVars.bind( this, collect ) );
35
+
36
+ if ( YoastSEO.wp._tinyMCEHelper ) {
37
+ jQuery( wysiwygSelector ).each( function() {
38
+ YoastSEO.wp._tinyMCEHelper.addEventHandler( this.id, [ "input", "change", "cut", "paste" ],
39
+ replaceVars.updateReplaceVars.bind( this, collect ) );
40
+ } );
41
+ }
42
+
43
+ // Also refresh on media close as attachment data might have changed
44
+ wp.media.frame.on( "close", this.maybeRefresh );
45
+ };
 
 
 
 
 
 
 
 
 
 
 
 
 
46
 
47
+ /**
48
+ * ACF 5 Listener.
49
+ *
50
+ * @returns {void}
51
+ */
52
+ App.prototype.acf5Listener = function() {
53
+ replaceVars.updateReplaceVars( collect );
54
 
55
+ acf.add_action( "change remove append sortstop", this.maybeRefresh );
56
+ acf.add_action( "change remove append sortstop", replaceVars.updateReplaceVars.bind( this, collect ) );
57
  };
58
 
59
+ App.prototype.bindListeners = function() {
60
+ if ( helper.acf_version >= 5 ) {
61
+ jQuery( this.acf5Listener.bind( this ) );
62
+ } else {
63
+ var fieldSelectors = config.fieldSelectors.slice( 0 );
64
+ var wysiwygSelector = "textarea[id^=wysiwyg-acf]";
65
 
66
+ // Ignore Wysiwyg fields because they trigger a refresh in Yoast SEO itself
67
+ var fieldSelectorsWithoutWysiwyg = _.without( fieldSelectors, wysiwygSelector );
 
68
 
69
+ jQuery( document ).on( "acf/setup_fields", this.acf4Listener.bind( this, fieldSelectors, wysiwygSelector, fieldSelectorsWithoutWysiwyg ) );
70
+ }
71
+ };
72
 
73
+ App.prototype.maybeRefresh = function() {
74
+ if ( analysisTimeout ) {
75
+ window.clearTimeout( analysisTimeout );
76
+ }
77
 
78
+ analysisTimeout = window.setTimeout( function() {
79
+ if ( config.debug ) {
80
+ console.log( "Recalculate..." + new Date() + "(Internal)" );
81
+ }
82
 
83
+ YoastSEO.app.pluginReloaded( config.pluginName );
84
+ }, config.refreshRate );
85
  };
86
 
87
  module.exports = App;
js/src/cache/cache.attachments.js CHANGED
@@ -1,49 +1,46 @@
1
  /* global _ */
2
  var cache = require( "./cache.js" );
3
 
4
- var refresh = function(attachment_ids){
5
-
6
- var uncached = cache.getUncached(attachment_ids, 'attachment');
7
-
8
- if (uncached.length === 0){
9
- return;
10
- }
11
-
12
- window.wp.ajax.post('query-attachments', {
13
- 'query': {
14
- 'post__in': uncached
15
- }
16
- }).done(function (attachments) {
17
-
18
- _.each(attachments, function (attachment) {
19
- cache.set(attachment.id, attachment, 'attachment');
20
- YoastACFAnalysis.maybeRefresh();
21
- });
22
-
23
- });
24
-
25
  };
26
 
27
- var get = function( id ){
 
28
 
29
- var attachment = cache.get(id, 'attachment');
 
 
30
 
31
- if(!attachment) return false;
32
 
33
- var changedAttachment = wp.media.attachment( id );
 
 
34
 
35
- if( changedAttachment.has('alt') ){
36
- attachment.alt = changedAttachment.get('alt');
37
- }
38
 
39
- if( changedAttachment.has('title') ){
40
- attachment.title = changedAttachment.get('title');
41
- }
42
-
43
- return attachment;
44
  };
45
 
46
  module.exports = {
47
- refresh: refresh,
48
- get: get
49
- };
1
  /* global _ */
2
  var cache = require( "./cache.js" );
3
 
4
+ var refresh = function( attachment_ids ) {
5
+ var uncached = cache.getUncached( attachment_ids, "attachment" );
6
+
7
+ if ( uncached.length === 0 ) {
8
+ return;
9
+ }
10
+
11
+ window.wp.ajax.post( "query-attachments", {
12
+ query: {
13
+ post__in: uncached,
14
+ },
15
+ } ).done( function( attachments ) {
16
+ _.each( attachments, function( attachment ) {
17
+ cache.set( attachment.id, attachment, "attachment" );
18
+ window.YoastACFAnalysis.maybeRefresh();
19
+ } );
20
+ } );
 
 
 
 
21
  };
22
 
23
+ var get = function( id ) {
24
+ var attachment = cache.get( id, "attachment" );
25
 
26
+ if ( ! attachment ) {
27
+ return false;
28
+ }
29
 
30
+ var changedAttachment = window.wp.media.attachment( id );
31
 
32
+ if ( changedAttachment.has( "alt" ) ) {
33
+ attachment.alt = changedAttachment.get( "alt" );
34
+ }
35
 
36
+ if ( changedAttachment.has( "title" ) ) {
37
+ attachment.title = changedAttachment.get( "title" );
38
+ }
39
 
40
+ return attachment;
 
 
 
 
41
  };
42
 
43
  module.exports = {
44
+ refresh: refresh,
45
+ get: get,
46
+ };
js/src/cache/cache.js CHANGED
@@ -1,58 +1,52 @@
1
  /* global _ */
2
  var Cache = function() {
3
- this.clear('all');
4
  };
5
 
6
  var _cache;
7
 
8
  Cache.prototype.set = function( id, value, store ) {
 
9
 
10
- store = typeof store !== 'undefined' ? store : 'default';
 
 
11
 
12
- if( !(store in _cache) ){
13
- _cache[store] = {};
14
- }
15
-
16
- _cache[ store ][ id ] = value;
17
  };
18
 
19
- Cache.prototype.get = function( id, store ){
20
-
21
- store = typeof store !== 'undefined' ? store : 'default';
22
 
23
- if ( store in _cache && id in _cache[ store ] ) {
24
- return _cache[ store ][ id ];
25
- }else{
26
- return false;
27
- }
28
 
 
29
  };
30
 
31
- Cache.prototype.getUncached = function(ids, store){
32
-
33
- store = typeof store !== 'undefined' ? store : 'default';
34
 
35
- var that = this;
36
 
37
- ids = _.uniq(ids);
38
 
39
- return ids.filter(function(id){
40
- var value = that.get(id, store);
41
- return value === false;
42
- });
43
 
 
 
44
  };
45
 
46
- Cache.prototype.clear = function(store){
47
-
48
- store = typeof store !== 'undefined' ? store : 'default';
49
-
50
- if(store === 'all'){
51
- _cache = {};
52
- }else{
53
- _cache[store] = {};
54
- }
55
 
 
 
 
 
 
56
  };
57
 
58
- module.exports = new Cache();
1
  /* global _ */
2
  var Cache = function() {
3
+ this.clear( "all" );
4
  };
5
 
6
  var _cache;
7
 
8
  Cache.prototype.set = function( id, value, store ) {
9
+ store = typeof store === "undefined" ? "default" : store;
10
 
11
+ if ( ! ( store in _cache ) ) {
12
+ _cache[ store ] = {};
13
+ }
14
 
15
+ _cache[ store ][ id ] = value;
 
 
 
 
16
  };
17
 
18
+ Cache.prototype.get = function( id, store ) {
19
+ store = typeof store === "undefined" ? "default" : store;
 
20
 
21
+ if ( store in _cache && id in _cache[ store ] ) {
22
+ return _cache[ store ][ id ];
23
+ }
 
 
24
 
25
+ return false;
26
  };
27
 
28
+ Cache.prototype.getUncached = function( ids, store ) {
29
+ store = typeof store === "undefined" ? "default" : store;
 
30
 
31
+ var that = this;
32
 
33
+ ids = _.uniq( ids );
34
 
35
+ return ids.filter( function( id ) {
36
+ var value = that.get( id, store );
 
 
37
 
38
+ return value === false;
39
+ } );
40
  };
41
 
42
+ Cache.prototype.clear = function( store ) {
43
+ store = typeof store === "undefined" ? "default" : store;
 
 
 
 
 
 
 
44
 
45
+ if ( store === "all" ) {
46
+ _cache = {};
47
+ } else {
48
+ _cache[ store ] = {};
49
+ }
50
  };
51
 
52
+ module.exports = new Cache();
js/src/collect/collect-v4.js CHANGED
@@ -1,22 +1,22 @@
 
 
1
  var config = require( "./../config/config.js" );
2
  var fieldSelectors = config.fieldSelectors;
3
 
4
  var field_data = [];
5
 
6
- var fields = jQuery('#post-body, #edittag').find(fieldSelectors.join(','));
7
-
8
- fields.each(function() {
9
-
10
- var $el = jQuery(this).parents('.field').last();
11
 
12
- field_data.push({
13
- $el : $el,
14
- key : $el.data('field_key'),
15
- name : $el.data('field_name'),
16
- type : $el.data('field_type'),
17
- post_meta_key : $el.data('field_name')
18
- });
19
 
20
- });
 
 
 
 
 
 
 
21
 
22
- module.exports = field_data;
1
+ /* global jQuery */
2
+
3
  var config = require( "./../config/config.js" );
4
  var fieldSelectors = config.fieldSelectors;
5
 
6
  var field_data = [];
7
 
8
+ var fields = jQuery( "#post-body, #edittag" ).find( fieldSelectors.join( "," ) );
 
 
 
 
9
 
10
+ fields.each( function() {
11
+ var $el = jQuery( this ).parents( ".field" ).last();
 
 
 
 
 
12
 
13
+ field_data.push( {
14
+ $el: $el,
15
+ key: $el.data( "field_key" ),
16
+ name: $el.data( "field_name" ),
17
+ type: $el.data( "field_type" ),
18
+ post_meta_key: $el.data( "field_name" ),
19
+ } );
20
+ } );
21
 
22
+ module.exports = field_data;
js/src/collect/collect-v5.js CHANGED
@@ -1,67 +1,55 @@
1
- module.exports = function(){
2
-
3
- var outerFieldsName = [
4
- 'flexible_content',
5
- 'repeater',
6
- 'group'
7
- ];
8
-
9
- var innerFields = [];
10
- var outerFields = [];
11
-
12
- var fields = _.map(acf.get_fields(), function(field){
13
-
14
- var field_data = jQuery.extend( true, {}, acf.get_data(jQuery(field)) );
15
- field_data.$el = jQuery(field);
16
- field_data.post_meta_key = field_data.name;
17
-
18
- // Collect nested and parent
19
- if( outerFieldsName.indexOf(field_data.type) === -1 ) {
20
- innerFields.push(field_data);
21
- }else{
22
- outerFields.push(field_data);
23
- }
24
-
25
- return field_data;
26
-
27
- });
28
-
29
- if( outerFields.length === 0){
30
- return fields;
31
- }
32
-
33
- // Transform field names for nested fields.
34
- _.each(innerFields, function(inner){
35
-
36
- _.each(outerFields, function(outer){
37
-
38
- if (jQuery.contains(outer.$el[0], inner.$el[0])) {
39
-
40
- // Types that hold multiple children.
41
- if (outer.type === 'flexible_content' || outer.type === 'repeater'){
42
-
43
- outer.children = outer.children || [];
44
- outer.children.push(inner);
45
- inner.parent = outer;
46
- inner.post_meta_key = outer.name + '_' + (outer.children.length - 1) + '_' + inner.name;
47
-
48
- }
49
-
50
- // Types that hold single children.
51
- if (outer.type === 'group') {
52
-
53
- outer.children = [inner];
54
- inner.parent = outer;
55
- inner.post_meta_key = outer.name + '_' + inner.name;
56
-
57
- }
58
-
59
- }
60
-
61
- });
62
-
63
- });
64
-
65
- return fields;
66
-
67
  };
1
+ /* global _, acf, jQuery */
2
+
3
+ module.exports = function() {
4
+ var outerFieldsName = [
5
+ "flexible_content",
6
+ "repeater",
7
+ "group",
8
+ ];
9
+
10
+ var innerFields = [];
11
+ var outerFields = [];
12
+
13
+ var fields = _.map( acf.get_fields(), function( field ) {
14
+ var field_data = jQuery.extend( true, {}, acf.get_data( jQuery( field ) ) );
15
+ field_data.$el = jQuery( field );
16
+ field_data.post_meta_key = field_data.name;
17
+
18
+ // Collect nested and parent
19
+ if ( outerFieldsName.indexOf( field_data.type ) === -1 ) {
20
+ innerFields.push( field_data );
21
+ } else {
22
+ outerFields.push( field_data );
23
+ }
24
+
25
+ return field_data;
26
+ } );
27
+
28
+ if ( outerFields.length === 0 ) {
29
+ return fields;
30
+ }
31
+
32
+ // Transform field names for nested fields.
33
+ _.each( innerFields, function( inner ) {
34
+ _.each( outerFields, function( outer ) {
35
+ if ( jQuery.contains( outer.$el[ 0 ], inner.$el[ 0 ] ) ) {
36
+ // Types that hold multiple children.
37
+ if ( outer.type === "flexible_content" || outer.type === "repeater" ) {
38
+ outer.children = outer.children || [];
39
+ outer.children.push( inner );
40
+ inner.parent = outer;
41
+ inner.post_meta_key = outer.name + "_" + ( outer.children.length - 1 ) + "_" + inner.name;
42
+ }
43
+
44
+ // Types that hold single children.
45
+ if ( outer.type === "group" ) {
46
+ outer.children = [ inner ];
47
+ inner.parent = outer;
48
+ inner.post_meta_key = outer.name + "_" + inner.name;
49
+ }
50
+ }
51
+ } );
52
+ } );
53
+
54
+ return fields;
 
 
 
 
 
 
 
 
 
 
 
 
55
  };
js/src/collect/collect.js CHANGED
@@ -1,86 +1,77 @@
1
- /* global acf, _ */
2
 
3
  var config = require( "./../config/config.js" );
4
  var helper = require( "./../helper.js" );
5
  var scraper_store = require( "./../scraper-store.js" );
6
 
7
- var Collect = function(){
8
 
9
  };
10
 
11
- Collect.prototype.getFieldData = function () {
12
- var field_data = this.filterBroken(this.filterBlacklistName(this.filterBlacklistType(this.getData())));
13
 
14
- var used_types = _.uniq(_.pluck(field_data, 'type'));
15
 
16
- if(config.debug) {
 
 
 
17
 
18
- console.log('Used types:');
19
- console.log(used_types);
 
20
 
21
- }
22
-
23
- _.each(used_types, function(type){
24
- field_data = scraper_store.getScraper(type).scrape(field_data);
25
- });
26
-
27
- return field_data;
28
  };
29
 
30
- Collect.prototype.append = function(data){
31
-
32
- if(config.debug){
33
- console.log('Recalculate...' + new Date());
34
- }
35
-
36
- var field_data = this.getFieldData();
37
 
38
- _.each(field_data, function(field){
39
 
40
- if(typeof field.content !== 'undefined' && field.content !== ''){
41
- data += '\n' + field.content;
42
- }
 
 
43
 
44
- });
 
 
45
 
46
- if(config.debug){
47
- console.log('Field data:');
48
- console.table(field_data);
49
-
50
- console.log('Data:');
51
- console.log(data);
52
- }
53
-
54
- return data;
55
 
 
56
  };
57
 
58
- Collect.prototype.getData = function(){
59
-
60
- if(helper.acf_version >= 5){
61
- return require( "./collect-v5.js" )();
62
- }else{
63
- return require( "./collect-v4.js" );
64
- }
65
-
66
  };
67
 
68
- Collect.prototype.filterBlacklistType = function(field_data){
69
- return _.filter(field_data, function(field){
70
- return !_.contains(config.blacklistType, field.type);
71
- });
72
  };
73
 
74
- Collect.prototype.filterBlacklistName = function(field_data){
75
- return _.filter(field_data, function(field){
76
- return !_.contains(config.blacklistName, field.name);
77
- });
78
  };
79
 
80
- Collect.prototype.filterBroken = function(field_data){
81
- return _.filter(field_data, function(field){
82
- return ('key' in field);
83
- });
84
  };
85
 
86
  module.exports = new Collect();
1
+ /* global _ */
2
 
3
  var config = require( "./../config/config.js" );
4
  var helper = require( "./../helper.js" );
5
  var scraper_store = require( "./../scraper-store.js" );
6
 
7
+ var Collect = function() {
8
 
9
  };
10
 
11
+ Collect.prototype.getFieldData = function() {
12
+ var field_data = this.filterBroken( this.filterBlacklistName( this.filterBlacklistType( this.getData() ) ) );
13
 
14
+ var used_types = _.uniq( _.pluck( field_data, "type" ) );
15
 
16
+ if ( config.debug ) {
17
+ console.log( "Used types:" );
18
+ console.log( used_types );
19
+ }
20
 
21
+ _.each( used_types, function( type ) {
22
+ field_data = scraper_store.getScraper( type ).scrape( field_data );
23
+ } );
24
 
25
+ return field_data;
 
 
 
 
 
 
26
  };
27
 
28
+ Collect.prototype.append = function( data ) {
29
+ if ( config.debug ) {
30
+ console.log( "Recalculate..." + new Date() );
31
+ }
 
 
 
32
 
33
+ var field_data = this.getFieldData();
34
 
35
+ _.each( field_data, function( field ) {
36
+ if ( typeof field.content !== "undefined" && field.content !== "" ) {
37
+ data += "\n" + field.content;
38
+ }
39
+ } );
40
 
41
+ if ( config.debug ) {
42
+ console.log( "Field data:" );
43
+ console.table( field_data );
44
 
45
+ console.log( "Data:" );
46
+ console.log( data );
47
+ }
 
 
 
 
 
 
48
 
49
+ return data;
50
  };
51
 
52
+ Collect.prototype.getData = function() {
53
+ if ( helper.acf_version >= 5 ) {
54
+ return require( "./collect-v5.js" )();
55
+ }
56
+ return require( "./collect-v4.js" );
 
 
 
57
  };
58
 
59
+ Collect.prototype.filterBlacklistType = function( field_data ) {
60
+ return _.filter( field_data, function( field ) {
61
+ return ! _.contains( config.blacklistType, field.type );
62
+ } );
63
  };
64
 
65
+ Collect.prototype.filterBlacklistName = function( field_data ) {
66
+ return _.filter( field_data, function( field ) {
67
+ return ! _.contains( config.blacklistName, field.name );
68
+ } );
69
  };
70
 
71
+ Collect.prototype.filterBroken = function( field_data ) {
72
+ return _.filter( field_data, function( field ) {
73
+ return ( "key" in field );
74
+ } );
75
  };
76
 
77
  module.exports = new Collect();
js/src/config/config.js CHANGED
@@ -1 +1,2 @@
1
- module.exports = YoastACFAnalysisConfig;
 
1
+ /* globals YoastACFAnalysisConfig */
2
+ module.exports = YoastACFAnalysisConfig;
js/src/helper.js CHANGED
@@ -1,5 +1,5 @@
1
  var config = require( "./config/config.js" );
2
 
3
  module.exports = {
4
- acf_version: parseFloat(config.acfVersion, 10)
5
- };
1
  var config = require( "./config/config.js" );
2
 
3
  module.exports = {
4
+ acf_version: parseFloat( config.acfVersion, 10 ),
5
+ };
js/src/main.js CHANGED
@@ -1,17 +1,12 @@
1
- /* global jQuery, YoastACFAnalysis: true */
 
2
 
3
  var App = require( "./app.js" );
4
 
5
- (function($) {
6
-
7
- $(document).ready(function() {
8
-
9
- if( "undefined" !== typeof YoastSEO){
10
-
11
- YoastACFAnalysis = new App();
12
-
13
- }
14
-
15
- });
16
-
17
- }(jQuery));
1
+ /* global jQuery, YoastSEO, YoastACFAnalysis: true */
2
+ /* exported YoastACFAnalysis */
3
 
4
  var App = require( "./app.js" );
5
 
6
+ ( function( $ ) {
7
+ $( document ).ready( function() {
8
+ if ( "undefined" !== typeof YoastSEO ) {
9
+ YoastACFAnalysis = new App();
10
+ }
11
+ } );
12
+ }( jQuery ) );
 
 
 
 
 
 
js/src/replacevars.js CHANGED
@@ -4,53 +4,52 @@ var config = require( "./config/config.js" );
4
 
5
  var ReplaceVar = YoastReplaceVarPlugin.ReplaceVar;
6
 
7
- var supportedTypes = ['email', 'text', 'textarea', 'url', 'wysiwyg'];
8
 
9
  var replaceVars = {};
10
 
11
- var replaceVarPluginAvailable = function(){
12
- if (ReplaceVar === undefined) {
13
- if (config.debug) {
14
- console.log('Replacing ACF variables in the Snippet Window requires Yoast SEO >= 5.3.');
15
- }
16
- return false;
17
- }
18
- return true;
19
- };
20
-
21
- var updateReplaceVars = function (collect) {
22
- if (!replaceVarPluginAvailable()) {
23
- return;
24
- }
25
-
26
- var fieldData = _.filter(collect.getFieldData(), function (field) { return _.contains(supportedTypes, field.type) });
27
-
28
- _.each(fieldData, function(field) {
29
- // Remove HTML tags using jQuery in case of a wysiwyg field.
30
- var content = (field.type === 'wysiwyg') ? jQuery(jQuery.parseHTML(field.content)).text() : field.content;
31
-
32
- if(replaceVars[field.post_meta_key]===undefined){
33
 
34
- replaceVars[field.post_meta_key] = new ReplaceVar( '%%cf_'+field.post_meta_key+'%%', content, { source: 'direct' } );
35
- YoastSEO.wp.replaceVarsPlugin.addReplacement( replaceVars[field.post_meta_key] );
36
 
37
- if (config.debug) {
38
- console.log("Created ReplaceVar for: ", field.post_meta_key, " with: ", content, replaceVars[field.post_meta_key]);
39
- }
40
-
41
- }else{
42
-
43
- replaceVars[field.post_meta_key].replacement = content;
44
-
45
- if (config.debug) {
46
- console.log("Updated ReplaceVar for: ", field.post_meta_key, " with: ", content, replaceVars[field.post_meta_key]);
47
- }
48
-
49
- }
50
 
51
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  };
53
 
54
  module.exports = {
55
- updateReplaceVars: updateReplaceVars
56
  };
4
 
5
  var ReplaceVar = YoastReplaceVarPlugin.ReplaceVar;
6
 
7
+ var supportedTypes = [ "email", "text", "textarea", "url", "wysiwyg" ];
8
 
9
  var replaceVars = {};
10
 
11
+ var replaceVarPluginAvailable = function() {
12
+ if ( typeof ReplaceVar === "undefined" ) {
13
+ if ( config.debug ) {
14
+ console.log( "Replacing ACF variables in the Snippet Window requires Yoast SEO >= 5.3." );
15
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
 
17
+ return false;
18
+ }
19
 
20
+ return true;
21
+ };
 
 
 
 
 
 
 
 
 
 
 
22
 
23
+ var updateReplaceVars = function( collect ) {
24
+ if ( ! replaceVarPluginAvailable() ) {
25
+ return;
26
+ }
27
+
28
+ var fieldData = _.filter( collect.getFieldData(), function( field ) {
29
+ return _.contains( supportedTypes, field.type );
30
+ } );
31
+
32
+ _.each( fieldData, function( field ) {
33
+ // Remove HTML tags using jQuery in case of a wysiwyg field.
34
+ var content = ( field.type === "wysiwyg" ) ? jQuery( jQuery.parseHTML( field.content ) ).text() : field.content;
35
+
36
+ if ( typeof replaceVars[ field.post_meta_key ] === "undefined" ) {
37
+ replaceVars[ field.post_meta_key ] = new ReplaceVar( "%%cf_" + field.post_meta_key + "%%", content, { source: "direct" } );
38
+ YoastSEO.wp.replaceVarsPlugin.addReplacement( replaceVars[ field.post_meta_key ] );
39
+
40
+ if ( config.debug ) {
41
+ console.log( "Created ReplaceVar for: ", field.post_meta_key, " with: ", content, replaceVars[ field.post_meta_key ] );
42
+ }
43
+ } else {
44
+ replaceVars[ field.post_meta_key ].replacement = content;
45
+
46
+ if ( config.debug ) {
47
+ console.log( "Updated ReplaceVar for: ", field.post_meta_key, " with: ", content, replaceVars[ field.post_meta_key ] );
48
+ }
49
+ }
50
+ } );
51
  };
52
 
53
  module.exports = {
54
+ updateReplaceVars: updateReplaceVars,
55
  };
js/src/scraper-store.js CHANGED
@@ -1,91 +1,94 @@
1
- /* global _ */
2
  var config = require( "./config/config.js" );
3
 
4
  var scraperObjects = {
 
 
 
 
 
 
5
 
6
- //Basic
7
- 'text': require( "./scraper/scraper.text.js" ),
8
- 'textarea': require( "./scraper/scraper.textarea.js" ),
9
- 'email': require( "./scraper/scraper.email.js" ),
10
- 'url': require( "./scraper/scraper.url.js" ),
11
 
12
- //Content
13
- 'wysiwyg': require( "./scraper/scraper.wysiwyg.js" ),
14
- //TODO: Add oembed handler
15
- 'image': require( "./scraper/scraper.image.js" ),
16
- 'gallery': require( "./scraper/scraper.gallery.js" ),
17
 
18
- //Choice
19
- //TODO: select, checkbox, radio
20
 
21
- //Relational
22
- 'taxonomy': require( "./scraper/scraper.taxonomy.js" )
23
-
24
- //jQuery
25
- //TODO: google_map, date_picker, color_picker
26
 
27
  };
28
 
29
  var scrapers = {};
30
 
31
  /**
32
- * Set a scraper object on the store. Existing scrapers will be overwritten.
33
  *
34
- * @param {Object} scraper
35
- * @param {string} type
 
36
  */
37
- var setScraper = function(scraper, type){
 
 
 
 
38
 
39
- if(config.debug && hasScraper(type)){
40
- console.warn('Scraper for "' + type + '" already exists and will be overwritten.' );
41
- }
 
 
 
 
 
 
 
 
 
 
 
42
 
43
- scrapers[type] = scraper;
44
 
45
- return scraper;
46
  };
47
 
48
  /**
49
  * Returns the scraper object for a field type.
50
  * If there is no scraper object for this field type a no-op scraper is returned.
51
  *
52
- * @param {string} type
53
- * @returns {Object}
54
- */
55
- var getScraper = function(type){
56
-
57
- if(hasScraper(type)){
58
- return scrapers[type];
59
- }else if(type in scraperObjects){
60
- return setScraper(new scraperObjects[type](), type);
61
- }else{
62
- //If we do not have a scraper just pass the fields through so it will be filtered out by the app.
63
- return {
64
- scrape: function(fields){
65
- if(config.debug){
66
- console.warn('No Scraper for field type: ' + type );
67
- }
68
- return fields;
69
- }
70
- };
71
- }
72
- }
73
-
74
- /**
75
- * Checks if there already is a scraper for a field type in the store.
76
  *
77
- * @param {string} type
78
- * @returns {boolean}
79
  */
80
- var hasScraper = function(type){
81
-
82
- return (type in scrapers);
83
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  };
85
 
86
  module.exports = {
87
-
88
- setScraper: setScraper,
89
- getScraper: getScraper
90
-
91
- };
 
1
  var config = require( "./config/config.js" );
2
 
3
  var scraperObjects = {
4
+ // Basic
5
+ text: require( "./scraper/scraper.text.js" ),
6
+ textarea: require( "./scraper/scraper.textarea.js" ),
7
+ email: require( "./scraper/scraper.email.js" ),
8
+ url: require( "./scraper/scraper.url.js" ),
9
+ link: require( "./scraper/scraper.link.js" ),
10
 
11
+ // Content
12
+ wysiwyg: require( "./scraper/scraper.wysiwyg.js" ),
13
+ // TODO: Add oembed handler
14
+ image: require( "./scraper/scraper.image.js" ),
15
+ gallery: require( "./scraper/scraper.gallery.js" ),
16
 
17
+ // Choice
18
+ // TODO: select, checkbox, radio
 
 
 
19
 
20
+ // Relational
21
+ taxonomy: require( "./scraper/scraper.taxonomy.js" ),
22
 
23
+ // jQuery
24
+ // TODO: google_map, date_picker, color_picker
 
 
 
25
 
26
  };
27
 
28
  var scrapers = {};
29
 
30
  /**
31
+ * Checks if there already is a scraper for a field type in the store.
32
  *
33
+ * @param {string} type Type of scraper to find.
34
+ *
35
+ * @returns {boolean} True if the scraper is already defined.
36
  */
37
+ var hasScraper = function( type ) {
38
+ return (
39
+ type in scrapers
40
+ );
41
+ };
42
 
43
+ /**
44
+ * Set a scraper object on the store. Existing scrapers will be overwritten.
45
+ *
46
+ * @param {Object} scraper The scraper to add.
47
+ * @param {string} type Type of scraper.
48
+ *
49
+ * @chainable
50
+ *
51
+ * @returns {Object} Added scraper.
52
+ */
53
+ var setScraper = function( scraper, type ) {
54
+ if ( config.debug && hasScraper( type ) ) {
55
+ console.warn( "Scraper for " + type + " already exists and will be overwritten." );
56
+ }
57
 
58
+ scrapers[ type ] = scraper;
59
 
60
+ return scraper;
61
  };
62
 
63
  /**
64
  * Returns the scraper object for a field type.
65
  * If there is no scraper object for this field type a no-op scraper is returned.
66
  *
67
+ * @param {string} type Type of scraper to fetch.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
  *
69
+ * @returns {Object} The scraper for the specified type.
 
70
  */
71
+ var getScraper = function( type ) {
72
+ if ( hasScraper( type ) ) {
73
+ return scrapers[ type ];
74
+ }
75
+
76
+ if ( type in scraperObjects ) {
77
+ return setScraper( new scraperObjects[ type ](), type );
78
+ }
79
+
80
+ // If we do not have a scraper just pass the fields through so it will be filtered out by the app.
81
+ return {
82
+ scrape: function( fields ) {
83
+ if ( config.debug ) {
84
+ console.warn( "No Scraper for field type: " + type );
85
+ }
86
+ return fields;
87
+ },
88
+ };
89
  };
90
 
91
  module.exports = {
92
+ setScraper: setScraper,
93
+ getScraper: getScraper,
94
+ };
 
 
js/src/scraper/scraper.email.js CHANGED
@@ -1,24 +1,19 @@
1
- var scrapers = require( "./../scraper-store.js" );
2
 
3
  var Scraper = function() {};
4
 
5
- Scraper.prototype.scrape = function(fields){
 
 
 
 
6
 
7
- var that = this;
8
 
9
- fields = _.map(fields, function(field){
10
-
11
- if(field.type !== 'email'){
12
- return field;
13
- }
14
-
15
- field.content = field.$el.find('input[type=email][id^=acf]').val();
16
-
17
- return field;
18
- });
19
-
20
- return fields;
21
 
 
22
  };
23
 
24
- module.exports = Scraper;
1
+ /* global _ */
2
 
3
  var Scraper = function() {};
4
 
5
+ Scraper.prototype.scrape = function( fields ) {
6
+ fields = _.map( fields, function( field ) {
7
+ if ( field.type !== "email" ) {
8
+ return field;
9
+ }
10
 
11
+ field.content = field.$el.find( "input[type=email][id^=acf]" ).val();
12
 
13
+ return field;
14
+ } );
 
 
 
 
 
 
 
 
 
 
15
 
16
+ return fields;
17
  };
18
 
19
+ module.exports = Scraper;
js/src/scraper/scraper.gallery.js CHANGED
@@ -1,48 +1,40 @@
 
 
1
  var attachmentCache = require( "./../cache/cache.attachments.js" );
2
- var scrapers = require( "./../scraper-store.js" );
3
 
4
  var Scraper = function() {};
5
 
6
- Scraper.prototype.scrape = function(fields){
7
-
8
- var that = this;
9
-
10
- var attachment_ids = [];
11
-
12
- fields = _.map(fields, function(field){
13
-
14
- if(field.type !== 'gallery'){
15
- return field;
16
- }
17
-
18
- field.content = '';
19
-
20
- field.$el.find('.acf-gallery-attachment input[type=hidden]').each( function (index, element){
21
-
22
- //TODO: Is this the best way to get the attachment id?
23
- var attachment_id = jQuery( this ).val();
24
-
25
- //Collect all attachment ids for cache refresh
26
- attachment_ids.push(attachment_id);
27
 
28
- //If we have the attachment data in the cache we can return a useful value
29
- if(attachmentCache.get(attachment_id, 'attachment')){
 
 
30
 
31
- var attachment = attachmentCache.get(attachment_id, 'attachment');
32
 
33
- field.content += '<img src="' + attachment.url + '" alt="' + attachment.alt + '" title="' + attachment.title + '">';
 
 
34
 
35
- }
 
36
 
37
- });
 
 
38
 
39
- return field;
40
- });
 
41
 
42
- attachmentCache.refresh(attachment_ids);
 
43
 
44
- return fields;
45
 
 
46
  };
47
 
48
- module.exports = Scraper;
1
+ /* global _, jQuery */
2
+
3
  var attachmentCache = require( "./../cache/cache.attachments.js" );
 
4
 
5
  var Scraper = function() {};
6
 
7
+ Scraper.prototype.scrape = function( fields ) {
8
+ var attachment_ids = [];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
 
10
+ fields = _.map( fields, function( field ) {
11
+ if ( field.type !== "gallery" ) {
12
+ return field;
13
+ }
14
 
15
+ field.content = "";
16
 
17
+ field.$el.find( ".acf-gallery-attachment input[type=hidden]" ).each( function() {
18
+ // TODO: Is this the best way to get the attachment id?
19
+ var attachment_id = jQuery( this ).val();
20
 
21
+ // Collect all attachment ids for cache refresh
22
+ attachment_ids.push( attachment_id );
23
 
24
+ // If we have the attachment data in the cache we can return a useful value
25
+ if ( attachmentCache.get( attachment_id, "attachment" ) ) {
26
+ var attachment = attachmentCache.get( attachment_id, "attachment" );
27
 
28
+ field.content += '<img src="' + attachment.url + '" alt="' + attachment.alt + '" title="' + attachment.title + '">';
29
+ }
30
+ } );
31
 
32
+ return field;
33
+ } );
34
 
35
+ attachmentCache.refresh( attachment_ids );
36
 
37
+ return fields;
38
  };
39
 
40
+ module.exports = Scraper;
js/src/scraper/scraper.image.js CHANGED
@@ -1,42 +1,36 @@
 
 
1
  var attachmentCache = require( "./../cache/cache.attachments.js" );
2
- var scrapers = require( "./../scraper-store.js" );
3
 
4
  var Scraper = function() {};
5
 
6
- Scraper.prototype.scrape = function(fields){
7
-
8
- var that = this;
9
-
10
- var attachment_ids = [];
11
-
12
- fields = _.map(fields, function(field){
13
-
14
- if(field.type !== 'image'){
15
- return field;
16
- }
17
-
18
- field.content = '';
19
-
20
- var attachment_id = field.$el.find('input[type=hidden]').val();
21
 
22
- attachment_ids.push(attachment_id);
 
 
 
23
 
24
- if(attachmentCache.get(attachment_id, 'attachment')){
25
 
26
- var attachment = attachmentCache.get(attachment_id, 'attachment');
27
 
28
- field.content += '<img src="' + attachment.url + '" alt="' + attachment.alt + '" title="' + attachment.title + '">';
29
 
30
- }
 
31
 
 
 
32
 
33
- return field;
34
- });
35
 
36
- attachmentCache.refresh(attachment_ids);
 
37
 
38
- return fields;
39
 
 
40
  };
41
 
42
- module.exports = Scraper;
1
+ /* global _ */
2
+
3
  var attachmentCache = require( "./../cache/cache.attachments.js" );
 
4
 
5
  var Scraper = function() {};
6
 
7
+ Scraper.prototype.scrape = function( fields ) {
8
+ var attachment_ids = [];
 
 
 
 
 
 
 
 
 
 
 
 
 
9
 
10
+ fields = _.map( fields, function( field ) {
11
+ if ( field.type !== "image" ) {
12
+ return field;
13
+ }
14
 
15
+ field.content = "";
16
 
17
+ var attachment_id = field.$el.find( "input[type=hidden]" ).val();
18
 
19
+ attachment_ids.push( attachment_id );
20
 
21
+ if ( attachmentCache.get( attachment_id, "attachment" ) ) {
22
+ var attachment = attachmentCache.get( attachment_id, "attachment" );
23
 
24
+ field.content += '<img src="' + attachment.url + '" alt="' + attachment.alt + '" title="' + attachment.title + '">';
25
+ }
26
 
 
 
27
 
28
+ return field;
29
+ } );
30
 
31
+ attachmentCache.refresh( attachment_ids );
32
 
33
+ return fields;
34
  };
35
 
36
+ module.exports = Scraper;
js/src/scraper/scraper.link.js ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* global _ */
2
+ require( "./../scraper-store.js" );
3
+
4
+ var Scraper = function() {};
5
+
6
+ /**
7
+ * Scraper for the link field type.
8
+ *
9
+ * @param {Object} fields Fields to parse.
10
+ *
11
+ * @returns {Object} Mapped list of fields.
12
+ */
13
+ Scraper.prototype.scrape = function( fields ) {
14
+ /**
15
+ * Set content for all link fields as a-tag with title, url and target.
16
+ * Return the fields object containing all fields.
17
+ */
18
+ return _.map( fields, function( field ) {
19
+ if ( field.type !== "link" ) {
20
+ return field;
21
+ }
22
+
23
+ var title = field.$el.find( "input[type=hidden].input-title" ).val(),
24
+ url = field.$el.find( "input[type=hidden].input-url" ).val(),
25
+ target = field.$el.find( "input[type=hidden].input-target" ).val();
26
+
27
+ field.content = "<a href=\"" + url + "\" target=\"" + target + "\">" + title + "</a>";
28
+
29
+ return field;
30
+ } );
31
+ };
32
+
33
+ module.exports = Scraper;
js/src/scraper/scraper.taxonomy.js CHANGED
@@ -1,66 +1,54 @@
1
- var scrapers = require( "./../scraper-store.js" );
2
- var helper = require( "./../helper.js" );
3
 
4
  var Scraper = function() {};
5
 
6
- Scraper.prototype.scrape = function(fields){
7
-
8
- var that = this;
9
-
10
- fields = _.map(fields, function(field){
11
-
12
- if(field.type !== 'taxonomy'){
13
- return field;
14
- }
15
-
16
- var terms = [];
17
-
18
- if( field.$el.find('.acf-taxonomy-field[data-type="multi_select"]').length > 0 ){
19
-
20
- var select2Target = (helper.acf_version >= 5.6)?'select':'input';
21
-
22
- terms = _.pluck(
23
- field.$el.find('.acf-taxonomy-field[data-type="multi_select"] ' + select2Target )
24
- .select2('data')
25
- , 'text'
26
- );
27
-
28
- }else if( field.$el.find('.acf-taxonomy-field[data-type="checkbox"]').length > 0 ){
29
-
30
- terms = _.pluck(
31
- field.$el.find('.acf-taxonomy-field[data-type="checkbox"] input[type="checkbox"]:checked')
32
- .next(),
33
- 'textContent'
34
- );
35
-
36
- }else if( field.$el.find('input[type=checkbox]:checked').length > 0 ){
37
-
38
- terms = _.pluck(
39
- field.$el.find('input[type=checkbox]:checked')
40
- .parent(),
41
- 'textContent'
42
- );
43
-
44
- }else if( field.$el.find('select option:checked').length > 0 ){
45
-
46
- terms = _.pluck(
47
- field.$el.find('select option:checked'),
48
- 'textContent'
49
- );
50
-
51
- }
52
-
53
- terms = _.map( terms, function(term){ return term.trim(); } );
54
-
55
- if(terms.length>0){
56
- field.content = '<ul>\n<li>' + terms.join('</li>\n<li>') + '</li>\n</ul>';
57
- }
58
-
59
- return field;
60
- });
61
-
62
- return fields;
63
-
64
  };
65
 
66
- module.exports = Scraper;
1
+ /* global _, acf */
 
2
 
3
  var Scraper = function() {};
4
 
5
+ Scraper.prototype.scrape = function( fields ) {
6
+ fields = _.map( fields, function( field ) {
7
+ if ( field.type !== "taxonomy" ) {
8
+ return field;
9
+ }
10
+
11
+ var terms = [];
12
+
13
+ if ( field.$el.find( '.acf-taxonomy-field[data-type="multi_select"]' ).length > 0 ) {
14
+ var select2Target = ( acf.select2.version >= 4 ) ? "select" : "input";
15
+
16
+ terms = _.pluck(
17
+ field.$el.find( '.acf-taxonomy-field[data-type="multi_select"] ' + select2Target )
18
+ .select2( "data" )
19
+ , "text"
20
+ );
21
+ } else if ( field.$el.find( '.acf-taxonomy-field[data-type="checkbox"]' ).length > 0 ) {
22
+ terms = _.pluck(
23
+ field.$el.find( '.acf-taxonomy-field[data-type="checkbox"] input[type="checkbox"]:checked' )
24
+ .next(),
25
+ "textContent"
26
+ );
27
+ } else if ( field.$el.find( "input[type=checkbox]:checked" ).length > 0 ) {
28
+ terms = _.pluck(
29
+ field.$el.find( "input[type=checkbox]:checked" )
30
+ .parent(),
31
+ "textContent"
32
+ );
33
+ } else if ( field.$el.find( "select option:checked" ).length > 0 ) {
34
+ terms = _.pluck(
35
+ field.$el.find( "select option:checked" ),
36
+ "textContent"
37
+ );
38
+ }
39
+
40
+ terms = _.map( terms, function( term ) {
41
+ return term.trim();
42
+ } );
43
+
44
+ if ( terms.length > 0 ) {
45
+ field.content = "<ul>\n<li>" + terms.join( "</li>\n<li>" ) + "</li>\n</ul>";
46
+ }
47
+
48
+ return field;
49
+ } );
50
+
51
+ return fields;
 
 
 
 
 
 
 
 
 
 
 
52
  };
53
 
54
+ module.exports = Scraper;
js/src/scraper/scraper.text.js CHANGED
@@ -1,59 +1,51 @@
 
 
1
  var config = require( "./../config/config.js" );
2
- var scrapers = require( "./../scraper-store.js" );
3
 
4
  var Scraper = function() {};
5
 
6
- Scraper.prototype.scrape = function(fields){
7
-
8
- var that = this;
9
-
10
- fields = _.map(fields, function(field){
11
-
12
- if(field.type !== 'text'){
13
- return field;
14
- }
15
-
16
- field.content = field.$el.find('input[type=text][id^=acf]').val();
17
 
18
- field = that.wrapInHeadline(field);
 
 
 
19
 
20
- return field;
21
- });
22
 
23
- return fields;
 
24
 
 
25
  };
26
 
27
- Scraper.prototype.wrapInHeadline = function(field){
 
 
 
 
28
 
29
- var level = this.isHeadline(field);
30
- if(level){
31
- field.content = '<h' + level + '>' + field.content + '</h' + level + '>';
32
- }
33
-
34
- return field;
35
  };
36
 
37
- Scraper.prototype.isHeadline = function(field){
38
-
39
- var level = false;
40
-
41
- var level = _.find(config.scraper.text.headlines, function(value, key){
42
- return field.key === key;
43
- });
44
-
45
- //It has to be an integer
46
- if(level){
47
- level = parseInt(level, 10);
48
- }
49
 
50
- //Headlines only exist from h1 to h6
51
- if(level<1 || level>6){
52
- level = false;
53
- }
54
 
55
- return level;
 
 
 
56
 
 
57
  };
58
 
59
- module.exports = Scraper;
1
+ /* global _ */
2
+
3
  var config = require( "./../config/config.js" );
 
4
 
5
  var Scraper = function() {};
6
 
7
+ Scraper.prototype.scrape = function( fields ) {
8
+ var that = this;
 
 
 
 
 
 
 
 
 
9
 
10
+ fields = _.map( fields, function( field ) {
11
+ if ( field.type !== "text" ) {
12
+ return field;
13
+ }
14
 
15
+ field.content = field.$el.find( "input[type=text][id^=acf]" ).val();
16
+ field = that.wrapInHeadline( field );
17
 
18
+ return field;
19
+ } );
20
 
21
+ return fields;
22
  };
23
 
24
+ Scraper.prototype.wrapInHeadline = function( field ) {
25
+ var level = this.isHeadline( field );
26
+ if ( level ) {
27
+ field.content = "<h" + level + ">" + field.content + "</h" + level + ">";
28
+ }
29
 
30
+ return field;
 
 
 
 
 
31
  };
32
 
33
+ Scraper.prototype.isHeadline = function( field ) {
34
+ var level = _.find( config.scraper.text.headlines, function( value, key ) {
35
+ return field.key === key;
36
+ } );
 
 
 
 
 
 
 
 
37
 
38
+ // It has to be an integer
39
+ if ( level ) {
40
+ level = parseInt( level, 10 );
41
+ }
42
 
43
+ // Headlines only exist from h1 to h6
44
+ if ( level < 1 || level > 6 ) {
45
+ level = false;
46
+ }
47
 
48
+ return level;
49
  };
50
 
51
+ module.exports = Scraper;
js/src/scraper/scraper.textarea.js CHANGED
@@ -1,24 +1,19 @@
1
- var scrapers = require( "./../scraper-store.js" );
2
 
3
  var Scraper = function() {};
4
 
5
- Scraper.prototype.scrape = function(fields){
 
 
 
 
6
 
7
- var that = this;
8
 
9
- fields = _.map(fields, function(field){
10
-
11
- if(field.type !== 'textarea'){
12
- return field;
13
- }
14
-
15
- field.content = field.$el.find('textarea[id^=acf]').val();
16
-
17
- return field;
18
- });
19
-
20
- return fields;
21
 
 
22
  };
23
 
24
- module.exports = Scraper;
1
+ /* global _ */
2
 
3
  var Scraper = function() {};
4
 
5
+ Scraper.prototype.scrape = function( fields ) {
6
+ fields = _.map( fields, function( field ) {
7
+ if ( field.type !== "textarea" ) {
8
+ return field;
9
+ }
10
 
11
+ field.content = field.$el.find( "textarea[id^=acf]" ).val();
12
 
13
+ return field;
14
+ } );
 
 
 
 
 
 
 
 
 
 
15
 
16
+ return fields;
17
  };
18
 
19
+ module.exports = Scraper;
js/src/scraper/scraper.url.js CHANGED
@@ -1,24 +1,19 @@
1
- var scrapers = require( "./../scraper-store.js" );
2
 
3
  var Scraper = function() {};
4
 
5
- Scraper.prototype.scrape = function(fields){
 
 
 
 
6
 
7
- var that = this;
8
 
9
- fields = _.map(fields, function(field){
10
-
11
- if(field.type !== 'url'){
12
- return field;
13
- }
14
-
15
- field.content = field.$el.find('input[type=url][id^=acf]').val();
16
-
17
- return field;
18
- });
19
-
20
- return fields;
21
 
 
22
  };
23
 
24
- module.exports = Scraper;
1
+ /* global _ */
2
 
3
  var Scraper = function() {};
4
 
5
+ Scraper.prototype.scrape = function( fields ) {
6
+ fields = _.map( fields, function( field ) {
7
+ if ( field.type !== "url" ) {
8
+ return field;
9
+ }
10
 
11
+ field.content = field.$el.find( "input[type=url][id^=acf]" ).val();
12
 
13
+ return field;
14
+ } );
 
 
 
 
 
 
 
 
 
 
15
 
16
+ return fields;
17
  };
18
 
19
+ module.exports = Scraper;
js/src/scraper/scraper.wysiwyg.js CHANGED
@@ -1,62 +1,57 @@
1
- var scrapers = require( "./../scraper-store.js" );
2
 
3
  var Scraper = function() {};
4
 
5
- Scraper.prototype.scrape = function(fields){
6
-
7
- var that = this;
8
-
9
- fields = _.map(fields, function(field){
10
-
11
- if(field.type !== 'wysiwyg'){
12
- return field;
13
- }
14
-
15
- field.content = getContentTinyMCE(field);
16
-
17
- return field;
18
- });
19
-
20
- return fields;
21
-
22
  };
23
 
24
  /**
25
  * Adapted from wp-seo-shortcode-plugin-305.js:115-126
26
  *
27
- * @returns {string}
 
 
28
  */
29
- var getContentTinyMCE = function(field) {
30
- var textarea = field.$el.find('textarea')[0];
 
 
31
 
32
- var editorID = textarea.id;
 
 
33
 
34
- var val = textarea.value;
 
35
 
36
- if ( isTinyMCEAvailable(editorID) ) {
37
- val = tinyMCE.get( editorID ) && tinyMCE.get( editorID ).getContent() || '';
38
- }
 
 
39
 
40
- return val;
41
- };
42
 
43
- /**
44
- * Adapted from wp-seo-post-scraper-plugin-310.js:196-210
45
- *
46
- *
47
- * @param editorID
48
- * @returns {boolean}
49
- */
50
- var isTinyMCEAvailable = function(editorID) {
51
- if ( typeof tinyMCE === 'undefined' ||
52
- typeof tinyMCE.editors === 'undefined' ||
53
- tinyMCE.editors.length === 0 ||
54
- tinyMCE.get( editorID ) === null ||
55
- tinyMCE.get( editorID ).isHidden() ) {
56
- return false;
57
- }
58
-
59
- return true;
60
  };
61
 
62
- module.exports = Scraper;
1
+ /* global tinyMCE, _ */
2
 
3
  var Scraper = function() {};
4
 
5
+ /**
6
+ * Adapted from wp-seo-post-scraper-plugin-310.js:196-210
7
+ *
8
+ * @param {string} editorID TinyMCE identifier to look up.
9
+ *
10
+ * @returns {boolean} True if an editor exists for the supplied ID.
11
+ */
12
+ var isTinyMCEAvailable = function( editorID ) {
13
+ if ( typeof tinyMCE === "undefined" ||
14
+ typeof tinyMCE.editors === "undefined" ||
15
+ tinyMCE.editors.length === 0 ||
16
+ tinyMCE.get( editorID ) === null ||
17
+ tinyMCE.get( editorID ).isHidden() ) {
18
+ return false;
19
+ }
20
+
21
+ return true;
22
  };
23
 
24
  /**
25
  * Adapted from wp-seo-shortcode-plugin-305.js:115-126
26
  *
27
+ * @param {Object} field Field to get the content for.
28
+ *
29
+ * @returns {string} The content of the field.
30
  */
31
+ var getContentTinyMCE = function( field ) {
32
+ var textarea = field.$el.find( "textarea" )[ 0 ];
33
+ var editorID = textarea.id;
34
+ var val = textarea.value;
35
 
36
+ if ( isTinyMCEAvailable( editorID ) ) {
37
+ val = tinyMCE.get( editorID ) && tinyMCE.get( editorID ).getContent() || "";
38
+ }
39
 
40
+ return val;
41
+ };
42
 
43
+ Scraper.prototype.scrape = function( fields ) {
44
+ fields = _.map( fields, function( field ) {
45
+ if ( field.type !== "wysiwyg" ) {
46
+ return field;
47
+ }
48
 
49
+ field.content = getContentTinyMCE( field );
 
50
 
51
+ return field;
52
+ } );
53
+
54
+ return fields;
 
 
 
 
 
 
 
 
 
 
 
 
 
55
  };
56
 
57
+ module.exports = Scraper;
js/yoast-acf-analysis.js CHANGED
@@ -1,5 +1,5 @@
1
  (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
2
- /* global YoastSEO */
3
  var config = require( "./config/config.js" );
4
  var helper = require( "./helper.js" );
5
  var collect = require( "./collect/collect.js" );
@@ -7,81 +7,82 @@ var replaceVars = require( "./replacevars.js" );
7
 
8
  var analysisTimeout = 0;
9
 
10
- var App = function(){
 
11
 
12
- YoastSEO.app.registerPlugin(config.pluginName, {status: 'ready'});
13
-
14
- YoastSEO.app.registerModification('content', collect.append.bind(collect), config.pluginName);
15
-
16
- this.bindListeners();
17
 
 
18
  };
19
 
20
- App.prototype.bindListeners = function(){
21
-
22
- var _self = this;
23
-
24
- if(helper.acf_version >= 5){
25
-
26
- jQuery(function(){
27
-
28
- replaceVars.updateReplaceVars(collect);
29
-
30
- acf.add_action('change remove append sortstop', _self.maybeRefresh);
31
- acf.add_action('change remove append sortstop', replaceVars.updateReplaceVars.bind(_self, collect));
32
-
33
- });
34
-
35
- }else{
36
-
37
- var fieldSelectors = config.fieldSelectors.slice(0);
38
- var wysiwygSelector = 'textarea[id^=wysiwyg-acf]';
39
-
40
- // Ignore Wysiwyg fields because they trigger a refresh in Yoast SEO itself
41
- fieldSelectorsWithoutWysiwyg = _.without(fieldSelectors, wysiwygSelector);
42
-
43
- jQuery(document).on('acf/setup_fields', function(){
44
-
45
- replaceVars.updateReplaceVars(collect);
46
-
47
- var fieldsWithoutWysiwyg = jQuery('#post-body, #edittag').find(fieldSelectorsWithoutWysiwyg.join(','));
48
- var fields = jQuery('#post-body, #edittag').find(fieldSelectors.join(','));
49
 
50
- fieldsWithoutWysiwyg.on('change', _self.maybeRefresh.bind(_self) );
51
- // Do not ignore Wysiwyg fields for the purpose of Replace Vars.
52
- fields.on('change', replaceVars.updateReplaceVars.bind(_self, collect));
53
 
54
- if (YoastSEO.wp._tinyMCEHelper) {
 
 
55
 
56
- jQuery(wysiwygSelector).each( function () {
57
- YoastSEO.wp._tinyMCEHelper.addEventHandler(this.id, [ 'input', 'change', 'cut', 'paste' ],
58
- replaceVars.updateReplaceVars.bind(_self, collect));
59
- });
 
 
60
 
61
- }
 
 
62
 
63
- //Also refresh on media close as attachment data might have changed
64
- wp.media.frame.on('close', _self.maybeRefresh.bind(_self) );
65
- });
 
 
 
 
66
 
67
- }
 
68
  };
69
 
70
- App.prototype.maybeRefresh = function(){
 
 
 
 
 
71
 
72
- if ( analysisTimeout ) {
73
- window.clearTimeout(analysisTimeout);
74
- }
75
 
76
- analysisTimeout = window.setTimeout( function() {
 
 
77
 
78
- if(config.debug){
79
- console.log('Recalculate...' + new Date() + '(Internal)');
80
- }
 
81
 
82
- YoastSEO.app.pluginReloaded(config.pluginName);
83
- }, config.refreshRate );
 
 
84
 
 
 
85
  };
86
 
87
  module.exports = App;
@@ -90,317 +91,289 @@ module.exports = App;
90
  /* global _ */
91
  var cache = require( "./cache.js" );
92
 
93
- var refresh = function(attachment_ids){
94
-
95
- var uncached = cache.getUncached(attachment_ids, 'attachment');
96
-
97
- if (uncached.length === 0){
98
- return;
99
- }
100
 
101
- window.wp.ajax.post('query-attachments', {
102
- 'query': {
103
- 'post__in': uncached
104
- }
105
- }).done(function (attachments) {
106
-
107
- _.each(attachments, function (attachment) {
108
- cache.set(attachment.id, attachment, 'attachment');
109
- YoastACFAnalysis.maybeRefresh();
110
- });
111
-
112
- });
113
 
 
 
 
 
 
 
 
 
 
 
114
  };
115
 
116
- var get = function( id ){
117
-
118
- var attachment = cache.get(id, 'attachment');
119
 
120
- if(!attachment) return false;
 
 
121
 
122
- var changedAttachment = wp.media.attachment( id );
123
 
124
- if( changedAttachment.has('alt') ){
125
- attachment.alt = changedAttachment.get('alt');
126
- }
127
 
128
- if( changedAttachment.has('title') ){
129
- attachment.title = changedAttachment.get('title');
130
- }
131
 
132
- return attachment;
133
  };
134
 
135
  module.exports = {
136
- refresh: refresh,
137
- get: get
138
  };
 
139
  },{"./cache.js":3}],3:[function(require,module,exports){
140
  /* global _ */
141
  var Cache = function() {
142
- this.clear('all');
143
  };
144
 
145
  var _cache;
146
 
147
  Cache.prototype.set = function( id, value, store ) {
 
148
 
149
- store = typeof store !== 'undefined' ? store : 'default';
150
-
151
- if( !(store in _cache) ){
152
- _cache[store] = {};
153
- }
154
 
155
- _cache[ store ][ id ] = value;
156
  };
157
 
158
- Cache.prototype.get = function( id, store ){
159
-
160
- store = typeof store !== 'undefined' ? store : 'default';
161
 
162
- if ( store in _cache && id in _cache[ store ] ) {
163
- return _cache[ store ][ id ];
164
- }else{
165
- return false;
166
- }
167
 
 
168
  };
169
 
170
- Cache.prototype.getUncached = function(ids, store){
 
171
 
172
- store = typeof store !== 'undefined' ? store : 'default';
173
 
174
- var that = this;
175
 
176
- ids = _.uniq(ids);
177
-
178
- return ids.filter(function(id){
179
- var value = that.get(id, store);
180
- return value === false;
181
- });
182
 
 
 
183
  };
184
 
185
- Cache.prototype.clear = function(store){
186
-
187
- store = typeof store !== 'undefined' ? store : 'default';
188
-
189
- if(store === 'all'){
190
- _cache = {};
191
- }else{
192
- _cache[store] = {};
193
- }
194
 
 
 
 
 
 
195
  };
196
 
197
  module.exports = new Cache();
 
198
  },{}],4:[function(require,module,exports){
 
 
199
  var config = require( "./../config/config.js" );
200
  var fieldSelectors = config.fieldSelectors;
201
 
202
  var field_data = [];
203
 
204
- var fields = jQuery('#post-body, #edittag').find(fieldSelectors.join(','));
205
-
206
- fields.each(function() {
207
 
208
- var $el = jQuery(this).parents('.field').last();
 
209
 
210
- field_data.push({
211
- $el : $el,
212
- key : $el.data('field_key'),
213
- name : $el.data('field_name'),
214
- type : $el.data('field_type'),
215
- post_meta_key : $el.data('field_name')
216
- });
217
-
218
- });
219
 
220
  module.exports = field_data;
221
- },{"./../config/config.js":7}],5:[function(require,module,exports){
222
- module.exports = function(){
223
-
224
- var outerFieldsName = [
225
- 'flexible_content',
226
- 'repeater',
227
- 'group'
228
- ];
229
-
230
- var innerFields = [];
231
- var outerFields = [];
232
-
233
- var fields = _.map(acf.get_fields(), function(field){
234
-
235
- var field_data = jQuery.extend( true, {}, acf.get_data(jQuery(field)) );
236
- field_data.$el = jQuery(field);
237
- field_data.post_meta_key = field_data.name;
238
-
239
- // Collect nested and parent
240
- if( outerFieldsName.indexOf(field_data.type) === -1 ) {
241
- innerFields.push(field_data);
242
- }else{
243
- outerFields.push(field_data);
244
- }
245
-
246
- return field_data;
247
-
248
- });
249
-
250
- if( outerFields.length === 0){
251
- return fields;
252
- }
253
-
254
- // Transform field names for nested fields.
255
- _.each(innerFields, function(inner){
256
-
257
- _.each(outerFields, function(outer){
258
-
259
- if (jQuery.contains(outer.$el[0], inner.$el[0])) {
260
-
261
- // Types that hold multiple children.
262
- if (outer.type === 'flexible_content' || outer.type === 'repeater'){
263
-
264
- outer.children = outer.children || [];
265
- outer.children.push(inner);
266
- inner.parent = outer;
267
- inner.post_meta_key = outer.name + '_' + (outer.children.length - 1) + '_' + inner.name;
268
-
269
- }
270
-
271
- // Types that hold single children.
272
- if (outer.type === 'group') {
273
-
274
- outer.children = [inner];
275
- inner.parent = outer;
276
- inner.post_meta_key = outer.name + '_' + inner.name;
277
-
278
- }
279
-
280
- }
281
-
282
- });
283
-
284
- });
285
-
286
- return fields;
287
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
288
  };
289
 
290
  },{}],6:[function(require,module,exports){
291
- /* global acf, _ */
292
 
293
  var config = require( "./../config/config.js" );
294
  var helper = require( "./../helper.js" );
295
  var scraper_store = require( "./../scraper-store.js" );
296
 
297
- var Collect = function(){
298
 
299
  };
300
 
301
- Collect.prototype.getFieldData = function () {
302
- var field_data = this.filterBroken(this.filterBlacklistName(this.filterBlacklistType(this.getData())));
303
-
304
- var used_types = _.uniq(_.pluck(field_data, 'type'));
305
-
306
- if(config.debug) {
307
 
308
- console.log('Used types:');
309
- console.log(used_types);
310
 
311
- }
 
 
 
312
 
313
- _.each(used_types, function(type){
314
- field_data = scraper_store.getScraper(type).scrape(field_data);
315
- });
316
 
317
- return field_data;
318
  };
319
 
320
- Collect.prototype.append = function(data){
321
-
322
- if(config.debug){
323
- console.log('Recalculate...' + new Date());
324
- }
325
-
326
- var field_data = this.getFieldData();
327
-
328
- _.each(field_data, function(field){
329
 
330
- if(typeof field.content !== 'undefined' && field.content !== ''){
331
- data += '\n' + field.content;
332
- }
333
 
334
- });
 
 
 
 
335
 
336
- if(config.debug){
337
- console.log('Field data:');
338
- console.table(field_data);
339
 
340
- console.log('Data:');
341
- console.log(data);
342
- }
343
-
344
- return data;
345
 
 
346
  };
347
 
348
- Collect.prototype.getData = function(){
349
-
350
- if(helper.acf_version >= 5){
351
- return require( "./collect-v5.js" )();
352
- }else{
353
- return require( "./collect-v4.js" );
354
- }
355
-
356
  };
357
 
358
- Collect.prototype.filterBlacklistType = function(field_data){
359
- return _.filter(field_data, function(field){
360
- return !_.contains(config.blacklistType, field.type);
361
- });
362
  };
363
 
364
- Collect.prototype.filterBlacklistName = function(field_data){
365
- return _.filter(field_data, function(field){
366
- return !_.contains(config.blacklistName, field.name);
367
- });
368
  };
369
 
370
- Collect.prototype.filterBroken = function(field_data){
371
- return _.filter(field_data, function(field){
372
- return ('key' in field);
373
- });
374
  };
375
 
376
  module.exports = new Collect();
377
 
378
  },{"./../config/config.js":7,"./../helper.js":8,"./../scraper-store.js":11,"./collect-v4.js":4,"./collect-v5.js":5}],7:[function(require,module,exports){
 
379
  module.exports = YoastACFAnalysisConfig;
 
380
  },{}],8:[function(require,module,exports){
381
  var config = require( "./config/config.js" );
382
 
383
  module.exports = {
384
- acf_version: parseFloat(config.acfVersion, 10)
385
  };
 
386
  },{"./config/config.js":7}],9:[function(require,module,exports){
387
- /* global jQuery, YoastACFAnalysis: true */
 
388
 
389
  var App = require( "./app.js" );
390
 
391
- (function($) {
392
-
393
- $(document).ready(function() {
 
 
 
 
394
 
395
- if( "undefined" !== typeof YoastSEO){
396
-
397
- YoastACFAnalysis = new App();
398
-
399
- }
400
-
401
- });
402
-
403
- }(jQuery));
404
  },{"./app.js":1}],10:[function(require,module,exports){
405
  /* global _, jQuery, YoastSEO, YoastReplaceVarPlugin */
406
 
@@ -408,504 +381,496 @@ var config = require( "./config/config.js" );
408
 
409
  var ReplaceVar = YoastReplaceVarPlugin.ReplaceVar;
410
 
411
- var supportedTypes = ['email', 'text', 'textarea', 'url', 'wysiwyg'];
412
 
413
  var replaceVars = {};
414
 
415
- var replaceVarPluginAvailable = function(){
416
- if (ReplaceVar === undefined) {
417
- if (config.debug) {
418
- console.log('Replacing ACF variables in the Snippet Window requires Yoast SEO >= 5.3.');
419
- }
420
- return false;
421
- }
422
- return true;
423
- };
424
-
425
- var updateReplaceVars = function (collect) {
426
- if (!replaceVarPluginAvailable()) {
427
- return;
428
- }
429
 
430
- var fieldData = _.filter(collect.getFieldData(), function (field) { return _.contains(supportedTypes, field.type) });
 
431
 
432
- _.each(fieldData, function(field) {
433
- // Remove HTML tags using jQuery in case of a wysiwyg field.
434
- var content = (field.type === 'wysiwyg') ? jQuery(jQuery.parseHTML(field.content)).text() : field.content;
435
-
436
- if(replaceVars[field.post_meta_key]===undefined){
437
-
438
- replaceVars[field.post_meta_key] = new ReplaceVar( '%%cf_'+field.post_meta_key+'%%', content, { source: 'direct' } );
439
- YoastSEO.wp.replaceVarsPlugin.addReplacement( replaceVars[field.post_meta_key] );
440
 
441
- if (config.debug) {
442
- console.log("Created ReplaceVar for: ", field.post_meta_key, " with: ", content, replaceVars[field.post_meta_key]);
443
- }
 
444
 
445
- }else{
 
 
446
 
447
- replaceVars[field.post_meta_key].replacement = content;
 
 
448
 
449
- if (config.debug) {
450
- console.log("Updated ReplaceVar for: ", field.post_meta_key, " with: ", content, replaceVars[field.post_meta_key]);
451
- }
452
 
453
- }
 
 
 
 
454
 
455
- });
 
 
 
 
456
  };
457
 
458
  module.exports = {
459
- updateReplaceVars: updateReplaceVars
460
  };
461
 
462
  },{"./config/config.js":7}],11:[function(require,module,exports){
463
- /* global _ */
464
  var config = require( "./config/config.js" );
465
 
466
  var scraperObjects = {
 
 
 
 
 
 
467
 
468
- //Basic
469
- 'text': require( "./scraper/scraper.text.js" ),
470
- 'textarea': require( "./scraper/scraper.textarea.js" ),
471
- 'email': require( "./scraper/scraper.email.js" ),
472
- 'url': require( "./scraper/scraper.url.js" ),
473
-
474
- //Content
475
- 'wysiwyg': require( "./scraper/scraper.wysiwyg.js" ),
476
- //TODO: Add oembed handler
477
- 'image': require( "./scraper/scraper.image.js" ),
478
- 'gallery': require( "./scraper/scraper.gallery.js" ),
479
 
480
- //Choice
481
- //TODO: select, checkbox, radio
482
 
483
- //Relational
484
- 'taxonomy': require( "./scraper/scraper.taxonomy.js" )
485
 
486
- //jQuery
487
- //TODO: google_map, date_picker, color_picker
488
 
489
  };
490
 
491
  var scrapers = {};
492
 
493
  /**
494
- * Set a scraper object on the store. Existing scrapers will be overwritten.
 
 
495
  *
496
- * @param {Object} scraper
497
- * @param {string} type
498
  */
499
- var setScraper = function(scraper, type){
 
 
 
 
500
 
501
- if(config.debug && hasScraper(type)){
502
- console.warn('Scraper for "' + type + '" already exists and will be overwritten.' );
503
- }
 
 
 
 
 
 
 
 
 
 
 
504
 
505
- scrapers[type] = scraper;
506
 
507
- return scraper;
508
  };
509
 
510
  /**
511
  * Returns the scraper object for a field type.
512
  * If there is no scraper object for this field type a no-op scraper is returned.
513
  *
514
- * @param {string} type
515
- * @returns {Object}
516
- */
517
- var getScraper = function(type){
518
-
519
- if(hasScraper(type)){
520
- return scrapers[type];
521
- }else if(type in scraperObjects){
522
- return setScraper(new scraperObjects[type](), type);
523
- }else{
524
- //If we do not have a scraper just pass the fields through so it will be filtered out by the app.
525
- return {
526
- scrape: function(fields){
527
- if(config.debug){
528
- console.warn('No Scraper for field type: ' + type );
529
- }
530
- return fields;
531
- }
532
- };
533
- }
534
- }
535
-
536
- /**
537
- * Checks if there already is a scraper for a field type in the store.
538
  *
539
- * @param {string} type
540
- * @returns {boolean}
541
  */
542
- var hasScraper = function(type){
543
-
544
- return (type in scrapers);
545
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
546
  };
547
 
548
  module.exports = {
549
-
550
- setScraper: setScraper,
551
- getScraper: getScraper
552
-
553
  };
554
- },{"./config/config.js":7,"./scraper/scraper.email.js":12,"./scraper/scraper.gallery.js":13,"./scraper/scraper.image.js":14,"./scraper/scraper.taxonomy.js":15,"./scraper/scraper.text.js":16,"./scraper/scraper.textarea.js":17,"./scraper/scraper.url.js":18,"./scraper/scraper.wysiwyg.js":19}],12:[function(require,module,exports){
555
- var scrapers = require( "./../scraper-store.js" );
556
-
557
- var Scraper = function() {};
558
-
559
- Scraper.prototype.scrape = function(fields){
560
-
561
- var that = this;
562
 
563
- fields = _.map(fields, function(field){
 
564
 
565
- if(field.type !== 'email'){
566
- return field;
567
- }
568
 
569
- field.content = field.$el.find('input[type=email][id^=acf]').val();
 
 
 
 
570
 
571
- return field;
572
- });
573
 
574
- return fields;
 
575
 
 
576
  };
577
 
578
  module.exports = Scraper;
579
- },{"./../scraper-store.js":11}],13:[function(require,module,exports){
580
- var attachmentCache = require( "./../cache/cache.attachments.js" );
581
- var scrapers = require( "./../scraper-store.js" );
582
 
583
- var Scraper = function() {};
584
-
585
- Scraper.prototype.scrape = function(fields){
586
-
587
- var that = this;
588
-
589
- var attachment_ids = [];
590
-
591
- fields = _.map(fields, function(field){
592
-
593
- if(field.type !== 'gallery'){
594
- return field;
595
- }
596
 
597
- field.content = '';
598
-
599
- field.$el.find('.acf-gallery-attachment input[type=hidden]').each( function (index, element){
600
 
601
- //TODO: Is this the best way to get the attachment id?
602
- var attachment_id = jQuery( this ).val();
603
 
604
- //Collect all attachment ids for cache refresh
605
- attachment_ids.push(attachment_id);
606
 
607
- //If we have the attachment data in the cache we can return a useful value
608
- if(attachmentCache.get(attachment_id, 'attachment')){
 
 
609
 
610
- var attachment = attachmentCache.get(attachment_id, 'attachment');
611
 
612
- field.content += '<img src="' + attachment.url + '" alt="' + attachment.alt + '" title="' + attachment.title + '">';
 
 
613
 
614
- }
 
615
 
616
- });
 
 
617
 
618
- return field;
619
- });
 
620
 
621
- attachmentCache.refresh(attachment_ids);
 
622
 
623
- return fields;
624
 
 
625
  };
626
 
627
  module.exports = Scraper;
628
- },{"./../cache/cache.attachments.js":2,"./../scraper-store.js":11}],14:[function(require,module,exports){
629
- var attachmentCache = require( "./../cache/cache.attachments.js" );
630
- var scrapers = require( "./../scraper-store.js" );
631
-
632
- var Scraper = function() {};
633
 
634
- Scraper.prototype.scrape = function(fields){
635
-
636
- var that = this;
637
-
638
- var attachment_ids = [];
639
-
640
- fields = _.map(fields, function(field){
641
 
642
- if(field.type !== 'image'){
643
- return field;
644
- }
645
 
646
- field.content = '';
647
 
648
- var attachment_id = field.$el.find('input[type=hidden]').val();
 
649
 
650
- attachment_ids.push(attachment_id);
 
 
 
651
 
652
- if(attachmentCache.get(attachment_id, 'attachment')){
653
 
654
- var attachment = attachmentCache.get(attachment_id, 'attachment');
655
 
656
- field.content += '<img src="' + attachment.url + '" alt="' + attachment.alt + '" title="' + attachment.title + '">';
657
 
658
- }
 
659
 
 
 
660
 
661
- return field;
662
- });
663
 
664
- attachmentCache.refresh(attachment_ids);
 
665
 
666
- return fields;
667
 
 
668
  };
669
 
670
  module.exports = Scraper;
671
- },{"./../cache/cache.attachments.js":2,"./../scraper-store.js":11}],15:[function(require,module,exports){
672
- var scrapers = require( "./../scraper-store.js" );
673
- var helper = require( "./../helper.js" );
674
-
675
- var Scraper = function() {};
676
-
677
- Scraper.prototype.scrape = function(fields){
678
-
679
- var that = this;
680
-
681
- fields = _.map(fields, function(field){
682
 
683
- if(field.type !== 'taxonomy'){
684
- return field;
685
- }
686
-
687
- var terms = [];
688
-
689
- if( field.$el.find('.acf-taxonomy-field[data-type="multi_select"]').length > 0 ){
690
-
691
- var select2Target = (helper.acf_version >= 5.6)?'select':'input';
692
-
693
- terms = _.pluck(
694
- field.$el.find('.acf-taxonomy-field[data-type="multi_select"] ' + select2Target )
695
- .select2('data')
696
- , 'text'
697
- );
698
-
699
- }else if( field.$el.find('.acf-taxonomy-field[data-type="checkbox"]').length > 0 ){
700
-
701
- terms = _.pluck(
702
- field.$el.find('.acf-taxonomy-field[data-type="checkbox"] input[type="checkbox"]:checked')
703
- .next(),
704
- 'textContent'
705
- );
706
-
707
- }else if( field.$el.find('input[type=checkbox]:checked').length > 0 ){
708
 
709
- terms = _.pluck(
710
- field.$el.find('input[type=checkbox]:checked')
711
- .parent(),
712
- 'textContent'
713
- );
714
 
715
- }else if( field.$el.find('select option:checked').length > 0 ){
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
716
 
717
- terms = _.pluck(
718
- field.$el.find('select option:checked'),
719
- 'textContent'
720
- );
721
 
722
- }
723
 
724
- terms = _.map( terms, function(term){ return term.trim(); } );
 
 
725
 
726
- if(terms.length>0){
727
- field.content = '<ul>\n<li>' + terms.join('</li>\n<li>') + '</li>\n</ul>';
728
- }
729
 
730
- return field;
731
- });
732
 
733
- return fields;
734
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
735
  };
736
 
737
  module.exports = Scraper;
738
- },{"./../helper.js":8,"./../scraper-store.js":11}],16:[function(require,module,exports){
739
- var config = require( "./../config/config.js" );
740
- var scrapers = require( "./../scraper-store.js" );
741
-
742
- var Scraper = function() {};
743
-
744
- Scraper.prototype.scrape = function(fields){
745
 
746
- var that = this;
 
747
 
748
- fields = _.map(fields, function(field){
749
 
750
- if(field.type !== 'text'){
751
- return field;
752
- }
753
 
754
- field.content = field.$el.find('input[type=text][id^=acf]').val();
 
755
 
756
- field = that.wrapInHeadline(field);
 
 
 
757
 
758
- return field;
759
- });
760
 
761
- return fields;
 
762
 
 
763
  };
764
 
765
- Scraper.prototype.wrapInHeadline = function(field){
766
-
767
- var level = this.isHeadline(field);
768
- if(level){
769
- field.content = '<h' + level + '>' + field.content + '</h' + level + '>';
770
- }
771
 
772
- return field;
773
  };
774
 
775
- Scraper.prototype.isHeadline = function(field){
 
 
 
776
 
777
- var level = false;
 
 
 
778
 
779
- var level = _.find(config.scraper.text.headlines, function(value, key){
780
- return field.key === key;
781
- });
782
-
783
- //It has to be an integer
784
- if(level){
785
- level = parseInt(level, 10);
786
- }
787
-
788
- //Headlines only exist from h1 to h6
789
- if(level<1 || level>6){
790
- level = false;
791
- }
792
-
793
- return level;
794
 
 
795
  };
796
 
797
  module.exports = Scraper;
798
- },{"./../config/config.js":7,"./../scraper-store.js":11}],17:[function(require,module,exports){
799
- var scrapers = require( "./../scraper-store.js" );
800
-
801
- var Scraper = function() {};
802
-
803
- Scraper.prototype.scrape = function(fields){
804
 
805
- var that = this;
806
-
807
- fields = _.map(fields, function(field){
808
 
809
- if(field.type !== 'textarea'){
810
- return field;
811
- }
812
 
813
- field.content = field.$el.find('textarea[id^=acf]').val();
 
 
 
 
814
 
815
- return field;
816
- });
817
 
818
- return fields;
 
819
 
 
820
  };
821
 
822
  module.exports = Scraper;
823
- },{"./../scraper-store.js":11}],18:[function(require,module,exports){
824
- var scrapers = require( "./../scraper-store.js" );
825
-
826
- var Scraper = function() {};
827
-
828
- Scraper.prototype.scrape = function(fields){
829
 
830
- var that = this;
831
-
832
- fields = _.map(fields, function(field){
833
 
834
- if(field.type !== 'url'){
835
- return field;
836
- }
837
 
838
- field.content = field.$el.find('input[type=url][id^=acf]').val();
 
 
 
 
839
 
840
- return field;
841
- });
842
 
843
- return fields;
 
844
 
 
845
  };
846
 
847
  module.exports = Scraper;
848
- },{"./../scraper-store.js":11}],19:[function(require,module,exports){
849
- var scrapers = require( "./../scraper-store.js" );
850
-
851
- var Scraper = function() {};
852
-
853
- Scraper.prototype.scrape = function(fields){
854
 
855
- var that = this;
 
856
 
857
- fields = _.map(fields, function(field){
858
-
859
- if(field.type !== 'wysiwyg'){
860
- return field;
861
- }
862
-
863
- field.content = getContentTinyMCE(field);
864
-
865
- return field;
866
- });
867
 
868
- return fields;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
869
 
 
870
  };
871
 
872
  /**
873
  * Adapted from wp-seo-shortcode-plugin-305.js:115-126
874
  *
875
- * @returns {string}
 
 
876
  */
877
- var getContentTinyMCE = function(field) {
878
- var textarea = field.$el.find('textarea')[0];
 
 
879
 
880
- var editorID = textarea.id;
 
 
881
 
882
- var val = textarea.value;
 
883
 
884
- if ( isTinyMCEAvailable(editorID) ) {
885
- val = tinyMCE.get( editorID ) && tinyMCE.get( editorID ).getContent() || '';
886
- }
 
 
887
 
888
- return val;
889
- };
890
 
891
- /**
892
- * Adapted from wp-seo-post-scraper-plugin-310.js:196-210
893
- *
894
- *
895
- * @param editorID
896
- * @returns {boolean}
897
- */
898
- var isTinyMCEAvailable = function(editorID) {
899
- if ( typeof tinyMCE === 'undefined' ||
900
- typeof tinyMCE.editors === 'undefined' ||
901
- tinyMCE.editors.length === 0 ||
902
- tinyMCE.get( editorID ) === null ||
903
- tinyMCE.get( editorID ).isHidden() ) {
904
- return false;
905
- }
906
 
907
- return true;
908
  };
909
 
910
  module.exports = Scraper;
911
- },{"./../scraper-store.js":11}]},{},[9]);
 
1
  (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
2
+ /* global YoastSEO, acf, _, jQuery, wp */
3
  var config = require( "./config/config.js" );
4
  var helper = require( "./helper.js" );
5
  var collect = require( "./collect/collect.js" );
7
 
8
  var analysisTimeout = 0;
9
 
10
+ var App = function() {
11
+ YoastSEO.app.registerPlugin( config.pluginName, { status: "ready" } );
12
 
13
+ YoastSEO.app.registerModification( "content", collect.append.bind( collect ), config.pluginName );
 
 
 
 
14
 
15
+ this.bindListeners();
16
  };
17
 
18
+ /**
19
+ * ACF 4 Listener.
20
+ *
21
+ * @param {Array} fieldSelectors List of field selectors.
22
+ * @param {string} wysiwygSelector Element selector for WYSIWYG fields.
23
+ * @param {Array} fieldSelectorsWithoutWysiwyg List of fields.
24
+ *
25
+ * @returns {void}
26
+ */
27
+ App.prototype.acf4Listener = function( fieldSelectors, wysiwygSelector, fieldSelectorsWithoutWysiwyg ) {
28
+ replaceVars.updateReplaceVars( collect );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
 
30
+ var fieldsWithoutWysiwyg = jQuery( "#post-body, #edittag" ).find( fieldSelectorsWithoutWysiwyg.join( "," ) );
31
+ var fields = jQuery( "#post-body, #edittag" ).find( fieldSelectors.join( "," ) );
 
32
 
33
+ fieldsWithoutWysiwyg.on( "change", this.maybeRefresh.bind( this ) );
34
+ // Do not ignore Wysiwyg fields for the purpose of Replace Vars.
35
+ fields.on( "change", replaceVars.updateReplaceVars.bind( this, collect ) );
36
 
37
+ if ( YoastSEO.wp._tinyMCEHelper ) {
38
+ jQuery( wysiwygSelector ).each( function() {
39
+ YoastSEO.wp._tinyMCEHelper.addEventHandler( this.id, [ "input", "change", "cut", "paste" ],
40
+ replaceVars.updateReplaceVars.bind( this, collect ) );
41
+ } );
42
+ }
43
 
44
+ // Also refresh on media close as attachment data might have changed
45
+ wp.media.frame.on( "close", this.maybeRefresh );
46
+ };
47
 
48
+ /**
49
+ * ACF 5 Listener.
50
+ *
51
+ * @returns {void}
52
+ */
53
+ App.prototype.acf5Listener = function() {
54
+ replaceVars.updateReplaceVars( collect );
55
 
56
+ acf.add_action( "change remove append sortstop", this.maybeRefresh );
57
+ acf.add_action( "change remove append sortstop", replaceVars.updateReplaceVars.bind( this, collect ) );
58
  };
59
 
60
+ App.prototype.bindListeners = function() {
61
+ if ( helper.acf_version >= 5 ) {
62
+ jQuery( this.acf5Listener.bind( this ) );
63
+ } else {
64
+ var fieldSelectors = config.fieldSelectors.slice( 0 );
65
+ var wysiwygSelector = "textarea[id^=wysiwyg-acf]";
66
 
67
+ // Ignore Wysiwyg fields because they trigger a refresh in Yoast SEO itself
68
+ var fieldSelectorsWithoutWysiwyg = _.without( fieldSelectors, wysiwygSelector );
 
69
 
70
+ jQuery( document ).on( "acf/setup_fields", this.acf4Listener.bind( this, fieldSelectors, wysiwygSelector, fieldSelectorsWithoutWysiwyg ) );
71
+ }
72
+ };
73
 
74
+ App.prototype.maybeRefresh = function() {
75
+ if ( analysisTimeout ) {
76
+ window.clearTimeout( analysisTimeout );
77
+ }
78
 
79
+ analysisTimeout = window.setTimeout( function() {
80
+ if ( config.debug ) {
81
+ console.log( "Recalculate..." + new Date() + "(Internal)" );
82
+ }
83
 
84
+ YoastSEO.app.pluginReloaded( config.pluginName );
85
+ }, config.refreshRate );
86
  };
87
 
88
  module.exports = App;
91
  /* global _ */
92
  var cache = require( "./cache.js" );
93
 
94
+ var refresh = function( attachment_ids ) {
95
+ var uncached = cache.getUncached( attachment_ids, "attachment" );
 
 
 
 
 
96
 
97
+ if ( uncached.length === 0 ) {
98
+ return;
99
+ }
 
 
 
 
 
 
 
 
 
100
 
101
+ window.wp.ajax.post( "query-attachments", {
102
+ query: {
103
+ post__in: uncached,
104
+ },
105
+ } ).done( function( attachments ) {
106
+ _.each( attachments, function( attachment ) {
107
+ cache.set( attachment.id, attachment, "attachment" );
108
+ window.YoastACFAnalysis.maybeRefresh();
109
+ } );
110
+ } );
111
  };
112
 
113
+ var get = function( id ) {
114
+ var attachment = cache.get( id, "attachment" );
 
115
 
116
+ if ( ! attachment ) {
117
+ return false;
118
+ }
119
 
120
+ var changedAttachment = window.wp.media.attachment( id );
121
 
122
+ if ( changedAttachment.has( "alt" ) ) {
123
+ attachment.alt = changedAttachment.get( "alt" );
124
+ }
125
 
126
+ if ( changedAttachment.has( "title" ) ) {
127
+ attachment.title = changedAttachment.get( "title" );
128
+ }
129
 
130
+ return attachment;
131
  };
132
 
133
  module.exports = {
134
+ refresh: refresh,
135
+ get: get,
136
  };
137
+
138
  },{"./cache.js":3}],3:[function(require,module,exports){
139
  /* global _ */
140
  var Cache = function() {
141
+ this.clear( "all" );
142
  };
143
 
144
  var _cache;
145
 
146
  Cache.prototype.set = function( id, value, store ) {
147
+ store = typeof store === "undefined" ? "default" : store;
148
 
149
+ if ( ! ( store in _cache ) ) {
150
+ _cache[ store ] = {};
151
+ }
 
 
152
 
153
+ _cache[ store ][ id ] = value;
154
  };
155
 
156
+ Cache.prototype.get = function( id, store ) {
157
+ store = typeof store === "undefined" ? "default" : store;
 
158
 
159
+ if ( store in _cache && id in _cache[ store ] ) {
160
+ return _cache[ store ][ id ];
161
+ }
 
 
162
 
163
+ return false;
164
  };
165
 
166
+ Cache.prototype.getUncached = function( ids, store ) {
167
+ store = typeof store === "undefined" ? "default" : store;
168
 
169
+ var that = this;
170
 
171
+ ids = _.uniq( ids );
172
 
173
+ return ids.filter( function( id ) {
174
+ var value = that.get( id, store );
 
 
 
 
175
 
176
+ return value === false;
177
+ } );
178
  };
179
 
180
+ Cache.prototype.clear = function( store ) {
181
+ store = typeof store === "undefined" ? "default" : store;
 
 
 
 
 
 
 
182
 
183
+ if ( store === "all" ) {
184
+ _cache = {};
185
+ } else {
186
+ _cache[ store ] = {};
187
+ }
188
  };
189
 
190
  module.exports = new Cache();
191
+
192
  },{}],4:[function(require,module,exports){
193
+ /* global jQuery */
194
+
195
  var config = require( "./../config/config.js" );
196
  var fieldSelectors = config.fieldSelectors;
197
 
198
  var field_data = [];
199
 
200
+ var fields = jQuery( "#post-body, #edittag" ).find( fieldSelectors.join( "," ) );
 
 
201
 
202
+ fields.each( function() {
203
+ var $el = jQuery( this ).parents( ".field" ).last();
204
 
205
+ field_data.push( {
206
+ $el: $el,
207
+ key: $el.data( "field_key" ),
208
+ name: $el.data( "field_name" ),
209
+ type: $el.data( "field_type" ),
210
+ post_meta_key: $el.data( "field_name" ),
211
+ } );
212
+ } );
 
213
 
214
  module.exports = field_data;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
215
 
216
+ },{"./../config/config.js":7}],5:[function(require,module,exports){
217
+ /* global _, acf, jQuery */
218
+
219
+ module.exports = function() {
220
+ var outerFieldsName = [
221
+ "flexible_content",
222
+ "repeater",
223
+ "group",
224
+ ];
225
+
226
+ var innerFields = [];
227
+ var outerFields = [];
228
+
229
+ var fields = _.map( acf.get_fields(), function( field ) {
230
+ var field_data = jQuery.extend( true, {}, acf.get_data( jQuery( field ) ) );
231
+ field_data.$el = jQuery( field );
232
+ field_data.post_meta_key = field_data.name;
233
+
234
+ // Collect nested and parent
235
+ if ( outerFieldsName.indexOf( field_data.type ) === -1 ) {
236
+ innerFields.push( field_data );
237
+ } else {
238
+ outerFields.push( field_data );
239
+ }
240
+
241
+ return field_data;
242
+ } );
243
+
244
+ if ( outerFields.length === 0 ) {
245
+ return fields;
246
+ }
247
+
248
+ // Transform field names for nested fields.
249
+ _.each( innerFields, function( inner ) {
250
+ _.each( outerFields, function( outer ) {
251
+ if ( jQuery.contains( outer.$el[ 0 ], inner.$el[ 0 ] ) ) {
252
+ // Types that hold multiple children.
253
+ if ( outer.type === "flexible_content" || outer.type === "repeater" ) {
254
+ outer.children = outer.children || [];
255
+ outer.children.push( inner );
256
+ inner.parent = outer;
257
+ inner.post_meta_key = outer.name + "_" + ( outer.children.length - 1 ) + "_" + inner.name;
258
+ }
259
+
260
+ // Types that hold single children.
261
+ if ( outer.type === "group" ) {
262
+ outer.children = [ inner ];
263
+ inner.parent = outer;
264
+ inner.post_meta_key = outer.name + "_" + inner.name;
265
+ }
266
+ }
267
+ } );
268
+ } );
269
+
270
+ return fields;
271
  };
272
 
273
  },{}],6:[function(require,module,exports){
274
+ /* global _ */
275
 
276
  var config = require( "./../config/config.js" );
277
  var helper = require( "./../helper.js" );
278
  var scraper_store = require( "./../scraper-store.js" );
279
 
280
+ var Collect = function() {
281
 
282
  };
283
 
284
+ Collect.prototype.getFieldData = function() {
285
+ var field_data = this.filterBroken( this.filterBlacklistName( this.filterBlacklistType( this.getData() ) ) );
 
 
 
 
286
 
287
+ var used_types = _.uniq( _.pluck( field_data, "type" ) );
 
288
 
289
+ if ( config.debug ) {
290
+ console.log( "Used types:" );
291
+ console.log( used_types );
292
+ }
293
 
294
+ _.each( used_types, function( type ) {
295
+ field_data = scraper_store.getScraper( type ).scrape( field_data );
296
+ } );
297
 
298
+ return field_data;
299
  };
300
 
301
+ Collect.prototype.append = function( data ) {
302
+ if ( config.debug ) {
303
+ console.log( "Recalculate..." + new Date() );
304
+ }
 
 
 
 
 
305
 
306
+ var field_data = this.getFieldData();
 
 
307
 
308
+ _.each( field_data, function( field ) {
309
+ if ( typeof field.content !== "undefined" && field.content !== "" ) {
310
+ data += "\n" + field.content;
311
+ }
312
+ } );
313
 
314
+ if ( config.debug ) {
315
+ console.log( "Field data:" );
316
+ console.table( field_data );
317
 
318
+ console.log( "Data:" );
319
+ console.log( data );
320
+ }
 
 
321
 
322
+ return data;
323
  };
324
 
325
+ Collect.prototype.getData = function() {
326
+ if ( helper.acf_version >= 5 ) {
327
+ return require( "./collect-v5.js" )();
328
+ }
329
+ return require( "./collect-v4.js" );
 
 
 
330
  };
331
 
332
+ Collect.prototype.filterBlacklistType = function( field_data ) {
333
+ return _.filter( field_data, function( field ) {
334
+ return ! _.contains( config.blacklistType, field.type );
335
+ } );
336
  };
337
 
338
+ Collect.prototype.filterBlacklistName = function( field_data ) {
339
+ return _.filter( field_data, function( field ) {
340
+ return ! _.contains( config.blacklistName, field.name );
341
+ } );
342
  };
343
 
344
+ Collect.prototype.filterBroken = function( field_data ) {
345
+ return _.filter( field_data, function( field ) {
346
+ return ( "key" in field );
347
+ } );
348
  };
349
 
350
  module.exports = new Collect();
351
 
352
  },{"./../config/config.js":7,"./../helper.js":8,"./../scraper-store.js":11,"./collect-v4.js":4,"./collect-v5.js":5}],7:[function(require,module,exports){
353
+ /* globals YoastACFAnalysisConfig */
354
  module.exports = YoastACFAnalysisConfig;
355
+
356
  },{}],8:[function(require,module,exports){
357
  var config = require( "./config/config.js" );
358
 
359
  module.exports = {
360
+ acf_version: parseFloat( config.acfVersion, 10 ),
361
  };
362
+
363
  },{"./config/config.js":7}],9:[function(require,module,exports){
364
+ /* global jQuery, YoastSEO, YoastACFAnalysis: true */
365
+ /* exported YoastACFAnalysis */
366
 
367
  var App = require( "./app.js" );
368
 
369
+ ( function( $ ) {
370
+ $( document ).ready( function() {
371
+ if ( "undefined" !== typeof YoastSEO ) {
372
+ YoastACFAnalysis = new App();
373
+ }
374
+ } );
375
+ }( jQuery ) );
376
 
 
 
 
 
 
 
 
 
 
377
  },{"./app.js":1}],10:[function(require,module,exports){
378
  /* global _, jQuery, YoastSEO, YoastReplaceVarPlugin */
379
 
381
 
382
  var ReplaceVar = YoastReplaceVarPlugin.ReplaceVar;
383
 
384
+ var supportedTypes = [ "email", "text", "textarea", "url", "wysiwyg" ];
385
 
386
  var replaceVars = {};
387
 
388
+ var replaceVarPluginAvailable = function() {
389
+ if ( typeof ReplaceVar === "undefined" ) {
390
+ if ( config.debug ) {
391
+ console.log( "Replacing ACF variables in the Snippet Window requires Yoast SEO >= 5.3." );
392
+ }
 
 
 
 
 
 
 
 
 
393
 
394
+ return false;
395
+ }
396
 
397
+ return true;
398
+ };
 
 
 
 
 
 
399
 
400
+ var updateReplaceVars = function( collect ) {
401
+ if ( ! replaceVarPluginAvailable() ) {
402
+ return;
403
+ }
404
 
405
+ var fieldData = _.filter( collect.getFieldData(), function( field ) {
406
+ return _.contains( supportedTypes, field.type );
407
+ } );
408
 
409
+ _.each( fieldData, function( field ) {
410
+ // Remove HTML tags using jQuery in case of a wysiwyg field.
411
+ var content = ( field.type === "wysiwyg" ) ? jQuery( jQuery.parseHTML( field.content ) ).text() : field.content;
412
 
413
+ if ( typeof replaceVars[ field.post_meta_key ] === "undefined" ) {
414
+ replaceVars[ field.post_meta_key ] = new ReplaceVar( "%%cf_" + field.post_meta_key + "%%", content, { source: "direct" } );
415
+ YoastSEO.wp.replaceVarsPlugin.addReplacement( replaceVars[ field.post_meta_key ] );
416
 
417
+ if ( config.debug ) {
418
+ console.log( "Created ReplaceVar for: ", field.post_meta_key, " with: ", content, replaceVars[ field.post_meta_key ] );
419
+ }
420
+ } else {
421
+ replaceVars[ field.post_meta_key ].replacement = content;
422
 
423
+ if ( config.debug ) {
424
+ console.log( "Updated ReplaceVar for: ", field.post_meta_key, " with: ", content, replaceVars[ field.post_meta_key ] );
425
+ }
426
+ }
427
+ } );
428
  };
429
 
430
  module.exports = {
431
+ updateReplaceVars: updateReplaceVars,
432
  };
433
 
434
  },{"./config/config.js":7}],11:[function(require,module,exports){
 
435
  var config = require( "./config/config.js" );
436
 
437
  var scraperObjects = {
438
+ // Basic
439
+ text: require( "./scraper/scraper.text.js" ),
440
+ textarea: require( "./scraper/scraper.textarea.js" ),
441
+ email: require( "./scraper/scraper.email.js" ),
442
+ url: require( "./scraper/scraper.url.js" ),
443
+ link: require( "./scraper/scraper.link.js" ),
444
 
445
+ // Content
446
+ wysiwyg: require( "./scraper/scraper.wysiwyg.js" ),
447
+ // TODO: Add oembed handler
448
+ image: require( "./scraper/scraper.image.js" ),
449
+ gallery: require( "./scraper/scraper.gallery.js" ),
 
 
 
 
 
 
450
 
451
+ // Choice
452
+ // TODO: select, checkbox, radio
453
 
454
+ // Relational
455
+ taxonomy: require( "./scraper/scraper.taxonomy.js" ),
456
 
457
+ // jQuery
458
+ // TODO: google_map, date_picker, color_picker
459
 
460
  };
461
 
462
  var scrapers = {};
463
 
464
  /**
465
+ * Checks if there already is a scraper for a field type in the store.
466
+ *
467
+ * @param {string} type Type of scraper to find.
468
  *
469
+ * @returns {boolean} True if the scraper is already defined.
 
470
  */
471
+ var hasScraper = function( type ) {
472
+ return (
473
+ type in scrapers
474
+ );
475
+ };
476
 
477
+ /**
478
+ * Set a scraper object on the store. Existing scrapers will be overwritten.
479
+ *
480
+ * @param {Object} scraper The scraper to add.
481
+ * @param {string} type Type of scraper.
482
+ *
483
+ * @chainable
484
+ *
485
+ * @returns {Object} Added scraper.
486
+ */
487
+ var setScraper = function( scraper, type ) {
488
+ if ( config.debug && hasScraper( type ) ) {
489
+ console.warn( "Scraper for " + type + " already exists and will be overwritten." );
490
+ }
491
 
492
+ scrapers[ type ] = scraper;
493
 
494
+ return scraper;
495
  };
496
 
497
  /**
498
  * Returns the scraper object for a field type.
499
  * If there is no scraper object for this field type a no-op scraper is returned.
500
  *
501
+ * @param {string} type Type of scraper to fetch.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
502
  *
503
+ * @returns {Object} The scraper for the specified type.
 
504
  */
505
+ var getScraper = function( type ) {
506
+ if ( hasScraper( type ) ) {
507
+ return scrapers[ type ];
508
+ }
509
+
510
+ if ( type in scraperObjects ) {
511
+ return setScraper( new scraperObjects[ type ](), type );
512
+ }
513
+
514
+ // If we do not have a scraper just pass the fields through so it will be filtered out by the app.
515
+ return {
516
+ scrape: function( fields ) {
517
+ if ( config.debug ) {
518
+ console.warn( "No Scraper for field type: " + type );
519
+ }
520
+ return fields;
521
+ },
522
+ };
523
  };
524
 
525
  module.exports = {
526
+ setScraper: setScraper,
527
+ getScraper: getScraper,
 
 
528
  };
 
 
 
 
 
 
 
 
529
 
530
+ },{"./config/config.js":7,"./scraper/scraper.email.js":12,"./scraper/scraper.gallery.js":13,"./scraper/scraper.image.js":14,"./scraper/scraper.link.js":15,"./scraper/scraper.taxonomy.js":16,"./scraper/scraper.text.js":17,"./scraper/scraper.textarea.js":18,"./scraper/scraper.url.js":19,"./scraper/scraper.wysiwyg.js":20}],12:[function(require,module,exports){
531
+ /* global _ */
532
 
533
+ var Scraper = function() {};
 
 
534
 
535
+ Scraper.prototype.scrape = function( fields ) {
536
+ fields = _.map( fields, function( field ) {
537
+ if ( field.type !== "email" ) {
538
+ return field;
539
+ }
540
 
541
+ field.content = field.$el.find( "input[type=email][id^=acf]" ).val();
 
542
 
543
+ return field;
544
+ } );
545
 
546
+ return fields;
547
  };
548
 
549
  module.exports = Scraper;
 
 
 
550
 
551
+ },{}],13:[function(require,module,exports){
552
+ /* global _, jQuery */
 
 
 
 
 
 
 
 
 
 
 
553
 
554
+ var attachmentCache = require( "./../cache/cache.attachments.js" );
 
 
555
 
556
+ var Scraper = function() {};
 
557
 
558
+ Scraper.prototype.scrape = function( fields ) {
559
+ var attachment_ids = [];
560
 
561
+ fields = _.map( fields, function( field ) {
562
+ if ( field.type !== "gallery" ) {
563
+ return field;
564
+ }
565
 
566
+ field.content = "";
567
 
568
+ field.$el.find( ".acf-gallery-attachment input[type=hidden]" ).each( function() {
569
+ // TODO: Is this the best way to get the attachment id?
570
+ var attachment_id = jQuery( this ).val();
571
 
572
+ // Collect all attachment ids for cache refresh
573
+ attachment_ids.push( attachment_id );
574
 
575
+ // If we have the attachment data in the cache we can return a useful value
576
+ if ( attachmentCache.get( attachment_id, "attachment" ) ) {
577
+ var attachment = attachmentCache.get( attachment_id, "attachment" );
578
 
579
+ field.content += '<img src="' + attachment.url + '" alt="' + attachment.alt + '" title="' + attachment.title + '">';
580
+ }
581
+ } );
582
 
583
+ return field;
584
+ } );
585
 
586
+ attachmentCache.refresh( attachment_ids );
587
 
588
+ return fields;
589
  };
590
 
591
  module.exports = Scraper;
 
 
 
 
 
592
 
593
+ },{"./../cache/cache.attachments.js":2}],14:[function(require,module,exports){
594
+ /* global _ */
 
 
 
 
 
595
 
596
+ var attachmentCache = require( "./../cache/cache.attachments.js" );
 
 
597
 
598
+ var Scraper = function() {};
599
 
600
+ Scraper.prototype.scrape = function( fields ) {
601
+ var attachment_ids = [];
602
 
603
+ fields = _.map( fields, function( field ) {
604
+ if ( field.type !== "image" ) {
605
+ return field;
606
+ }
607
 
608
+ field.content = "";
609
 
610
+ var attachment_id = field.$el.find( "input[type=hidden]" ).val();
611
 
612
+ attachment_ids.push( attachment_id );
613
 
614
+ if ( attachmentCache.get( attachment_id, "attachment" ) ) {
615
+ var attachment = attachmentCache.get( attachment_id, "attachment" );
616
 
617
+ field.content += '<img src="' + attachment.url + '" alt="' + attachment.alt + '" title="' + attachment.title + '">';
618
+ }
619
 
 
 
620
 
621
+ return field;
622
+ } );
623
 
624
+ attachmentCache.refresh( attachment_ids );
625
 
626
+ return fields;
627
  };
628
 
629
  module.exports = Scraper;
 
 
 
 
 
 
 
 
 
 
 
630
 
631
+ },{"./../cache/cache.attachments.js":2}],15:[function(require,module,exports){
632
+ /* global _ */
633
+ require( "./../scraper-store.js" );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
634
 
635
+ var Scraper = function() {};
 
 
 
 
636
 
637
+ /**
638
+ * Scraper for the link field type.
639
+ *
640
+ * @param {Object} fields Fields to parse.
641
+ *
642
+ * @returns {Object} Mapped list of fields.
643
+ */
644
+ Scraper.prototype.scrape = function( fields ) {
645
+ /**
646
+ * Set content for all link fields as a-tag with title, url and target.
647
+ * Return the fields object containing all fields.
648
+ */
649
+ return _.map( fields, function( field ) {
650
+ if ( field.type !== "link" ) {
651
+ return field;
652
+ }
653
 
654
+ var title = field.$el.find( "input[type=hidden].input-title" ).val(),
655
+ url = field.$el.find( "input[type=hidden].input-url" ).val(),
656
+ target = field.$el.find( "input[type=hidden].input-target" ).val();
 
657
 
658
+ field.content = "<a href=\"" + url + "\" target=\"" + target + "\">" + title + "</a>";
659
 
660
+ return field;
661
+ } );
662
+ };
663
 
664
+ module.exports = Scraper;
 
 
665
 
666
+ },{"./../scraper-store.js":11}],16:[function(require,module,exports){
667
+ /* global _, acf */
668
 
669
+ var Scraper = function() {};
670
 
671
+ Scraper.prototype.scrape = function( fields ) {
672
+ fields = _.map( fields, function( field ) {
673
+ if ( field.type !== "taxonomy" ) {
674
+ return field;
675
+ }
676
+
677
+ var terms = [];
678
+
679
+ if ( field.$el.find( '.acf-taxonomy-field[data-type="multi_select"]' ).length > 0 ) {
680
+ var select2Target = ( acf.select2.version >= 4 ) ? "select" : "input";
681
+
682
+ terms = _.pluck(
683
+ field.$el.find( '.acf-taxonomy-field[data-type="multi_select"] ' + select2Target )
684
+ .select2( "data" )
685
+ , "text"
686
+ );
687
+ } else if ( field.$el.find( '.acf-taxonomy-field[data-type="checkbox"]' ).length > 0 ) {
688
+ terms = _.pluck(
689
+ field.$el.find( '.acf-taxonomy-field[data-type="checkbox"] input[type="checkbox"]:checked' )
690
+ .next(),
691
+ "textContent"
692
+ );
693
+ } else if ( field.$el.find( "input[type=checkbox]:checked" ).length > 0 ) {
694
+ terms = _.pluck(
695
+ field.$el.find( "input[type=checkbox]:checked" )
696
+ .parent(),
697
+ "textContent"
698
+ );
699
+ } else if ( field.$el.find( "select option:checked" ).length > 0 ) {
700
+ terms = _.pluck(
701
+ field.$el.find( "select option:checked" ),
702
+ "textContent"
703
+ );
704
+ }
705
+
706
+ terms = _.map( terms, function( term ) {
707
+ return term.trim();
708
+ } );
709
+
710
+ if ( terms.length > 0 ) {
711
+ field.content = "<ul>\n<li>" + terms.join( "</li>\n<li>" ) + "</li>\n</ul>";
712
+ }
713
+
714
+ return field;
715
+ } );
716
+
717
+ return fields;
718
  };
719
 
720
  module.exports = Scraper;
 
 
 
 
 
 
 
721
 
722
+ },{}],17:[function(require,module,exports){
723
+ /* global _ */
724
 
725
+ var config = require( "./../config/config.js" );
726
 
727
+ var Scraper = function() {};
 
 
728
 
729
+ Scraper.prototype.scrape = function( fields ) {
730
+ var that = this;
731
 
732
+ fields = _.map( fields, function( field ) {
733
+ if ( field.type !== "text" ) {
734
+ return field;
735
+ }
736
 
737
+ field.content = field.$el.find( "input[type=text][id^=acf]" ).val();
738
+ field = that.wrapInHeadline( field );
739
 
740
+ return field;
741
+ } );
742
 
743
+ return fields;
744
  };
745
 
746
+ Scraper.prototype.wrapInHeadline = function( field ) {
747
+ var level = this.isHeadline( field );
748
+ if ( level ) {
749
+ field.content = "<h" + level + ">" + field.content + "</h" + level + ">";
750
+ }
 
751
 
752
+ return field;
753
  };
754
 
755
+ Scraper.prototype.isHeadline = function( field ) {
756
+ var level = _.find( config.scraper.text.headlines, function( value, key ) {
757
+ return field.key === key;
758
+ } );
759
 
760
+ // It has to be an integer
761
+ if ( level ) {
762
+ level = parseInt( level, 10 );
763
+ }
764
 
765
+ // Headlines only exist from h1 to h6
766
+ if ( level < 1 || level > 6 ) {
767
+ level = false;
768
+ }
 
 
 
 
 
 
 
 
 
 
 
769
 
770
+ return level;
771
  };
772
 
773
  module.exports = Scraper;
 
 
 
 
 
 
774
 
775
+ },{"./../config/config.js":7}],18:[function(require,module,exports){
776
+ /* global _ */
 
777
 
778
+ var Scraper = function() {};
 
 
779
 
780
+ Scraper.prototype.scrape = function( fields ) {
781
+ fields = _.map( fields, function( field ) {
782
+ if ( field.type !== "textarea" ) {
783
+ return field;
784
+ }
785
 
786
+ field.content = field.$el.find( "textarea[id^=acf]" ).val();
 
787
 
788
+ return field;
789
+ } );
790
 
791
+ return fields;
792
  };
793
 
794
  module.exports = Scraper;
 
 
 
 
 
 
795
 
796
+ },{}],19:[function(require,module,exports){
797
+ /* global _ */
 
798
 
799
+ var Scraper = function() {};
 
 
800
 
801
+ Scraper.prototype.scrape = function( fields ) {
802
+ fields = _.map( fields, function( field ) {
803
+ if ( field.type !== "url" ) {
804
+ return field;
805
+ }
806
 
807
+ field.content = field.$el.find( "input[type=url][id^=acf]" ).val();
 
808
 
809
+ return field;
810
+ } );
811
 
812
+ return fields;
813
  };
814
 
815
  module.exports = Scraper;
 
 
 
 
 
 
816
 
817
+ },{}],20:[function(require,module,exports){
818
+ /* global tinyMCE, _ */
819
 
820
+ var Scraper = function() {};
 
 
 
 
 
 
 
 
 
821
 
822
+ /**
823
+ * Adapted from wp-seo-post-scraper-plugin-310.js:196-210
824
+ *
825
+ * @param {string} editorID TinyMCE identifier to look up.
826
+ *
827
+ * @returns {boolean} True if an editor exists for the supplied ID.
828
+ */
829
+ var isTinyMCEAvailable = function( editorID ) {
830
+ if ( typeof tinyMCE === "undefined" ||
831
+ typeof tinyMCE.editors === "undefined" ||
832
+ tinyMCE.editors.length === 0 ||
833
+ tinyMCE.get( editorID ) === null ||
834
+ tinyMCE.get( editorID ).isHidden() ) {
835
+ return false;
836
+ }
837
 
838
+ return true;
839
  };
840
 
841
  /**
842
  * Adapted from wp-seo-shortcode-plugin-305.js:115-126
843
  *
844
+ * @param {Object} field Field to get the content for.
845
+ *
846
+ * @returns {string} The content of the field.
847
  */
848
+ var getContentTinyMCE = function( field ) {
849
+ var textarea = field.$el.find( "textarea" )[ 0 ];
850
+ var editorID = textarea.id;
851
+ var val = textarea.value;
852
 
853
+ if ( isTinyMCEAvailable( editorID ) ) {
854
+ val = tinyMCE.get( editorID ) && tinyMCE.get( editorID ).getContent() || "";
855
+ }
856
 
857
+ return val;
858
+ };
859
 
860
+ Scraper.prototype.scrape = function( fields ) {
861
+ fields = _.map( fields, function( field ) {
862
+ if ( field.type !== "wysiwyg" ) {
863
+ return field;
864
+ }
865
 
866
+ field.content = getContentTinyMCE( field );
 
867
 
868
+ return field;
869
+ } );
 
 
 
 
 
 
 
 
 
 
 
 
 
870
 
871
+ return fields;
872
  };
873
 
874
  module.exports = Scraper;
875
+
876
+ },{}]},{},[9]);
license.txt CHANGED
@@ -618,4 +618,25 @@ an absolute waiver of all civil liability in connection with the
618
  Program, unless a warranty or assumption of liability accompanies a
619
  copy of the Program in return for a fee.
620
 
621
- END OF TERMS AND CONDITIONS
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
618
  Program, unless a warranty or assumption of liability accompanies a
619
  copy of the Program in return for a fee.
620
 
621
+ 18. Additional terms
622
+
623
+ In the light of Article 7 of the GPL license, the following additional
624
+ terms apply:
625
+
626
+ a) You are prohibited to make misrepresentations of the origin of that
627
+ material, or to require that modified versions of such material be marked
628
+ in reasonable ways as different from the original version;
629
+
630
+ b) You are limited in the use for publicity purposes of names of
631
+ licensors or authors of the material;
632
+
633
+ c) You are declined any grant of rights under trademark law for use of
634
+ the trade names, trademarks, or service marks of YOAST B.V.;
635
+
636
+ d) You are required to indemnify licensors and authors of that material
637
+ by anyone who conveys the material (or modified versions of it) with
638
+ contractual assumptions of liability to the recipient, for any liability
639
+ that these contractual assumptions directly impose on those licensors and
640
+ authors.
641
+
642
+ END OF TERMS AND CONDITIONS
package-lock.json DELETED
@@ -1,3407 +0,0 @@
1
- {
2
- "name": "yoast-acf-analysis",
3
- "version": "2.0.1",
4
- "lockfileVersion": 1,
5
- "requires": true,
6
- "dependencies": {
7
- "JSONStream": {
8
- "version": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz",
9
- "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=",
10
- "dev": true,
11
- "requires": {
12
- "jsonparse": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
13
- "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
14
- }
15
- },
16
- "acorn": {
17
- "version": "https://registry.npmjs.org/acorn/-/acorn-4.0.11.tgz",
18
- "integrity": "sha1-7c2jvZN+dVZBDULtWGD2c5nHlMA=",
19
- "dev": true
20
- },
21
- "adm-zip": {
22
- "version": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz",
23
- "integrity": "sha1-hgbCy/HEJs6MjsABdER/1Jtur8E=",
24
- "dev": true
25
- },
26
- "agent-base": {
27
- "version": "https://registry.npmjs.org/agent-base/-/agent-base-2.0.1.tgz",
28
- "integrity": "sha1-vY+ehqjrIh//oHvRS+/VXfFCgV4=",
29
- "dev": true,
30
- "requires": {
31
- "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
32
- "semver": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz"
33
- }
34
- },
35
- "align-text": {
36
- "version": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
37
- "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
38
- "dev": true,
39
- "requires": {
40
- "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
41
- "longest": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
42
- "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz"
43
- }
44
- },
45
- "alter": {
46
- "version": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz",
47
- "integrity": "sha1-x1iICGF1cgNKrmJICvJrHU0cs80=",
48
- "dev": true,
49
- "requires": {
50
- "stable": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz"
51
- }
52
- },
53
- "amdefine": {
54
- "version": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
55
- "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
56
- "dev": true,
57
- "optional": true
58
- },
59
- "anymatch": {
60
- "version": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz",
61
- "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=",
62
- "dev": true,
63
- "requires": {
64
- "arrify": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
65
- "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz"
66
- }
67
- },
68
- "arr-diff": {
69
- "version": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
70
- "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
71
- "dev": true,
72
- "requires": {
73
- "arr-flatten": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.3.tgz"
74
- }
75
- },
76
- "arr-flatten": {
77
- "version": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.3.tgz",
78
- "integrity": "sha1-onTthawIhJtr14R8RYB0XcUa37E=",
79
- "dev": true
80
- },
81
- "array-filter": {
82
- "version": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
83
- "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
84
- "dev": true
85
- },
86
- "array-map": {
87
- "version": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
88
- "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=",
89
- "dev": true
90
- },
91
- "array-reduce": {
92
- "version": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
93
- "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=",
94
- "dev": true
95
- },
96
- "array-unique": {
97
- "version": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
98
- "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
99
- "dev": true
100
- },
101
- "arrify": {
102
- "version": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
103
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
104
- "dev": true
105
- },
106
- "asn1.js": {
107
- "version": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz",
108
- "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=",
109
- "dev": true,
110
- "requires": {
111
- "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
112
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
113
- "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz"
114
- }
115
- },
116
- "assert": {
117
- "version": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
118
- "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
119
- "dev": true,
120
- "requires": {
121
- "util": "https://registry.npmjs.org/util/-/util-0.10.3.tgz"
122
- }
123
- },
124
- "assertion-error": {
125
- "version": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.0.tgz",
126
- "integrity": "sha1-x/hUOP3UZrx8oWq5DIFRN5el0js=",
127
- "dev": true
128
- },
129
- "ast-traverse": {
130
- "version": "https://registry.npmjs.org/ast-traverse/-/ast-traverse-0.1.1.tgz",
131
- "integrity": "sha1-ac8rg4bxnc2hux4F1o/jWdiJfeY=",
132
- "dev": true
133
- },
134
- "ast-types": {
135
- "version": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.11.tgz",
136
- "integrity": "sha1-NxF3u1kjL/XOqh0J7lytcFsaWqk=",
137
- "dev": true
138
- },
139
- "astw": {
140
- "version": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz",
141
- "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=",
142
- "dev": true,
143
- "requires": {
144
- "acorn": "https://registry.npmjs.org/acorn/-/acorn-4.0.11.tgz"
145
- }
146
- },
147
- "async-each": {
148
- "version": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
149
- "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
150
- "dev": true
151
- },
152
- "balanced-match": {
153
- "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
154
- "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=",
155
- "dev": true
156
- },
157
- "base64-js": {
158
- "version": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz",
159
- "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=",
160
- "dev": true
161
- },
162
- "binary-extensions": {
163
- "version": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz",
164
- "integrity": "sha1-SOyNFt9Dd+rl+liEaCSAr02Vx3Q=",
165
- "dev": true
166
- },
167
- "bn.js": {
168
- "version": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
169
- "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=",
170
- "dev": true
171
- },
172
- "brace-expansion": {
173
- "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz",
174
- "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=",
175
- "dev": true,
176
- "requires": {
177
- "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
178
- "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
179
- }
180
- },
181
- "braces": {
182
- "version": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
183
- "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
184
- "dev": true,
185
- "requires": {
186
- "expand-range": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
187
- "preserve": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
188
- "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz"
189
- }
190
- },
191
- "breakable": {
192
- "version": "https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz",
193
- "integrity": "sha1-eEp5eRWjjq0nutRWtVcstLuqeME=",
194
- "dev": true
195
- },
196
- "brorand": {
197
- "version": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
198
- "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
199
- "dev": true
200
- },
201
- "browser-pack": {
202
- "version": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.0.2.tgz",
203
- "integrity": "sha1-+GzWzvT1MAyOY+B6TVEvZfv/RTE=",
204
- "dev": true,
205
- "requires": {
206
- "JSONStream": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz",
207
- "combine-source-map": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.7.2.tgz",
208
- "defined": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
209
- "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
210
- "umd": "https://registry.npmjs.org/umd/-/umd-3.0.1.tgz"
211
- }
212
- },
213
- "browser-resolve": {
214
- "version": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz",
215
- "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=",
216
- "dev": true,
217
- "requires": {
218
- "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz"
219
- },
220
- "dependencies": {
221
- "resolve": {
222
- "version": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
223
- "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
224
- "dev": true
225
- }
226
- }
227
- },
228
- "browser-stdout": {
229
- "version": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
230
- "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
231
- "dev": true
232
- },
233
- "browserify": {
234
- "version": "https://registry.npmjs.org/browserify/-/browserify-14.3.0.tgz",
235
- "integrity": "sha1-/QA6I4asGuwSfwl4haPMY3O3RcQ=",
236
- "dev": true,
237
- "requires": {
238
- "JSONStream": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz",
239
- "assert": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
240
- "browser-pack": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.0.2.tgz",
241
- "browser-resolve": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz",
242
- "browserify-zlib": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz",
243
- "buffer": "https://registry.npmjs.org/buffer/-/buffer-5.0.6.tgz",
244
- "cached-path-relative": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz",
245
- "concat-stream": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz",
246
- "console-browserify": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
247
- "constants-browserify": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
248
- "crypto-browserify": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.0.tgz",
249
- "defined": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
250
- "deps-sort": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz",
251
- "domain-browser": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz",
252
- "duplexer2": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
253
- "events": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
254
- "glob": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
255
- "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz",
256
- "htmlescape": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
257
- "https-browserify": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
258
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
259
- "insert-module-globals": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.1.tgz",
260
- "labeled-stream-splicer": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz",
261
- "module-deps": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz",
262
- "os-browserify": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz",
263
- "parents": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
264
- "path-browserify": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
265
- "process": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
266
- "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
267
- "querystring-es3": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
268
- "read-only-stream": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
269
- "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz",
270
- "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz",
271
- "shasum": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
272
- "shell-quote": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz",
273
- "stream-browserify": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
274
- "stream-http": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.1.tgz",
275
- "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
276
- "subarg": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
277
- "syntax-error": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz",
278
- "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
279
- "timers-browserify": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
280
- "tty-browserify": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
281
- "url": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
282
- "util": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
283
- "vm-browserify": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
284
- "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz"
285
- }
286
- },
287
- "browserify-aes": {
288
- "version": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz",
289
- "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=",
290
- "dev": true,
291
- "requires": {
292
- "buffer-xor": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
293
- "cipher-base": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.3.tgz",
294
- "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz",
295
- "evp_bytestokey": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz",
296
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"
297
- }
298
- },
299
- "browserify-cipher": {
300
- "version": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz",
301
- "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=",
302
- "dev": true,
303
- "requires": {
304
- "browserify-aes": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz",
305
- "browserify-des": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz",
306
- "evp_bytestokey": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz"
307
- }
308
- },
309
- "browserify-des": {
310
- "version": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz",
311
- "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=",
312
- "dev": true,
313
- "requires": {
314
- "cipher-base": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.3.tgz",
315
- "des.js": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
316
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"
317
- }
318
- },
319
- "browserify-rsa": {
320
- "version": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
321
- "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
322
- "dev": true,
323
- "requires": {
324
- "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
325
- "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz"
326
- }
327
- },
328
- "browserify-sign": {
329
- "version": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
330
- "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
331
- "dev": true,
332
- "requires": {
333
- "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
334
- "browserify-rsa": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
335
- "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz",
336
- "create-hmac": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz",
337
- "elliptic": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz",
338
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
339
- "parse-asn1": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz"
340
- }
341
- },
342
- "browserify-zlib": {
343
- "version": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz",
344
- "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=",
345
- "dev": true,
346
- "requires": {
347
- "pako": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz"
348
- }
349
- },
350
- "buffer": {
351
- "version": "https://registry.npmjs.org/buffer/-/buffer-5.0.6.tgz",
352
- "integrity": "sha1-LqZp9+7Atu2gWwj4tf9mGyhXNYg=",
353
- "dev": true,
354
- "requires": {
355
- "base64-js": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz",
356
- "ieee754": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz"
357
- }
358
- },
359
- "buffer-shims": {
360
- "version": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz",
361
- "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=",
362
- "dev": true
363
- },
364
- "buffer-xor": {
365
- "version": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
366
- "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
367
- "dev": true
368
- },
369
- "builtin-status-codes": {
370
- "version": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
371
- "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
372
- "dev": true
373
- },
374
- "cached-path-relative": {
375
- "version": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz",
376
- "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=",
377
- "dev": true
378
- },
379
- "camelcase": {
380
- "version": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
381
- "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
382
- "dev": true
383
- },
384
- "center-align": {
385
- "version": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
386
- "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
387
- "dev": true,
388
- "requires": {
389
- "align-text": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
390
- "lazy-cache": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz"
391
- }
392
- },
393
- "chai-nightwatch": {
394
- "version": "https://registry.npmjs.org/chai-nightwatch/-/chai-nightwatch-0.1.1.tgz",
395
- "integrity": "sha1-HKVt52jTwIaP5/wvTTLC/olOa+k=",
396
- "dev": true,
397
- "requires": {
398
- "assertion-error": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.0.tgz",
399
- "deep-eql": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz"
400
- }
401
- },
402
- "chokidar": {
403
- "version": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
404
- "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
405
- "dev": true,
406
- "requires": {
407
- "anymatch": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz",
408
- "async-each": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
409
- "fsevents": "1.1.1",
410
- "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
411
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
412
- "is-binary-path": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
413
- "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
414
- "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
415
- "readdirp": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz"
416
- }
417
- },
418
- "chromedriver": {
419
- "version": "https://registry.npmjs.org/chromedriver/-/chromedriver-2.29.0.tgz",
420
- "integrity": "sha1-4/2LPAjc4lYrgO8bC4Rll2WdDMM=",
421
- "dev": true,
422
- "requires": {
423
- "adm-zip": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz",
424
- "kew": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz",
425
- "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
426
- "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz"
427
- }
428
- },
429
- "cipher-base": {
430
- "version": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.3.tgz",
431
- "integrity": "sha1-7qvxlEGc6QDaMBjCB9IS8qbfCgc=",
432
- "dev": true,
433
- "requires": {
434
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"
435
- }
436
- },
437
- "cliui": {
438
- "version": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
439
- "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
440
- "dev": true,
441
- "requires": {
442
- "center-align": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
443
- "right-align": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
444
- "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz"
445
- },
446
- "dependencies": {
447
- "wordwrap": {
448
- "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
449
- "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
450
- "dev": true
451
- }
452
- }
453
- },
454
- "co": {
455
- "version": "https://registry.npmjs.org/co/-/co-3.0.6.tgz",
456
- "integrity": "sha1-FEXyJsXrlWE45oyawwFn6n0ua9o=",
457
- "dev": true
458
- },
459
- "combine-source-map": {
460
- "version": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.7.2.tgz",
461
- "integrity": "sha1-CHAxKFazB6h8xKxIbzqaYq7MwJ4=",
462
- "dev": true,
463
- "requires": {
464
- "convert-source-map": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
465
- "inline-source-map": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz",
466
- "lodash.memoize": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
467
- "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz"
468
- }
469
- },
470
- "commander": {
471
- "version": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
472
- "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
473
- "dev": true,
474
- "requires": {
475
- "graceful-readlink": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz"
476
- }
477
- },
478
- "commoner": {
479
- "version": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz",
480
- "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=",
481
- "dev": true,
482
- "requires": {
483
- "commander": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
484
- "detective": "https://registry.npmjs.org/detective/-/detective-4.5.0.tgz",
485
- "glob": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
486
- "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
487
- "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.17.tgz",
488
- "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
489
- "private": "https://registry.npmjs.org/private/-/private-0.1.7.tgz",
490
- "q": "https://registry.npmjs.org/q/-/q-1.4.1.tgz",
491
- "recast": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz"
492
- },
493
- "dependencies": {
494
- "ast-types": {
495
- "version": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz",
496
- "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=",
497
- "dev": true
498
- },
499
- "glob": {
500
- "version": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
501
- "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
502
- "dev": true,
503
- "requires": {
504
- "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
505
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
506
- "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
507
- "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
508
- "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
509
- }
510
- },
511
- "recast": {
512
- "version": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz",
513
- "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=",
514
- "dev": true,
515
- "requires": {
516
- "ast-types": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz",
517
- "esprima": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
518
- "private": "https://registry.npmjs.org/private/-/private-0.1.7.tgz",
519
- "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz"
520
- }
521
- }
522
- }
523
- },
524
- "concat-map": {
525
- "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
526
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
527
- "dev": true
528
- },
529
- "concat-stream": {
530
- "version": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz",
531
- "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=",
532
- "dev": true,
533
- "requires": {
534
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
535
- "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
536
- "typedarray": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz"
537
- },
538
- "dependencies": {
539
- "readable-stream": {
540
- "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
541
- "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
542
- "dev": true,
543
- "requires": {
544
- "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
545
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
546
- "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
547
- "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
548
- "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
549
- "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
550
- }
551
- }
552
- }
553
- },
554
- "console-browserify": {
555
- "version": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
556
- "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
557
- "dev": true,
558
- "requires": {
559
- "date-now": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz"
560
- }
561
- },
562
- "constants-browserify": {
563
- "version": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
564
- "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
565
- "dev": true
566
- },
567
- "convert-source-map": {
568
- "version": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
569
- "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=",
570
- "dev": true
571
- },
572
- "core-util-is": {
573
- "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
574
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
575
- "dev": true
576
- },
577
- "create-ecdh": {
578
- "version": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz",
579
- "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=",
580
- "dev": true,
581
- "requires": {
582
- "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
583
- "elliptic": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz"
584
- }
585
- },
586
- "create-hash": {
587
- "version": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz",
588
- "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=",
589
- "dev": true,
590
- "requires": {
591
- "cipher-base": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.3.tgz",
592
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
593
- "ripemd160": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz",
594
- "sha.js": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz"
595
- }
596
- },
597
- "create-hmac": {
598
- "version": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz",
599
- "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=",
600
- "dev": true,
601
- "requires": {
602
- "cipher-base": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.3.tgz",
603
- "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz",
604
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
605
- "ripemd160": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz",
606
- "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz",
607
- "sha.js": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz"
608
- }
609
- },
610
- "crypto-browserify": {
611
- "version": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.0.tgz",
612
- "integrity": "sha1-NlKgkGq5sqfgw85mpAjpV6JIVSI=",
613
- "dev": true,
614
- "requires": {
615
- "browserify-cipher": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz",
616
- "browserify-sign": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
617
- "create-ecdh": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz",
618
- "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz",
619
- "create-hmac": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz",
620
- "diffie-hellman": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz",
621
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
622
- "pbkdf2": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz",
623
- "public-encrypt": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz",
624
- "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz"
625
- }
626
- },
627
- "data-uri-to-buffer": {
628
- "version": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-0.0.4.tgz",
629
- "integrity": "sha1-RuE6udqOMJdFyNAc5UchPr2y/j8=",
630
- "dev": true
631
- },
632
- "date-now": {
633
- "version": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
634
- "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
635
- "dev": true
636
- },
637
- "debug": {
638
- "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
639
- "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
640
- "dev": true,
641
- "requires": {
642
- "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz"
643
- }
644
- },
645
- "decamelize": {
646
- "version": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
647
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
648
- "dev": true
649
- },
650
- "deep-eql": {
651
- "version": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
652
- "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=",
653
- "dev": true,
654
- "requires": {
655
- "type-detect": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz"
656
- }
657
- },
658
- "deep-is": {
659
- "version": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
660
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
661
- "dev": true
662
- },
663
- "defined": {
664
- "version": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
665
- "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
666
- "dev": true
667
- },
668
- "defs": {
669
- "version": "https://registry.npmjs.org/defs/-/defs-1.1.1.tgz",
670
- "integrity": "sha1-siYJ8sehG6ej2xFoBcE5scr/qdI=",
671
- "dev": true,
672
- "requires": {
673
- "alter": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz",
674
- "ast-traverse": "https://registry.npmjs.org/ast-traverse/-/ast-traverse-0.1.1.tgz",
675
- "breakable": "https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz",
676
- "esprima-fb": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz",
677
- "simple-fmt": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz",
678
- "simple-is": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz",
679
- "stringmap": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz",
680
- "stringset": "https://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz",
681
- "tryor": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz",
682
- "yargs": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz"
683
- },
684
- "dependencies": {
685
- "esprima-fb": {
686
- "version": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz",
687
- "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=",
688
- "dev": true
689
- }
690
- }
691
- },
692
- "degenerator": {
693
- "version": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz",
694
- "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=",
695
- "dev": true,
696
- "requires": {
697
- "ast-types": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.11.tgz",
698
- "escodegen": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
699
- "esprima": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz"
700
- }
701
- },
702
- "deps-sort": {
703
- "version": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz",
704
- "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=",
705
- "dev": true,
706
- "requires": {
707
- "JSONStream": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz",
708
- "shasum": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
709
- "subarg": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
710
- "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz"
711
- }
712
- },
713
- "des.js": {
714
- "version": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
715
- "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
716
- "dev": true,
717
- "requires": {
718
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
719
- "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz"
720
- }
721
- },
722
- "detective": {
723
- "version": "https://registry.npmjs.org/detective/-/detective-4.5.0.tgz",
724
- "integrity": "sha1-blqMaybmx6JUsca210kNmOyR7dE=",
725
- "dev": true,
726
- "requires": {
727
- "acorn": "https://registry.npmjs.org/acorn/-/acorn-4.0.11.tgz",
728
- "defined": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz"
729
- }
730
- },
731
- "diff": {
732
- "version": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz",
733
- "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=",
734
- "dev": true
735
- },
736
- "diffie-hellman": {
737
- "version": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz",
738
- "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=",
739
- "dev": true,
740
- "requires": {
741
- "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
742
- "miller-rabin": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz",
743
- "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz"
744
- }
745
- },
746
- "domain-browser": {
747
- "version": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz",
748
- "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=",
749
- "dev": true
750
- },
751
- "duplexer": {
752
- "version": "0.1.1",
753
- "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
754
- "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
755
- "dev": true
756
- },
757
- "duplexer2": {
758
- "version": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
759
- "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
760
- "dev": true,
761
- "requires": {
762
- "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz"
763
- }
764
- },
765
- "ejs": {
766
- "version": "https://registry.npmjs.org/ejs/-/ejs-0.8.3.tgz",
767
- "integrity": "sha1-24qsR/+Ap9+CtMgsEm/olwhwYm8=",
768
- "dev": true
769
- },
770
- "elliptic": {
771
- "version": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz",
772
- "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=",
773
- "dev": true,
774
- "requires": {
775
- "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
776
- "brorand": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
777
- "hash.js": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz",
778
- "hmac-drbg": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
779
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
780
- "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz",
781
- "minimalistic-crypto-utils": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz"
782
- }
783
- },
784
- "escape-string-regexp": {
785
- "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
786
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
787
- "dev": true
788
- },
789
- "escodegen": {
790
- "version": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
791
- "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
792
- "dev": true,
793
- "requires": {
794
- "esprima": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
795
- "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
796
- "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
797
- "optionator": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
798
- "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz"
799
- },
800
- "dependencies": {
801
- "esprima": {
802
- "version": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
803
- "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
804
- "dev": true
805
- },
806
- "source-map": {
807
- "version": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
808
- "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
809
- "dev": true,
810
- "optional": true,
811
- "requires": {
812
- "amdefine": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz"
813
- }
814
- }
815
- }
816
- },
817
- "esprima": {
818
- "version": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
819
- "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
820
- "dev": true
821
- },
822
- "estraverse": {
823
- "version": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
824
- "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
825
- "dev": true
826
- },
827
- "esutils": {
828
- "version": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
829
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
830
- "dev": true
831
- },
832
- "event-stream": {
833
- "version": "3.3.4",
834
- "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
835
- "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
836
- "dev": true,
837
- "requires": {
838
- "duplexer": "0.1.1",
839
- "from": "0.1.7",
840
- "map-stream": "0.1.0",
841
- "pause-stream": "0.0.11",
842
- "split": "0.3.3",
843
- "stream-combiner": "0.0.4",
844
- "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
845
- }
846
- },
847
- "events": {
848
- "version": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
849
- "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
850
- "dev": true
851
- },
852
- "evp_bytestokey": {
853
- "version": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz",
854
- "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=",
855
- "dev": true,
856
- "requires": {
857
- "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz"
858
- }
859
- },
860
- "expand-brackets": {
861
- "version": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
862
- "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
863
- "dev": true,
864
- "requires": {
865
- "is-posix-bracket": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz"
866
- }
867
- },
868
- "expand-range": {
869
- "version": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
870
- "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
871
- "dev": true,
872
- "requires": {
873
- "fill-range": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz"
874
- }
875
- },
876
- "extend": {
877
- "version": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
878
- "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
879
- "dev": true
880
- },
881
- "extglob": {
882
- "version": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
883
- "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
884
- "dev": true,
885
- "requires": {
886
- "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz"
887
- }
888
- },
889
- "fast-levenshtein": {
890
- "version": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
891
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
892
- "dev": true
893
- },
894
- "file-uri-to-path": {
895
- "version": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-0.0.2.tgz",
896
- "integrity": "sha1-N83RtbkFQEs/BeGyNkW+aU/3D4I=",
897
- "dev": true
898
- },
899
- "filename-regex": {
900
- "version": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
901
- "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
902
- "dev": true
903
- },
904
- "fill-range": {
905
- "version": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
906
- "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
907
- "dev": true,
908
- "requires": {
909
- "is-number": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
910
- "isobject": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
911
- "randomatic": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.6.tgz",
912
- "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
913
- "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz"
914
- }
915
- },
916
- "for-in": {
917
- "version": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
918
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
919
- "dev": true
920
- },
921
- "for-own": {
922
- "version": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
923
- "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
924
- "dev": true,
925
- "requires": {
926
- "for-in": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz"
927
- }
928
- },
929
- "from": {
930
- "version": "0.1.7",
931
- "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
932
- "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=",
933
- "dev": true
934
- },
935
- "fs.realpath": {
936
- "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
937
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
938
- "dev": true
939
- },
940
- "fsevents": {
941
- "version": "1.1.1",
942
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.1.tgz",
943
- "integrity": "sha1-8Z/Sj0Pur3YWgOUZogPE0LPTGv8=",
944
- "dev": true,
945
- "optional": true,
946
- "requires": {
947
- "nan": "2.6.2",
948
- "node-pre-gyp": "0.6.33"
949
- },
950
- "dependencies": {
951
- "abbrev": {
952
- "version": "1.1.0",
953
- "bundled": true,
954
- "dev": true,
955
- "optional": true
956
- },
957
- "ansi-regex": {
958
- "version": "2.1.1",
959
- "bundled": true,
960
- "dev": true
961
- },
962
- "ansi-styles": {
963
- "version": "2.2.1",
964
- "bundled": true,
965
- "dev": true,
966
- "optional": true
967
- },
968
- "aproba": {
969
- "version": "1.1.1",
970
- "bundled": true,
971
- "dev": true,
972
- "optional": true
973
- },
974
- "are-we-there-yet": {
975
- "version": "1.1.2",
976
- "bundled": true,
977
- "dev": true,
978
- "optional": true,
979
- "requires": {
980
- "delegates": "1.0.0",
981
- "readable-stream": "2.2.2"
982
- }
983
- },
984
- "asn1": {
985
- "version": "0.2.3",
986
- "bundled": true,
987
- "dev": true,
988
- "optional": true
989
- },
990
- "assert-plus": {
991
- "version": "0.2.0",
992
- "bundled": true,
993
- "dev": true,
994
- "optional": true
995
- },
996
- "asynckit": {
997
- "version": "0.4.0",
998
- "bundled": true,
999
- "dev": true,
1000
- "optional": true
1001
- },
1002
- "aws-sign2": {
1003
- "version": "0.6.0",
1004
- "bundled": true,
1005
- "dev": true,
1006
- "optional": true
1007
- },
1008
- "aws4": {
1009
- "version": "1.6.0",
1010
- "bundled": true,
1011
- "dev": true,
1012
- "optional": true
1013
- },
1014
- "balanced-match": {
1015
- "version": "0.4.2",
1016
- "bundled": true,
1017
- "dev": true
1018
- },
1019
- "bcrypt-pbkdf": {
1020
- "version": "1.0.1",
1021
- "bundled": true,
1022
- "dev": true,
1023
- "optional": true,
1024
- "requires": {
1025
- "tweetnacl": "0.14.5"
1026
- }
1027
- },
1028
- "block-stream": {
1029
- "version": "0.0.9",
1030
- "bundled": true,
1031
- "dev": true,
1032
- "requires": {
1033
- "inherits": "2.0.3"
1034
- }
1035
- },
1036
- "boom": {
1037
- "version": "2.10.1",
1038
- "bundled": true,
1039
- "dev": true,
1040
- "requires": {
1041
- "hoek": "2.16.3"
1042
- }
1043
- },
1044
- "brace-expansion": {
1045
- "version": "1.1.6",
1046
- "bundled": true,
1047
- "dev": true,
1048
- "requires": {
1049
- "balanced-match": "0.4.2",
1050
- "concat-map": "0.0.1"
1051
- }
1052
- },
1053
- "buffer-shims": {
1054
- "version": "1.0.0",
1055
- "bundled": true,
1056
- "dev": true
1057
- },
1058
- "caseless": {
1059
- "version": "0.11.0",
1060
- "bundled": true,
1061
- "dev": true,
1062
- "optional": true
1063
- },
1064
- "chalk": {
1065
- "version": "1.1.3",
1066
- "bundled": true,
1067
- "dev": true,
1068
- "optional": true,
1069
- "requires": {
1070
- "ansi-styles": "2.2.1",
1071
- "escape-string-regexp": "1.0.5",
1072
- "has-ansi": "2.0.0",
1073
- "strip-ansi": "3.0.1",
1074
- "supports-color": "2.0.0"
1075
- }
1076
- },
1077
- "code-point-at": {
1078
- "version": "1.1.0",
1079
- "bundled": true,
1080
- "dev": true
1081
- },
1082
- "combined-stream": {
1083
- "version": "1.0.5",
1084
- "bundled": true,
1085
- "dev": true,
1086
- "requires": {
1087
- "delayed-stream": "1.0.0"
1088
- }
1089
- },
1090
- "commander": {
1091
- "version": "2.9.0",
1092
- "bundled": true,
1093
- "dev": true,
1094
- "optional": true,
1095
- "requires": {
1096
- "graceful-readlink": "1.0.1"
1097
- }
1098
- },
1099
- "concat-map": {
1100
- "version": "0.0.1",
1101
- "bundled": true,
1102
- "dev": true
1103
- },
1104
- "console-control-strings": {
1105
- "version": "1.1.0",
1106
- "bundled": true,
1107
- "dev": true
1108
- },
1109
- "core-util-is": {
1110
- "version": "1.0.2",
1111
- "bundled": true,
1112
- "dev": true
1113
- },
1114
- "cryptiles": {
1115
- "version": "2.0.5",
1116
- "bundled": true,
1117
- "dev": true,
1118
- "optional": true,
1119
- "requires": {
1120
- "boom": "2.10.1"
1121
- }
1122
- },
1123
- "dashdash": {
1124
- "version": "1.14.1",
1125
- "bundled": true,
1126
- "dev": true,
1127
- "optional": true,
1128
- "requires": {
1129
- "assert-plus": "1.0.0"
1130
- },
1131
- "dependencies": {
1132
- "assert-plus": {
1133
- "version": "1.0.0",
1134
- "bundled": true,
1135
- "dev": true,
1136
- "optional": true
1137
- }
1138
- }
1139
- },
1140
- "debug": {
1141
- "version": "2.2.0",
1142
- "bundled": true,
1143
- "dev": true,
1144
- "optional": true,
1145
- "requires": {
1146
- "ms": "0.7.1"
1147
- }
1148
- },
1149
- "deep-extend": {
1150
- "version": "0.4.1",
1151
- "bundled": true,
1152
- "dev": true,
1153
- "optional": true
1154
- },
1155
- "delayed-stream": {
1156
- "version": "1.0.0",
1157
- "bundled": true,
1158
- "dev": true
1159
- },
1160
- "delegates": {
1161
- "version": "1.0.0",
1162
- "bundled": true,
1163
- "dev": true,
1164
- "optional": true
1165
- },
1166
- "ecc-jsbn": {
1167
- "version": "0.1.1",
1168
- "bundled": true,
1169
- "dev": true,
1170
- "optional": true,
1171
- "requires": {
1172
- "jsbn": "0.1.1"
1173
- }
1174
- },
1175
- "escape-string-regexp": {
1176
- "version": "1.0.5",
1177
- "bundled": true,
1178
- "dev": true,
1179
- "optional": true
1180
- },
1181
- "extend": {
1182
- "version": "3.0.0",
1183
- "bundled": true,
1184
- "dev": true,
1185
- "optional": true
1186
- },
1187
- "extsprintf": {
1188
- "version": "1.0.2",
1189
- "bundled": true,
1190
- "dev": true
1191
- },
1192
- "forever-agent": {
1193
- "version": "0.6.1",
1194
- "bundled": true,
1195
- "dev": true,
1196
- "optional": true
1197
- },
1198
- "form-data": {
1199
- "version": "2.1.2",
1200
- "bundled": true,
1201
- "dev": true,
1202
- "optional": true,
1203
- "requires": {
1204
- "asynckit": "0.4.0",
1205
- "combined-stream": "1.0.5",
1206
- "mime-types": "2.1.14"
1207
- }
1208
- },
1209
- "fs.realpath": {
1210
- "version": "1.0.0",
1211
- "bundled": true,
1212
- "dev": true
1213
- },
1214
- "fstream": {
1215
- "version": "1.0.10",
1216
- "bundled": true,
1217
- "dev": true,
1218
- "requires": {
1219
- "graceful-fs": "4.1.11",
1220
- "inherits": "2.0.3",
1221
- "mkdirp": "0.5.1",
1222
- "rimraf": "2.5.4"
1223
- }
1224
- },
1225
- "fstream-ignore": {
1226
- "version": "1.0.5",
1227
- "bundled": true,
1228
- "dev": true,
1229
- "optional": true,
1230
- "requires": {
1231
- "fstream": "1.0.10",
1232
- "inherits": "2.0.3",
1233
- "minimatch": "3.0.3"
1234
- }
1235
- },
1236
- "gauge": {
1237
- "version": "2.7.3",
1238
- "bundled": true,
1239
- "dev": true,
1240
- "optional": true,
1241
- "requires": {
1242
- "aproba": "1.1.1",
1243
- "console-control-strings": "1.1.0",
1244
- "has-unicode": "2.0.1",
1245
- "object-assign": "4.1.1",
1246
- "signal-exit": "3.0.2",
1247
- "string-width": "1.0.2",
1248
- "strip-ansi": "3.0.1",
1249
- "wide-align": "1.1.0"
1250
- }
1251
- },
1252
- "generate-function": {
1253
- "version": "2.0.0",
1254
- "bundled": true,
1255
- "dev": true,
1256
- "optional": true
1257
- },
1258
- "generate-object-property": {
1259
- "version": "1.2.0",
1260
- "bundled": true,
1261
- "dev": true,
1262
- "optional": true,
1263
- "requires": {
1264
- "is-property": "1.0.2"
1265
- }
1266
- },
1267
- "getpass": {
1268
- "version": "0.1.6",
1269
- "bundled": true,
1270
- "dev": true,
1271
- "optional": true,
1272
- "requires": {
1273
- "assert-plus": "1.0.0"
1274
- },
1275
- "dependencies": {
1276
- "assert-plus": {
1277
- "version": "1.0.0",
1278
- "bundled": true,
1279
- "dev": true,
1280
- "optional": true
1281
- }
1282
- }
1283
- },
1284
- "glob": {
1285
- "version": "7.1.1",
1286
- "bundled": true,
1287
- "dev": true,
1288
- "requires": {
1289
- "fs.realpath": "1.0.0",
1290
- "inflight": "1.0.6",
1291
- "inherits": "2.0.3",
1292
- "minimatch": "3.0.3",
1293
- "once": "1.4.0",
1294
- "path-is-absolute": "1.0.1"
1295
- }
1296
- },
1297
- "graceful-fs": {
1298
- "version": "4.1.11",
1299
- "bundled": true,
1300
- "dev": true
1301
- },
1302
- "graceful-readlink": {
1303
- "version": "1.0.1",
1304
- "bundled": true,
1305
- "dev": true,
1306
- "optional": true
1307
- },
1308
- "har-validator": {
1309
- "version": "2.0.6",
1310
- "bundled": true,
1311
- "dev": true,
1312
- "optional": true,
1313
- "requires": {
1314
- "chalk": "1.1.3",
1315
- "commander": "2.9.0",
1316
- "is-my-json-valid": "2.15.0",
1317
- "pinkie-promise": "2.0.1"
1318
- }
1319
- },
1320
- "has-ansi": {
1321
- "version": "2.0.0",
1322
- "bundled": true,
1323
- "dev": true,
1324
- "optional": true,
1325
- "requires": {
1326
- "ansi-regex": "2.1.1"
1327
- }
1328
- },
1329
- "has-unicode": {
1330
- "version": "2.0.1",
1331
- "bundled": true,
1332
- "dev": true,
1333
- "optional": true
1334
- },
1335
- "hawk": {
1336
- "version": "3.1.3",
1337
- "bundled": true,
1338
- "dev": true,
1339
- "optional": true,
1340
- "requires": {
1341
- "boom": "2.10.1",
1342
- "cryptiles": "2.0.5",
1343
- "hoek": "2.16.3",
1344
- "sntp": "1.0.9"
1345
- }
1346
- },
1347
- "hoek": {
1348
- "version": "2.16.3",
1349
- "bundled": true,
1350
- "dev": true
1351
- },
1352
- "http-signature": {
1353
- "version": "1.1.1",
1354
- "bundled": true,
1355
- "dev": true,
1356
- "optional": true,
1357
- "requires": {
1358
- "assert-plus": "0.2.0",
1359
- "jsprim": "1.3.1",
1360
- "sshpk": "1.10.2"
1361
- }
1362
- },
1363
- "inflight": {
1364
- "version": "1.0.6",
1365
- "bundled": true,
1366
- "dev": true,
1367
- "requires": {
1368
- "once": "1.4.0",
1369
- "wrappy": "1.0.2"
1370
- }
1371
- },
1372
- "inherits": {
1373
- "version": "2.0.3",
1374
- "bundled": true,
1375
- "dev": true
1376
- },
1377
- "ini": {
1378
- "version": "1.3.4",
1379
- "bundled": true,
1380
- "dev": true,
1381
- "optional": true
1382
- },
1383
- "is-fullwidth-code-point": {
1384
- "version": "1.0.0",
1385
- "bundled": true,
1386
- "dev": true,
1387
- "requires": {
1388
- "number-is-nan": "1.0.1"
1389
- }
1390
- },
1391
- "is-my-json-valid": {
1392
- "version": "2.15.0",
1393
- "bundled": true,
1394
- "dev": true,
1395
- "optional": true,
1396
- "requires": {
1397
- "generate-function": "2.0.0",
1398
- "generate-object-property": "1.2.0",
1399
- "jsonpointer": "4.0.1",
1400
- "xtend": "4.0.1"
1401
- }
1402
- },
1403
- "is-property": {
1404
- "version": "1.0.2",
1405
- "bundled": true,
1406
- "dev": true,
1407
- "optional": true
1408
- },
1409
- "is-typedarray": {
1410
- "version": "1.0.0",
1411
- "bundled": true,
1412
- "dev": true,
1413
- "optional": true
1414
- },
1415
- "isarray": {
1416
- "version": "1.0.0",
1417
- "bundled": true,
1418
- "dev": true
1419
- },
1420
- "isstream": {
1421
- "version": "0.1.2",
1422
- "bundled": true,
1423
- "dev": true,
1424
- "optional": true
1425
- },
1426
- "jodid25519": {
1427
- "version": "1.0.2",
1428
- "bundled": true,
1429
- "dev": true,
1430
- "optional": true,
1431
- "requires": {
1432
- "jsbn": "0.1.1"
1433
- }
1434
- },
1435
- "jsbn": {
1436
- "version": "0.1.1",
1437
- "bundled": true,
1438
- "dev": true,
1439
- "optional": true
1440
- },
1441
- "json-schema": {
1442
- "version": "0.2.3",
1443
- "bundled": true,
1444
- "dev": true,
1445
- "optional": true
1446
- },
1447
- "json-stringify-safe": {
1448
- "version": "5.0.1",
1449
- "bundled": true,
1450
- "dev": true,
1451
- "optional": true
1452
- },
1453
- "jsonpointer": {
1454
- "version": "4.0.1",
1455
- "bundled": true,
1456
- "dev": true,
1457
- "optional": true
1458
- },
1459
- "jsprim": {
1460
- "version": "1.3.1",
1461
- "bundled": true,
1462
- "dev": true,
1463
- "optional": true,
1464
- "requires": {
1465
- "extsprintf": "1.0.2",
1466
- "json-schema": "0.2.3",
1467
- "verror": "1.3.6"
1468
- }
1469
- },
1470
- "mime-db": {
1471
- "version": "1.26.0",
1472
- "bundled": true,
1473
- "dev": true
1474
- },
1475
- "mime-types": {
1476
- "version": "2.1.14",
1477
- "bundled": true,
1478
- "dev": true,
1479
- "requires": {
1480
- "mime-db": "1.26.0"
1481
- }
1482
- },
1483
- "minimatch": {
1484
- "version": "3.0.3",
1485
- "bundled": true,
1486
- "dev": true,
1487
- "requires": {
1488
- "brace-expansion": "1.1.6"
1489
- }
1490
- },
1491
- "minimist": {
1492
- "version": "0.0.8",
1493
- "bundled": true,
1494
- "dev": true
1495
- },
1496
- "mkdirp": {
1497
- "version": "0.5.1",
1498
- "bundled": true,
1499
- "dev": true,
1500
- "requires": {
1501
- "minimist": "0.0.8"
1502
- }
1503
- },
1504
- "ms": {
1505
- "version": "0.7.1",
1506
- "bundled": true,
1507
- "dev": true,
1508
- "optional": true
1509
- },
1510
- "node-pre-gyp": {
1511
- "version": "0.6.33",
1512
- "bundled": true,
1513
- "dev": true,
1514
- "optional": true,
1515
- "requires": {
1516
- "mkdirp": "0.5.1",
1517
- "nopt": "3.0.6",
1518
- "npmlog": "4.0.2",
1519
- "rc": "1.1.7",
1520
- "request": "2.79.0",
1521
- "rimraf": "2.5.4",
1522
- "semver": "5.3.0",
1523
- "tar": "2.2.1",
1524
- "tar-pack": "3.3.0"
1525
- }
1526
- },
1527
- "nopt": {
1528
- "version": "3.0.6",
1529
- "bundled": true,
1530
- "dev": true,
1531
- "optional": true,
1532
- "requires": {
1533
- "abbrev": "1.1.0"
1534
- }
1535
- },
1536
- "npmlog": {
1537
- "version": "4.0.2",
1538
- "bundled": true,
1539
- "dev": true,
1540
- "optional": true,
1541
- "requires": {
1542
- "are-we-there-yet": "1.1.2",
1543
- "console-control-strings": "1.1.0",
1544
- "gauge": "2.7.3",
1545
- "set-blocking": "2.0.0"
1546
- }
1547
- },
1548
- "number-is-nan": {
1549
- "version": "1.0.1",
1550
- "bundled": true,
1551
- "dev": true
1552
- },
1553
- "oauth-sign": {
1554
- "version": "0.8.2",
1555
- "bundled": true,
1556
- "dev": true,
1557
- "optional": true
1558
- },
1559
- "object-assign": {
1560
- "version": "4.1.1",
1561
- "bundled": true,
1562
- "dev": true,
1563
- "optional": true
1564
- },
1565
- "once": {
1566
- "version": "1.4.0",
1567
- "bundled": true,
1568
- "dev": true,
1569
- "requires": {
1570
- "wrappy": "1.0.2"
1571
- }
1572
- },
1573
- "path-is-absolute": {
1574
- "version": "1.0.1",
1575
- "bundled": true,
1576
- "dev": true
1577
- },
1578
- "pinkie": {
1579
- "version": "2.0.4",
1580
- "bundled": true,
1581
- "dev": true,
1582
- "optional": true
1583
- },
1584
- "pinkie-promise": {
1585
- "version": "2.0.1",
1586
- "bundled": true,
1587
- "dev": true,
1588
- "optional": true,
1589
- "requires": {
1590
- "pinkie": "2.0.4"
1591
- }
1592
- },
1593
- "process-nextick-args": {
1594
- "version": "1.0.7",
1595
- "bundled": true,
1596
- "dev": true
1597
- },
1598
- "punycode": {
1599
- "version": "1.4.1",
1600
- "bundled": true,
1601
- "dev": true,
1602
- "optional": true
1603
- },
1604
- "qs": {
1605
- "version": "6.3.1",
1606
- "bundled": true,
1607
- "dev": true,
1608
- "optional": true
1609
- },
1610
- "rc": {
1611
- "version": "1.1.7",
1612
- "bundled": true,
1613
- "dev": true,
1614
- "optional": true,
1615
- "requires": {
1616
- "deep-extend": "0.4.1",
1617
- "ini": "1.3.4",
1618
- "minimist": "1.2.0",
1619
- "strip-json-comments": "2.0.1"
1620
- },
1621
- "dependencies": {
1622
- "minimist": {
1623
- "version": "1.2.0",
1624
- "bundled": true,
1625
- "dev": true,
1626
- "optional": true
1627
- }
1628
- }
1629
- },
1630
- "readable-stream": {
1631
- "version": "2.2.2",
1632
- "bundled": true,
1633
- "dev": true,
1634
- "optional": true,
1635
- "requires": {
1636
- "buffer-shims": "1.0.0",
1637
- "core-util-is": "1.0.2",
1638
- "inherits": "2.0.3",
1639
- "isarray": "1.0.0",
1640
- "process-nextick-args": "1.0.7",
1641
- "string_decoder": "0.10.31",
1642
- "util-deprecate": "1.0.2"
1643
- }
1644
- },
1645
- "request": {
1646
- "version": "2.79.0",
1647
- "bundled": true,
1648
- "dev": true,
1649
- "optional": true,
1650
- "requires": {
1651
- "aws-sign2": "0.6.0",
1652
- "aws4": "1.6.0",
1653
- "caseless": "0.11.0",
1654
- "combined-stream": "1.0.5",
1655
- "extend": "3.0.0",
1656
- "forever-agent": "0.6.1",
1657
- "form-data": "2.1.2",
1658
- "har-validator": "2.0.6",
1659
- "hawk": "3.1.3",
1660
- "http-signature": "1.1.1",
1661
- "is-typedarray": "1.0.0",
1662
- "isstream": "0.1.2",
1663
- "json-stringify-safe": "5.0.1",
1664
- "mime-types": "2.1.14",
1665
- "oauth-sign": "0.8.2",
1666
- "qs": "6.3.1",
1667
- "stringstream": "0.0.5",
1668
- "tough-cookie": "2.3.2",
1669
- "tunnel-agent": "0.4.3",
1670
- "uuid": "3.0.1"
1671
- }
1672
- },
1673
- "rimraf": {
1674
- "version": "2.5.4",
1675
- "bundled": true,
1676
- "dev": true,
1677
- "requires": {
1678
- "glob": "7.1.1"
1679
- }
1680
- },
1681
- "semver": {
1682
- "version": "5.3.0",
1683
- "bundled": true,
1684
- "dev": true,
1685
- "optional": true
1686
- },
1687
- "set-blocking": {
1688
- "version": "2.0.0",
1689
- "bundled": true,
1690
- "dev": true,
1691
- "optional": true
1692
- },
1693
- "signal-exit": {
1694
- "version": "3.0.2",
1695
- "bundled": true,
1696
- "dev": true,
1697
- "optional": true
1698
- },
1699
- "sntp": {
1700
- "version": "1.0.9",
1701
- "bundled": true,
1702
- "dev": true,
1703
- "optional": true,
1704
- "requires": {
1705
- "hoek": "2.16.3"
1706
- }
1707
- },
1708
- "sshpk": {
1709
- "version": "1.10.2",
1710
- "bundled": true,
1711
- "dev": true,
1712
- "optional": true,
1713
- "requires": {
1714
- "asn1": "0.2.3",
1715
- "assert-plus": "1.0.0",
1716
- "bcrypt-pbkdf": "1.0.1",
1717
- "dashdash": "1.14.1",
1718
- "ecc-jsbn": "0.1.1",
1719
- "getpass": "0.1.6",
1720
- "jodid25519": "1.0.2",
1721
- "jsbn": "0.1.1",
1722
- "tweetnacl": "0.14.5"
1723
- },
1724
- "dependencies": {
1725
- "assert-plus": {
1726
- "version": "1.0.0",
1727
- "bundled": true,
1728
- "dev": true,
1729
- "optional": true
1730
- }
1731
- }
1732
- },
1733
- "string-width": {
1734
- "version": "1.0.2",
1735
- "bundled": true,
1736
- "dev": true,
1737
- "requires": {
1738
- "code-point-at": "1.1.0",
1739
- "is-fullwidth-code-point": "1.0.0",
1740
- "strip-ansi": "3.0.1"
1741
- }
1742
- },
1743
- "string_decoder": {
1744
- "version": "0.10.31",
1745
- "bundled": true,
1746
- "dev": true
1747
- },
1748
- "stringstream": {
1749
- "version": "0.0.5",
1750
- "bundled": true,
1751
- "dev": true,
1752
- "optional": true
1753
- },
1754
- "strip-ansi": {
1755
- "version": "3.0.1",
1756
- "bundled": true,
1757
- "dev": true,
1758
- "requires": {
1759
- "ansi-regex": "2.1.1"
1760
- }
1761
- },
1762
- "strip-json-comments": {
1763
- "version": "2.0.1",
1764
- "bundled": true,
1765
- "dev": true,
1766
- "optional": true
1767
- },
1768
- "supports-color": {
1769
- "version": "2.0.0",
1770
- "bundled": true,
1771
- "dev": true,
1772
- "optional": true
1773
- },
1774
- "tar": {
1775
- "version": "2.2.1",
1776
- "bundled": true,
1777
- "dev": true,
1778
- "requires": {
1779
- "block-stream": "0.0.9",
1780
- "fstream": "1.0.10",
1781
- "inherits": "2.0.3"
1782
- }
1783
- },
1784
- "tar-pack": {
1785
- "version": "3.3.0",
1786
- "bundled": true,
1787
- "dev": true,
1788
- "optional": true,
1789
- "requires": {
1790
- "debug": "2.2.0",
1791
- "fstream": "1.0.10",
1792
- "fstream-ignore": "1.0.5",
1793
- "once": "1.3.3",
1794
- "readable-stream": "2.1.5",
1795
- "rimraf": "2.5.4",
1796
- "tar": "2.2.1",
1797
- "uid-number": "0.0.6"
1798
- },
1799
- "dependencies": {
1800
- "once": {
1801
- "version": "1.3.3",
1802
- "bundled": true,
1803
- "dev": true,
1804
- "optional": true,
1805
- "requires": {
1806
- "wrappy": "1.0.2"
1807
- }
1808
- },
1809
- "readable-stream": {
1810
- "version": "2.1.5",
1811
- "bundled": true,
1812
- "dev": true,
1813
- "optional": true,
1814
- "requires": {
1815
- "buffer-shims": "1.0.0",
1816
- "core-util-is": "1.0.2",
1817
- "inherits": "2.0.3",
1818
- "isarray": "1.0.0",
1819
- "process-nextick-args": "1.0.7",
1820
- "string_decoder": "0.10.31",
1821
- "util-deprecate": "1.0.2"
1822
- }
1823
- }
1824
- }
1825
- },
1826
- "tough-cookie": {
1827
- "version": "2.3.2",
1828
- "bundled": true,
1829
- "dev": true,
1830
- "optional": true,
1831
- "requires": {
1832
- "punycode": "1.4.1"
1833
- }
1834
- },
1835
- "tunnel-agent": {
1836
- "version": "0.4.3",
1837
- "bundled": true,
1838
- "dev": true,
1839
- "optional": true
1840
- },
1841
- "tweetnacl": {
1842
- "version": "0.14.5",
1843
- "bundled": true,
1844
- "dev": true,
1845
- "optional": true
1846
- },
1847
- "uid-number": {
1848
- "version": "0.0.6",
1849
- "bundled": true,
1850
- "dev": true,
1851
- "optional": true
1852
- },
1853
- "util-deprecate": {
1854
- "version": "1.0.2",
1855
- "bundled": true,
1856
- "dev": true
1857
- },
1858
- "uuid": {
1859
- "version": "3.0.1",
1860
- "bundled": true,
1861
- "dev": true,
1862
- "optional": true
1863
- },
1864
- "verror": {
1865
- "version": "1.3.6",
1866
- "bundled": true,
1867
- "dev": true,
1868
- "optional": true,
1869
- "requires": {
1870
- "extsprintf": "1.0.2"
1871
- }
1872
- },
1873
- "wide-align": {
1874
- "version": "1.1.0",
1875
- "bundled": true,
1876
- "dev": true,
1877
- "optional": true,
1878
- "requires": {
1879
- "string-width": "1.0.2"
1880
- }
1881
- },
1882
- "wrappy": {
1883
- "version": "1.0.2",
1884
- "bundled": true,
1885
- "dev": true
1886
- },
1887
- "xtend": {
1888
- "version": "4.0.1",
1889
- "bundled": true,
1890
- "dev": true,
1891
- "optional": true
1892
- }
1893
- }
1894
- },
1895
- "ftp": {
1896
- "version": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz",
1897
- "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=",
1898
- "dev": true,
1899
- "requires": {
1900
- "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
1901
- "xregexp": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz"
1902
- },
1903
- "dependencies": {
1904
- "isarray": {
1905
- "version": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
1906
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
1907
- "dev": true
1908
- },
1909
- "readable-stream": {
1910
- "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
1911
- "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
1912
- "dev": true,
1913
- "requires": {
1914
- "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
1915
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1916
- "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
1917
- "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz"
1918
- }
1919
- }
1920
- }
1921
- },
1922
- "function-bind": {
1923
- "version": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz",
1924
- "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=",
1925
- "dev": true
1926
- },
1927
- "get-uri": {
1928
- "version": "https://registry.npmjs.org/get-uri/-/get-uri-1.1.0.tgz",
1929
- "integrity": "sha1-c3XQTa9/y1hLNjJnnL3zObUbsUk=",
1930
- "dev": true,
1931
- "requires": {
1932
- "data-uri-to-buffer": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-0.0.4.tgz",
1933
- "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
1934
- "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
1935
- "file-uri-to-path": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-0.0.2.tgz",
1936
- "ftp": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz",
1937
- "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz"
1938
- }
1939
- },
1940
- "glob": {
1941
- "version": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
1942
- "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=",
1943
- "dev": true,
1944
- "requires": {
1945
- "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1946
- "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1947
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1948
- "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1949
- "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1950
- "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
1951
- }
1952
- },
1953
- "glob-base": {
1954
- "version": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
1955
- "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
1956
- "dev": true,
1957
- "requires": {
1958
- "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
1959
- "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz"
1960
- }
1961
- },
1962
- "glob-parent": {
1963
- "version": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
1964
- "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
1965
- "dev": true,
1966
- "requires": {
1967
- "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz"
1968
- }
1969
- },
1970
- "graceful-fs": {
1971
- "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
1972
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
1973
- "dev": true
1974
- },
1975
- "graceful-readlink": {
1976
- "version": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
1977
- "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
1978
- "dev": true
1979
- },
1980
- "growl": {
1981
- "version": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz",
1982
- "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=",
1983
- "dev": true
1984
- },
1985
- "has": {
1986
- "version": "https://registry.npmjs.org/has/-/has-1.0.1.tgz",
1987
- "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=",
1988
- "dev": true,
1989
- "requires": {
1990
- "function-bind": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz"
1991
- }
1992
- },
1993
- "has-flag": {
1994
- "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
1995
- "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
1996
- "dev": true
1997
- },
1998
- "hash-base": {
1999
- "version": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz",
2000
- "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=",
2001
- "dev": true,
2002
- "requires": {
2003
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"
2004
- }
2005
- },
2006
- "hash.js": {
2007
- "version": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz",
2008
- "integrity": "sha1-EzL/ABVsCg/92CNgE9B7d6BFFXM=",
2009
- "dev": true,
2010
- "requires": {
2011
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"
2012
- }
2013
- },
2014
- "hmac-drbg": {
2015
- "version": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
2016
- "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
2017
- "dev": true,
2018
- "requires": {
2019
- "hash.js": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz",
2020
- "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz",
2021
- "minimalistic-crypto-utils": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz"
2022
- }
2023
- },
2024
- "htmlescape": {
2025
- "version": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
2026
- "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=",
2027
- "dev": true
2028
- },
2029
- "http-proxy-agent": {
2030
- "version": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-1.0.0.tgz",
2031
- "integrity": "sha1-zBzjjkU7+YSg93AtLdWcc9CBKEo=",
2032
- "dev": true,
2033
- "requires": {
2034
- "agent-base": "https://registry.npmjs.org/agent-base/-/agent-base-2.0.1.tgz",
2035
- "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
2036
- "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz"
2037
- }
2038
- },
2039
- "https-browserify": {
2040
- "version": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
2041
- "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
2042
- "dev": true
2043
- },
2044
- "https-proxy-agent": {
2045
- "version": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz",
2046
- "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=",
2047
- "dev": true,
2048
- "requires": {
2049
- "agent-base": "https://registry.npmjs.org/agent-base/-/agent-base-2.0.1.tgz",
2050
- "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
2051
- "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz"
2052
- }
2053
- },
2054
- "iconv-lite": {
2055
- "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.17.tgz",
2056
- "integrity": "sha1-T9qjs4rLwsAxsEXQ7c3+HsqxjI0=",
2057
- "dev": true
2058
- },
2059
- "ieee754": {
2060
- "version": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz",
2061
- "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=",
2062
- "dev": true
2063
- },
2064
- "indexof": {
2065
- "version": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
2066
- "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
2067
- "dev": true
2068
- },
2069
- "inflight": {
2070
- "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
2071
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
2072
- "dev": true,
2073
- "requires": {
2074
- "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
2075
- "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
2076
- }
2077
- },
2078
- "inherits": {
2079
- "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
2080
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
2081
- "dev": true
2082
- },
2083
- "inline-source-map": {
2084
- "version": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz",
2085
- "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=",
2086
- "dev": true,
2087
- "requires": {
2088
- "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz"
2089
- }
2090
- },
2091
- "insert-module-globals": {
2092
- "version": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.1.tgz",
2093
- "integrity": "sha1-wDv04BywhtW15azorQr+eInWOMM=",
2094
- "dev": true,
2095
- "requires": {
2096
- "JSONStream": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz",
2097
- "combine-source-map": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.7.2.tgz",
2098
- "concat-stream": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz",
2099
- "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz",
2100
- "lexical-scope": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz",
2101
- "process": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
2102
- "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
2103
- "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz"
2104
- }
2105
- },
2106
- "invert-kv": {
2107
- "version": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
2108
- "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
2109
- "dev": true
2110
- },
2111
- "ip": {
2112
- "version": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
2113
- "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
2114
- "dev": true
2115
- },
2116
- "is-binary-path": {
2117
- "version": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
2118
- "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
2119
- "dev": true,
2120
- "requires": {
2121
- "binary-extensions": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz"
2122
- }
2123
- },
2124
- "is-buffer": {
2125
- "version": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz",
2126
- "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=",
2127
- "dev": true
2128
- },
2129
- "is-dotfile": {
2130
- "version": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz",
2131
- "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=",
2132
- "dev": true
2133
- },
2134
- "is-equal-shallow": {
2135
- "version": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
2136
- "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
2137
- "dev": true,
2138
- "requires": {
2139
- "is-primitive": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz"
2140
- }
2141
- },
2142
- "is-extendable": {
2143
- "version": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
2144
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
2145
- "dev": true
2146
- },
2147
- "is-extglob": {
2148
- "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
2149
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
2150
- "dev": true
2151
- },
2152
- "is-glob": {
2153
- "version": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
2154
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
2155
- "dev": true,
2156
- "requires": {
2157
- "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz"
2158
- }
2159
- },
2160
- "is-number": {
2161
- "version": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
2162
- "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
2163
- "dev": true,
2164
- "requires": {
2165
- "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz"
2166
- }
2167
- },
2168
- "is-posix-bracket": {
2169
- "version": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
2170
- "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
2171
- "dev": true
2172
- },
2173
- "is-primitive": {
2174
- "version": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
2175
- "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
2176
- "dev": true
2177
- },
2178
- "isarray": {
2179
- "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
2180
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
2181
- "dev": true
2182
- },
2183
- "isobject": {
2184
- "version": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
2185
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
2186
- "dev": true,
2187
- "requires": {
2188
- "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
2189
- }
2190
- },
2191
- "json-stable-stringify": {
2192
- "version": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz",
2193
- "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=",
2194
- "dev": true,
2195
- "requires": {
2196
- "jsonify": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz"
2197
- }
2198
- },
2199
- "json3": {
2200
- "version": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
2201
- "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
2202
- "dev": true
2203
- },
2204
- "jsonify": {
2205
- "version": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
2206
- "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
2207
- "dev": true
2208
- },
2209
- "jsonparse": {
2210
- "version": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
2211
- "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
2212
- "dev": true
2213
- },
2214
- "kew": {
2215
- "version": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz",
2216
- "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=",
2217
- "dev": true
2218
- },
2219
- "kind-of": {
2220
- "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
2221
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
2222
- "dev": true,
2223
- "requires": {
2224
- "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz"
2225
- }
2226
- },
2227
- "labeled-stream-splicer": {
2228
- "version": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz",
2229
- "integrity": "sha1-pS4dE4AkwAuGscDJH2d5GLiuClk=",
2230
- "dev": true,
2231
- "requires": {
2232
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
2233
- "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
2234
- "stream-splicer": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz"
2235
- },
2236
- "dependencies": {
2237
- "isarray": {
2238
- "version": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
2239
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
2240
- "dev": true
2241
- }
2242
- }
2243
- },
2244
- "lazy-cache": {
2245
- "version": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
2246
- "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
2247
- "dev": true
2248
- },
2249
- "lcid": {
2250
- "version": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
2251
- "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
2252
- "dev": true,
2253
- "requires": {
2254
- "invert-kv": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz"
2255
- }
2256
- },
2257
- "levn": {
2258
- "version": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
2259
- "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
2260
- "dev": true,
2261
- "requires": {
2262
- "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
2263
- "type-check": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz"
2264
- }
2265
- },
2266
- "lexical-scope": {
2267
- "version": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz",
2268
- "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=",
2269
- "dev": true,
2270
- "requires": {
2271
- "astw": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz"
2272
- }
2273
- },
2274
- "lodash._arraycopy": {
2275
- "version": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz",
2276
- "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=",
2277
- "dev": true
2278
- },
2279
- "lodash._arrayeach": {
2280
- "version": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz",
2281
- "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=",
2282
- "dev": true
2283
- },
2284
- "lodash._baseassign": {
2285
- "version": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
2286
- "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
2287
- "dev": true,
2288
- "requires": {
2289
- "lodash._basecopy": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
2290
- "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz"
2291
- }
2292
- },
2293
- "lodash._baseclone": {
2294
- "version": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz",
2295
- "integrity": "sha1-MDUZv2OT/n5C802LYw73eU41Qrc=",
2296
- "dev": true,
2297
- "requires": {
2298
- "lodash._arraycopy": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz",
2299
- "lodash._arrayeach": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz",
2300
- "lodash._baseassign": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
2301
- "lodash._basefor": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz",
2302
- "lodash.isarray": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
2303
- "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz"
2304
- }
2305
- },
2306
- "lodash._basecopy": {
2307
- "version": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
2308
- "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
2309
- "dev": true
2310
- },
2311
- "lodash._basecreate": {
2312
- "version": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz",
2313
- "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=",
2314
- "dev": true
2315
- },
2316
- "lodash._basefor": {
2317
- "version": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz",
2318
- "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=",
2319
- "dev": true
2320
- },
2321
- "lodash._bindcallback": {
2322
- "version": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz",
2323
- "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=",
2324
- "dev": true
2325
- },
2326
- "lodash._getnative": {
2327
- "version": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
2328
- "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
2329
- "dev": true
2330
- },
2331
- "lodash._isiterateecall": {
2332
- "version": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
2333
- "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
2334
- "dev": true
2335
- },
2336
- "lodash._stack": {
2337
- "version": "https://registry.npmjs.org/lodash._stack/-/lodash._stack-4.1.3.tgz",
2338
- "integrity": "sha1-dRqnbBuWSwR+dtFPxyoJP8teLdA=",
2339
- "dev": true
2340
- },
2341
- "lodash.clone": {
2342
- "version": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-3.0.3.tgz",
2343
- "integrity": "sha1-hGiMc9MrWpDKJWFpY/GJJSqZcEM=",
2344
- "dev": true,
2345
- "requires": {
2346
- "lodash._baseclone": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz",
2347
- "lodash._bindcallback": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz",
2348
- "lodash._isiterateecall": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz"
2349
- }
2350
- },
2351
- "lodash.create": {
2352
- "version": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz",
2353
- "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=",
2354
- "dev": true,
2355
- "requires": {
2356
- "lodash._baseassign": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
2357
- "lodash._basecreate": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz",
2358
- "lodash._isiterateecall": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz"
2359
- }
2360
- },
2361
- "lodash.defaultsdeep": {
2362
- "version": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.3.2.tgz",
2363
- "integrity": "sha1-bBpYbmxWR7DmTi15gUG4g2FYvoo=",
2364
- "dev": true,
2365
- "requires": {
2366
- "lodash._baseclone": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-4.5.7.tgz",
2367
- "lodash._stack": "https://registry.npmjs.org/lodash._stack/-/lodash._stack-4.1.3.tgz",
2368
- "lodash.isplainobject": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
2369
- "lodash.keysin": "https://registry.npmjs.org/lodash.keysin/-/lodash.keysin-4.2.0.tgz",
2370
- "lodash.mergewith": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz",
2371
- "lodash.rest": "https://registry.npmjs.org/lodash.rest/-/lodash.rest-4.0.5.tgz"
2372
- },
2373
- "dependencies": {
2374
- "lodash._baseclone": {
2375
- "version": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-4.5.7.tgz",
2376
- "integrity": "sha1-zkKt4IOE711i+nfDD2GkbmhvhDQ=",
2377
- "dev": true
2378
- }
2379
- }
2380
- },
2381
- "lodash.isarguments": {
2382
- "version": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
2383
- "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
2384
- "dev": true
2385
- },
2386
- "lodash.isarray": {
2387
- "version": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
2388
- "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
2389
- "dev": true
2390
- },
2391
- "lodash.isplainobject": {
2392
- "version": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
2393
- "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
2394
- "dev": true
2395
- },
2396
- "lodash.keys": {
2397
- "version": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
2398
- "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
2399
- "dev": true,
2400
- "requires": {
2401
- "lodash._getnative": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
2402
- "lodash.isarguments": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
2403
- "lodash.isarray": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz"
2404
- }
2405
- },
2406
- "lodash.keysin": {
2407
- "version": "https://registry.npmjs.org/lodash.keysin/-/lodash.keysin-4.2.0.tgz",
2408
- "integrity": "sha1-jMP7NcLZSsxEOhhj4C+kB5nqbyg=",
2409
- "dev": true
2410
- },
2411
- "lodash.memoize": {
2412
- "version": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
2413
- "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=",
2414
- "dev": true
2415
- },
2416
- "lodash.mergewith": {
2417
- "version": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz",
2418
- "integrity": "sha1-FQzwoWeR9ZA7iJHqsVRgknS96lU=",
2419
- "dev": true
2420
- },
2421
- "lodash.rest": {
2422
- "version": "https://registry.npmjs.org/lodash.rest/-/lodash.rest-4.0.5.tgz",
2423
- "integrity": "sha1-lU73UEkmIDjJbR/Jiyj9r58Hcqo=",
2424
- "dev": true
2425
- },
2426
- "longest": {
2427
- "version": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
2428
- "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
2429
- "dev": true
2430
- },
2431
- "lru-cache": {
2432
- "version": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz",
2433
- "integrity": "sha1-5W1jVBSO3o13B7WNFDIg/QjfD9U=",
2434
- "dev": true
2435
- },
2436
- "map-stream": {
2437
- "version": "0.1.0",
2438
- "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
2439
- "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=",
2440
- "dev": true
2441
- },
2442
- "micromatch": {
2443
- "version": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
2444
- "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
2445
- "dev": true,
2446
- "requires": {
2447
- "arr-diff": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
2448
- "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
2449
- "braces": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
2450
- "expand-brackets": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
2451
- "extglob": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
2452
- "filename-regex": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
2453
- "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
2454
- "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
2455
- "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
2456
- "normalize-path": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
2457
- "object.omit": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
2458
- "parse-glob": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
2459
- "regex-cache": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz"
2460
- }
2461
- },
2462
- "miller-rabin": {
2463
- "version": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz",
2464
- "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=",
2465
- "dev": true,
2466
- "requires": {
2467
- "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
2468
- "brorand": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz"
2469
- }
2470
- },
2471
- "minimalistic-assert": {
2472
- "version": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz",
2473
- "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=",
2474
- "dev": true
2475
- },
2476
- "minimalistic-crypto-utils": {
2477
- "version": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
2478
- "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
2479
- "dev": true
2480
- },
2481
- "minimatch": {
2482
- "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
2483
- "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
2484
- "dev": true,
2485
- "requires": {
2486
- "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz"
2487
- }
2488
- },
2489
- "minimist": {
2490
- "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
2491
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
2492
- "dev": true
2493
- },
2494
- "mkdirp": {
2495
- "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
2496
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
2497
- "dev": true,
2498
- "requires": {
2499
- "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz"
2500
- },
2501
- "dependencies": {
2502
- "minimist": {
2503
- "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
2504
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
2505
- "dev": true
2506
- }
2507
- }
2508
- },
2509
- "mkpath": {
2510
- "version": "https://registry.npmjs.org/mkpath/-/mkpath-1.0.0.tgz",
2511
- "integrity": "sha1-67Opd+evHGg65v2hK1Raa6bFhT0=",
2512
- "dev": true
2513
- },
2514
- "mocha-nightwatch": {
2515
- "version": "https://registry.npmjs.org/mocha-nightwatch/-/mocha-nightwatch-3.2.2.tgz",
2516
- "integrity": "sha1-kby5s73gV912d8eBJeSR5Y1mZHw=",
2517
- "dev": true,
2518
- "requires": {
2519
- "browser-stdout": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
2520
- "commander": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
2521
- "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
2522
- "diff": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz",
2523
- "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
2524
- "glob": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz",
2525
- "growl": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz",
2526
- "json3": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
2527
- "lodash.create": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz",
2528
- "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
2529
- "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz"
2530
- },
2531
- "dependencies": {
2532
- "glob": {
2533
- "version": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz",
2534
- "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=",
2535
- "dev": true,
2536
- "requires": {
2537
- "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
2538
- "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
2539
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
2540
- "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
2541
- "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
2542
- "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
2543
- }
2544
- }
2545
- }
2546
- },
2547
- "module-deps": {
2548
- "version": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz",
2549
- "integrity": "sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=",
2550
- "dev": true,
2551
- "requires": {
2552
- "JSONStream": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz",
2553
- "browser-resolve": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz",
2554
- "cached-path-relative": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz",
2555
- "concat-stream": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz",
2556
- "defined": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
2557
- "detective": "https://registry.npmjs.org/detective/-/detective-4.5.0.tgz",
2558
- "duplexer2": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
2559
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
2560
- "parents": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
2561
- "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz",
2562
- "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz",
2563
- "stream-combiner2": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
2564
- "subarg": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
2565
- "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
2566
- "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz"
2567
- }
2568
- },
2569
- "ms": {
2570
- "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
2571
- "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
2572
- "dev": true
2573
- },
2574
- "nan": {
2575
- "version": "2.6.2",
2576
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz",
2577
- "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=",
2578
- "dev": true,
2579
- "optional": true
2580
- },
2581
- "netmask": {
2582
- "version": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz",
2583
- "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=",
2584
- "dev": true
2585
- },
2586
- "nightwatch": {
2587
- "version": "https://registry.npmjs.org/nightwatch/-/nightwatch-0.9.15.tgz",
2588
- "integrity": "sha1-caYqoWNo6doJ+ugAzLn7NNA2Fk0=",
2589
- "dev": true,
2590
- "requires": {
2591
- "chai-nightwatch": "https://registry.npmjs.org/chai-nightwatch/-/chai-nightwatch-0.1.1.tgz",
2592
- "ejs": "https://registry.npmjs.org/ejs/-/ejs-0.8.3.tgz",
2593
- "lodash.clone": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-3.0.3.tgz",
2594
- "lodash.defaultsdeep": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.3.2.tgz",
2595
- "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
2596
- "mkpath": "https://registry.npmjs.org/mkpath/-/mkpath-1.0.0.tgz",
2597
- "mocha-nightwatch": "https://registry.npmjs.org/mocha-nightwatch/-/mocha-nightwatch-3.2.2.tgz",
2598
- "optimist": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
2599
- "proxy-agent": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-2.0.0.tgz",
2600
- "q": "https://registry.npmjs.org/q/-/q-1.4.1.tgz"
2601
- },
2602
- "dependencies": {
2603
- "minimatch": {
2604
- "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
2605
- "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=",
2606
- "dev": true,
2607
- "requires": {
2608
- "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz"
2609
- }
2610
- }
2611
- }
2612
- },
2613
- "normalize-path": {
2614
- "version": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
2615
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
2616
- "dev": true,
2617
- "requires": {
2618
- "remove-trailing-separator": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz"
2619
- }
2620
- },
2621
- "object.omit": {
2622
- "version": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
2623
- "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
2624
- "dev": true,
2625
- "requires": {
2626
- "for-own": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
2627
- "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz"
2628
- }
2629
- },
2630
- "once": {
2631
- "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
2632
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
2633
- "dev": true,
2634
- "requires": {
2635
- "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
2636
- }
2637
- },
2638
- "optimist": {
2639
- "version": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
2640
- "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
2641
- "dev": true,
2642
- "requires": {
2643
- "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
2644
- "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz"
2645
- },
2646
- "dependencies": {
2647
- "minimist": {
2648
- "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
2649
- "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
2650
- "dev": true
2651
- }
2652
- }
2653
- },
2654
- "optionator": {
2655
- "version": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
2656
- "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
2657
- "dev": true,
2658
- "requires": {
2659
- "deep-is": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
2660
- "fast-levenshtein": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
2661
- "levn": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
2662
- "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
2663
- "type-check": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
2664
- "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz"
2665
- },
2666
- "dependencies": {
2667
- "wordwrap": {
2668
- "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
2669
- "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
2670
- "dev": true
2671
- }
2672
- }
2673
- },
2674
- "os-browserify": {
2675
- "version": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz",
2676
- "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=",
2677
- "dev": true
2678
- },
2679
- "os-locale": {
2680
- "version": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
2681
- "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
2682
- "dev": true,
2683
- "requires": {
2684
- "lcid": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz"
2685
- }
2686
- },
2687
- "outpipe": {
2688
- "version": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz",
2689
- "integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=",
2690
- "dev": true,
2691
- "requires": {
2692
- "shell-quote": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz"
2693
- }
2694
- },
2695
- "pac-proxy-agent": {
2696
- "version": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-1.0.0.tgz",
2697
- "integrity": "sha1-3NW3RlgTZ0MKI26I6s/U5bjQaKU=",
2698
- "dev": true,
2699
- "requires": {
2700
- "agent-base": "https://registry.npmjs.org/agent-base/-/agent-base-2.0.1.tgz",
2701
- "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
2702
- "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
2703
- "get-uri": "https://registry.npmjs.org/get-uri/-/get-uri-1.1.0.tgz",
2704
- "http-proxy-agent": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-1.0.0.tgz",
2705
- "https-proxy-agent": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz",
2706
- "pac-resolver": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-1.2.6.tgz",
2707
- "socks-proxy-agent": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-2.0.0.tgz",
2708
- "stream-to-buffer": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz"
2709
- }
2710
- },
2711
- "pac-resolver": {
2712
- "version": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-1.2.6.tgz",
2713
- "integrity": "sha1-7QOvDFtZM1Bb3T8H91F1Rm1efPs=",
2714
- "dev": true,
2715
- "requires": {
2716
- "co": "https://registry.npmjs.org/co/-/co-3.0.6.tgz",
2717
- "degenerator": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz",
2718
- "netmask": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz",
2719
- "regenerator": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.46.tgz",
2720
- "thunkify": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz"
2721
- }
2722
- },
2723
- "pako": {
2724
- "version": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
2725
- "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=",
2726
- "dev": true
2727
- },
2728
- "parents": {
2729
- "version": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
2730
- "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=",
2731
- "dev": true,
2732
- "requires": {
2733
- "path-platform": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz"
2734
- }
2735
- },
2736
- "parse-asn1": {
2737
- "version": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz",
2738
- "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=",
2739
- "dev": true,
2740
- "requires": {
2741
- "asn1.js": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz",
2742
- "browserify-aes": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz",
2743
- "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz",
2744
- "evp_bytestokey": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz",
2745
- "pbkdf2": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz"
2746
- }
2747
- },
2748
- "parse-glob": {
2749
- "version": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
2750
- "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
2751
- "dev": true,
2752
- "requires": {
2753
- "glob-base": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
2754
- "is-dotfile": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz",
2755
- "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
2756
- "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz"
2757
- }
2758
- },
2759
- "path-browserify": {
2760
- "version": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
2761
- "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
2762
- "dev": true
2763
- },
2764
- "path-is-absolute": {
2765
- "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
2766
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
2767
- "dev": true
2768
- },
2769
- "path-parse": {
2770
- "version": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
2771
- "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
2772
- "dev": true
2773
- },
2774
- "path-platform": {
2775
- "version": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
2776
- "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=",
2777
- "dev": true
2778
- },
2779
- "pause-stream": {
2780
- "version": "0.0.11",
2781
- "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
2782
- "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
2783
- "dev": true,
2784
- "requires": {
2785
- "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
2786
- }
2787
- },
2788
- "pbkdf2": {
2789
- "version": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz",
2790
- "integrity": "sha1-vjZ4XFBn6kjYBv+SMojF91C2uKI=",
2791
- "dev": true,
2792
- "requires": {
2793
- "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz",
2794
- "create-hmac": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz",
2795
- "ripemd160": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz",
2796
- "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz",
2797
- "sha.js": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz"
2798
- }
2799
- },
2800
- "prelude-ls": {
2801
- "version": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
2802
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
2803
- "dev": true
2804
- },
2805
- "preserve": {
2806
- "version": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
2807
- "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
2808
- "dev": true
2809
- },
2810
- "private": {
2811
- "version": "https://registry.npmjs.org/private/-/private-0.1.7.tgz",
2812
- "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=",
2813
- "dev": true
2814
- },
2815
- "process": {
2816
- "version": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
2817
- "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
2818
- "dev": true
2819
- },
2820
- "process-nextick-args": {
2821
- "version": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
2822
- "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
2823
- "dev": true
2824
- },
2825
- "proxy-agent": {
2826
- "version": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-2.0.0.tgz",
2827
- "integrity": "sha1-V+tTR6qAXXTsaByyVknbo5yTNJk=",
2828
- "dev": true,
2829
- "requires": {
2830
- "agent-base": "https://registry.npmjs.org/agent-base/-/agent-base-2.0.1.tgz",
2831
- "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
2832
- "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
2833
- "http-proxy-agent": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-1.0.0.tgz",
2834
- "https-proxy-agent": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz",
2835
- "lru-cache": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz",
2836
- "pac-proxy-agent": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-1.0.0.tgz",
2837
- "socks-proxy-agent": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-2.0.0.tgz"
2838
- }
2839
- },
2840
- "ps-tree": {
2841
- "version": "1.1.0",
2842
- "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz",
2843
- "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=",
2844
- "dev": true,
2845
- "requires": {
2846
- "event-stream": "3.3.4"
2847
- }
2848
- },
2849
- "public-encrypt": {
2850
- "version": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz",
2851
- "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=",
2852
- "dev": true,
2853
- "requires": {
2854
- "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
2855
- "browserify-rsa": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
2856
- "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz",
2857
- "parse-asn1": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz",
2858
- "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz"
2859
- }
2860
- },
2861
- "punycode": {
2862
- "version": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
2863
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
2864
- "dev": true
2865
- },
2866
- "q": {
2867
- "version": "https://registry.npmjs.org/q/-/q-1.4.1.tgz",
2868
- "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=",
2869
- "dev": true
2870
- },
2871
- "querystring": {
2872
- "version": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
2873
- "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
2874
- "dev": true
2875
- },
2876
- "querystring-es3": {
2877
- "version": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
2878
- "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
2879
- "dev": true
2880
- },
2881
- "randomatic": {
2882
- "version": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.6.tgz",
2883
- "integrity": "sha1-EQ3Kv/OX6dz/fAeJzMCkmt8exbs=",
2884
- "dev": true,
2885
- "requires": {
2886
- "is-number": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
2887
- "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz"
2888
- }
2889
- },
2890
- "randombytes": {
2891
- "version": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz",
2892
- "integrity": "sha1-Z0yZdgkBw8QRJ3GjHlIdw0nMCew=",
2893
- "dev": true
2894
- },
2895
- "read-only-stream": {
2896
- "version": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
2897
- "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=",
2898
- "dev": true,
2899
- "requires": {
2900
- "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz"
2901
- }
2902
- },
2903
- "readable-stream": {
2904
- "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz",
2905
- "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=",
2906
- "dev": true,
2907
- "requires": {
2908
- "buffer-shims": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz",
2909
- "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
2910
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
2911
- "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
2912
- "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
2913
- "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz",
2914
- "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
2915
- },
2916
- "dependencies": {
2917
- "string_decoder": {
2918
- "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz",
2919
- "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=",
2920
- "dev": true,
2921
- "requires": {
2922
- "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz"
2923
- }
2924
- }
2925
- }
2926
- },
2927
- "readdirp": {
2928
- "version": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
2929
- "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
2930
- "dev": true,
2931
- "requires": {
2932
- "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
2933
- "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
2934
- "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz",
2935
- "set-immediate-shim": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz"
2936
- }
2937
- },
2938
- "recast": {
2939
- "version": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz",
2940
- "integrity": "sha1-lCgI96oBbx+nFCxGHX5XBKqo1pc=",
2941
- "dev": true,
2942
- "requires": {
2943
- "ast-types": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.12.tgz",
2944
- "esprima-fb": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz",
2945
- "private": "https://registry.npmjs.org/private/-/private-0.1.7.tgz",
2946
- "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz"
2947
- },
2948
- "dependencies": {
2949
- "ast-types": {
2950
- "version": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.12.tgz",
2951
- "integrity": "sha1-oNkOQ1G7iHcWyD/WN+v4GK9K38w=",
2952
- "dev": true
2953
- },
2954
- "esprima-fb": {
2955
- "version": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz",
2956
- "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=",
2957
- "dev": true
2958
- }
2959
- }
2960
- },
2961
- "regenerator": {
2962
- "version": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.46.tgz",
2963
- "integrity": "sha1-FUwydoY2HtUsrWmyVF78U6PQdpY=",
2964
- "dev": true,
2965
- "requires": {
2966
- "commoner": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz",
2967
- "defs": "https://registry.npmjs.org/defs/-/defs-1.1.1.tgz",
2968
- "esprima-fb": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz",
2969
- "private": "https://registry.npmjs.org/private/-/private-0.1.7.tgz",
2970
- "recast": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz",
2971
- "regenerator-runtime": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz",
2972
- "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
2973
- },
2974
- "dependencies": {
2975
- "esprima-fb": {
2976
- "version": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz",
2977
- "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=",
2978
- "dev": true
2979
- }
2980
- }
2981
- },
2982
- "regenerator-runtime": {
2983
- "version": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz",
2984
- "integrity": "sha1-0z65XQ0gAaS+OWWXB8UbDLcc4Ck=",
2985
- "dev": true
2986
- },
2987
- "regex-cache": {
2988
- "version": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz",
2989
- "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=",
2990
- "dev": true,
2991
- "requires": {
2992
- "is-equal-shallow": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
2993
- "is-primitive": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz"
2994
- }
2995
- },
2996
- "remove-trailing-separator": {
2997
- "version": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz",
2998
- "integrity": "sha1-YV67lq9VlVLUv0BXyENtSGq2PMQ=",
2999
- "dev": true
3000
- },
3001
- "repeat-element": {
3002
- "version": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
3003
- "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
3004
- "dev": true
3005
- },
3006
- "repeat-string": {
3007
- "version": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
3008
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
3009
- "dev": true
3010
- },
3011
- "resolve": {
3012
- "version": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz",
3013
- "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=",
3014
- "dev": true,
3015
- "requires": {
3016
- "path-parse": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz"
3017
- }
3018
- },
3019
- "right-align": {
3020
- "version": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
3021
- "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
3022
- "dev": true,
3023
- "requires": {
3024
- "align-text": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz"
3025
- }
3026
- },
3027
- "rimraf": {
3028
- "version": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz",
3029
- "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=",
3030
- "dev": true,
3031
- "requires": {
3032
- "glob": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz"
3033
- }
3034
- },
3035
- "ripemd160": {
3036
- "version": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz",
3037
- "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=",
3038
- "dev": true,
3039
- "requires": {
3040
- "hash-base": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz",
3041
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"
3042
- }
3043
- },
3044
- "safe-buffer": {
3045
- "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz",
3046
- "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=",
3047
- "dev": true
3048
- },
3049
- "semver": {
3050
- "version": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz",
3051
- "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=",
3052
- "dev": true
3053
- },
3054
- "set-immediate-shim": {
3055
- "version": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
3056
- "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
3057
- "dev": true
3058
- },
3059
- "sha.js": {
3060
- "version": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz",
3061
- "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=",
3062
- "dev": true,
3063
- "requires": {
3064
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"
3065
- }
3066
- },
3067
- "shasum": {
3068
- "version": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
3069
- "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=",
3070
- "dev": true,
3071
- "requires": {
3072
- "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz",
3073
- "sha.js": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz"
3074
- }
3075
- },
3076
- "shell-quote": {
3077
- "version": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz",
3078
- "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=",
3079
- "dev": true,
3080
- "requires": {
3081
- "array-filter": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
3082
- "array-map": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
3083
- "array-reduce": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
3084
- "jsonify": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz"
3085
- }
3086
- },
3087
- "simple-fmt": {
3088
- "version": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz",
3089
- "integrity": "sha1-GRv1ZqWeZTBILLJatTtKjchcOms=",
3090
- "dev": true
3091
- },
3092
- "simple-is": {
3093
- "version": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz",
3094
- "integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA=",
3095
- "dev": true
3096
- },
3097
- "smart-buffer": {
3098
- "version": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz",
3099
- "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=",
3100
- "dev": true
3101
- },
3102
- "socks": {
3103
- "version": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz",
3104
- "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=",
3105
- "dev": true,
3106
- "requires": {
3107
- "ip": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
3108
- "smart-buffer": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz"
3109
- }
3110
- },
3111
- "socks-proxy-agent": {
3112
- "version": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-2.0.0.tgz",
3113
- "integrity": "sha1-xnSELXBBD7KK4ekuYTWpJ4VLwnU=",
3114
- "dev": true,
3115
- "requires": {
3116
- "agent-base": "https://registry.npmjs.org/agent-base/-/agent-base-2.0.1.tgz",
3117
- "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
3118
- "socks": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz"
3119
- }
3120
- },
3121
- "source-map": {
3122
- "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
3123
- "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=",
3124
- "dev": true
3125
- },
3126
- "split": {
3127
- "version": "0.3.3",
3128
- "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
3129
- "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=",
3130
- "dev": true,
3131
- "requires": {
3132
- "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
3133
- }
3134
- },
3135
- "stable": {
3136
- "version": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz",
3137
- "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=",
3138
- "dev": true
3139
- },
3140
- "stream-browserify": {
3141
- "version": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
3142
- "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
3143
- "dev": true,
3144
- "requires": {
3145
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
3146
- "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz"
3147
- }
3148
- },
3149
- "stream-combiner": {
3150
- "version": "0.0.4",
3151
- "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
3152
- "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=",
3153
- "dev": true,
3154
- "requires": {
3155
- "duplexer": "0.1.1"
3156
- }
3157
- },
3158
- "stream-combiner2": {
3159
- "version": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
3160
- "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
3161
- "dev": true,
3162
- "requires": {
3163
- "duplexer2": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
3164
- "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz"
3165
- }
3166
- },
3167
- "stream-http": {
3168
- "version": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.1.tgz",
3169
- "integrity": "sha1-VGpRdBrVprB+njGwsQRBqRffUoo=",
3170
- "dev": true,
3171
- "requires": {
3172
- "builtin-status-codes": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
3173
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
3174
- "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz",
3175
- "to-arraybuffer": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
3176
- "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz"
3177
- }
3178
- },
3179
- "stream-splicer": {
3180
- "version": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz",
3181
- "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=",
3182
- "dev": true,
3183
- "requires": {
3184
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
3185
- "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz"
3186
- }
3187
- },
3188
- "stream-to": {
3189
- "version": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz",
3190
- "integrity": "sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0=",
3191
- "dev": true
3192
- },
3193
- "stream-to-buffer": {
3194
- "version": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz",
3195
- "integrity": "sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=",
3196
- "dev": true,
3197
- "requires": {
3198
- "stream-to": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz"
3199
- }
3200
- },
3201
- "string_decoder": {
3202
- "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
3203
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
3204
- "dev": true
3205
- },
3206
- "stringmap": {
3207
- "version": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz",
3208
- "integrity": "sha1-VWwTeyWPlCuHdvWy71gqoGnX0bE=",
3209
- "dev": true
3210
- },
3211
- "stringset": {
3212
- "version": "https://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz",
3213
- "integrity": "sha1-7yWcTjSTRDd/zRyRPdLoSMnAQrU=",
3214
- "dev": true
3215
- },
3216
- "subarg": {
3217
- "version": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
3218
- "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=",
3219
- "dev": true,
3220
- "requires": {
3221
- "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz"
3222
- }
3223
- },
3224
- "supports-color": {
3225
- "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz",
3226
- "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=",
3227
- "dev": true,
3228
- "requires": {
3229
- "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz"
3230
- }
3231
- },
3232
- "syntax-error": {
3233
- "version": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz",
3234
- "integrity": "sha1-HtkmbE1AvnXcVb+bsct3Biu5bKE=",
3235
- "dev": true,
3236
- "requires": {
3237
- "acorn": "https://registry.npmjs.org/acorn/-/acorn-4.0.11.tgz"
3238
- }
3239
- },
3240
- "through": {
3241
- "version": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
3242
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
3243
- "dev": true
3244
- },
3245
- "through2": {
3246
- "version": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
3247
- "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
3248
- "dev": true,
3249
- "requires": {
3250
- "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz",
3251
- "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz"
3252
- }
3253
- },
3254
- "thunkify": {
3255
- "version": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz",
3256
- "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=",
3257
- "dev": true
3258
- },
3259
- "timers-browserify": {
3260
- "version": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
3261
- "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=",
3262
- "dev": true,
3263
- "requires": {
3264
- "process": "https://registry.npmjs.org/process/-/process-0.11.10.tgz"
3265
- }
3266
- },
3267
- "to-arraybuffer": {
3268
- "version": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
3269
- "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
3270
- "dev": true
3271
- },
3272
- "tryor": {
3273
- "version": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz",
3274
- "integrity": "sha1-gUXkynyv9ArN48z5Rui4u3W0Fys=",
3275
- "dev": true
3276
- },
3277
- "tty-browserify": {
3278
- "version": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
3279
- "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
3280
- "dev": true
3281
- },
3282
- "type-check": {
3283
- "version": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
3284
- "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
3285
- "dev": true,
3286
- "requires": {
3287
- "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz"
3288
- }
3289
- },
3290
- "type-detect": {
3291
- "version": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
3292
- "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=",
3293
- "dev": true
3294
- },
3295
- "typedarray": {
3296
- "version": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
3297
- "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
3298
- "dev": true
3299
- },
3300
- "umd": {
3301
- "version": "https://registry.npmjs.org/umd/-/umd-3.0.1.tgz",
3302
- "integrity": "sha1-iuVW4RAR9jwllnCKiDclnwGz1g4=",
3303
- "dev": true
3304
- },
3305
- "url": {
3306
- "version": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
3307
- "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
3308
- "dev": true,
3309
- "requires": {
3310
- "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
3311
- "querystring": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz"
3312
- },
3313
- "dependencies": {
3314
- "punycode": {
3315
- "version": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
3316
- "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
3317
- "dev": true
3318
- }
3319
- }
3320
- },
3321
- "util": {
3322
- "version": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
3323
- "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
3324
- "dev": true,
3325
- "requires": {
3326
- "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
3327
- },
3328
- "dependencies": {
3329
- "inherits": {
3330
- "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
3331
- "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
3332
- "dev": true
3333
- }
3334
- }
3335
- },
3336
- "util-deprecate": {
3337
- "version": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
3338
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
3339
- "dev": true
3340
- },
3341
- "vm-browserify": {
3342
- "version": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
3343
- "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
3344
- "dev": true,
3345
- "requires": {
3346
- "indexof": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz"
3347
- }
3348
- },
3349
- "watchify": {
3350
- "version": "https://registry.npmjs.org/watchify/-/watchify-3.9.0.tgz",
3351
- "integrity": "sha1-8HX9LoqGrN6Eztum5cKgvt1SPZ4=",
3352
- "dev": true,
3353
- "requires": {
3354
- "anymatch": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz",
3355
- "browserify": "https://registry.npmjs.org/browserify/-/browserify-14.3.0.tgz",
3356
- "chokidar": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
3357
- "defined": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
3358
- "outpipe": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz",
3359
- "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
3360
- "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz"
3361
- }
3362
- },
3363
- "window-size": {
3364
- "version": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz",
3365
- "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=",
3366
- "dev": true
3367
- },
3368
- "wordwrap": {
3369
- "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
3370
- "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
3371
- "dev": true
3372
- },
3373
- "wrappy": {
3374
- "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
3375
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
3376
- "dev": true
3377
- },
3378
- "xregexp": {
3379
- "version": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz",
3380
- "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=",
3381
- "dev": true
3382
- },
3383
- "xtend": {
3384
- "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
3385
- "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
3386
- "dev": true
3387
- },
3388
- "y18n": {
3389
- "version": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
3390
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
3391
- "dev": true
3392
- },
3393
- "yargs": {
3394
- "version": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz",
3395
- "integrity": "sha1-ISBUaTFuk5Ex1Z8toMbX+YIh6kA=",
3396
- "dev": true,
3397
- "requires": {
3398
- "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
3399
- "cliui": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
3400
- "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
3401
- "os-locale": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
3402
- "window-size": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz",
3403
- "y18n": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz"
3404
- }
3405
- }
3406
- }
3407
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
readme.txt CHANGED
@@ -1,12 +1,12 @@
1
  === ACF Content Analysis for Yoast SEO ===
2
  Contributors: yoast, angrycreative, kraftner, marcusforsberg, viktorfroberg, joostdevalk, atimmer, jipmoors, theorboman
3
  Tags: Yoast, SEO, ACF, Advanced Custom Fields, analysis, Search Engine Optimization
4
- Requires at least: 4.3.1
5
- Tested up to: 4.8.2
6
  License: GPLv3
7
  License URI: http://www.gnu.org/licenses/gpl.html
8
- Stable tag: 2.0.1
9
- Text Domain: acf-content-analysis-for-yoast-seo
10
 
11
  WordPress plugin that adds the content of all ACF fields to the Yoast SEO score analysis.
12
 
@@ -24,8 +24,49 @@ This Plugin is compatible with the free ACF 4 Version as well as with the PRO Ve
24
 
25
  Previously called Yoast ACF Analysis.
26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  == Changelog ==
28
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  = 2.0.1 =
30
 
31
  Released October 19th, 2017
1
  === ACF Content Analysis for Yoast SEO ===
2
  Contributors: yoast, angrycreative, kraftner, marcusforsberg, viktorfroberg, joostdevalk, atimmer, jipmoors, theorboman
3
  Tags: Yoast, SEO, ACF, Advanced Custom Fields, analysis, Search Engine Optimization
4
+ Requires at least: 4.8
5
+ Tested up to: 4.9.7
6
  License: GPLv3
7
  License URI: http://www.gnu.org/licenses/gpl.html
8
+ Stable tag: 2.1.0
9
+ Requires PHP: 5.2.4
10
 
11
  WordPress plugin that adds the content of all ACF fields to the Yoast SEO score analysis.
12
 
24
 
25
  Previously called Yoast ACF Analysis.
26
 
27
+ == Filters ==
28
+
29
+ = Remove specific field from scoring =
30
+ `add_filter( 'yoast-acf-analysis/blacklist_name', function ( $blacklist_name ) {
31
+ $blacklist_name->add( 'my-field-name' );
32
+ return $blacklist_name;
33
+ });`
34
+
35
+ = Remove field type from scoring =
36
+ `add_filter( 'yoast-acf-analysis/blacklist_type', function ( $blacklist_type ) {
37
+ // text, image etc
38
+ $blacklist_type->add( 'text' );
39
+ $blacklist_type->add( 'image' );
40
+ return $blacklist_type;
41
+ });`
42
+
43
+ = Define custom field a specific heading value =
44
+ `add_filter( 'yoast-acf-analysis/headlines', function ( $headlines ) {
45
+ // value from 1-6, 1=h1, 6=h6
46
+ $headlines['field_591eb45f2be86'] = 3;
47
+ return $headlines;
48
+ });`
49
+
50
+ = Change refresh rate =
51
+ `add_filter( 'yoast-acf-analysis/refresh_rate', function () {
52
+ // Refresh rates in milliseconds
53
+ return 1000;
54
+ });`
55
+
56
  == Changelog ==
57
 
58
+ = 2.1.0 =
59
+
60
+ Released July 10th, 2018
61
+
62
+ Bugfixes:
63
+ * Fixes a bug where attempting to get the ACF version, wouldn't always be reliable. This would lead the plugin to think that a newer version was installed than what was actually present.
64
+ * Fixes potential conflicts with other plugins due to generic variable naming.
65
+ * Fixes a bug where the YoastSEO ACF Content analysis would attempted to be loaded, although it wasn't available.
66
+
67
+ Other:
68
+ * Adds filter examples to the readme.
69
+
70
  = 2.0.1 =
71
 
72
  Released October 19th, 2017
renovate.json ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "extends": [
3
+ "config:base"
4
+ ],
5
+ "pinVersions": false,
6
+ "dependencies": {
7
+ "pinVersions": false
8
+ },
9
+ "timezone": "Europe/Amsterdam",
10
+ "schedule": ["after 10pm and before 5am on every weekday", "every weekend"],
11
+ "updateNotScheduled": false
12
+ }
ruleset.xml DELETED
@@ -1,23 +0,0 @@
1
- <?xml version="1.0"?>
2
- <ruleset name="Yoast SEO ACF Analysis">
3
- <description>Yoast SEO ACF Analysis Coding Standards</description>
4
-
5
- <!-- ##### WordPress sniffs #####-->
6
- <rule ref="WordPress">
7
- <!-- Catches way too many things, like vars and file headers. -->
8
- <exclude name="Generic.Commenting.DocComment.MissingShort" />
9
-
10
- <!-- Namespacing hooks sound reasonable. -->
11
- <exclude name="WordPress.NamingConventions.ValidHookName.UseUnderscores" />
12
- </rule>
13
-
14
- <!-- exclude the 'empty' index files from some documentation checks -->
15
- <rule ref="Squiz.Commenting.FileComment">
16
- <exclude-pattern>*/index.php</exclude-pattern>
17
- </rule>
18
-
19
- <rule ref="Squiz.Commenting">
20
- <exclude name="Squiz.Commenting.FileComment.Missing" />
21
- </rule>
22
-
23
- </ruleset>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tests/js/system/data/acf4.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
  if(function_exists("register_field_group"))
3
  {
4
  register_field_group(array (
1
  <?php
2
+ /**
3
+ * ACF Content Analysis for Yoast SEO test file.
4
+ *
5
+ * @package YoastACFAnalysis
6
+ *
7
+ * {@internal This code comes straight out of the ACF Export function.}}
8
+ */
9
+
10
  if(function_exists("register_field_group"))
11
  {
12
  register_field_group(array (
tests/js/system/data/acf5.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
  if( function_exists('acf_add_local_field_group') ):
3
 
4
  acf_add_local_field_group(array (
@@ -78,6 +86,22 @@ if( function_exists('acf_add_local_field_group') ):
78
  'default_value' => '',
79
  'placeholder' => '',
80
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
  array (
82
  'key' => 'field_591eb4da2be8b',
83
  'label' => 'Wysiwyg',
@@ -336,4 +360,4 @@ if( function_exists('acf_add_local_field_group') ):
336
  'description' => '',
337
  ));
338
 
339
- endif;
1
  <?php
2
+ /**
3
+ * ACF Content Analysis for Yoast SEO test file.
4
+ *
5
+ * @package YoastACFAnalysis
6
+ *
7
+ * {@internal This code comes straight out of the ACF Export function.}}
8
+ */
9
+
10
  if( function_exists('acf_add_local_field_group') ):
11
 
12
  acf_add_local_field_group(array (
86
  'default_value' => '',
87
  'placeholder' => '',
88
  ),
89
+ array (
90
+ 'key' => 'field_59f14c1ce079d',
91
+ 'label' => 'Link',
92
+ 'name' => 'yoast_acf_analysis_link',
93
+ 'type' => 'link',
94
+ 'value' => NULL,
95
+ 'instructions' => '',
96
+ 'required' => 0,
97
+ 'conditional_logic' => 0,
98
+ 'wrapper' => array (
99
+ 'width' => '',
100
+ 'class' => '',
101
+ 'id' => '',
102
+ ),
103
+ 'return_format' => 'array',
104
+ ),
105
  array (
106
  'key' => 'field_591eb4da2be8b',
107
  'label' => 'Wysiwyg',
360
  'description' => '',
361
  ));
362
 
363
+ endif;
tests/js/system/data/test-data-loader-functions.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ACF Content Analysis for Yoast SEO test file.
4
+ *
5
+ * @package YoastACFAnalysis
6
+ */
7
+
8
+ // Only load data when Plugin API is available because it is not needed in Unit Tests anyway.
9
+ if ( function_exists( 'add_action' ) ) {
10
+ add_action( 'admin_init', 'yoast_acf_analysis_test_data_loader', 11 );
11
+ }
12
+
13
+ /**
14
+ * Loads ACF test data for the ACF version being tested.
15
+ */
16
+ function yoast_acf_analysis_test_data_loader() {
17
+
18
+ if ( ! defined( 'AC_YOAST_ACF_ANALYSIS_ENVIRONMENT' ) || 'development' !== AC_YOAST_ACF_ANALYSIS_ENVIRONMENT ) {
19
+ return;
20
+ }
21
+
22
+ $registry = Yoast_ACF_Analysis_Facade::get_registry();
23
+ $configuration = $registry->get( 'config' );
24
+
25
+ $version = 4;
26
+ if ( version_compare( $configuration->get_acf_version(), 5, '>=' ) ) {
27
+ $version = 5;
28
+ }
29
+
30
+ require_once AC_SEO_ACF_ANALYSIS_PLUGIN_PATH . '/tests/js/system/data/acf' . $version . '.php';
31
+
32
+ }
tests/js/system/nightwatch.conf.example.js CHANGED
@@ -1,4 +1,4 @@
1
  module.exports = (function(settings) {
2
- settings.test_settings.default.launch_url = "http://yoast-acf-analysis.vvv.dev";
3
- return settings;
4
  })(require('./nightwatch.json'));
1
  module.exports = (function(settings) {
2
+ settings.test_settings.default.launch_url = "{{DOMAIN}}";
3
+ return settings;
4
  })(require('./nightwatch.json'));
tests/js/system/nightwatch.json CHANGED
@@ -10,7 +10,7 @@
10
  },
11
  "test_settings": {
12
  "default" : {
13
- "launch_url" : "http://yoast-acf-analysis.vvv.dev",
14
  "globals" : {
15
  },
16
  "screenshots" : {
10
  },
11
  "test_settings": {
12
  "default" : {
13
+ "launch_url" : "http://local.wordpress.dev",
14
  "globals" : {
15
  },
16
  "screenshots" : {
tests/js/system/pages/WordPressHelper.js CHANGED
@@ -1,3 +1,5 @@
 
 
1
  module.exports = {
2
  url: function() {
3
  return this.api.launchUrl + '/wp/wp-login.php';
@@ -44,4 +46,4 @@ module.exports = {
44
  }
45
  }
46
  ]
47
- };
1
+ /* globals YoastACFAnalysisConfig */
2
+
3
  module.exports = {
4
  url: function() {
5
  return this.api.launchUrl + '/wp/wp-login.php';
46
  }
47
  }
48
  ]
49
+ };
tests/js/system/tests/acf5/content-pro.js CHANGED
@@ -56,6 +56,39 @@ module.exports = {
56
 
57
  },
58
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
59
  after : function(browser) {
60
  browser.end();
61
  }
56
 
57
  },
58
 
59
+ 'Link Field': function (browser) {
60
+
61
+ var hashUrl = 'http://' + dummyContent.hash();
62
+ var hashLinkText = dummyContent.hash();
63
+
64
+ browser.element('css selector', '.acf-field-link .button', function(res) {
65
+ if( 0 === res.status ){
66
+ //Open Modal
67
+ browser.click('.acf-field-link .button');
68
+ }
69
+ });
70
+
71
+ // Update Url
72
+ browser.waitForElementVisible('#wp-link-url', 1000);
73
+ browser
74
+ .clearValue( '#wp-link-url')
75
+ .setValue( '#wp-link-url', hashUrl );
76
+
77
+ // Update Link Text
78
+ browser.waitForElementVisible('#wp-link-text', 1000);
79
+ browser
80
+ .clearValue( '#wp-link-text')
81
+ .setValue( '#wp-link-text', hashLinkText );
82
+
83
+ // Insert Attachment (closes Modal)
84
+ browser.click("#wp-link-submit");
85
+
86
+ browser.pause( 15000 );
87
+
88
+ logContains( browser, 'href=\\"' + hashUrl + '\\" target=\\"\\">' + hashLinkText, browser.assert.ok );
89
+
90
+ },
91
+
92
  after : function(browser) {
93
  browser.end();
94
  }
tests/js/system/tests/acf5/relational.js CHANGED
@@ -34,14 +34,14 @@ module.exports = {
34
 
35
  browser.execute(
36
  function() {
37
- return parseFloat(YoastACFAnalysisConfig.acfVersion, 10);
38
  },
39
  [],
40
  function( result ){
41
- var acfVersion = result.value;
42
  var inputSelector, optionSelector, choiceSelector;
43
 
44
- if( acfVersion >= 5.6 ){
45
  inputSelector = '.acf-taxonomy-field[data-type="multi_select"][data-taxonomy="category"] .select2-search__field ';
46
  optionSelector = '.select2-results__option--highlighted';
47
  choiceSelector = '.acf-taxonomy-field .select2-selection__choice';
@@ -64,7 +64,7 @@ module.exports = {
64
  browser.execute(
65
  function() {
66
 
67
- var select2Target = (parseFloat(YoastACFAnalysisConfig.acfVersion, 10) >= 5.6)?'select':'input';
68
 
69
  return jQuery('.acf-taxonomy-field[data-type="multi_select"] ' + select2Target).select2('data')[0].text
70
  },
34
 
35
  browser.execute(
36
  function() {
37
+ return parseFloat(acf.select2.version, 10);
38
  },
39
  [],
40
  function( result ){
41
+ var select2Version = result.value;
42
  var inputSelector, optionSelector, choiceSelector;
43
 
44
+ if( select2Version >= 4 ){
45
  inputSelector = '.acf-taxonomy-field[data-type="multi_select"][data-taxonomy="category"] .select2-search__field ';
46
  optionSelector = '.select2-results__option--highlighted';
47
  choiceSelector = '.acf-taxonomy-field .select2-selection__choice';
64
  browser.execute(
65
  function() {
66
 
67
+ var select2Target = (parseFloat(acf.select2.version, 10) >= 4)?'select':'input';
68
 
69
  return jQuery('.acf-taxonomy-field[data-type="multi_select"] ' + select2Target).select2('data')[0].text
70
  },
tests/js/system/tests/general/basic.js CHANGED
@@ -1,4 +1,5 @@
1
- var assert = require('assert');
 
2
  var logContains = require('../../helpers/logContains');
3
  var dummyContent = require('../../helpers/dummyContent');
4
  var simpleField = require('../../helpers/simpleField');
1
+ /* globals YoastACFAnalysisConfig */
2
+
3
  var logContains = require('../../helpers/logContains');
4
  var dummyContent = require('../../helpers/dummyContent');
5
  var simpleField = require('../../helpers/simpleField');
tests/js/system/tests/general/filters.js CHANGED
@@ -1,7 +1,7 @@
1
- var assert = require('assert');
 
2
  var logContains = require('../../helpers/logContains');
3
  var dummyContent = require('../../helpers/dummyContent');
4
- var simpleField = require('../../helpers/simpleField');
5
 
6
  module.exports = {
7
  tags: ['acf4', 'acf5', 'filters'],
1
+ /* global YoastACFAnalysisConfig */
2
+
3
  var logContains = require('../../helpers/logContains');
4
  var dummyContent = require('../../helpers/dummyContent');
 
5
 
6
  module.exports = {
7
  tags: ['acf4', 'acf5', 'filters'],
tests/php/unit/Configuration/StringStoreTest.php DELETED
@@ -1,118 +0,0 @@
1
- <?php
2
-
3
-
4
- namespace Yoast\AcfAnalysis\Tests\Configuration;
5
-
6
-
7
- class StringStoreTest extends \PHPUnit_Framework_TestCase {
8
-
9
- /**
10
- * @return \Yoast_ACF_Analysis_String_Store
11
- */
12
- protected function getStore() {
13
- return new \Yoast_ACF_Analysis_String_Store();
14
- }
15
-
16
- public function testEmpty(){
17
- $store = $this->getStore();
18
- $this->assertEmpty( $store->to_array() );
19
- }
20
-
21
- public function testAdd(){
22
-
23
- $type = "test";
24
-
25
- $store = $this->getStore();
26
- $store->add( $type );
27
-
28
- $this->assertSame( [ $type ], $store->to_array() );
29
-
30
- }
31
-
32
- public function testAddSame(){
33
-
34
- $type = "test";
35
-
36
- $store = $this->getStore();
37
- $store->add( $type );
38
- $store->add( $type );
39
-
40
- $this->assertSame( [ $type ], $store->to_array() );
41
-
42
- }
43
-
44
- public function testAddMultiple(){
45
-
46
- $typeA= "A";
47
- $typeB= "B";
48
-
49
- $store = $this->getStore();
50
- $store->add( $typeA );
51
- $store->add( $typeB );
52
-
53
- $this->assertSame( [ $typeA, $typeB ], $store->to_array() );
54
-
55
- }
56
-
57
- public function testAddMultipleSorting(){
58
-
59
- $typeA= "Z";
60
- $typeB= "A";
61
-
62
- $store = $this->getStore();
63
- $store->add( $typeA );
64
- $store->add( $typeB );
65
-
66
- $this->assertSame( [ $typeB, $typeA ], $store->to_array() );
67
-
68
- }
69
-
70
- public function testAddNonString(){
71
-
72
- $store = $this->getStore();
73
-
74
- $this->assertFalse( $store->add( 999 ) );
75
- $this->assertEmpty( $store->to_array() );
76
-
77
- }
78
-
79
- public function testRemove(){
80
-
81
- $typeA= "A";
82
- $typeB= "B";
83
-
84
- $store = $this->getStore();
85
-
86
- $store->add( $typeA );
87
- $store->add( $typeB );
88
-
89
- $this->assertSame( [ $typeA, $typeB ], $store->to_array() );
90
-
91
- $store->remove( $typeA );
92
-
93
- $this->assertSame( [ $typeB ], $store->to_array() );
94
-
95
- $store->remove( $typeB );
96
-
97
- $this->assertEmpty( $store->to_array() );
98
-
99
- }
100
-
101
- public function testRemoveNonString(){
102
-
103
- $store = $this->getStore();
104
- $store->add( "999" );
105
-
106
- $this->assertFalse( $store->remove( 999 ) );
107
-
108
- }
109
-
110
- public function testRemoveNonExist(){
111
-
112
- $store = $this->getStore();
113
-
114
- $this->assertFalse( $store->remove( "test" ) );
115
-
116
- }
117
-
118
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tests/php/unit/Configuration/{ConfigurationTest.php → configuration-test.php} RENAMED
@@ -3,24 +3,28 @@
3
  namespace Yoast\AcfAnalysis\Tests\Configuration;
4
 
5
  use Brain\Monkey;
6
- use Brain\Monkey\Functions;
7
  use Brain\Monkey\Filters;
 
8
 
9
- class ConfigurationTest extends \PHPUnit_Framework_TestCase {
10
 
 
 
 
11
  protected function setUp() {
12
  parent::setUp();
13
  Monkey\setUp();
14
  }
15
 
16
- public function testEmpty() {
17
-
18
- $version = '4.0.0';
 
 
 
 
19
 
20
- Functions\expect( 'get_option' )
21
- ->once()
22
- ->with( 'acf_version' )
23
- ->andReturn( $version );
24
 
25
  $configuration = new \Yoast_ACF_Analysis_Configuration(
26
  new \Yoast_ACF_Analysis_String_Store(),
@@ -31,7 +35,7 @@ class ConfigurationTest extends \PHPUnit_Framework_TestCase {
31
  $this->assertSame(
32
  [
33
  'pluginName' => \Yoast_ACF_Analysis_Facade::get_plugin_name(),
34
- 'acfVersion' => $version,
35
  'scraper' => [],
36
  'refreshRate' => 1000,
37
  'blacklistType' => [],
@@ -42,6 +46,21 @@ class ConfigurationTest extends \PHPUnit_Framework_TestCase {
42
  $configuration->to_array()
43
  );
44
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  }
46
 
47
  public function testBlacklistTypeFilter() {
@@ -180,8 +199,8 @@ class ConfigurationTest extends \PHPUnit_Framework_TestCase {
180
  $this->assertSame( $store, $configuration->get_blacklist_name() );
181
  }
182
 
183
- public function testScraperConfigFilter(){
184
- $config = array();
185
  $blacklist = new \Yoast_ACF_Analysis_String_Store();
186
 
187
  $configuration = new \Yoast_ACF_Analysis_Configuration(
@@ -198,7 +217,7 @@ class ConfigurationTest extends \PHPUnit_Framework_TestCase {
198
  $this->assertSame( $config, $configuration->get_scraper_config() );
199
  }
200
 
201
- public function testInvalidScraperConfigFilter(){
202
  $blacklist = new \Yoast_ACF_Analysis_String_Store();
203
 
204
  $configuration = new \Yoast_ACF_Analysis_Configuration(
@@ -245,8 +264,8 @@ class ConfigurationTest extends \PHPUnit_Framework_TestCase {
245
  $this->assertSame( 200, $configuration->get_refresh_rate() );
246
  }
247
 
248
- public function testFieldSelectorsFilter(){
249
- $custom_store = new \Yoast_ACF_Analysis_String_Store();
250
  $field_selector = new \Yoast_ACF_Analysis_String_Store();
251
 
252
  $configuration = new \Yoast_ACF_Analysis_Configuration(
@@ -281,9 +300,4 @@ class ConfigurationTest extends \PHPUnit_Framework_TestCase {
281
  $this->assertSame( $store, $configuration->get_field_selectors() );
282
 
283
  }
284
-
285
- protected function tearDown() {
286
- Monkey\tearDown();
287
- parent::tearDown();
288
- }
289
  }
3
  namespace Yoast\AcfAnalysis\Tests\Configuration;
4
 
5
  use Brain\Monkey;
 
6
  use Brain\Monkey\Filters;
7
+ use Brain\Monkey\Functions;
8
 
9
+ class Configuration_Test extends \PHPUnit_Framework_TestCase {
10
 
11
+ /**
12
+ * Set up test fixtures.
13
+ */
14
  protected function setUp() {
15
  parent::setUp();
16
  Monkey\setUp();
17
  }
18
 
19
+ /**
20
+ * Tear down test fixtures previously setup.
21
+ */
22
+ protected function tearDown() {
23
+ Monkey\tearDown();
24
+ parent::tearDown();
25
+ }
26
 
27
+ public function testEmpty() {
 
 
 
28
 
29
  $configuration = new \Yoast_ACF_Analysis_Configuration(
30
  new \Yoast_ACF_Analysis_String_Store(),
35
  $this->assertSame(
36
  [
37
  'pluginName' => \Yoast_ACF_Analysis_Facade::get_plugin_name(),
38
+ 'acfVersion' => 'version',
39
  'scraper' => [],
40
  'refreshRate' => 1000,
41
  'blacklistType' => [],
46
  $configuration->to_array()
47
  );
48
 
49
+ $this->assertEquals( Filters\applied( 'acf/get_info' ), 1 );
50
+ }
51
+
52
+ public function testACF5VersionFunction() {
53
+ $acf_version = '5.0.0';
54
+ Functions\when( 'acf_get_setting' )->justReturn( $acf_version );
55
+
56
+ $configuration = new \Yoast_ACF_Analysis_Configuration(
57
+ new \Yoast_ACF_Analysis_String_Store(),
58
+ new \Yoast_ACF_Analysis_String_Store(),
59
+ new \Yoast_ACF_Analysis_String_Store()
60
+ );
61
+ $config = $configuration->to_array();
62
+
63
+ $this->assertEquals( $acf_version, $config['acfVersion'] );
64
  }
65
 
66
  public function testBlacklistTypeFilter() {
199
  $this->assertSame( $store, $configuration->get_blacklist_name() );
200
  }
201
 
202
+ public function testScraperConfigFilter() {
203
+ $config = array();
204
  $blacklist = new \Yoast_ACF_Analysis_String_Store();
205
 
206
  $configuration = new \Yoast_ACF_Analysis_Configuration(
217
  $this->assertSame( $config, $configuration->get_scraper_config() );
218
  }
219
 
220
+ public function testInvalidScraperConfigFilter() {
221
  $blacklist = new \Yoast_ACF_Analysis_String_Store();
222
 
223
  $configuration = new \Yoast_ACF_Analysis_Configuration(
264
  $this->assertSame( 200, $configuration->get_refresh_rate() );
265
  }
266
 
267
+ public function testFieldSelectorsFilter() {
268
+ $custom_store = new \Yoast_ACF_Analysis_String_Store();
269
  $field_selector = new \Yoast_ACF_Analysis_String_Store();
270
 
271
  $configuration = new \Yoast_ACF_Analysis_Configuration(
300
  $this->assertSame( $store, $configuration->get_field_selectors() );
301
 
302
  }
 
 
 
 
 
303
  }
tests/php/unit/Configuration/string-store-test.php ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ namespace Yoast\AcfAnalysis\Tests\Configuration;
5
+
6
+ class String_Store_Test extends \PHPUnit_Framework_TestCase {
7
+
8
+ /**
9
+ * @return \Yoast_ACF_Analysis_String_Store
10
+ */
11
+ protected function getStore() {
12
+ return new \Yoast_ACF_Analysis_String_Store();
13
+ }
14
+
15
+ public function testEmpty() {
16
+ $store = $this->getStore();
17
+ $this->assertEmpty( $store->to_array() );
18
+ }
19
+
20
+ public function testAdd() {
21
+
22
+ $type = 'test';
23
+
24
+ $store = $this->getStore();
25
+ $store->add( $type );
26
+
27
+ $this->assertSame( [ $type ], $store->to_array() );
28
+
29
+ }
30
+
31
+ public function testAddSame() {
32
+
33
+ $type = 'test';
34
+
35
+ $store = $this->getStore();
36
+ $store->add( $type );
37
+ $store->add( $type );
38
+
39
+ $this->assertSame( [ $type ], $store->to_array() );
40
+
41
+ }
42
+
43
+ public function testAddMultiple() {
44
+
45
+ $type_a = 'A';
46
+ $type_b = 'B';
47
+
48
+ $store = $this->getStore();
49
+ $store->add( $type_a );
50
+ $store->add( $type_b );
51
+
52
+ $this->assertSame( [ $type_a, $type_b ], $store->to_array() );
53
+
54
+ }
55
+
56
+ public function testAddMultipleSorting() {
57
+
58
+ $type_a = 'Z';
59
+ $type_b = 'A';
60
+
61
+ $store = $this->getStore();
62
+ $store->add( $type_a );
63
+ $store->add( $type_b );
64
+
65
+ $this->assertSame( [ $type_b, $type_a ], $store->to_array() );
66
+
67
+ }
68
+
69
+ public function testAddNonString() {
70
+
71
+ $store = $this->getStore();
72
+
73
+ $this->assertFalse( $store->add( 999 ) );
74
+ $this->assertEmpty( $store->to_array() );
75
+
76
+ }
77
+
78
+ public function testRemove() {
79
+
80
+ $type_a = 'A';
81
+ $type_b = 'B';
82
+
83
+ $store = $this->getStore();
84
+
85
+ $store->add( $type_a );
86
+ $store->add( $type_b );
87
+
88
+ $this->assertSame( [ $type_a, $type_b ], $store->to_array() );
89
+
90
+ $store->remove( $type_a );
91
+
92
+ $this->assertSame( [ $type_b ], $store->to_array() );
93
+
94
+ $store->remove( $type_b );
95
+
96
+ $this->assertEmpty( $store->to_array() );
97
+
98
+ }
99
+
100
+ public function testRemoveNonString() {
101
+
102
+ $store = $this->getStore();
103
+ $store->add( '999' );
104
+
105
+ $this->assertFalse( $store->remove( 999 ) );
106
+
107
+ }
108
+
109
+ public function testRemoveNonExist() {
110
+
111
+ $store = $this->getStore();
112
+
113
+ $this->assertFalse( $store->remove( 'test' ) );
114
+
115
+ }
116
+
117
+ }
tests/php/unit/Dependencies/ACFClass.php DELETED
@@ -1,5 +0,0 @@
1
- <?php
2
-
3
- class acf {
4
-
5
- }
 
 
 
 
 
tests/php/unit/Dependencies/{ACFDependencyTest.php → acf-dependency-test.php} RENAMED
@@ -4,12 +4,23 @@ namespace Yoast\AcfAnalysis\Tests\Dependencies;
4
 
5
  use Brain\Monkey;
6
 
7
- class ACFDependencyTest extends \PHPUnit_Framework_TestCase {
 
 
 
8
  protected function setUp() {
9
  parent::setUp();
10
  Monkey\setUp();
11
  }
12
 
 
 
 
 
 
 
 
 
13
  public function testNoACFClassExists() {
14
  $testee = new \Yoast_ACF_Analysis_Dependency_ACF();
15
 
@@ -19,7 +30,7 @@ class ACFDependencyTest extends \PHPUnit_Framework_TestCase {
19
  public function testACFClassExists() {
20
  $testee = new \Yoast_ACF_Analysis_Dependency_ACF();
21
 
22
- require_once __DIR__ . DIRECTORY_SEPARATOR . 'ACFClass.php';
23
 
24
  $this->assertTrue( $testee->is_met() );
25
  }
@@ -30,9 +41,4 @@ class ACFDependencyTest extends \PHPUnit_Framework_TestCase {
30
 
31
  $this->assertTrue( has_action( 'admin_notices', array( $testee, 'message_plugin_not_activated' ) ) );
32
  }
33
-
34
- protected function tearDown() {
35
- Monkey\tearDown();
36
- parent::tearDown();
37
- }
38
  }
4
 
5
  use Brain\Monkey;
6
 
7
+ class ACF_Dependency_Test extends \PHPUnit_Framework_TestCase {
8
+ /**
9
+ * Set up test fixtures.
10
+ */
11
  protected function setUp() {
12
  parent::setUp();
13
  Monkey\setUp();
14
  }
15
 
16
+ /**
17
+ * Tear down test fixtures previously setup.
18
+ */
19
+ protected function tearDown() {
20
+ Monkey\tearDown();
21
+ parent::tearDown();
22
+ }
23
+
24
  public function testNoACFClassExists() {
25
  $testee = new \Yoast_ACF_Analysis_Dependency_ACF();
26
 
30
  public function testACFClassExists() {
31
  $testee = new \Yoast_ACF_Analysis_Dependency_ACF();
32
 
33
+ require_once __DIR__ . DIRECTORY_SEPARATOR . 'acf.php';
34
 
35
  $this->assertTrue( $testee->is_met() );
36
  }
41
 
42
  $this->assertTrue( has_action( 'admin_notices', array( $testee, 'message_plugin_not_activated' ) ) );
43
  }
 
 
 
 
 
44
  }
tests/php/unit/Dependencies/acf.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ACF Content Analysis for Yoast SEO test file.
4
+ *
5
+ * @package YoastACFAnalysis
6
+ */
7
+
8
+ /**
9
+ * Test helper.
10
+ */
11
+ class acf {
12
+
13
+ }
tests/php/unit/Dependencies/{YoastSEODependencyTest.php → yoast-seo-dependency-test.php} RENAMED
@@ -4,15 +4,26 @@ namespace Yoast\AcfAnalysis\Tests\Dependencies;
4
 
5
  use Brain\Monkey;
6
 
7
- class YoastSEODependencyTest extends \PHPUnit_Framework_TestCase {
8
- protected $preserveGlobalState = false;
9
  protected $runTestInSeparateProcess = true;
10
 
 
 
 
11
  protected function setUp() {
12
  parent::setUp();
13
  Monkey\setUp();
14
  }
15
 
 
 
 
 
 
 
 
 
16
  public function testFail() {
17
  $testee = new \Yoast_ACF_Analysis_Dependency_Yoast_SEO();
18
 
@@ -48,9 +59,4 @@ class YoastSEODependencyTest extends \PHPUnit_Framework_TestCase {
48
 
49
  $this->assertTrue( has_action( 'admin_notices', array( $testee, 'message_minimum_version' ) ) );
50
  }
51
-
52
- protected function tearDown() {
53
- Monkey\tearDown();
54
- parent::tearDown();
55
- }
56
  }
4
 
5
  use Brain\Monkey;
6
 
7
+ class Yoast_SEO_Dependency_Test extends \PHPUnit_Framework_TestCase {
8
+ protected $preserveGlobalState = false;
9
  protected $runTestInSeparateProcess = true;
10
 
11
+ /**
12
+ * Set up test fixtures.
13
+ */
14
  protected function setUp() {
15
  parent::setUp();
16
  Monkey\setUp();
17
  }
18
 
19
+ /**
20
+ * Tear down test fixtures previously setup.
21
+ */
22
+ protected function tearDown() {
23
+ Monkey\tearDown();
24
+ parent::tearDown();
25
+ }
26
+
27
  public function testFail() {
28
  $testee = new \Yoast_ACF_Analysis_Dependency_Yoast_SEO();
29
 
59
 
60
  $this->assertTrue( has_action( 'admin_notices', array( $testee, 'message_minimum_version' ) ) );
61
  }
 
 
 
 
 
62
  }
tests/php/unit/Doubles/failing-dependency.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Yoast\AcfAnalysis\Tests\Doubles;
4
+
5
+ class Failing_Dependency implements \Yoast_ACF_Analysis_Dependency {
6
+ /**
7
+ * Checks if this dependency is met.
8
+ *
9
+ * @return bool True when met, False when not met.
10
+ */
11
+ public function is_met() {
12
+ return false;
13
+ }
14
+
15
+ /**
16
+ * Registers the notifications to communicate the depedency is not met.
17
+ *
18
+ * @return void
19
+ */
20
+ public function register_notifications() {
21
+ }
22
+ }
tests/php/unit/Doubles/passing-dependency.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Yoast\AcfAnalysis\Tests\Doubles;
4
+
5
+ class Passing_Dependency implements \Yoast_ACF_Analysis_Dependency {
6
+ /**
7
+ * Checks if this dependency is met.
8
+ *
9
+ * @return bool True when met, False when not met.
10
+ */
11
+ public function is_met() {
12
+ return true;
13
+ }
14
+
15
+ /**
16
+ * Registers the notifications to communicate the depedency is not met.
17
+ *
18
+ * @return void
19
+ */
20
+ public function register_notifications() {
21
+ }
22
+ }
tests/php/unit/RequirementsTest.php DELETED
@@ -1,90 +0,0 @@
1
- <?php
2
-
3
-
4
- namespace Yoast\AcfAnalysis\Tests\Configuration;
5
-
6
- use Brain\Monkey;
7
- use Brain\Monkey\Functions;
8
- use Brain\Monkey\Filters;
9
-
10
-
11
- class PassingDependency implements \Yoast_ACF_Analysis_Dependency {
12
- /**
13
- * Checks if this dependency is met.
14
- *
15
- * @return bool True when met, False when not met.
16
- */
17
- public function is_met() {
18
- return true;
19
- }
20
-
21
- /**
22
- * Registers the notifications to communicate the depedency is not met.
23
- *
24
- * @return void
25
- */
26
- public function register_notifications() {
27
- }
28
- }
29
-
30
- class FailingDependency implements \Yoast_ACF_Analysis_Dependency {
31
- /**
32
- * Checks if this dependency is met.
33
- *
34
- * @return bool True when met, False when not met.
35
- */
36
- public function is_met() {
37
- return false;
38
- }
39
-
40
- /**
41
- * Registers the notifications to communicate the depedency is not met.
42
- *
43
- * @return void
44
- */
45
- public function register_notifications() {
46
- }
47
- }
48
-
49
- class RequirementsTest extends \PHPUnit_Framework_TestCase {
50
-
51
- protected function setUp() {
52
- parent::setUp();
53
- Monkey\setUp();
54
-
55
- Functions\expect( 'current_user_can' )->andReturn( true );
56
- }
57
-
58
- public function testNoDependencies() {
59
- $testee = new \Yoast_ACF_Analysis_Requirements();
60
- $this->assertTrue( $testee->are_met() );
61
- }
62
-
63
- public function testPassingDependency() {
64
- $testee = new \Yoast_ACF_Analysis_Requirements();
65
- $testee->add_dependency( new PassingDependency() );
66
-
67
- $this->assertTrue( $testee->are_met() );
68
- }
69
-
70
- public function testFailingDependency() {
71
- $testee = new \Yoast_ACF_Analysis_Requirements();
72
- $testee->add_dependency( new FailingDependency() );
73
-
74
- $this->assertFalse( $testee->are_met() );
75
- }
76
-
77
- public function testMixedDependencies() {
78
- $testee = new \Yoast_ACF_Analysis_Requirements();
79
- $testee->add_dependency( new FailingDependency() );
80
- $testee->add_dependency( new PassingDependency() );
81
-
82
- $this->assertFalse( $testee->are_met() );
83
- }
84
-
85
- protected function tearDown() {
86
- Monkey\tearDown();
87
- parent::tearDown();
88
- }
89
-
90
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tests/php/unit/{AssetsTest.php → assets-test.php} RENAMED
@@ -5,15 +5,26 @@ namespace Yoast\AcfAnalysis\Tests\Assets;
5
  use Brain\Monkey;
6
  use Brain\Monkey\Functions;
7
 
8
- class AssetsTest extends \PHPUnit_Framework_TestCase {
9
- protected $preserveGlobalState = false;
10
  protected $runTestInSeparateProcess = true;
11
 
 
 
 
12
  protected function setUp() {
13
  parent::setUp();
14
  Monkey\setUp();
15
  }
16
 
 
 
 
 
 
 
 
 
17
  public function testInitHook() {
18
  define( 'AC_SEO_ACF_ANALYSIS_PLUGIN_FILE', '/directory/file' );
19
  Functions\expect( 'get_plugin_data' )
@@ -30,9 +41,4 @@ class AssetsTest extends \PHPUnit_Framework_TestCase {
30
 
31
  $this->assertTrue( has_filter( 'admin_enqueue_scripts', array( $testee, 'enqueue_scripts' ) ) );
32
  }
33
-
34
- protected function tearDown() {
35
- Monkey\tearDown();
36
- parent::tearDown();
37
- }
38
  }
5
  use Brain\Monkey;
6
  use Brain\Monkey\Functions;
7
 
8
+ class Assets_Test extends \PHPUnit_Framework_TestCase {
9
+ protected $preserveGlobalState = false;
10
  protected $runTestInSeparateProcess = true;
11
 
12
+ /**
13
+ * Set up test fixtures.
14
+ */
15
  protected function setUp() {
16
  parent::setUp();
17
  Monkey\setUp();
18
  }
19
 
20
+ /**
21
+ * Tear down test fixtures previously setup.
22
+ */
23
+ protected function tearDown() {
24
+ Monkey\tearDown();
25
+ parent::tearDown();
26
+ }
27
+
28
  public function testInitHook() {
29
  define( 'AC_SEO_ACF_ANALYSIS_PLUGIN_FILE', '/directory/file' );
30
  Functions\expect( 'get_plugin_data' )
41
 
42
  $this->assertTrue( has_filter( 'admin_enqueue_scripts', array( $testee, 'enqueue_scripts' ) ) );
43
  }
 
 
 
 
 
44
  }
tests/php/unit/{MainTest.php → main-test.php} RENAMED
@@ -3,37 +3,35 @@
3
  namespace Yoast\AcfAnalysis\Tests;
4
 
5
  use Brain\Monkey;
6
- use Brain\Monkey\Functions;
7
 
8
- class MainTest extends \PHPUnit_Framework_TestCase {
9
 
 
 
 
10
  protected function setUp() {
11
  parent::setUp();
12
  Monkey\setUp();
13
  }
14
 
15
- public function testInvalidConfig() {
 
 
 
 
 
 
16
 
 
17
  $registry = \Yoast_ACF_Analysis_Facade::get_registry();
18
 
19
  $registry->add( 'config', 'Invalid Config' );
20
 
21
  $testee = new \AC_Yoast_SEO_ACF_Content_Analysis();
22
-
23
- Functions\expect('get_option')
24
- ->once()
25
- ->with('acf_version')
26
- ->andReturn(5);
27
-
28
  $testee->boot();
29
 
30
  $this->assertNotSame( 'Invalid Config', $registry->get( 'config' ) );
31
- $this->assertInstanceOf('\Yoast_ACF_Analysis_Configuration', $registry->get( 'config' ) );
32
-
33
- }
34
 
35
- protected function tearDown() {
36
- Monkey\tearDown();
37
- parent::tearDown();
38
  }
39
  }
3
  namespace Yoast\AcfAnalysis\Tests;
4
 
5
  use Brain\Monkey;
 
6
 
7
+ class Main_Test extends \PHPUnit_Framework_TestCase {
8
 
9
+ /**
10
+ * Set up test fixtures.
11
+ */
12
  protected function setUp() {
13
  parent::setUp();
14
  Monkey\setUp();
15
  }
16
 
17
+ /**
18
+ * Tear down test fixtures previously setup.
19
+ */
20
+ protected function tearDown() {
21
+ Monkey\tearDown();
22
+ parent::tearDown();
23
+ }
24
 
25
+ public function testInvalidConfig() {
26
  $registry = \Yoast_ACF_Analysis_Facade::get_registry();
27
 
28
  $registry->add( 'config', 'Invalid Config' );
29
 
30
  $testee = new \AC_Yoast_SEO_ACF_Content_Analysis();
 
 
 
 
 
 
31
  $testee->boot();
32
 
33
  $this->assertNotSame( 'Invalid Config', $registry->get( 'config' ) );
34
+ $this->assertInstanceOf( \Yoast_ACF_Analysis_Configuration::class, $registry->get( 'config' ) );
 
 
35
 
 
 
 
36
  }
37
  }
tests/php/unit/{RegistryTest.php → registry-test.php} RENAMED
@@ -3,28 +3,31 @@
3
 
4
  namespace Yoast\AcfAnalysis\Tests\Configuration;
5
 
6
- class RegistryTest extends \PHPUnit_Framework_TestCase {
7
 
8
- public function testSingleton(){
9
 
10
- $first = \Yoast_ACF_Analysis_Facade::get_registry();
11
  $second = \Yoast_ACF_Analysis_Facade::get_registry();
12
 
13
  $this->assertSame( $first, $second );
14
 
15
- $first->add( 'id', new \Yoast_ACF_Analysis_Configuration(
16
- new \Yoast_ACF_Analysis_String_Store(),
17
- new \Yoast_ACF_Analysis_String_Store(),
18
- new \Yoast_ACF_Analysis_String_Store()
19
- ) );
 
 
 
20
 
21
  $this->assertSame( $first, $second );
22
 
23
  }
24
 
25
- public function testAdd(){
26
 
27
- $id = 'add';
28
  $content = 'something';
29
 
30
  $registry = new \Yoast_ACF_Analysis_Registry();
3
 
4
  namespace Yoast\AcfAnalysis\Tests\Configuration;
5
 
6
+ class Registry_Test extends \PHPUnit_Framework_TestCase {
7
 
8
+ public function testSingleton() {
9
 
10
+ $first = \Yoast_ACF_Analysis_Facade::get_registry();
11
  $second = \Yoast_ACF_Analysis_Facade::get_registry();
12
 
13
  $this->assertSame( $first, $second );
14
 
15
+ $first->add(
16
+ 'id',
17
+ new \Yoast_ACF_Analysis_Configuration(
18
+ new \Yoast_ACF_Analysis_String_Store(),
19
+ new \Yoast_ACF_Analysis_String_Store(),
20
+ new \Yoast_ACF_Analysis_String_Store()
21
+ )
22
+ );
23
 
24
  $this->assertSame( $first, $second );
25
 
26
  }
27
 
28
+ public function testAdd() {
29
 
30
+ $id = 'add';
31
  $content = 'something';
32
 
33
  $registry = new \Yoast_ACF_Analysis_Registry();
tests/php/unit/requirements-test.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ namespace Yoast\AcfAnalysis\Tests\Configuration;
5
+
6
+ use Brain\Monkey;
7
+ use Brain\Monkey\Functions;
8
+ use Brain\Monkey\Filters;
9
+ use Yoast\AcfAnalysis\Tests\Doubles\Passing_Dependency;
10
+ use Yoast\AcfAnalysis\Tests\Doubles\Failing_Dependency;
11
+
12
+ class Requirements_Test extends \PHPUnit_Framework_TestCase {
13
+
14
+ /**
15
+ * Set up test fixtures.
16
+ */
17
+ protected function setUp() {
18
+ parent::setUp();
19
+ Monkey\setUp();
20
+
21
+ Functions\expect( 'current_user_can' )->andReturn( true );
22
+ }
23
+
24
+ /**
25
+ * Tear down test fixtures previously setup.
26
+ */
27
+ protected function tearDown() {
28
+ Monkey\tearDown();
29
+ parent::tearDown();
30
+ }
31
+
32
+ public function testNoDependencies() {
33
+ $testee = new \Yoast_ACF_Analysis_Requirements();
34
+ $this->assertTrue( $testee->are_met() );
35
+ }
36
+
37
+ public function testPassingDependency() {
38
+ $testee = new \Yoast_ACF_Analysis_Requirements();
39
+ $testee->add_dependency( new Passing_Dependency() );
40
+
41
+ $this->assertTrue( $testee->are_met() );
42
+ }
43
+
44
+ public function testFailingDependency() {
45
+ $testee = new \Yoast_ACF_Analysis_Requirements();
46
+ $testee->add_dependency( new Failing_Dependency() );
47
+
48
+ $this->assertFalse( $testee->are_met() );
49
+ }
50
+
51
+ public function testMixedDependencies() {
52
+ $testee = new \Yoast_ACF_Analysis_Requirements();
53
+ $testee->add_dependency( new Failing_Dependency() );
54
+ $testee->add_dependency( new Passing_Dependency() );
55
+
56
+ $this->assertFalse( $testee->are_met() );
57
+ }
58
+ }
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInited1f19ad7149ce70757a979c9968d1fc::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInitcdaf3b83475df6494f7f95979a2560ef::getLoader();
vendor/autoload_52.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once dirname(__FILE__) . '/composer'.'/autoload_real_52.php';
6
 
7
- return ComposerAutoloaderInit87d59993b47b744b2790b88f7f3178f5::getLoader();
4
 
5
  require_once dirname(__FILE__) . '/composer'.'/autoload_real_52.php';
6
 
7
+ return ComposerAutoloaderInite32e41017a3502755df1f2a4f82e91b6::getLoader();
vendor/composer/ClassLoader.php CHANGED
@@ -379,9 +379,9 @@ class ClassLoader
379
  $subPath = substr($subPath, 0, $lastPos);
380
  $search = $subPath.'\\';
381
  if (isset($this->prefixDirsPsr4[$search])) {
 
382
  foreach ($this->prefixDirsPsr4[$search] as $dir) {
383
- $length = $this->prefixLengthsPsr4[$first][$search];
384
- if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
385
  return $file;
386
  }
387
  }
379
  $subPath = substr($subPath, 0, $lastPos);
380
  $search = $subPath.'\\';
381
  if (isset($this->prefixDirsPsr4[$search])) {
382
+ $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
383
  foreach ($this->prefixDirsPsr4[$search] as $dir) {
384
+ if (file_exists($file = $dir . $pathEnd)) {
 
385
  return $file;
386
  }
387
  }
vendor/composer/autoload_classmap.php CHANGED
@@ -6,7 +6,7 @@ $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
- 'AC_Yoast_SEO_ACF_Content_Analysis' => $baseDir . '/inc/class-ac-yoast-acf-content-analysis.php',
10
  'Composer\\Installers\\AglInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AglInstaller.php',
11
  'Composer\\Installers\\AimeosInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AimeosInstaller.php',
12
  'Composer\\Installers\\AnnotateCmsInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php',
@@ -92,15 +92,15 @@ return array(
92
  'Composer\\Installers\\YawikInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/YawikInstaller.php',
93
  'Composer\\Installers\\ZendInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ZendInstaller.php',
94
  'Composer\\Installers\\ZikulaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ZikulaInstaller.php',
95
- 'Yoast_ACF_Analysis_Assets' => $baseDir . '/inc/class-yoast-acf-analysis-assets.php',
96
- 'Yoast_ACF_Analysis_Configuration' => $baseDir . '/inc/configuration/class-yoast-acf-analysis-configuration.php',
97
- 'Yoast_ACF_Analysis_Dependency' => $baseDir . '/inc/dependencies/interface-yoast-acf-analysis-depencency.php',
98
- 'Yoast_ACF_Analysis_Dependency_ACF' => $baseDir . '/inc/dependencies/class-yoast-acf-analysis-dependency-afc.php',
99
- 'Yoast_ACF_Analysis_Dependency_Yoast_SEO' => $baseDir . '/inc/dependencies/class-yoast-acf-analysis-dependency-yoast-seo.php',
100
- 'Yoast_ACF_Analysis_Facade' => $baseDir . '/inc/class-yoast-acf-analysis-facade.php',
101
- 'Yoast_ACF_Analysis_Registry' => $baseDir . '/inc/class-yoast-acf-analysis-registry.php',
102
- 'Yoast_ACF_Analysis_Requirements' => $baseDir . '/inc/class-yoast-acf-analysis-requirements.php',
103
- 'Yoast_ACF_Analysis_String_Store' => $baseDir . '/inc/configuration/class-yoast-acf-analysis-string-store.php',
104
  'xrstf\\Composer52\\AutoloadGenerator' => $vendorDir . '/xrstf/composer-php52/lib/xrstf/Composer52/AutoloadGenerator.php',
105
  'xrstf\\Composer52\\Generator' => $vendorDir . '/xrstf/composer-php52/lib/xrstf/Composer52/Generator.php',
106
  );
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
+ 'AC_Yoast_SEO_ACF_Content_Analysis' => $baseDir . '/inc/ac-yoast-seo-acf-content-analysis.php',
10
  'Composer\\Installers\\AglInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AglInstaller.php',
11
  'Composer\\Installers\\AimeosInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AimeosInstaller.php',
12
  'Composer\\Installers\\AnnotateCmsInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php',
92
  'Composer\\Installers\\YawikInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/YawikInstaller.php',
93
  'Composer\\Installers\\ZendInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ZendInstaller.php',
94
  'Composer\\Installers\\ZikulaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ZikulaInstaller.php',
95
+ 'Yoast_ACF_Analysis_Assets' => $baseDir . '/inc/assets.php',
96
+ 'Yoast_ACF_Analysis_Configuration' => $baseDir . '/inc/configuration/configuration.php',
97
+ 'Yoast_ACF_Analysis_Dependency' => $baseDir . '/inc/dependencies/dependency-interface.php',
98
+ 'Yoast_ACF_Analysis_Dependency_ACF' => $baseDir . '/inc/dependencies/dependency-acf.php',
99
+ 'Yoast_ACF_Analysis_Dependency_Yoast_SEO' => $baseDir . '/inc/dependencies/dependency-yoast-seo.php',
100
+ 'Yoast_ACF_Analysis_Facade' => $baseDir . '/inc/facade.php',
101
+ 'Yoast_ACF_Analysis_Registry' => $baseDir . '/inc/registry.php',
102
+ 'Yoast_ACF_Analysis_Requirements' => $baseDir . '/inc/requirements.php',
103
+ 'Yoast_ACF_Analysis_String_Store' => $baseDir . '/inc/configuration/string-store.php',
104
  'xrstf\\Composer52\\AutoloadGenerator' => $vendorDir . '/xrstf/composer-php52/lib/xrstf/Composer52/AutoloadGenerator.php',
105
  'xrstf\\Composer52\\Generator' => $vendorDir . '/xrstf/composer-php52/lib/xrstf/Composer52/Generator.php',
106
  );
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInited1f19ad7149ce70757a979c9968d1fc
6
  {
7
  private static $loader;
8
 
@@ -19,15 +19,15 @@ class ComposerAutoloaderInited1f19ad7149ce70757a979c9968d1fc
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInited1f19ad7149ce70757a979c9968d1fc', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInited1f19ad7149ce70757a979c9968d1fc', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
- call_user_func(\Composer\Autoload\ComposerStaticInited1f19ad7149ce70757a979c9968d1fc::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInitcdaf3b83475df6494f7f95979a2560ef
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInitcdaf3b83475df6494f7f95979a2560ef', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInitcdaf3b83475df6494f7f95979a2560ef', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
+ call_user_func(\Composer\Autoload\ComposerStaticInitcdaf3b83475df6494f7f95979a2560ef::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
vendor/composer/autoload_real_52.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real_52.php generated by xrstf/composer-php52
4
 
5
- class ComposerAutoloaderInit87d59993b47b744b2790b88f7f3178f5 {
6
  private static $loader;
7
 
8
  public static function loadClassLoader($class) {
@@ -19,9 +19,9 @@ class ComposerAutoloaderInit87d59993b47b744b2790b88f7f3178f5 {
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInit87d59993b47b744b2790b88f7f3178f5', 'loadClassLoader'), true /*, true */);
23
  self::$loader = $loader = new xrstf_Composer52_ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInit87d59993b47b744b2790b88f7f3178f5', 'loadClassLoader'));
25
 
26
  $vendorDir = dirname(dirname(__FILE__));
27
  $baseDir = dirname($vendorDir);
2
 
3
  // autoload_real_52.php generated by xrstf/composer-php52
4
 
5
+ class ComposerAutoloaderInite32e41017a3502755df1f2a4f82e91b6 {
6
  private static $loader;
7
 
8
  public static function loadClassLoader($class) {
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInite32e41017a3502755df1f2a4f82e91b6', 'loadClassLoader'), true /*, true */);
23
  self::$loader = $loader = new xrstf_Composer52_ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInite32e41017a3502755df1f2a4f82e91b6', 'loadClassLoader'));
25
 
26
  $vendorDir = dirname(dirname(__FILE__));
27
  $baseDir = dirname($vendorDir);
vendor/composer/autoload_static.php ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_static.php @generated by Composer
4
+
5
+ namespace Composer\Autoload;
6
+
7
+ class ComposerStaticInitcdaf3b83475df6494f7f95979a2560ef
8
+ {
9
+ public static $prefixLengthsPsr4 = array (
10
+ 'C' =>
11
+ array (
12
+ 'Composer\\Installers\\' => 20,
13
+ ),
14
+ );
15
+
16
+ public static $prefixDirsPsr4 = array (
17
+ 'Composer\\Installers\\' =>
18
+ array (
19
+ 0 => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers',
20
+ ),
21
+ );
22
+
23
+ public static $prefixesPsr0 = array (
24
+ 'x' =>
25
+ array (
26
+ 'xrstf\\Composer52' =>
27
+ array (
28
+ 0 => __DIR__ . '/..' . '/xrstf/composer-php52/lib',
29
+ ),
30
+ ),
31
+ );
32
+
33
+ public static $classMap = array (
34
+ 'AC_Yoast_SEO_ACF_Content_Analysis' => __DIR__ . '/../..' . '/inc/ac-yoast-seo-acf-content-analysis.php',
35
+ 'Composer\\Installers\\AglInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AglInstaller.php',
36
+ 'Composer\\Installers\\AimeosInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AimeosInstaller.php',
37
+ 'Composer\\Installers\\AnnotateCmsInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php',
38
+ 'Composer\\Installers\\AsgardInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AsgardInstaller.php',
39
+ 'Composer\\Installers\\AttogramInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AttogramInstaller.php',
40
+ 'Composer\\Installers\\BaseInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/BaseInstaller.php',
41
+ 'Composer\\Installers\\BitrixInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/BitrixInstaller.php',
42
+ 'Composer\\Installers\\BonefishInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/BonefishInstaller.php',
43
+ 'Composer\\Installers\\CakePHPInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CakePHPInstaller.php',
44
+ 'Composer\\Installers\\ChefInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ChefInstaller.php',
45
+ 'Composer\\Installers\\ClanCatsFrameworkInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php',
46
+ 'Composer\\Installers\\CockpitInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CockpitInstaller.php',
47
+ 'Composer\\Installers\\CodeIgniterInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php',
48
+ 'Composer\\Installers\\Concrete5Installer' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/Concrete5Installer.php',
49
+ 'Composer\\Installers\\CraftInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CraftInstaller.php',
50
+ 'Composer\\Installers\\CroogoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CroogoInstaller.php',
51
+ 'Composer\\Installers\\DecibelInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/DecibelInstaller.php',
52
+ 'Composer\\Installers\\DokuWikiInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/DokuWikiInstaller.php',
53
+ 'Composer\\Installers\\DolibarrInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/DolibarrInstaller.php',
54
+ 'Composer\\Installers\\DrupalInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/DrupalInstaller.php',
55
+ 'Composer\\Installers\\ElggInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ElggInstaller.php',
56
+ 'Composer\\Installers\\EliasisInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/EliasisInstaller.php',
57
+ 'Composer\\Installers\\ExpressionEngineInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php',
58
+ 'Composer\\Installers\\EzPlatformInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/EzPlatformInstaller.php',
59
+ 'Composer\\Installers\\FuelInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/FuelInstaller.php',
60
+ 'Composer\\Installers\\FuelphpInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/FuelphpInstaller.php',
61
+ 'Composer\\Installers\\GravInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/GravInstaller.php',
62
+ 'Composer\\Installers\\HuradInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/HuradInstaller.php',
63
+ 'Composer\\Installers\\ImageCMSInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ImageCMSInstaller.php',
64
+ 'Composer\\Installers\\Installer' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/Installer.php',
65
+ 'Composer\\Installers\\ItopInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ItopInstaller.php',
66
+ 'Composer\\Installers\\JoomlaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/JoomlaInstaller.php',
67
+ 'Composer\\Installers\\KanboardInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/KanboardInstaller.php',
68
+ 'Composer\\Installers\\KirbyInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/KirbyInstaller.php',
69
+ 'Composer\\Installers\\KodiCMSInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/KodiCMSInstaller.php',
70
+ 'Composer\\Installers\\KohanaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/KohanaInstaller.php',
71
+ 'Composer\\Installers\\LanManagementSystemInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php',
72
+ 'Composer\\Installers\\LaravelInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/LaravelInstaller.php',
73
+ 'Composer\\Installers\\LavaLiteInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/LavaLiteInstaller.php',
74
+ 'Composer\\Installers\\LithiumInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/LithiumInstaller.php',
75
+ 'Composer\\Installers\\MODULEWorkInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php',
76
+ 'Composer\\Installers\\MODXEvoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MODXEvoInstaller.php',
77
+ 'Composer\\Installers\\MagentoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MagentoInstaller.php',
78
+ 'Composer\\Installers\\MakoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MakoInstaller.php',
79
+ 'Composer\\Installers\\MauticInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MauticInstaller.php',
80
+ 'Composer\\Installers\\MayaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MayaInstaller.php',
81
+ 'Composer\\Installers\\MediaWikiInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MediaWikiInstaller.php',
82
+ 'Composer\\Installers\\MicroweberInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MicroweberInstaller.php',
83
+ 'Composer\\Installers\\MoodleInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MoodleInstaller.php',
84
+ 'Composer\\Installers\\OctoberInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/OctoberInstaller.php',
85
+ 'Composer\\Installers\\OntoWikiInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/OntoWikiInstaller.php',
86
+ 'Composer\\Installers\\OsclassInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/OsclassInstaller.php',
87
+ 'Composer\\Installers\\OxidInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/OxidInstaller.php',
88
+ 'Composer\\Installers\\PPIInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PPIInstaller.php',
89
+ 'Composer\\Installers\\PhiftyInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PhiftyInstaller.php',
90
+ 'Composer\\Installers\\PhpBBInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PhpBBInstaller.php',
91
+ 'Composer\\Installers\\PimcoreInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PimcoreInstaller.php',
92
+ 'Composer\\Installers\\PiwikInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PiwikInstaller.php',
93
+ 'Composer\\Installers\\PlentymarketsInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PlentymarketsInstaller.php',
94
+ 'Composer\\Installers\\Plugin' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/Plugin.php',
95
+ 'Composer\\Installers\\PortoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PortoInstaller.php',
96
+ 'Composer\\Installers\\PrestashopInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PrestashopInstaller.php',
97
+ 'Composer\\Installers\\PuppetInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PuppetInstaller.php',
98
+ 'Composer\\Installers\\RadPHPInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/RadPHPInstaller.php',
99
+ 'Composer\\Installers\\ReIndexInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ReIndexInstaller.php',
100
+ 'Composer\\Installers\\RedaxoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/RedaxoInstaller.php',
101
+ 'Composer\\Installers\\RoundcubeInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/RoundcubeInstaller.php',
102
+ 'Composer\\Installers\\SMFInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/SMFInstaller.php',
103
+ 'Composer\\Installers\\ShopwareInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ShopwareInstaller.php',
104
+ 'Composer\\Installers\\SilverStripeInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/SilverStripeInstaller.php',
105
+ 'Composer\\Installers\\SyDESInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/SyDESInstaller.php',
106
+ 'Composer\\Installers\\Symfony1Installer' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/Symfony1Installer.php',
107
+ 'Composer\\Installers\\TYPO3CmsInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php',
108
+ 'Composer\\Installers\\TYPO3FlowInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php',
109
+ 'Composer\\Installers\\TheliaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/TheliaInstaller.php',
110
+ 'Composer\\Installers\\TuskInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/TuskInstaller.php',
111
+ 'Composer\\Installers\\UserFrostingInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/UserFrostingInstaller.php',
112
+ 'Composer\\Installers\\VanillaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/VanillaInstaller.php',
113
+ 'Composer\\Installers\\VgmcpInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/VgmcpInstaller.php',
114
+ 'Composer\\Installers\\WHMCSInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/WHMCSInstaller.php',
115
+ 'Composer\\Installers\\WolfCMSInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/WolfCMSInstaller.php',
116
+ 'Composer\\Installers\\WordPressInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/WordPressInstaller.php',
117
+ 'Composer\\Installers\\YawikInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/YawikInstaller.php',
118
+ 'Composer\\Installers\\ZendInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ZendInstaller.php',
119
+ 'Composer\\Installers\\ZikulaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ZikulaInstaller.php',
120
+ 'Yoast_ACF_Analysis_Assets' => __DIR__ . '/../..' . '/inc/assets.php',
121
+ 'Yoast_ACF_Analysis_Configuration' => __DIR__ . '/../..' . '/inc/configuration/configuration.php',
122
+ 'Yoast_ACF_Analysis_Dependency' => __DIR__ . '/../..' . '/inc/dependencies/dependency-interface.php',
123
+ 'Yoast_ACF_Analysis_Dependency_ACF' => __DIR__ . '/../..' . '/inc/dependencies/dependency-acf.php',
124
+ 'Yoast_ACF_Analysis_Dependency_Yoast_SEO' => __DIR__ . '/../..' . '/inc/dependencies/dependency-yoast-seo.php',
125
+ 'Yoast_ACF_Analysis_Facade' => __DIR__ . '/../..' . '/inc/facade.php',
126
+ 'Yoast_ACF_Analysis_Registry' => __DIR__ . '/../..' . '/inc/registry.php',
127
+ 'Yoast_ACF_Analysis_Requirements' => __DIR__ . '/../..' . '/inc/requirements.php',
128
+ 'Yoast_ACF_Analysis_String_Store' => __DIR__ . '/../..' . '/inc/configuration/string-store.php',
129
+ 'xrstf\\Composer52\\AutoloadGenerator' => __DIR__ . '/..' . '/xrstf/composer-php52/lib/xrstf/Composer52/AutoloadGenerator.php',
130
+ 'xrstf\\Composer52\\Generator' => __DIR__ . '/..' . '/xrstf/composer-php52/lib/xrstf/Composer52/Generator.php',
131
+ );
132
+
133
+ public static function getInitializer(ClassLoader $loader)
134
+ {
135
+ return \Closure::bind(function () use ($loader) {
136
+ $loader->prefixLengthsPsr4 = ComposerStaticInitcdaf3b83475df6494f7f95979a2560ef::$prefixLengthsPsr4;
137
+ $loader->prefixDirsPsr4 = ComposerStaticInitcdaf3b83475df6494f7f95979a2560ef::$prefixDirsPsr4;
138
+ $loader->prefixesPsr0 = ComposerStaticInitcdaf3b83475df6494f7f95979a2560ef::$prefixesPsr0;
139
+ $loader->classMap = ComposerStaticInitcdaf3b83475df6494f7f95979a2560ef::$classMap;
140
+
141
+ }, null, ClassLoader::class);
142
+ }
143
+ }
yoast-acf-analysis.php CHANGED
@@ -1,18 +1,19 @@
1
  <?php
2
  /**
 
 
3
  * @package YoastACFAnalysis
4
- */
5
-
6
- /*
7
- Plugin Name: ACF Content Analysis for Yoast SEO
8
- Plugin URI: https://wordpress.org/plugins/acf-content-analysis-for-yoast-seo/
9
- Description: Ensure that Yoast SEO analyzes all Advanced Custom Fields 4 and 5 content including Flexible Content and Repeaters.
10
- Version: 2.0.1
11
- Author: Thomas Kräftner, ViktorFroberg, marol87, pekz0r, angrycreative, Team Yoast
12
- Author URI: http://angrycreative.se
13
- License: GPL v3
14
- Text Domain: acf-content-analysis-for-yoast-seo
15
- Domain Path: /languages/
16
  */
17
 
18
  if ( ! defined( 'ABSPATH' ) ) {
@@ -27,37 +28,45 @@ if ( ! defined( 'AC_SEO_ACF_ANALYSIS_PLUGIN_PATH' ) ) {
27
  define( 'AC_SEO_ACF_ANALYSIS_PLUGIN_NAME', untrailingslashit( plugin_basename( __FILE__ ) ) );
28
  }
29
 
30
- if ( is_file( AC_SEO_ACF_ANALYSIS_PLUGIN_PATH . '/vendor/autoload_52.php' ) ) {
31
- require AC_SEO_ACF_ANALYSIS_PLUGIN_PATH . '/vendor/autoload_52.php';
32
 
33
- $ac_yoast_seo_acf_analysis = new AC_Yoast_SEO_ACF_Content_Analysis();
34
- $ac_yoast_seo_acf_analysis->init();
 
 
 
 
35
  }
36
 
37
  /**
38
  * Loads translations.
 
 
39
  */
40
  function yoast_acf_analysis_load_textdomain() {
41
- $plugin_path = str_replace( '\\', '/', AC_SEO_ACF_ANALYSIS_PLUGIN_PATH );
42
- $mu_path = str_replace( '\\', '/', WPMU_PLUGIN_DIR );
43
-
44
- if ( 0 === stripos( $plugin_path, $mu_path ) ) {
45
- load_muplugin_textdomain( 'acf-content-analysis-for-yoast-seo', $plugin_path . '/languages' );
46
- return;
47
- }
48
-
49
- load_plugin_textdomain( 'acf-content-analysis-for-yoast-seo', false, $plugin_path . '/languages' );
50
  }
51
- add_action( 'plugins_loaded', 'yoast_acf_analysis_load_textdomain' );
52
 
53
  /**
54
  * Triggers a message whenever the class is missing.
55
  */
56
- if ( ! class_exists( 'AC_Yoast_SEO_ACF_Content_Analysis' ) && is_admin() ) {
57
- /* translators: %1$s resolves to ACF Content Analysis for Yoast SEO */
58
- $message = sprintf( __( '%1$s could not be loaded because of missing files.', 'acf-content-analysis-for-yoast-seo' ), 'ACF Content Analysis for Yoast SEO' );
59
- add_action(
60
- 'admin_notices',
61
- create_function( '', "echo '<div class=\"error\"><p>$message</p></div>';" )
 
 
 
 
 
 
 
 
 
 
 
62
  );
 
63
  }
1
  <?php
2
  /**
3
+ * ACF Content Analysis for Yoast SEO plugin.
4
+ *
5
  * @package YoastACFAnalysis
6
+ *
7
+ * @wordpress-plugin
8
+ * Plugin Name: ACF Content Analysis for Yoast SEO
9
+ * Plugin URI: https://wordpress.org/plugins/acf-content-analysis-for-yoast-seo/
10
+ * Description: Ensure that Yoast SEO analyzes all Advanced Custom Fields 4 and 5 content including Flexible Content and Repeaters.
11
+ * Version: 2.1.0
12
+ * Author: Thomas Kräftner, ViktorFroberg, marol87, pekz0r, angrycreative, Team Yoast
13
+ * Author URI: http://angrycreative.se
14
+ * License: GPL v3
15
+ * Text Domain: acf-content-analysis-for-yoast-seo
16
+ * Domain Path: /languages/
 
17
  */
18
 
19
  if ( ! defined( 'ABSPATH' ) ) {
28
  define( 'AC_SEO_ACF_ANALYSIS_PLUGIN_NAME', untrailingslashit( plugin_basename( __FILE__ ) ) );
29
  }
30
 
31
+ $yoast_acf_autoload_file = '/vendor/autoload.php';
 
32
 
33
+ if ( version_compare( PHP_VERSION, '5.3.2', '<' ) ) {
34
+ $yoast_acf_autoload_file = '/vendor/autoload_52.php';
35
+ }
36
+
37
+ if ( is_file( AC_SEO_ACF_ANALYSIS_PLUGIN_PATH . $yoast_acf_autoload_file ) ) {
38
+ require AC_SEO_ACF_ANALYSIS_PLUGIN_PATH . $yoast_acf_autoload_file;
39
  }
40
 
41
  /**
42
  * Loads translations.
43
+ *
44
+ * @deprecated 2.0.1
45
  */
46
  function yoast_acf_analysis_load_textdomain() {
47
+ // As we require WordPress 4.6 and higher, we don't need to load the translation files manually anymore.
 
 
 
 
 
 
 
 
48
  }
 
49
 
50
  /**
51
  * Triggers a message whenever the class is missing.
52
  */
53
+ if ( ! class_exists( 'AC_Yoast_SEO_ACF_Content_Analysis' ) ) {
54
+ add_action( 'admin_notices', 'yoast_acf_report_missing_acf' );
55
+ }
56
+ else {
57
+ $ac_yoast_seo_acf_analysis = new AC_Yoast_SEO_ACF_Content_Analysis();
58
+ $ac_yoast_seo_acf_analysis->init();
59
+ }
60
+
61
+ /**
62
+ * Show admin notice when ACF is missing.
63
+ */
64
+ function yoast_acf_report_missing_acf() {
65
+ echo '<div class="error"><p>';
66
+ printf(
67
+ /* translators: %1$s resolves to ACF Content Analysis for Yoast SEO */
68
+ esc_html__( '%1$s could not be loaded because of missing files.', 'acf-content-analysis-for-yoast-seo' ),
69
+ 'ACF Content Analysis for Yoast SEO'
70
  );
71
+ echo '</p></div>';
72
  }