├── .eslintrc ├── .gitignore ├── .npmignore ├── .travis.yml ├── CONTRIBUTING.md ├── Gruntfile.js ├── LICENSE.txt ├── README.md ├── bower.json ├── demo ├── index.html └── sample-iframe │ ├── blue.html │ └── red.html ├── dist ├── jquery.iframetracker.js └── jquery.iframetracker.min.js ├── package-lock.json ├── package.json ├── src ├── jquery.iframetracker.js └── umd.hbs └── test └── unit ├── .eslintrc ├── iframeTracker-jQuery1.html ├── iframeTracker-jQuery2.html ├── iframeTracker-jQuery3.html └── iframeTracker_test.js /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | 4 | "extends": "jquery", 5 | 6 | "globals": { 7 | "window": true, 8 | "jQuery": true, 9 | "define": true, 10 | "module": true, 11 | "noGlobal": true, 12 | "document": true, 13 | "navigator": true, 14 | "console": true 15 | }, 16 | 17 | "rules": { 18 | "space-in-parens": "off", 19 | "quotes": [ 20 | "warn", 21 | "double", 22 | { 23 | "avoidEscape": true 24 | } 25 | ], 26 | "computed-property-spacing": ["error", "never"], 27 | "max-len": [ 28 | "warn", 29 | { 30 | "code": 100, 31 | "ignoreComments": true, 32 | "ignoreUrls": true, 33 | "ignoreRegExpLiterals": true, 34 | "ignoreStrings": true 35 | } 36 | ], 37 | "lines-around-comment": [ 38 | "error", 39 | { 40 | "beforeLineComment": true, 41 | "allowBlockStart": true, 42 | "allowObjectStart": true 43 | } 44 | ], 45 | "no-unused-vars": [ 46 | "error", 47 | { 48 | "args": "none" 49 | } 50 | ], 51 | "array-bracket-spacing": [ 52 | "error", 53 | "never" 54 | ], 55 | "strict": "off" 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.diff 2 | *.patch 3 | .DS_Store 4 | /node_modules 5 | /dist 6 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | /demo 2 | /bower.json 3 | /Gruntfile.js 4 | /.eslintrc 5 | /.travis.yml 6 | /test 7 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | sudo: false 3 | node_js: 4 | - "node" 5 | cache: 6 | directories: 7 | - node_modules 8 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to iframeTracker 2 | 3 | ## Bug report 4 | * Please provide a live example (use tools like [jsbin](https://jsbin.com), [jsfiddle](https://jsfiddle.net) or [codepen](https://codepen.io/)) 5 | * Indicate which browsers the issue can be reproduced in 6 | 7 | ## Build setup 8 | 1. Fork and clone the repository 9 | 1. Run `npm install` to install all dependencies 10 | 1. Run `npm test` to check your build environment 11 | 12 | ## Coding guidelines 13 | * Enforce existing coding style (*eslint* will help you : `npx grunt eslint`) 14 | * Use UTF-8 charset 15 | * Beware to not decrease code coverage (write new tests for new code) 16 | 17 | ## Pull request 18 | 1. Create a new branch from `develop` (please don't work on your `develop` branch directly) 19 | 1. Run `npm test` 20 | 1. Open `test/unit/*.html` unit test files in actual browser to ensure tests pass everywhere 21 | 1. Update the documentation to reflect any changes 22 | 1. Push to your fork and submit a pull request 23 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | module.exports = function(grunt) { 4 | grunt.util.linefeed = "\n"; 5 | 6 | grunt.initConfig({ 7 | pkg: grunt.file.readJSON("package.json"), 8 | 9 | banner: "/*! <%= pkg.name %> v<%= pkg.version %>" + 10 | "<%= pkg.homepage ? ' | ' + pkg.homepage : '' %>" + 11 | " | Copyright (c) 2013-<%= grunt.template.today('yyyy') %> <%= pkg.author %>" + 12 | " | Licensed <%= pkg.license %> */", 13 | 14 | copy: { 15 | options: { 16 | process: function(content, srcpath) { 17 | return grunt.template.process(content); 18 | } 19 | }, 20 | main: { 21 | src: "src/jquery.iframetracker.js", 22 | dest: "dist/jquery.iframetracker.js" 23 | } 24 | }, 25 | 26 | umd: { 27 | all: { 28 | src: "dist/jquery.iframetracker.js", 29 | template: "./src/umd.hbs", 30 | deps: { 31 | "default": ["jQuery"], 32 | amd: ["jquery"], 33 | cjs: ["jquery"] 34 | } 35 | } 36 | }, 37 | 38 | uglify: { 39 | options: { 40 | banner: "<%= banner %>" 41 | }, 42 | main: { 43 | src: ["dist/jquery.iframetracker.js"], 44 | dest: "dist/jquery.iframetracker.min.js" 45 | } 46 | }, 47 | 48 | eslint: { 49 | target: ["src/**/*.js", "test/**/*.js", "Gruntfile.js"] 50 | }, 51 | 52 | qunit: { 53 | files: ["test/**/*.html"] 54 | } 55 | }); 56 | 57 | grunt.loadNpmTasks("grunt-contrib-copy"); 58 | grunt.loadNpmTasks("grunt-contrib-uglify"); 59 | grunt.loadNpmTasks("grunt-eslint"); 60 | grunt.loadNpmTasks("grunt-contrib-qunit"); 61 | grunt.loadNpmTasks("grunt-umd"); 62 | 63 | grunt.registerTask("compile", ["copy", "umd", "uglify"]); 64 | grunt.registerTask("default", ["eslint", "qunit", "compile"]); 65 | }; 66 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | Copyright 2013 Vincent Paré 179 | 180 | Licensed under the Apache License, Version 2.0 (the "License"); 181 | you may not use this file except in compliance with the License. 182 | You may obtain a copy of the License at 183 | 184 | http://www.apache.org/licenses/LICENSE-2.0 185 | 186 | Unless required by applicable law or agreed to in writing, software 187 | distributed under the License is distributed on an "AS IS" BASIS, 188 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 189 | See the License for the specific language governing permissions and 190 | limitations under the License. 191 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | iframeTracker jQuery Plugin 2 | =========================== 3 | iframeTracker is a jQuery plugin that allow to track clicks on iframes. 4 | 5 | This is very useful to : 6 | 7 | - track clicks on Google Adsense (google uses iframes to display ads) 8 | - track clicks on Facebook Like buttons 9 | - track clicks on Youtube embed video player 10 | - ... and any other iframe ! 11 | 12 | Try it now : [demo](https://cdn.rawgit.com/vincepare/iframeTracker-jquery/master/demo/index.html). 13 | 14 | How does it work ? 15 | ------------------ 16 | Since it's impossible to read iframe content (DOM) from the parent page due to the [same origin policy](http://en.wikipedia.org/wiki/Same-origin_policy), tracking is based on the blur event associated to a **page/iframe boundary monitoring system** telling over which iframe is the mouse cursor at any time. 17 | 18 | How to use ? 19 | ------------ 20 | Match the iframe elements you want to track with a jQuery selector and call `iframeTracker` with a callback function that will be called when a click on the iframe is detected : 21 | 22 | ```javascript 23 | jQuery(document).ready(function($){ 24 | $('.iframe_wrap iframe').iframeTracker({ 25 | blurCallback: function(event) { 26 | // Do something when the iframe is clicked (like firing an XHR request) 27 | } 28 | }); 29 | }); 30 | ``` 31 | 32 | You can also just pass a function, that will be then registered as the `blurCallback` : 33 | 34 | ```javascript 35 | jQuery(document).ready(function($){ 36 | $('.iframe_wrap iframe').iframeTracker(function(event) { 37 | // Do something when the iframe is clicked (like firing an XHR request) 38 | }); 39 | }); 40 | ``` 41 | 42 | ### Advanced tracking 43 | 44 | ```javascript 45 | jQuery(document).ready(function($){ 46 | $('.iframe_wrap iframe').iframeTracker({ 47 | blurCallback: function(event) { 48 | // Do something when iframe is clicked (like firing an XHR request) 49 | // You can know which iframe element is clicked via this._overId 50 | }, 51 | overCallback: function(element, event) { 52 | this._overId = $(element).parents('.iframe_wrap').attr('id'); // Saving the iframe wrapper id 53 | }, 54 | outCallback: function(element, event) { 55 | this._overId = null; // Reset hover iframe wrapper id 56 | }, 57 | _overId: null 58 | }); 59 | }); 60 | ``` 61 | 62 | #### Cancel tracking 63 | You can remove a tracker attached to an iframe by calling `.iframeTracker()` with either `false` or `null` : 64 | ```javascript 65 | $('#iframe_red_1 iframe').iframeTracker(false); 66 | $('#iframe_red_2 iframe').iframeTracker(null); 67 | ``` 68 | 69 | Full tutorial available [here](http://www.finalclap.com/tuto/track-iframe-click-jquery-87/) (it's in French). 70 | 71 | Tested on jQuery `1.4.4` to `1.11.0`, `2.1.4` & `3.2.1`. 72 | 73 | ---------- 74 | 75 | ### Install 76 | With npm : 77 | ```bash 78 | npm install jquery.iframetracker 79 | ``` 80 | 81 | With bower : 82 | ```bash 83 | bower install jquery.iframetracker 84 | ``` 85 | 86 | ### About mobile devices 87 | This plugin doesn't work on mobile devices such as smartphones and tablets, because this hardware uses a touchscreen instead of a mouse as click input. This design makes the boundary monitoring trick ineffective. 88 | 89 | ### Donate 90 | Donations are welcome :) via [PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=YXDJFGF8GCGLA&item_name=Vincent%20Par%e9%20-%20www.finalclap.com&item_number=iframeTracker%2dgithub¤cy_code=EUR&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted), [Flattr](https://flattr.com/submit/auto?user_id=finalclap&url=https://github.com/vincepare/iframeTracker-jquery&title=iframeTracker%20jQuery%20Plugin&language=&tags=github&category=software) or Bitcoin at this address : `3G5uTti2JPAT738uDeQXjrN7tUj2NZjt6M` or by flashing this lovely QR code : 91 | 92 | ![qrcode for bitcoin address 3G5uTti2JPAT738uDeQXjrN7tUj2NZjt6M](https://vincepare.github.io/img/qrcode-bitcoin-3G5uTti2JPAT738uDeQXjrN7tUj2NZjt6M.png) 93 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery.iframetracker", 3 | "version": "2.1.0", 4 | "homepage": "https://github.com/vincepare/iframeTracker-jquery", 5 | "authors": [ 6 | "Vincent Paré" 7 | ], 8 | "description": "jQuery Plugin to track click on iframes (like Google Adsense or Facebook Like button).", 9 | "main": "dist/jquery.iframetracker.js", 10 | "moduleType": [ 11 | "globals" 12 | ], 13 | "keywords": [ 14 | "iframe", 15 | "youtube", 16 | "adsense", 17 | "advertising", 18 | "click" 19 | ], 20 | "license": "Apache-2.0", 21 | "ignore": [ 22 | "**/.*", 23 | "node_modules", 24 | "bower_components", 25 | "test", 26 | "tests", 27 | "demo", 28 | "src", 29 | "Gruntfile.js", 30 | "README.md", 31 | "package-lock.json", 32 | "package.json" 33 | ], 34 | "dependencies": { 35 | "jquery": ">=1.4.4" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | jQuery iframe click tracking plugin 6 | 7 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 69 | 70 | 71 | 72 | 79 | 80 |
81 |

Read the tutorial on how the tracking works at http://www.finalclap.com/tuto/track-iframe-click-jquery-87/ (it's in French).

82 | 83 |

HTML Ipsum Presents

84 |

Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis.

85 |
86 | 87 |
88 |

Header Level 2

89 |
    90 |
  1. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
  2. 91 |
  3. Aliquam tincidunt mauris eu risus.
  4. 92 |
  5. 93 | Facebook like & Google+1 iframes 94 |
    95 |
    96 | 97 |
    98 |
    99 |
    100 |
    101 |
    102 |
    103 |
  6. 104 |
105 |
106 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus magna. Cras in mi at felis aliquet congue. Ut a est eget ligula molestie gravida. Curabitur massa. Donec eleifend, libero at sagittis mollis, tellus est malesuada tellus, at luctus turpis elit sit amet quam. Vivamus pretium ornare est.

107 |
108 |
109 | 110 |
111 |

Header Level 3

112 | 116 |
#header h1 a { 
117 | 	display: block; 
118 | 	width: 300px; 
119 | 	height: 80px; 
120 | }
121 |
122 | 123 |
124 | 125 |

Untrack

126 |

Remove tracking

127 |
128 | Untrack #iframe_red_1 129 | Untrack #iframe_red_2 130 | Untrack #iframe_blue 131 |
132 | 133 |

© Vincent Paré, using jQuery & Bootstrap from twitter

134 |
135 | 136 |
137 | 138 | 145 | 146 | -------------------------------------------------------------------------------- /demo/sample-iframe/blue.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Blue iframe 6 | 11 | 12 | 13 | 14 |

Blue iframe

15 |

Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante.

16 |
    17 |
  1. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
  2. 18 |
  3. Aliquam tincidunt mauris eu risus.
  4. 19 |
  5. Vestibulum auctor dapibus neque.
  6. 20 |
21 | 22 | -------------------------------------------------------------------------------- /demo/sample-iframe/red.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Red iframe 6 | 11 | 12 | 13 | 14 |

Red iframe

15 |

Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.

