├── .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 | };
--------------------------------------------------------------------------------