├── .gitignore ├── .travis.yml ├── Gruntfile.js ├── README.md ├── addon_webstore ├── background.js ├── manifest.json ├── script-icon_128.png └── script-icon_16.png ├── deploy.sh ├── environment ├── defaultConfig.js ├── dev │ ├── config.js │ └── deployment_config.json ├── production │ ├── config.js │ └── deployment_config.json └── staging │ ├── config.js │ └── deployment_config.json ├── google.script.run.js ├── package-lock.json ├── package.json ├── setenv.sh └── spec ├── PropertiesServiceTest.js ├── SpreadsheetAppTest.js ├── View.specs.js └── globalLibDef.js /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | /.idea/ 3 | /.grunt/ 4 | /dist/ 5 | /addon_webstore/manifest.json 6 | 7 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: "8" 3 | 4 | cache: 5 | directories: 6 | - node_modules 7 | 8 | install: 9 | - npm install 10 | - . ./setenv.sh 11 | 12 | script: 13 | - grunt build --env=$ENV 14 | 15 | deploy: 16 | provider: script 17 | script: ./deploy.sh 18 | skip_cleanup: true 19 | on: 20 | all_branches: true 21 | condition: $IS_KNOWN_ENV = true -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt) { 2 | 3 | require('jit-grunt')(grunt); 4 | 5 | const configs = { 6 | build: { 7 | src: 'src', 8 | dir: 'dist', 9 | srcDir: 'dist/src', 10 | envConfigDir: 'environment' 11 | } 12 | }; 13 | 14 | const options = { 15 | build: { 16 | env: grunt.option('env') || 'dev' 17 | }, 18 | clasp: { 19 | refreshToken: grunt.option('clasp_refresh_token'), 20 | lastCommit: grunt.option('last_commit') 21 | }, 22 | webstore: { 23 | target: grunt.option('webstore_target'), 24 | credentials: { 25 | clientId : grunt.option('ws_client_id'), 26 | clientSecret : grunt.option('ws_client_secret'), 27 | refreshToken : grunt.option('ws_refresh_token') 28 | } 29 | } 30 | }; 31 | 32 | console.log(`Environment used is ${options.build.env}`); 33 | 34 | const deploymentConfig = grunt.file.readJSON(`./${configs.build.envConfigDir}/${options.build.env}/deployment_config.json`); 35 | 36 | // init config object 37 | grunt.initConfig({ 38 | configs: configs, 39 | options: options, 40 | clean: { 41 | all: ['<%= configs.build.dir %>'] 42 | }, 43 | copy: { 44 | all: { 45 | files: [ 46 | { 47 | expand: true, 48 | cwd: '<%= configs.build.src %>/', 49 | src: ['**/*.js', '**/*.html', '**/*.json'], 50 | dest: '<%= configs.build.srcDir %>/', 51 | flatten: true, 52 | filter: 'isFile', 53 | rename: function (dest, src) { 54 | return dest + src.replace(/\.js$/, '.gs'); 55 | } 56 | } 57 | ] 58 | } 59 | }, 60 | concat: { 61 | dist: { 62 | src: ['<%= configs.build.envConfigDir %>/<%= options.build.env %>/config.js', '<%= configs.build.envConfigDir %>/defaultConfig.js'], 63 | dest: '<%= configs.build.srcDir %>/config.gs' 64 | }, 65 | options: { 66 | process: function (content, src) { 67 | if (src === `${configs.build.envConfigDir}/defaultConfig.js`) { 68 | return 'var env = "' + options.build.env + '";\r\n' + content; 69 | } else return content; 70 | } 71 | } 72 | }, 73 | jasmine: { 74 | src: 'src/**/*.js', 75 | options: { 76 | specs: 'spec/**/*.js' 77 | } 78 | }, 79 | config: { 80 | clasp: { 81 | src: "<%= configs.build.srcDir %>/.clasp.json", 82 | dest: "<%= configs.build.srcDir %>/.clasp.json", 83 | configuration: deploymentConfig.clasp 84 | }, 85 | scriptManifest: { 86 | src: '<%= configs.build.srcDir %>/appsscript.json', 87 | dest: '<%= configs.build.srcDir %>/appsscript.json', 88 | configuration: deploymentConfig.script_manifest || {} 89 | } 90 | }, 91 | clasp: { 92 | newVersion: { 93 | runDir: configs.build.srcDir 94 | }, 95 | push: { 96 | runDir: configs.build.srcDir 97 | }, 98 | deployNonAddons: { 99 | runDir: configs.build.srcDir 100 | } 101 | }, 102 | compress: { 103 | addonWebstore: { 104 | options: { 105 | archive: `./${configs.build.dir}/addon_webstore_draft.zip`, 106 | mode: 'zip' 107 | }, 108 | files: [ 109 | { src: './addon_webstore/**' } 110 | ] 111 | } 112 | }, 113 | webstore:{ 114 | updateItem: { 115 | /** Do publish or just update the draft */ 116 | publish: !!deploymentConfig.publishing.publish, 117 | 118 | /** @type {'trustedTesters' | 'default'} */ 119 | target: options.webstore.target || 'trustedTesters' 120 | } 121 | } 122 | }); 123 | 124 | grunt.registerTask('clasp_cred', 'Preparing CLASP credentials', function(){ 125 | if(options.clasp.refreshToken) grunt.file.write(".clasprc.json", JSON.stringify({ "refresh_token": options.clasp.refreshToken})) 126 | }); 127 | 128 | // custom task to change *.json 129 | grunt.registerMultiTask('config', 'Update properties in *.json file', function(){ 130 | 131 | if (!this || !this.data || !this.data.src || !this.data.dest) return; 132 | 133 | const configFile = this.files[0].src[0], 134 | configFileTarget = this.files[0].dest; 135 | 136 | let newConfig = this.data.configuration, 137 | config; 138 | try { 139 | // read config file 140 | config = grunt.file.readJSON(configFile) 141 | } 142 | catch (e) { 143 | config = {}; 144 | } 145 | 146 | // update the provided parameters 147 | for (let i in newConfig){ 148 | // noinspection JSUnfilteredForInLoop 149 | config[i] = newConfig[i]; 150 | } 151 | 152 | // write updated config 153 | const configStr = JSON.stringify(config); 154 | grunt.file.write(configFileTarget, configStr); 155 | 156 | }); 157 | 158 | // Use clasp 159 | grunt.registerMultiTask('clasp', 'push content in script, and create a version', function(){ 160 | const child_process = require('child_process'); 161 | 162 | /** 163 | * @type {{ 164 | * command: string, 165 | * runDir: string 166 | * }} 167 | */ 168 | let param = this.data; 169 | 170 | function clasp(cmd){ 171 | try { 172 | let res = child_process.execSync(`clasp ${cmd}`, { 173 | cwd: __dirname +'/'+ param.runDir 174 | }); 175 | 176 | // Get string res 177 | return res.toString(); 178 | } catch (er) { 179 | console.log("and error while trying to push", er) 180 | } 181 | 182 | } 183 | 184 | switch (this.target){ 185 | case 'push': 186 | // Push 187 | console.log('Pushing files to the script'); 188 | let pushRes = clasp('push'); 189 | 190 | // Check result 191 | let resPush = /Pushed\s(\d+)\sfiles\./.exec(pushRes); 192 | if (!resPush) throw 'Error while pushing files to AppsScript'; 193 | console.log(`Pushed files: ${resPush[1]}`); 194 | 195 | break; 196 | 197 | case 'newVersion': 198 | // create a new version 199 | console.log('Creating new script version'); 200 | let versionRes = clasp(`version ${options.clasp.lastCommit || ""}`); 201 | 202 | // Check result and get version num 203 | let resVers = /version\s(\d+)/.exec(versionRes); 204 | if (!resVers) throw 'Error while creating new version'; 205 | 206 | let versionNum = +resVers[1]; 207 | console.log('New version num: ' + versionNum); 208 | 209 | // Update version value: 210 | deploymentConfig.publishing.version = versionNum; 211 | 212 | break; 213 | 214 | case 'deployNonAddons': 215 | console.log('Deploying non addons if config exists in the appsscript.json manifest'); 216 | clasp(`deploy ${deploymentConfig.publishing.version + options.clasp.lastCommit || ""}`); 217 | break; 218 | } 219 | }); 220 | 221 | grunt.registerTask('webstore_dist', 'Preparing Webstore dist content', function(){ 222 | if(deploymentConfig.publishing) { 223 | let manifest = deploymentConfig.publishing.manifest; 224 | 225 | if (!deploymentConfig.publishing.version){ 226 | console.error(`The webstore draft can't be created with no script version`); 227 | 228 | return false; 229 | } 230 | 231 | // Update script version 232 | manifest.container_info.container_version = deploymentConfig.publishing.version; 233 | // Bump manifest version (as script are always versioned, this should suffice) 234 | const manifestVersion = deploymentConfig.publishing.versionOffset + deploymentConfig.publishing.version; 235 | 236 | console.log("Webstore manifest version has been prepared : " + manifestVersion); 237 | 238 | manifest.version = manifestVersion.toString(); 239 | 240 | grunt.file.write(`./addon_webstore/manifest.json`, JSON.stringify(manifest)) 241 | } 242 | }); 243 | 244 | grunt.registerMultiTask('webstore', 'use Webstore API to send a draft and publish it', function(){ 245 | if(deploymentConfig.publishing) { 246 | const webstore = require('webstore-upload'); 247 | 248 | const PUBLISH_DRAFT = this.data.publish; 249 | 250 | const PUBLICATION_TARGET = this.data.target || 'trustedTesters' ; 251 | 252 | const uploadOptions = { 253 | accounts: { 254 | default: { 255 | client_id: options.webstore.credentials.clientId, 256 | client_secret: options.webstore.credentials.clientSecret, 257 | refresh_token: options.webstore.credentials.refreshToken 258 | } 259 | }, 260 | extensions: { 261 | addon: { 262 | //required 263 | appID: deploymentConfig.publishing.appID, 264 | //required, we can use dir name and upload most recent zip file 265 | zip: `${configs.build.dir}/addon_webstore_draft.zip`, 266 | publishTarget: PUBLICATION_TARGET, 267 | publish: PUBLISH_DRAFT 268 | } 269 | }, 270 | uploadExtensions : ['addon'] 271 | }; 272 | 273 | let done = this.async(); 274 | 275 | webstore(uploadOptions, 'default').then(() => { 276 | console.log('Published with success'); 277 | done(); 278 | }) 279 | .catch(() => { 280 | console.error('Publishing failed'); 281 | done(false); 282 | }); 283 | } 284 | }); 285 | 286 | grunt.registerTask('build', [ 287 | 'jasmine', 288 | 'clean', 289 | 'copy', 290 | 'concat', 291 | 'config:clasp', 292 | 'config:scriptManifest' 293 | ]); 294 | 295 | grunt.registerTask('push', [ 296 | 'clasp_cred', 297 | 'clasp:push' 298 | ]); 299 | 300 | grunt.registerTask('publishAddon', [ 301 | 'clasp_cred', 302 | 'clasp:push', 303 | 'clasp:newVersion', 304 | 'webstore_dist', 305 | 'compress:addonWebstore', 306 | 'webstore:updateItem' 307 | ]); 308 | 309 | grunt.registerTask('build_push', [ 310 | 'build', 311 | 'push', 312 | ]); 313 | 314 | grunt.registerTask('build_publish', [ 315 | 'build', 316 | 'publishAddon' 317 | ]); 318 | 319 | // define default task (for grunt alone) 320 | grunt.registerTask('default', ['build']); 321 | 322 | 323 | grunt.registerTask('test', ['jasmine']); 324 | }; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Apps Script continuous integration with Travis CI. 2 | 3 | This startup project automates build, test, push and publishing to Google webstore using (Grunt, jasmine-phantomjs, Google Clasp, Google Webstore and Travis CI). 4 | 5 | ### How do I get set up? ### 6 | 7 | * Summary of set up 8 | 9 | 1. We assume that Webstorm, Git, and npm are installed on you computer. 10 | 2. Clone the Git repository 11 | 3. Run npm install in project root to install node_modules necessary to run grunt and build the project 12 | 13 | * Deployment instructions 14 | 15 | 1. Rename and copy files: Execute ``grunt`` for dev or ``grunt -env=[environment]*`` for the other environments inside the main working directory 16 | 2. Update the script: ``grunt push --env=[environment]`` 17 | 3. Both can be executed with: ``grunt build_push --env=[environment]`` 18 | 4. To publish an addon (JUST FOR TEST): ``grunt build_publish`` 19 | * and other options are available: 20 | * ``--last_commit=[commit_hash]`` 21 | * ``--webstore_target=[publish_target]`` 22 | 23 | #### Config file format: 24 | 25 | When publishing as an Addon with the command add: 26 | 27 | /environment/[environment]/deployment_config.json 28 | ```json 29 | { 30 | "clasp": { 31 | "scriptId": "$TARGET_SCRIPT_ID$" 32 | }, 33 | "script_manifest": {}, 34 | "publishing": { 35 | "version": null, 36 | "versionOffset": 0, 37 | "account": "$ACCOUNT_NAME_FOR_WEBSTORE_CREDENTIAL$", 38 | "appID": "$WEBSTORE_ITEM_ID$", 39 | 40 | "manifest": { 41 | "update_url" : "https://clients2.google.com/service/update2/crx", 42 | "container" : ["GOOGLE_SPREADSHEET"], 43 | "app" : { 44 | "background" : { 45 | "scripts" : ["background.js"] 46 | } 47 | }, 48 | "api_console_project_id" : "$SCRIPT_PROJECT_ID$", 49 | "container_info" : { 50 | "post_install_tip" : "$POST_INSTAL_TEXT$", 51 | "container_id" : "$OLD_SCRIPT_ID$", 52 | "container_version" : "0" 53 | }, 54 | "manifest_version" : 2, 55 | "name" : "$ADDON_NAME$", 56 | "icons" : { 57 | "16" : "script-icon_16.png", 58 | "128" : "script-icon_128.png" 59 | }, 60 | "version" : "0" 61 | } 62 | } 63 | } 64 | ``` 65 | 66 | NOTE: The "manifest" key can be copied from the chrome webstore item, all field will already be correctly filled. 67 | 68 | NOTE: The first publishing must be done manually. 69 | 70 | NOTE: fill the "script_manifest" key with this format: https://developers.google.com/apps-script/concepts/manifests#manifest_structure 71 | 72 | 73 | #### Credential file format: 74 | 75 | Those credentials can be obtained by creating a Google project on the addon used to publish the Addon. 76 | Then following the instructions here: https://developer.chrome.com/webstore/using_webstore_api#beforeyoubegin 77 | Download the json file for the created ClientID and use it to fill the credential file below. 78 | 79 | More information on the webstore API used: https://www.npmjs.com/package/webstore-upload 80 | 81 | /build/config/$CONFiG_NAME$_config.json 82 | ```json 83 | { 84 | "$ACCOUNT_NAME_FOR_WEBSTORE_CREDENTIAL$": { 85 | "refresh_token": "$REFRESH_TOKEN$", 86 | "installed": { 87 | "client_id": "$CLIENT_ID$", 88 | "client_secret": "$CLIENT_SECRET$" 89 | } 90 | }, 91 | "$ANOTHER_ACCOUNT_NAME_FOR_WEBSTORE_CREDENTIAL$": "{...}" 92 | } 93 | ``` 94 | NOTE: The first code obtain when executing the procedure to obtain the refresh_token is NOT the refresh_token, it's a authorizatin code (starting by "4/") 95 | 96 | The refresh_token usualy starts by "1/" and is obtained by exchanging the auth code. All the procedure on this page must be followed until the end: https://developer.chrome.com/webstore/using_webstore_api#beforeyoubegin 97 | 98 | 99 | * Test instructions 100 | 101 | 1. Publish -> Test as add-on (non-triggerable functionalities) 102 | 2. Publish -> Publish as add-on with permission to people with link (for triggable functionalities) 103 | 3. If the status of the add-on gets stuck on "Pending Review" status when publishing publicly, then try to contact google using this [link](https://support.google.com/chrome_webstore/contact/developer_support) 104 | 4. When changing scopes of the add-on you might need to submit OAuth clientId using this [form](https://support.google.com/code/contact/oauth_app_verification) -------------------------------------------------------------------------------- /addon_webstore/background.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/faresd/google-apps-script_travis-ci/b40693be6bd7cd7d6e01ffeae50cb19818c13e84/addon_webstore/background.js -------------------------------------------------------------------------------- /addon_webstore/manifest.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /addon_webstore/script-icon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/faresd/google-apps-script_travis-ci/b40693be6bd7cd7d6e01ffeae50cb19818c13e84/addon_webstore/script-icon_128.png -------------------------------------------------------------------------------- /addon_webstore/script-icon_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/faresd/google-apps-script_travis-ci/b40693be6bd7cd7d6e01ffeae50cb19818c13e84/addon_webstore/script-icon_16.png -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e 4 | 5 | npm i @google/clasp -g 6 | grunt clasp_cred --env=$ENV --clasp_refresh_token=$CLASP_REFRESH_TOKEN 7 | cp .clasprc.json ~/.clasprc.json 8 | grunt publishAddon --env=$ENV --ws_client_id=$CLIENT_ID --ws_client_secret=$CLIENT_SECRET --ws_refresh_token=$REFRESH_TOKEN --last_commit=$TRAVIS_COMMIT --webstore_target=$PUBLISH_TARGET 9 | -------------------------------------------------------------------------------- /environment/defaultConfig.js: -------------------------------------------------------------------------------- 1 | // Global variables what will be merged with environment variables when building. -------------------------------------------------------------------------------- /environment/dev/config.js: -------------------------------------------------------------------------------- 1 | // Environment variables that will be merged with defaultConfig and generates config.js file. -------------------------------------------------------------------------------- /environment/dev/deployment_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "clasp": { 3 | "scriptId": "Get this from your Apps Script project (file/Project properties / Script ID)" 4 | }, 5 | "script_manifest": { 6 | }, 7 | "publishing": { 8 | "version": null, 9 | "versionOffset": 1, 10 | "appID": "Chrome webstore item Id", 11 | "publish": true, 12 | "manifest": { 13 | "update_url" : "https://clients2.google.com/service/update2/crx", 14 | "container" : ["GOOGLE_SPREADSHEET"], 15 | "app" : { 16 | "background" : { 17 | "scripts" : ["background.js"] 18 | } 19 | }, 20 | "api_console_project_id" : "Get this from main.crx manifest", 21 | "container_info" : { 22 | "post_install_tip" : "Post install tip", 23 | "container_id" : "Get this from main.crx manifest", 24 | "container_version" : "Get this from main.crx manifest" 25 | }, 26 | "manifest_version" : 2, 27 | "name" : "[DEV] Name of the add-on", 28 | "icons" : { 29 | "16" : "script-icon_16.png", 30 | "128" : "script-icon_128.png" 31 | }, 32 | "version" : "0" 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /environment/production/config.js: -------------------------------------------------------------------------------- 1 | // Environment variables that will be merged with defaultConfig and generates config.js file. -------------------------------------------------------------------------------- /environment/production/deployment_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "clasp": { 3 | "scriptId": "Get this from your Apps Script project (file / Project properties / Script ID)" 4 | }, 5 | "script_manifest": {} 6 | } -------------------------------------------------------------------------------- /environment/staging/config.js: -------------------------------------------------------------------------------- 1 | // Environment variables that will be merged with defaultConfig and generates config.js file. -------------------------------------------------------------------------------- /environment/staging/deployment_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "clasp": { 3 | "scriptId": "Get this from your Apps Script project (file/Project properties / Script ID)" 4 | }, 5 | "script_manifest": { 6 | }, 7 | "publishing": { 8 | "version": null, 9 | "versionOffset": 1, 10 | "appID": "Chrome webstore item Id", 11 | "publish": true, 12 | "manifest": { 13 | "update_url" : "https://clients2.google.com/service/update2/crx", 14 | "container" : ["GOOGLE_SPREADSHEET"], 15 | "app" : { 16 | "background" : { 17 | "scripts" : ["background.js"] 18 | } 19 | }, 20 | "api_console_project_id" : "Get this from main.crx manifest", 21 | "container_info" : { 22 | "post_install_tip" : "Post install tip", 23 | "container_id" : "Get this from main.crx manifest", 24 | "container_version" : "Get this from main.crx manifest" 25 | }, 26 | "manifest_version" : 2, 27 | "name" : "[STAGING] Name of the add-on", 28 | "icons" : { 29 | "16" : "script-icon_16.png", 30 | "128" : "script-icon_128.png" 31 | }, 32 | "version" : "0" 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /google.script.run.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This file exist to provide auto-completion and linking between Server side code and Client side code in Apps Script 3 | * 4 | * Add all functions callable from client side to the google.script.run prototype 5 | */ 6 | 7 | 8 | // 9 | 10 | GoogleScriptRun = function () {}; 11 | // NEVER DO THAT in normal code, this overwrite the prototype, here we do this of auto-completion only 12 | GoogleScriptRun.prototype = { 13 | // PLACE HERE your function called from Sidebar/Modale to keep the link 14 | // onInstall: onInstall, 15 | onOpen: onOpen, 16 | 17 | }; 18 | 19 | 20 | // 21 | 22 | /** 23 | * @param {function} successHandler 24 | * @return {GoogleScriptRun} 25 | */ 26 | GoogleScriptRun.prototype.withSuccessHandler = function (successHandler) { 27 | successHandler(); 28 | return this; 29 | }; 30 | /** 31 | * @param {function} failureHandler 32 | * @return {GoogleScriptRun} 33 | */ 34 | GoogleScriptRun.prototype.withFailureHandler = function (failureHandler) { 35 | failureHandler(); 36 | return this; 37 | }; 38 | 39 | // noinspection ES6ConvertVarToLetConst 40 | var google = { 41 | script: { 42 | run: new GoogleScriptRun() 43 | } 44 | }; 45 | 46 | // 47 | 48 | // 49 | 50 | 51 | // 52 | 53 | 54 | /** 55 | * @function google.picker.PickerBuilder 56 | * @constructor 57 | * 58 | * NOTE: API is not completely described 59 | * see here for full list (https://developers.google.com/picker/docs/reference#PickerBuilder) 60 | * 61 | * @return PickerBuilder 62 | */ 63 | /** 64 | * @function PickerBuilder.prototype.setDeveloperKey 65 | * 66 | * @param {string} developerKey 67 | * @return PickerBuilder 68 | */ 69 | /** 70 | * @function PickerBuilder.prototype.setOAuthToken 71 | * 72 | * @param {string} token 73 | * @return PickerBuilder 74 | */ 75 | /** 76 | * @function PickerBuilder.prototype.setOrigin 77 | * 78 | * @param {string} origin 79 | * @return PickerBuilder 80 | */ 81 | /** 82 | * @function PickerBuilder.prototype.setCallback 83 | * 84 | * @param {function} callBack 85 | * @return PickerBuilder 86 | */ 87 | /** 88 | * @function PickerBuilder.prototype.setTitle 89 | * 90 | * @param {string} title 91 | * @return PickerBuilder 92 | */ 93 | /** 94 | * @function PickerBuilder.prototype.setSize 95 | * 96 | * @param {number} width 97 | * @param {number} height 98 | * @return PickerBuilder 99 | */ 100 | /** 101 | * @function PickerBuilder.prototype.addView 102 | * 103 | * @param {google.picker.View || google.picker.ViewId} view 104 | * @return PickerBuilder 105 | */ 106 | /** 107 | * @function PickerBuilder.prototype.enableFeature 108 | * 109 | * @param {google.picker.Feature} feature 110 | * @return PickerBuilder 111 | */ 112 | /** 113 | * @function PickerBuilder.prototype.hideTitleBar 114 | * 115 | * @return {PickerBuilder} 116 | */ 117 | /** 118 | * @function PickerBuilder.prototype.build 119 | * 120 | * @return {Picker} 121 | */ 122 | 123 | /** 124 | * @function google.picker.View 125 | * @constructor 126 | * 127 | * @param {google.picker.ViewId} viewId 128 | * 129 | * @return google.picker.View 130 | */ 131 | /** 132 | * @function google.picker.View.prototype.getId 133 | * Returns the ViewId for this view. 134 | * 135 | * @return {string} 136 | */ 137 | /** 138 | * @function google.picker.View.prototype.setMimeTypes 139 | * 140 | * @param {string} mimeTypes 141 | */ 142 | /** 143 | * @function google.picker.View.prototype.setQuery 144 | * 145 | * @param {string} query 146 | */ 147 | 148 | 149 | /** 150 | * @typedef {{}} Picker 151 | */ 152 | /** 153 | * @function Picker.prototype.setVisible 154 | * 155 | * @param {boolean} isVisible 156 | */ 157 | /** 158 | * @function Picker.prototype.dispose 159 | */ 160 | 161 | /** 162 | * @function google.picker.DocsView 163 | * @constructor 164 | * 165 | * @param {google.picker.ViewId} [viewId] 166 | * 167 | * @return DocsView 168 | */ 169 | /** 170 | * @function DocsView.prototype.setIncludeFolders 171 | * 172 | * @param {boolean} includeFolders 173 | * @return DocsView 174 | */ 175 | /** 176 | * @function DocsView.prototype.setEnableTeamDrives 177 | * 178 | * @param {boolean} enableTeamDrives 179 | * @return DocsView 180 | */ 181 | /** 182 | * @function DocsView.prototype.setSelectFolderEnabled 183 | * 184 | * @param {boolean} enableSelectFolder 185 | * @return DocsView 186 | */ 187 | /** 188 | * @function DocsView.prototype.setMode 189 | * 190 | * @param {google.picker.DocsViewMode} mode 191 | * @return DocsView 192 | */ 193 | /** 194 | * @function DocsView.prototype.setOwnedByMe 195 | * 196 | * @param {boolean} ownedByMe 197 | * @return DocsView 198 | */ 199 | /** 200 | * @function DocsView.prototype.setParent 201 | * 202 | * @param {string} parent 203 | * @return DocsView 204 | */ 205 | /** 206 | * @function DocsView.prototype.setStarred 207 | * 208 | * @param {boolean} starred 209 | * @return DocsView 210 | */ 211 | 212 | 213 | /** 214 | * google.picker 215 | * 216 | * @typedef {{ 217 | * Action: { 218 | * PICKED, 219 | * CANCEL, 220 | * LOADED, 221 | * }, 222 | * DocsViewMode: { 223 | * GRID, 224 | * LIST, 225 | * }, 226 | * ViewId: { 227 | * DOCS, 228 | * DOCS_IMAGES, 229 | * DOCS_IMAGES_AND_VIDEOS, 230 | * DOCS_VIDEOS, 231 | * DOCUMENTS, 232 | * DRAWINGS, 233 | * FOLDERS, 234 | * FORMS, 235 | * IMAGE_SEARCH, 236 | * PDFS, 237 | * PHOTO_ALBUMS, 238 | * PHOTO_UPLOAD, 239 | * PHOTOS, 240 | * PRESENTATIONS, 241 | * RECENTLY_PICKED, 242 | * SPREADSHEETS, 243 | * VIDEO_SEARCH, 244 | * WEBCAM, 245 | * YOUTUBE, 246 | * }, 247 | * Feature: { 248 | * NAV_HIDDEN, 249 | * MINE_ONLY, 250 | * MULTISELECT_ENABLED, 251 | * SIMPLE_UPLOAD_ENABLED, 252 | * SUPPORT_TEAM_DRIVES, 253 | * }, 254 | * Document: { 255 | * ADDRESS_LINES, 256 | * AUDIENCE, 257 | * DESCRIPTION, 258 | * DURATION, 259 | * EMBEDDABLE_URL, 260 | * ICON_URL, 261 | * ID, 262 | * IS_NEW, 263 | * LAST_EDITED_UTC, 264 | * LATITUDE, 265 | * LONGITUDE, 266 | * MIME_TYPE, 267 | * NAME, 268 | * NUM_CHILDREN, 269 | * PARENT_ID, 270 | * PHONE_NUMBERS, 271 | * SERVICE_ID, 272 | * THUMBNAILS, 273 | * TYPE, 274 | * URL, 275 | * }, 276 | * Response: { 277 | * ACTION, 278 | * DOCUMENTS, 279 | * PARENTS, 280 | * VIEW, 281 | * } 282 | * }} google.picker 283 | */ 284 | 285 | 286 | // 287 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "GAS-shell", 3 | "version": "0.0.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abbrev": { 8 | "version": "1.1.1", 9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 10 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 11 | "dev": true 12 | }, 13 | "ajv": { 14 | "version": "5.5.2", 15 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 16 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 17 | "dev": true, 18 | "requires": { 19 | "co": "4.6.0", 20 | "fast-deep-equal": "1.1.0", 21 | "fast-json-stable-stringify": "2.0.0", 22 | "json-schema-traverse": "0.3.1" 23 | } 24 | }, 25 | "ansi-regex": { 26 | "version": "2.1.1", 27 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 28 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 29 | "dev": true 30 | }, 31 | "ansi-styles": { 32 | "version": "2.2.1", 33 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 34 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 35 | "dev": true 36 | }, 37 | "aproba": { 38 | "version": "1.2.0", 39 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 40 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", 41 | "dev": true 42 | }, 43 | "archiver": { 44 | "version": "1.3.0", 45 | "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", 46 | "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=", 47 | "dev": true, 48 | "requires": { 49 | "archiver-utils": "1.3.0", 50 | "async": "2.6.0", 51 | "buffer-crc32": "0.2.13", 52 | "glob": "7.0.6", 53 | "lodash": "4.17.5", 54 | "readable-stream": "2.3.4", 55 | "tar-stream": "1.5.5", 56 | "walkdir": "0.0.11", 57 | "zip-stream": "1.2.0" 58 | }, 59 | "dependencies": { 60 | "async": { 61 | "version": "2.6.0", 62 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", 63 | "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", 64 | "dev": true, 65 | "requires": { 66 | "lodash": "4.17.5" 67 | } 68 | }, 69 | "lodash": { 70 | "version": "4.17.5", 71 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", 72 | "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", 73 | "dev": true 74 | } 75 | } 76 | }, 77 | "archiver-utils": { 78 | "version": "1.3.0", 79 | "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", 80 | "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", 81 | "dev": true, 82 | "requires": { 83 | "glob": "7.0.6", 84 | "graceful-fs": "4.1.11", 85 | "lazystream": "1.0.0", 86 | "lodash": "4.17.5", 87 | "normalize-path": "2.1.1", 88 | "readable-stream": "2.3.4" 89 | }, 90 | "dependencies": { 91 | "lodash": { 92 | "version": "4.17.5", 93 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", 94 | "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", 95 | "dev": true 96 | } 97 | } 98 | }, 99 | "are-we-there-yet": { 100 | "version": "1.1.4", 101 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", 102 | "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", 103 | "dev": true, 104 | "requires": { 105 | "delegates": "1.0.0", 106 | "readable-stream": "2.3.4" 107 | } 108 | }, 109 | "argparse": { 110 | "version": "1.0.10", 111 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 112 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 113 | "dev": true, 114 | "requires": { 115 | "sprintf-js": "1.0.3" 116 | } 117 | }, 118 | "array-find-index": { 119 | "version": "1.0.2", 120 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", 121 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", 122 | "dev": true 123 | }, 124 | "asn1": { 125 | "version": "0.2.3", 126 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 127 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", 128 | "dev": true 129 | }, 130 | "assert-plus": { 131 | "version": "1.0.0", 132 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 133 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 134 | "dev": true 135 | }, 136 | "async": { 137 | "version": "1.5.2", 138 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 139 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", 140 | "dev": true 141 | }, 142 | "asynckit": { 143 | "version": "0.4.0", 144 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 145 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 146 | "dev": true 147 | }, 148 | "aws-sign2": { 149 | "version": "0.7.0", 150 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 151 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 152 | "dev": true 153 | }, 154 | "aws4": { 155 | "version": "1.6.0", 156 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", 157 | "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", 158 | "dev": true 159 | }, 160 | "balanced-match": { 161 | "version": "1.0.0", 162 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 163 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 164 | "dev": true 165 | }, 166 | "bcrypt-pbkdf": { 167 | "version": "1.0.1", 168 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 169 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", 170 | "dev": true, 171 | "optional": true, 172 | "requires": { 173 | "tweetnacl": "0.14.5" 174 | } 175 | }, 176 | "bl": { 177 | "version": "1.2.1", 178 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", 179 | "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", 180 | "dev": true, 181 | "requires": { 182 | "readable-stream": "2.3.4" 183 | } 184 | }, 185 | "block-stream": { 186 | "version": "0.0.9", 187 | "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", 188 | "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", 189 | "dev": true, 190 | "optional": true, 191 | "requires": { 192 | "inherits": "2.0.3" 193 | } 194 | }, 195 | "bluebird": { 196 | "version": "2.11.0", 197 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", 198 | "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", 199 | "dev": true 200 | }, 201 | "boom": { 202 | "version": "4.3.1", 203 | "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", 204 | "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", 205 | "dev": true, 206 | "requires": { 207 | "hoek": "4.2.1" 208 | } 209 | }, 210 | "brace-expansion": { 211 | "version": "1.1.11", 212 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 213 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 214 | "dev": true, 215 | "requires": { 216 | "balanced-match": "1.0.0", 217 | "concat-map": "0.0.1" 218 | } 219 | }, 220 | "buffer-crc32": { 221 | "version": "0.2.13", 222 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 223 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", 224 | "dev": true 225 | }, 226 | "builtin-modules": { 227 | "version": "1.1.1", 228 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 229 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 230 | "dev": true 231 | }, 232 | "camelcase": { 233 | "version": "2.1.1", 234 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 235 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", 236 | "dev": true 237 | }, 238 | "camelcase-keys": { 239 | "version": "2.1.0", 240 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", 241 | "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", 242 | "dev": true, 243 | "requires": { 244 | "camelcase": "2.1.1", 245 | "map-obj": "1.0.1" 246 | } 247 | }, 248 | "caseless": { 249 | "version": "0.12.0", 250 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 251 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 252 | "dev": true 253 | }, 254 | "chalk": { 255 | "version": "1.1.3", 256 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 257 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 258 | "dev": true, 259 | "requires": { 260 | "ansi-styles": "2.2.1", 261 | "escape-string-regexp": "1.0.5", 262 | "has-ansi": "2.0.0", 263 | "strip-ansi": "3.0.1", 264 | "supports-color": "2.0.0" 265 | } 266 | }, 267 | "chownr": { 268 | "version": "1.0.1", 269 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", 270 | "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", 271 | "dev": true, 272 | "optional": true 273 | }, 274 | "co": { 275 | "version": "4.6.0", 276 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 277 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 278 | "dev": true 279 | }, 280 | "code-point-at": { 281 | "version": "1.1.0", 282 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 283 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", 284 | "dev": true 285 | }, 286 | "coffeescript": { 287 | "version": "1.10.0", 288 | "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz", 289 | "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=", 290 | "dev": true 291 | }, 292 | "colors": { 293 | "version": "1.1.2", 294 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", 295 | "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", 296 | "dev": true 297 | }, 298 | "combined-stream": { 299 | "version": "1.0.6", 300 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", 301 | "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", 302 | "dev": true, 303 | "requires": { 304 | "delayed-stream": "1.0.0" 305 | } 306 | }, 307 | "compress-commons": { 308 | "version": "1.2.2", 309 | "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", 310 | "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", 311 | "dev": true, 312 | "requires": { 313 | "buffer-crc32": "0.2.13", 314 | "crc32-stream": "2.0.0", 315 | "normalize-path": "2.1.1", 316 | "readable-stream": "2.3.4" 317 | } 318 | }, 319 | "concat-map": { 320 | "version": "0.0.1", 321 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 322 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 323 | "dev": true 324 | }, 325 | "concat-stream": { 326 | "version": "1.6.0", 327 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", 328 | "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", 329 | "dev": true, 330 | "requires": { 331 | "inherits": "2.0.3", 332 | "readable-stream": "2.3.4", 333 | "typedarray": "0.0.6" 334 | } 335 | }, 336 | "console-control-strings": { 337 | "version": "1.1.0", 338 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 339 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", 340 | "dev": true 341 | }, 342 | "core-js": { 343 | "version": "2.3.0", 344 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", 345 | "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", 346 | "dev": true 347 | }, 348 | "core-util-is": { 349 | "version": "1.0.2", 350 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 351 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 352 | "dev": true 353 | }, 354 | "crc": { 355 | "version": "3.5.0", 356 | "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz", 357 | "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=", 358 | "dev": true 359 | }, 360 | "crc32-stream": { 361 | "version": "2.0.0", 362 | "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", 363 | "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", 364 | "dev": true, 365 | "requires": { 366 | "crc": "3.5.0", 367 | "readable-stream": "2.3.4" 368 | } 369 | }, 370 | "cryptiles": { 371 | "version": "3.1.2", 372 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", 373 | "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", 374 | "dev": true, 375 | "requires": { 376 | "boom": "5.2.0" 377 | }, 378 | "dependencies": { 379 | "boom": { 380 | "version": "5.2.0", 381 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", 382 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", 383 | "dev": true, 384 | "requires": { 385 | "hoek": "4.2.1" 386 | } 387 | } 388 | } 389 | }, 390 | "currently-unhandled": { 391 | "version": "0.4.1", 392 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", 393 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", 394 | "dev": true, 395 | "requires": { 396 | "array-find-index": "1.0.2" 397 | } 398 | }, 399 | "dashdash": { 400 | "version": "1.14.1", 401 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 402 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 403 | "dev": true, 404 | "requires": { 405 | "assert-plus": "1.0.0" 406 | } 407 | }, 408 | "dateformat": { 409 | "version": "1.0.12", 410 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", 411 | "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", 412 | "dev": true, 413 | "requires": { 414 | "get-stdin": "4.0.1", 415 | "meow": "3.7.0" 416 | } 417 | }, 418 | "debug": { 419 | "version": "2.6.9", 420 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 421 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 422 | "dev": true, 423 | "requires": { 424 | "ms": "2.0.0" 425 | } 426 | }, 427 | "decamelize": { 428 | "version": "1.2.0", 429 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 430 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 431 | "dev": true 432 | }, 433 | "decompress-response": { 434 | "version": "3.3.0", 435 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 436 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 437 | "dev": true, 438 | "optional": true, 439 | "requires": { 440 | "mimic-response": "1.0.0" 441 | } 442 | }, 443 | "deep-extend": { 444 | "version": "0.4.2", 445 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", 446 | "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", 447 | "dev": true, 448 | "optional": true 449 | }, 450 | "delayed-stream": { 451 | "version": "1.0.0", 452 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 453 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 454 | "dev": true 455 | }, 456 | "delegates": { 457 | "version": "1.0.0", 458 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 459 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", 460 | "dev": true 461 | }, 462 | "detect-libc": { 463 | "version": "0.2.0", 464 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-0.2.0.tgz", 465 | "integrity": "sha1-R/31ZzSKF+wl/L8LnkRjSKdvn7U=", 466 | "dev": true, 467 | "optional": true 468 | }, 469 | "ecc-jsbn": { 470 | "version": "0.1.1", 471 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 472 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 473 | "dev": true, 474 | "optional": true, 475 | "requires": { 476 | "jsbn": "0.1.1" 477 | } 478 | }, 479 | "end-of-stream": { 480 | "version": "1.4.1", 481 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 482 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 483 | "dev": true, 484 | "requires": { 485 | "once": "1.4.0" 486 | } 487 | }, 488 | "error-ex": { 489 | "version": "1.3.1", 490 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", 491 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", 492 | "dev": true, 493 | "requires": { 494 | "is-arrayish": "0.2.1" 495 | } 496 | }, 497 | "es6-promise": { 498 | "version": "4.2.4", 499 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", 500 | "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", 501 | "dev": true 502 | }, 503 | "escape-string-regexp": { 504 | "version": "1.0.5", 505 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 506 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 507 | "dev": true 508 | }, 509 | "esprima": { 510 | "version": "2.7.3", 511 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", 512 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", 513 | "dev": true 514 | }, 515 | "eventemitter2": { 516 | "version": "0.4.14", 517 | "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", 518 | "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", 519 | "dev": true 520 | }, 521 | "exit": { 522 | "version": "0.1.2", 523 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 524 | "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", 525 | "dev": true 526 | }, 527 | "expand-template": { 528 | "version": "1.1.0", 529 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.0.tgz", 530 | "integrity": "sha512-kkjwkMqj0h4w/sb32ERCDxCQkREMCAgS39DscDnSwDsbxnwwM1BTZySdC3Bn1lhY7vL08n9GoO/fVTynjDgRyQ==", 531 | "dev": true, 532 | "optional": true 533 | }, 534 | "extend": { 535 | "version": "3.0.1", 536 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", 537 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", 538 | "dev": true 539 | }, 540 | "extract-zip": { 541 | "version": "1.6.6", 542 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz", 543 | "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=", 544 | "dev": true, 545 | "requires": { 546 | "concat-stream": "1.6.0", 547 | "debug": "2.6.9", 548 | "mkdirp": "0.5.0", 549 | "yauzl": "2.4.1" 550 | }, 551 | "dependencies": { 552 | "minimist": { 553 | "version": "0.0.8", 554 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 555 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 556 | "dev": true 557 | }, 558 | "mkdirp": { 559 | "version": "0.5.0", 560 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", 561 | "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", 562 | "dev": true, 563 | "requires": { 564 | "minimist": "0.0.8" 565 | } 566 | } 567 | } 568 | }, 569 | "extsprintf": { 570 | "version": "1.3.0", 571 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 572 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 573 | "dev": true 574 | }, 575 | "fast-deep-equal": { 576 | "version": "1.1.0", 577 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 578 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", 579 | "dev": true 580 | }, 581 | "fast-json-stable-stringify": { 582 | "version": "2.0.0", 583 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 584 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 585 | "dev": true 586 | }, 587 | "fd-slicer": { 588 | "version": "1.0.1", 589 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", 590 | "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", 591 | "dev": true, 592 | "requires": { 593 | "pend": "1.2.0" 594 | } 595 | }, 596 | "file-sync-cmp": { 597 | "version": "0.1.1", 598 | "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", 599 | "integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=", 600 | "dev": true 601 | }, 602 | "find-up": { 603 | "version": "1.1.2", 604 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 605 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 606 | "dev": true, 607 | "requires": { 608 | "path-exists": "2.1.0", 609 | "pinkie-promise": "2.0.1" 610 | } 611 | }, 612 | "findup-sync": { 613 | "version": "0.3.0", 614 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", 615 | "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", 616 | "dev": true, 617 | "requires": { 618 | "glob": "5.0.15" 619 | }, 620 | "dependencies": { 621 | "glob": { 622 | "version": "5.0.15", 623 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 624 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 625 | "dev": true, 626 | "requires": { 627 | "inflight": "1.0.6", 628 | "inherits": "2.0.3", 629 | "minimatch": "3.0.4", 630 | "once": "1.4.0", 631 | "path-is-absolute": "1.0.1" 632 | } 633 | } 634 | } 635 | }, 636 | "forever-agent": { 637 | "version": "0.6.1", 638 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 639 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 640 | "dev": true 641 | }, 642 | "form-data": { 643 | "version": "2.3.2", 644 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", 645 | "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", 646 | "dev": true, 647 | "requires": { 648 | "asynckit": "0.4.0", 649 | "combined-stream": "1.0.6", 650 | "mime-types": "2.1.18" 651 | } 652 | }, 653 | "fs-extra": { 654 | "version": "1.0.0", 655 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", 656 | "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", 657 | "dev": true, 658 | "requires": { 659 | "graceful-fs": "4.1.11", 660 | "jsonfile": "2.4.0", 661 | "klaw": "1.3.1" 662 | } 663 | }, 664 | "fs.realpath": { 665 | "version": "1.0.0", 666 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 667 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 668 | "dev": true 669 | }, 670 | "fstream": { 671 | "version": "1.0.11", 672 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", 673 | "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", 674 | "dev": true, 675 | "requires": { 676 | "graceful-fs": "4.1.11", 677 | "inherits": "2.0.3", 678 | "mkdirp": "0.5.1", 679 | "rimraf": "2.2.8" 680 | } 681 | }, 682 | "gas-lib": { 683 | "version": "1.2.0", 684 | "resolved": "https://registry.npmjs.org/gas-lib/-/gas-lib-1.2.0.tgz", 685 | "integrity": "sha512-A3mhGkgTdb/tY+WE2a4YTYrMvJb8zPWjCyeYxE4elA+9s1GmfCNp89L56GbkgeVPPZjhCq057mhoTmPh7VpcAQ==", 686 | "dev": true 687 | }, 688 | "gauge": { 689 | "version": "2.7.4", 690 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 691 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 692 | "dev": true, 693 | "requires": { 694 | "aproba": "1.2.0", 695 | "console-control-strings": "1.1.0", 696 | "has-unicode": "2.0.1", 697 | "object-assign": "4.1.1", 698 | "signal-exit": "3.0.2", 699 | "string-width": "1.0.2", 700 | "strip-ansi": "3.0.1", 701 | "wide-align": "1.1.2" 702 | } 703 | }, 704 | "get-stdin": { 705 | "version": "4.0.1", 706 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", 707 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", 708 | "dev": true 709 | }, 710 | "getobject": { 711 | "version": "0.1.0", 712 | "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", 713 | "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", 714 | "dev": true 715 | }, 716 | "getpass": { 717 | "version": "0.1.7", 718 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 719 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 720 | "dev": true, 721 | "requires": { 722 | "assert-plus": "1.0.0" 723 | } 724 | }, 725 | "github-from-package": { 726 | "version": "0.0.0", 727 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 728 | "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", 729 | "dev": true, 730 | "optional": true 731 | }, 732 | "glob": { 733 | "version": "7.0.6", 734 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", 735 | "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", 736 | "dev": true, 737 | "requires": { 738 | "fs.realpath": "1.0.0", 739 | "inflight": "1.0.6", 740 | "inherits": "2.0.3", 741 | "minimatch": "3.0.4", 742 | "once": "1.4.0", 743 | "path-is-absolute": "1.0.1" 744 | } 745 | }, 746 | "graceful-fs": { 747 | "version": "4.1.11", 748 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 749 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 750 | "dev": true 751 | }, 752 | "grunt": { 753 | "version": "1.0.2", 754 | "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.2.tgz", 755 | "integrity": "sha1-TmpeaVtwRy/VME9fqeNCNoNqc7w=", 756 | "dev": true, 757 | "requires": { 758 | "coffeescript": "1.10.0", 759 | "dateformat": "1.0.12", 760 | "eventemitter2": "0.4.14", 761 | "exit": "0.1.2", 762 | "findup-sync": "0.3.0", 763 | "glob": "7.0.6", 764 | "grunt-cli": "1.2.0", 765 | "grunt-known-options": "1.1.0", 766 | "grunt-legacy-log": "1.0.0", 767 | "grunt-legacy-util": "1.0.0", 768 | "iconv-lite": "0.4.19", 769 | "js-yaml": "3.5.5", 770 | "minimatch": "3.0.4", 771 | "nopt": "3.0.6", 772 | "path-is-absolute": "1.0.1", 773 | "rimraf": "2.2.8" 774 | } 775 | }, 776 | "grunt-cli": { 777 | "version": "1.2.0", 778 | "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", 779 | "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", 780 | "dev": true, 781 | "requires": { 782 | "findup-sync": "0.3.0", 783 | "grunt-known-options": "1.1.0", 784 | "nopt": "3.0.6", 785 | "resolve": "1.1.7" 786 | } 787 | }, 788 | "grunt-contrib-clean": { 789 | "version": "1.1.0", 790 | "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.1.0.tgz", 791 | "integrity": "sha1-Vkq/LQN4qYOhW54/MO51tzjEBjg=", 792 | "dev": true, 793 | "requires": { 794 | "async": "1.5.2", 795 | "rimraf": "2.6.2" 796 | }, 797 | "dependencies": { 798 | "rimraf": { 799 | "version": "2.6.2", 800 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 801 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 802 | "dev": true, 803 | "requires": { 804 | "glob": "7.0.6" 805 | } 806 | } 807 | } 808 | }, 809 | "grunt-contrib-compress": { 810 | "version": "1.4.3", 811 | "resolved": "https://registry.npmjs.org/grunt-contrib-compress/-/grunt-contrib-compress-1.4.3.tgz", 812 | "integrity": "sha1-Ac7/ucY39S5wgfRjdQmD0KOw+nM=", 813 | "dev": true, 814 | "requires": { 815 | "archiver": "1.3.0", 816 | "chalk": "1.1.3", 817 | "iltorb": "1.3.10", 818 | "lodash": "4.17.5", 819 | "pretty-bytes": "4.0.2", 820 | "stream-buffers": "2.2.0" 821 | }, 822 | "dependencies": { 823 | "lodash": { 824 | "version": "4.17.5", 825 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", 826 | "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", 827 | "dev": true 828 | } 829 | } 830 | }, 831 | "grunt-contrib-concat": { 832 | "version": "1.0.1", 833 | "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-1.0.1.tgz", 834 | "integrity": "sha1-YVCYYwhOhx1+ht5IwBUlntl3Rb0=", 835 | "dev": true, 836 | "requires": { 837 | "chalk": "1.1.3", 838 | "source-map": "0.5.7" 839 | } 840 | }, 841 | "grunt-contrib-copy": { 842 | "version": "1.0.0", 843 | "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", 844 | "integrity": "sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=", 845 | "dev": true, 846 | "requires": { 847 | "chalk": "1.1.3", 848 | "file-sync-cmp": "0.1.1" 849 | } 850 | }, 851 | "grunt-contrib-jasmine": { 852 | "version": "1.1.0", 853 | "resolved": "https://registry.npmjs.org/grunt-contrib-jasmine/-/grunt-contrib-jasmine-1.1.0.tgz", 854 | "integrity": "sha1-9oL3dX2il3Wf4+G0xl1GcMw66kk=", 855 | "dev": true, 856 | "requires": { 857 | "chalk": "1.1.3", 858 | "grunt-lib-phantomjs": "1.1.0", 859 | "jasmine-core": "2.4.1", 860 | "lodash": "2.4.2", 861 | "rimraf": "2.2.8", 862 | "sprintf-js": "1.0.3" 863 | }, 864 | "dependencies": { 865 | "lodash": { 866 | "version": "2.4.2", 867 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", 868 | "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", 869 | "dev": true 870 | } 871 | } 872 | }, 873 | "grunt-known-options": { 874 | "version": "1.1.0", 875 | "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", 876 | "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=", 877 | "dev": true 878 | }, 879 | "grunt-legacy-log": { 880 | "version": "1.0.0", 881 | "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.0.tgz", 882 | "integrity": "sha1-+4bxgJhHvAfcR4Q/ns1srLYt8tU=", 883 | "dev": true, 884 | "requires": { 885 | "colors": "1.1.2", 886 | "grunt-legacy-log-utils": "1.0.0", 887 | "hooker": "0.2.3", 888 | "lodash": "3.10.1", 889 | "underscore.string": "3.2.3" 890 | } 891 | }, 892 | "grunt-legacy-log-utils": { 893 | "version": "1.0.0", 894 | "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz", 895 | "integrity": "sha1-p7ji0Ps1taUPSvmG/BEnSevJbz0=", 896 | "dev": true, 897 | "requires": { 898 | "chalk": "1.1.3", 899 | "lodash": "4.3.0" 900 | }, 901 | "dependencies": { 902 | "lodash": { 903 | "version": "4.3.0", 904 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", 905 | "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", 906 | "dev": true 907 | } 908 | } 909 | }, 910 | "grunt-legacy-util": { 911 | "version": "1.0.0", 912 | "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz", 913 | "integrity": "sha1-OGqnjcbtUJhsKxiVcmWxtIq7m4Y=", 914 | "dev": true, 915 | "requires": { 916 | "async": "1.5.2", 917 | "exit": "0.1.2", 918 | "getobject": "0.1.0", 919 | "hooker": "0.2.3", 920 | "lodash": "4.3.0", 921 | "underscore.string": "3.2.3", 922 | "which": "1.2.14" 923 | }, 924 | "dependencies": { 925 | "lodash": { 926 | "version": "4.3.0", 927 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", 928 | "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", 929 | "dev": true 930 | } 931 | } 932 | }, 933 | "grunt-lib-phantomjs": { 934 | "version": "1.1.0", 935 | "resolved": "https://registry.npmjs.org/grunt-lib-phantomjs/-/grunt-lib-phantomjs-1.1.0.tgz", 936 | "integrity": "sha1-np7c3Z/S3UDgwYHJQ3HVcqpe6tI=", 937 | "dev": true, 938 | "requires": { 939 | "eventemitter2": "0.4.14", 940 | "phantomjs-prebuilt": "2.1.16", 941 | "rimraf": "2.6.2", 942 | "semver": "5.5.0", 943 | "temporary": "0.0.8" 944 | }, 945 | "dependencies": { 946 | "rimraf": { 947 | "version": "2.6.2", 948 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 949 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 950 | "dev": true, 951 | "requires": { 952 | "glob": "7.0.6" 953 | } 954 | } 955 | } 956 | }, 957 | "har-schema": { 958 | "version": "2.0.0", 959 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 960 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 961 | "dev": true 962 | }, 963 | "har-validator": { 964 | "version": "5.0.3", 965 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", 966 | "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", 967 | "dev": true, 968 | "requires": { 969 | "ajv": "5.5.2", 970 | "har-schema": "2.0.0" 971 | } 972 | }, 973 | "has-ansi": { 974 | "version": "2.0.0", 975 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 976 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 977 | "dev": true, 978 | "requires": { 979 | "ansi-regex": "2.1.1" 980 | } 981 | }, 982 | "has-unicode": { 983 | "version": "2.0.1", 984 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 985 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", 986 | "dev": true 987 | }, 988 | "hasha": { 989 | "version": "2.2.0", 990 | "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", 991 | "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", 992 | "dev": true, 993 | "requires": { 994 | "is-stream": "1.1.0", 995 | "pinkie-promise": "2.0.1" 996 | } 997 | }, 998 | "hawk": { 999 | "version": "6.0.2", 1000 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", 1001 | "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", 1002 | "dev": true, 1003 | "requires": { 1004 | "boom": "4.3.1", 1005 | "cryptiles": "3.1.2", 1006 | "hoek": "4.2.1", 1007 | "sntp": "2.1.0" 1008 | } 1009 | }, 1010 | "hoek": { 1011 | "version": "4.2.1", 1012 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", 1013 | "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", 1014 | "dev": true 1015 | }, 1016 | "hooker": { 1017 | "version": "0.2.3", 1018 | "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", 1019 | "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", 1020 | "dev": true 1021 | }, 1022 | "hosted-git-info": { 1023 | "version": "2.5.0", 1024 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", 1025 | "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", 1026 | "dev": true 1027 | }, 1028 | "http-signature": { 1029 | "version": "1.2.0", 1030 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 1031 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 1032 | "dev": true, 1033 | "requires": { 1034 | "assert-plus": "1.0.0", 1035 | "jsprim": "1.4.1", 1036 | "sshpk": "1.13.1" 1037 | } 1038 | }, 1039 | "iconv-lite": { 1040 | "version": "0.4.19", 1041 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 1042 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", 1043 | "dev": true 1044 | }, 1045 | "iltorb": { 1046 | "version": "1.3.10", 1047 | "resolved": "https://registry.npmjs.org/iltorb/-/iltorb-1.3.10.tgz", 1048 | "integrity": "sha512-nyB4+ru1u8CQqQ6w7YjasboKN3NQTN8GH/V/eEssNRKhW6UbdxdWhB9fJ5EEdjJfezKY0qPrcwLyIcgjL8hHxA==", 1049 | "dev": true, 1050 | "optional": true, 1051 | "requires": { 1052 | "detect-libc": "0.2.0", 1053 | "nan": "2.9.2", 1054 | "node-gyp": "3.6.2", 1055 | "prebuild-install": "2.5.1" 1056 | } 1057 | }, 1058 | "immediate": { 1059 | "version": "3.0.6", 1060 | "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", 1061 | "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", 1062 | "dev": true 1063 | }, 1064 | "indent-string": { 1065 | "version": "2.1.0", 1066 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", 1067 | "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", 1068 | "dev": true, 1069 | "requires": { 1070 | "repeating": "2.0.1" 1071 | } 1072 | }, 1073 | "inflight": { 1074 | "version": "1.0.6", 1075 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1076 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1077 | "dev": true, 1078 | "requires": { 1079 | "once": "1.4.0", 1080 | "wrappy": "1.0.2" 1081 | } 1082 | }, 1083 | "inherits": { 1084 | "version": "2.0.3", 1085 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1086 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 1087 | "dev": true 1088 | }, 1089 | "ini": { 1090 | "version": "1.3.5", 1091 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 1092 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 1093 | "dev": true, 1094 | "optional": true 1095 | }, 1096 | "is-arrayish": { 1097 | "version": "0.2.1", 1098 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1099 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 1100 | "dev": true 1101 | }, 1102 | "is-builtin-module": { 1103 | "version": "1.0.0", 1104 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 1105 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", 1106 | "dev": true, 1107 | "requires": { 1108 | "builtin-modules": "1.1.1" 1109 | } 1110 | }, 1111 | "is-finite": { 1112 | "version": "1.0.2", 1113 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 1114 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 1115 | "dev": true, 1116 | "requires": { 1117 | "number-is-nan": "1.0.1" 1118 | } 1119 | }, 1120 | "is-fullwidth-code-point": { 1121 | "version": "1.0.0", 1122 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1123 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1124 | "dev": true, 1125 | "requires": { 1126 | "number-is-nan": "1.0.1" 1127 | } 1128 | }, 1129 | "is-stream": { 1130 | "version": "1.1.0", 1131 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1132 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 1133 | "dev": true 1134 | }, 1135 | "is-typedarray": { 1136 | "version": "1.0.0", 1137 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1138 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 1139 | "dev": true 1140 | }, 1141 | "is-utf8": { 1142 | "version": "0.2.1", 1143 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 1144 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", 1145 | "dev": true 1146 | }, 1147 | "isarray": { 1148 | "version": "1.0.0", 1149 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1150 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1151 | "dev": true 1152 | }, 1153 | "isexe": { 1154 | "version": "2.0.0", 1155 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1156 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1157 | "dev": true 1158 | }, 1159 | "isstream": { 1160 | "version": "0.1.2", 1161 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1162 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 1163 | "dev": true 1164 | }, 1165 | "jasmine": { 1166 | "version": "2.99.0", 1167 | "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.99.0.tgz", 1168 | "integrity": "sha1-jKctEC5jm4Z8ZImFbg4YqceqQrc=", 1169 | "dev": true, 1170 | "requires": { 1171 | "exit": "0.1.2", 1172 | "glob": "7.0.6", 1173 | "jasmine-core": "2.99.1" 1174 | }, 1175 | "dependencies": { 1176 | "jasmine-core": { 1177 | "version": "2.99.1", 1178 | "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz", 1179 | "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=", 1180 | "dev": true 1181 | } 1182 | } 1183 | }, 1184 | "jasmine-core": { 1185 | "version": "2.4.1", 1186 | "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.4.1.tgz", 1187 | "integrity": "sha1-b4OrOg8WlRcizgfSBsdz1XzIOL4=", 1188 | "dev": true 1189 | }, 1190 | "jit-grunt": { 1191 | "version": "0.10.0", 1192 | "resolved": "https://registry.npmjs.org/jit-grunt/-/jit-grunt-0.10.0.tgz", 1193 | "integrity": "sha1-AIw6f+Hpa9DYTiYOofoXg0V/ecI=", 1194 | "dev": true 1195 | }, 1196 | "js-yaml": { 1197 | "version": "3.5.5", 1198 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz", 1199 | "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=", 1200 | "dev": true, 1201 | "requires": { 1202 | "argparse": "1.0.10", 1203 | "esprima": "2.7.3" 1204 | } 1205 | }, 1206 | "jsbn": { 1207 | "version": "0.1.1", 1208 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1209 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 1210 | "dev": true, 1211 | "optional": true 1212 | }, 1213 | "json-schema": { 1214 | "version": "0.2.3", 1215 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1216 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 1217 | "dev": true 1218 | }, 1219 | "json-schema-traverse": { 1220 | "version": "0.3.1", 1221 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 1222 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", 1223 | "dev": true 1224 | }, 1225 | "json-stringify-safe": { 1226 | "version": "5.0.1", 1227 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1228 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 1229 | "dev": true 1230 | }, 1231 | "jsonfile": { 1232 | "version": "2.4.0", 1233 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", 1234 | "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", 1235 | "dev": true, 1236 | "requires": { 1237 | "graceful-fs": "4.1.11" 1238 | } 1239 | }, 1240 | "jsprim": { 1241 | "version": "1.4.1", 1242 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1243 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1244 | "dev": true, 1245 | "requires": { 1246 | "assert-plus": "1.0.0", 1247 | "extsprintf": "1.3.0", 1248 | "json-schema": "0.2.3", 1249 | "verror": "1.10.0" 1250 | } 1251 | }, 1252 | "jszip": { 1253 | "version": "3.1.5", 1254 | "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", 1255 | "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", 1256 | "dev": true, 1257 | "requires": { 1258 | "core-js": "2.3.0", 1259 | "es6-promise": "3.0.2", 1260 | "lie": "3.1.1", 1261 | "pako": "1.0.6", 1262 | "readable-stream": "2.0.6" 1263 | }, 1264 | "dependencies": { 1265 | "es6-promise": { 1266 | "version": "3.0.2", 1267 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", 1268 | "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", 1269 | "dev": true 1270 | }, 1271 | "process-nextick-args": { 1272 | "version": "1.0.7", 1273 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 1274 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 1275 | "dev": true 1276 | }, 1277 | "readable-stream": { 1278 | "version": "2.0.6", 1279 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", 1280 | "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", 1281 | "dev": true, 1282 | "requires": { 1283 | "core-util-is": "1.0.2", 1284 | "inherits": "2.0.3", 1285 | "isarray": "1.0.0", 1286 | "process-nextick-args": "1.0.7", 1287 | "string_decoder": "0.10.31", 1288 | "util-deprecate": "1.0.2" 1289 | } 1290 | }, 1291 | "string_decoder": { 1292 | "version": "0.10.31", 1293 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1294 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 1295 | "dev": true 1296 | } 1297 | } 1298 | }, 1299 | "kew": { 1300 | "version": "0.7.0", 1301 | "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", 1302 | "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", 1303 | "dev": true 1304 | }, 1305 | "klaw": { 1306 | "version": "1.3.1", 1307 | "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", 1308 | "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", 1309 | "dev": true, 1310 | "requires": { 1311 | "graceful-fs": "4.1.11" 1312 | } 1313 | }, 1314 | "lazystream": { 1315 | "version": "1.0.0", 1316 | "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", 1317 | "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", 1318 | "dev": true, 1319 | "requires": { 1320 | "readable-stream": "2.3.4" 1321 | } 1322 | }, 1323 | "lie": { 1324 | "version": "3.1.1", 1325 | "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", 1326 | "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", 1327 | "dev": true, 1328 | "requires": { 1329 | "immediate": "3.0.6" 1330 | } 1331 | }, 1332 | "load-json-file": { 1333 | "version": "1.1.0", 1334 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", 1335 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", 1336 | "dev": true, 1337 | "requires": { 1338 | "graceful-fs": "4.1.11", 1339 | "parse-json": "2.2.0", 1340 | "pify": "2.3.0", 1341 | "pinkie-promise": "2.0.1", 1342 | "strip-bom": "2.0.0" 1343 | } 1344 | }, 1345 | "lodash": { 1346 | "version": "3.10.1", 1347 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", 1348 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", 1349 | "dev": true 1350 | }, 1351 | "loud-rejection": { 1352 | "version": "1.6.0", 1353 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", 1354 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", 1355 | "dev": true, 1356 | "requires": { 1357 | "currently-unhandled": "0.4.1", 1358 | "signal-exit": "3.0.2" 1359 | } 1360 | }, 1361 | "map-obj": { 1362 | "version": "1.0.1", 1363 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", 1364 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", 1365 | "dev": true 1366 | }, 1367 | "meow": { 1368 | "version": "3.7.0", 1369 | "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", 1370 | "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", 1371 | "dev": true, 1372 | "requires": { 1373 | "camelcase-keys": "2.1.0", 1374 | "decamelize": "1.2.0", 1375 | "loud-rejection": "1.6.0", 1376 | "map-obj": "1.0.1", 1377 | "minimist": "1.2.0", 1378 | "normalize-package-data": "2.4.0", 1379 | "object-assign": "4.1.1", 1380 | "read-pkg-up": "1.0.1", 1381 | "redent": "1.0.0", 1382 | "trim-newlines": "1.0.0" 1383 | } 1384 | }, 1385 | "mime-db": { 1386 | "version": "1.33.0", 1387 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", 1388 | "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", 1389 | "dev": true 1390 | }, 1391 | "mime-types": { 1392 | "version": "2.1.18", 1393 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", 1394 | "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", 1395 | "dev": true, 1396 | "requires": { 1397 | "mime-db": "1.33.0" 1398 | } 1399 | }, 1400 | "mimic-response": { 1401 | "version": "1.0.0", 1402 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", 1403 | "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=", 1404 | "dev": true, 1405 | "optional": true 1406 | }, 1407 | "minimatch": { 1408 | "version": "3.0.4", 1409 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1410 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1411 | "dev": true, 1412 | "requires": { 1413 | "brace-expansion": "1.1.11" 1414 | } 1415 | }, 1416 | "minimist": { 1417 | "version": "1.2.0", 1418 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1419 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 1420 | "dev": true 1421 | }, 1422 | "mkdirp": { 1423 | "version": "0.5.1", 1424 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1425 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1426 | "dev": true, 1427 | "requires": { 1428 | "minimist": "0.0.8" 1429 | }, 1430 | "dependencies": { 1431 | "minimist": { 1432 | "version": "0.0.8", 1433 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1434 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1435 | "dev": true 1436 | } 1437 | } 1438 | }, 1439 | "ms": { 1440 | "version": "2.0.0", 1441 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1442 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1443 | "dev": true 1444 | }, 1445 | "nan": { 1446 | "version": "2.9.2", 1447 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.9.2.tgz", 1448 | "integrity": "sha512-ltW65co7f3PQWBDbqVvaU1WtFJUsNW7sWWm4HINhbMQIyVyzIeyZ8toX5TC5eeooE6piZoaEh4cZkueSKG3KYw==", 1449 | "dev": true, 1450 | "optional": true 1451 | }, 1452 | "node-abi": { 1453 | "version": "2.3.0", 1454 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.3.0.tgz", 1455 | "integrity": "sha512-zwm6vU3SsVgw3e9fu48JBaRBCJGIvAgysDsqtf5+vEexFE71bEOtaMWb5zr/zODZNzTPtQlqUUpC79k68Hspow==", 1456 | "dev": true, 1457 | "optional": true, 1458 | "requires": { 1459 | "semver": "5.5.0" 1460 | } 1461 | }, 1462 | "node-gyp": { 1463 | "version": "3.6.2", 1464 | "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", 1465 | "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", 1466 | "dev": true, 1467 | "optional": true, 1468 | "requires": { 1469 | "fstream": "1.0.11", 1470 | "glob": "7.0.6", 1471 | "graceful-fs": "4.1.11", 1472 | "minimatch": "3.0.4", 1473 | "mkdirp": "0.5.1", 1474 | "nopt": "3.0.6", 1475 | "npmlog": "4.1.2", 1476 | "osenv": "0.1.5", 1477 | "request": "2.83.0", 1478 | "rimraf": "2.2.8", 1479 | "semver": "5.3.0", 1480 | "tar": "2.2.1", 1481 | "which": "1.2.14" 1482 | }, 1483 | "dependencies": { 1484 | "semver": { 1485 | "version": "5.3.0", 1486 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", 1487 | "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", 1488 | "dev": true, 1489 | "optional": true 1490 | } 1491 | } 1492 | }, 1493 | "noop-logger": { 1494 | "version": "0.1.1", 1495 | "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", 1496 | "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", 1497 | "dev": true, 1498 | "optional": true 1499 | }, 1500 | "nopt": { 1501 | "version": "3.0.6", 1502 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 1503 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", 1504 | "dev": true, 1505 | "requires": { 1506 | "abbrev": "1.1.1" 1507 | } 1508 | }, 1509 | "normalize-package-data": { 1510 | "version": "2.4.0", 1511 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", 1512 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", 1513 | "dev": true, 1514 | "requires": { 1515 | "hosted-git-info": "2.5.0", 1516 | "is-builtin-module": "1.0.0", 1517 | "semver": "5.5.0", 1518 | "validate-npm-package-license": "3.0.1" 1519 | } 1520 | }, 1521 | "normalize-path": { 1522 | "version": "2.1.1", 1523 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 1524 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 1525 | "dev": true, 1526 | "requires": { 1527 | "remove-trailing-separator": "1.1.0" 1528 | } 1529 | }, 1530 | "npmlog": { 1531 | "version": "4.1.2", 1532 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 1533 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 1534 | "dev": true, 1535 | "requires": { 1536 | "are-we-there-yet": "1.1.4", 1537 | "console-control-strings": "1.1.0", 1538 | "gauge": "2.7.4", 1539 | "set-blocking": "2.0.0" 1540 | } 1541 | }, 1542 | "number-is-nan": { 1543 | "version": "1.0.1", 1544 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1545 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 1546 | "dev": true 1547 | }, 1548 | "oauth-sign": { 1549 | "version": "0.8.2", 1550 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 1551 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", 1552 | "dev": true 1553 | }, 1554 | "object-assign": { 1555 | "version": "4.1.1", 1556 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1557 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1558 | "dev": true 1559 | }, 1560 | "once": { 1561 | "version": "1.4.0", 1562 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1563 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1564 | "dev": true, 1565 | "requires": { 1566 | "wrappy": "1.0.2" 1567 | } 1568 | }, 1569 | "open": { 1570 | "version": "0.0.5", 1571 | "resolved": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", 1572 | "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=", 1573 | "dev": true 1574 | }, 1575 | "os-homedir": { 1576 | "version": "1.0.2", 1577 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1578 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 1579 | "dev": true 1580 | }, 1581 | "os-tmpdir": { 1582 | "version": "1.0.2", 1583 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1584 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1585 | "dev": true, 1586 | "optional": true 1587 | }, 1588 | "osenv": { 1589 | "version": "0.1.5", 1590 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", 1591 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", 1592 | "dev": true, 1593 | "optional": true, 1594 | "requires": { 1595 | "os-homedir": "1.0.2", 1596 | "os-tmpdir": "1.0.2" 1597 | } 1598 | }, 1599 | "package": { 1600 | "version": "1.0.1", 1601 | "resolved": "https://registry.npmjs.org/package/-/package-1.0.1.tgz", 1602 | "integrity": "sha1-0lofmeJQbcsn1nBLg9yooxLk7cw=", 1603 | "dev": true 1604 | }, 1605 | "pako": { 1606 | "version": "1.0.6", 1607 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", 1608 | "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", 1609 | "dev": true 1610 | }, 1611 | "parse-json": { 1612 | "version": "2.2.0", 1613 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1614 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1615 | "dev": true, 1616 | "requires": { 1617 | "error-ex": "1.3.1" 1618 | } 1619 | }, 1620 | "path-exists": { 1621 | "version": "2.1.0", 1622 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 1623 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 1624 | "dev": true, 1625 | "requires": { 1626 | "pinkie-promise": "2.0.1" 1627 | } 1628 | }, 1629 | "path-is-absolute": { 1630 | "version": "1.0.1", 1631 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1632 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1633 | "dev": true 1634 | }, 1635 | "path-type": { 1636 | "version": "1.1.0", 1637 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", 1638 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", 1639 | "dev": true, 1640 | "requires": { 1641 | "graceful-fs": "4.1.11", 1642 | "pify": "2.3.0", 1643 | "pinkie-promise": "2.0.1" 1644 | } 1645 | }, 1646 | "pend": { 1647 | "version": "1.2.0", 1648 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1649 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", 1650 | "dev": true 1651 | }, 1652 | "performance-now": { 1653 | "version": "2.1.0", 1654 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1655 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 1656 | "dev": true 1657 | }, 1658 | "phantomjs-prebuilt": { 1659 | "version": "2.1.16", 1660 | "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", 1661 | "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", 1662 | "dev": true, 1663 | "requires": { 1664 | "es6-promise": "4.2.4", 1665 | "extract-zip": "1.6.6", 1666 | "fs-extra": "1.0.0", 1667 | "hasha": "2.2.0", 1668 | "kew": "0.7.0", 1669 | "progress": "1.1.8", 1670 | "request": "2.83.0", 1671 | "request-progress": "2.0.1", 1672 | "which": "1.2.14" 1673 | } 1674 | }, 1675 | "pify": { 1676 | "version": "2.3.0", 1677 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1678 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1679 | "dev": true 1680 | }, 1681 | "pinkie": { 1682 | "version": "2.0.4", 1683 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1684 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 1685 | "dev": true 1686 | }, 1687 | "pinkie-promise": { 1688 | "version": "2.0.1", 1689 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1690 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1691 | "dev": true, 1692 | "requires": { 1693 | "pinkie": "2.0.4" 1694 | } 1695 | }, 1696 | "prebuild-install": { 1697 | "version": "2.5.1", 1698 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.5.1.tgz", 1699 | "integrity": "sha512-3DX9L6pzwc1m1ksMkW3Ky2WLgPQUBiySOfXVl3WZyAeJSyJb4wtoH9OmeRGcubAWsMlLiL8BTHbwfm/jPQE9Ag==", 1700 | "dev": true, 1701 | "optional": true, 1702 | "requires": { 1703 | "detect-libc": "1.0.3", 1704 | "expand-template": "1.1.0", 1705 | "github-from-package": "0.0.0", 1706 | "minimist": "1.2.0", 1707 | "mkdirp": "0.5.1", 1708 | "node-abi": "2.3.0", 1709 | "noop-logger": "0.1.1", 1710 | "npmlog": "4.1.2", 1711 | "os-homedir": "1.0.2", 1712 | "pump": "2.0.1", 1713 | "rc": "1.2.5", 1714 | "simple-get": "2.7.0", 1715 | "tar-fs": "1.16.0", 1716 | "tunnel-agent": "0.6.0", 1717 | "which-pm-runs": "1.0.0" 1718 | }, 1719 | "dependencies": { 1720 | "detect-libc": { 1721 | "version": "1.0.3", 1722 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 1723 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", 1724 | "dev": true, 1725 | "optional": true 1726 | } 1727 | } 1728 | }, 1729 | "pretty-bytes": { 1730 | "version": "4.0.2", 1731 | "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", 1732 | "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", 1733 | "dev": true 1734 | }, 1735 | "process-nextick-args": { 1736 | "version": "2.0.0", 1737 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 1738 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 1739 | "dev": true 1740 | }, 1741 | "progress": { 1742 | "version": "1.1.8", 1743 | "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", 1744 | "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", 1745 | "dev": true 1746 | }, 1747 | "pump": { 1748 | "version": "2.0.1", 1749 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 1750 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 1751 | "dev": true, 1752 | "optional": true, 1753 | "requires": { 1754 | "end-of-stream": "1.4.1", 1755 | "once": "1.4.0" 1756 | } 1757 | }, 1758 | "punycode": { 1759 | "version": "1.4.1", 1760 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1761 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 1762 | "dev": true 1763 | }, 1764 | "q": { 1765 | "version": "1.5.1", 1766 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 1767 | "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", 1768 | "dev": true 1769 | }, 1770 | "qs": { 1771 | "version": "6.5.1", 1772 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", 1773 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", 1774 | "dev": true 1775 | }, 1776 | "rc": { 1777 | "version": "1.2.5", 1778 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.5.tgz", 1779 | "integrity": "sha1-J1zWh/bjs2zHVrqibf7oCnkDAf0=", 1780 | "dev": true, 1781 | "optional": true, 1782 | "requires": { 1783 | "deep-extend": "0.4.2", 1784 | "ini": "1.3.5", 1785 | "minimist": "1.2.0", 1786 | "strip-json-comments": "2.0.1" 1787 | } 1788 | }, 1789 | "read-pkg": { 1790 | "version": "1.1.0", 1791 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", 1792 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", 1793 | "dev": true, 1794 | "requires": { 1795 | "load-json-file": "1.1.0", 1796 | "normalize-package-data": "2.4.0", 1797 | "path-type": "1.1.0" 1798 | } 1799 | }, 1800 | "read-pkg-up": { 1801 | "version": "1.0.1", 1802 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", 1803 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", 1804 | "dev": true, 1805 | "requires": { 1806 | "find-up": "1.1.2", 1807 | "read-pkg": "1.1.0" 1808 | } 1809 | }, 1810 | "readable-stream": { 1811 | "version": "2.3.4", 1812 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", 1813 | "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==", 1814 | "dev": true, 1815 | "requires": { 1816 | "core-util-is": "1.0.2", 1817 | "inherits": "2.0.3", 1818 | "isarray": "1.0.0", 1819 | "process-nextick-args": "2.0.0", 1820 | "safe-buffer": "5.1.1", 1821 | "string_decoder": "1.0.3", 1822 | "util-deprecate": "1.0.2" 1823 | } 1824 | }, 1825 | "redent": { 1826 | "version": "1.0.0", 1827 | "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", 1828 | "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", 1829 | "dev": true, 1830 | "requires": { 1831 | "indent-string": "2.1.0", 1832 | "strip-indent": "1.0.1" 1833 | } 1834 | }, 1835 | "remove-trailing-separator": { 1836 | "version": "1.1.0", 1837 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 1838 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", 1839 | "dev": true 1840 | }, 1841 | "repeating": { 1842 | "version": "2.0.1", 1843 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", 1844 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", 1845 | "dev": true, 1846 | "requires": { 1847 | "is-finite": "1.0.2" 1848 | } 1849 | }, 1850 | "request": { 1851 | "version": "2.83.0", 1852 | "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", 1853 | "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", 1854 | "dev": true, 1855 | "requires": { 1856 | "aws-sign2": "0.7.0", 1857 | "aws4": "1.6.0", 1858 | "caseless": "0.12.0", 1859 | "combined-stream": "1.0.6", 1860 | "extend": "3.0.1", 1861 | "forever-agent": "0.6.1", 1862 | "form-data": "2.3.2", 1863 | "har-validator": "5.0.3", 1864 | "hawk": "6.0.2", 1865 | "http-signature": "1.2.0", 1866 | "is-typedarray": "1.0.0", 1867 | "isstream": "0.1.2", 1868 | "json-stringify-safe": "5.0.1", 1869 | "mime-types": "2.1.18", 1870 | "oauth-sign": "0.8.2", 1871 | "performance-now": "2.1.0", 1872 | "qs": "6.5.1", 1873 | "safe-buffer": "5.1.1", 1874 | "stringstream": "0.0.5", 1875 | "tough-cookie": "2.3.3", 1876 | "tunnel-agent": "0.6.0", 1877 | "uuid": "3.2.1" 1878 | } 1879 | }, 1880 | "request-progress": { 1881 | "version": "2.0.1", 1882 | "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", 1883 | "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", 1884 | "dev": true, 1885 | "requires": { 1886 | "throttleit": "1.0.0" 1887 | } 1888 | }, 1889 | "request-promise": { 1890 | "version": "2.0.1", 1891 | "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-2.0.1.tgz", 1892 | "integrity": "sha1-rL1HtyXjk3Lt4xdM8pw42ezysw0=", 1893 | "dev": true, 1894 | "requires": { 1895 | "bluebird": "2.11.0", 1896 | "lodash": "4.17.5", 1897 | "request": "2.83.0" 1898 | }, 1899 | "dependencies": { 1900 | "lodash": { 1901 | "version": "4.17.5", 1902 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", 1903 | "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", 1904 | "dev": true 1905 | } 1906 | } 1907 | }, 1908 | "resolve": { 1909 | "version": "1.1.7", 1910 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 1911 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", 1912 | "dev": true 1913 | }, 1914 | "rimraf": { 1915 | "version": "2.2.8", 1916 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", 1917 | "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", 1918 | "dev": true 1919 | }, 1920 | "safe-buffer": { 1921 | "version": "5.1.1", 1922 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 1923 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", 1924 | "dev": true 1925 | }, 1926 | "semver": { 1927 | "version": "5.5.0", 1928 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", 1929 | "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", 1930 | "dev": true 1931 | }, 1932 | "set-blocking": { 1933 | "version": "2.0.0", 1934 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1935 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 1936 | "dev": true 1937 | }, 1938 | "signal-exit": { 1939 | "version": "3.0.2", 1940 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1941 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1942 | "dev": true 1943 | }, 1944 | "simple-concat": { 1945 | "version": "1.0.0", 1946 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", 1947 | "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", 1948 | "dev": true, 1949 | "optional": true 1950 | }, 1951 | "simple-get": { 1952 | "version": "2.7.0", 1953 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.7.0.tgz", 1954 | "integrity": "sha512-RkE9rGPHcxYZ/baYmgJtOSM63vH0Vyq+ma5TijBcLla41SWlh8t6XYIGMR/oeZcmr+/G8k+zrClkkVrtnQ0esg==", 1955 | "dev": true, 1956 | "optional": true, 1957 | "requires": { 1958 | "decompress-response": "3.3.0", 1959 | "once": "1.4.0", 1960 | "simple-concat": "1.0.0" 1961 | } 1962 | }, 1963 | "sntp": { 1964 | "version": "2.1.0", 1965 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", 1966 | "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", 1967 | "dev": true, 1968 | "requires": { 1969 | "hoek": "4.2.1" 1970 | } 1971 | }, 1972 | "source-map": { 1973 | "version": "0.5.7", 1974 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1975 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1976 | "dev": true 1977 | }, 1978 | "spdx-correct": { 1979 | "version": "1.0.2", 1980 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", 1981 | "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", 1982 | "dev": true, 1983 | "requires": { 1984 | "spdx-license-ids": "1.2.2" 1985 | } 1986 | }, 1987 | "spdx-expression-parse": { 1988 | "version": "1.0.4", 1989 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", 1990 | "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", 1991 | "dev": true 1992 | }, 1993 | "spdx-license-ids": { 1994 | "version": "1.2.2", 1995 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", 1996 | "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", 1997 | "dev": true 1998 | }, 1999 | "sprintf-js": { 2000 | "version": "1.0.3", 2001 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2002 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2003 | "dev": true 2004 | }, 2005 | "sshpk": { 2006 | "version": "1.13.1", 2007 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", 2008 | "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", 2009 | "dev": true, 2010 | "requires": { 2011 | "asn1": "0.2.3", 2012 | "assert-plus": "1.0.0", 2013 | "bcrypt-pbkdf": "1.0.1", 2014 | "dashdash": "1.14.1", 2015 | "ecc-jsbn": "0.1.1", 2016 | "getpass": "0.1.7", 2017 | "jsbn": "0.1.1", 2018 | "tweetnacl": "0.14.5" 2019 | } 2020 | }, 2021 | "stream-buffers": { 2022 | "version": "2.2.0", 2023 | "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", 2024 | "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=", 2025 | "dev": true 2026 | }, 2027 | "string-width": { 2028 | "version": "1.0.2", 2029 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 2030 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 2031 | "dev": true, 2032 | "requires": { 2033 | "code-point-at": "1.1.0", 2034 | "is-fullwidth-code-point": "1.0.0", 2035 | "strip-ansi": "3.0.1" 2036 | } 2037 | }, 2038 | "string_decoder": { 2039 | "version": "1.0.3", 2040 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 2041 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 2042 | "dev": true, 2043 | "requires": { 2044 | "safe-buffer": "5.1.1" 2045 | } 2046 | }, 2047 | "stringstream": { 2048 | "version": "0.0.5", 2049 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", 2050 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", 2051 | "dev": true 2052 | }, 2053 | "strip-ansi": { 2054 | "version": "3.0.1", 2055 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2056 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2057 | "dev": true, 2058 | "requires": { 2059 | "ansi-regex": "2.1.1" 2060 | } 2061 | }, 2062 | "strip-bom": { 2063 | "version": "2.0.0", 2064 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 2065 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", 2066 | "dev": true, 2067 | "requires": { 2068 | "is-utf8": "0.2.1" 2069 | } 2070 | }, 2071 | "strip-indent": { 2072 | "version": "1.0.1", 2073 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", 2074 | "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", 2075 | "dev": true, 2076 | "requires": { 2077 | "get-stdin": "4.0.1" 2078 | } 2079 | }, 2080 | "strip-json-comments": { 2081 | "version": "2.0.1", 2082 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2083 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 2084 | "dev": true, 2085 | "optional": true 2086 | }, 2087 | "supports-color": { 2088 | "version": "2.0.0", 2089 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 2090 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 2091 | "dev": true 2092 | }, 2093 | "tar": { 2094 | "version": "2.2.1", 2095 | "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", 2096 | "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", 2097 | "dev": true, 2098 | "optional": true, 2099 | "requires": { 2100 | "block-stream": "0.0.9", 2101 | "fstream": "1.0.11", 2102 | "inherits": "2.0.3" 2103 | } 2104 | }, 2105 | "tar-fs": { 2106 | "version": "1.16.0", 2107 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.0.tgz", 2108 | "integrity": "sha512-I9rb6v7mjWLtOfCau9eH5L7sLJyU2BnxtEZRQ5Mt+eRKmf1F0ohXmT/Jc3fr52kDvjJ/HV5MH3soQfPL5bQ0Yg==", 2109 | "dev": true, 2110 | "optional": true, 2111 | "requires": { 2112 | "chownr": "1.0.1", 2113 | "mkdirp": "0.5.1", 2114 | "pump": "1.0.3", 2115 | "tar-stream": "1.5.5" 2116 | }, 2117 | "dependencies": { 2118 | "pump": { 2119 | "version": "1.0.3", 2120 | "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", 2121 | "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", 2122 | "dev": true, 2123 | "optional": true, 2124 | "requires": { 2125 | "end-of-stream": "1.4.1", 2126 | "once": "1.4.0" 2127 | } 2128 | } 2129 | } 2130 | }, 2131 | "tar-stream": { 2132 | "version": "1.5.5", 2133 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", 2134 | "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==", 2135 | "dev": true, 2136 | "requires": { 2137 | "bl": "1.2.1", 2138 | "end-of-stream": "1.4.1", 2139 | "readable-stream": "2.3.4", 2140 | "xtend": "4.0.1" 2141 | } 2142 | }, 2143 | "temporary": { 2144 | "version": "0.0.8", 2145 | "resolved": "https://registry.npmjs.org/temporary/-/temporary-0.0.8.tgz", 2146 | "integrity": "sha1-oYqYHSi6jKNgJ/s8MFOMPst0CsA=", 2147 | "dev": true, 2148 | "requires": { 2149 | "package": "1.0.1" 2150 | } 2151 | }, 2152 | "throttleit": { 2153 | "version": "1.0.0", 2154 | "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", 2155 | "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", 2156 | "dev": true 2157 | }, 2158 | "tough-cookie": { 2159 | "version": "2.3.3", 2160 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", 2161 | "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", 2162 | "dev": true, 2163 | "requires": { 2164 | "punycode": "1.4.1" 2165 | } 2166 | }, 2167 | "trim-newlines": { 2168 | "version": "1.0.0", 2169 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", 2170 | "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", 2171 | "dev": true 2172 | }, 2173 | "tunnel-agent": { 2174 | "version": "0.6.0", 2175 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2176 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 2177 | "dev": true, 2178 | "requires": { 2179 | "safe-buffer": "5.1.1" 2180 | } 2181 | }, 2182 | "tweetnacl": { 2183 | "version": "0.14.5", 2184 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 2185 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 2186 | "dev": true, 2187 | "optional": true 2188 | }, 2189 | "typedarray": { 2190 | "version": "0.0.6", 2191 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 2192 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 2193 | "dev": true 2194 | }, 2195 | "underscore.string": { 2196 | "version": "3.2.3", 2197 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.2.3.tgz", 2198 | "integrity": "sha1-gGmSYzZl1eX8tNsfs6hi62jp5to=", 2199 | "dev": true 2200 | }, 2201 | "util-deprecate": { 2202 | "version": "1.0.2", 2203 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2204 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 2205 | "dev": true 2206 | }, 2207 | "uuid": { 2208 | "version": "3.2.1", 2209 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", 2210 | "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", 2211 | "dev": true 2212 | }, 2213 | "validate-npm-package-license": { 2214 | "version": "3.0.1", 2215 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", 2216 | "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", 2217 | "dev": true, 2218 | "requires": { 2219 | "spdx-correct": "1.0.2", 2220 | "spdx-expression-parse": "1.0.4" 2221 | } 2222 | }, 2223 | "verror": { 2224 | "version": "1.10.0", 2225 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 2226 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 2227 | "dev": true, 2228 | "requires": { 2229 | "assert-plus": "1.0.0", 2230 | "core-util-is": "1.0.2", 2231 | "extsprintf": "1.3.0" 2232 | } 2233 | }, 2234 | "walkdir": { 2235 | "version": "0.0.11", 2236 | "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", 2237 | "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=", 2238 | "dev": true 2239 | }, 2240 | "webstore-upload": { 2241 | "version": "0.0.7", 2242 | "resolved": "https://registry.npmjs.org/webstore-upload/-/webstore-upload-0.0.7.tgz", 2243 | "integrity": "sha1-aVfXgSzXlgZDAU0Fea+Y3HakPow=", 2244 | "dev": true, 2245 | "requires": { 2246 | "glob": "7.0.6", 2247 | "lodash": "2.4.2", 2248 | "open": "0.0.5", 2249 | "q": "1.5.1", 2250 | "request": "2.83.0", 2251 | "request-promise": "2.0.1" 2252 | }, 2253 | "dependencies": { 2254 | "lodash": { 2255 | "version": "2.4.2", 2256 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", 2257 | "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", 2258 | "dev": true 2259 | } 2260 | } 2261 | }, 2262 | "which": { 2263 | "version": "1.2.14", 2264 | "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", 2265 | "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", 2266 | "dev": true, 2267 | "requires": { 2268 | "isexe": "2.0.0" 2269 | } 2270 | }, 2271 | "which-pm-runs": { 2272 | "version": "1.0.0", 2273 | "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", 2274 | "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", 2275 | "dev": true, 2276 | "optional": true 2277 | }, 2278 | "wide-align": { 2279 | "version": "1.1.2", 2280 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", 2281 | "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", 2282 | "dev": true, 2283 | "requires": { 2284 | "string-width": "1.0.2" 2285 | } 2286 | }, 2287 | "wrappy": { 2288 | "version": "1.0.2", 2289 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2290 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2291 | "dev": true 2292 | }, 2293 | "xtend": { 2294 | "version": "4.0.1", 2295 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 2296 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", 2297 | "dev": true 2298 | }, 2299 | "yauzl": { 2300 | "version": "2.4.1", 2301 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", 2302 | "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", 2303 | "dev": true, 2304 | "requires": { 2305 | "fd-slicer": "1.0.1" 2306 | } 2307 | }, 2308 | "zip-stream": { 2309 | "version": "1.2.0", 2310 | "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", 2311 | "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", 2312 | "dev": true, 2313 | "requires": { 2314 | "archiver-utils": "1.3.0", 2315 | "compress-commons": "1.2.2", 2316 | "lodash": "4.17.5", 2317 | "readable-stream": "2.3.4" 2318 | }, 2319 | "dependencies": { 2320 | "lodash": { 2321 | "version": "4.17.5", 2322 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", 2323 | "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", 2324 | "dev": true 2325 | } 2326 | } 2327 | } 2328 | } 2329 | } 2330 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "google-apps-script_travis-ci", 3 | "version": "0.0.1", 4 | "description": "Apps Script continuous integration with Travis CI", 5 | "license": "UNLICENSED", 6 | "repository": { 7 | "type": "git", 8 | "url": "" 9 | }, 10 | "devDependencies": { 11 | "gas-lib": "^1.1.0", 12 | "grunt": "^1.0.1", 13 | "grunt-cli": "1.2.0", 14 | "grunt-contrib-clean": "^1.0.0", 15 | "grunt-contrib-compress": "^1.4.3", 16 | "grunt-contrib-concat": "^1.0.1", 17 | "grunt-contrib-copy": "^1.0.0", 18 | "grunt-contrib-jasmine": "^1.1.0", 19 | "jasmine": "^2.8.0", 20 | "jit-grunt": "^0.10.0", 21 | "jszip": "^3.1.5", 22 | "webstore-upload": "0.0.7" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /setenv.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e 4 | 5 | ################################################ 6 | # Declare associative arrays for configuration # 7 | ################################################ 8 | 9 | declare -A EnvMap 10 | EnvMap["master"]=dev 11 | EnvMap["beta"]=staging 12 | EnvMap["prod"]=production 13 | 14 | 15 | declare -A TargetMap 16 | TargetMap["master"]=trustedTesters 17 | TargetMap["beta"]=trustedTesters 18 | 19 | export ENV=${EnvMap[$TRAVIS_BRANCH]} 20 | 21 | if [ -z "$ENV" ]; then 22 | IS_KNOWN_ENV=false 23 | else 24 | IS_KNOWN_ENV=true 25 | fi 26 | 27 | export IS_KNOWN_ENV 28 | 29 | export PUBLISH_TARGET=${TargetMap[$TRAVIS_BRANCH]} 30 | 31 | echo "Is this a know environment ? $IS_KNOWN_ENV" 32 | 33 | echo "Publish traget is : $PUBLISH_TARGET" 34 | 35 | echo "Build branch: $TRAVIS_BRANCH" -------------------------------------------------------------------------------- /spec/PropertiesServiceTest.js: -------------------------------------------------------------------------------- 1 | /** 2 | * PropertiesServiceTest - Class used to simulate the PropertiesService in tests 3 | * @constructor 4 | */ 5 | 6 | this['TestLib'] = this['TestLib'] || {}; 7 | 8 | TestLib.properties = {}; 9 | 10 | function PropertiesServiceTest(){ 11 | this.properties = new PropertiesTest(); 12 | } 13 | 14 | PropertiesServiceTest.prototype.getDocumentProperties = function(){ 15 | return TestLib.properties; 16 | }; 17 | 18 | function PropertiesTest(){ 19 | 20 | } 21 | 22 | PropertiesTest.prototype.getProperty = function(key){ 23 | //TODO: error management 24 | if(TestLib.properties[key]){return Lib[key];} 25 | }; 26 | 27 | PropertiesTest.prototype.setProperty = function(key, propertyValue){ 28 | TestLib.properties[key] = propertyValue; 29 | return TestLib.properties; 30 | }; 31 | 32 | PropertiesTest.prototype.deleteProperty = function(key){ 33 | if(TestLib.properties[key]){delete TestLib.properties[key];} 34 | return TestLib.properties; 35 | }; -------------------------------------------------------------------------------- /spec/SpreadsheetAppTest.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SpreadsheetAppTest - Class object used for tests that simulate a spreadsheet as close as possible from SpreadsheetApp 3 | * @constructor 4 | */ 5 | function SpreadsheetAppTest(){ 6 | this.activeSpreadsheet = new SpreadsheetTest(); 7 | } 8 | 9 | SpreadsheetAppTest.prototype.getActiveSpreadsheet = function(){ 10 | return this.activeSpreadsheet; 11 | }; 12 | 13 | /** 14 | * SpreadsheetTest - Class object used for tests that simulate a spreadsheet as close as possible from Spreadsheet 15 | * @constructor 16 | */ 17 | function SpreadsheetTest(){ 18 | this.sheets = [new SheetTest("Sheet1", this)]; 19 | this.activeSheet = 0; 20 | } 21 | 22 | SpreadsheetTest.prototype.getActiveSheet = function(){ 23 | return this.sheets[this.activeSheet]; 24 | }; 25 | 26 | SpreadsheetTest.prototype.getSheetByName = function(name){ 27 | for(var i=0; i < this.sheets.length; i++){ 28 | if (this.sheets[i].name === name){ 29 | return this.sheets[i]; 30 | } 31 | } 32 | }; 33 | 34 | SpreadsheetTest.prototype.getSheets = function(){ 35 | return this.sheets; 36 | }; 37 | 38 | SpreadsheetTest.prototype.insertSheet = function(sheetName, position){ 39 | var newSheet; 40 | if(typeof position !== "undefined") { 41 | if (this.getSheetByName(sheetName)) { 42 | throw "You cannot create two sheets with the same name"; 43 | } 44 | newSheet = new SheetTest(sheetName, this); 45 | this.sheets.splice(position, 0, newSheet); 46 | return newSheet; 47 | } else { 48 | if (this.getSheetByName(sheetName)){ 49 | throw "You cannot create two sheets with the same name" ; 50 | } 51 | newSheet = new SheetTest(sheetName, this); 52 | this.sheets.push(newSheet); 53 | return newSheet; 54 | } 55 | }; 56 | 57 | SpreadsheetTest.prototype.getName = function () { 58 | return "Test spreadSheet" 59 | }; 60 | 61 | SpreadsheetTest.prototype.getUrl = function () { 62 | return "https://docs.google.com/spreadsheets/d/123456789" 63 | }; 64 | 65 | function SheetTest(sheetName, spreadsheetTest){ 66 | this.name = sheetName; 67 | var rows = new Array(1000); 68 | for(var i=0; i < rows.length; i++){ 69 | rows[i] = new Array(100); 70 | Array.apply(null, rows[i]).map(String.prototype.valueOf, "") 71 | } 72 | this.data = rows; 73 | this.rowFrozen = 0; 74 | this.spreadsheetTest=spreadsheetTest; 75 | } 76 | 77 | SheetTest.prototype.activate = function(){ 78 | var spreadsheetParent = this.spreadsheetTest; 79 | for(var i=0; inumCol){ 119 | numCol = j; 120 | } 121 | } 122 | } 123 | } 124 | return new RangeTest(1, 1, numRow+1, numCol+1, this); 125 | }; 126 | 127 | SheetTest.prototype.getMaxColumns = function(){ 128 | return this.data[0].length; 129 | }; 130 | 131 | 132 | SheetTest.prototype.getMaxRows = function(){ 133 | return this.data.length; 134 | }; 135 | 136 | SheetTest.prototype.getLastColumn = function(){ 137 | var i = this.data[0].length; 138 | var maxColumn = null; 139 | while (i >= 0) { 140 | if (this.data[0][i] && i > maxColumn) maxColumn = i; 141 | i-- 142 | } 143 | return maxColumn + 1; 144 | }; 145 | 146 | SheetTest.prototype.getRange = function(row, col, numRow, numCol){ 147 | return new RangeTest(row, col, numRow, numCol, this); 148 | }; 149 | 150 | SheetTest.prototype.getSheetName = function(){ 151 | return this.name; 152 | }; 153 | 154 | SheetTest.prototype.insertColumnAfter = function(numCol){ 155 | this.data.map(function(row){ 156 | row.splice(numCol, 0, ""); 157 | }) 158 | }; 159 | 160 | SheetTest.prototype.setFrozenRows = function(number){ 161 | this.rowFrozen = number; 162 | }; 163 | 164 | SheetTest.prototype.setName = function(newName){ 165 | this.name = newName; 166 | }; 167 | 168 | function RangeTest(rowPosition, colPosition, rowLength, colLength, sheetTest){ 169 | this.rowPosition = rowPosition; 170 | this.colPosition = colPosition; 171 | this.rowLength = rowLength; 172 | this.colLength = colLength; 173 | this.sheetTest = sheetTest; 174 | } 175 | 176 | RangeTest.prototype.clearContent = function(){ 177 | for (var i=0; i < this.rowLength; i++){ 178 | for (var j=0; j < this.colLength; j++){ 179 | this.sheetTest.data[this.rowPosition - 1][this.colPosition - 1] = ""; 180 | } 181 | } 182 | return this; 183 | }; 184 | 185 | RangeTest.prototype.getValue = function(){ 186 | return this.sheetTest.data[this.rowPosition - 1][this.colPosition - 1]; 187 | }; 188 | 189 | RangeTest.prototype.getValues = function(){ 190 | var rows = []; 191 | for(var i = this.rowPosition - 1; i < this.rowPosition - 1 + this.rowLength; i++){ 192 | var cols=[]; 193 | for(var j = this.colPosition - 1; j < this.colPosition - 1 + this.rowLength; j++){ 194 | cols.push(this.sheetTest.data[i][j]); 195 | } 196 | rows.push(cols); 197 | } 198 | return rows; 199 | }; 200 | 201 | RangeTest.prototype.isBlank = function(){ 202 | return (this.getValue() === undefined || this.getValue() === ""); 203 | }; 204 | 205 | RangeTest.prototype.setValue = function(value){ 206 | this.sheetTest.data[this.rowPosition - 1][this.colPosition - 1] = value; 207 | return this; 208 | }; 209 | 210 | RangeTest.prototype.getHeight = function(){ return this.rowLength}; 211 | 212 | RangeTest.prototype.setValues = function(twoDimArray){ 213 | //TODO: check if the dimensions are valid 214 | for (var i=0; i < twoDimArray.length; i++){ 215 | for (var j=0; j < twoDimArray[i].length; j++){ 216 | this.sheetTest.data[this.rowPosition - 1+i][this.colPosition - 1+j] = twoDimArray[i][j]; 217 | } 218 | } 219 | return this; 220 | }; -------------------------------------------------------------------------------- /spec/View.specs.js: -------------------------------------------------------------------------------- 1 | describe("test 1", function() { 2 | describe("Describe 1", function () { 3 | it("Assert description", function () { 4 | expect(true).toBe(true); 5 | }); 6 | }); 7 | }); -------------------------------------------------------------------------------- /spec/globalLibDef.js: -------------------------------------------------------------------------------- 1 | var sheetName = "XXX"; 2 | 3 | var SpreadsheetApp = { 4 | 'getActiveSpreadsheet' : function (){} 5 | }; 6 | var PropertiesService = { 7 | 'getDocumentProperties' : function (){} 8 | }; 9 | 10 | var ScriptApp = { 11 | getOAuthToken: function (){} 12 | }; --------------------------------------------------------------------------------