16 | 17 | -------------------------------------------------------------------------------- /dist/jquery.iframetracker.js: -------------------------------------------------------------------------------- 1 | (function (root, factory) { 2 | if (typeof define === 'function' && define.amd) { 3 | define(["jquery"], function (a0) { 4 | return (factory(a0)); 5 | }); 6 | } else if (typeof module === 'object' && module.exports) { 7 | module.exports = factory(require("jquery")); 8 | } else { 9 | factory(root["jQuery"]); 10 | } 11 | }(this, function (jQuery) { 12 | 13 | /*! 14 | * jQuery iframe click tracking plugin 15 | * 16 | * @author Vincent Paré 17 | * @copyright © 2013-2018 Vincent Paré 18 | * @license http://opensource.org/licenses/Apache-2.0 19 | * @version 2.1.0 20 | */ 21 | (function($) { 22 | // Tracking handler manager 23 | $.fn.iframeTracker = function(handler) { 24 | // Building handler object from handler function 25 | if (typeof handler == "function") { 26 | handler = { 27 | blurCallback: handler 28 | }; 29 | } 30 | 31 | var target = this.get(); 32 | if (handler === null || handler === false) { 33 | $.iframeTracker.untrack(target); 34 | } else if (typeof handler == "object") { 35 | $.iframeTracker.track(target, handler); 36 | } else { 37 | throw new Error("Wrong handler type (must be an object, or null|false to untrack)"); 38 | } 39 | return this; 40 | }; 41 | 42 | // Iframe tracker common object 43 | $.iframeTracker = { 44 | // State 45 | focusRetriever: null, // Element used for restoring focus on window (element) 46 | focusRetrieved: false, // Says if the focus was retrieved on the current page (bool) 47 | handlersList: [], // Store a list of every trakers (created by calling $(selector).iframeTracker...) 48 | isIE8AndOlder: false, // true for Internet Explorer 8 and older 49 | 50 | // Init (called once on document ready) 51 | init: function() { 52 | // Determine browser version (IE8-) ($.browser.msie is deprecated since jQuery 1.9) 53 | try { 54 | if ($.browser.msie === true && $.browser.version < 9) { 55 | this.isIE8AndOlder = true; 56 | } 57 | } catch (ex) { 58 | try { 59 | var matches = navigator.userAgent.match(/(msie) ([\w.]+)/i); 60 | if (matches[2] < 9) { 61 | this.isIE8AndOlder = true; 62 | } 63 | } catch (ex2) {} 64 | } 65 | 66 | // Listening window blur 67 | $(window).focus(); 68 | $(window).blur(function(e) { 69 | $.iframeTracker.windowLoseFocus(e); 70 | }); 71 | 72 | // Focus retriever (get the focus back to the page, on mouse move) 73 | $("body").append('
'); 74 | this.focusRetriever = $("#focus_retriever"); 75 | this.focusRetrieved = false; 76 | 77 | // Special processing to make it work with my old friend IE8 (and older) ;) 78 | if (this.isIE8AndOlder) { 79 | // Blur doesn't works correctly on IE8-, so we need to trigger it manually 80 | this.focusRetriever.blur(function(e) { 81 | e.stopPropagation(); 82 | e.preventDefault(); 83 | $.iframeTracker.windowLoseFocus(e); 84 | }); 85 | 86 | // Keep focus on window (fix bug IE8-, focusable elements) 87 | $("body").click(function(e) { 88 | $(window).focus(); 89 | }); 90 | $("form").click(function(e) { 91 | e.stopPropagation(); 92 | }); 93 | 94 | // Same thing for "post-DOMready" created forms (issue #6) 95 | try { 96 | $("body").on("click", "form", function(e) { 97 | e.stopPropagation(); 98 | }); 99 | } catch (ex) { 100 | console.log("[iframeTracker] Please update jQuery to 1.7 or newer. (exception: " + ex.message + ")"); 101 | } 102 | } 103 | }, 104 | 105 | // Add tracker to target using handler (bind boundary listener + register handler) 106 | // target: Array of target elements (native DOM elements) 107 | // handler: User handler object 108 | track: function(target, handler) { 109 | // Adding target elements references into handler 110 | handler.target = target; 111 | 112 | // Storing the new handler into handler list 113 | $.iframeTracker.handlersList.push(handler); 114 | 115 | // Binding boundary listener 116 | $(target) 117 | .bind("mouseover", { handler: handler }, $.iframeTracker.mouseoverListener) 118 | .bind("mouseout", { handler: handler }, $.iframeTracker.mouseoutListener); 119 | }, 120 | 121 | // Remove tracking on target elements 122 | // target: Array of target elements (native DOM elements) 123 | untrack: function(target) { 124 | if (typeof Array.prototype.filter != "function") { 125 | console.log("Your browser doesn't support Array filter, untrack disabled"); 126 | return; 127 | } 128 | 129 | // Unbinding boundary listener 130 | $(target).each(function(index) { 131 | $(this) 132 | .unbind("mouseover", $.iframeTracker.mouseoverListener) 133 | .unbind("mouseout", $.iframeTracker.mouseoutListener); 134 | }); 135 | 136 | // Handler garbage collector 137 | var nullFilter = function(value) { 138 | return value === null ? false : true; 139 | }; 140 | for (var i in this.handlersList) { 141 | // Prune target 142 | for (var j in this.handlersList[i].target) { 143 | if ($.inArray(this.handlersList[i].target[j], target) !== -1) { 144 | this.handlersList[i].target[j] = null; 145 | } 146 | } 147 | this.handlersList[i].target = this.handlersList[i].target.filter(nullFilter); 148 | 149 | // Delete handler if unused 150 | if (this.handlersList[i].target.length === 0) { 151 | this.handlersList[i] = null; 152 | } 153 | } 154 | this.handlersList = this.handlersList.filter(nullFilter); 155 | }, 156 | 157 | // Target mouseover event listener 158 | mouseoverListener: function(e) { 159 | e.data.handler.over = true; 160 | $.iframeTracker.retrieveFocus(); 161 | try { 162 | e.data.handler.overCallback(this, e); 163 | } catch (ex) {} 164 | }, 165 | 166 | // Target mouseout event listener 167 | mouseoutListener: function(e) { 168 | e.data.handler.over = false; 169 | $.iframeTracker.retrieveFocus(); 170 | try { 171 | e.data.handler.outCallback(this, e); 172 | } catch (ex) {} 173 | }, 174 | 175 | // Give back focus from an iframe to parent page 176 | retrieveFocus: function() { 177 | if (document.activeElement && document.activeElement.tagName === "IFRAME") { 178 | $.iframeTracker.focusRetriever.focus(); 179 | $.iframeTracker.focusRetrieved = true; 180 | } 181 | }, 182 | 183 | // Calls blurCallback for every handler with over=true on window blur 184 | windowLoseFocus: function(e) { 185 | for (var i in this.handlersList) { 186 | if (this.handlersList[i].over === true) { 187 | try { 188 | this.handlersList[i].blurCallback(e); 189 | } catch (ex) {} 190 | } 191 | } 192 | } 193 | }; 194 | 195 | // Init the iframeTracker on document ready 196 | $(document).ready(function() { 197 | $.iframeTracker.init(); 198 | }); 199 | })(jQuery); 200 | 201 | })); 202 | -------------------------------------------------------------------------------- /dist/jquery.iframetracker.min.js: -------------------------------------------------------------------------------- 1 | /*! jquery.iframetracker v2.1.0 | https://github.com/vincepare/iframeTracker-jquery | Copyright (c) 2013-2018 Vincent Paré | Licensed Apache-2.0 */ 2 | !function(e,r){"function"==typeof define&&define.amd?define(["jquery"],function(e){return r(e)}):"object"==typeof module&&module.exports?module.exports=r(require("jquery")):r(e.jQuery)}(this,function(e){!function(e){e.fn.iframeTracker=function(r){"function"==typeof r&&(r={blurCallback:r});var t=this.get();if(null===r||!1===r)e.iframeTracker.untrack(t);else{if("object"!=typeof r)throw new Error("Wrong handler type (must be an object, or null|false to untrack)");e.iframeTracker.track(t,r)}return this},e.iframeTracker={focusRetriever:null,focusRetrieved:!1,handlersList:[],isIE8AndOlder:!1,init:function(){try{!0===e.browser.msie&&e.browser.version<9&&(this.isIE8AndOlder=!0)}catch(e){try{navigator.userAgent.match(/(msie) ([\w.]+)/i)[2]<9&&(this.isIE8AndOlder=!0)}catch(e){}}if(e(window).focus(),e(window).blur(function(r){e.iframeTracker.windowLoseFocus(r)}),e("body").append('
'),this.focusRetriever=e("#focus_retriever"),this.focusRetrieved=!1,this.isIE8AndOlder){this.focusRetriever.blur(function(r){r.stopPropagation(),r.preventDefault(),e.iframeTracker.windowLoseFocus(r)}),e("body").click(function(r){e(window).focus()}),e("form").click(function(e){e.stopPropagation()});try{e("body").on("click","form",function(e){e.stopPropagation()})}catch(e){console.log("[iframeTracker] Please update jQuery to 1.7 or newer. (exception: "+e.message+")")}}},track:function(r,t){t.target=r,e.iframeTracker.handlersList.push(t),e(r).bind("mouseover",{handler:t},e.iframeTracker.mouseoverListener).bind("mouseout",{handler:t},e.iframeTracker.mouseoutListener)},untrack:function(r){if("function"==typeof Array.prototype.filter){e(r).each(function(r){e(this).unbind("mouseover",e.iframeTracker.mouseoverListener).unbind("mouseout",e.iframeTracker.mouseoutListener)});var t=function(e){return null!==e};for(var i in this.handlersList){for(var o in this.handlersList[i].target)-1!==e.inArray(this.handlersList[i].target[o],r)&&(this.handlersList[i].target[o]=null);this.handlersList[i].target=this.handlersList[i].target.filter(t),0===this.handlersList[i].target.length&&(this.handlersList[i]=null)}this.handlersList=this.handlersList.filter(t)}else console.log("Your browser doesn't support Array filter, untrack disabled")},mouseoverListener:function(r){r.data.handler.over=!0,e.iframeTracker.retrieveFocus();try{r.data.handler.overCallback(this,r)}catch(e){}},mouseoutListener:function(r){r.data.handler.over=!1,e.iframeTracker.retrieveFocus();try{r.data.handler.outCallback(this,r)}catch(e){}},retrieveFocus:function(){document.activeElement&&"IFRAME"===document.activeElement.tagName&&(e.iframeTracker.focusRetriever.focus(),e.iframeTracker.focusRetrieved=!0)},windowLoseFocus:function(e){for(var r in this.handlersList)if(!0===this.handlersList[r].over)try{this.handlersList[r].blurCallback(e)}catch(e){}}},e(document).ready(function(){e.iframeTracker.init()})}(e)}); -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery.iframetracker", 3 | "version": "2.0.0-pre", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abbrev": { 8 | "version": "1.1.0", 9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", 10 | "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", 11 | "dev": true 12 | }, 13 | "acorn": { 14 | "version": "5.1.1", 15 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", 16 | "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", 17 | "dev": true 18 | }, 19 | "acorn-jsx": { 20 | "version": "3.0.1", 21 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", 22 | "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", 23 | "dev": true, 24 | "requires": { 25 | "acorn": "3.3.0" 26 | }, 27 | "dependencies": { 28 | "acorn": { 29 | "version": "3.3.0", 30 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", 31 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", 32 | "dev": true 33 | } 34 | } 35 | }, 36 | "ajv": { 37 | "version": "4.11.8", 38 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", 39 | "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", 40 | "dev": true, 41 | "requires": { 42 | "co": "4.6.0", 43 | "json-stable-stringify": "1.0.1" 44 | } 45 | }, 46 | "ajv-keywords": { 47 | "version": "1.5.1", 48 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", 49 | "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", 50 | "dev": true 51 | }, 52 | "align-text": { 53 | "version": "0.1.4", 54 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 55 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", 56 | "dev": true, 57 | "requires": { 58 | "kind-of": "3.2.2", 59 | "longest": "1.0.1", 60 | "repeat-string": "1.6.1" 61 | } 62 | }, 63 | "alphabet": { 64 | "version": "1.0.0", 65 | "resolved": "https://registry.npmjs.org/alphabet/-/alphabet-1.0.0.tgz", 66 | "integrity": "sha1-DY+Byj94NVEm1yTRRUh+Hk7zd8A=", 67 | "dev": true 68 | }, 69 | "amdefine": { 70 | "version": "1.0.1", 71 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 72 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", 73 | "dev": true 74 | }, 75 | "annois": { 76 | "version": "0.3.2", 77 | "resolved": "https://registry.npmjs.org/annois/-/annois-0.3.2.tgz", 78 | "integrity": "sha1-b2Fp7jdPhND9ANtYnFtAPbT5SwU=", 79 | "dev": true 80 | }, 81 | "annotate": { 82 | "version": "0.9.1", 83 | "resolved": "https://registry.npmjs.org/annotate/-/annotate-0.9.1.tgz", 84 | "integrity": "sha1-ODA+ZWhE5MwXR2DjRDsjv2VHK9M=", 85 | "dev": true, 86 | "requires": { 87 | "annois": "0.3.0" 88 | }, 89 | "dependencies": { 90 | "annois": { 91 | "version": "0.3.0", 92 | "resolved": "https://registry.npmjs.org/annois/-/annois-0.3.0.tgz", 93 | "integrity": "sha1-BcW8WQDoKGgX6IaEuOfjSKniQ0Q=", 94 | "dev": true 95 | } 96 | } 97 | }, 98 | "annozip": { 99 | "version": "0.2.6", 100 | "resolved": "https://registry.npmjs.org/annozip/-/annozip-0.2.6.tgz", 101 | "integrity": "sha1-4Yorw+KHHwYeC+yhwdGozQRlCZs=", 102 | "dev": true, 103 | "requires": { 104 | "annois": "0.3.2", 105 | "annotate": "0.9.1" 106 | } 107 | }, 108 | "ansi-escapes": { 109 | "version": "1.4.0", 110 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", 111 | "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", 112 | "dev": true 113 | }, 114 | "ansi-regex": { 115 | "version": "2.1.1", 116 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 117 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 118 | "dev": true 119 | }, 120 | "ansi-styles": { 121 | "version": "2.2.1", 122 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 123 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 124 | "dev": true 125 | }, 126 | "argparse": { 127 | "version": "1.0.9", 128 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", 129 | "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", 130 | "dev": true, 131 | "requires": { 132 | "sprintf-js": "1.0.3" 133 | } 134 | }, 135 | "array-find-index": { 136 | "version": "1.0.2", 137 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", 138 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", 139 | "dev": true 140 | }, 141 | "array-union": { 142 | "version": "1.0.2", 143 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 144 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 145 | "dev": true, 146 | "requires": { 147 | "array-uniq": "1.0.3" 148 | } 149 | }, 150 | "array-uniq": { 151 | "version": "1.0.3", 152 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 153 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 154 | "dev": true 155 | }, 156 | "arrify": { 157 | "version": "1.0.1", 158 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 159 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 160 | "dev": true 161 | }, 162 | "asn1": { 163 | "version": "0.2.3", 164 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 165 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", 166 | "dev": true 167 | }, 168 | "assert-plus": { 169 | "version": "0.2.0", 170 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", 171 | "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", 172 | "dev": true 173 | }, 174 | "async": { 175 | "version": "1.5.2", 176 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 177 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", 178 | "dev": true 179 | }, 180 | "asynckit": { 181 | "version": "0.4.0", 182 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 183 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 184 | "dev": true 185 | }, 186 | "aws-sign2": { 187 | "version": "0.6.0", 188 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", 189 | "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", 190 | "dev": true 191 | }, 192 | "aws4": { 193 | "version": "1.6.0", 194 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", 195 | "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", 196 | "dev": true 197 | }, 198 | "babel-code-frame": { 199 | "version": "6.26.0", 200 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 201 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 202 | "dev": true, 203 | "requires": { 204 | "chalk": "1.1.3", 205 | "esutils": "2.0.2", 206 | "js-tokens": "3.0.2" 207 | } 208 | }, 209 | "balanced-match": { 210 | "version": "1.0.0", 211 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 212 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 213 | "dev": true 214 | }, 215 | "bcrypt-pbkdf": { 216 | "version": "1.0.1", 217 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 218 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", 219 | "dev": true, 220 | "optional": true, 221 | "requires": { 222 | "tweetnacl": "0.14.5" 223 | } 224 | }, 225 | "boom": { 226 | "version": "2.10.1", 227 | "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", 228 | "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", 229 | "dev": true, 230 | "requires": { 231 | "hoek": "2.16.3" 232 | } 233 | }, 234 | "brace-expansion": { 235 | "version": "1.1.8", 236 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 237 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 238 | "dev": true, 239 | "requires": { 240 | "balanced-match": "1.0.0", 241 | "concat-map": "0.0.1" 242 | } 243 | }, 244 | "browserify-zlib": { 245 | "version": "0.1.4", 246 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", 247 | "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", 248 | "dev": true, 249 | "requires": { 250 | "pako": "0.2.9" 251 | } 252 | }, 253 | "builtin-modules": { 254 | "version": "1.1.1", 255 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 256 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 257 | "dev": true 258 | }, 259 | "caller-path": { 260 | "version": "0.1.0", 261 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 262 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 263 | "dev": true, 264 | "requires": { 265 | "callsites": "0.2.0" 266 | } 267 | }, 268 | "callsites": { 269 | "version": "0.2.0", 270 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 271 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", 272 | "dev": true 273 | }, 274 | "camelcase": { 275 | "version": "2.1.1", 276 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 277 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", 278 | "dev": true 279 | }, 280 | "camelcase-keys": { 281 | "version": "2.1.0", 282 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", 283 | "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", 284 | "dev": true, 285 | "requires": { 286 | "camelcase": "2.1.1", 287 | "map-obj": "1.0.1" 288 | } 289 | }, 290 | "caseless": { 291 | "version": "0.12.0", 292 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 293 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 294 | "dev": true 295 | }, 296 | "center-align": { 297 | "version": "0.1.3", 298 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 299 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 300 | "dev": true, 301 | "optional": true, 302 | "requires": { 303 | "align-text": "0.1.4", 304 | "lazy-cache": "1.0.4" 305 | } 306 | }, 307 | "chalk": { 308 | "version": "1.1.3", 309 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 310 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 311 | "dev": true, 312 | "requires": { 313 | "ansi-styles": "2.2.1", 314 | "escape-string-regexp": "1.0.5", 315 | "has-ansi": "2.0.0", 316 | "strip-ansi": "3.0.1", 317 | "supports-color": "2.0.0" 318 | } 319 | }, 320 | "circular-json": { 321 | "version": "0.3.3", 322 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 323 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", 324 | "dev": true 325 | }, 326 | "cli-cursor": { 327 | "version": "1.0.2", 328 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", 329 | "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", 330 | "dev": true, 331 | "requires": { 332 | "restore-cursor": "1.0.1" 333 | } 334 | }, 335 | "cli-width": { 336 | "version": "2.2.0", 337 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 338 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 339 | "dev": true 340 | }, 341 | "cliui": { 342 | "version": "2.1.0", 343 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 344 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 345 | "dev": true, 346 | "optional": true, 347 | "requires": { 348 | "center-align": "0.1.3", 349 | "right-align": "0.1.3", 350 | "wordwrap": "0.0.2" 351 | }, 352 | "dependencies": { 353 | "wordwrap": { 354 | "version": "0.0.2", 355 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 356 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", 357 | "dev": true, 358 | "optional": true 359 | } 360 | } 361 | }, 362 | "clone-function": { 363 | "version": "1.0.6", 364 | "resolved": "https://registry.npmjs.org/clone-function/-/clone-function-1.0.6.tgz", 365 | "integrity": "sha1-QoRxk3dQvKnEjsv7wW9uIy90oD0=", 366 | "dev": true 367 | }, 368 | "co": { 369 | "version": "4.6.0", 370 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 371 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 372 | "dev": true 373 | }, 374 | "code-point-at": { 375 | "version": "1.1.0", 376 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 377 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", 378 | "dev": true 379 | }, 380 | "coffee-script": { 381 | "version": "1.10.0", 382 | "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.10.0.tgz", 383 | "integrity": "sha1-EpOLz5vhlI+gBvkuDEyegXBRCMA=", 384 | "dev": true 385 | }, 386 | "colors": { 387 | "version": "1.1.2", 388 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", 389 | "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", 390 | "dev": true 391 | }, 392 | "combined-stream": { 393 | "version": "1.0.5", 394 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", 395 | "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", 396 | "dev": true, 397 | "requires": { 398 | "delayed-stream": "1.0.0" 399 | } 400 | }, 401 | "commander": { 402 | "version": "2.11.0", 403 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 404 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", 405 | "dev": true 406 | }, 407 | "concat-map": { 408 | "version": "0.0.1", 409 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 410 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 411 | "dev": true 412 | }, 413 | "concat-stream": { 414 | "version": "1.6.0", 415 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", 416 | "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", 417 | "dev": true, 418 | "requires": { 419 | "inherits": "2.0.3", 420 | "readable-stream": "2.3.3", 421 | "typedarray": "0.0.6" 422 | } 423 | }, 424 | "core-util-is": { 425 | "version": "1.0.2", 426 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 427 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 428 | "dev": true 429 | }, 430 | "cryptiles": { 431 | "version": "2.0.5", 432 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", 433 | "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", 434 | "dev": true, 435 | "requires": { 436 | "boom": "2.10.1" 437 | } 438 | }, 439 | "currently-unhandled": { 440 | "version": "0.4.1", 441 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", 442 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", 443 | "dev": true, 444 | "requires": { 445 | "array-find-index": "1.0.2" 446 | } 447 | }, 448 | "d": { 449 | "version": "1.0.0", 450 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", 451 | "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", 452 | "dev": true, 453 | "requires": { 454 | "es5-ext": "0.10.30" 455 | } 456 | }, 457 | "dashdash": { 458 | "version": "1.14.1", 459 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 460 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 461 | "dev": true, 462 | "requires": { 463 | "assert-plus": "1.0.0" 464 | }, 465 | "dependencies": { 466 | "assert-plus": { 467 | "version": "1.0.0", 468 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 469 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 470 | "dev": true 471 | } 472 | } 473 | }, 474 | "dateformat": { 475 | "version": "1.0.12", 476 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", 477 | "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", 478 | "dev": true, 479 | "requires": { 480 | "get-stdin": "4.0.1", 481 | "meow": "3.7.0" 482 | } 483 | }, 484 | "debug": { 485 | "version": "2.2.0", 486 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 487 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 488 | "dev": true, 489 | "requires": { 490 | "ms": "0.7.1" 491 | } 492 | }, 493 | "decamelize": { 494 | "version": "1.2.0", 495 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 496 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 497 | "dev": true 498 | }, 499 | "deep-is": { 500 | "version": "0.1.3", 501 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 502 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 503 | "dev": true 504 | }, 505 | "del": { 506 | "version": "2.2.2", 507 | "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", 508 | "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", 509 | "dev": true, 510 | "requires": { 511 | "globby": "5.0.0", 512 | "is-path-cwd": "1.0.0", 513 | "is-path-in-cwd": "1.0.0", 514 | "object-assign": "4.1.1", 515 | "pify": "2.3.0", 516 | "pinkie-promise": "2.0.1", 517 | "rimraf": "2.2.8" 518 | } 519 | }, 520 | "delayed-stream": { 521 | "version": "1.0.0", 522 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 523 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 524 | "dev": true 525 | }, 526 | "doctrine": { 527 | "version": "2.0.0", 528 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", 529 | "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", 530 | "dev": true, 531 | "requires": { 532 | "esutils": "2.0.2", 533 | "isarray": "1.0.0" 534 | } 535 | }, 536 | "ecc-jsbn": { 537 | "version": "0.1.1", 538 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 539 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 540 | "dev": true, 541 | "optional": true, 542 | "requires": { 543 | "jsbn": "0.1.1" 544 | } 545 | }, 546 | "error-ex": { 547 | "version": "1.3.1", 548 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", 549 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", 550 | "dev": true, 551 | "requires": { 552 | "is-arrayish": "0.2.1" 553 | } 554 | }, 555 | "es5-ext": { 556 | "version": "0.10.30", 557 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", 558 | "integrity": "sha1-cUGhaDZpfbq/qq7uQUlc4p9SyTk=", 559 | "dev": true, 560 | "requires": { 561 | "es6-iterator": "2.0.1", 562 | "es6-symbol": "3.1.1" 563 | } 564 | }, 565 | "es6-iterator": { 566 | "version": "2.0.1", 567 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", 568 | "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", 569 | "dev": true, 570 | "requires": { 571 | "d": "1.0.0", 572 | "es5-ext": "0.10.30", 573 | "es6-symbol": "3.1.1" 574 | } 575 | }, 576 | "es6-map": { 577 | "version": "0.1.5", 578 | "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", 579 | "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", 580 | "dev": true, 581 | "requires": { 582 | "d": "1.0.0", 583 | "es5-ext": "0.10.30", 584 | "es6-iterator": "2.0.1", 585 | "es6-set": "0.1.5", 586 | "es6-symbol": "3.1.1", 587 | "event-emitter": "0.3.5" 588 | } 589 | }, 590 | "es6-promise": { 591 | "version": "4.0.5", 592 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.0.5.tgz", 593 | "integrity": "sha1-eILzCt3lskDM+n99eMVIMwlRrkI=", 594 | "dev": true 595 | }, 596 | "es6-set": { 597 | "version": "0.1.5", 598 | "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", 599 | "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", 600 | "dev": true, 601 | "requires": { 602 | "d": "1.0.0", 603 | "es5-ext": "0.10.30", 604 | "es6-iterator": "2.0.1", 605 | "es6-symbol": "3.1.1", 606 | "event-emitter": "0.3.5" 607 | } 608 | }, 609 | "es6-symbol": { 610 | "version": "3.1.1", 611 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", 612 | "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", 613 | "dev": true, 614 | "requires": { 615 | "d": "1.0.0", 616 | "es5-ext": "0.10.30" 617 | } 618 | }, 619 | "es6-weak-map": { 620 | "version": "2.0.2", 621 | "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", 622 | "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", 623 | "dev": true, 624 | "requires": { 625 | "d": "1.0.0", 626 | "es5-ext": "0.10.30", 627 | "es6-iterator": "2.0.1", 628 | "es6-symbol": "3.1.1" 629 | } 630 | }, 631 | "escape-string-regexp": { 632 | "version": "1.0.5", 633 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 634 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 635 | "dev": true 636 | }, 637 | "escope": { 638 | "version": "3.6.0", 639 | "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", 640 | "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", 641 | "dev": true, 642 | "requires": { 643 | "es6-map": "0.1.5", 644 | "es6-weak-map": "2.0.2", 645 | "esrecurse": "4.2.0", 646 | "estraverse": "4.2.0" 647 | } 648 | }, 649 | "eslint": { 650 | "version": "3.19.0", 651 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", 652 | "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", 653 | "dev": true, 654 | "requires": { 655 | "babel-code-frame": "6.26.0", 656 | "chalk": "1.1.3", 657 | "concat-stream": "1.6.0", 658 | "debug": "2.2.0", 659 | "doctrine": "2.0.0", 660 | "escope": "3.6.0", 661 | "espree": "3.5.0", 662 | "esquery": "1.0.0", 663 | "estraverse": "4.2.0", 664 | "esutils": "2.0.2", 665 | "file-entry-cache": "2.0.0", 666 | "glob": "7.0.6", 667 | "globals": "9.18.0", 668 | "ignore": "3.3.5", 669 | "imurmurhash": "0.1.4", 670 | "inquirer": "0.12.0", 671 | "is-my-json-valid": "2.16.1", 672 | "is-resolvable": "1.0.0", 673 | "js-yaml": "3.5.5", 674 | "json-stable-stringify": "1.0.1", 675 | "levn": "0.3.0", 676 | "lodash": "4.17.4", 677 | "mkdirp": "0.5.0", 678 | "natural-compare": "1.4.0", 679 | "optionator": "0.8.2", 680 | "path-is-inside": "1.0.2", 681 | "pluralize": "1.2.1", 682 | "progress": "1.1.8", 683 | "require-uncached": "1.0.3", 684 | "shelljs": "0.7.8", 685 | "strip-bom": "3.0.0", 686 | "strip-json-comments": "2.0.1", 687 | "table": "3.8.3", 688 | "text-table": "0.2.0", 689 | "user-home": "2.0.0" 690 | }, 691 | "dependencies": { 692 | "lodash": { 693 | "version": "4.17.4", 694 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 695 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", 696 | "dev": true 697 | }, 698 | "strip-bom": { 699 | "version": "3.0.0", 700 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 701 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 702 | "dev": true 703 | } 704 | } 705 | }, 706 | "eslint-config-jquery": { 707 | "version": "1.0.1", 708 | "resolved": "https://registry.npmjs.org/eslint-config-jquery/-/eslint-config-jquery-1.0.1.tgz", 709 | "integrity": "sha1-p/3Xu8mKZUvHcTnB9VNfrfDfI8g=", 710 | "dev": true 711 | }, 712 | "espree": { 713 | "version": "3.5.0", 714 | "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.0.tgz", 715 | "integrity": "sha1-mDWGJb3QVYYeon4oZ+pyn69GPY0=", 716 | "dev": true, 717 | "requires": { 718 | "acorn": "5.1.1", 719 | "acorn-jsx": "3.0.1" 720 | } 721 | }, 722 | "esprima": { 723 | "version": "2.7.3", 724 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", 725 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", 726 | "dev": true 727 | }, 728 | "esquery": { 729 | "version": "1.0.0", 730 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", 731 | "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", 732 | "dev": true, 733 | "requires": { 734 | "estraverse": "4.2.0" 735 | } 736 | }, 737 | "esrecurse": { 738 | "version": "4.2.0", 739 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", 740 | "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", 741 | "dev": true, 742 | "requires": { 743 | "estraverse": "4.2.0", 744 | "object-assign": "4.1.1" 745 | } 746 | }, 747 | "estraverse": { 748 | "version": "4.2.0", 749 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 750 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 751 | "dev": true 752 | }, 753 | "esutils": { 754 | "version": "2.0.2", 755 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 756 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 757 | "dev": true 758 | }, 759 | "event-emitter": { 760 | "version": "0.3.5", 761 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", 762 | "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", 763 | "dev": true, 764 | "requires": { 765 | "d": "1.0.0", 766 | "es5-ext": "0.10.30" 767 | } 768 | }, 769 | "eventemitter2": { 770 | "version": "0.4.14", 771 | "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", 772 | "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", 773 | "dev": true 774 | }, 775 | "exit": { 776 | "version": "0.1.2", 777 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 778 | "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", 779 | "dev": true 780 | }, 781 | "exit-hook": { 782 | "version": "1.1.1", 783 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", 784 | "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", 785 | "dev": true 786 | }, 787 | "extend": { 788 | "version": "3.0.1", 789 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", 790 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", 791 | "dev": true 792 | }, 793 | "extract-zip": { 794 | "version": "1.6.5", 795 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.5.tgz", 796 | "integrity": "sha1-maBnNbbqIOqbcF13ms/8yHz/BEA=", 797 | "dev": true, 798 | "requires": { 799 | "concat-stream": "1.6.0", 800 | "debug": "2.2.0", 801 | "mkdirp": "0.5.0", 802 | "yauzl": "2.4.1" 803 | } 804 | }, 805 | "extsprintf": { 806 | "version": "1.3.0", 807 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 808 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 809 | "dev": true 810 | }, 811 | "fast-levenshtein": { 812 | "version": "2.0.6", 813 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 814 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 815 | "dev": true 816 | }, 817 | "fd-slicer": { 818 | "version": "1.0.1", 819 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", 820 | "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", 821 | "dev": true, 822 | "requires": { 823 | "pend": "1.2.0" 824 | } 825 | }, 826 | "figures": { 827 | "version": "1.7.0", 828 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 829 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", 830 | "dev": true, 831 | "requires": { 832 | "escape-string-regexp": "1.0.5", 833 | "object-assign": "4.1.1" 834 | } 835 | }, 836 | "file-entry-cache": { 837 | "version": "2.0.0", 838 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 839 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 840 | "dev": true, 841 | "requires": { 842 | "flat-cache": "1.2.2", 843 | "object-assign": "4.1.1" 844 | } 845 | }, 846 | "file-sync-cmp": { 847 | "version": "0.1.1", 848 | "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", 849 | "integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=", 850 | "dev": true 851 | }, 852 | "find-up": { 853 | "version": "1.1.2", 854 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 855 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 856 | "dev": true, 857 | "requires": { 858 | "path-exists": "2.1.0", 859 | "pinkie-promise": "2.0.1" 860 | } 861 | }, 862 | "findup-sync": { 863 | "version": "0.3.0", 864 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", 865 | "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", 866 | "dev": true, 867 | "requires": { 868 | "glob": "5.0.15" 869 | }, 870 | "dependencies": { 871 | "glob": { 872 | "version": "5.0.15", 873 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 874 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 875 | "dev": true, 876 | "requires": { 877 | "inflight": "1.0.6", 878 | "inherits": "2.0.3", 879 | "minimatch": "3.0.4", 880 | "once": "1.4.0", 881 | "path-is-absolute": "1.0.1" 882 | } 883 | } 884 | } 885 | }, 886 | "flat-cache": { 887 | "version": "1.2.2", 888 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", 889 | "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", 890 | "dev": true, 891 | "requires": { 892 | "circular-json": "0.3.3", 893 | "del": "2.2.2", 894 | "graceful-fs": "4.1.11", 895 | "write": "0.2.1" 896 | } 897 | }, 898 | "forever-agent": { 899 | "version": "0.6.1", 900 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 901 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 902 | "dev": true 903 | }, 904 | "form-data": { 905 | "version": "2.1.4", 906 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", 907 | "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", 908 | "dev": true, 909 | "requires": { 910 | "asynckit": "0.4.0", 911 | "combined-stream": "1.0.5", 912 | "mime-types": "2.1.17" 913 | } 914 | }, 915 | "fs-extra": { 916 | "version": "1.0.0", 917 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", 918 | "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", 919 | "dev": true, 920 | "requires": { 921 | "graceful-fs": "4.1.11", 922 | "jsonfile": "2.4.0", 923 | "klaw": "1.3.1" 924 | } 925 | }, 926 | "fs.realpath": { 927 | "version": "1.0.0", 928 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 929 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 930 | "dev": true 931 | }, 932 | "generate-function": { 933 | "version": "2.0.0", 934 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", 935 | "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", 936 | "dev": true 937 | }, 938 | "generate-object-property": { 939 | "version": "1.2.0", 940 | "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", 941 | "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", 942 | "dev": true, 943 | "requires": { 944 | "is-property": "1.0.2" 945 | } 946 | }, 947 | "get-stdin": { 948 | "version": "4.0.1", 949 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", 950 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", 951 | "dev": true 952 | }, 953 | "getobject": { 954 | "version": "0.1.0", 955 | "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", 956 | "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", 957 | "dev": true 958 | }, 959 | "getpass": { 960 | "version": "0.1.7", 961 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 962 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 963 | "dev": true, 964 | "requires": { 965 | "assert-plus": "1.0.0" 966 | }, 967 | "dependencies": { 968 | "assert-plus": { 969 | "version": "1.0.0", 970 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 971 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 972 | "dev": true 973 | } 974 | } 975 | }, 976 | "glob": { 977 | "version": "7.0.6", 978 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", 979 | "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", 980 | "dev": true, 981 | "requires": { 982 | "fs.realpath": "1.0.0", 983 | "inflight": "1.0.6", 984 | "inherits": "2.0.3", 985 | "minimatch": "3.0.4", 986 | "once": "1.4.0", 987 | "path-is-absolute": "1.0.1" 988 | } 989 | }, 990 | "globals": { 991 | "version": "9.18.0", 992 | "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", 993 | "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", 994 | "dev": true 995 | }, 996 | "globby": { 997 | "version": "5.0.0", 998 | "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", 999 | "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", 1000 | "dev": true, 1001 | "requires": { 1002 | "array-union": "1.0.2", 1003 | "arrify": "1.0.1", 1004 | "glob": "7.0.6", 1005 | "object-assign": "4.1.1", 1006 | "pify": "2.3.0", 1007 | "pinkie-promise": "2.0.1" 1008 | } 1009 | }, 1010 | "graceful-fs": { 1011 | "version": "4.1.11", 1012 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 1013 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 1014 | "dev": true 1015 | }, 1016 | "grunt": { 1017 | "version": "1.0.1", 1018 | "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.1.tgz", 1019 | "integrity": "sha1-6HeHZOlEsY8yuw8QuQeEdcnftWs=", 1020 | "dev": true, 1021 | "requires": { 1022 | "coffee-script": "1.10.0", 1023 | "dateformat": "1.0.12", 1024 | "eventemitter2": "0.4.14", 1025 | "exit": "0.1.2", 1026 | "findup-sync": "0.3.0", 1027 | "glob": "7.0.6", 1028 | "grunt-cli": "1.2.0", 1029 | "grunt-known-options": "1.1.0", 1030 | "grunt-legacy-log": "1.0.0", 1031 | "grunt-legacy-util": "1.0.0", 1032 | "iconv-lite": "0.4.18", 1033 | "js-yaml": "3.5.5", 1034 | "minimatch": "3.0.4", 1035 | "nopt": "3.0.6", 1036 | "path-is-absolute": "1.0.1", 1037 | "rimraf": "2.2.8" 1038 | }, 1039 | "dependencies": { 1040 | "grunt-cli": { 1041 | "version": "1.2.0", 1042 | "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", 1043 | "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", 1044 | "dev": true, 1045 | "requires": { 1046 | "findup-sync": "0.3.0", 1047 | "grunt-known-options": "1.1.0", 1048 | "nopt": "3.0.6", 1049 | "resolve": "1.1.7" 1050 | } 1051 | } 1052 | } 1053 | }, 1054 | "grunt-contrib-copy": { 1055 | "version": "1.0.0", 1056 | "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", 1057 | "integrity": "sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=", 1058 | "dev": true, 1059 | "requires": { 1060 | "chalk": "1.1.3", 1061 | "file-sync-cmp": "0.1.1" 1062 | } 1063 | }, 1064 | "grunt-contrib-qunit": { 1065 | "version": "2.0.0", 1066 | "resolved": "https://registry.npmjs.org/grunt-contrib-qunit/-/grunt-contrib-qunit-2.0.0.tgz", 1067 | "integrity": "sha1-VKUbSyyE/uYsO34AFFySjR7Ct+w=", 1068 | "dev": true, 1069 | "requires": { 1070 | "grunt-lib-phantomjs": "1.1.0" 1071 | } 1072 | }, 1073 | "grunt-contrib-uglify": { 1074 | "version": "3.0.1", 1075 | "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-3.0.1.tgz", 1076 | "integrity": "sha1-/etfk4pMgEL46Grkb2NVTo6VEcs=", 1077 | "dev": true, 1078 | "requires": { 1079 | "chalk": "1.1.3", 1080 | "maxmin": "1.1.0", 1081 | "uglify-js": "3.0.28", 1082 | "uri-path": "1.0.0" 1083 | } 1084 | }, 1085 | "grunt-eslint": { 1086 | "version": "19.0.0", 1087 | "resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-19.0.0.tgz", 1088 | "integrity": "sha1-u3TDeQYVmc7B9mFp3vKonYYthhs=", 1089 | "dev": true, 1090 | "requires": { 1091 | "chalk": "1.1.3", 1092 | "eslint": "3.19.0" 1093 | } 1094 | }, 1095 | "grunt-known-options": { 1096 | "version": "1.1.0", 1097 | "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", 1098 | "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=", 1099 | "dev": true 1100 | }, 1101 | "grunt-legacy-log": { 1102 | "version": "1.0.0", 1103 | "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.0.tgz", 1104 | "integrity": "sha1-+4bxgJhHvAfcR4Q/ns1srLYt8tU=", 1105 | "dev": true, 1106 | "requires": { 1107 | "colors": "1.1.2", 1108 | "grunt-legacy-log-utils": "1.0.0", 1109 | "hooker": "0.2.3", 1110 | "lodash": "3.10.1", 1111 | "underscore.string": "3.2.3" 1112 | } 1113 | }, 1114 | "grunt-legacy-log-utils": { 1115 | "version": "1.0.0", 1116 | "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz", 1117 | "integrity": "sha1-p7ji0Ps1taUPSvmG/BEnSevJbz0=", 1118 | "dev": true, 1119 | "requires": { 1120 | "chalk": "1.1.3", 1121 | "lodash": "4.3.0" 1122 | }, 1123 | "dependencies": { 1124 | "lodash": { 1125 | "version": "4.3.0", 1126 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", 1127 | "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", 1128 | "dev": true 1129 | } 1130 | } 1131 | }, 1132 | "grunt-legacy-util": { 1133 | "version": "1.0.0", 1134 | "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz", 1135 | "integrity": "sha1-OGqnjcbtUJhsKxiVcmWxtIq7m4Y=", 1136 | "dev": true, 1137 | "requires": { 1138 | "async": "1.5.2", 1139 | "exit": "0.1.2", 1140 | "getobject": "0.1.0", 1141 | "hooker": "0.2.3", 1142 | "lodash": "4.3.0", 1143 | "underscore.string": "3.2.3", 1144 | "which": "1.2.14" 1145 | }, 1146 | "dependencies": { 1147 | "lodash": { 1148 | "version": "4.3.0", 1149 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", 1150 | "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", 1151 | "dev": true 1152 | } 1153 | } 1154 | }, 1155 | "grunt-lib-phantomjs": { 1156 | "version": "1.1.0", 1157 | "resolved": "https://registry.npmjs.org/grunt-lib-phantomjs/-/grunt-lib-phantomjs-1.1.0.tgz", 1158 | "integrity": "sha1-np7c3Z/S3UDgwYHJQ3HVcqpe6tI=", 1159 | "dev": true, 1160 | "requires": { 1161 | "eventemitter2": "0.4.14", 1162 | "phantomjs-prebuilt": "2.1.15", 1163 | "rimraf": "2.6.1", 1164 | "semver": "5.4.1", 1165 | "temporary": "0.0.8" 1166 | }, 1167 | "dependencies": { 1168 | "rimraf": { 1169 | "version": "2.6.1", 1170 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", 1171 | "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", 1172 | "dev": true, 1173 | "requires": { 1174 | "glob": "7.0.6" 1175 | } 1176 | } 1177 | } 1178 | }, 1179 | "grunt-umd": { 1180 | "version": "2.4.0", 1181 | "resolved": "https://registry.npmjs.org/grunt-umd/-/grunt-umd-2.4.0.tgz", 1182 | "integrity": "sha1-0TGMZFukc0wQwgwd1pI0Z9gbBe8=", 1183 | "dev": true, 1184 | "requires": { 1185 | "libumd": "0.7.0", 1186 | "xtend": "4.0.1" 1187 | } 1188 | }, 1189 | "gzip-size": { 1190 | "version": "1.0.0", 1191 | "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz", 1192 | "integrity": "sha1-Zs+LEBBHInuVus5uodoMF37Vwi8=", 1193 | "dev": true, 1194 | "requires": { 1195 | "browserify-zlib": "0.1.4", 1196 | "concat-stream": "1.6.0" 1197 | } 1198 | }, 1199 | "handlebars": { 1200 | "version": "4.0.11", 1201 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", 1202 | "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", 1203 | "dev": true, 1204 | "requires": { 1205 | "async": "1.5.2", 1206 | "optimist": "0.6.1", 1207 | "source-map": "0.4.4", 1208 | "uglify-js": "2.8.29" 1209 | }, 1210 | "dependencies": { 1211 | "source-map": { 1212 | "version": "0.4.4", 1213 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", 1214 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", 1215 | "dev": true, 1216 | "requires": { 1217 | "amdefine": "1.0.1" 1218 | } 1219 | }, 1220 | "uglify-js": { 1221 | "version": "2.8.29", 1222 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", 1223 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", 1224 | "dev": true, 1225 | "optional": true, 1226 | "requires": { 1227 | "source-map": "0.5.7", 1228 | "uglify-to-browserify": "1.0.2", 1229 | "yargs": "3.10.0" 1230 | }, 1231 | "dependencies": { 1232 | "source-map": { 1233 | "version": "0.5.7", 1234 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1235 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1236 | "dev": true, 1237 | "optional": true 1238 | } 1239 | } 1240 | } 1241 | } 1242 | }, 1243 | "har-schema": { 1244 | "version": "1.0.5", 1245 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", 1246 | "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", 1247 | "dev": true 1248 | }, 1249 | "har-validator": { 1250 | "version": "4.2.1", 1251 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", 1252 | "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", 1253 | "dev": true, 1254 | "requires": { 1255 | "ajv": "4.11.8", 1256 | "har-schema": "1.0.5" 1257 | } 1258 | }, 1259 | "has-ansi": { 1260 | "version": "2.0.0", 1261 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1262 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1263 | "dev": true, 1264 | "requires": { 1265 | "ansi-regex": "2.1.1" 1266 | } 1267 | }, 1268 | "hasha": { 1269 | "version": "2.2.0", 1270 | "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", 1271 | "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", 1272 | "dev": true, 1273 | "requires": { 1274 | "is-stream": "1.1.0", 1275 | "pinkie-promise": "2.0.1" 1276 | } 1277 | }, 1278 | "hawk": { 1279 | "version": "3.1.3", 1280 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", 1281 | "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", 1282 | "dev": true, 1283 | "requires": { 1284 | "boom": "2.10.1", 1285 | "cryptiles": "2.0.5", 1286 | "hoek": "2.16.3", 1287 | "sntp": "1.0.9" 1288 | } 1289 | }, 1290 | "hoek": { 1291 | "version": "2.16.3", 1292 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", 1293 | "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", 1294 | "dev": true 1295 | }, 1296 | "hooker": { 1297 | "version": "0.2.3", 1298 | "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", 1299 | "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", 1300 | "dev": true 1301 | }, 1302 | "hosted-git-info": { 1303 | "version": "2.5.0", 1304 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", 1305 | "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", 1306 | "dev": true 1307 | }, 1308 | "http-signature": { 1309 | "version": "1.1.1", 1310 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", 1311 | "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", 1312 | "dev": true, 1313 | "requires": { 1314 | "assert-plus": "0.2.0", 1315 | "jsprim": "1.4.1", 1316 | "sshpk": "1.13.1" 1317 | } 1318 | }, 1319 | "iconv-lite": { 1320 | "version": "0.4.18", 1321 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", 1322 | "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==", 1323 | "dev": true 1324 | }, 1325 | "ignore": { 1326 | "version": "3.3.5", 1327 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", 1328 | "integrity": "sha512-JLH93mL8amZQhh/p6mfQgVBH3M6epNq3DfsXsTSuSrInVjwyYlFE1nv2AgfRCC8PoOhM0jwQ5v8s9LgbK7yGDw==", 1329 | "dev": true 1330 | }, 1331 | "imurmurhash": { 1332 | "version": "0.1.4", 1333 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1334 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1335 | "dev": true 1336 | }, 1337 | "indent-string": { 1338 | "version": "2.1.0", 1339 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", 1340 | "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", 1341 | "dev": true, 1342 | "requires": { 1343 | "repeating": "2.0.1" 1344 | } 1345 | }, 1346 | "inflight": { 1347 | "version": "1.0.6", 1348 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1349 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1350 | "dev": true, 1351 | "requires": { 1352 | "once": "1.4.0", 1353 | "wrappy": "1.0.2" 1354 | } 1355 | }, 1356 | "inherits": { 1357 | "version": "2.0.3", 1358 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1359 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 1360 | "dev": true 1361 | }, 1362 | "inquirer": { 1363 | "version": "0.12.0", 1364 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", 1365 | "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", 1366 | "dev": true, 1367 | "requires": { 1368 | "ansi-escapes": "1.4.0", 1369 | "ansi-regex": "2.1.1", 1370 | "chalk": "1.1.3", 1371 | "cli-cursor": "1.0.2", 1372 | "cli-width": "2.2.0", 1373 | "figures": "1.7.0", 1374 | "lodash": "4.17.4", 1375 | "readline2": "1.0.1", 1376 | "run-async": "0.1.0", 1377 | "rx-lite": "3.1.2", 1378 | "string-width": "1.0.2", 1379 | "strip-ansi": "3.0.1", 1380 | "through": "2.3.8" 1381 | }, 1382 | "dependencies": { 1383 | "lodash": { 1384 | "version": "4.17.4", 1385 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 1386 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", 1387 | "dev": true 1388 | } 1389 | } 1390 | }, 1391 | "interpret": { 1392 | "version": "1.0.3", 1393 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", 1394 | "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", 1395 | "dev": true 1396 | }, 1397 | "is-arrayish": { 1398 | "version": "0.2.1", 1399 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1400 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 1401 | "dev": true 1402 | }, 1403 | "is-buffer": { 1404 | "version": "1.1.6", 1405 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1406 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 1407 | "dev": true 1408 | }, 1409 | "is-builtin-module": { 1410 | "version": "1.0.0", 1411 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 1412 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", 1413 | "dev": true, 1414 | "requires": { 1415 | "builtin-modules": "1.1.1" 1416 | } 1417 | }, 1418 | "is-finite": { 1419 | "version": "1.0.2", 1420 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 1421 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 1422 | "dev": true, 1423 | "requires": { 1424 | "number-is-nan": "1.0.1" 1425 | } 1426 | }, 1427 | "is-fullwidth-code-point": { 1428 | "version": "1.0.0", 1429 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1430 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1431 | "dev": true, 1432 | "requires": { 1433 | "number-is-nan": "1.0.1" 1434 | } 1435 | }, 1436 | "is-my-json-valid": { 1437 | "version": "2.16.1", 1438 | "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", 1439 | "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", 1440 | "dev": true, 1441 | "requires": { 1442 | "generate-function": "2.0.0", 1443 | "generate-object-property": "1.2.0", 1444 | "jsonpointer": "4.0.1", 1445 | "xtend": "4.0.1" 1446 | } 1447 | }, 1448 | "is-path-cwd": { 1449 | "version": "1.0.0", 1450 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", 1451 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", 1452 | "dev": true 1453 | }, 1454 | "is-path-in-cwd": { 1455 | "version": "1.0.0", 1456 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", 1457 | "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", 1458 | "dev": true, 1459 | "requires": { 1460 | "is-path-inside": "1.0.0" 1461 | } 1462 | }, 1463 | "is-path-inside": { 1464 | "version": "1.0.0", 1465 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", 1466 | "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", 1467 | "dev": true, 1468 | "requires": { 1469 | "path-is-inside": "1.0.2" 1470 | } 1471 | }, 1472 | "is-property": { 1473 | "version": "1.0.2", 1474 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", 1475 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", 1476 | "dev": true 1477 | }, 1478 | "is-resolvable": { 1479 | "version": "1.0.0", 1480 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", 1481 | "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", 1482 | "dev": true, 1483 | "requires": { 1484 | "tryit": "1.0.3" 1485 | } 1486 | }, 1487 | "is-stream": { 1488 | "version": "1.1.0", 1489 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1490 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 1491 | "dev": true 1492 | }, 1493 | "is-typedarray": { 1494 | "version": "1.0.0", 1495 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1496 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 1497 | "dev": true 1498 | }, 1499 | "is-utf8": { 1500 | "version": "0.2.1", 1501 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 1502 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", 1503 | "dev": true 1504 | }, 1505 | "isarray": { 1506 | "version": "1.0.0", 1507 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1508 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1509 | "dev": true 1510 | }, 1511 | "isexe": { 1512 | "version": "2.0.0", 1513 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1514 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1515 | "dev": true 1516 | }, 1517 | "isstream": { 1518 | "version": "0.1.2", 1519 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1520 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 1521 | "dev": true 1522 | }, 1523 | "js-tokens": { 1524 | "version": "3.0.2", 1525 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 1526 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 1527 | "dev": true 1528 | }, 1529 | "js-yaml": { 1530 | "version": "3.5.5", 1531 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz", 1532 | "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=", 1533 | "dev": true, 1534 | "requires": { 1535 | "argparse": "1.0.9", 1536 | "esprima": "2.7.3" 1537 | } 1538 | }, 1539 | "jsbn": { 1540 | "version": "0.1.1", 1541 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1542 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 1543 | "dev": true, 1544 | "optional": true 1545 | }, 1546 | "json-schema": { 1547 | "version": "0.2.3", 1548 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1549 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 1550 | "dev": true 1551 | }, 1552 | "json-stable-stringify": { 1553 | "version": "1.0.1", 1554 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 1555 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 1556 | "dev": true, 1557 | "requires": { 1558 | "jsonify": "0.0.0" 1559 | } 1560 | }, 1561 | "json-stringify-safe": { 1562 | "version": "5.0.1", 1563 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1564 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 1565 | "dev": true 1566 | }, 1567 | "jsonfile": { 1568 | "version": "2.4.0", 1569 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", 1570 | "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", 1571 | "dev": true, 1572 | "requires": { 1573 | "graceful-fs": "4.1.11" 1574 | } 1575 | }, 1576 | "jsonify": { 1577 | "version": "0.0.0", 1578 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 1579 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 1580 | "dev": true 1581 | }, 1582 | "jsonpointer": { 1583 | "version": "4.0.1", 1584 | "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", 1585 | "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", 1586 | "dev": true 1587 | }, 1588 | "jsprim": { 1589 | "version": "1.4.1", 1590 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1591 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1592 | "dev": true, 1593 | "requires": { 1594 | "assert-plus": "1.0.0", 1595 | "extsprintf": "1.3.0", 1596 | "json-schema": "0.2.3", 1597 | "verror": "1.10.0" 1598 | }, 1599 | "dependencies": { 1600 | "assert-plus": { 1601 | "version": "1.0.0", 1602 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 1603 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 1604 | "dev": true 1605 | } 1606 | } 1607 | }, 1608 | "kew": { 1609 | "version": "0.7.0", 1610 | "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", 1611 | "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", 1612 | "dev": true 1613 | }, 1614 | "kind-of": { 1615 | "version": "3.2.2", 1616 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1617 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1618 | "dev": true, 1619 | "requires": { 1620 | "is-buffer": "1.1.6" 1621 | } 1622 | }, 1623 | "klaw": { 1624 | "version": "1.3.1", 1625 | "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", 1626 | "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", 1627 | "dev": true, 1628 | "requires": { 1629 | "graceful-fs": "4.1.11" 1630 | } 1631 | }, 1632 | "lazy-cache": { 1633 | "version": "1.0.4", 1634 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 1635 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", 1636 | "dev": true, 1637 | "optional": true 1638 | }, 1639 | "levn": { 1640 | "version": "0.3.0", 1641 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1642 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1643 | "dev": true, 1644 | "requires": { 1645 | "prelude-ls": "1.1.2", 1646 | "type-check": "0.3.2" 1647 | } 1648 | }, 1649 | "libumd": { 1650 | "version": "0.7.0", 1651 | "resolved": "https://registry.npmjs.org/libumd/-/libumd-0.7.0.tgz", 1652 | "integrity": "sha1-9D765q2YTOSSjB81b1GdEuyPm3Y=", 1653 | "dev": true, 1654 | "requires": { 1655 | "alphabet": "1.0.0", 1656 | "annois": "0.3.2", 1657 | "annozip": "0.2.6", 1658 | "handlebars": "4.0.11", 1659 | "object-merge": "2.5.1" 1660 | } 1661 | }, 1662 | "load-json-file": { 1663 | "version": "1.1.0", 1664 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", 1665 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", 1666 | "dev": true, 1667 | "requires": { 1668 | "graceful-fs": "4.1.11", 1669 | "parse-json": "2.2.0", 1670 | "pify": "2.3.0", 1671 | "pinkie-promise": "2.0.1", 1672 | "strip-bom": "2.0.0" 1673 | } 1674 | }, 1675 | "lodash": { 1676 | "version": "3.10.1", 1677 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", 1678 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", 1679 | "dev": true 1680 | }, 1681 | "longest": { 1682 | "version": "1.0.1", 1683 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 1684 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", 1685 | "dev": true 1686 | }, 1687 | "loud-rejection": { 1688 | "version": "1.6.0", 1689 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", 1690 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", 1691 | "dev": true, 1692 | "requires": { 1693 | "currently-unhandled": "0.4.1", 1694 | "signal-exit": "3.0.2" 1695 | } 1696 | }, 1697 | "map-obj": { 1698 | "version": "1.0.1", 1699 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", 1700 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", 1701 | "dev": true 1702 | }, 1703 | "maxmin": { 1704 | "version": "1.1.0", 1705 | "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz", 1706 | "integrity": "sha1-cTZehKmd2Piz99X94vANHn9zvmE=", 1707 | "dev": true, 1708 | "requires": { 1709 | "chalk": "1.1.3", 1710 | "figures": "1.7.0", 1711 | "gzip-size": "1.0.0", 1712 | "pretty-bytes": "1.0.4" 1713 | } 1714 | }, 1715 | "meow": { 1716 | "version": "3.7.0", 1717 | "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", 1718 | "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", 1719 | "dev": true, 1720 | "requires": { 1721 | "camelcase-keys": "2.1.0", 1722 | "decamelize": "1.2.0", 1723 | "loud-rejection": "1.6.0", 1724 | "map-obj": "1.0.1", 1725 | "minimist": "1.2.0", 1726 | "normalize-package-data": "2.4.0", 1727 | "object-assign": "4.1.1", 1728 | "read-pkg-up": "1.0.1", 1729 | "redent": "1.0.0", 1730 | "trim-newlines": "1.0.0" 1731 | } 1732 | }, 1733 | "mime-db": { 1734 | "version": "1.30.0", 1735 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", 1736 | "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", 1737 | "dev": true 1738 | }, 1739 | "mime-types": { 1740 | "version": "2.1.17", 1741 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", 1742 | "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", 1743 | "dev": true, 1744 | "requires": { 1745 | "mime-db": "1.30.0" 1746 | } 1747 | }, 1748 | "minimatch": { 1749 | "version": "3.0.4", 1750 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1751 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1752 | "dev": true, 1753 | "requires": { 1754 | "brace-expansion": "1.1.8" 1755 | } 1756 | }, 1757 | "minimist": { 1758 | "version": "1.2.0", 1759 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1760 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 1761 | "dev": true 1762 | }, 1763 | "mkdirp": { 1764 | "version": "0.5.0", 1765 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", 1766 | "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", 1767 | "dev": true, 1768 | "requires": { 1769 | "minimist": "0.0.8" 1770 | }, 1771 | "dependencies": { 1772 | "minimist": { 1773 | "version": "0.0.8", 1774 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1775 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1776 | "dev": true 1777 | } 1778 | } 1779 | }, 1780 | "ms": { 1781 | "version": "0.7.1", 1782 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 1783 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", 1784 | "dev": true 1785 | }, 1786 | "mute-stream": { 1787 | "version": "0.0.5", 1788 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", 1789 | "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", 1790 | "dev": true 1791 | }, 1792 | "natural-compare": { 1793 | "version": "1.4.0", 1794 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1795 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1796 | "dev": true 1797 | }, 1798 | "nopt": { 1799 | "version": "3.0.6", 1800 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 1801 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", 1802 | "dev": true, 1803 | "requires": { 1804 | "abbrev": "1.1.0" 1805 | } 1806 | }, 1807 | "normalize-package-data": { 1808 | "version": "2.4.0", 1809 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", 1810 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", 1811 | "dev": true, 1812 | "requires": { 1813 | "hosted-git-info": "2.5.0", 1814 | "is-builtin-module": "1.0.0", 1815 | "semver": "5.4.1", 1816 | "validate-npm-package-license": "3.0.1" 1817 | } 1818 | }, 1819 | "number-is-nan": { 1820 | "version": "1.0.1", 1821 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1822 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 1823 | "dev": true 1824 | }, 1825 | "oauth-sign": { 1826 | "version": "0.8.2", 1827 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 1828 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", 1829 | "dev": true 1830 | }, 1831 | "object-assign": { 1832 | "version": "4.1.1", 1833 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1834 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1835 | "dev": true 1836 | }, 1837 | "object-foreach": { 1838 | "version": "0.1.2", 1839 | "resolved": "https://registry.npmjs.org/object-foreach/-/object-foreach-0.1.2.tgz", 1840 | "integrity": "sha1-10IcW0DjtqPvV6xiQ2jSHY+NLew=", 1841 | "dev": true 1842 | }, 1843 | "object-merge": { 1844 | "version": "2.5.1", 1845 | "resolved": "https://registry.npmjs.org/object-merge/-/object-merge-2.5.1.tgz", 1846 | "integrity": "sha1-B36JFc446nKUeIRIxd0znjTfQic=", 1847 | "dev": true, 1848 | "requires": { 1849 | "clone-function": "1.0.6", 1850 | "object-foreach": "0.1.2" 1851 | } 1852 | }, 1853 | "once": { 1854 | "version": "1.4.0", 1855 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1856 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1857 | "dev": true, 1858 | "requires": { 1859 | "wrappy": "1.0.2" 1860 | } 1861 | }, 1862 | "onetime": { 1863 | "version": "1.1.0", 1864 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", 1865 | "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", 1866 | "dev": true 1867 | }, 1868 | "optimist": { 1869 | "version": "0.6.1", 1870 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 1871 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 1872 | "dev": true, 1873 | "requires": { 1874 | "minimist": "0.0.10", 1875 | "wordwrap": "0.0.3" 1876 | }, 1877 | "dependencies": { 1878 | "minimist": { 1879 | "version": "0.0.10", 1880 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", 1881 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", 1882 | "dev": true 1883 | }, 1884 | "wordwrap": { 1885 | "version": "0.0.3", 1886 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 1887 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", 1888 | "dev": true 1889 | } 1890 | } 1891 | }, 1892 | "optionator": { 1893 | "version": "0.8.2", 1894 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 1895 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1896 | "dev": true, 1897 | "requires": { 1898 | "deep-is": "0.1.3", 1899 | "fast-levenshtein": "2.0.6", 1900 | "levn": "0.3.0", 1901 | "prelude-ls": "1.1.2", 1902 | "type-check": "0.3.2", 1903 | "wordwrap": "1.0.0" 1904 | } 1905 | }, 1906 | "os-homedir": { 1907 | "version": "1.0.2", 1908 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1909 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 1910 | "dev": true 1911 | }, 1912 | "package": { 1913 | "version": "1.0.1", 1914 | "resolved": "https://registry.npmjs.org/package/-/package-1.0.1.tgz", 1915 | "integrity": "sha1-0lofmeJQbcsn1nBLg9yooxLk7cw=", 1916 | "dev": true 1917 | }, 1918 | "pako": { 1919 | "version": "0.2.9", 1920 | "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", 1921 | "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", 1922 | "dev": true 1923 | }, 1924 | "parse-json": { 1925 | "version": "2.2.0", 1926 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1927 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1928 | "dev": true, 1929 | "requires": { 1930 | "error-ex": "1.3.1" 1931 | } 1932 | }, 1933 | "path-exists": { 1934 | "version": "2.1.0", 1935 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 1936 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 1937 | "dev": true, 1938 | "requires": { 1939 | "pinkie-promise": "2.0.1" 1940 | } 1941 | }, 1942 | "path-is-absolute": { 1943 | "version": "1.0.1", 1944 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1945 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1946 | "dev": true 1947 | }, 1948 | "path-is-inside": { 1949 | "version": "1.0.2", 1950 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1951 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1952 | "dev": true 1953 | }, 1954 | "path-type": { 1955 | "version": "1.1.0", 1956 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", 1957 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", 1958 | "dev": true, 1959 | "requires": { 1960 | "graceful-fs": "4.1.11", 1961 | "pify": "2.3.0", 1962 | "pinkie-promise": "2.0.1" 1963 | } 1964 | }, 1965 | "pend": { 1966 | "version": "1.2.0", 1967 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1968 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", 1969 | "dev": true 1970 | }, 1971 | "performance-now": { 1972 | "version": "0.2.0", 1973 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", 1974 | "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", 1975 | "dev": true 1976 | }, 1977 | "phantomjs-prebuilt": { 1978 | "version": "2.1.15", 1979 | "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.15.tgz", 1980 | "integrity": "sha1-IPhugtM0nFBZF1J3RbekEeCLOQM=", 1981 | "dev": true, 1982 | "requires": { 1983 | "es6-promise": "4.0.5", 1984 | "extract-zip": "1.6.5", 1985 | "fs-extra": "1.0.0", 1986 | "hasha": "2.2.0", 1987 | "kew": "0.7.0", 1988 | "progress": "1.1.8", 1989 | "request": "2.81.0", 1990 | "request-progress": "2.0.1", 1991 | "which": "1.2.14" 1992 | } 1993 | }, 1994 | "pify": { 1995 | "version": "2.3.0", 1996 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1997 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1998 | "dev": true 1999 | }, 2000 | "pinkie": { 2001 | "version": "2.0.4", 2002 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 2003 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 2004 | "dev": true 2005 | }, 2006 | "pinkie-promise": { 2007 | "version": "2.0.1", 2008 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 2009 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 2010 | "dev": true, 2011 | "requires": { 2012 | "pinkie": "2.0.4" 2013 | } 2014 | }, 2015 | "pluralize": { 2016 | "version": "1.2.1", 2017 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", 2018 | "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", 2019 | "dev": true 2020 | }, 2021 | "prelude-ls": { 2022 | "version": "1.1.2", 2023 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 2024 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 2025 | "dev": true 2026 | }, 2027 | "pretty-bytes": { 2028 | "version": "1.0.4", 2029 | "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", 2030 | "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", 2031 | "dev": true, 2032 | "requires": { 2033 | "get-stdin": "4.0.1", 2034 | "meow": "3.7.0" 2035 | } 2036 | }, 2037 | "process-nextick-args": { 2038 | "version": "1.0.7", 2039 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 2040 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 2041 | "dev": true 2042 | }, 2043 | "progress": { 2044 | "version": "1.1.8", 2045 | "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", 2046 | "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", 2047 | "dev": true 2048 | }, 2049 | "punycode": { 2050 | "version": "1.4.1", 2051 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 2052 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 2053 | "dev": true 2054 | }, 2055 | "qs": { 2056 | "version": "6.4.0", 2057 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", 2058 | "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", 2059 | "dev": true 2060 | }, 2061 | "read-pkg": { 2062 | "version": "1.1.0", 2063 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", 2064 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", 2065 | "dev": true, 2066 | "requires": { 2067 | "load-json-file": "1.1.0", 2068 | "normalize-package-data": "2.4.0", 2069 | "path-type": "1.1.0" 2070 | } 2071 | }, 2072 | "read-pkg-up": { 2073 | "version": "1.0.1", 2074 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", 2075 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", 2076 | "dev": true, 2077 | "requires": { 2078 | "find-up": "1.1.2", 2079 | "read-pkg": "1.1.0" 2080 | } 2081 | }, 2082 | "readable-stream": { 2083 | "version": "2.3.3", 2084 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 2085 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 2086 | "dev": true, 2087 | "requires": { 2088 | "core-util-is": "1.0.2", 2089 | "inherits": "2.0.3", 2090 | "isarray": "1.0.0", 2091 | "process-nextick-args": "1.0.7", 2092 | "safe-buffer": "5.1.1", 2093 | "string_decoder": "1.0.3", 2094 | "util-deprecate": "1.0.2" 2095 | } 2096 | }, 2097 | "readline2": { 2098 | "version": "1.0.1", 2099 | "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", 2100 | "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", 2101 | "dev": true, 2102 | "requires": { 2103 | "code-point-at": "1.1.0", 2104 | "is-fullwidth-code-point": "1.0.0", 2105 | "mute-stream": "0.0.5" 2106 | } 2107 | }, 2108 | "rechoir": { 2109 | "version": "0.6.2", 2110 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 2111 | "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", 2112 | "dev": true, 2113 | "requires": { 2114 | "resolve": "1.1.7" 2115 | } 2116 | }, 2117 | "redent": { 2118 | "version": "1.0.0", 2119 | "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", 2120 | "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", 2121 | "dev": true, 2122 | "requires": { 2123 | "indent-string": "2.1.0", 2124 | "strip-indent": "1.0.1" 2125 | } 2126 | }, 2127 | "repeat-string": { 2128 | "version": "1.6.1", 2129 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 2130 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 2131 | "dev": true 2132 | }, 2133 | "repeating": { 2134 | "version": "2.0.1", 2135 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", 2136 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", 2137 | "dev": true, 2138 | "requires": { 2139 | "is-finite": "1.0.2" 2140 | } 2141 | }, 2142 | "request": { 2143 | "version": "2.81.0", 2144 | "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", 2145 | "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", 2146 | "dev": true, 2147 | "requires": { 2148 | "aws-sign2": "0.6.0", 2149 | "aws4": "1.6.0", 2150 | "caseless": "0.12.0", 2151 | "combined-stream": "1.0.5", 2152 | "extend": "3.0.1", 2153 | "forever-agent": "0.6.1", 2154 | "form-data": "2.1.4", 2155 | "har-validator": "4.2.1", 2156 | "hawk": "3.1.3", 2157 | "http-signature": "1.1.1", 2158 | "is-typedarray": "1.0.0", 2159 | "isstream": "0.1.2", 2160 | "json-stringify-safe": "5.0.1", 2161 | "mime-types": "2.1.17", 2162 | "oauth-sign": "0.8.2", 2163 | "performance-now": "0.2.0", 2164 | "qs": "6.4.0", 2165 | "safe-buffer": "5.1.1", 2166 | "stringstream": "0.0.5", 2167 | "tough-cookie": "2.3.2", 2168 | "tunnel-agent": "0.6.0", 2169 | "uuid": "3.1.0" 2170 | } 2171 | }, 2172 | "request-progress": { 2173 | "version": "2.0.1", 2174 | "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", 2175 | "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", 2176 | "dev": true, 2177 | "requires": { 2178 | "throttleit": "1.0.0" 2179 | } 2180 | }, 2181 | "require-uncached": { 2182 | "version": "1.0.3", 2183 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 2184 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 2185 | "dev": true, 2186 | "requires": { 2187 | "caller-path": "0.1.0", 2188 | "resolve-from": "1.0.1" 2189 | } 2190 | }, 2191 | "resolve": { 2192 | "version": "1.1.7", 2193 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 2194 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", 2195 | "dev": true 2196 | }, 2197 | "resolve-from": { 2198 | "version": "1.0.1", 2199 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 2200 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 2201 | "dev": true 2202 | }, 2203 | "restore-cursor": { 2204 | "version": "1.0.1", 2205 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", 2206 | "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", 2207 | "dev": true, 2208 | "requires": { 2209 | "exit-hook": "1.1.1", 2210 | "onetime": "1.1.0" 2211 | } 2212 | }, 2213 | "right-align": { 2214 | "version": "0.1.3", 2215 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 2216 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 2217 | "dev": true, 2218 | "optional": true, 2219 | "requires": { 2220 | "align-text": "0.1.4" 2221 | } 2222 | }, 2223 | "rimraf": { 2224 | "version": "2.2.8", 2225 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", 2226 | "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", 2227 | "dev": true 2228 | }, 2229 | "run-async": { 2230 | "version": "0.1.0", 2231 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", 2232 | "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", 2233 | "dev": true, 2234 | "requires": { 2235 | "once": "1.4.0" 2236 | } 2237 | }, 2238 | "rx-lite": { 2239 | "version": "3.1.2", 2240 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", 2241 | "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", 2242 | "dev": true 2243 | }, 2244 | "safe-buffer": { 2245 | "version": "5.1.1", 2246 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 2247 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", 2248 | "dev": true 2249 | }, 2250 | "semver": { 2251 | "version": "5.4.1", 2252 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", 2253 | "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", 2254 | "dev": true 2255 | }, 2256 | "shelljs": { 2257 | "version": "0.7.8", 2258 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", 2259 | "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", 2260 | "dev": true, 2261 | "requires": { 2262 | "glob": "7.0.6", 2263 | "interpret": "1.0.3", 2264 | "rechoir": "0.6.2" 2265 | } 2266 | }, 2267 | "signal-exit": { 2268 | "version": "3.0.2", 2269 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 2270 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 2271 | "dev": true 2272 | }, 2273 | "slice-ansi": { 2274 | "version": "0.0.4", 2275 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", 2276 | "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", 2277 | "dev": true 2278 | }, 2279 | "sntp": { 2280 | "version": "1.0.9", 2281 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", 2282 | "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", 2283 | "dev": true, 2284 | "requires": { 2285 | "hoek": "2.16.3" 2286 | } 2287 | }, 2288 | "source-map": { 2289 | "version": "0.5.7", 2290 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 2291 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 2292 | "dev": true 2293 | }, 2294 | "spdx-correct": { 2295 | "version": "1.0.2", 2296 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", 2297 | "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", 2298 | "dev": true, 2299 | "requires": { 2300 | "spdx-license-ids": "1.2.2" 2301 | } 2302 | }, 2303 | "spdx-expression-parse": { 2304 | "version": "1.0.4", 2305 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", 2306 | "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", 2307 | "dev": true 2308 | }, 2309 | "spdx-license-ids": { 2310 | "version": "1.2.2", 2311 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", 2312 | "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", 2313 | "dev": true 2314 | }, 2315 | "sprintf-js": { 2316 | "version": "1.0.3", 2317 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2318 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2319 | "dev": true 2320 | }, 2321 | "sshpk": { 2322 | "version": "1.13.1", 2323 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", 2324 | "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", 2325 | "dev": true, 2326 | "requires": { 2327 | "asn1": "0.2.3", 2328 | "assert-plus": "1.0.0", 2329 | "bcrypt-pbkdf": "1.0.1", 2330 | "dashdash": "1.14.1", 2331 | "ecc-jsbn": "0.1.1", 2332 | "getpass": "0.1.7", 2333 | "jsbn": "0.1.1", 2334 | "tweetnacl": "0.14.5" 2335 | }, 2336 | "dependencies": { 2337 | "assert-plus": { 2338 | "version": "1.0.0", 2339 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 2340 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 2341 | "dev": true 2342 | } 2343 | } 2344 | }, 2345 | "string-width": { 2346 | "version": "1.0.2", 2347 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 2348 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 2349 | "dev": true, 2350 | "requires": { 2351 | "code-point-at": "1.1.0", 2352 | "is-fullwidth-code-point": "1.0.0", 2353 | "strip-ansi": "3.0.1" 2354 | } 2355 | }, 2356 | "string_decoder": { 2357 | "version": "1.0.3", 2358 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 2359 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 2360 | "dev": true, 2361 | "requires": { 2362 | "safe-buffer": "5.1.1" 2363 | } 2364 | }, 2365 | "stringstream": { 2366 | "version": "0.0.5", 2367 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", 2368 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", 2369 | "dev": true 2370 | }, 2371 | "strip-ansi": { 2372 | "version": "3.0.1", 2373 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2374 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2375 | "dev": true, 2376 | "requires": { 2377 | "ansi-regex": "2.1.1" 2378 | } 2379 | }, 2380 | "strip-bom": { 2381 | "version": "2.0.0", 2382 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 2383 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", 2384 | "dev": true, 2385 | "requires": { 2386 | "is-utf8": "0.2.1" 2387 | } 2388 | }, 2389 | "strip-indent": { 2390 | "version": "1.0.1", 2391 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", 2392 | "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", 2393 | "dev": true, 2394 | "requires": { 2395 | "get-stdin": "4.0.1" 2396 | } 2397 | }, 2398 | "strip-json-comments": { 2399 | "version": "2.0.1", 2400 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2401 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 2402 | "dev": true 2403 | }, 2404 | "supports-color": { 2405 | "version": "2.0.0", 2406 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 2407 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 2408 | "dev": true 2409 | }, 2410 | "table": { 2411 | "version": "3.8.3", 2412 | "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", 2413 | "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", 2414 | "dev": true, 2415 | "requires": { 2416 | "ajv": "4.11.8", 2417 | "ajv-keywords": "1.5.1", 2418 | "chalk": "1.1.3", 2419 | "lodash": "4.17.4", 2420 | "slice-ansi": "0.0.4", 2421 | "string-width": "2.1.1" 2422 | }, 2423 | "dependencies": { 2424 | "ansi-regex": { 2425 | "version": "3.0.0", 2426 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 2427 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 2428 | "dev": true 2429 | }, 2430 | "is-fullwidth-code-point": { 2431 | "version": "2.0.0", 2432 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 2433 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 2434 | "dev": true 2435 | }, 2436 | "lodash": { 2437 | "version": "4.17.4", 2438 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 2439 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", 2440 | "dev": true 2441 | }, 2442 | "string-width": { 2443 | "version": "2.1.1", 2444 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 2445 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 2446 | "dev": true, 2447 | "requires": { 2448 | "is-fullwidth-code-point": "2.0.0", 2449 | "strip-ansi": "4.0.0" 2450 | } 2451 | }, 2452 | "strip-ansi": { 2453 | "version": "4.0.0", 2454 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 2455 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 2456 | "dev": true, 2457 | "requires": { 2458 | "ansi-regex": "3.0.0" 2459 | } 2460 | } 2461 | } 2462 | }, 2463 | "temporary": { 2464 | "version": "0.0.8", 2465 | "resolved": "https://registry.npmjs.org/temporary/-/temporary-0.0.8.tgz", 2466 | "integrity": "sha1-oYqYHSi6jKNgJ/s8MFOMPst0CsA=", 2467 | "dev": true, 2468 | "requires": { 2469 | "package": "1.0.1" 2470 | } 2471 | }, 2472 | "text-table": { 2473 | "version": "0.2.0", 2474 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2475 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 2476 | "dev": true 2477 | }, 2478 | "throttleit": { 2479 | "version": "1.0.0", 2480 | "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", 2481 | "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", 2482 | "dev": true 2483 | }, 2484 | "through": { 2485 | "version": "2.3.8", 2486 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2487 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 2488 | "dev": true 2489 | }, 2490 | "tough-cookie": { 2491 | "version": "2.3.2", 2492 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", 2493 | "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", 2494 | "dev": true, 2495 | "requires": { 2496 | "punycode": "1.4.1" 2497 | } 2498 | }, 2499 | "trim-newlines": { 2500 | "version": "1.0.0", 2501 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", 2502 | "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", 2503 | "dev": true 2504 | }, 2505 | "tryit": { 2506 | "version": "1.0.3", 2507 | "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", 2508 | "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", 2509 | "dev": true 2510 | }, 2511 | "tunnel-agent": { 2512 | "version": "0.6.0", 2513 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2514 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 2515 | "dev": true, 2516 | "requires": { 2517 | "safe-buffer": "5.1.1" 2518 | } 2519 | }, 2520 | "tweetnacl": { 2521 | "version": "0.14.5", 2522 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 2523 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 2524 | "dev": true, 2525 | "optional": true 2526 | }, 2527 | "type-check": { 2528 | "version": "0.3.2", 2529 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 2530 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 2531 | "dev": true, 2532 | "requires": { 2533 | "prelude-ls": "1.1.2" 2534 | } 2535 | }, 2536 | "typedarray": { 2537 | "version": "0.0.6", 2538 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 2539 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 2540 | "dev": true 2541 | }, 2542 | "uglify-js": { 2543 | "version": "3.0.28", 2544 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.28.tgz", 2545 | "integrity": "sha512-0h/qGay016GG2lVav3Kz174F3T2Vjlz2v6HCt+WDQpoXfco0hWwF5gHK9yh88mUYvIC+N7Z8NT8WpjSp1yoqGA==", 2546 | "dev": true, 2547 | "requires": { 2548 | "commander": "2.11.0", 2549 | "source-map": "0.5.7" 2550 | } 2551 | }, 2552 | "uglify-to-browserify": { 2553 | "version": "1.0.2", 2554 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 2555 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 2556 | "dev": true, 2557 | "optional": true 2558 | }, 2559 | "underscore.string": { 2560 | "version": "3.2.3", 2561 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.2.3.tgz", 2562 | "integrity": "sha1-gGmSYzZl1eX8tNsfs6hi62jp5to=", 2563 | "dev": true 2564 | }, 2565 | "uri-path": { 2566 | "version": "1.0.0", 2567 | "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", 2568 | "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=", 2569 | "dev": true 2570 | }, 2571 | "user-home": { 2572 | "version": "2.0.0", 2573 | "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", 2574 | "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", 2575 | "dev": true, 2576 | "requires": { 2577 | "os-homedir": "1.0.2" 2578 | } 2579 | }, 2580 | "util-deprecate": { 2581 | "version": "1.0.2", 2582 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2583 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 2584 | "dev": true 2585 | }, 2586 | "uuid": { 2587 | "version": "3.1.0", 2588 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", 2589 | "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", 2590 | "dev": true 2591 | }, 2592 | "validate-npm-package-license": { 2593 | "version": "3.0.1", 2594 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", 2595 | "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", 2596 | "dev": true, 2597 | "requires": { 2598 | "spdx-correct": "1.0.2", 2599 | "spdx-expression-parse": "1.0.4" 2600 | } 2601 | }, 2602 | "verror": { 2603 | "version": "1.10.0", 2604 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 2605 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 2606 | "dev": true, 2607 | "requires": { 2608 | "assert-plus": "1.0.0", 2609 | "core-util-is": "1.0.2", 2610 | "extsprintf": "1.3.0" 2611 | }, 2612 | "dependencies": { 2613 | "assert-plus": { 2614 | "version": "1.0.0", 2615 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 2616 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 2617 | "dev": true 2618 | } 2619 | } 2620 | }, 2621 | "which": { 2622 | "version": "1.2.14", 2623 | "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", 2624 | "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", 2625 | "dev": true, 2626 | "requires": { 2627 | "isexe": "2.0.0" 2628 | } 2629 | }, 2630 | "window-size": { 2631 | "version": "0.1.0", 2632 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 2633 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", 2634 | "dev": true, 2635 | "optional": true 2636 | }, 2637 | "wordwrap": { 2638 | "version": "1.0.0", 2639 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 2640 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 2641 | "dev": true 2642 | }, 2643 | "wrappy": { 2644 | "version": "1.0.2", 2645 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2646 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2647 | "dev": true 2648 | }, 2649 | "write": { 2650 | "version": "0.2.1", 2651 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 2652 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 2653 | "dev": true, 2654 | "requires": { 2655 | "mkdirp": "0.5.1" 2656 | }, 2657 | "dependencies": { 2658 | "minimist": { 2659 | "version": "0.0.8", 2660 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 2661 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 2662 | "dev": true 2663 | }, 2664 | "mkdirp": { 2665 | "version": "0.5.1", 2666 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 2667 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 2668 | "dev": true, 2669 | "requires": { 2670 | "minimist": "0.0.8" 2671 | } 2672 | } 2673 | } 2674 | }, 2675 | "xtend": { 2676 | "version": "4.0.1", 2677 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 2678 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", 2679 | "dev": true 2680 | }, 2681 | "yargs": { 2682 | "version": "3.10.0", 2683 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 2684 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 2685 | "dev": true, 2686 | "optional": true, 2687 | "requires": { 2688 | "camelcase": "1.2.1", 2689 | "cliui": "2.1.0", 2690 | "decamelize": "1.2.0", 2691 | "window-size": "0.1.0" 2692 | }, 2693 | "dependencies": { 2694 | "camelcase": { 2695 | "version": "1.2.1", 2696 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 2697 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", 2698 | "dev": true, 2699 | "optional": true 2700 | } 2701 | } 2702 | }, 2703 | "yauzl": { 2704 | "version": "2.4.1", 2705 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", 2706 | "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", 2707 | "dev": true, 2708 | "requires": { 2709 | "fd-slicer": "1.0.1" 2710 | } 2711 | } 2712 | } 2713 | } 2714 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery.iframetracker", 3 | "version": "2.1.0", 4 | "description": "jQuery Plugin to track click on iframes (like Google Adsense or Facebook Like button).", 5 | "main": "dist/jquery.iframetracker.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "https://github.com/vincepare/iframeTracker-jquery.git" 9 | }, 10 | "keywords": [ 11 | "jquery-plugin", 12 | "iframe", 13 | "youtube", 14 | "adsense", 15 | "advertising", 16 | "click" 17 | ], 18 | "author": "Vincent Paré", 19 | "license": "Apache-2.0", 20 | "bugs": { 21 | "url": "https://github.com/vincepare/iframeTracker-jquery/issues" 22 | }, 23 | "homepage": "https://github.com/vincepare/iframeTracker-jquery", 24 | "scripts": { 25 | "test": "grunt eslint qunit", 26 | "build": "grunt", 27 | "prepare": "grunt" 28 | }, 29 | "peerDependencies": { 30 | "jquery": ">=1.4.4" 31 | }, 32 | "devDependencies": { 33 | "eslint-config-jquery": "^1.0.1", 34 | "grunt": "^1.0.1", 35 | "grunt-contrib-copy": "^1.0.0", 36 | "grunt-contrib-qunit": "^2.0.0", 37 | "grunt-contrib-uglify": "^3.0.1", 38 | "grunt-eslint": "^19.0.0", 39 | "grunt-umd": "^2.4.0" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/jquery.iframetracker.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery iframe click tracking plugin 3 | * 4 | * @author Vincent Paré 5 | * @copyright © 2013-<%= grunt.template.today("yyyy") %> Vincent Paré 6 | * @license http://opensource.org/licenses/Apache-2.0 7 | * @version <%= pkg.version %> 8 | */ 9 | (function($) { 10 | // Tracking handler manager 11 | $.fn.iframeTracker = function(handler) { 12 | // Building handler object from handler function 13 | if (typeof handler == "function") { 14 | handler = { 15 | blurCallback: handler 16 | }; 17 | } 18 | 19 | var target = this.get(); 20 | if (handler === null || handler === false) { 21 | $.iframeTracker.untrack(target); 22 | } else if (typeof handler == "object") { 23 | $.iframeTracker.track(target, handler); 24 | } else { 25 | throw new Error("Wrong handler type (must be an object, or null|false to untrack)"); 26 | } 27 | return this; 28 | }; 29 | 30 | // Iframe tracker common object 31 | $.iframeTracker = { 32 | // State 33 | focusRetriever: null, // Element used for restoring focus on window (element) 34 | focusRetrieved: false, // Says if the focus was retrieved on the current page (bool) 35 | handlersList: [], // Store a list of every trakers (created by calling $(selector).iframeTracker...) 36 | isIE8AndOlder: false, // true for Internet Explorer 8 and older 37 | 38 | // Init (called once on document ready) 39 | init: function() { 40 | // Determine browser version (IE8-) ($.browser.msie is deprecated since jQuery 1.9) 41 | try { 42 | if ($.browser.msie === true && $.browser.version < 9) { 43 | this.isIE8AndOlder = true; 44 | } 45 | } catch (ex) { 46 | try { 47 | var matches = navigator.userAgent.match(/(msie) ([\w.]+)/i); 48 | if (matches[2] < 9) { 49 | this.isIE8AndOlder = true; 50 | } 51 | } catch (ex2) {} 52 | } 53 | 54 | // Listening window blur 55 | $(window).focus(); 56 | $(window).blur(function(e) { 57 | $.iframeTracker.windowLoseFocus(e); 58 | }); 59 | 60 | // Focus retriever (get the focus back to the page, on mouse move) 61 | $("body").append('
'); 62 | this.focusRetriever = $("#focus_retriever"); 63 | this.focusRetrieved = false; 64 | 65 | // Special processing to make it work with my old friend IE8 (and older) ;) 66 | if (this.isIE8AndOlder) { 67 | // Blur doesn't works correctly on IE8-, so we need to trigger it manually 68 | this.focusRetriever.blur(function(e) { 69 | e.stopPropagation(); 70 | e.preventDefault(); 71 | $.iframeTracker.windowLoseFocus(e); 72 | }); 73 | 74 | // Keep focus on window (fix bug IE8-, focusable elements) 75 | $("body").click(function(e) { 76 | $(window).focus(); 77 | }); 78 | $("form").click(function(e) { 79 | e.stopPropagation(); 80 | }); 81 | 82 | // Same thing for "post-DOMready" created forms (issue #6) 83 | try { 84 | $("body").on("click", "form", function(e) { 85 | e.stopPropagation(); 86 | }); 87 | } catch (ex) { 88 | console.log("[iframeTracker] Please update jQuery to 1.7 or newer. (exception: " + ex.message + ")"); 89 | } 90 | } 91 | }, 92 | 93 | // Add tracker to target using handler (bind boundary listener + register handler) 94 | // target: Array of target elements (native DOM elements) 95 | // handler: User handler object 96 | track: function(target, handler) { 97 | // Adding target elements references into handler 98 | handler.target = target; 99 | 100 | // Storing the new handler into handler list 101 | $.iframeTracker.handlersList.push(handler); 102 | 103 | // Binding boundary listener 104 | $(target) 105 | .bind("mouseover", { handler: handler }, $.iframeTracker.mouseoverListener) 106 | .bind("mouseout", { handler: handler }, $.iframeTracker.mouseoutListener); 107 | }, 108 | 109 | // Remove tracking on target elements 110 | // target: Array of target elements (native DOM elements) 111 | untrack: function(target) { 112 | if (typeof Array.prototype.filter != "function") { 113 | console.log("Your browser doesn't support Array filter, untrack disabled"); 114 | return; 115 | } 116 | 117 | // Unbinding boundary listener 118 | $(target).each(function(index) { 119 | $(this) 120 | .unbind("mouseover", $.iframeTracker.mouseoverListener) 121 | .unbind("mouseout", $.iframeTracker.mouseoutListener); 122 | }); 123 | 124 | // Handler garbage collector 125 | var nullFilter = function(value) { 126 | return value === null ? false : true; 127 | }; 128 | for (var i in this.handlersList) { 129 | // Prune target 130 | for (var j in this.handlersList[i].target) { 131 | if ($.inArray(this.handlersList[i].target[j], target) !== -1) { 132 | this.handlersList[i].target[j] = null; 133 | } 134 | } 135 | this.handlersList[i].target = this.handlersList[i].target.filter(nullFilter); 136 | 137 | // Delete handler if unused 138 | if (this.handlersList[i].target.length === 0) { 139 | this.handlersList[i] = null; 140 | } 141 | } 142 | this.handlersList = this.handlersList.filter(nullFilter); 143 | }, 144 | 145 | // Target mouseover event listener 146 | mouseoverListener: function(e) { 147 | e.data.handler.over = true; 148 | $.iframeTracker.retrieveFocus(); 149 | try { 150 | e.data.handler.overCallback(this, e); 151 | } catch (ex) {} 152 | }, 153 | 154 | // Target mouseout event listener 155 | mouseoutListener: function(e) { 156 | e.data.handler.over = false; 157 | $.iframeTracker.retrieveFocus(); 158 | try { 159 | e.data.handler.outCallback(this, e); 160 | } catch (ex) {} 161 | }, 162 | 163 | // Give back focus from an iframe to parent page 164 | retrieveFocus: function() { 165 | if (document.activeElement && document.activeElement.tagName === "IFRAME") { 166 | $.iframeTracker.focusRetriever.focus(); 167 | $.iframeTracker.focusRetrieved = true; 168 | } 169 | }, 170 | 171 | // Calls blurCallback for every handler with over=true on window blur 172 | windowLoseFocus: function(e) { 173 | for (var i in this.handlersList) { 174 | if (this.handlersList[i].over === true) { 175 | try { 176 | this.handlersList[i].blurCallback(e); 177 | } catch (ex) {} 178 | } 179 | } 180 | } 181 | }; 182 | 183 | // Init the iframeTracker on document ready 184 | $(document).ready(function() { 185 | $.iframeTracker.init(); 186 | }); 187 | })(jQuery); 188 | -------------------------------------------------------------------------------- /src/umd.hbs: -------------------------------------------------------------------------------- 1 | (function (root, factory) { 2 | if (typeof define === 'function' && define.amd) { 3 | define({{#if amdModuleId}}'{{amdModuleId}}', {{/if}}[{{{amdDependencies.wrapped}}}], function ({{{amdDependencies.params}}}) { 4 | return ({{#if objectToExport}}root['{{{objectToExport}}}'] = {{/if}}factory({{{amdDependencies.params}}})); 5 | }); 6 | } else if (typeof module === 'object' && module.exports) { 7 | module.exports = factory({{{cjsDependencies.wrapped}}}); 8 | } else { 9 | {{#if globalAlias}}root['{{{globalAlias}}}'] = {{else}}{{#if objectToExport}}root['{{{objectToExport}}}'] = {{/if}}{{/if}}factory({{{globalDependencies.normal}}}); 10 | } 11 | }(this, function ({{dependencies}}) { 12 | 13 | {{{code}}} 14 | {{#if objectToExport}} 15 | return {{{objectToExport}}}; 16 | {{/if}} 17 | })); 18 | -------------------------------------------------------------------------------- /test/unit/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "globals": { 3 | "QUnit": true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /test/unit/iframeTracker-jQuery1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | iframeTracker Test Suite - jQuery 1 6 | 7 | 8 | 9 |
10 |
11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /test/unit/iframeTracker-jQuery2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | iframeTracker Test Suite - jQuery 2 6 | 7 | 8 | 9 |
10 |
11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /test/unit/iframeTracker-jQuery3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | iframeTracker Test Suite - jQuery 3 6 | 7 | 8 | 9 |
10 |
11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /test/unit/iframeTracker_test.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | /** 3 | * Returns a dummy spy iframeTracker handler 4 | */ 5 | var stepHandlerFactory = function(assert) { 6 | return { 7 | blurCallback: function(event) { 8 | assert.step("blur " + this.iframeId); 9 | assert.ok(event instanceof $.Event, "event is an Event"); 10 | }, 11 | overCallback: function(element, event) { 12 | this.iframeId = $(element).attr("id"); 13 | assert.step("over " + this.iframeId); 14 | assert.ok(event instanceof $.Event, "event is an Event"); 15 | }, 16 | outCallback: function(element, event) { 17 | this.iframeId = null; 18 | assert.step("out " + $(element).attr("id")); 19 | assert.ok(event instanceof $.Event, "event is an Event"); 20 | } 21 | }; 22 | }; 23 | 24 | QUnit.testDone(function(details) { 25 | $.iframeTracker.handlersList = []; 26 | $.iframeTracker.focusRetrieved = false; 27 | document.activeElement.blur(); 28 | $(window).focus(); 29 | }); 30 | 31 | QUnit.test("init", function(assert) { 32 | assert.ok($.iframeTracker.focusRetriever.is("input"), "Focus retriever element looks good"); 33 | assert.ok($.iframeTracker.focusRetrieved === false, "Focus was not yet retrieved"); 34 | assert.ok($.iframeTracker.handlersList instanceof Array, "handlersList is an array"); 35 | assert.ok($.iframeTracker.handlersList.length === 0, "handlersList is empty"); 36 | assert.ok(document.activeElement === document.querySelector("body"), " has focus"); 37 | }); 38 | 39 | QUnit.test("Focus retriever", function(assert) { 40 | $("#qunit-fixture iframe").iframeTracker({}); 41 | assert.ok(document.activeElement === document.querySelector("body"), " has focus"); 42 | $(document).trigger("mousemove"); 43 | assert.ok(document.activeElement === document.querySelector("body"), " still has focus"); 44 | $("#qunit-fixture #red_iframe").trigger("mouseover"); 45 | $("#qunit-fixture #red_iframe").focus(); 46 | assert.ok(document.activeElement === document.querySelector("#qunit-fixture #red_iframe"), "Focus on an iframe"); 47 | $("#qunit-fixture #red_iframe").trigger("mouseout"); 48 | $(document).trigger("mousemove"); 49 | assert.ok(document.activeElement === $.iframeTracker.focusRetriever[0], "Focus retrieved (element)"); 50 | assert.ok($.iframeTracker.focusRetrieved === true, "Focus retrieved (flag)"); 51 | }); 52 | 53 | QUnit.test("track", function(assert) { 54 | assert.ok($.iframeTracker.handlersList.length === 0, "handlersList is empty"); 55 | var iframe = document.querySelector("#qunit-fixture #red_iframe"); 56 | var handler = function() {}; 57 | $.iframeTracker.track(iframe, handler); 58 | assert.ok($.iframeTracker.handlersList.length === 1, "handlersList length OK"); 59 | assert.ok($.iframeTracker.handlersList[0] === handler, "handler registred"); 60 | var eventBindCheck = function(element, event, handler) { 61 | var bound = false; 62 | $.each($._data(element, "events")[event], function(key, val) { 63 | if (val.handler === handler) { 64 | bound = true; 65 | } 66 | }); 67 | return bound; 68 | }; 69 | assert.ok(eventBindCheck(iframe, "mouseover", $.iframeTracker.mouseoverListener), "mouseover handler is bound"); 70 | assert.ok(eventBindCheck(iframe, "mouseout", $.iframeTracker.mouseoutListener), "mouseout handler is bound"); 71 | }); 72 | 73 | QUnit.test("untrack", function(assert) { 74 | var iframe = [document.querySelector("#qunit-fixture #red_iframe")]; 75 | $.iframeTracker.track(iframe, {}); 76 | assert.ok($.iframeTracker.handlersList.length === 1, "ready"); 77 | $.iframeTracker.untrack(iframe); 78 | assert.ok($.iframeTracker.handlersList.length === 0, "handlersList is empty"); 79 | }); 80 | 81 | QUnit.test("Chaining", function(assert) { 82 | var tracker = $("#qunit-fixture #red_iframe").iframeTracker(false); 83 | assert.ok(tracker instanceof $, "fn is chainable"); 84 | }); 85 | 86 | QUnit.test("fn invalid argument", function(assert) { 87 | assert.throws( 88 | function() { 89 | $("#qunit-fixture #red_iframe").iframeTracker("Bad motherfucker"); 90 | }, 91 | /Wrong handler type/, 92 | "Argument check success" 93 | ); 94 | }); 95 | 96 | QUnit.test("Handler building", function(assert) { 97 | var blurCallback = function(event) {}; 98 | $("#qunit-fixture #red_iframe").iframeTracker(blurCallback); 99 | assert.ok(typeof $.iframeTracker.handlersList[0] == "object", "Handler build success"); 100 | assert.ok($.iframeTracker.handlersList[0].blurCallback === blurCallback, "Blur callback bound"); 101 | }); 102 | 103 | QUnit.test("Workflow : over, blur", function(assert) { 104 | $("#qunit-fixture iframe").iframeTracker(stepHandlerFactory(assert)); 105 | $("#qunit-fixture #red_iframe").trigger("mouseover"); 106 | $(window).trigger("blur"); 107 | assert.verifySteps(["over red_iframe", "blur red_iframe"]); 108 | }); 109 | 110 | QUnit.test("Workflow : over, out, blur", function(assert) { 111 | $("#qunit-fixture iframe").iframeTracker(stepHandlerFactory(assert)); 112 | $("#qunit-fixture #red_iframe").trigger("mouseover"); 113 | $("#qunit-fixture #red_iframe").trigger("mouseout"); 114 | $(window).trigger("blur"); 115 | assert.verifySteps(["over red_iframe", "out red_iframe"]); 116 | }); 117 | 118 | QUnit.test("Workflow : over, blur, untrack & again", function(assert) { 119 | $("#qunit-fixture iframe").iframeTracker(stepHandlerFactory(assert)); 120 | 121 | $("#qunit-fixture #blue_iframe").trigger("mouseover"); 122 | $(window).trigger("blur"); 123 | $("#qunit-fixture #blue_iframe").trigger("mouseout"); 124 | $(document).trigger("mousemove"); 125 | 126 | $("#qunit-fixture #red_iframe").trigger("mouseover"); 127 | $(window).trigger("blur"); 128 | $("#qunit-fixture #red_iframe").trigger("mouseout"); 129 | $(document).trigger("mousemove"); 130 | 131 | $("#qunit-fixture #red_iframe").iframeTracker(false); 132 | $(window).trigger("blur"); 133 | 134 | assert.verifySteps([ 135 | "over blue_iframe", 136 | "blur blue_iframe", 137 | "out blue_iframe", 138 | "over red_iframe", 139 | "blur red_iframe", 140 | "out red_iframe" 141 | ]); 142 | }); 143 | 144 | QUnit.test("Workflow : from untracked iframe to tracked iframe", function(assert) { 145 | var clicked = false; 146 | $("#qunit-fixture #red_iframe").iframeTracker(function(event) { 147 | clicked = true; 148 | }); 149 | $("#qunit-fixture #blue_iframe").focus(); 150 | assert.ok(document.activeElement === document.querySelector("#qunit-fixture #blue_iframe"), "Focus on untracked iframe"); 151 | $("#qunit-fixture #blue_iframe").trigger("mouseout"); 152 | $(document).trigger("mousemove"); 153 | $("#qunit-fixture #red_iframe").trigger("mouseover"); 154 | assert.ok(document.activeElement === $.iframeTracker.focusRetriever[0], "Focus retrieved (element)"); 155 | assert.ok($.iframeTracker.focusRetrieved === true, "Focus retrieved (flag)"); 156 | assert.ok(clicked === false, "Not yet clicked"); 157 | $("#qunit-fixture #red_iframe").focus(); 158 | assert.ok(clicked === true, "Clicked"); 159 | assert.ok(document.activeElement === document.querySelector("#qunit-fixture #red_iframe"), "Focus on tracked iframe"); 160 | }); 161 | })(jQuery); 162 | --------------------------------------------------------------------------------