├── .gitignore ├── .npmignore ├── src ├── plugins │ ├── base.coffee │ ├── index.coffee │ ├── distinctid.coffee │ ├── utm.coffee │ └── referral.coffee ├── providers │ ├── index.coffee │ ├── growingio.coffee │ ├── base.coffee │ ├── baidu.coffee │ ├── google.coffee │ ├── fullstory.coffee │ ├── customerio.coffee │ ├── sensorsdata.coffee │ └── tbpanel.coffee ├── common.coffee └── index.coffee ├── bower.json ├── webpack.config.js ├── package.json ├── test ├── test.js └── index.html ├── LICENSE ├── CHANGELOG.md ├── README.md ├── lib └── index.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | bower_components 3 | www 4 | .DS_Store 5 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | 2 | /src 3 | /test 4 | /Gruntfile.coffee 5 | /bower.json 6 | -------------------------------------------------------------------------------- /src/plugins/base.coffee: -------------------------------------------------------------------------------- 1 | 2 | module.exports = class BasePlugin 3 | name: 'base' 4 | constructor: (gta) -> # virtual 5 | onGTAEvent: (gtaOptions) -> gtaOptions 6 | -------------------------------------------------------------------------------- /src/plugins/index.coffee: -------------------------------------------------------------------------------- 1 | UTM = require './utm' 2 | Referral = require './referral' 3 | DistinctID = require './distinctid' 4 | 5 | module.exports = 6 | utm: UTM 7 | referral: Referral 8 | distinctid: DistinctID 9 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gta", 3 | "version": "1.1.6", 4 | "main": "lib/index.js", 5 | "ignore": [ 6 | "**/.*", 7 | "node_modules", 8 | "bower_components", 9 | "test", 10 | "tests" 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /src/plugins/distinctid.coffee: -------------------------------------------------------------------------------- 1 | BasePlugin = require './base' 2 | 3 | module.exports = class DistinctID extends BasePlugin 4 | name: 'distinct id synchronizer' 5 | 6 | constructor: (gta)-> 7 | try 8 | if window.tbpanel and window.sa 9 | sa.quick 'isReady', -> 10 | tbpanel.identify(sa.store.getDistinctId()) 11 | catch e 12 | console.error e if gta.debug or window._gta_debug 13 | -------------------------------------------------------------------------------- /src/providers/index.coffee: -------------------------------------------------------------------------------- 1 | Google = require './google' 2 | Baidu = require './baidu' 3 | Customer = require './customerio' 4 | Fullstory = require './fullstory' 5 | GrowingIO = require './growingio' 6 | TBPanel = require './tbpanel' 7 | Sensors = require './sensorsdata' 8 | 9 | module.exports = 10 | google: Google 11 | baidu: Baidu 12 | tbpanel: TBPanel 13 | customer: Customer 14 | fullstory: Fullstory 15 | growingio: GrowingIO 16 | sensors: Sensors 17 | -------------------------------------------------------------------------------- /src/providers/growingio.coffee: -------------------------------------------------------------------------------- 1 | # Last updated at 2016-10-28 2 | 3 | BaseProvider = require './base' 4 | 5 | module.exports = 6 | class GrowingIO extends BaseProvider 7 | name: 'growingio' 8 | 9 | constructor: (account) -> 10 | return unless account 11 | _vds = _vds or [] 12 | window._vds = _vds 13 | _vds.push ['setAccountId', account] 14 | script = BaseProvider.createScript (if 'https:' is document.location.protocol then 'https://' else 'http://') + 'dn-growing.qbox.me/vds.js' 15 | BaseProvider.loadScript script 16 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | 3 | module.exports = { 4 | entry: "./src/index.coffee", 5 | output: { 6 | library: 'Gta', 7 | libraryTarget: 'umd', 8 | umdNamedDefine: true, 9 | path: path.resolve(__dirname, 'lib'), 10 | filename: "index.js" 11 | }, 12 | module: { 13 | loaders: [ 14 | { test: /\.coffee$/, loader: "coffee-loader" } 15 | ] 16 | }, 17 | resolve: { 18 | root: path.resolve('./src'), 19 | extensions: ['', '.js', '.coffee'] 20 | } 21 | }; 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "teambition-gta", 3 | "version": "1.1.6", 4 | "description": "group teambition analysis tool", 5 | "main": "lib/index.js", 6 | "scripts": { 7 | "build": "webpack" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git@github.com:teambition/gta" 12 | }, 13 | "keywords": [ 14 | "google", 15 | "baidu", 16 | "mixpanel", 17 | "analysis", 18 | "customer.io", 19 | "fullstory", 20 | "growingio" 21 | ], 22 | "author": "teambition", 23 | "license": "MIT", 24 | "bugs": { 25 | "url": "https://github.com/teambition/gta/issues" 26 | }, 27 | "devDependencies": { 28 | "coffee-loader": "^0.7.2", 29 | "coffee-script": "^1.11.1", 30 | "webpack": "^1.13.3" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/providers/base.coffee: -------------------------------------------------------------------------------- 1 | Common = require '../common' 2 | 3 | module.exports = class BaseProvider 4 | name: 'base' 5 | event: -> # virtual 6 | setUser: -> # virtual 7 | pageview: -> # virtual 8 | 9 | BaseProvider.createScript = (src, id) -> 10 | script = document.createElement 'script' 11 | script.async = 1 12 | script.src = src 13 | script.id = id if id 14 | return script 15 | 16 | BaseProvider.loadScript = (script, key, removeAfterLoad = yes) -> 17 | script.onerror = -> 18 | window[key] = null 19 | Common.removeElement script 20 | script.onload = -> 21 | if removeAfterLoad 22 | Common.removeElement script 23 | 24 | firstScript = document.getElementsByTagName('script')[0] 25 | firstScript.parentNode.insertBefore(script, firstScript) 26 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | console.log('test start!'); 3 | 4 | window.Gta.debug = true; 5 | 6 | window.Gta.test = function () { 7 | window.Gta.pageview({ 8 | 'page': '/my-overridden-page?id=1', 9 | 'title': 'my overridden page' 10 | }); 11 | window.Gta.setCurrentPage('Tasks List Page'); 12 | window.Gta.event({action: 'drag post card', type: 'post', control: 'Post Menu', method: 'drag'}); 13 | } 14 | window.Gta.setUser('ziqiang250', { 15 | name: 'ziqiang', 16 | email: 'ziqiang@tb.com', 17 | created_at: { 18 | value: '20150805', 19 | alias: { 20 | fullstory: 'created_at_date' 21 | } 22 | }, 23 | language: 'en', 24 | env: 'web', 25 | version: '2.5.0', 26 | city: 'Xi\'an', 27 | country: 'China', 28 | region: 'Shanxi', 29 | }) 30 | }()) 31 | -------------------------------------------------------------------------------- /src/plugins/utm.coffee: -------------------------------------------------------------------------------- 1 | BasePlugin = require './base' 2 | 3 | UTM_TAG_REGEX = /utm_(\w+)=([^&]*)&?/ig 4 | COOKIE_TEST_REGEX = /(^|;\s?)utm=(\S+)(?:;|$)/i 5 | 6 | module.exports = class UTMDaemon extends BasePlugin 7 | name: 'utm daemon' 8 | 9 | constructor: (gta)-> 10 | try 11 | return if COOKIE_TEST_REGEX.test(document.cookie) 12 | utm = {} 13 | while match = UTM_TAG_REGEX.exec window.location.search 14 | [ part, key, value ] = match 15 | utm[key] = value 16 | encodedUTM = encodeURIComponent(JSON.stringify(utm)) 17 | domain = ".#{/\.?([\w\-]+\.\w+)$/.exec(window.location.hostname)[1]}" 18 | monthLater = new Date(Date.now() + 2592000000).toGMTString() # 1000 * 60 * 60 * 24 * 30 19 | if part 20 | document.cookie = "utm=#{encodedUTM};expires=#{monthLater};domain=#{domain};path=/" 21 | catch e 22 | console.error e if gta.debug or window._gta_debug 23 | -------------------------------------------------------------------------------- /test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | homepage 5 | 11 | 12 | 13 | 14 |

hello world

15 | 16 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/providers/baidu.coffee: -------------------------------------------------------------------------------- 1 | # Last updated at 2016-10-27 2 | 3 | BaseProvider = require './base' 4 | Common = require '../common' 5 | 6 | module.exports = 7 | class Baidu extends BaseProvider 8 | name: 'baidu' 9 | 10 | constructor: (account) -> 11 | return unless account 12 | window._hmt = window._hmt || [] 13 | script = BaseProvider.createScript "//hm.baidu.com/hm.js?#{account}" 14 | BaseProvider.loadScript script, '_hmt' 15 | 16 | pageview: -> 17 | return unless window._hmt 18 | args = Array::slice.call arguments 19 | if typeof args[0] is 'object' 20 | data = args[0].page 21 | unless data 22 | data = (val for key, val of args[0]).join '_' 23 | else 24 | data = args.join '_' 25 | window._hmt.push ['_trackPageview', data] 26 | 27 | event: (gtaOptions) -> 28 | return unless window._hmt 29 | category = gtaOptions.page or '' 30 | action = gtaOptions.action or '' 31 | label = gtaOptions.type or '' 32 | window._hmt.push ['_trackEvent', category, action, label] 33 | -------------------------------------------------------------------------------- /src/plugins/referral.coffee: -------------------------------------------------------------------------------- 1 | BasePlugin = require './base' 2 | 3 | COOKIE_TEST_REGEX = /(^|;\s?)referral=(\S+)(?:;|$)/i 4 | 5 | module.exports = class ReferralDaemon extends BasePlugin 6 | name: 'referral daemon' 7 | 8 | constructor: (gta)-> 9 | try 10 | if document.referrer and not COOKIE_TEST_REGEX.test(document.cookie) 11 | $parser = document.createElement('a') 12 | $parser.href = document.referrer 13 | referral = 14 | domain: $parser.hostname.slice(0, 100) 15 | path: $parser.pathname.slice(0, 100) 16 | query: $parser.search.slice(0, 100) 17 | hash: $parser.hash.slice(0, 100) 18 | encodedReferral = encodeURIComponent(JSON.stringify(referral)) 19 | domain = ".#{/\.?([\w\-]+\.\w+)$/.exec(window.location.hostname)[1]}" 20 | monthLater = new Date(Date.now() + 2592000000).toGMTString() # 1000 * 60 * 60 * 24 * 30 21 | document.cookie = "referral=#{encodedReferral};expires=#{monthLater};domain=#{domain};path=/" 22 | catch e 23 | console.error e if gta.debug or window._gta_debug 24 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright © 2013 teambition, http://teambition.com 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /src/providers/google.coffee: -------------------------------------------------------------------------------- 1 | # Last updated at 2016-10-28 2 | 3 | BaseProvider = require './base' 4 | 5 | module.exports = 6 | class Google extends BaseProvider 7 | name: 'google' 8 | 9 | constructor: (account) -> 10 | return unless account 11 | 12 | window.GoogleAnalyticsObject = 'ga' 13 | 14 | window.ga = -> 15 | window.ga.q.push arguments 16 | 17 | window.ga.q = [] 18 | window.ga.l = 1 * new Date() 19 | 20 | script = BaseProvider.createScript '//www.google-analytics.com/analytics.js' 21 | BaseProvider.loadScript script, 'ga' 22 | 23 | window.ga 'create', account, 'auto' 24 | # window.ga 'require', 'displayfeatures' 25 | window.ga 'require', 'linkid', 'linkid.js' 26 | window.ga 'send', 'pageview' 27 | 28 | pageview: -> 29 | return unless window.ga 30 | args = Array::slice.call arguments 31 | data = if typeof args[0] is 'object' then args[0] else args.join '_' 32 | window.ga 'send', 'pageview', data 33 | 34 | event: (gtaOptions) -> 35 | return unless window.ga 36 | category = gtaOptions.page 37 | action = gtaOptions.action 38 | label = gtaOptions.type 39 | window.ga 'send', 'event', category, action, label 40 | -------------------------------------------------------------------------------- /src/common.coffee: -------------------------------------------------------------------------------- 1 | module.exports = Common = {} 2 | 3 | GTA_CHECK_REGEX = /^\s*\{(.*)\}\s*$/ 4 | GTA_PARSE_REGEX = /[\s"']*([^:,"']+)[\s"']*:[\s"']*([^:,"']+)[\s"']*,?/g 5 | 6 | Common.extend = (dest, source...) -> 7 | for arg in source 8 | for key, value of arg 9 | dest[key] = value 10 | return dest 11 | 12 | Common.removeElement = (el) -> 13 | el.parentNode.removeChild el 14 | 15 | # gta规则: 16 | # gta两端由 引号、大括号包裹: "{}" 或 '{}' 17 | # 大括号内部类似JSON的 {key: value}格式,不同的是key和value两端的引号可以省略,两端的空格会被省略, 18 | # key 和 value 的值不可以包含: 冒号、逗号、单引号、双引号, 19 | # e.g. data-gta="{action: 'add content', 'page' : 'Project Page', type: task, control: tasks layout, 'method': double-click}" 20 | Common.parseGta = (gtaString) -> 21 | return unless gtaString 22 | gtaString = GTA_CHECK_REGEX.exec(gtaString)?[1] 23 | return unless gtaString and gtaString.length 24 | 25 | gtaOptions = {} 26 | while it = GTA_PARSE_REGEX.exec gtaString 27 | [_, key, value] = it 28 | gtaOptions[key] = value 29 | return gtaOptions 30 | 31 | # 根据属性为不同的 provider 提供不同类型的 super properties 32 | Common.formatUser = (provider, user)-> 33 | result = {} 34 | for key, value of user 35 | continue unless value 36 | continue if value.wlist? and provider.name not in value.wlist 37 | if value.alias?[provider.name] 38 | result[value.alias[provider.name]] = value.value 39 | else 40 | if Object::toString.call(value) is '[object Object]' and 'value' of value 41 | result[key] = value.value 42 | else 43 | result[key] = value 44 | return result 45 | 46 | Common.pick = (obj, keys) -> 47 | return unless obj 48 | result = {} 49 | for key in keys 50 | if obj[key] 51 | result[key] = obj[key] 52 | return result 53 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## Change Log Archive under v1.0.0 2 | For change log since v1.0.0, please see README.md. 3 | 4 | #### 0.9.8 5 | 1. New provider: GrowingIO 6 | 7 | #### 0.9.7 8 | 1. Add `data-gta-ignore` support 9 | 10 | #### 0.9.6 11 | 1. Update tbpanel script 12 | 2. Fix bug on `delegateEvents` 13 | 14 | #### 0.9.5 15 | 1. Remove another jQuery dependency 16 | 17 | #### 0.9.4 18 | 1. Fix cookie path in utm daemon 19 | 20 | #### 0.9.3 21 | 1. Remove jQuery dependency 22 | 2. Minor bug fix 23 | 24 | #### 0.9.1 - 0.9.2 25 | 1. New provider: tbpanel 26 | 2. Make property 'platform' changable 27 | 3. Minor bug fix 28 | 29 | #### 0.9.0 30 | 1. utm daemon support 31 | 32 | #### 0.8.13 33 | 1. Report system version, desktop client type&version to mixpanel 34 | 35 | #### 0.8.12 36 | 1. For fullstory: Change `name` to `displayName` 37 | 38 | #### 0.8.10 - 0.8.11 39 | 1. Fix push config object when value is the falsely value 40 | 41 | #### 0.8.9 42 | 1. Add whitelist `wlist` support in `setUser`. 43 | 2. Teambition polyfill for desktop client in mixpanel 44 | 45 | #### 0.8.6 - 0.8.8 46 | 1. Force `created_at` field for Customer.io be a number in seconds since epoch 47 | 48 | #### 0.8.5 49 | 1. Fullstory will ignore unqualified field 50 | 51 | #### 0.8.3 - 0.8.4 52 | Minor bug fix 53 | 54 | #### 0.8.2 55 | 1. Mixin user info into mixpanel data 56 | 2. Teambition polyfill for customer.io 57 | 3. Remove sensetive data from fullstory 58 | 59 | #### 0.8.1 60 | 1. Add provider-specific alias support in method `setUser` 61 | 62 | #### 0.8.0 63 | 1. remove the compatible code for old rules 64 | 2. add 'debug' mode 65 | 66 | #### 0.7.2 67 | 1. remove the needless pageview method of customer.io 68 | 2. add setCurrentPage method 69 | 70 | #### 0.7.1 71 | 1. add new rules 72 | 2. remove Piwik 73 | 3. remove field 'value' 74 | -------------------------------------------------------------------------------- /src/providers/fullstory.coffee: -------------------------------------------------------------------------------- 1 | # Last updated at 2016-10-28 2 | 3 | BaseProvider = require './base' 4 | Common = require '../common' 5 | 6 | module.exports = 7 | class Fullstory extends BaseProvider 8 | name: 'fullstory' 9 | 10 | constructor: (account)-> 11 | return unless account 12 | 13 | _fullstory = window.FS = (id, user) -> 14 | if _fullstory.q 15 | _fullstory.q.push arguments 16 | else 17 | _fullstory._api id, user 18 | 19 | _fullstory.q = [] 20 | _fs_debug = window._fs_debug = window._fs_debug or false 21 | _fs_host = window._fs_host = window._fs_host or 'www.fullstory.com' 22 | _fs_org = window._fs_org = account 23 | 24 | script = BaseProvider.createScript "https://#{_fs_host}/s/fs.js" 25 | BaseProvider.loadScript script 26 | 27 | _fullstory.identify = (id, user) -> 28 | _fullstory 'user', uid: id 29 | _fullstory 'user', user if user 30 | 31 | _fullstory.setUserVars = (user) -> 32 | _fullstory 'user', user 33 | 34 | _fullstory.identifyAccount = (id, user = {}) -> 35 | user.acctId = id 36 | _fullstory 'account', user 37 | 38 | _fullstory.clearUserCookie = (identified_only) -> 39 | if not identified_only or document.cookie.match('fs_uid=[`;`]*`[`;`]*`[`;`]*`') 40 | domain = document.domain 41 | while true 42 | document.cookie = 'fs_uid=;domain=' + domain + ';path=/;expires=' + new Date(0) 43 | index = domain.indexOf('.') 44 | break if index < 0 45 | domain = domain.slice index + 1 46 | 47 | setUser: (id, raw_user) -> 48 | user = Common.extend {}, raw_user 49 | for k, v of user when not /(^(displayName|email)$)|(.*_(str|int|real|date|bool)$)/.test k 50 | delete user[k] 51 | user.displayName = id # We don't log sensetive data 52 | user.email = "#{id}@mail.teambition.com" # We don't log sensetive data 53 | window.FS.identify id, user 54 | -------------------------------------------------------------------------------- /src/providers/customerio.coffee: -------------------------------------------------------------------------------- 1 | # Last updated at 2016-10-28 2 | 3 | BaseProvider = require './base' 4 | Common = require '../common' 5 | 6 | module.exports = 7 | class CustomerIO extends BaseProvider 8 | name: 'customer.io' 9 | 10 | constructor: (@account) -> 11 | 12 | initCustomer: (id) -> 13 | _cio = window._cio = window._cio or [] 14 | _cio.invoked = true 15 | _cio.methods = [ 16 | 'trackSubmit', 'trackClick', 'trackLink', 'trackForm', 17 | 'pageview', 'reset', 'group', 'ready', 'alias', 'page', 18 | 'once', 'off', 'on', 'load', 'identify', 'sidentify', 'track' 19 | ] 20 | _cio.factory = (method) -> 21 | return -> 22 | _cio.push [method].concat Array.prototype.slice.call arguments 23 | return _cio 24 | 25 | _cio[method] = _cio.factory method for method in _cio.methods 26 | 27 | accounts = @account.split ',' 28 | # teambition polyfill 29 | # if use Teambition as userid pick the first one [customer env=2015] 30 | # use email as userid pick the second one [customer env=2016] 31 | _account = if id?.indexOf('@') > 0 then accounts[1] else accounts[0] 32 | 33 | script = BaseProvider.createScript '//assets.customer.io/assets/track.js', 'cio-tracker' 34 | script.setAttribute 'data-site-id', _account 35 | BaseProvider.loadScript script, '_cio', false 36 | 37 | setUser: (id, raw_user) -> 38 | return unless @account 39 | user = Common.extend {}, raw_user 40 | user.id = id 41 | # teambition polyfill 42 | # For user created later than 2016, use email as user id 43 | if new Date(user.created_at) >= new Date('2016-01-01') 44 | user.id = user.email 45 | user.created_at = Math.floor(new Date(user.created_at).valueOf() / 1000) 46 | @initCustomer user.id 47 | window._cio?.identify user 48 | 49 | pageview: (data) -> 50 | # customer.io pageviews are tracking by the javascript snippet above 51 | # For Detail: https://customer.io/docs/pageviews.html 52 | 53 | event: (gtaOptions) -> 54 | return unless @account 55 | window._cio?.track gtaOptions.action, gtaOptions 56 | -------------------------------------------------------------------------------- /src/providers/sensorsdata.coffee: -------------------------------------------------------------------------------- 1 | BaseProvider = require './base' 2 | Common = require '../common' 3 | 4 | module.exports = 5 | class SensorsData extends BaseProvider 6 | name: 'sensorsdata' 7 | 8 | constructor: (account, script, track) -> 9 | return unless account 10 | 11 | para = 12 | name: 'sa' 13 | web_url: track 14 | server_url: account 15 | sdk_url: '//dn-st.teambition.net/sensorsdata/sensorsdata.latest.min.js' 16 | heatmap_url: '//dn-st.teambition.net/sensorsdata/heatmap.latest.min.js' 17 | 18 | Common.extend(para, JSON.parse(script || '{}')) 19 | 20 | window.sensorsDataAnalytic201505 = 'sa' 21 | 22 | window.sa = window.sa or (a) -> () -> 23 | window.sa._q = window.sa._q || [] 24 | window.sa._q.push([a, arguments]) 25 | 26 | funcs = [ 27 | 'track', 'quick', 'register', 'registerPage', 'registerOnce', 28 | 'clearAllRegister', 'trackSignup', 'trackAbtest', 'setProfile', 29 | 'setOnceProfile', 'appendProfile', 'incrementProfile', 'deleteProfile', 30 | 'unsetProfile', 'identify', 'login', 'logout', 'trackLink', 'clearAllRegister' 31 | ] 32 | for func in funcs 33 | window.sa[func] = window.sa.call(null, func) 34 | 35 | unless window.sa._t 36 | script = BaseProvider.createScript para.sdk_url 37 | BaseProvider.loadScript script, 'sa', no 38 | window.sa?.para = para 39 | 40 | window.sa?.quick 'autoTrack' 41 | 42 | setUser: (id, raw_user) -> 43 | if /[a-fA-F0-9]{24}/.test(id) 44 | window.sa?.login(id) 45 | window.sa?.setProfile(raw_user) 46 | 47 | event: (gtaOptions) -> 48 | data = Common.extend {}, gtaOptions 49 | data.platform ?= 'web' 50 | 51 | normalizedData = {} 52 | for key, value of data 53 | normalizedData[key.toLowerCase()] = value 54 | normalizedAction = data.action 55 | .replace(/ /g, '_') 56 | .replace(/[^A-Za-z0-9_\$]/g, '') 57 | .toLowerCase() 58 | window.sa?.track(normalizedAction, normalizedData) 59 | 60 | login: (userId) -> 61 | window.sa?.login(userId) 62 | 63 | logout: -> 64 | window.sa?.logout() 65 | -------------------------------------------------------------------------------- /src/providers/tbpanel.coffee: -------------------------------------------------------------------------------- 1 | BaseProvider = require './base' 2 | Common = require '../common' 3 | 4 | module.exports = 5 | class TBPanel extends BaseProvider 6 | name: 'tbpanel' 7 | 8 | loaded: false 9 | loadHandlers: [] 10 | 11 | constructor: (account, scriptUrl, track, bootParams) -> 12 | return unless account 13 | scriptUrl or= '//g.alicdn.com/teambition-fe/static-files/tbpanel/generic.36b6.js' 14 | 15 | lib_name = 'tbpanel' 16 | window.TBPANEL_TRACK_URL = track if track 17 | tbpanel = window.tbpanel = [] 18 | tbpanel._i = [] 19 | 20 | tbpanel.init = (token, config, name) -> 21 | # support multiple tbpanel instances 22 | target = tbpanel 23 | if name? 24 | target = tbpanel[name] = [] 25 | else 26 | name = lib_name 27 | 28 | # Pass in current people object if it exists 29 | target.people or= [] 30 | 31 | target.toString = (no_stub) -> 32 | str = lib_name 33 | str += '.' + name if name isnt lib_name 34 | str += ' (stub)' unless no_stub 35 | return str 36 | 37 | target.people.toString = -> 38 | target.toString(1) + '.people (stub)' 39 | 40 | _set_and_defer = (target, fn) -> 41 | split = fn.split '.' 42 | if split.length is 2 43 | target = target[split[0]] 44 | fn = split[1] 45 | target[fn] = -> target.push [fn].concat Array::slice.call arguments 46 | 47 | functions = [ 48 | 'disable', 'track', 'track_pageview', 'track_links', 'track_forms', 'register', 49 | 'register_once', 'alias', 'unregister', 'identify', 'name_tag', 'set_config', 50 | 'people.set', 'people.set_once', 'people.increment', 'people.append', 51 | 'people.track_charge', 'people.clear_charges', 'people.delete_user' 52 | ] 53 | 54 | _set_and_defer target, fn for fn in functions 55 | 56 | tbpanel._i.push [token, config, name] 57 | 58 | tbpanel.__SV = 1.2 59 | 60 | options = loaded: @handleTBPanelLoaded 61 | 62 | try 63 | bootParams = JSON.parse(bootParams) 64 | options = Common.extend(options, bootParams) 65 | catch e 66 | console.error e 67 | 68 | tbpanel.init account, options 69 | script = BaseProvider.createScript scriptUrl 70 | BaseProvider.loadScript script, lib_name 71 | 72 | handleTBPanelLoaded: => 73 | @loaded = yes 74 | while handler = @loadHandlers.shift() 75 | handler() 76 | return 77 | 78 | onLoad: (handler) -> 79 | if @loaded 80 | do handler 81 | else 82 | @loadHandlers.push handler 83 | return 84 | 85 | setUser: (id, raw_user) -> 86 | user = Common.extend {}, raw_user 87 | user.userKey = id if id 88 | window.tbpanel.register user 89 | # Teambition polyfill for desktop clients 90 | dc = navigator.userAgent.match /(Teambition(?:-UWP)?)\/([\d\.]+)/i 91 | if dc 92 | [ all, client, version ] = dc 93 | client = 'Teambition_Desktop' if client is 'Teambition' 94 | window.tbpanel.register 95 | $browser: client, 96 | $browser_version: version 97 | os = navigator.userAgent.match /Windows NT [\d.]+|(?:Macintosh;|Linux|\b\w*BSD)[^;)]*?(?=\)|;)/i 98 | window.tbpanel.register $os_version: os[0] if os 99 | 100 | event: (gtaOptions) -> 101 | data = Common.extend {}, gtaOptions 102 | data.platform ?= 'web' 103 | window.tbpanel?.track data.action, data 104 | 105 | login: (userId) -> 106 | @onLoad () -> 107 | host = window.tbpanel?.get_config('api_host') 108 | distinctid = window.tbpanel?.get_distinct_id() 109 | req = new XMLHttpRequest() 110 | req.open('GET', "#{host}/login?userkey=#{userId}&distinct_id=#{distinctid}") 111 | req.send() 112 | -------------------------------------------------------------------------------- /src/index.coffee: -------------------------------------------------------------------------------- 1 | Common = require 'common' 2 | Plugins = require 'plugins' 3 | Providers = require 'providers' 4 | 5 | class GTA 6 | debug: no 7 | plugins: [] 8 | providers: [] 9 | mixPayload: {} 10 | actionMap: {} 11 | 12 | version: '1.1.6' 13 | 14 | constructor: -> 15 | return if typeof document is 'undefined' 16 | $el = document.getElementById 'gta-main' 17 | return unless $el 18 | @delegateEvents() 19 | @preloadActions($el) 20 | 21 | init: -> 22 | return if typeof document is 'undefined' 23 | $el = document.getElementById 'gta-main' 24 | return unless $el 25 | 26 | for own name, Provider of Providers 27 | @registerProvider name, Provider, $el 28 | 29 | for own name, Plugin of Plugins 30 | @registerPlugin Plugin 31 | 32 | Common.removeElement $el 33 | 34 | initXhr: (url) -> 35 | xhr = new XMLHttpRequest() 36 | xhr.open('GET', url, true) 37 | xhr.send() 38 | return xhr 39 | 40 | preloadActions: ($el) -> 41 | url = $el.getAttribute 'data-tbtracking' 42 | return unless url 43 | xhr = @initXhr(url) 44 | xhr.onreadystatechange = () => 45 | if xhr.readyState is 4 and xhr.status is 200 46 | actions = JSON.parse(xhr.response) 47 | for item in actions 48 | @actionMap[item.hash] = (@actionMap[item.hash] or []).concat(item) 49 | 50 | registerProperty: (key, value)-> 51 | @mixPayload[key] = value 52 | return this 53 | 54 | unregisterProperty: (key) -> 55 | delete @mixPayload[key] 56 | return this 57 | 58 | registerProvider: (name, Provider, $el = document.getElementById('gta-main')) -> 59 | return false if not $el 60 | 61 | account = $el.getAttribute "data-#{name}" 62 | scriptUrl = $el.getAttribute "data-#{name}-script" 63 | trackUrl = $el.getAttribute "data-#{name}-track" 64 | bootParams = $el.getAttribute "data-#{name}-boot-param" 65 | randomProportion = $el.getAttribute "data-#{name}-random-proportion" 66 | 67 | return true if randomProportion and do Math.random > randomProportion 68 | 69 | if account 70 | @providers.push new Provider account, scriptUrl, trackUrl, bootParams 71 | return true 72 | 73 | return false 74 | 75 | registerPlugin: (Plugin) -> 76 | plugin = new Plugin this 77 | @plugins.push plugin 78 | return plugin 79 | 80 | setCurrentPage: (page) -> 81 | @registerProperty('page', page) 82 | 83 | setUser: (id, user, turnOff) -> 84 | return this if turnOff 85 | 86 | try 87 | @init() 88 | for provider in @providers 89 | formattedUser = Common.formatUser provider, user 90 | if @debug or window._gta_debug 91 | console.log 'formatUser', provider.name, formattedUser 92 | provider.setUser?.call provider, id, formattedUser 93 | catch e 94 | console.error e if @debug or window._gta_debug 95 | return this 96 | 97 | pageview: -> 98 | try 99 | for provider in @providers 100 | provider.pageview?.apply provider, arguments 101 | catch e 102 | return this 103 | 104 | login: (userId) -> 105 | try 106 | for provider in @providers 107 | provider.login?.apply provider, arguments 108 | catch e 109 | return this 110 | 111 | logout: -> 112 | try 113 | for provider in @providers 114 | provider.logout?.apply provider, arguments 115 | catch e 116 | return this 117 | 118 | event: (gtaOptions) -> 119 | try 120 | if typeof gtaOptions is 'object' and !!gtaOptions 121 | gtaOptions.method or= 'click' 122 | gtaOptions = Common.extend {}, @mixPayload, gtaOptions 123 | for plugin in @plugins 124 | gtaOptions = plugin.onGTAEvent?(gtaOptions) 125 | unless gtaOptions 126 | console.info 'An event was filtered by plugin:', plugin.name if @debug or window._gta_debug 127 | return this 128 | console.log 'GTA options: ', gtaOptions if @debug or window._gta_debug 129 | for provider in @providers 130 | try 131 | provider.event? gtaOptions 132 | catch ee 133 | console.trace "error on gta provider: #{provider.name}, #{ee}" if @debug or window._gta_debug 134 | catch e 135 | console.trace "error on gta event: #{e}" if @debug or window._gta_debug 136 | return this 137 | 138 | delegateEvents: -> 139 | matches = (el, selector) -> 140 | (el.matches || el.matchesSelector || 141 | el.msMatchesSelector || el.mozMatchesSelector || 142 | el.webkitMatchesSelector || el.oMatchesSelector).call(el, selector) 143 | listener = (e) => 144 | window.setTimeout => 145 | el = e.target 146 | while el 147 | gtaString = el.dataset?.gta 148 | gtaIgnore = el.dataset?.gtaIgnore 149 | gtaOptions = Common.parseGta gtaString 150 | gtaHash = el.dataset?.gtaHash 151 | 152 | if gtaOptions and (!gtaIgnore or matches(e.target, gtaIgnore)) 153 | @event gtaOptions 154 | 155 | if gtaHash 156 | actions = @actionMap[gtaHash] or [] 157 | for action in actions 158 | @event Common.pick action, ['action', 'type', 'control'] 159 | 160 | el = el.parentElement 161 | , 0 162 | document.body.addEventListener 'click', listener, true 163 | 164 | module.exports = new GTA() 165 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Analysis Tool for Teambition 2 | 3 | ## Usage 4 | 5 | First, use Bower to install GTA: 6 | 7 | ```bash 8 | bower install gta 9 | ``` 10 | 11 | or with NPM: 12 | 13 | ```bash 14 | npm install --save teambition/gta 15 | ``` 16 | 17 | Then, include the following script in your HTML and you are ready to go: 18 | 19 | ```html 20 | 28 | ``` 29 | 30 | ### Set User ID 31 | ```js 32 | // Currently only Customer.io and Fullstory support userId 33 | gta.setUser(id, user) 34 | ``` 35 | 36 | ### Register Property 37 | ```js 38 | gta.registerProperty(key, value) 39 | gta.unregisterProperty(key) 40 | ``` 41 | All registered properties would be mixed with every events util unregister. 42 | 43 | ### Register Provider 44 | ```js 45 | gta.registerProvider(name, Provider, $el) 46 | ``` 47 | Register third party provider. `$el` points to element stores gta config, 48 | it could be omitted when config stores in ` 106 | ``` 107 | 2. `hash` is the target in your acions list. 108 | 109 | ```html 110 | actions = [ 111 | ..., 112 | { 113 | hash: hash 114 | action: 'add content', 115 | control: 'tasks layout', 116 | type: 'task', 117 | } 118 | ] 119 | 120 | 121 | ``` 122 | 123 | To automatically log gtaOptions, you can use the 'debug' mode: 124 | ```js 125 | gta.debug = true 126 | or 127 | window._gta_debug = true 128 | ``` 129 | #### Warning! old rules not supported since v0.8.0 130 | 131 | ## API Documentations 132 | 133 | * [Google Analytics](https://developers.google.com/analytics/devguides/collection/analyticsjs/) 134 | * [Baidu Analytics](http://tongji.baidu.com/open/api/more?p=ref_trackPageview) 135 | * [Mixpanel](https://mixpanel.com/help/reference/javascript) 136 | * [Customer.io](https://customer.io/docs/api/javascript.html) 137 | * [Fullstory](http://help.fullstory.com/using-ref/getting-started) 138 | * [GrowingIO](https://help.growingio.com/Developer%20Document.html) 139 | * [SensorsData](https://www.sensorsdata.cn/manual/js_sdk.html) 140 | 141 | ## Change Log 142 | 143 | ### 1.1.6 144 | 1. Support boot params for providers 145 | 146 | ### 1.1.5 147 | 1. Add `gta.login(userId)` support 148 | 2. Implement `login` method on TBPanel 149 | 150 | #### 1.1.4 151 | 1. Add `data-tbtracking` support 152 | 153 | #### 1.1.1 - 1.1.2 154 | 1. New Plugin: `distinct id` 155 | 156 | #### 1.1.0 157 | 1. New provider: SensorsData 158 | 159 | #### 1.0.12 160 | 1. Deferred provider loading 161 | 162 | #### 1.0.11 163 | 1. Disable `displayfeatures` for Google Analytics 164 | 165 | #### 1.0.9 - 1.0.10 166 | 1. Plugin `referral` and `utm` will only record at first time. 167 | 2. Plugin `referral` and `utm` now use encodeURIComponent to prevent unexpected cookie cut off. 168 | 169 | #### 1.0.8 170 | 1. Plugin is able to filter event now. 171 | 172 | #### 1.0.7 173 | 1. New plugin `referral plugin` 174 | 175 | #### 1.0.5 - 1.0.6 176 | 1. `gta.registerPlugin` now returns plugin's instance 177 | 178 | #### 1.0.4 179 | 1. TBPanel now accepts optional `scriptUrl` 180 | 181 | #### 1.0.3 182 | 1. New API: `registerProvider` 183 | 184 | #### 1.0.2 185 | 1. Now library can be exported to `window.Gta` 186 | 187 | #### 1.0.1 188 | 1. Fix GTA crash when provider Baidu crash. 189 | 190 | #### 1.0.0 191 | 1. New architecture 192 | 2. New APIs: `(un)register(Property|Plugin)` 193 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | (function webpackUniversalModuleDefinition(root, factory) { 2 | if(typeof exports === 'object' && typeof module === 'object') 3 | module.exports = factory(); 4 | else if(typeof define === 'function' && define.amd) 5 | define("Gta", [], factory); 6 | else if(typeof exports === 'object') 7 | exports["Gta"] = factory(); 8 | else 9 | root["Gta"] = factory(); 10 | })(this, function() { 11 | return /******/ (function(modules) { // webpackBootstrap 12 | /******/ // The module cache 13 | /******/ var installedModules = {}; 14 | 15 | /******/ // The require function 16 | /******/ function __webpack_require__(moduleId) { 17 | 18 | /******/ // Check if module is in cache 19 | /******/ if(installedModules[moduleId]) 20 | /******/ return installedModules[moduleId].exports; 21 | 22 | /******/ // Create a new module (and put it into the cache) 23 | /******/ var module = installedModules[moduleId] = { 24 | /******/ exports: {}, 25 | /******/ id: moduleId, 26 | /******/ loaded: false 27 | /******/ }; 28 | 29 | /******/ // Execute the module function 30 | /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 31 | 32 | /******/ // Flag the module as loaded 33 | /******/ module.loaded = true; 34 | 35 | /******/ // Return the exports of the module 36 | /******/ return module.exports; 37 | /******/ } 38 | 39 | 40 | /******/ // expose the modules object (__webpack_modules__) 41 | /******/ __webpack_require__.m = modules; 42 | 43 | /******/ // expose the module cache 44 | /******/ __webpack_require__.c = installedModules; 45 | 46 | /******/ // __webpack_public_path__ 47 | /******/ __webpack_require__.p = ""; 48 | 49 | /******/ // Load entry module and return exports 50 | /******/ return __webpack_require__(0); 51 | /******/ }) 52 | /************************************************************************/ 53 | /******/ ([ 54 | /* 0 */ 55 | /***/ function(module, exports, __webpack_require__) { 56 | 57 | var Common, GTA, Plugins, Providers, 58 | hasProp = {}.hasOwnProperty; 59 | 60 | Common = __webpack_require__(1); 61 | 62 | Plugins = __webpack_require__(2); 63 | 64 | Providers = __webpack_require__(7); 65 | 66 | GTA = (function() { 67 | GTA.prototype.debug = false; 68 | 69 | GTA.prototype.plugins = []; 70 | 71 | GTA.prototype.providers = []; 72 | 73 | GTA.prototype.mixPayload = {}; 74 | 75 | GTA.prototype.actionMap = {}; 76 | 77 | GTA.prototype.version = '1.1.6'; 78 | 79 | function GTA() { 80 | var $el; 81 | if (typeof document === 'undefined') { 82 | return; 83 | } 84 | $el = document.getElementById('gta-main'); 85 | if (!$el) { 86 | return; 87 | } 88 | this.delegateEvents(); 89 | this.preloadActions($el); 90 | } 91 | 92 | GTA.prototype.init = function() { 93 | var $el, Plugin, Provider, name; 94 | if (typeof document === 'undefined') { 95 | return; 96 | } 97 | $el = document.getElementById('gta-main'); 98 | if (!$el) { 99 | return; 100 | } 101 | for (name in Providers) { 102 | if (!hasProp.call(Providers, name)) continue; 103 | Provider = Providers[name]; 104 | this.registerProvider(name, Provider, $el); 105 | } 106 | for (name in Plugins) { 107 | if (!hasProp.call(Plugins, name)) continue; 108 | Plugin = Plugins[name]; 109 | this.registerPlugin(Plugin); 110 | } 111 | return Common.removeElement($el); 112 | }; 113 | 114 | GTA.prototype.initXhr = function(url) { 115 | var xhr; 116 | xhr = new XMLHttpRequest(); 117 | xhr.open('GET', url, true); 118 | xhr.send(); 119 | return xhr; 120 | }; 121 | 122 | GTA.prototype.preloadActions = function($el) { 123 | var url, xhr; 124 | url = $el.getAttribute('data-tbtracking'); 125 | if (!url) { 126 | return; 127 | } 128 | xhr = this.initXhr(url); 129 | return xhr.onreadystatechange = (function(_this) { 130 | return function() { 131 | var actions, i, item, len, results; 132 | if (xhr.readyState === 4 && xhr.status === 200) { 133 | actions = JSON.parse(xhr.response); 134 | results = []; 135 | for (i = 0, len = actions.length; i < len; i++) { 136 | item = actions[i]; 137 | results.push(_this.actionMap[item.hash] = (_this.actionMap[item.hash] || []).concat(item)); 138 | } 139 | return results; 140 | } 141 | }; 142 | })(this); 143 | }; 144 | 145 | GTA.prototype.registerProperty = function(key, value) { 146 | this.mixPayload[key] = value; 147 | return this; 148 | }; 149 | 150 | GTA.prototype.unregisterProperty = function(key) { 151 | delete this.mixPayload[key]; 152 | return this; 153 | }; 154 | 155 | GTA.prototype.registerProvider = function(name, Provider, $el) { 156 | var account, bootParams, randomProportion, scriptUrl, trackUrl; 157 | if ($el == null) { 158 | $el = document.getElementById('gta-main'); 159 | } 160 | if (!$el) { 161 | return false; 162 | } 163 | account = $el.getAttribute("data-" + name); 164 | scriptUrl = $el.getAttribute("data-" + name + "-script"); 165 | trackUrl = $el.getAttribute("data-" + name + "-track"); 166 | bootParams = $el.getAttribute("data-" + name + "-boot-param"); 167 | randomProportion = $el.getAttribute("data-" + name + "-random-proportion"); 168 | if (randomProportion && Math.random() > randomProportion) { 169 | return true; 170 | } 171 | if (account) { 172 | this.providers.push(new Provider(account, scriptUrl, trackUrl, bootParams)); 173 | return true; 174 | } 175 | return false; 176 | }; 177 | 178 | GTA.prototype.registerPlugin = function(Plugin) { 179 | var plugin; 180 | plugin = new Plugin(this); 181 | this.plugins.push(plugin); 182 | return plugin; 183 | }; 184 | 185 | GTA.prototype.setCurrentPage = function(page) { 186 | return this.registerProperty('page', page); 187 | }; 188 | 189 | GTA.prototype.setUser = function(id, user, turnOff) { 190 | var e, formattedUser, i, len, provider, ref, ref1; 191 | if (turnOff) { 192 | return this; 193 | } 194 | try { 195 | this.init(); 196 | ref = this.providers; 197 | for (i = 0, len = ref.length; i < len; i++) { 198 | provider = ref[i]; 199 | formattedUser = Common.formatUser(provider, user); 200 | if (this.debug || window._gta_debug) { 201 | console.log('formatUser', provider.name, formattedUser); 202 | } 203 | if ((ref1 = provider.setUser) != null) { 204 | ref1.call(provider, id, formattedUser); 205 | } 206 | } 207 | } catch (error) { 208 | e = error; 209 | if (this.debug || window._gta_debug) { 210 | console.error(e); 211 | } 212 | } 213 | return this; 214 | }; 215 | 216 | GTA.prototype.pageview = function() { 217 | var e, i, len, provider, ref, ref1; 218 | try { 219 | ref = this.providers; 220 | for (i = 0, len = ref.length; i < len; i++) { 221 | provider = ref[i]; 222 | if ((ref1 = provider.pageview) != null) { 223 | ref1.apply(provider, arguments); 224 | } 225 | } 226 | } catch (error) { 227 | e = error; 228 | } 229 | return this; 230 | }; 231 | 232 | GTA.prototype.login = function(userId) { 233 | var e, i, len, provider, ref, ref1; 234 | try { 235 | ref = this.providers; 236 | for (i = 0, len = ref.length; i < len; i++) { 237 | provider = ref[i]; 238 | if ((ref1 = provider.login) != null) { 239 | ref1.apply(provider, arguments); 240 | } 241 | } 242 | } catch (error) { 243 | e = error; 244 | } 245 | return this; 246 | }; 247 | 248 | GTA.prototype.logout = function() { 249 | var e, i, len, provider, ref, ref1; 250 | try { 251 | ref = this.providers; 252 | for (i = 0, len = ref.length; i < len; i++) { 253 | provider = ref[i]; 254 | if ((ref1 = provider.logout) != null) { 255 | ref1.apply(provider, arguments); 256 | } 257 | } 258 | } catch (error) { 259 | e = error; 260 | } 261 | return this; 262 | }; 263 | 264 | GTA.prototype.event = function(gtaOptions) { 265 | var e, ee, i, j, len, len1, plugin, provider, ref, ref1; 266 | try { 267 | if (typeof gtaOptions === 'object' && !!gtaOptions) { 268 | gtaOptions.method || (gtaOptions.method = 'click'); 269 | gtaOptions = Common.extend({}, this.mixPayload, gtaOptions); 270 | ref = this.plugins; 271 | for (i = 0, len = ref.length; i < len; i++) { 272 | plugin = ref[i]; 273 | gtaOptions = typeof plugin.onGTAEvent === "function" ? plugin.onGTAEvent(gtaOptions) : void 0; 274 | if (!gtaOptions) { 275 | if (this.debug || window._gta_debug) { 276 | console.info('An event was filtered by plugin:', plugin.name); 277 | } 278 | return this; 279 | } 280 | } 281 | if (this.debug || window._gta_debug) { 282 | console.log('GTA options: ', gtaOptions); 283 | } 284 | ref1 = this.providers; 285 | for (j = 0, len1 = ref1.length; j < len1; j++) { 286 | provider = ref1[j]; 287 | try { 288 | if (typeof provider.event === "function") { 289 | provider.event(gtaOptions); 290 | } 291 | } catch (error) { 292 | ee = error; 293 | if (this.debug || window._gta_debug) { 294 | console.trace("error on gta provider: " + provider.name + ", " + ee); 295 | } 296 | } 297 | } 298 | } 299 | } catch (error) { 300 | e = error; 301 | if (this.debug || window._gta_debug) { 302 | console.trace("error on gta event: " + e); 303 | } 304 | } 305 | return this; 306 | }; 307 | 308 | GTA.prototype.delegateEvents = function() { 309 | var listener, matches; 310 | matches = function(el, selector) { 311 | return (el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector).call(el, selector); 312 | }; 313 | listener = (function(_this) { 314 | return function(e) { 315 | return window.setTimeout(function() { 316 | var action, actions, el, gtaHash, gtaIgnore, gtaOptions, gtaString, i, len, ref, ref1, ref2, results; 317 | el = e.target; 318 | results = []; 319 | while (el) { 320 | gtaString = (ref = el.dataset) != null ? ref.gta : void 0; 321 | gtaIgnore = (ref1 = el.dataset) != null ? ref1.gtaIgnore : void 0; 322 | gtaOptions = Common.parseGta(gtaString); 323 | gtaHash = (ref2 = el.dataset) != null ? ref2.gtaHash : void 0; 324 | if (gtaOptions && (!gtaIgnore || matches(e.target, gtaIgnore))) { 325 | _this.event(gtaOptions); 326 | } 327 | if (gtaHash) { 328 | actions = _this.actionMap[gtaHash] || []; 329 | for (i = 0, len = actions.length; i < len; i++) { 330 | action = actions[i]; 331 | _this.event(Common.pick(action, ['action', 'type', 'control'])); 332 | } 333 | } 334 | results.push(el = el.parentElement); 335 | } 336 | return results; 337 | }, 0); 338 | }; 339 | })(this); 340 | return document.body.addEventListener('click', listener, true); 341 | }; 342 | 343 | return GTA; 344 | 345 | })(); 346 | 347 | module.exports = new GTA(); 348 | 349 | 350 | /***/ }, 351 | /* 1 */ 352 | /***/ function(module, exports) { 353 | 354 | var Common, GTA_CHECK_REGEX, GTA_PARSE_REGEX, 355 | slice = [].slice, 356 | indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; 357 | 358 | module.exports = Common = {}; 359 | 360 | GTA_CHECK_REGEX = /^\s*\{(.*)\}\s*$/; 361 | 362 | GTA_PARSE_REGEX = /[\s"']*([^:,"']+)[\s"']*:[\s"']*([^:,"']+)[\s"']*,?/g; 363 | 364 | Common.extend = function() { 365 | var arg, dest, i, key, len, source, value; 366 | dest = arguments[0], source = 2 <= arguments.length ? slice.call(arguments, 1) : []; 367 | for (i = 0, len = source.length; i < len; i++) { 368 | arg = source[i]; 369 | for (key in arg) { 370 | value = arg[key]; 371 | dest[key] = value; 372 | } 373 | } 374 | return dest; 375 | }; 376 | 377 | Common.removeElement = function(el) { 378 | return el.parentNode.removeChild(el); 379 | }; 380 | 381 | Common.parseGta = function(gtaString) { 382 | var _, gtaOptions, it, key, ref, value; 383 | if (!gtaString) { 384 | return; 385 | } 386 | gtaString = (ref = GTA_CHECK_REGEX.exec(gtaString)) != null ? ref[1] : void 0; 387 | if (!(gtaString && gtaString.length)) { 388 | return; 389 | } 390 | gtaOptions = {}; 391 | while (it = GTA_PARSE_REGEX.exec(gtaString)) { 392 | _ = it[0], key = it[1], value = it[2]; 393 | gtaOptions[key] = value; 394 | } 395 | return gtaOptions; 396 | }; 397 | 398 | Common.formatUser = function(provider, user) { 399 | var key, ref, ref1, result, value; 400 | result = {}; 401 | for (key in user) { 402 | value = user[key]; 403 | if (!value) { 404 | continue; 405 | } 406 | if ((value.wlist != null) && (ref = provider.name, indexOf.call(value.wlist, ref) < 0)) { 407 | continue; 408 | } 409 | if ((ref1 = value.alias) != null ? ref1[provider.name] : void 0) { 410 | result[value.alias[provider.name]] = value.value; 411 | } else { 412 | if (Object.prototype.toString.call(value) === '[object Object]' && 'value' in value) { 413 | result[key] = value.value; 414 | } else { 415 | result[key] = value; 416 | } 417 | } 418 | } 419 | return result; 420 | }; 421 | 422 | Common.pick = function(obj, keys) { 423 | var i, key, len, result; 424 | if (!obj) { 425 | return; 426 | } 427 | result = {}; 428 | for (i = 0, len = keys.length; i < len; i++) { 429 | key = keys[i]; 430 | if (obj[key]) { 431 | result[key] = obj[key]; 432 | } 433 | } 434 | return result; 435 | }; 436 | 437 | 438 | /***/ }, 439 | /* 2 */ 440 | /***/ function(module, exports, __webpack_require__) { 441 | 442 | var DistinctID, Referral, UTM; 443 | 444 | UTM = __webpack_require__(3); 445 | 446 | Referral = __webpack_require__(5); 447 | 448 | DistinctID = __webpack_require__(6); 449 | 450 | module.exports = { 451 | utm: UTM, 452 | referral: Referral, 453 | distinctid: DistinctID 454 | }; 455 | 456 | 457 | /***/ }, 458 | /* 3 */ 459 | /***/ function(module, exports, __webpack_require__) { 460 | 461 | var BasePlugin, COOKIE_TEST_REGEX, UTMDaemon, UTM_TAG_REGEX, 462 | extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, 463 | hasProp = {}.hasOwnProperty; 464 | 465 | BasePlugin = __webpack_require__(4); 466 | 467 | UTM_TAG_REGEX = /utm_(\w+)=([^&]*)&?/ig; 468 | 469 | COOKIE_TEST_REGEX = /(^|;\s?)utm=(\S+)(?:;|$)/i; 470 | 471 | module.exports = UTMDaemon = (function(superClass) { 472 | extend(UTMDaemon, superClass); 473 | 474 | UTMDaemon.prototype.name = 'utm daemon'; 475 | 476 | function UTMDaemon(gta) { 477 | var domain, e, encodedUTM, key, match, monthLater, part, utm, value; 478 | try { 479 | if (COOKIE_TEST_REGEX.test(document.cookie)) { 480 | return; 481 | } 482 | utm = {}; 483 | while (match = UTM_TAG_REGEX.exec(window.location.search)) { 484 | part = match[0], key = match[1], value = match[2]; 485 | utm[key] = value; 486 | } 487 | encodedUTM = encodeURIComponent(JSON.stringify(utm)); 488 | domain = "." + (/\.?([\w\-]+\.\w+)$/.exec(window.location.hostname)[1]); 489 | monthLater = new Date(Date.now() + 2592000000).toGMTString(); 490 | if (part) { 491 | document.cookie = "utm=" + encodedUTM + ";expires=" + monthLater + ";domain=" + domain + ";path=/"; 492 | } 493 | } catch (error) { 494 | e = error; 495 | if (gta.debug || window._gta_debug) { 496 | console.error(e); 497 | } 498 | } 499 | } 500 | 501 | return UTMDaemon; 502 | 503 | })(BasePlugin); 504 | 505 | 506 | /***/ }, 507 | /* 4 */ 508 | /***/ function(module, exports) { 509 | 510 | var BasePlugin; 511 | 512 | module.exports = BasePlugin = (function() { 513 | BasePlugin.prototype.name = 'base'; 514 | 515 | function BasePlugin(gta) {} 516 | 517 | BasePlugin.prototype.onGTAEvent = function(gtaOptions) { 518 | return gtaOptions; 519 | }; 520 | 521 | return BasePlugin; 522 | 523 | })(); 524 | 525 | 526 | /***/ }, 527 | /* 5 */ 528 | /***/ function(module, exports, __webpack_require__) { 529 | 530 | var BasePlugin, COOKIE_TEST_REGEX, ReferralDaemon, 531 | extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, 532 | hasProp = {}.hasOwnProperty; 533 | 534 | BasePlugin = __webpack_require__(4); 535 | 536 | COOKIE_TEST_REGEX = /(^|;\s?)referral=(\S+)(?:;|$)/i; 537 | 538 | module.exports = ReferralDaemon = (function(superClass) { 539 | extend(ReferralDaemon, superClass); 540 | 541 | ReferralDaemon.prototype.name = 'referral daemon'; 542 | 543 | function ReferralDaemon(gta) { 544 | var $parser, domain, e, encodedReferral, monthLater, referral; 545 | try { 546 | if (document.referrer && !COOKIE_TEST_REGEX.test(document.cookie)) { 547 | $parser = document.createElement('a'); 548 | $parser.href = document.referrer; 549 | referral = { 550 | domain: $parser.hostname.slice(0, 100), 551 | path: $parser.pathname.slice(0, 100), 552 | query: $parser.search.slice(0, 100), 553 | hash: $parser.hash.slice(0, 100) 554 | }; 555 | encodedReferral = encodeURIComponent(JSON.stringify(referral)); 556 | domain = "." + (/\.?([\w\-]+\.\w+)$/.exec(window.location.hostname)[1]); 557 | monthLater = new Date(Date.now() + 2592000000).toGMTString(); 558 | document.cookie = "referral=" + encodedReferral + ";expires=" + monthLater + ";domain=" + domain + ";path=/"; 559 | } 560 | } catch (error) { 561 | e = error; 562 | if (gta.debug || window._gta_debug) { 563 | console.error(e); 564 | } 565 | } 566 | } 567 | 568 | return ReferralDaemon; 569 | 570 | })(BasePlugin); 571 | 572 | 573 | /***/ }, 574 | /* 6 */ 575 | /***/ function(module, exports, __webpack_require__) { 576 | 577 | var BasePlugin, DistinctID, 578 | extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, 579 | hasProp = {}.hasOwnProperty; 580 | 581 | BasePlugin = __webpack_require__(4); 582 | 583 | module.exports = DistinctID = (function(superClass) { 584 | extend(DistinctID, superClass); 585 | 586 | DistinctID.prototype.name = 'distinct id synchronizer'; 587 | 588 | function DistinctID(gta) { 589 | var e; 590 | try { 591 | if (window.tbpanel && window.sa) { 592 | sa.quick('isReady', function() { 593 | return tbpanel.identify(sa.store.getDistinctId()); 594 | }); 595 | } 596 | } catch (error) { 597 | e = error; 598 | if (gta.debug || window._gta_debug) { 599 | console.error(e); 600 | } 601 | } 602 | } 603 | 604 | return DistinctID; 605 | 606 | })(BasePlugin); 607 | 608 | 609 | /***/ }, 610 | /* 7 */ 611 | /***/ function(module, exports, __webpack_require__) { 612 | 613 | var Baidu, Customer, Fullstory, Google, GrowingIO, Sensors, TBPanel; 614 | 615 | Google = __webpack_require__(8); 616 | 617 | Baidu = __webpack_require__(10); 618 | 619 | Customer = __webpack_require__(11); 620 | 621 | Fullstory = __webpack_require__(12); 622 | 623 | GrowingIO = __webpack_require__(13); 624 | 625 | TBPanel = __webpack_require__(14); 626 | 627 | Sensors = __webpack_require__(15); 628 | 629 | module.exports = { 630 | google: Google, 631 | baidu: Baidu, 632 | tbpanel: TBPanel, 633 | customer: Customer, 634 | fullstory: Fullstory, 635 | growingio: GrowingIO, 636 | sensors: Sensors 637 | }; 638 | 639 | 640 | /***/ }, 641 | /* 8 */ 642 | /***/ function(module, exports, __webpack_require__) { 643 | 644 | var BaseProvider, Google, 645 | extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, 646 | hasProp = {}.hasOwnProperty; 647 | 648 | BaseProvider = __webpack_require__(9); 649 | 650 | module.exports = Google = (function(superClass) { 651 | extend(Google, superClass); 652 | 653 | Google.prototype.name = 'google'; 654 | 655 | function Google(account) { 656 | var script; 657 | if (!account) { 658 | return; 659 | } 660 | window.GoogleAnalyticsObject = 'ga'; 661 | window.ga = function() { 662 | return window.ga.q.push(arguments); 663 | }; 664 | window.ga.q = []; 665 | window.ga.l = 1 * new Date(); 666 | script = BaseProvider.createScript('//www.google-analytics.com/analytics.js'); 667 | BaseProvider.loadScript(script, 'ga'); 668 | window.ga('create', account, 'auto'); 669 | window.ga('require', 'linkid', 'linkid.js'); 670 | window.ga('send', 'pageview'); 671 | } 672 | 673 | Google.prototype.pageview = function() { 674 | var args, data; 675 | if (!window.ga) { 676 | return; 677 | } 678 | args = Array.prototype.slice.call(arguments); 679 | data = typeof args[0] === 'object' ? args[0] : args.join('_'); 680 | return window.ga('send', 'pageview', data); 681 | }; 682 | 683 | Google.prototype.event = function(gtaOptions) { 684 | var action, category, label; 685 | if (!window.ga) { 686 | return; 687 | } 688 | category = gtaOptions.page; 689 | action = gtaOptions.action; 690 | label = gtaOptions.type; 691 | return window.ga('send', 'event', category, action, label); 692 | }; 693 | 694 | return Google; 695 | 696 | })(BaseProvider); 697 | 698 | 699 | /***/ }, 700 | /* 9 */ 701 | /***/ function(module, exports, __webpack_require__) { 702 | 703 | var BaseProvider, Common; 704 | 705 | Common = __webpack_require__(1); 706 | 707 | module.exports = BaseProvider = (function() { 708 | function BaseProvider() {} 709 | 710 | BaseProvider.prototype.name = 'base'; 711 | 712 | BaseProvider.prototype.event = function() {}; 713 | 714 | BaseProvider.prototype.setUser = function() {}; 715 | 716 | BaseProvider.prototype.pageview = function() {}; 717 | 718 | return BaseProvider; 719 | 720 | })(); 721 | 722 | BaseProvider.createScript = function(src, id) { 723 | var script; 724 | script = document.createElement('script'); 725 | script.async = 1; 726 | script.src = src; 727 | if (id) { 728 | script.id = id; 729 | } 730 | return script; 731 | }; 732 | 733 | BaseProvider.loadScript = function(script, key, removeAfterLoad) { 734 | var firstScript; 735 | if (removeAfterLoad == null) { 736 | removeAfterLoad = true; 737 | } 738 | script.onerror = function() { 739 | window[key] = null; 740 | return Common.removeElement(script); 741 | }; 742 | script.onload = function() { 743 | if (removeAfterLoad) { 744 | return Common.removeElement(script); 745 | } 746 | }; 747 | firstScript = document.getElementsByTagName('script')[0]; 748 | return firstScript.parentNode.insertBefore(script, firstScript); 749 | }; 750 | 751 | 752 | /***/ }, 753 | /* 10 */ 754 | /***/ function(module, exports, __webpack_require__) { 755 | 756 | var Baidu, BaseProvider, Common, 757 | extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, 758 | hasProp = {}.hasOwnProperty; 759 | 760 | BaseProvider = __webpack_require__(9); 761 | 762 | Common = __webpack_require__(1); 763 | 764 | module.exports = Baidu = (function(superClass) { 765 | extend(Baidu, superClass); 766 | 767 | Baidu.prototype.name = 'baidu'; 768 | 769 | function Baidu(account) { 770 | var script; 771 | if (!account) { 772 | return; 773 | } 774 | window._hmt = window._hmt || []; 775 | script = BaseProvider.createScript("//hm.baidu.com/hm.js?" + account); 776 | BaseProvider.loadScript(script, '_hmt'); 777 | } 778 | 779 | Baidu.prototype.pageview = function() { 780 | var args, data, key, val; 781 | if (!window._hmt) { 782 | return; 783 | } 784 | args = Array.prototype.slice.call(arguments); 785 | if (typeof args[0] === 'object') { 786 | data = args[0].page; 787 | if (!data) { 788 | data = ((function() { 789 | var ref, results; 790 | ref = args[0]; 791 | results = []; 792 | for (key in ref) { 793 | val = ref[key]; 794 | results.push(val); 795 | } 796 | return results; 797 | })()).join('_'); 798 | } 799 | } else { 800 | data = args.join('_'); 801 | } 802 | return window._hmt.push(['_trackPageview', data]); 803 | }; 804 | 805 | Baidu.prototype.event = function(gtaOptions) { 806 | var action, category, label; 807 | if (!window._hmt) { 808 | return; 809 | } 810 | category = gtaOptions.page || ''; 811 | action = gtaOptions.action || ''; 812 | label = gtaOptions.type || ''; 813 | return window._hmt.push(['_trackEvent', category, action, label]); 814 | }; 815 | 816 | return Baidu; 817 | 818 | })(BaseProvider); 819 | 820 | 821 | /***/ }, 822 | /* 11 */ 823 | /***/ function(module, exports, __webpack_require__) { 824 | 825 | var BaseProvider, Common, CustomerIO, 826 | extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, 827 | hasProp = {}.hasOwnProperty; 828 | 829 | BaseProvider = __webpack_require__(9); 830 | 831 | Common = __webpack_require__(1); 832 | 833 | module.exports = CustomerIO = (function(superClass) { 834 | extend(CustomerIO, superClass); 835 | 836 | CustomerIO.prototype.name = 'customer.io'; 837 | 838 | function CustomerIO(account) { 839 | this.account = account; 840 | } 841 | 842 | CustomerIO.prototype.initCustomer = function(id) { 843 | var _account, _cio, accounts, i, len, method, ref, script; 844 | _cio = window._cio = window._cio || []; 845 | _cio.invoked = true; 846 | _cio.methods = ['trackSubmit', 'trackClick', 'trackLink', 'trackForm', 'pageview', 'reset', 'group', 'ready', 'alias', 'page', 'once', 'off', 'on', 'load', 'identify', 'sidentify', 'track']; 847 | _cio.factory = function(method) { 848 | return function() { 849 | _cio.push([method].concat(Array.prototype.slice.call(arguments))); 850 | return _cio; 851 | }; 852 | }; 853 | ref = _cio.methods; 854 | for (i = 0, len = ref.length; i < len; i++) { 855 | method = ref[i]; 856 | _cio[method] = _cio.factory(method); 857 | } 858 | accounts = this.account.split(','); 859 | _account = (id != null ? id.indexOf('@') : void 0) > 0 ? accounts[1] : accounts[0]; 860 | script = BaseProvider.createScript('//assets.customer.io/assets/track.js', 'cio-tracker'); 861 | script.setAttribute('data-site-id', _account); 862 | return BaseProvider.loadScript(script, '_cio', false); 863 | }; 864 | 865 | CustomerIO.prototype.setUser = function(id, raw_user) { 866 | var ref, user; 867 | if (!this.account) { 868 | return; 869 | } 870 | user = Common.extend({}, raw_user); 871 | user.id = id; 872 | if (new Date(user.created_at) >= new Date('2016-01-01')) { 873 | user.id = user.email; 874 | } 875 | user.created_at = Math.floor(new Date(user.created_at).valueOf() / 1000); 876 | this.initCustomer(user.id); 877 | return (ref = window._cio) != null ? ref.identify(user) : void 0; 878 | }; 879 | 880 | CustomerIO.prototype.pageview = function(data) {}; 881 | 882 | CustomerIO.prototype.event = function(gtaOptions) { 883 | var ref; 884 | if (!this.account) { 885 | return; 886 | } 887 | return (ref = window._cio) != null ? ref.track(gtaOptions.action, gtaOptions) : void 0; 888 | }; 889 | 890 | return CustomerIO; 891 | 892 | })(BaseProvider); 893 | 894 | 895 | /***/ }, 896 | /* 12 */ 897 | /***/ function(module, exports, __webpack_require__) { 898 | 899 | var BaseProvider, Common, Fullstory, 900 | extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, 901 | hasProp = {}.hasOwnProperty; 902 | 903 | BaseProvider = __webpack_require__(9); 904 | 905 | Common = __webpack_require__(1); 906 | 907 | module.exports = Fullstory = (function(superClass) { 908 | extend(Fullstory, superClass); 909 | 910 | Fullstory.prototype.name = 'fullstory'; 911 | 912 | function Fullstory(account) { 913 | var _fs_debug, _fs_host, _fs_org, _fullstory, script; 914 | if (!account) { 915 | return; 916 | } 917 | _fullstory = window.FS = function(id, user) { 918 | if (_fullstory.q) { 919 | return _fullstory.q.push(arguments); 920 | } else { 921 | return _fullstory._api(id, user); 922 | } 923 | }; 924 | _fullstory.q = []; 925 | _fs_debug = window._fs_debug = window._fs_debug || false; 926 | _fs_host = window._fs_host = window._fs_host || 'www.fullstory.com'; 927 | _fs_org = window._fs_org = account; 928 | script = BaseProvider.createScript("https://" + _fs_host + "/s/fs.js"); 929 | BaseProvider.loadScript(script); 930 | _fullstory.identify = function(id, user) { 931 | _fullstory('user', { 932 | uid: id 933 | }); 934 | if (user) { 935 | return _fullstory('user', user); 936 | } 937 | }; 938 | _fullstory.setUserVars = function(user) { 939 | return _fullstory('user', user); 940 | }; 941 | _fullstory.identifyAccount = function(id, user) { 942 | if (user == null) { 943 | user = {}; 944 | } 945 | user.acctId = id; 946 | return _fullstory('account', user); 947 | }; 948 | _fullstory.clearUserCookie = function(identified_only) { 949 | var domain, index, results; 950 | if (!identified_only || document.cookie.match('fs_uid=[`;`]*`[`;`]*`[`;`]*`')) { 951 | domain = document.domain; 952 | results = []; 953 | while (true) { 954 | document.cookie = 'fs_uid=;domain=' + domain + ';path=/;expires=' + new Date(0); 955 | index = domain.indexOf('.'); 956 | if (index < 0) { 957 | break; 958 | } 959 | results.push(domain = domain.slice(index + 1)); 960 | } 961 | return results; 962 | } 963 | }; 964 | } 965 | 966 | Fullstory.prototype.setUser = function(id, raw_user) { 967 | var k, user, v; 968 | user = Common.extend({}, raw_user); 969 | for (k in user) { 970 | v = user[k]; 971 | if (!/(^(displayName|email)$)|(.*_(str|int|real|date|bool)$)/.test(k)) { 972 | delete user[k]; 973 | } 974 | } 975 | user.displayName = id; 976 | user.email = id + "@mail.teambition.com"; 977 | return window.FS.identify(id, user); 978 | }; 979 | 980 | return Fullstory; 981 | 982 | })(BaseProvider); 983 | 984 | 985 | /***/ }, 986 | /* 13 */ 987 | /***/ function(module, exports, __webpack_require__) { 988 | 989 | var BaseProvider, GrowingIO, 990 | extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, 991 | hasProp = {}.hasOwnProperty; 992 | 993 | BaseProvider = __webpack_require__(9); 994 | 995 | module.exports = GrowingIO = (function(superClass) { 996 | extend(GrowingIO, superClass); 997 | 998 | GrowingIO.prototype.name = 'growingio'; 999 | 1000 | function GrowingIO(account) { 1001 | var _vds, script; 1002 | if (!account) { 1003 | return; 1004 | } 1005 | _vds = _vds || []; 1006 | window._vds = _vds; 1007 | _vds.push(['setAccountId', account]); 1008 | script = BaseProvider.createScript(('https:' === document.location.protocol ? 'https://' : 'http://') + 'dn-growing.qbox.me/vds.js'); 1009 | BaseProvider.loadScript(script); 1010 | } 1011 | 1012 | return GrowingIO; 1013 | 1014 | })(BaseProvider); 1015 | 1016 | 1017 | /***/ }, 1018 | /* 14 */ 1019 | /***/ function(module, exports, __webpack_require__) { 1020 | 1021 | var BaseProvider, Common, TBPanel, 1022 | bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, 1023 | extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, 1024 | hasProp = {}.hasOwnProperty; 1025 | 1026 | BaseProvider = __webpack_require__(9); 1027 | 1028 | Common = __webpack_require__(1); 1029 | 1030 | module.exports = TBPanel = (function(superClass) { 1031 | extend(TBPanel, superClass); 1032 | 1033 | TBPanel.prototype.name = 'tbpanel'; 1034 | 1035 | TBPanel.prototype.loaded = false; 1036 | 1037 | TBPanel.prototype.loadHandlers = []; 1038 | 1039 | function TBPanel(account, scriptUrl, track, bootParams) { 1040 | this.handleTBPanelLoaded = bind(this.handleTBPanelLoaded, this); 1041 | var e, lib_name, options, script, tbpanel; 1042 | if (!account) { 1043 | return; 1044 | } 1045 | scriptUrl || (scriptUrl = '//g.alicdn.com/teambition-fe/static-files/tbpanel/generic.36b6.js'); 1046 | lib_name = 'tbpanel'; 1047 | if (track) { 1048 | window.TBPANEL_TRACK_URL = track; 1049 | } 1050 | tbpanel = window.tbpanel = []; 1051 | tbpanel._i = []; 1052 | tbpanel.init = function(token, config, name) { 1053 | var _set_and_defer, fn, functions, i, len, target; 1054 | target = tbpanel; 1055 | if (name != null) { 1056 | target = tbpanel[name] = []; 1057 | } else { 1058 | name = lib_name; 1059 | } 1060 | target.people || (target.people = []); 1061 | target.toString = function(no_stub) { 1062 | var str; 1063 | str = lib_name; 1064 | if (name !== lib_name) { 1065 | str += '.' + name; 1066 | } 1067 | if (!no_stub) { 1068 | str += ' (stub)'; 1069 | } 1070 | return str; 1071 | }; 1072 | target.people.toString = function() { 1073 | return target.toString(1) + '.people (stub)'; 1074 | }; 1075 | _set_and_defer = function(target, fn) { 1076 | var split; 1077 | split = fn.split('.'); 1078 | if (split.length === 2) { 1079 | target = target[split[0]]; 1080 | fn = split[1]; 1081 | } 1082 | return target[fn] = function() { 1083 | return target.push([fn].concat(Array.prototype.slice.call(arguments))); 1084 | }; 1085 | }; 1086 | functions = ['disable', 'track', 'track_pageview', 'track_links', 'track_forms', 'register', 'register_once', 'alias', 'unregister', 'identify', 'name_tag', 'set_config', 'people.set', 'people.set_once', 'people.increment', 'people.append', 'people.track_charge', 'people.clear_charges', 'people.delete_user']; 1087 | for (i = 0, len = functions.length; i < len; i++) { 1088 | fn = functions[i]; 1089 | _set_and_defer(target, fn); 1090 | } 1091 | return tbpanel._i.push([token, config, name]); 1092 | }; 1093 | tbpanel.__SV = 1.2; 1094 | options = { 1095 | loaded: this.handleTBPanelLoaded 1096 | }; 1097 | try { 1098 | bootParams = JSON.parse(bootParams); 1099 | options = Common.extend(options, bootParams); 1100 | } catch (error) { 1101 | e = error; 1102 | console.error(e); 1103 | } 1104 | tbpanel.init(account, options); 1105 | script = BaseProvider.createScript(scriptUrl); 1106 | BaseProvider.loadScript(script, lib_name); 1107 | } 1108 | 1109 | TBPanel.prototype.handleTBPanelLoaded = function() { 1110 | var handler; 1111 | this.loaded = true; 1112 | while (handler = this.loadHandlers.shift()) { 1113 | handler(); 1114 | } 1115 | }; 1116 | 1117 | TBPanel.prototype.onLoad = function(handler) { 1118 | if (this.loaded) { 1119 | handler(); 1120 | } else { 1121 | this.loadHandlers.push(handler); 1122 | } 1123 | }; 1124 | 1125 | TBPanel.prototype.setUser = function(id, raw_user) { 1126 | var all, client, dc, os, user, version; 1127 | user = Common.extend({}, raw_user); 1128 | if (id) { 1129 | user.userKey = id; 1130 | } 1131 | window.tbpanel.register(user); 1132 | dc = navigator.userAgent.match(/(Teambition(?:-UWP)?)\/([\d\.]+)/i); 1133 | if (dc) { 1134 | all = dc[0], client = dc[1], version = dc[2]; 1135 | if (client === 'Teambition') { 1136 | client = 'Teambition_Desktop'; 1137 | } 1138 | window.tbpanel.register({ 1139 | $browser: client, 1140 | $browser_version: version 1141 | }); 1142 | } 1143 | os = navigator.userAgent.match(/Windows NT [\d.]+|(?:Macintosh;|Linux|\b\w*BSD)[^;)]*?(?=\)|;)/i); 1144 | if (os) { 1145 | return window.tbpanel.register({ 1146 | $os_version: os[0] 1147 | }); 1148 | } 1149 | }; 1150 | 1151 | TBPanel.prototype.event = function(gtaOptions) { 1152 | var data, ref; 1153 | data = Common.extend({}, gtaOptions); 1154 | if (data.platform == null) { 1155 | data.platform = 'web'; 1156 | } 1157 | return (ref = window.tbpanel) != null ? ref.track(data.action, data) : void 0; 1158 | }; 1159 | 1160 | TBPanel.prototype.login = function(userId) { 1161 | return this.onLoad(function() { 1162 | var distinctid, host, ref, ref1, req; 1163 | host = (ref = window.tbpanel) != null ? ref.get_config('api_host') : void 0; 1164 | distinctid = (ref1 = window.tbpanel) != null ? ref1.get_distinct_id() : void 0; 1165 | req = new XMLHttpRequest(); 1166 | req.open('GET', host + "/login?userkey=" + userId + "&distinct_id=" + distinctid); 1167 | return req.send(); 1168 | }); 1169 | }; 1170 | 1171 | return TBPanel; 1172 | 1173 | })(BaseProvider); 1174 | 1175 | 1176 | /***/ }, 1177 | /* 15 */ 1178 | /***/ function(module, exports, __webpack_require__) { 1179 | 1180 | var BaseProvider, Common, SensorsData, 1181 | extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, 1182 | hasProp = {}.hasOwnProperty; 1183 | 1184 | BaseProvider = __webpack_require__(9); 1185 | 1186 | Common = __webpack_require__(1); 1187 | 1188 | module.exports = SensorsData = (function(superClass) { 1189 | extend(SensorsData, superClass); 1190 | 1191 | SensorsData.prototype.name = 'sensorsdata'; 1192 | 1193 | function SensorsData(account, script, track) { 1194 | var func, funcs, i, len, para, ref, ref1; 1195 | if (!account) { 1196 | return; 1197 | } 1198 | para = { 1199 | name: 'sa', 1200 | web_url: track, 1201 | server_url: account, 1202 | sdk_url: '//dn-st.teambition.net/sensorsdata/sensorsdata.latest.min.js', 1203 | heatmap_url: '//dn-st.teambition.net/sensorsdata/heatmap.latest.min.js' 1204 | }; 1205 | Common.extend(para, JSON.parse(script || '{}')); 1206 | window.sensorsDataAnalytic201505 = 'sa'; 1207 | window.sa = window.sa || function(a) { 1208 | return function() { 1209 | window.sa._q = window.sa._q || []; 1210 | return window.sa._q.push([a, arguments]); 1211 | }; 1212 | }; 1213 | funcs = ['track', 'quick', 'register', 'registerPage', 'registerOnce', 'clearAllRegister', 'trackSignup', 'trackAbtest', 'setProfile', 'setOnceProfile', 'appendProfile', 'incrementProfile', 'deleteProfile', 'unsetProfile', 'identify', 'login', 'logout', 'trackLink', 'clearAllRegister']; 1214 | for (i = 0, len = funcs.length; i < len; i++) { 1215 | func = funcs[i]; 1216 | window.sa[func] = window.sa.call(null, func); 1217 | } 1218 | if (!window.sa._t) { 1219 | script = BaseProvider.createScript(para.sdk_url); 1220 | BaseProvider.loadScript(script, 'sa', false); 1221 | if ((ref = window.sa) != null) { 1222 | ref.para = para; 1223 | } 1224 | } 1225 | if ((ref1 = window.sa) != null) { 1226 | ref1.quick('autoTrack'); 1227 | } 1228 | } 1229 | 1230 | SensorsData.prototype.setUser = function(id, raw_user) { 1231 | var ref, ref1; 1232 | if (/[a-fA-F0-9]{24}/.test(id)) { 1233 | if ((ref = window.sa) != null) { 1234 | ref.login(id); 1235 | } 1236 | return (ref1 = window.sa) != null ? ref1.setProfile(raw_user) : void 0; 1237 | } 1238 | }; 1239 | 1240 | SensorsData.prototype.event = function(gtaOptions) { 1241 | var data, key, normalizedAction, normalizedData, ref, value; 1242 | data = Common.extend({}, gtaOptions); 1243 | if (data.platform == null) { 1244 | data.platform = 'web'; 1245 | } 1246 | normalizedData = {}; 1247 | for (key in data) { 1248 | value = data[key]; 1249 | normalizedData[key.toLowerCase()] = value; 1250 | } 1251 | normalizedAction = data.action.replace(/ /g, '_').replace(/[^A-Za-z0-9_\$]/g, '').toLowerCase(); 1252 | return (ref = window.sa) != null ? ref.track(normalizedAction, normalizedData) : void 0; 1253 | }; 1254 | 1255 | SensorsData.prototype.login = function(userId) { 1256 | var ref; 1257 | return (ref = window.sa) != null ? ref.login(userId) : void 0; 1258 | }; 1259 | 1260 | SensorsData.prototype.logout = function() { 1261 | var ref; 1262 | return (ref = window.sa) != null ? ref.logout() : void 0; 1263 | }; 1264 | 1265 | return SensorsData; 1266 | 1267 | })(BaseProvider); 1268 | 1269 | 1270 | /***/ } 1271 | /******/ ]) 1272 | }); 1273 | ; -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | Base64@~0.2.0: 6 | version "0.2.1" 7 | resolved "https://registry.yarnpkg.com/Base64/-/Base64-0.2.1.tgz#ba3a4230708e186705065e66babdd4c35cf60028" 8 | 9 | abbrev@1: 10 | version "1.0.9" 11 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" 12 | 13 | acorn@^3.0.0: 14 | version "3.3.0" 15 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 16 | 17 | align-text@^0.1.1, align-text@^0.1.3: 18 | version "0.1.4" 19 | resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" 20 | dependencies: 21 | kind-of "^3.0.2" 22 | longest "^1.0.1" 23 | repeat-string "^1.5.2" 24 | 25 | amdefine@>=0.0.4: 26 | version "1.0.0" 27 | resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.0.tgz#fd17474700cb5cc9c2b709f0be9d23ce3c198c33" 28 | 29 | ansi-regex@^2.0.0: 30 | version "2.0.0" 31 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" 32 | 33 | ansi-styles@^2.2.1: 34 | version "2.2.1" 35 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 36 | 37 | anymatch@^1.3.0: 38 | version "1.3.0" 39 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" 40 | dependencies: 41 | arrify "^1.0.0" 42 | micromatch "^2.1.5" 43 | 44 | aproba@^1.0.3: 45 | version "1.0.4" 46 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" 47 | 48 | are-we-there-yet@~1.1.2: 49 | version "1.1.2" 50 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" 51 | dependencies: 52 | delegates "^1.0.0" 53 | readable-stream "^2.0.0 || ^1.1.13" 54 | 55 | arr-diff@^2.0.0: 56 | version "2.0.0" 57 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 58 | dependencies: 59 | arr-flatten "^1.0.1" 60 | 61 | arr-flatten@^1.0.1: 62 | version "1.0.1" 63 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" 64 | 65 | array-unique@^0.2.1: 66 | version "0.2.1" 67 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 68 | 69 | arrify@^1.0.0: 70 | version "1.0.1" 71 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 72 | 73 | asn1@~0.2.3: 74 | version "0.2.3" 75 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 76 | 77 | assert-plus@^0.2.0: 78 | version "0.2.0" 79 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 80 | 81 | assert-plus@^1.0.0: 82 | version "1.0.0" 83 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 84 | 85 | assert@^1.1.1: 86 | version "1.4.1" 87 | resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" 88 | dependencies: 89 | util "0.10.3" 90 | 91 | async-each@^1.0.0: 92 | version "1.0.1" 93 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" 94 | 95 | async@^0.9.0: 96 | version "0.9.2" 97 | resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" 98 | 99 | async@^1.3.0: 100 | version "1.5.2" 101 | resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 102 | 103 | async@~0.2.6: 104 | version "0.2.10" 105 | resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" 106 | 107 | asynckit@^0.4.0: 108 | version "0.4.0" 109 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 110 | 111 | aws-sign2@~0.6.0: 112 | version "0.6.0" 113 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 114 | 115 | aws4@^1.2.1: 116 | version "1.5.0" 117 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" 118 | 119 | balanced-match@^0.4.1: 120 | version "0.4.2" 121 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 122 | 123 | balanced-match@^1.0.0: 124 | version "1.0.2" 125 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 126 | 127 | base64-js@^1.0.2: 128 | version "1.2.0" 129 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" 130 | 131 | bcrypt-pbkdf@^1.0.0: 132 | version "1.0.0" 133 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" 134 | dependencies: 135 | tweetnacl "^0.14.3" 136 | 137 | big.js@^3.1.3: 138 | version "3.1.3" 139 | resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" 140 | 141 | binary-extensions@^1.0.0: 142 | version "1.7.0" 143 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.7.0.tgz#6c1610db163abfb34edfe42fa423343a1e01185d" 144 | 145 | block-stream@*: 146 | version "0.0.9" 147 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 148 | dependencies: 149 | inherits "~2.0.0" 150 | 151 | boom@2.x.x: 152 | version "2.10.1" 153 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 154 | dependencies: 155 | hoek "2.x.x" 156 | 157 | brace-expansion@^1.0.0: 158 | version "1.1.6" 159 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" 160 | dependencies: 161 | balanced-match "^0.4.1" 162 | concat-map "0.0.1" 163 | 164 | brace-expansion@^1.1.7: 165 | version "1.1.11" 166 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 167 | dependencies: 168 | balanced-match "^1.0.0" 169 | concat-map "0.0.1" 170 | 171 | braces@^1.8.2: 172 | version "1.8.5" 173 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 174 | dependencies: 175 | expand-range "^1.8.1" 176 | preserve "^0.2.0" 177 | repeat-element "^1.1.2" 178 | 179 | browserify-zlib@~0.1.4: 180 | version "0.1.4" 181 | resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" 182 | dependencies: 183 | pako "~0.2.0" 184 | 185 | buffer-shims@^1.0.0: 186 | version "1.0.0" 187 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 188 | 189 | buffer@^4.9.0: 190 | version "4.9.1" 191 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" 192 | dependencies: 193 | base64-js "^1.0.2" 194 | ieee754 "^1.1.4" 195 | isarray "^1.0.0" 196 | 197 | camelcase@^1.0.2: 198 | version "1.2.1" 199 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" 200 | 201 | caseless@~0.11.0: 202 | version "0.11.0" 203 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" 204 | 205 | center-align@^0.1.1: 206 | version "0.1.3" 207 | resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" 208 | dependencies: 209 | align-text "^0.1.3" 210 | lazy-cache "^1.0.3" 211 | 212 | chalk@^1.1.1: 213 | version "1.1.3" 214 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 215 | dependencies: 216 | ansi-styles "^2.2.1" 217 | escape-string-regexp "^1.0.2" 218 | has-ansi "^2.0.0" 219 | strip-ansi "^3.0.0" 220 | supports-color "^2.0.0" 221 | 222 | chokidar@^1.0.0: 223 | version "1.6.1" 224 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" 225 | dependencies: 226 | anymatch "^1.3.0" 227 | async-each "^1.0.0" 228 | glob-parent "^2.0.0" 229 | inherits "^2.0.1" 230 | is-binary-path "^1.0.0" 231 | is-glob "^2.0.0" 232 | path-is-absolute "^1.0.0" 233 | readdirp "^2.0.0" 234 | optionalDependencies: 235 | fsevents "^1.0.0" 236 | 237 | cliui@^2.1.0: 238 | version "2.1.0" 239 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" 240 | dependencies: 241 | center-align "^0.1.1" 242 | right-align "^0.1.1" 243 | wordwrap "0.0.2" 244 | 245 | clone@^1.0.2: 246 | version "1.0.2" 247 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" 248 | 249 | code-point-at@^1.0.0: 250 | version "1.0.1" 251 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.0.1.tgz#1104cd34f9b5b45d3eba88f1babc1924e1ce35fb" 252 | dependencies: 253 | number-is-nan "^1.0.0" 254 | 255 | coffee-loader: 256 | version "0.7.2" 257 | resolved "https://registry.yarnpkg.com/coffee-loader/-/coffee-loader-0.7.2.tgz#4d3699af8a806312db3207385a842f497c1bd6fd" 258 | dependencies: 259 | loader-utils "0.2.x" 260 | 261 | coffee-script: 262 | version "1.11.1" 263 | resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.11.1.tgz#bf1c47ad64443a0d95d12df2b147cc0a4daad6e9" 264 | 265 | combined-stream@^1.0.5, combined-stream@~1.0.5: 266 | version "1.0.5" 267 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 268 | dependencies: 269 | delayed-stream "~1.0.0" 270 | 271 | commander@^2.9.0: 272 | version "2.9.0" 273 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 274 | dependencies: 275 | graceful-readlink ">= 1.0.0" 276 | 277 | concat-map@0.0.1: 278 | version "0.0.1" 279 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 280 | 281 | console-browserify@^1.1.0: 282 | version "1.1.0" 283 | resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" 284 | dependencies: 285 | date-now "^0.1.4" 286 | 287 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 288 | version "1.1.0" 289 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 290 | 291 | constants-browserify@0.0.1: 292 | version "0.0.1" 293 | resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-0.0.1.tgz#92577db527ba6c4cf0a4568d84bc031f441e21f2" 294 | 295 | core-util-is@~1.0.0: 296 | version "1.0.2" 297 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 298 | 299 | cryptiles@2.x.x: 300 | version "2.0.5" 301 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 302 | dependencies: 303 | boom "2.x.x" 304 | 305 | crypto-browserify@~3.2.6: 306 | version "3.2.8" 307 | resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.2.8.tgz#b9b11dbe6d9651dd882a01e6cc467df718ecf189" 308 | dependencies: 309 | pbkdf2-compat "2.0.1" 310 | ripemd160 "0.2.0" 311 | sha.js "2.2.6" 312 | 313 | dashdash@^1.12.0: 314 | version "1.14.0" 315 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.0.tgz#29e486c5418bf0f356034a993d51686a33e84141" 316 | dependencies: 317 | assert-plus "^1.0.0" 318 | 319 | date-now@^0.1.4: 320 | version "0.1.4" 321 | resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" 322 | 323 | debug@~2.2.0: 324 | version "2.2.0" 325 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" 326 | dependencies: 327 | ms "0.7.1" 328 | 329 | decamelize@^1.0.0: 330 | version "1.2.0" 331 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 332 | 333 | deep-extend@~0.4.0: 334 | version "0.4.1" 335 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" 336 | 337 | delayed-stream@~1.0.0: 338 | version "1.0.0" 339 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 340 | 341 | delegates@^1.0.0: 342 | version "1.0.0" 343 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 344 | 345 | domain-browser@^1.1.1: 346 | version "1.1.7" 347 | resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" 348 | 349 | ecc-jsbn@~0.1.1: 350 | version "0.1.1" 351 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 352 | dependencies: 353 | jsbn "~0.1.0" 354 | 355 | emojis-list@^2.0.0: 356 | version "2.1.0" 357 | resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" 358 | 359 | enhanced-resolve@~0.9.0: 360 | version "0.9.1" 361 | resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" 362 | dependencies: 363 | graceful-fs "^4.1.2" 364 | memory-fs "^0.2.0" 365 | tapable "^0.1.8" 366 | 367 | errno@^0.1.3: 368 | version "0.1.4" 369 | resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" 370 | dependencies: 371 | prr "~0.0.0" 372 | 373 | escape-string-regexp@^1.0.2: 374 | version "1.0.5" 375 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 376 | 377 | events@^1.0.0: 378 | version "1.1.1" 379 | resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" 380 | 381 | expand-brackets@^0.1.4: 382 | version "0.1.5" 383 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 384 | dependencies: 385 | is-posix-bracket "^0.1.0" 386 | 387 | expand-range@^1.8.1: 388 | version "1.8.2" 389 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 390 | dependencies: 391 | fill-range "^2.1.0" 392 | 393 | extend@~3.0.0: 394 | version "3.0.0" 395 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" 396 | 397 | extglob@^0.3.1: 398 | version "0.3.2" 399 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 400 | dependencies: 401 | is-extglob "^1.0.0" 402 | 403 | extsprintf@1.0.2: 404 | version "1.0.2" 405 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" 406 | 407 | filename-regex@^2.0.0: 408 | version "2.0.0" 409 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" 410 | 411 | fill-range@^2.1.0: 412 | version "2.2.3" 413 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 414 | dependencies: 415 | is-number "^2.1.0" 416 | isobject "^2.0.0" 417 | randomatic "^1.1.3" 418 | repeat-element "^1.1.2" 419 | repeat-string "^1.5.2" 420 | 421 | for-in@^0.1.5: 422 | version "0.1.6" 423 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" 424 | 425 | for-own@^0.1.4: 426 | version "0.1.4" 427 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" 428 | dependencies: 429 | for-in "^0.1.5" 430 | 431 | forever-agent@~0.6.1: 432 | version "0.6.1" 433 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 434 | 435 | form-data@~2.1.1: 436 | version "2.1.1" 437 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.1.tgz#4adf0342e1a79afa1e84c8c320a9ffc82392a1f3" 438 | dependencies: 439 | asynckit "^0.4.0" 440 | combined-stream "^1.0.5" 441 | mime-types "^2.1.12" 442 | 443 | fs.realpath@^1.0.0: 444 | version "1.0.0" 445 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 446 | 447 | fsevents@^1.0.0: 448 | version "1.0.14" 449 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.14.tgz#558e8cc38643d8ef40fe45158486d0d25758eee4" 450 | dependencies: 451 | nan "^2.3.0" 452 | node-pre-gyp "^0.6.29" 453 | 454 | fstream-ignore@~1.0.5: 455 | version "1.0.5" 456 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" 457 | dependencies: 458 | fstream "^1.0.0" 459 | inherits "2" 460 | minimatch "^3.0.0" 461 | 462 | fstream@^1.0.0, fstream@^1.0.12, fstream@~1.0.10: 463 | version "1.0.12" 464 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" 465 | dependencies: 466 | graceful-fs "^4.1.2" 467 | inherits "~2.0.0" 468 | mkdirp ">=0.5 0" 469 | rimraf "2" 470 | 471 | gauge@~2.6.0: 472 | version "2.6.0" 473 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.6.0.tgz#d35301ad18e96902b4751dcbbe40f4218b942a46" 474 | dependencies: 475 | aproba "^1.0.3" 476 | console-control-strings "^1.0.0" 477 | has-color "^0.1.7" 478 | has-unicode "^2.0.0" 479 | object-assign "^4.1.0" 480 | signal-exit "^3.0.0" 481 | string-width "^1.0.1" 482 | strip-ansi "^3.0.1" 483 | wide-align "^1.1.0" 484 | 485 | generate-function@^2.0.0: 486 | version "2.0.0" 487 | resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" 488 | 489 | generate-object-property@^1.1.0: 490 | version "1.2.0" 491 | resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 492 | dependencies: 493 | is-property "^1.0.0" 494 | 495 | getpass@^0.1.1: 496 | version "0.1.6" 497 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" 498 | dependencies: 499 | assert-plus "^1.0.0" 500 | 501 | glob-base@^0.3.0: 502 | version "0.3.0" 503 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 504 | dependencies: 505 | glob-parent "^2.0.0" 506 | is-glob "^2.0.0" 507 | 508 | glob-parent@^2.0.0: 509 | version "2.0.0" 510 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 511 | dependencies: 512 | is-glob "^2.0.0" 513 | 514 | glob@^7.0.5: 515 | version "7.1.1" 516 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 517 | dependencies: 518 | fs.realpath "^1.0.0" 519 | inflight "^1.0.4" 520 | inherits "2" 521 | minimatch "^3.0.2" 522 | once "^1.3.0" 523 | path-is-absolute "^1.0.0" 524 | 525 | glob@^7.1.3: 526 | version "7.1.7" 527 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" 528 | dependencies: 529 | fs.realpath "^1.0.0" 530 | inflight "^1.0.4" 531 | inherits "2" 532 | minimatch "^3.0.4" 533 | once "^1.3.0" 534 | path-is-absolute "^1.0.0" 535 | 536 | graceful-fs@^4.1.2: 537 | version "4.2.6" 538 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" 539 | 540 | "graceful-readlink@>= 1.0.0": 541 | version "1.0.1" 542 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 543 | 544 | har-validator@~2.0.6: 545 | version "2.0.6" 546 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" 547 | dependencies: 548 | chalk "^1.1.1" 549 | commander "^2.9.0" 550 | is-my-json-valid "^2.12.4" 551 | pinkie-promise "^2.0.0" 552 | 553 | has-ansi@^2.0.0: 554 | version "2.0.0" 555 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 556 | dependencies: 557 | ansi-regex "^2.0.0" 558 | 559 | has-color@^0.1.7: 560 | version "0.1.7" 561 | resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" 562 | 563 | has-flag@^1.0.0: 564 | version "1.0.0" 565 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 566 | 567 | has-unicode@^2.0.0: 568 | version "2.0.1" 569 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 570 | 571 | hawk@~3.1.3: 572 | version "3.1.3" 573 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 574 | dependencies: 575 | boom "2.x.x" 576 | cryptiles "2.x.x" 577 | hoek "2.x.x" 578 | sntp "1.x.x" 579 | 580 | hoek@2.x.x: 581 | version "2.16.3" 582 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 583 | 584 | http-browserify@^1.3.2: 585 | version "1.7.0" 586 | resolved "https://registry.yarnpkg.com/http-browserify/-/http-browserify-1.7.0.tgz#33795ade72df88acfbfd36773cefeda764735b20" 587 | dependencies: 588 | Base64 "~0.2.0" 589 | inherits "~2.0.1" 590 | 591 | http-signature@~1.1.0: 592 | version "1.1.1" 593 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 594 | dependencies: 595 | assert-plus "^0.2.0" 596 | jsprim "^1.2.2" 597 | sshpk "^1.7.0" 598 | 599 | https-browserify@0.0.0: 600 | version "0.0.0" 601 | resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.0.tgz#b3ffdfe734b2a3d4a9efd58e8654c91fce86eafd" 602 | 603 | ieee754@^1.1.4: 604 | version "1.1.8" 605 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" 606 | 607 | indexof@0.0.1: 608 | version "0.0.1" 609 | resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" 610 | 611 | inflight@^1.0.4: 612 | version "1.0.6" 613 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 614 | dependencies: 615 | once "^1.3.0" 616 | wrappy "1" 617 | 618 | inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: 619 | version "2.0.4" 620 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 621 | 622 | inherits@2.0.1: 623 | version "2.0.1" 624 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" 625 | 626 | ini@~1.3.0: 627 | version "1.3.4" 628 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 629 | 630 | interpret@^0.6.4: 631 | version "0.6.6" 632 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-0.6.6.tgz#fecd7a18e7ce5ca6abfb953e1f86213a49f1625b" 633 | 634 | is-binary-path@^1.0.0: 635 | version "1.0.1" 636 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 637 | dependencies: 638 | binary-extensions "^1.0.0" 639 | 640 | is-buffer@^1.0.2: 641 | version "1.1.4" 642 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" 643 | 644 | is-dotfile@^1.0.0: 645 | version "1.0.2" 646 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" 647 | 648 | is-equal-shallow@^0.1.3: 649 | version "0.1.3" 650 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 651 | dependencies: 652 | is-primitive "^2.0.0" 653 | 654 | is-extendable@^0.1.1: 655 | version "0.1.1" 656 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 657 | 658 | is-extglob@^1.0.0: 659 | version "1.0.0" 660 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 661 | 662 | is-fullwidth-code-point@^1.0.0: 663 | version "1.0.0" 664 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 665 | dependencies: 666 | number-is-nan "^1.0.0" 667 | 668 | is-glob@^2.0.0, is-glob@^2.0.1: 669 | version "2.0.1" 670 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 671 | dependencies: 672 | is-extglob "^1.0.0" 673 | 674 | is-my-json-valid@^2.12.4: 675 | version "2.15.0" 676 | resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" 677 | dependencies: 678 | generate-function "^2.0.0" 679 | generate-object-property "^1.1.0" 680 | jsonpointer "^4.0.0" 681 | xtend "^4.0.0" 682 | 683 | is-number@^2.0.2, is-number@^2.1.0: 684 | version "2.1.0" 685 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 686 | dependencies: 687 | kind-of "^3.0.2" 688 | 689 | is-posix-bracket@^0.1.0: 690 | version "0.1.1" 691 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 692 | 693 | is-primitive@^2.0.0: 694 | version "2.0.0" 695 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 696 | 697 | is-property@^1.0.0: 698 | version "1.0.2" 699 | resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 700 | 701 | is-typedarray@~1.0.0: 702 | version "1.0.0" 703 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 704 | 705 | isarray@0.0.1: 706 | version "0.0.1" 707 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 708 | 709 | isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: 710 | version "1.0.0" 711 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 712 | 713 | isobject@^2.0.0: 714 | version "2.1.0" 715 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 716 | dependencies: 717 | isarray "1.0.0" 718 | 719 | isstream@~0.1.2: 720 | version "0.1.2" 721 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 722 | 723 | jodid25519@^1.0.0: 724 | version "1.0.2" 725 | resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" 726 | dependencies: 727 | jsbn "~0.1.0" 728 | 729 | jsbn@~0.1.0: 730 | version "0.1.0" 731 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" 732 | 733 | json-schema@0.2.3: 734 | version "0.2.3" 735 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 736 | 737 | json-stringify-safe@~5.0.1: 738 | version "5.0.1" 739 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 740 | 741 | json5@^0.5.0: 742 | version "0.5.0" 743 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.0.tgz#9b20715b026cbe3778fd769edccd822d8332a5b2" 744 | 745 | jsonpointer@^4.0.0: 746 | version "4.0.0" 747 | resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" 748 | 749 | jsprim@^1.2.2: 750 | version "1.3.1" 751 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" 752 | dependencies: 753 | extsprintf "1.0.2" 754 | json-schema "0.2.3" 755 | verror "1.3.6" 756 | 757 | kind-of@^3.0.2: 758 | version "3.0.4" 759 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.0.4.tgz#7b8ecf18a4e17f8269d73b501c9f232c96887a74" 760 | dependencies: 761 | is-buffer "^1.0.2" 762 | 763 | lazy-cache@^1.0.3: 764 | version "1.0.4" 765 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" 766 | 767 | loader-utils@0.2.x, loader-utils@^0.2.11: 768 | version "0.2.16" 769 | resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.16.tgz#f08632066ed8282835dff88dfb52704765adee6d" 770 | dependencies: 771 | big.js "^3.1.3" 772 | emojis-list "^2.0.0" 773 | json5 "^0.5.0" 774 | object-assign "^4.0.1" 775 | 776 | longest@^1.0.1: 777 | version "1.0.1" 778 | resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" 779 | 780 | memory-fs@^0.2.0: 781 | version "0.2.0" 782 | resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" 783 | 784 | memory-fs@~0.3.0: 785 | version "0.3.0" 786 | resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" 787 | dependencies: 788 | errno "^0.1.3" 789 | readable-stream "^2.0.1" 790 | 791 | micromatch@^2.1.5: 792 | version "2.3.11" 793 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 794 | dependencies: 795 | arr-diff "^2.0.0" 796 | array-unique "^0.2.1" 797 | braces "^1.8.2" 798 | expand-brackets "^0.1.4" 799 | extglob "^0.3.1" 800 | filename-regex "^2.0.0" 801 | is-extglob "^1.0.0" 802 | is-glob "^2.0.1" 803 | kind-of "^3.0.2" 804 | normalize-path "^2.0.1" 805 | object.omit "^2.0.0" 806 | parse-glob "^3.0.4" 807 | regex-cache "^0.4.2" 808 | 809 | mime-db@~1.24.0: 810 | version "1.24.0" 811 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.24.0.tgz#e2d13f939f0016c6e4e9ad25a8652f126c467f0c" 812 | 813 | mime-types@^2.1.12, mime-types@~2.1.7: 814 | version "2.1.12" 815 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.12.tgz#152ba256777020dd4663f54c2e7bc26381e71729" 816 | dependencies: 817 | mime-db "~1.24.0" 818 | 819 | minimatch@^3.0.0, minimatch@^3.0.2: 820 | version "3.0.3" 821 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 822 | dependencies: 823 | brace-expansion "^1.0.0" 824 | 825 | minimatch@^3.0.4: 826 | version "3.0.4" 827 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 828 | dependencies: 829 | brace-expansion "^1.1.7" 830 | 831 | minimist@0.0.8: 832 | version "0.0.8" 833 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 834 | 835 | minimist@^1.2.0: 836 | version "1.2.0" 837 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 838 | 839 | minimist@^1.2.5: 840 | version "1.2.5" 841 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 842 | 843 | minimist@~0.0.1: 844 | version "0.0.10" 845 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" 846 | 847 | "mkdirp@>=0.5 0": 848 | version "0.5.5" 849 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 850 | dependencies: 851 | minimist "^1.2.5" 852 | 853 | mkdirp@~0.5.0, mkdirp@~0.5.1: 854 | version "0.5.1" 855 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 856 | dependencies: 857 | minimist "0.0.8" 858 | 859 | ms@0.7.1: 860 | version "0.7.1" 861 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" 862 | 863 | nan@^2.3.0: 864 | version "2.4.0" 865 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" 866 | 867 | node-libs-browser@^0.6.0: 868 | version "0.6.0" 869 | resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-0.6.0.tgz#244806d44d319e048bc8607b5cc4eaf9a29d2e3c" 870 | dependencies: 871 | assert "^1.1.1" 872 | browserify-zlib "~0.1.4" 873 | buffer "^4.9.0" 874 | console-browserify "^1.1.0" 875 | constants-browserify "0.0.1" 876 | crypto-browserify "~3.2.6" 877 | domain-browser "^1.1.1" 878 | events "^1.0.0" 879 | http-browserify "^1.3.2" 880 | https-browserify "0.0.0" 881 | os-browserify "~0.1.2" 882 | path-browserify "0.0.0" 883 | process "^0.11.0" 884 | punycode "^1.2.4" 885 | querystring-es3 "~0.2.0" 886 | readable-stream "^1.1.13" 887 | stream-browserify "^1.0.0" 888 | string_decoder "~0.10.25" 889 | timers-browserify "^1.0.1" 890 | tty-browserify "0.0.0" 891 | url "~0.10.1" 892 | util "~0.10.3" 893 | vm-browserify "0.0.4" 894 | 895 | node-pre-gyp@^0.6.29: 896 | version "0.6.31" 897 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.31.tgz#d8a00ddaa301a940615dbcc8caad4024d58f6017" 898 | dependencies: 899 | mkdirp "~0.5.1" 900 | nopt "~3.0.6" 901 | npmlog "^4.0.0" 902 | rc "~1.1.6" 903 | request "^2.75.0" 904 | rimraf "~2.5.4" 905 | semver "~5.3.0" 906 | tar "~2.2.1" 907 | tar-pack "~3.3.0" 908 | 909 | node-uuid@~1.4.7: 910 | version "1.4.7" 911 | resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f" 912 | 913 | nopt@~3.0.6: 914 | version "3.0.6" 915 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" 916 | dependencies: 917 | abbrev "1" 918 | 919 | normalize-path@^2.0.1: 920 | version "2.0.1" 921 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" 922 | 923 | npmlog@^4.0.0: 924 | version "4.0.0" 925 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.0.tgz#e094503961c70c1774eb76692080e8d578a9f88f" 926 | dependencies: 927 | are-we-there-yet "~1.1.2" 928 | console-control-strings "~1.1.0" 929 | gauge "~2.6.0" 930 | set-blocking "~2.0.0" 931 | 932 | number-is-nan@^1.0.0: 933 | version "1.0.1" 934 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 935 | 936 | oauth-sign@~0.8.1: 937 | version "0.8.2" 938 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 939 | 940 | object-assign@^4.0.1, object-assign@^4.1.0: 941 | version "4.1.0" 942 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" 943 | 944 | object.omit@^2.0.0: 945 | version "2.0.1" 946 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 947 | dependencies: 948 | for-own "^0.1.4" 949 | is-extendable "^0.1.1" 950 | 951 | once@^1.3.0: 952 | version "1.4.0" 953 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 954 | dependencies: 955 | wrappy "1" 956 | 957 | once@~1.3.3: 958 | version "1.3.3" 959 | resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" 960 | dependencies: 961 | wrappy "1" 962 | 963 | optimist@~0.6.0: 964 | version "0.6.1" 965 | resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" 966 | dependencies: 967 | minimist "~0.0.1" 968 | wordwrap "~0.0.2" 969 | 970 | os-browserify@~0.1.2: 971 | version "0.1.2" 972 | resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.1.2.tgz#49ca0293e0b19590a5f5de10c7f265a617d8fe54" 973 | 974 | pako@~0.2.0: 975 | version "0.2.9" 976 | resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" 977 | 978 | parse-glob@^3.0.4: 979 | version "3.0.4" 980 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 981 | dependencies: 982 | glob-base "^0.3.0" 983 | is-dotfile "^1.0.0" 984 | is-extglob "^1.0.0" 985 | is-glob "^2.0.0" 986 | 987 | path-browserify@0.0.0: 988 | version "0.0.0" 989 | resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" 990 | 991 | path-is-absolute@^1.0.0: 992 | version "1.0.1" 993 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 994 | 995 | pbkdf2-compat@2.0.1: 996 | version "2.0.1" 997 | resolved "https://registry.yarnpkg.com/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz#b6e0c8fa99494d94e0511575802a59a5c142f288" 998 | 999 | pinkie-promise@^2.0.0: 1000 | version "2.0.1" 1001 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1002 | dependencies: 1003 | pinkie "^2.0.0" 1004 | 1005 | pinkie@^2.0.0: 1006 | version "2.0.4" 1007 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1008 | 1009 | preserve@^0.2.0: 1010 | version "0.2.0" 1011 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1012 | 1013 | process-nextick-args@~1.0.6: 1014 | version "1.0.7" 1015 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1016 | 1017 | process@^0.11.0, process@~0.11.0: 1018 | version "0.11.9" 1019 | resolved "https://registry.yarnpkg.com/process/-/process-0.11.9.tgz#7bd5ad21aa6253e7da8682264f1e11d11c0318c1" 1020 | 1021 | prr@~0.0.0: 1022 | version "0.0.0" 1023 | resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" 1024 | 1025 | punycode@1.3.2: 1026 | version "1.3.2" 1027 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" 1028 | 1029 | punycode@^1.2.4, punycode@^1.4.1: 1030 | version "1.4.1" 1031 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1032 | 1033 | qs@~6.3.0: 1034 | version "6.3.0" 1035 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" 1036 | 1037 | querystring-es3@~0.2.0: 1038 | version "0.2.1" 1039 | resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" 1040 | 1041 | querystring@0.2.0: 1042 | version "0.2.0" 1043 | resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" 1044 | 1045 | randomatic@^1.1.3: 1046 | version "1.1.5" 1047 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.5.tgz#5e9ef5f2d573c67bd2b8124ae90b5156e457840b" 1048 | dependencies: 1049 | is-number "^2.0.2" 1050 | kind-of "^3.0.2" 1051 | 1052 | rc@~1.1.6: 1053 | version "1.1.6" 1054 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" 1055 | dependencies: 1056 | deep-extend "~0.4.0" 1057 | ini "~1.3.0" 1058 | minimist "^1.2.0" 1059 | strip-json-comments "~1.0.4" 1060 | 1061 | readable-stream@^1.0.27-1, readable-stream@^1.1.13: 1062 | version "1.1.14" 1063 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" 1064 | dependencies: 1065 | core-util-is "~1.0.0" 1066 | inherits "~2.0.1" 1067 | isarray "0.0.1" 1068 | string_decoder "~0.10.x" 1069 | 1070 | "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@~2.1.4: 1071 | version "2.1.5" 1072 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" 1073 | dependencies: 1074 | buffer-shims "^1.0.0" 1075 | core-util-is "~1.0.0" 1076 | inherits "~2.0.1" 1077 | isarray "~1.0.0" 1078 | process-nextick-args "~1.0.6" 1079 | string_decoder "~0.10.x" 1080 | util-deprecate "~1.0.1" 1081 | 1082 | readdirp@^2.0.0: 1083 | version "2.1.0" 1084 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" 1085 | dependencies: 1086 | graceful-fs "^4.1.2" 1087 | minimatch "^3.0.2" 1088 | readable-stream "^2.0.2" 1089 | set-immediate-shim "^1.0.1" 1090 | 1091 | regex-cache@^0.4.2: 1092 | version "0.4.3" 1093 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" 1094 | dependencies: 1095 | is-equal-shallow "^0.1.3" 1096 | is-primitive "^2.0.0" 1097 | 1098 | repeat-element@^1.1.2: 1099 | version "1.1.2" 1100 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 1101 | 1102 | repeat-string@^1.5.2: 1103 | version "1.6.1" 1104 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1105 | 1106 | request@^2.75.0: 1107 | version "2.76.0" 1108 | resolved "https://registry.yarnpkg.com/request/-/request-2.76.0.tgz#be44505afef70360a0436955106be3945d95560e" 1109 | dependencies: 1110 | aws-sign2 "~0.6.0" 1111 | aws4 "^1.2.1" 1112 | caseless "~0.11.0" 1113 | combined-stream "~1.0.5" 1114 | extend "~3.0.0" 1115 | forever-agent "~0.6.1" 1116 | form-data "~2.1.1" 1117 | har-validator "~2.0.6" 1118 | hawk "~3.1.3" 1119 | http-signature "~1.1.0" 1120 | is-typedarray "~1.0.0" 1121 | isstream "~0.1.2" 1122 | json-stringify-safe "~5.0.1" 1123 | mime-types "~2.1.7" 1124 | node-uuid "~1.4.7" 1125 | oauth-sign "~0.8.1" 1126 | qs "~6.3.0" 1127 | stringstream "~0.0.4" 1128 | tough-cookie "~2.3.0" 1129 | tunnel-agent "~0.4.1" 1130 | 1131 | right-align@^0.1.1: 1132 | version "0.1.3" 1133 | resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" 1134 | dependencies: 1135 | align-text "^0.1.1" 1136 | 1137 | rimraf@2: 1138 | version "2.7.1" 1139 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 1140 | dependencies: 1141 | glob "^7.1.3" 1142 | 1143 | rimraf@~2.5.1, rimraf@~2.5.4: 1144 | version "2.5.4" 1145 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" 1146 | dependencies: 1147 | glob "^7.0.5" 1148 | 1149 | ripemd160@0.2.0: 1150 | version "0.2.0" 1151 | resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-0.2.0.tgz#2bf198bde167cacfa51c0a928e84b68bbe171fce" 1152 | 1153 | semver@~5.3.0: 1154 | version "5.3.0" 1155 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 1156 | 1157 | set-blocking@~2.0.0: 1158 | version "2.0.0" 1159 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1160 | 1161 | set-immediate-shim@^1.0.1: 1162 | version "1.0.1" 1163 | resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" 1164 | 1165 | sha.js@2.2.6: 1166 | version "2.2.6" 1167 | resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.2.6.tgz#17ddeddc5f722fb66501658895461977867315ba" 1168 | 1169 | signal-exit@^3.0.0: 1170 | version "3.0.1" 1171 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.1.tgz#5a4c884992b63a7acd9badb7894c3ee9cfccad81" 1172 | 1173 | sntp@1.x.x: 1174 | version "1.0.9" 1175 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 1176 | dependencies: 1177 | hoek "2.x.x" 1178 | 1179 | source-list-map@~0.1.0: 1180 | version "0.1.6" 1181 | resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.6.tgz#e1e6f94f0b40c4d28dcf8f5b8766e0e45636877f" 1182 | 1183 | source-map@~0.4.1: 1184 | version "0.4.4" 1185 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" 1186 | dependencies: 1187 | amdefine ">=0.0.4" 1188 | 1189 | source-map@~0.5.1: 1190 | version "0.5.6" 1191 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 1192 | 1193 | sshpk@^1.7.0: 1194 | version "1.10.1" 1195 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" 1196 | dependencies: 1197 | asn1 "~0.2.3" 1198 | assert-plus "^1.0.0" 1199 | dashdash "^1.12.0" 1200 | getpass "^0.1.1" 1201 | optionalDependencies: 1202 | bcrypt-pbkdf "^1.0.0" 1203 | ecc-jsbn "~0.1.1" 1204 | jodid25519 "^1.0.0" 1205 | jsbn "~0.1.0" 1206 | tweetnacl "~0.14.0" 1207 | 1208 | stream-browserify@^1.0.0: 1209 | version "1.0.0" 1210 | resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-1.0.0.tgz#bf9b4abfb42b274d751479e44e0ff2656b6f1193" 1211 | dependencies: 1212 | inherits "~2.0.1" 1213 | readable-stream "^1.0.27-1" 1214 | 1215 | string-width@^1.0.1: 1216 | version "1.0.2" 1217 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1218 | dependencies: 1219 | code-point-at "^1.0.0" 1220 | is-fullwidth-code-point "^1.0.0" 1221 | strip-ansi "^3.0.0" 1222 | 1223 | string_decoder@~0.10.25, string_decoder@~0.10.x: 1224 | version "0.10.31" 1225 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1226 | 1227 | stringstream@~0.0.4: 1228 | version "0.0.5" 1229 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 1230 | 1231 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1232 | version "3.0.1" 1233 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1234 | dependencies: 1235 | ansi-regex "^2.0.0" 1236 | 1237 | strip-json-comments@~1.0.4: 1238 | version "1.0.4" 1239 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" 1240 | 1241 | supports-color@^2.0.0: 1242 | version "2.0.0" 1243 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1244 | 1245 | supports-color@^3.1.0: 1246 | version "3.1.2" 1247 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" 1248 | dependencies: 1249 | has-flag "^1.0.0" 1250 | 1251 | tapable@^0.1.8, tapable@~0.1.8: 1252 | version "0.1.10" 1253 | resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" 1254 | 1255 | tar-pack@~3.3.0: 1256 | version "3.3.0" 1257 | resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" 1258 | dependencies: 1259 | debug "~2.2.0" 1260 | fstream "~1.0.10" 1261 | fstream-ignore "~1.0.5" 1262 | once "~1.3.3" 1263 | readable-stream "~2.1.4" 1264 | rimraf "~2.5.1" 1265 | tar "~2.2.1" 1266 | uid-number "~0.0.6" 1267 | 1268 | tar@~2.2.1: 1269 | version "2.2.2" 1270 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" 1271 | dependencies: 1272 | block-stream "*" 1273 | fstream "^1.0.12" 1274 | inherits "2" 1275 | 1276 | timers-browserify@^1.0.1: 1277 | version "1.4.2" 1278 | resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" 1279 | dependencies: 1280 | process "~0.11.0" 1281 | 1282 | tough-cookie@~2.3.0: 1283 | version "2.3.2" 1284 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" 1285 | dependencies: 1286 | punycode "^1.4.1" 1287 | 1288 | tty-browserify@0.0.0: 1289 | version "0.0.0" 1290 | resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" 1291 | 1292 | tunnel-agent@~0.4.1: 1293 | version "0.4.3" 1294 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" 1295 | 1296 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1297 | version "0.14.3" 1298 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.3.tgz#3da382f670f25ded78d7b3d1792119bca0b7132d" 1299 | 1300 | uglify-js@~2.7.3: 1301 | version "2.7.4" 1302 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.4.tgz#a295a0de12b6a650c031c40deb0dc40b14568bd2" 1303 | dependencies: 1304 | async "~0.2.6" 1305 | source-map "~0.5.1" 1306 | uglify-to-browserify "~1.0.0" 1307 | yargs "~3.10.0" 1308 | 1309 | uglify-to-browserify@~1.0.0: 1310 | version "1.0.2" 1311 | resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" 1312 | 1313 | uid-number@~0.0.6: 1314 | version "0.0.6" 1315 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" 1316 | 1317 | url@~0.10.1: 1318 | version "0.10.3" 1319 | resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" 1320 | dependencies: 1321 | punycode "1.3.2" 1322 | querystring "0.2.0" 1323 | 1324 | util-deprecate@~1.0.1: 1325 | version "1.0.2" 1326 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1327 | 1328 | util@0.10.3, util@~0.10.3: 1329 | version "0.10.3" 1330 | resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" 1331 | dependencies: 1332 | inherits "2.0.1" 1333 | 1334 | verror@1.3.6: 1335 | version "1.3.6" 1336 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" 1337 | dependencies: 1338 | extsprintf "1.0.2" 1339 | 1340 | vm-browserify@0.0.4: 1341 | version "0.0.4" 1342 | resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" 1343 | dependencies: 1344 | indexof "0.0.1" 1345 | 1346 | watchpack@^0.2.1: 1347 | version "0.2.9" 1348 | resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-0.2.9.tgz#62eaa4ab5e5ba35fdfc018275626e3c0f5e3fb0b" 1349 | dependencies: 1350 | async "^0.9.0" 1351 | chokidar "^1.0.0" 1352 | graceful-fs "^4.1.2" 1353 | 1354 | webpack: 1355 | version "1.13.3" 1356 | resolved "https://registry.yarnpkg.com/webpack/-/webpack-1.13.3.tgz#e79c46fe5a37c5ca70084ba0894c595cdcb42815" 1357 | dependencies: 1358 | acorn "^3.0.0" 1359 | async "^1.3.0" 1360 | clone "^1.0.2" 1361 | enhanced-resolve "~0.9.0" 1362 | interpret "^0.6.4" 1363 | loader-utils "^0.2.11" 1364 | memory-fs "~0.3.0" 1365 | mkdirp "~0.5.0" 1366 | node-libs-browser "^0.6.0" 1367 | optimist "~0.6.0" 1368 | supports-color "^3.1.0" 1369 | tapable "~0.1.8" 1370 | uglify-js "~2.7.3" 1371 | watchpack "^0.2.1" 1372 | webpack-core "~0.6.0" 1373 | 1374 | webpack-core@~0.6.0: 1375 | version "0.6.8" 1376 | resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.8.tgz#edf9135de00a6a3c26dd0f14b208af0aa4af8d0a" 1377 | dependencies: 1378 | source-list-map "~0.1.0" 1379 | source-map "~0.4.1" 1380 | 1381 | wide-align@^1.1.0: 1382 | version "1.1.0" 1383 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" 1384 | dependencies: 1385 | string-width "^1.0.1" 1386 | 1387 | window-size@0.1.0: 1388 | version "0.1.0" 1389 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" 1390 | 1391 | wordwrap@0.0.2: 1392 | version "0.0.2" 1393 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" 1394 | 1395 | wordwrap@~0.0.2: 1396 | version "0.0.3" 1397 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 1398 | 1399 | wrappy@1: 1400 | version "1.0.2" 1401 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1402 | 1403 | xtend@^4.0.0: 1404 | version "4.0.1" 1405 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 1406 | 1407 | yargs@~3.10.0: 1408 | version "3.10.0" 1409 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" 1410 | dependencies: 1411 | camelcase "^1.0.2" 1412 | cliui "^2.1.0" 1413 | decamelize "^1.0.0" 1414 | window-size "0.1.0" 1415 | --------------------------------------------------------------------------------