├── .editorconfig ├── .gitignore ├── .jscsrc ├── .jshintrc ├── .travis.yml ├── README.md ├── bin └── jira.js ├── gh-plugin.json ├── package-lock.json ├── package.json └── test ├── .jshintrc └── jira.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # This file is for unifying the coding style for different editors and IDEs 2 | # See editorconfig.org 3 | 4 | root = true 5 | 6 | [*] 7 | indent_style = space 8 | indent_size = 4 9 | charset = utf-8 10 | trim_trailing_whitespace = true 11 | insert_final_newline = false -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log -------------------------------------------------------------------------------- /.jscsrc: -------------------------------------------------------------------------------- 1 | { 2 | "esnext": true, 3 | "preset": "crockford", 4 | "disallowKeywordsOnNewLine": null, 5 | "disallowDanglingUnderscores": true, 6 | "disallowTrailingComma": true, 7 | "disallowTrailingWhitespace": true, 8 | "requireSpaceAfterKeywords": null, 9 | "requireMultipleVarDecl": null, 10 | "requireVarDeclFirst": false, 11 | "disallowMultipleVarDecl": false, 12 | "excludeFiles": [ 13 | "node_modules" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "node": true, 3 | "bitwise": true, 4 | "curly": true, 5 | "eqeqeq": true, 6 | "esnext": true, 7 | "expr": true, 8 | "forin": true, 9 | "funcscope": false, 10 | "globalstrict": false, 11 | "iterator": false, 12 | "latedef": true, 13 | "noarg": true, 14 | "nomen": false, 15 | "nonew": true, 16 | "shadow": false, 17 | "strict": true, 18 | "undef": true, 19 | "unused": true 20 | } 21 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 4.0 4 | before_script: 5 | - npm run-script lint 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GH Jira 2 | 3 | [![NPM version](http://img.shields.io/npm/v/gh-jira.svg?style=flat)](http://npmjs.org/gh-jira) 4 | [![NPM downloads](http://img.shields.io/npm/dm/gh-jira.svg?style=flat)](http://npmjs.org/gh-jira) 5 | [![Build Status](http://img.shields.io/travis/node-gh/gh-jira/master.svg?style=flat)](https://travis-ci.org/node-gh/gh-jira) 6 | [![Dependencies Status](http://img.shields.io/david/node-gh/gh-jira.svg?style=flat)](https://david-dm.org/node-gh/gh-jira) 7 | [![DevDependencies Status](http://img.shields.io/david/dev/node-gh/gh-jira.svg?style=flat)](https://david-dm.org/node-gh/gh-jira#info=devDependencies) 8 | 9 | NodeGH plugin for integrating [Jira](https://www.atlassian.com/software/jira), an issue management system. 10 | 11 | > Maintained by [Eduardo Lundgren](https://github.com/eduardolundgren). 12 | 13 | ## Install 14 | 15 | ``` 16 | [sudo] npm install -g gh gh-jira 17 | ``` 18 | 19 | ## Usage 20 | 21 | ``` 22 | gh jira 23 | ``` 24 | 25 | > **Alias:** `gh ji` 26 | 27 | ### 1. Create 28 | 29 | | Option | Usage | Type | 30 | | ------------------- | ------------ | --------- | 31 | | `-N`, `--new` | **Required** | `Boolean` | 32 | | `-p`, `--project` | **Required** | `String` | 33 | | `-t`, `--title` | **Required** | `String` | 34 | | `-A`, `--assignee` | *Optional* | `String` | 35 | | `-C`, `--component` | *Optional* | `String` | 36 | | `-m`, `--message` | *Optional* | `String` | 37 | | `-P`, `--priority` | *Optional* | `String` | 38 | | `-R`, `--reporter` | *Optional* | `String` | 39 | | `-T`, `--type` | *Optional* | `String` | 40 | | `-v`, `--version` | *Optional* | `String` | 41 | 42 | #### Examples 43 | 44 | * Create a new issue on a certain project. 45 | 46 | ``` 47 | gh jira --new --project LPS --title 'Node GH rocks!' --message 'Body with **Markdown** support' 48 | ``` 49 | 50 | * Create a new issue specifying the component. 51 | 52 | ``` 53 | gh jira --new --project LPS --title 'Node GH rocks!' --component UI 54 | ``` 55 | 56 | * Create a new, unassigned, issue. 57 | ``` 58 | gh jira --new --project LPS --title 'Node GH rocks!' --unassigned 59 | ``` 60 | 61 | 62 | * Create a new issue and assign it to someone. 63 | 64 | ``` 65 | gh jira --new --project LPS --title 'Node GH rocks!' --assignee eduardolundgren 66 | ``` 67 | 68 | ### 2. Comment 69 | 70 | | Option | Usage | Type | 71 | | ----------------- | ------------ | -------- | 72 | | `-c`, `--comment` | **Required** | `String` | 73 | | `-n`, `--number` | **Required** | `Number` | 74 | 75 | Omitting `--number` will guess issue number from the last commit message. 76 | 77 | #### Examples 78 | 79 | * Comment on an issue. 80 | 81 | ``` 82 | gh jira LPS-123 --comment "Merged, **thank you**!" 83 | ``` 84 | 85 | ### 3. Open in Browser 86 | 87 | | Option | Usage | Type | 88 | | ----------------- | ------------ | --------- | 89 | | `-B`, `--browser` | **Required** | `Boolean` | 90 | | `-n`, `--number` | **Required** | `Number` | 91 | 92 | * Omitting `--number` will guess issue number from the last commit message. 93 | * If you would prefer to use the branch as the ticket number you can change this setting in `gh-plugin.json`: 94 | 95 | ```json 96 | "inferFromCommitTitle": false, 97 | ``` 98 | 99 | #### Examples 100 | 101 | * Open Jira issue page in the browser. 102 | 103 | ``` 104 | gh jira LPS-123 --browser 105 | ``` 106 | 107 | ### 4. Transition 108 | 109 | | Option | Usage | Type | 110 | | ------------------ | ------------ | -------- | 111 | | `--transition` | **Required** | `String` | 112 | | `-n`, `--number` | **Required** | `Number` | 113 | | `-A`, `--assignee` | *Optional* | `String` | 114 | | `-m`, `--message` | *Optional* | `String` | 115 | 116 | Omitting `--number` will guess issue number from the last commit message. 117 | 118 | Both Jira and GitHub usernames are supported `--assignee` values. 119 | 120 | #### Examples 121 | 122 | * Start progress on an issue. 123 | 124 | ``` 125 | gh jira LPS-123 --transition "Start Progress" 126 | ``` 127 | 128 | * Show valid transitions for the issue. 129 | 130 | ``` 131 | gh jira LPS-123 --transition 132 | ``` 133 | 134 | * Show valid transitions for the issue and assign to an user. 135 | 136 | ``` 137 | gh jira LPS-123 --assignee brianchandotcom --transition 138 | ``` 139 | 140 | * Show valid transitions for the issue and unassign it. 141 | 142 | ``` 143 | gh jira LPS-123 --unassign --transition 144 | ``` 145 | 146 | ### 5. Status 147 | 148 | | Option | Usage | Type | 149 | | ---------- | ------------ | -------- | 150 | | `--status` | **Required** | `String` | 151 | 152 | #### Examples 153 | 154 | * Show current status of the issue. 155 | 156 | ``` 157 | gh jira LPS-123 --status 158 | ``` 159 | 160 | 161 | ## Testing 162 | 163 | Check [Travis](https://travis-ci.org/node-gh/gh-jira) for continuous integration results. 164 | 165 | * Run [JSHint](http://www.jshint.com/), a tool to detect errors and potential problems. 166 | 167 | ``` 168 | npm run-script lint 169 | ``` 170 | 171 | * Run [Mocha](http://mochajs.org/), a unit test framework. 172 | 173 | ``` 174 | npm run-script test 175 | ``` 176 | 177 | ## Contributing 178 | 179 | 1. Fork it! 180 | 2. Create your feature branch: `git checkout -b my-new-feature` 181 | 3. Commit your changes: `git commit -m 'Add some feature'` 182 | 4. Push to the branch: `git push origin my-new-feature` 183 | 5. Submit a pull request :D 184 | 185 | ## History 186 | 187 | Check [Release](https://github.com/node-gh/gh-jira/releases) list. 188 | 189 | ## License 190 | 191 | [BSD License](https://github.com/node-gh/gh/blob/master/LICENSE.md) -------------------------------------------------------------------------------- /bin/jira.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | 'use strict'; 4 | 5 | /* 6 | * Copyright 2013, All Rights Reserved. 7 | * 8 | * Code licensed under the BSD License: 9 | * https://github.com/node-gh/gh/blob/master/LICENSE.md 10 | * 11 | * @author Eduardo Lundgren 12 | */ 13 | 14 | var GH_PATH = process.env.GH_PATH; 15 | 16 | var crypto = require('crypto'); 17 | var base = require(GH_PATH + 'lib/base'); 18 | var git = require(GH_PATH + 'lib/git'); 19 | var inquirer = require('inquirer'); 20 | var lodash = require('lodash'); 21 | var logger = require(GH_PATH + 'lib/logger'); 22 | var openUrl = require('opn'); 23 | var url = require('url'); 24 | var config = base.getConfig(true); 25 | var RestApiClient = require(GH_PATH + 'lib/rest-api-client'); 26 | var jiraConfig = config.plugins.jira; 27 | 28 | class Jira { 29 | constructor (options) { 30 | this.options = options; 31 | } 32 | 33 | setIssueNumber (branch, repo, options) { 34 | var issue; 35 | 36 | if (!repo) { 37 | return; 38 | } 39 | 40 | // First, try to extract the issue number from the optional branch name 41 | if (branch) { 42 | issue = this.getIssueNumberFromText(branch); 43 | } 44 | 45 | // If number was not found yet, try to extract from the current branch name 46 | if (!issue) { 47 | issue = this.getIssueNumberFromText(git.getCurrentBranch()); 48 | } 49 | 50 | // If number was not found yet, use only the first commit message to 51 | // try to infer the issue number. 52 | if (!issue || config.plugins.jira.inferFromCommitTitle) { 53 | issue = this.getIssueNumberFromText(git.getCommitMessage(branch, 1)); 54 | } 55 | 56 | // Try to extract the project name from the found number. 57 | if (issue) { 58 | options.project = this.getProjectName(options.jiraNumber); 59 | options.jiraNumber = issue; 60 | } 61 | 62 | // If project was not found, use the last five commit messages to infer the project name. 63 | if (!options.project) { 64 | options.project = this.getProjectName(this.getIssueNumberFromText(git.getCommitMessage(branch, 5))); 65 | } 66 | } 67 | 68 | getIssueNumberFromText (text) { 69 | if (!text) { 70 | return; 71 | } 72 | 73 | // Try uppercase sequence first, e.g. FOO-123. 74 | // If not found, try case-insensitive sequence, e.g. foo-123. 75 | let match = text.match(/[A-Z]{2,}-\d+/) || text.match(/[a-z]{2,}-\d+/i); 76 | 77 | if (match) { 78 | return match[0].toUpperCase(); 79 | } 80 | } 81 | 82 | getProjectName (number) { 83 | if (number) { 84 | return number.substring(0, number.indexOf('-')); 85 | } 86 | } 87 | 88 | decryptText (text) { 89 | var decipher = crypto.createDecipher(Jira.CRYPTO_ALGORITHM, Jira.CRYPTO_PASSWORD); 90 | return decipher.update(text, 'hex', 'utf8') + decipher.final('utf8'); 91 | } 92 | 93 | searchUsers (query) { 94 | return this.api.get('/user/search', { 95 | qs: { 96 | username: query 97 | } 98 | }) 99 | .then((response) => { 100 | let users = response.body; 101 | 102 | if (!users || users.length === 0) { 103 | throw Jira.USERS_NOT_FOUND_ERROR; 104 | } 105 | 106 | return users; 107 | }); 108 | } 109 | 110 | searchGithubUser (query) { 111 | return new Promise((resolve, reject) => { 112 | base.github.user.getFrom({user: query}, (err, data) => { 113 | if (err) { 114 | reject(err); 115 | return; 116 | } 117 | 118 | resolve(data); 119 | }); 120 | }); 121 | } 122 | 123 | searchUserByGitHubUsername (query) { 124 | return new Promise((resolve, reject) => { 125 | this.searchUsers(query) 126 | .then((users) => { 127 | resolve(users); 128 | }) 129 | .catch((err) => { 130 | logger.debug(query + ' was not found on Jira. Trying GitHub.'); 131 | 132 | if (err !== Jira.USERS_NOT_FOUND_ERROR) { 133 | reject(err); 134 | } 135 | 136 | return this.searchGithubUser(query) 137 | .then((user) => { 138 | resolve(this.searchUsers(user.name)); 139 | }) 140 | .catch((error) => { 141 | reject(error); 142 | }); 143 | }); 144 | }); 145 | } 146 | 147 | configureUser () { 148 | if (!jiraConfig.host || !jiraConfig.user || !jiraConfig.password) { 149 | logger.warn('Jira plugin not configured yet.'); 150 | return this.login(); 151 | } 152 | 153 | jiraConfig.password = this.decryptText(jiraConfig.password); 154 | return Promise.resolve(); 155 | } 156 | 157 | findAssigneeByGitHubUsername (user) { 158 | return this.searchUserByGitHubUsername(user) 159 | .then((users) => { 160 | if (users.length === 1) { 161 | return users[0].name; 162 | } 163 | 164 | return this.selectUserWithQuestion(users); 165 | }) 166 | .catch((error) => { 167 | logger.warn('Not found any user when looking for ' + user); 168 | logger.error(error); 169 | }); 170 | } 171 | 172 | run () { 173 | var options = this.options; 174 | 175 | this.expandAliases(); 176 | this.normalizeOptions(); 177 | this.registerLoggerHelpers(); 178 | 179 | return this.configureUser() 180 | .then(() => { 181 | if (jiraConfig.base === undefined) { 182 | jiraConfig.base = Jira.DEFAULT_JIRA_BASE; 183 | } 184 | 185 | this.api = new RestApiClient(jiraConfig); 186 | 187 | // shortcut if only the browser command was invoked to avoid remote call 188 | if (options.browser && lodash.intersection(Jira.DETAILS.commands, Object.keys(options)).length === 1) { 189 | return this.browserAction(); 190 | } 191 | 192 | return this.runCommands(); 193 | }) 194 | .catch(this.fatalErrorHandler); 195 | } 196 | 197 | fatalErrorHandler (error) { 198 | if (error instanceof Error) { 199 | console.trace(error); 200 | process.exit(1); 201 | } 202 | 203 | if (!error || !error.response) { 204 | logger.error(error); 205 | } 206 | 207 | try { 208 | let body = error.response.body; 209 | 210 | if (body.errorMessages.length) { 211 | console.error('JIRA API error messages:'); 212 | } 213 | 214 | body.errorMessages.forEach((msg) => { 215 | console.error(msg); 216 | }); 217 | 218 | if (Object.keys(body.errors).length) { 219 | console.error('JIRA API errors:'); 220 | } 221 | 222 | lodash.forEach(body.errors, (msg, errorKey) => { 223 | console.error(errorKey + ': ' + msg); 224 | }); 225 | 226 | if (error.error) { 227 | logger.error(error.error); 228 | } 229 | } catch (ignore) { 230 | logger.error(error); 231 | } 232 | } 233 | 234 | setAssigneeByGitHubUsername () { 235 | var options = this.options; 236 | 237 | if (options.assignee === null) { 238 | return Promise.resolve(); 239 | } 240 | 241 | return this.findAssigneeByGitHubUsername(options.assignee) 242 | .then((assignee) => { 243 | options.assignee = assignee; 244 | }); 245 | } 246 | 247 | runCommands () { 248 | return this.setAssigneeByGitHubUsername() 249 | .then(() => { 250 | return ['new', 'update', 'transition', 'assign', 'comment', 'label', 'browser', 'status'] 251 | .reduce((promise, item) => { 252 | return promise.then(() => { 253 | return this.callActionIfExists(item); 254 | }); 255 | }, Promise.resolve()); 256 | }); 257 | } 258 | 259 | callActionIfExists (item) { 260 | if (this.options[item]) { 261 | return this[item + 'Action'](); 262 | } 263 | } 264 | 265 | browserAction () { 266 | openUrl(this.getIssueUrl(this.options.jiraNumber), { wait: false }); 267 | return Promise.resolve(); 268 | } 269 | 270 | assignAction () { 271 | var options = this.options; 272 | let assignee = options.assignee; 273 | 274 | if (options.unassign) { 275 | assignee = null; 276 | } 277 | 278 | return this.api.put('/issue/' + this.api.encode(options.jiraNumber) + '/assignee', { 279 | body: { 280 | name: assignee 281 | } 282 | }) 283 | .then((response) => { 284 | if (response.statusCode !== 204) { 285 | logger.error('Can\'t assign issue (status code ' + response.statusCode + ')'); 286 | } 287 | 288 | logger.log(assignee ? 'Issue assigned to ' + assignee : 'Issue unassigned.'); 289 | logger.log(this.getIssueUrl(options.jiraNumber)); 290 | }); 291 | } 292 | 293 | getUpdatePayload () { 294 | var options = this.options; 295 | var payload = {fields: {}}; 296 | 297 | return this.getIssueEditMeta(options.jiraNumber) 298 | .then((meta) => { 299 | if (options.project && options.project !== payload.fields.project.key) { 300 | // https://confluence.atlassian.com/jira/moving-an-issue-185729549.html 301 | logger.warn('To move a Jira issue to another project you must use its web GUI.'); 302 | } 303 | 304 | lodash.forEach(meta.fieldsMeta, (field, type) => { 305 | if (field.required) { 306 | payload.fields[type] = meta.fields[type]; 307 | } 308 | 309 | let fieldValue = this.findFieldValue(type, options[type], field); 310 | 311 | if (options[type] !== undefined && fieldValue) { 312 | payload.fields[type] = fieldValue; 313 | } else if (field.name === 'Git Pull Request') { 314 | payload.fields[type] = options.submittedLink; 315 | } 316 | }); 317 | 318 | logger.debug('Payload for update'); 319 | logger.debug(JSON.stringify(payload, ' ', 4)); 320 | return payload; 321 | }); 322 | } 323 | 324 | getCreatePayload () { 325 | var options = this.options; 326 | var meta; 327 | var payload = {fields: {}}; 328 | 329 | return this.getNewIssueMeta(options.project, options.issuetype) 330 | .then((data) => { 331 | meta = data; 332 | return this.openFieldQuestions(meta.fieldsMeta, payload); 333 | }) 334 | .then(() => { 335 | if (meta.issueTypeId) { 336 | payload.fields.issuetype = { 337 | id: meta.issueTypeId 338 | }; 339 | } 340 | 341 | if (meta.projectId) { 342 | payload.fields.project = { 343 | id: meta.projectId 344 | }; 345 | } 346 | 347 | logger.debug('Payload for create'); 348 | logger.debug(JSON.stringify(payload, ' ', 4)); 349 | 350 | return payload; 351 | }); 352 | } 353 | 354 | newAction () { 355 | var options = this.options; 356 | 357 | if (!options.project) { 358 | logger.error('Project name argument is missing.'); 359 | } 360 | 361 | logger.log('Creating a new issue on project ' + options.project); 362 | 363 | return this.getCreatePayload() 364 | .then((issue) => { 365 | return this.api.post('/issue', { 366 | body: issue 367 | }); 368 | }) 369 | .then((response) => { 370 | let issue = response.body; 371 | options.jiraNumber = issue.key; 372 | logger.log(this.getIssueUrl(options.jiraNumber)); 373 | }); 374 | } 375 | 376 | updateAction () { 377 | var options = this.options; 378 | 379 | logger.log('Updating JIRA issue ' + options.jiraNumber); 380 | 381 | return this.getUpdatePayload() 382 | .then((payload) => { 383 | return this.api.put('/issue/' + this.api.encode(options.number), { 384 | body: payload 385 | }); 386 | }) 387 | .then(() => { 388 | logger.log(this.getIssueUrl(options.jiraNumber)); 389 | }); 390 | } 391 | 392 | getIssue (number) { 393 | return this.api.get('/issue/' + this.api.encode(number)); 394 | } 395 | 396 | getStatus (number) { 397 | return this.api.get('/issue/' + this.api.encode(number), { 398 | qs: { 399 | fields: 'status' 400 | } 401 | }).then((response) => { 402 | return response.body.fields.status.name; 403 | }).catch((err) => { 404 | logger.debug(query + ' was not found on Jira.'); 405 | }); 406 | } 407 | 408 | comment (jiraNumber, comment) { 409 | return this.getIssue(jiraNumber) 410 | .then((response) => { 411 | let issue = response.body; 412 | comment = this.expandComment(logger.applyReplacements(comment)); 413 | 414 | return this.api.post('/issue/' + this.api.encode(issue.id) + '/comment', { 415 | body: { 416 | body: comment 417 | } 418 | }); 419 | }) 420 | .then((comment) => { 421 | logger.log(this.getIssueUrl(jiraNumber)); 422 | return comment; 423 | }); 424 | } 425 | 426 | label (jiraNumber, label) { 427 | return this.getIssue(jiraNumber) 428 | .then((response) => { 429 | let issue = response.body; 430 | return this.api.put('/issue/' + this.api.encode(issue.id), { 431 | body: { 432 | update: { 433 | labels: [ 434 | { 435 | add: label 436 | } 437 | ] 438 | } 439 | } 440 | }); 441 | }) 442 | .then((result) => { 443 | logger.log(this.getIssueUrl(jiraNumber)); 444 | return result; 445 | }); 446 | } 447 | 448 | 449 | transitionSelector (issue) { 450 | var options = this.options; 451 | 452 | let assignToSomeone = Jira.ASSIGN_TO_SOMEONE_MESSAGE + ' ' + options.assignee; 453 | let choices = [Jira.CANCEL_MESSAGE]; 454 | let transitions = issue.transitions; 455 | 456 | if (options.assignee && options.assignee !== jiraConfig.user) { 457 | choices.push(assignToSomeone); 458 | } 459 | 460 | choices.push( 461 | Jira.ASSIGN_TO_ME_MESSAGE, 462 | Jira.OPEN_ISSUE_IN_BROWSER_MESSAGE, 463 | new inquirer.Separator() 464 | ); 465 | 466 | transitions.forEach((val) => { 467 | choices.push(val.name); 468 | }); 469 | 470 | let promptOptions = [{ 471 | choices: choices, 472 | message: issue.key + ' ' + issue.fields.summary, 473 | name: 'transition', 474 | type: 'list' 475 | }]; 476 | 477 | return new Promise((resolve) => { 478 | inquirer.prompt(promptOptions, (answers) => { 479 | let transition; 480 | 481 | if (answers.transition === assignToSomeone) { 482 | options.assign = true; 483 | } 484 | 485 | if (answers.transition === Jira.ASSIGN_TO_ME_MESSAGE) { 486 | options.assign = true; 487 | options.assignee = jiraConfig.user; 488 | } 489 | 490 | if (answers.transition === Jira.OPEN_ISSUE_IN_BROWSER_MESSAGE) { 491 | options.browser = true; 492 | } 493 | 494 | if (answers.transition !== Jira.CANCEL_MESSAGE) { 495 | transition = lodash.findWhere(transitions, { 496 | name: answers.transition 497 | }); 498 | 499 | if (transition) { 500 | options.transition = transition.name; 501 | } 502 | } 503 | 504 | resolve(issue); 505 | }); 506 | }); 507 | } 508 | 509 | findFieldValueSingle (type, value, field) { 510 | if (field.allowedValues) { 511 | let option = lodash.findWhere(field.allowedValues, { 512 | name: value 513 | }); 514 | 515 | if (!option && value !== undefined && type !== 'project') { 516 | logger.warn('Ignoring unallowed value ' + value + ' for ' + field.name); 517 | } 518 | 519 | return option; 520 | } 521 | 522 | if (field.schema.type === 'string') { 523 | return value; 524 | } 525 | 526 | return { 527 | name: value 528 | }; 529 | } 530 | 531 | findFieldValue (type, value, field) { 532 | if (value && field.schema.type === 'array') { 533 | let res = []; 534 | value = value.split(',').map((x) => { 535 | return x.trim(); 536 | }); 537 | 538 | value.forEach((v) => { 539 | let s = this.findFieldValueSingle(type, v, field); 540 | 541 | if (s) { 542 | res.push(s); 543 | } 544 | }); 545 | 546 | return res; 547 | } 548 | 549 | return this.findFieldValueSingle(type, value, field); 550 | } 551 | 552 | compileObjectValuesTemplate (o) { 553 | var options = this.options; 554 | let value = JSON.stringify(o); 555 | 556 | value = logger.compileTemplate(value, { 557 | jira: jiraConfig, 558 | options: options 559 | }); 560 | 561 | return JSON.parse(value); 562 | } 563 | 564 | openFieldQuestions (fields, payload) { 565 | var operations = []; 566 | var options = this.options; 567 | var transitionConfig = jiraConfig.transition[options.transition]; 568 | 569 | if (transitionConfig) { 570 | transitionConfig = this.compileObjectValuesTemplate(transitionConfig); 571 | } 572 | 573 | lodash.forEach(fields, (field, type) => { 574 | let configValue = transitionConfig && transitionConfig[field.name]; 575 | 576 | if (configValue !== undefined && configValue !== true) { 577 | payload.fields[type] = configValue; 578 | return; 579 | } 580 | 581 | let fieldValue = this.findFieldValue(type, options[type], field); 582 | 583 | if (options[type] !== undefined && fieldValue) { 584 | payload.fields[type] = fieldValue; 585 | return; 586 | } 587 | 588 | if (type === 'project' || (!field.required && configValue !== true)) { 589 | return; 590 | } 591 | 592 | let question = { 593 | message: field.name + ':', 594 | name: 'fieldName' 595 | }; 596 | 597 | if (field.allowedValues) { 598 | question.type = 'list'; 599 | question.choices = field.allowedValues; 600 | question.message = 'Select the ' + question.message; 601 | } 602 | 603 | logger.debug('Trying to add value for:'); 604 | logger.debug(field); 605 | 606 | operations.push(() => { 607 | return new Promise((resolve) => { 608 | inquirer.prompt([question], (answers) => { 609 | fieldValue = this.findFieldValue(type, answers.fieldName, field); 610 | payload.fields[type] = fieldValue; 611 | resolve(); 612 | }); 613 | }); 614 | }); 615 | }); 616 | 617 | return operations.reduce((promise, item) => { 618 | return promise.then(item); 619 | }, Promise.resolve()); 620 | } 621 | 622 | expandTransitionFields (transition, payload) { 623 | var options = this.options; 624 | 625 | return this.api.get('/issue/' + this.api.encode(options.number) + '/transitions', { 626 | qs: { 627 | expand: 'transitions.fields', 628 | transitionId: transition.id 629 | } 630 | }) 631 | .then((response) => { 632 | let body = response.body; 633 | let fields = body.transitions[0].fields; 634 | 635 | return this.openFieldQuestions(fields, payload); 636 | }); 637 | } 638 | 639 | getTransitionPayload (issue) { 640 | var options = this.options; 641 | var message = options.message; 642 | 643 | var transition = lodash.findWhere(issue.transitions, { 644 | name: options.transition 645 | }); 646 | 647 | if (!transition) { 648 | throw 'Can\'t transition to ' + options.transition + '.'; 649 | } 650 | 651 | var payload = { 652 | update: {}, 653 | fields: {}, 654 | transition: { 655 | id: transition.id 656 | } 657 | }; 658 | 659 | if (message) { 660 | message = this.expandComment(logger.applyReplacements(options.message)); 661 | 662 | payload.update.comment = [{ 663 | add: { 664 | body: message 665 | } 666 | }]; 667 | } 668 | 669 | return this.expandTransitionFields(transition, payload) 670 | .then(() => { 671 | logger.debug('Payload for transition'); 672 | logger.debug(JSON.stringify(payload, ' ', 4)); 673 | return payload; 674 | }); 675 | } 676 | 677 | continueTransition (issue) { 678 | var options = this.options; 679 | 680 | logger.log('Transitioning issue ' + options.jiraNumber + ' to ' + options.transition); 681 | 682 | return this.getTransitionPayload(issue) 683 | .then((payload) => { 684 | return this.api.post('/issue/' + this.api.encode(options.jiraNumber) + '/transitions', { 685 | body: payload 686 | }); 687 | }) 688 | .then(() => { 689 | logger.log(this.getIssueUrl(options.jiraNumber)); 690 | }); 691 | } 692 | 693 | transitionAction () { 694 | var options = this.options; 695 | let issue; 696 | 697 | if (!options.jiraNumber) { 698 | return Promise.reject('Skipping JIRA transition, issue number not specified.'); 699 | } 700 | 701 | return this.api.get('/issue/' + this.api.encode(options.number), { 702 | qs: { 703 | expand: 'transitions' 704 | } 705 | }) 706 | .then((response) => { 707 | issue = response.body; 708 | 709 | if (String(options.transition) === 'true') { 710 | options.transition = undefined; 711 | return this.transitionSelector(issue); 712 | } 713 | }) 714 | .then(() => { 715 | if (options.transition) { 716 | return this.continueTransition(issue); 717 | } 718 | }); 719 | } 720 | 721 | commentAction () { 722 | var options = this.options; 723 | logger.log('Adding comment on issue ' + logger.colors.green('#' + options.jiraNumber)); 724 | return this.comment(options.jiraNumber, options.comment); 725 | } 726 | 727 | labelAction () { 728 | var options = this.options; 729 | logger.log('Adding label ' + options.label + ' to issue ' + logger.colors.green('#' + options.jiraNumber)); 730 | return this.label(options.jiraNumber, options.label); 731 | } 732 | 733 | statusAction () { 734 | var options = this.options; 735 | this.getStatus(options.jiraNumber) 736 | .then(status => { 737 | logger.log('Status of issue ' + logger.colors.green('#' + options.jiraNumber) + ' => ' + status); 738 | }); 739 | } 740 | 741 | encryptText (text) { 742 | var cipher = crypto.createCipher( 743 | Jira.CRYPTO_ALGORITHM, Jira.CRYPTO_PASSWORD); 744 | 745 | var crypted = cipher.update(text, 'utf8', 'hex'); 746 | 747 | crypted += cipher.final('hex'); 748 | 749 | return crypted; 750 | } 751 | 752 | getIssueUrl (number) { 753 | return url.format({ 754 | hostname: jiraConfig.host, 755 | pathname: '/browse/' + number, 756 | port: jiraConfig.port, 757 | protocol: jiraConfig.protocol 758 | }); 759 | } 760 | 761 | normalizeOptions () { 762 | var options = this.options; 763 | 764 | options.summary = options.title; 765 | options.description = options.message; 766 | options.components = options.component; 767 | options.issuetype = options.type; 768 | options.versions = options.version; 769 | 770 | options.jiraNumber = options.number; 771 | options.originalAssignee = options.assignee; 772 | options.assignee = options.assignee || jiraConfig.user; 773 | options.jira = jiraConfig; 774 | 775 | if (options.unassign) { 776 | options.assign = true; 777 | options.unassigned = true; 778 | } 779 | 780 | if (options.unassigned) { 781 | options.assignee = null; 782 | } 783 | 784 | options.message = options.message || ''; 785 | options.summary = options.summary || ''; 786 | 787 | if (options.message) { 788 | options.message = logger.applyReplacements(options.message); 789 | } 790 | } 791 | 792 | expandAliases () { 793 | var options = this.options; 794 | 795 | if (config.alias) { 796 | options.assignee = config.alias[options.assignee] || options.assignee; 797 | } 798 | 799 | if (options.new && config.alias) { 800 | options.reporter = config.alias[options.reporter] || options.reporter; 801 | } 802 | } 803 | 804 | expandComment (comment) { 805 | return comment + this.expandEmoji(config.signature); 806 | } 807 | 808 | expandEmoji (content) { 809 | return content.replace('

:octocat:', '\n\n\\\\\n\n!http://nodegh.io/images/octocat.png!') 810 | .replace('*Sent from [GH](http://nodegh.io).*', '_Sent from [GH|http://nodegh.io/]_'); 811 | } 812 | 813 | login () { 814 | let promptOptions = [{ 815 | message: 'Enter your JIRA server', 816 | name: 'host' 817 | }, 818 | { 819 | message: 'Enter your JIRA user', 820 | name: 'user' 821 | }, 822 | { 823 | type: 'password', 824 | message: 'Enter your JIRA password', 825 | name: 'password' 826 | }]; 827 | 828 | return new Promise((resolve) => { 829 | inquirer.prompt(promptOptions, (answers) => { 830 | answers.password = this.encryptText(answers.password); 831 | answers.base = Jira.DEFAULT_JIRA_BASE; 832 | jiraConfig.user = answers.user; 833 | jiraConfig.password = answers.password; 834 | jiraConfig.base = answers.base; 835 | 836 | logger.log('Writing GH config data.'); 837 | base.writeGlobalConfig('plugins.jira', answers); 838 | 839 | resolve(); 840 | }); 841 | }); 842 | } 843 | 844 | selectUserWithQuestion (users) { 845 | let options = { 846 | choices: lodash.pluck(users, 'name'), 847 | message: 'Which user are you looking for?', 848 | name: 'username', 849 | type: 'list' 850 | }; 851 | 852 | return new Promise((resolve) => { 853 | inquirer.prompt([options], (answers) => { 854 | resolve(answers.username); 855 | }); 856 | }); 857 | } 858 | 859 | getIssueEditMeta (number) { 860 | return this.api.get('/issue/' + this.api.encode(number), { 861 | qs: { 862 | expand: 'editmeta' 863 | } 864 | }) 865 | .then((response) => { 866 | let body = response.body; 867 | let editmeta = body.editmeta; 868 | let meta = { 869 | fields: body.fields 870 | }; 871 | 872 | meta.fieldsMeta = editmeta.fields; 873 | 874 | return meta; 875 | }); 876 | } 877 | 878 | getNewIssueMeta (projectName, issueType) { 879 | return this.api.get('/issue/createmeta', { 880 | qs: { 881 | projectKeys: projectName, 882 | issuetypeNames: issueType, 883 | expand: 'projects.issuetypes.fields' 884 | } 885 | }) 886 | .then((response) => { 887 | let project = response.body.projects[0]; 888 | let issueTypes = project.issuetypes; 889 | 890 | if (!issueTypes || issueTypes.length !== 1 || 891 | issueTypes[0].name !== issueType) { 892 | throw 'Issue type not found for the given project.'; 893 | } 894 | 895 | let type = issueTypes[0]; 896 | 897 | let meta = { 898 | projectId: project.id, 899 | issueTypeId: type.id, 900 | fieldsMeta: type.fields, 901 | allowedValues: {} 902 | }; 903 | 904 | return meta; 905 | }); 906 | } 907 | 908 | registerLoggerHelpers () { 909 | logger.registerHelper('jiraIssueLink', () => { 910 | return this.getIssueUrl(this.options.jiraNumber); 911 | }); 912 | } 913 | } 914 | 915 | Jira.DETAILS = { 916 | alias: 'ji', 917 | iterative: 'number', 918 | commands: [ 919 | 'assign', 920 | 'unassign', 921 | 'browser', 922 | 'comment', 923 | 'label', 924 | 'new', 925 | 'status', 926 | 'transition', 927 | 'update' 928 | ], 929 | description: 'NodeGH plugin for integrating Jira, an issue management system.', 930 | options: { 931 | 'assign': Boolean, 932 | 'assignee': String, 933 | 'unassign': Boolean, 934 | 'browser': Boolean, 935 | 'comment': String, 936 | 'component': String, 937 | 'label': String, 938 | 'message': String, 939 | 'new': Boolean, 940 | 'number': [String, Array], 941 | 'priority': String, 942 | 'project': String, 943 | 'reporter': String, 944 | 'submittedLink': String, 945 | 'title': String, 946 | 'transition': [String, Boolean], 947 | 'type': String, 948 | 'update': Boolean, 949 | 'version': String 950 | }, 951 | shorthands: { 952 | 'A': ['--assignee'], 953 | 'B': ['--browser'], 954 | 'c': ['--comment'], 955 | 'C': ['--component'], 956 | 'l': ['--label'], 957 | 'm': ['--message'], 958 | 'N': ['--new'], 959 | 'n': ['--number'], 960 | 'P': ['--priority'], 961 | 'p': ['--project'], 962 | 'R': ['--reporter'], 963 | 't': ['--title'], 964 | 'T': ['--type'], 965 | 'u': ['--update'], 966 | 'v': ['--version'] 967 | }, 968 | payload: function (payload, options) { 969 | if (lodash.intersection(Jira.DETAILS.commands, Object.keys(options)).length === 0) { 970 | options.transition = payload[1] || true; 971 | } 972 | } 973 | }; 974 | 975 | Jira.DEFAULT_JIRA_BASE = 'rest/api/2'; 976 | 977 | Jira.CRYPTO_ALGORITHM = 'AES-256-CBC'; 978 | Jira.CRYPTO_PASSWORD = 'nodegh.io'; 979 | 980 | Jira.CANCEL_MESSAGE = 'Cancel'; 981 | Jira.ASSIGN_TO_ME_MESSAGE = 'Assign to me'; 982 | Jira.ASSIGN_TO_SOMEONE_MESSAGE = 'Assign to'; 983 | Jira.OPEN_ISSUE_IN_BROWSER_MESSAGE = 'Open in browser'; 984 | 985 | Jira.USERS_NOT_FOUND_ERROR = 'Users not found.'; 986 | 987 | let jira = new Jira(); 988 | 989 | exports.setupAfterHooks = function (context, done) { 990 | var options = context.options; 991 | 992 | jira.setIssueNumber(options.pullBranch, options.repo, options); 993 | 994 | context.jira = jiraConfig; 995 | 996 | if (!context.jira.number) { 997 | context.jira.number = {}; 998 | } 999 | 1000 | context.jira.number.current = options.jiraNumber; 1001 | 1002 | done(); 1003 | }; 1004 | 1005 | exports.setupBeforeHooks = function (context, done) { 1006 | var options = context.options; 1007 | 1008 | jira.setIssueNumber(options.pullBranch, options.repo, options); 1009 | 1010 | context.jira = jiraConfig; 1011 | 1012 | if (!context.jira.number) { 1013 | context.jira.number = {}; 1014 | } 1015 | 1016 | context.jira.number.previous = options.jiraNumber; 1017 | 1018 | done(); 1019 | }; 1020 | 1021 | exports.Impl = Jira; 1022 | -------------------------------------------------------------------------------- /gh-plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "base": "rest/api/2", 3 | "hooks": { 4 | "pull-request": { 5 | "close": { 6 | "before": [], 7 | "after": [ 8 | "gh jira {{jira.number.previous}}" 9 | ] 10 | }, 11 | "fetch": { 12 | "before": [], 13 | "after": [] 14 | }, 15 | "fwd": { 16 | "before": [], 17 | "after": [ 18 | "gh jira {{jira.number.current}} --assignee {{options.fwd}} --submittedLink {{forwardedLink}} --transition" 19 | ] 20 | }, 21 | "merge": { 22 | "before": [], 23 | "after": [ 24 | "gh jira {{jira.number.previous}}" 25 | ] 26 | }, 27 | "submit": { 28 | "before": [], 29 | "after": [ 30 | "gh jira {{jira.number.previous}} --assignee {{options.submit}} --submittedLink {{submittedLink}} --transition" 31 | ] 32 | } 33 | } 34 | }, 35 | "host": "issues.liferay.com", 36 | "password": "", 37 | "port": "", 38 | "protocol": "https", 39 | "inferFromCommitTitle": true, 40 | "transition": { 41 | "Close Issue": { 42 | "Fix Version/s": true 43 | }, 44 | "Code Review Request": { 45 | "Assignee": { 46 | "name": "{{options.assignee}}" 47 | }, 48 | "Git Pull Request": "{{options.submittedLink}}" 49 | }, 50 | "Create Review Request": { 51 | "Assignee": { 52 | "name": "{{options.assignee}}" 53 | }, 54 | "Git Pull Request": "{{options.submittedLink}}" 55 | }, 56 | "Send for Review": { 57 | "Assignee": { 58 | "name": "{{options.assignee}}" 59 | }, 60 | "Git Pull Request": "{{options.submittedLink}}" 61 | }, 62 | "Start Progress": { 63 | "Assignee": { 64 | "name": "{{jira.user}}" 65 | } 66 | } 67 | }, 68 | "user": "" 69 | } 70 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gh-jira", 3 | "version": "1.0.7", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "acorn": { 8 | "version": "5.7.1", 9 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", 10 | "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", 11 | "dev": true 12 | }, 13 | "align-text": { 14 | "version": "0.1.4", 15 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 16 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", 17 | "dev": true, 18 | "requires": { 19 | "kind-of": "^3.0.2", 20 | "longest": "^1.0.1", 21 | "repeat-string": "^1.5.2" 22 | } 23 | }, 24 | "alter": { 25 | "version": "0.2.0", 26 | "resolved": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz", 27 | "integrity": "sha1-x1iICGF1cgNKrmJICvJrHU0cs80=", 28 | "dev": true, 29 | "requires": { 30 | "stable": "~0.1.3" 31 | } 32 | }, 33 | "amdefine": { 34 | "version": "1.0.1", 35 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 36 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", 37 | "dev": true 38 | }, 39 | "ansi-escapes": { 40 | "version": "1.4.0", 41 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", 42 | "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" 43 | }, 44 | "ansi-regex": { 45 | "version": "2.1.1", 46 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 47 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 48 | }, 49 | "ansi-styles": { 50 | "version": "2.2.1", 51 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 52 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 53 | }, 54 | "anymatch": { 55 | "version": "1.3.2", 56 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", 57 | "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", 58 | "dev": true, 59 | "requires": { 60 | "micromatch": "^2.1.5", 61 | "normalize-path": "^2.0.0" 62 | } 63 | }, 64 | "arr-diff": { 65 | "version": "2.0.0", 66 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", 67 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", 68 | "dev": true, 69 | "requires": { 70 | "arr-flatten": "^1.0.1" 71 | } 72 | }, 73 | "arr-flatten": { 74 | "version": "1.1.0", 75 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 76 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", 77 | "dev": true 78 | }, 79 | "array-unique": { 80 | "version": "0.2.1", 81 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", 82 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", 83 | "dev": true 84 | }, 85 | "ast-traverse": { 86 | "version": "0.1.1", 87 | "resolved": "https://registry.npmjs.org/ast-traverse/-/ast-traverse-0.1.1.tgz", 88 | "integrity": "sha1-ac8rg4bxnc2hux4F1o/jWdiJfeY=", 89 | "dev": true 90 | }, 91 | "ast-types": { 92 | "version": "0.9.6", 93 | "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", 94 | "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", 95 | "dev": true 96 | }, 97 | "async-each": { 98 | "version": "1.0.1", 99 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", 100 | "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", 101 | "dev": true 102 | }, 103 | "babel": { 104 | "version": "5.8.38", 105 | "resolved": "http://registry.npmjs.org/babel/-/babel-5.8.38.tgz", 106 | "integrity": "sha1-37CHwiiUkXxXb7Z86c8yjUWGKfs=", 107 | "dev": true, 108 | "requires": { 109 | "babel-core": "^5.6.21", 110 | "chokidar": "^1.0.0", 111 | "commander": "^2.6.0", 112 | "convert-source-map": "^1.1.0", 113 | "fs-readdir-recursive": "^0.1.0", 114 | "glob": "^5.0.5", 115 | "lodash": "^3.2.0", 116 | "output-file-sync": "^1.1.0", 117 | "path-exists": "^1.0.0", 118 | "path-is-absolute": "^1.0.0", 119 | "slash": "^1.0.0", 120 | "source-map": "^0.5.0" 121 | }, 122 | "dependencies": { 123 | "lodash": { 124 | "version": "3.10.1", 125 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", 126 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", 127 | "dev": true 128 | } 129 | } 130 | }, 131 | "babel-core": { 132 | "version": "5.8.38", 133 | "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", 134 | "integrity": "sha1-H8ruedfmG3ULALjlT238nQr4ZVg=", 135 | "dev": true, 136 | "requires": { 137 | "babel-plugin-constant-folding": "^1.0.1", 138 | "babel-plugin-dead-code-elimination": "^1.0.2", 139 | "babel-plugin-eval": "^1.0.1", 140 | "babel-plugin-inline-environment-variables": "^1.0.1", 141 | "babel-plugin-jscript": "^1.0.4", 142 | "babel-plugin-member-expression-literals": "^1.0.1", 143 | "babel-plugin-property-literals": "^1.0.1", 144 | "babel-plugin-proto-to-assign": "^1.0.3", 145 | "babel-plugin-react-constant-elements": "^1.0.3", 146 | "babel-plugin-react-display-name": "^1.0.3", 147 | "babel-plugin-remove-console": "^1.0.1", 148 | "babel-plugin-remove-debugger": "^1.0.1", 149 | "babel-plugin-runtime": "^1.0.7", 150 | "babel-plugin-undeclared-variables-check": "^1.0.2", 151 | "babel-plugin-undefined-to-void": "^1.1.6", 152 | "babylon": "^5.8.38", 153 | "bluebird": "^2.9.33", 154 | "chalk": "^1.0.0", 155 | "convert-source-map": "^1.1.0", 156 | "core-js": "^1.0.0", 157 | "debug": "^2.1.1", 158 | "detect-indent": "^3.0.0", 159 | "esutils": "^2.0.0", 160 | "fs-readdir-recursive": "^0.1.0", 161 | "globals": "^6.4.0", 162 | "home-or-tmp": "^1.0.0", 163 | "is-integer": "^1.0.4", 164 | "js-tokens": "1.0.1", 165 | "json5": "^0.4.0", 166 | "lodash": "^3.10.0", 167 | "minimatch": "^2.0.3", 168 | "output-file-sync": "^1.1.0", 169 | "path-exists": "^1.0.0", 170 | "path-is-absolute": "^1.0.0", 171 | "private": "^0.1.6", 172 | "regenerator": "0.8.40", 173 | "regexpu": "^1.3.0", 174 | "repeating": "^1.1.2", 175 | "resolve": "^1.1.6", 176 | "shebang-regex": "^1.0.0", 177 | "slash": "^1.0.0", 178 | "source-map": "^0.5.0", 179 | "source-map-support": "^0.2.10", 180 | "to-fast-properties": "^1.0.0", 181 | "trim-right": "^1.0.0", 182 | "try-resolve": "^1.0.0" 183 | }, 184 | "dependencies": { 185 | "lodash": { 186 | "version": "3.10.1", 187 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", 188 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", 189 | "dev": true 190 | } 191 | } 192 | }, 193 | "babel-plugin-constant-folding": { 194 | "version": "1.0.1", 195 | "resolved": "https://registry.npmjs.org/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz", 196 | "integrity": "sha1-g2HTZMmORJw2kr26Ue/whEKQqo4=", 197 | "dev": true 198 | }, 199 | "babel-plugin-dead-code-elimination": { 200 | "version": "1.0.2", 201 | "resolved": "https://registry.npmjs.org/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz", 202 | "integrity": "sha1-X3xFEnTc18zNv7s+C4XdKBIfD2U=", 203 | "dev": true 204 | }, 205 | "babel-plugin-eval": { 206 | "version": "1.0.1", 207 | "resolved": "https://registry.npmjs.org/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz", 208 | "integrity": "sha1-ovrtJc5r5preS/7CY/cBaRlZUNo=", 209 | "dev": true 210 | }, 211 | "babel-plugin-inline-environment-variables": { 212 | "version": "1.0.1", 213 | "resolved": "https://registry.npmjs.org/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz", 214 | "integrity": "sha1-H1jOkSB61qgmqL9kX6/mj/X+P/4=", 215 | "dev": true 216 | }, 217 | "babel-plugin-jscript": { 218 | "version": "1.0.4", 219 | "resolved": "https://registry.npmjs.org/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz", 220 | "integrity": "sha1-jzQsOCduh6R9X6CovT1etsytj8w=", 221 | "dev": true 222 | }, 223 | "babel-plugin-member-expression-literals": { 224 | "version": "1.0.1", 225 | "resolved": "https://registry.npmjs.org/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz", 226 | "integrity": "sha1-zF7bD6qNyScXDnTW0cAkQAIWJNM=", 227 | "dev": true 228 | }, 229 | "babel-plugin-property-literals": { 230 | "version": "1.0.1", 231 | "resolved": "https://registry.npmjs.org/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz", 232 | "integrity": "sha1-AlIwGQAZKYCxwRjv6kjOk6q4MzY=", 233 | "dev": true 234 | }, 235 | "babel-plugin-proto-to-assign": { 236 | "version": "1.0.4", 237 | "resolved": "https://registry.npmjs.org/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz", 238 | "integrity": "sha1-xJ56/QL1d7xNoF6i3wAiUM980SM=", 239 | "dev": true, 240 | "requires": { 241 | "lodash": "^3.9.3" 242 | }, 243 | "dependencies": { 244 | "lodash": { 245 | "version": "3.10.1", 246 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", 247 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", 248 | "dev": true 249 | } 250 | } 251 | }, 252 | "babel-plugin-react-constant-elements": { 253 | "version": "1.0.3", 254 | "resolved": "https://registry.npmjs.org/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz", 255 | "integrity": "sha1-lGc26DeEKcvDSdz/YvUcFDs041o=", 256 | "dev": true 257 | }, 258 | "babel-plugin-react-display-name": { 259 | "version": "1.0.3", 260 | "resolved": "https://registry.npmjs.org/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz", 261 | "integrity": "sha1-dU/jiSboQkpOexWrbqYTne4FFPw=", 262 | "dev": true 263 | }, 264 | "babel-plugin-remove-console": { 265 | "version": "1.0.1", 266 | "resolved": "https://registry.npmjs.org/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz", 267 | "integrity": "sha1-2PJFVsOgUAXUKqqv0neH9T/wE6c=", 268 | "dev": true 269 | }, 270 | "babel-plugin-remove-debugger": { 271 | "version": "1.0.1", 272 | "resolved": "https://registry.npmjs.org/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz", 273 | "integrity": "sha1-/S6jzWGkKK0fO5yJiC/0KT6MFMc=", 274 | "dev": true 275 | }, 276 | "babel-plugin-runtime": { 277 | "version": "1.0.7", 278 | "resolved": "https://registry.npmjs.org/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz", 279 | "integrity": "sha1-v3x9lm3Vbs1cF/ocslPJrLflSq8=", 280 | "dev": true 281 | }, 282 | "babel-plugin-undeclared-variables-check": { 283 | "version": "1.0.2", 284 | "resolved": "https://registry.npmjs.org/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz", 285 | "integrity": "sha1-XPGqU52BP/ZOmWQSkK9iCWX2Xe4=", 286 | "dev": true, 287 | "requires": { 288 | "leven": "^1.0.2" 289 | } 290 | }, 291 | "babel-plugin-undefined-to-void": { 292 | "version": "1.1.6", 293 | "resolved": "https://registry.npmjs.org/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz", 294 | "integrity": "sha1-f1eO+LeN+uYAM4XYQXph7aBuL4E=", 295 | "dev": true 296 | }, 297 | "babylon": { 298 | "version": "5.8.38", 299 | "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", 300 | "integrity": "sha1-7JsSCxG/bM1Bc6GL8hfmC3mFn/0=", 301 | "dev": true 302 | }, 303 | "balanced-match": { 304 | "version": "1.0.0", 305 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 306 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 307 | "dev": true 308 | }, 309 | "binary-extensions": { 310 | "version": "1.11.0", 311 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", 312 | "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", 313 | "dev": true 314 | }, 315 | "bluebird": { 316 | "version": "2.11.0", 317 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", 318 | "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", 319 | "dev": true 320 | }, 321 | "brace-expansion": { 322 | "version": "1.1.11", 323 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 324 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 325 | "dev": true, 326 | "requires": { 327 | "balanced-match": "^1.0.0", 328 | "concat-map": "0.0.1" 329 | } 330 | }, 331 | "braces": { 332 | "version": "1.8.5", 333 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", 334 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", 335 | "dev": true, 336 | "requires": { 337 | "expand-range": "^1.8.1", 338 | "preserve": "^0.2.0", 339 | "repeat-element": "^1.1.2" 340 | } 341 | }, 342 | "breakable": { 343 | "version": "1.0.0", 344 | "resolved": "https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz", 345 | "integrity": "sha1-eEp5eRWjjq0nutRWtVcstLuqeME=", 346 | "dev": true 347 | }, 348 | "camelcase": { 349 | "version": "1.2.1", 350 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 351 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", 352 | "dev": true 353 | }, 354 | "center-align": { 355 | "version": "0.1.3", 356 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 357 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 358 | "dev": true, 359 | "requires": { 360 | "align-text": "^0.1.3", 361 | "lazy-cache": "^1.0.3" 362 | } 363 | }, 364 | "chalk": { 365 | "version": "1.1.3", 366 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 367 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 368 | "requires": { 369 | "ansi-styles": "^2.2.1", 370 | "escape-string-regexp": "^1.0.2", 371 | "has-ansi": "^2.0.0", 372 | "strip-ansi": "^3.0.0", 373 | "supports-color": "^2.0.0" 374 | } 375 | }, 376 | "chokidar": { 377 | "version": "1.7.0", 378 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", 379 | "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", 380 | "dev": true, 381 | "requires": { 382 | "anymatch": "^1.3.0", 383 | "async-each": "^1.0.0", 384 | "fsevents": "^1.0.0", 385 | "glob-parent": "^2.0.0", 386 | "inherits": "^2.0.1", 387 | "is-binary-path": "^1.0.0", 388 | "is-glob": "^2.0.0", 389 | "path-is-absolute": "^1.0.0", 390 | "readdirp": "^2.0.0" 391 | } 392 | }, 393 | "cli": { 394 | "version": "1.0.1", 395 | "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", 396 | "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", 397 | "dev": true, 398 | "requires": { 399 | "exit": "0.1.2", 400 | "glob": "^7.1.1" 401 | }, 402 | "dependencies": { 403 | "glob": { 404 | "version": "7.1.2", 405 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 406 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 407 | "dev": true, 408 | "requires": { 409 | "fs.realpath": "^1.0.0", 410 | "inflight": "^1.0.4", 411 | "inherits": "2", 412 | "minimatch": "^3.0.4", 413 | "once": "^1.3.0", 414 | "path-is-absolute": "^1.0.0" 415 | } 416 | }, 417 | "minimatch": { 418 | "version": "3.0.4", 419 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 420 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 421 | "dev": true, 422 | "requires": { 423 | "brace-expansion": "^1.1.7" 424 | } 425 | } 426 | } 427 | }, 428 | "cli-cursor": { 429 | "version": "1.0.2", 430 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", 431 | "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", 432 | "requires": { 433 | "restore-cursor": "^1.0.1" 434 | } 435 | }, 436 | "cli-width": { 437 | "version": "2.2.0", 438 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 439 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" 440 | }, 441 | "cliui": { 442 | "version": "2.1.0", 443 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 444 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 445 | "dev": true, 446 | "requires": { 447 | "center-align": "^0.1.1", 448 | "right-align": "^0.1.1", 449 | "wordwrap": "0.0.2" 450 | } 451 | }, 452 | "code-point-at": { 453 | "version": "1.1.0", 454 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 455 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 456 | }, 457 | "commander": { 458 | "version": "2.16.0", 459 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz", 460 | "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==", 461 | "dev": true 462 | }, 463 | "commoner": { 464 | "version": "0.10.8", 465 | "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", 466 | "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", 467 | "dev": true, 468 | "requires": { 469 | "commander": "^2.5.0", 470 | "detective": "^4.3.1", 471 | "glob": "^5.0.15", 472 | "graceful-fs": "^4.1.2", 473 | "iconv-lite": "^0.4.5", 474 | "mkdirp": "^0.5.0", 475 | "private": "^0.1.6", 476 | "q": "^1.1.2", 477 | "recast": "^0.11.17" 478 | }, 479 | "dependencies": { 480 | "esprima": { 481 | "version": "3.1.3", 482 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", 483 | "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", 484 | "dev": true 485 | }, 486 | "recast": { 487 | "version": "0.11.23", 488 | "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", 489 | "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", 490 | "dev": true, 491 | "requires": { 492 | "ast-types": "0.9.6", 493 | "esprima": "~3.1.0", 494 | "private": "~0.1.5", 495 | "source-map": "~0.5.0" 496 | } 497 | } 498 | } 499 | }, 500 | "concat-map": { 501 | "version": "0.0.1", 502 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 503 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 504 | "dev": true 505 | }, 506 | "console-browserify": { 507 | "version": "1.1.0", 508 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", 509 | "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", 510 | "dev": true, 511 | "requires": { 512 | "date-now": "^0.1.4" 513 | } 514 | }, 515 | "convert-source-map": { 516 | "version": "1.5.1", 517 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", 518 | "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", 519 | "dev": true 520 | }, 521 | "core-js": { 522 | "version": "1.2.7", 523 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", 524 | "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", 525 | "dev": true 526 | }, 527 | "core-util-is": { 528 | "version": "1.0.2", 529 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 530 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 531 | "dev": true 532 | }, 533 | "date-now": { 534 | "version": "0.1.4", 535 | "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", 536 | "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", 537 | "dev": true 538 | }, 539 | "debug": { 540 | "version": "2.6.9", 541 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 542 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 543 | "dev": true, 544 | "requires": { 545 | "ms": "2.0.0" 546 | } 547 | }, 548 | "decamelize": { 549 | "version": "1.2.0", 550 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 551 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 552 | "dev": true 553 | }, 554 | "defined": { 555 | "version": "1.0.0", 556 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 557 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 558 | "dev": true 559 | }, 560 | "defs": { 561 | "version": "1.1.1", 562 | "resolved": "https://registry.npmjs.org/defs/-/defs-1.1.1.tgz", 563 | "integrity": "sha1-siYJ8sehG6ej2xFoBcE5scr/qdI=", 564 | "dev": true, 565 | "requires": { 566 | "alter": "~0.2.0", 567 | "ast-traverse": "~0.1.1", 568 | "breakable": "~1.0.0", 569 | "esprima-fb": "~15001.1001.0-dev-harmony-fb", 570 | "simple-fmt": "~0.1.0", 571 | "simple-is": "~0.2.0", 572 | "stringmap": "~0.2.2", 573 | "stringset": "~0.2.1", 574 | "tryor": "~0.1.2", 575 | "yargs": "~3.27.0" 576 | } 577 | }, 578 | "detect-indent": { 579 | "version": "3.0.1", 580 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", 581 | "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", 582 | "dev": true, 583 | "requires": { 584 | "get-stdin": "^4.0.1", 585 | "minimist": "^1.1.0", 586 | "repeating": "^1.1.0" 587 | } 588 | }, 589 | "detective": { 590 | "version": "4.7.1", 591 | "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", 592 | "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", 593 | "dev": true, 594 | "requires": { 595 | "acorn": "^5.2.1", 596 | "defined": "^1.0.0" 597 | } 598 | }, 599 | "diff": { 600 | "version": "1.4.0", 601 | "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", 602 | "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", 603 | "dev": true 604 | }, 605 | "dom-serializer": { 606 | "version": "0.1.0", 607 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", 608 | "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", 609 | "dev": true, 610 | "requires": { 611 | "domelementtype": "~1.1.1", 612 | "entities": "~1.1.1" 613 | }, 614 | "dependencies": { 615 | "domelementtype": { 616 | "version": "1.1.3", 617 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", 618 | "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", 619 | "dev": true 620 | }, 621 | "entities": { 622 | "version": "1.1.1", 623 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", 624 | "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", 625 | "dev": true 626 | } 627 | } 628 | }, 629 | "domelementtype": { 630 | "version": "1.3.0", 631 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", 632 | "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", 633 | "dev": true 634 | }, 635 | "domhandler": { 636 | "version": "2.3.0", 637 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", 638 | "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", 639 | "dev": true, 640 | "requires": { 641 | "domelementtype": "1" 642 | } 643 | }, 644 | "domutils": { 645 | "version": "1.5.1", 646 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", 647 | "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", 648 | "dev": true, 649 | "requires": { 650 | "dom-serializer": "0", 651 | "domelementtype": "1" 652 | } 653 | }, 654 | "entities": { 655 | "version": "1.0.0", 656 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", 657 | "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", 658 | "dev": true 659 | }, 660 | "escape-string-regexp": { 661 | "version": "1.0.5", 662 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 663 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 664 | }, 665 | "esprima-fb": { 666 | "version": "15001.1001.0-dev-harmony-fb", 667 | "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", 668 | "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=", 669 | "dev": true 670 | }, 671 | "esutils": { 672 | "version": "2.0.2", 673 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 674 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 675 | "dev": true 676 | }, 677 | "exit": { 678 | "version": "0.1.2", 679 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 680 | "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", 681 | "dev": true 682 | }, 683 | "exit-hook": { 684 | "version": "1.1.1", 685 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", 686 | "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=" 687 | }, 688 | "expand-brackets": { 689 | "version": "0.1.5", 690 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", 691 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", 692 | "dev": true, 693 | "requires": { 694 | "is-posix-bracket": "^0.1.0" 695 | } 696 | }, 697 | "expand-range": { 698 | "version": "1.8.2", 699 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", 700 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", 701 | "dev": true, 702 | "requires": { 703 | "fill-range": "^2.1.0" 704 | } 705 | }, 706 | "extglob": { 707 | "version": "0.3.2", 708 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", 709 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", 710 | "dev": true, 711 | "requires": { 712 | "is-extglob": "^1.0.0" 713 | } 714 | }, 715 | "figures": { 716 | "version": "1.7.0", 717 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 718 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", 719 | "requires": { 720 | "escape-string-regexp": "^1.0.5", 721 | "object-assign": "^4.1.0" 722 | } 723 | }, 724 | "filename-regex": { 725 | "version": "2.0.1", 726 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", 727 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", 728 | "dev": true 729 | }, 730 | "fill-range": { 731 | "version": "2.2.4", 732 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", 733 | "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", 734 | "dev": true, 735 | "requires": { 736 | "is-number": "^2.1.0", 737 | "isobject": "^2.0.0", 738 | "randomatic": "^3.0.0", 739 | "repeat-element": "^1.1.2", 740 | "repeat-string": "^1.5.2" 741 | } 742 | }, 743 | "for-in": { 744 | "version": "1.0.2", 745 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 746 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 747 | "dev": true 748 | }, 749 | "for-own": { 750 | "version": "0.1.5", 751 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", 752 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", 753 | "dev": true, 754 | "requires": { 755 | "for-in": "^1.0.1" 756 | } 757 | }, 758 | "fs-readdir-recursive": { 759 | "version": "0.1.2", 760 | "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz", 761 | "integrity": "sha1-MVtPuMHKW4xH3v7zGdBz2tNWgFk=", 762 | "dev": true 763 | }, 764 | "fs.realpath": { 765 | "version": "1.0.0", 766 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 767 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 768 | "dev": true 769 | }, 770 | "fsevents": { 771 | "version": "1.2.4", 772 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", 773 | "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", 774 | "dev": true, 775 | "optional": true, 776 | "requires": { 777 | "nan": "^2.9.2", 778 | "node-pre-gyp": "^0.10.0" 779 | }, 780 | "dependencies": { 781 | "abbrev": { 782 | "version": "1.1.1", 783 | "bundled": true, 784 | "dev": true, 785 | "optional": true 786 | }, 787 | "ansi-regex": { 788 | "version": "2.1.1", 789 | "bundled": true, 790 | "dev": true, 791 | "optional": true 792 | }, 793 | "aproba": { 794 | "version": "1.2.0", 795 | "bundled": true, 796 | "dev": true, 797 | "optional": true 798 | }, 799 | "are-we-there-yet": { 800 | "version": "1.1.4", 801 | "bundled": true, 802 | "dev": true, 803 | "optional": true, 804 | "requires": { 805 | "delegates": "^1.0.0", 806 | "readable-stream": "^2.0.6" 807 | } 808 | }, 809 | "balanced-match": { 810 | "version": "1.0.0", 811 | "bundled": true, 812 | "dev": true, 813 | "optional": true 814 | }, 815 | "brace-expansion": { 816 | "version": "1.1.11", 817 | "bundled": true, 818 | "dev": true, 819 | "optional": true, 820 | "requires": { 821 | "balanced-match": "^1.0.0", 822 | "concat-map": "0.0.1" 823 | } 824 | }, 825 | "chownr": { 826 | "version": "1.0.1", 827 | "bundled": true, 828 | "dev": true, 829 | "optional": true 830 | }, 831 | "code-point-at": { 832 | "version": "1.1.0", 833 | "bundled": true, 834 | "dev": true, 835 | "optional": true 836 | }, 837 | "concat-map": { 838 | "version": "0.0.1", 839 | "bundled": true, 840 | "dev": true, 841 | "optional": true 842 | }, 843 | "console-control-strings": { 844 | "version": "1.1.0", 845 | "bundled": true, 846 | "dev": true, 847 | "optional": true 848 | }, 849 | "core-util-is": { 850 | "version": "1.0.2", 851 | "bundled": true, 852 | "dev": true, 853 | "optional": true 854 | }, 855 | "debug": { 856 | "version": "2.6.9", 857 | "bundled": true, 858 | "dev": true, 859 | "optional": true, 860 | "requires": { 861 | "ms": "2.0.0" 862 | } 863 | }, 864 | "deep-extend": { 865 | "version": "0.5.1", 866 | "bundled": true, 867 | "dev": true, 868 | "optional": true 869 | }, 870 | "delegates": { 871 | "version": "1.0.0", 872 | "bundled": true, 873 | "dev": true, 874 | "optional": true 875 | }, 876 | "detect-libc": { 877 | "version": "1.0.3", 878 | "bundled": true, 879 | "dev": true, 880 | "optional": true 881 | }, 882 | "fs-minipass": { 883 | "version": "1.2.5", 884 | "bundled": true, 885 | "dev": true, 886 | "optional": true, 887 | "requires": { 888 | "minipass": "^2.2.1" 889 | } 890 | }, 891 | "fs.realpath": { 892 | "version": "1.0.0", 893 | "bundled": true, 894 | "dev": true, 895 | "optional": true 896 | }, 897 | "gauge": { 898 | "version": "2.7.4", 899 | "bundled": true, 900 | "dev": true, 901 | "optional": true, 902 | "requires": { 903 | "aproba": "^1.0.3", 904 | "console-control-strings": "^1.0.0", 905 | "has-unicode": "^2.0.0", 906 | "object-assign": "^4.1.0", 907 | "signal-exit": "^3.0.0", 908 | "string-width": "^1.0.1", 909 | "strip-ansi": "^3.0.1", 910 | "wide-align": "^1.1.0" 911 | } 912 | }, 913 | "glob": { 914 | "version": "7.1.2", 915 | "bundled": true, 916 | "dev": true, 917 | "optional": true, 918 | "requires": { 919 | "fs.realpath": "^1.0.0", 920 | "inflight": "^1.0.4", 921 | "inherits": "2", 922 | "minimatch": "^3.0.4", 923 | "once": "^1.3.0", 924 | "path-is-absolute": "^1.0.0" 925 | } 926 | }, 927 | "has-unicode": { 928 | "version": "2.0.1", 929 | "bundled": true, 930 | "dev": true, 931 | "optional": true 932 | }, 933 | "iconv-lite": { 934 | "version": "0.4.21", 935 | "bundled": true, 936 | "dev": true, 937 | "optional": true, 938 | "requires": { 939 | "safer-buffer": "^2.1.0" 940 | } 941 | }, 942 | "ignore-walk": { 943 | "version": "3.0.1", 944 | "bundled": true, 945 | "dev": true, 946 | "optional": true, 947 | "requires": { 948 | "minimatch": "^3.0.4" 949 | } 950 | }, 951 | "inflight": { 952 | "version": "1.0.6", 953 | "bundled": true, 954 | "dev": true, 955 | "optional": true, 956 | "requires": { 957 | "once": "^1.3.0", 958 | "wrappy": "1" 959 | } 960 | }, 961 | "inherits": { 962 | "version": "2.0.3", 963 | "bundled": true, 964 | "dev": true, 965 | "optional": true 966 | }, 967 | "ini": { 968 | "version": "1.3.5", 969 | "bundled": true, 970 | "dev": true, 971 | "optional": true 972 | }, 973 | "is-fullwidth-code-point": { 974 | "version": "1.0.0", 975 | "bundled": true, 976 | "dev": true, 977 | "optional": true, 978 | "requires": { 979 | "number-is-nan": "^1.0.0" 980 | } 981 | }, 982 | "isarray": { 983 | "version": "1.0.0", 984 | "bundled": true, 985 | "dev": true, 986 | "optional": true 987 | }, 988 | "minimatch": { 989 | "version": "3.0.4", 990 | "bundled": true, 991 | "dev": true, 992 | "optional": true, 993 | "requires": { 994 | "brace-expansion": "^1.1.7" 995 | } 996 | }, 997 | "minimist": { 998 | "version": "0.0.8", 999 | "bundled": true, 1000 | "dev": true, 1001 | "optional": true 1002 | }, 1003 | "minipass": { 1004 | "version": "2.2.4", 1005 | "bundled": true, 1006 | "dev": true, 1007 | "optional": true, 1008 | "requires": { 1009 | "safe-buffer": "^5.1.1", 1010 | "yallist": "^3.0.0" 1011 | } 1012 | }, 1013 | "minizlib": { 1014 | "version": "1.1.0", 1015 | "bundled": true, 1016 | "dev": true, 1017 | "optional": true, 1018 | "requires": { 1019 | "minipass": "^2.2.1" 1020 | } 1021 | }, 1022 | "mkdirp": { 1023 | "version": "0.5.1", 1024 | "bundled": true, 1025 | "dev": true, 1026 | "optional": true, 1027 | "requires": { 1028 | "minimist": "0.0.8" 1029 | } 1030 | }, 1031 | "ms": { 1032 | "version": "2.0.0", 1033 | "bundled": true, 1034 | "dev": true, 1035 | "optional": true 1036 | }, 1037 | "needle": { 1038 | "version": "2.2.0", 1039 | "bundled": true, 1040 | "dev": true, 1041 | "optional": true, 1042 | "requires": { 1043 | "debug": "^2.1.2", 1044 | "iconv-lite": "^0.4.4", 1045 | "sax": "^1.2.4" 1046 | } 1047 | }, 1048 | "node-pre-gyp": { 1049 | "version": "0.10.0", 1050 | "bundled": true, 1051 | "dev": true, 1052 | "optional": true, 1053 | "requires": { 1054 | "detect-libc": "^1.0.2", 1055 | "mkdirp": "^0.5.1", 1056 | "needle": "^2.2.0", 1057 | "nopt": "^4.0.1", 1058 | "npm-packlist": "^1.1.6", 1059 | "npmlog": "^4.0.2", 1060 | "rc": "^1.1.7", 1061 | "rimraf": "^2.6.1", 1062 | "semver": "^5.3.0", 1063 | "tar": "^4" 1064 | } 1065 | }, 1066 | "nopt": { 1067 | "version": "4.0.1", 1068 | "bundled": true, 1069 | "dev": true, 1070 | "optional": true, 1071 | "requires": { 1072 | "abbrev": "1", 1073 | "osenv": "^0.1.4" 1074 | } 1075 | }, 1076 | "npm-bundled": { 1077 | "version": "1.0.3", 1078 | "bundled": true, 1079 | "dev": true, 1080 | "optional": true 1081 | }, 1082 | "npm-packlist": { 1083 | "version": "1.1.10", 1084 | "bundled": true, 1085 | "dev": true, 1086 | "optional": true, 1087 | "requires": { 1088 | "ignore-walk": "^3.0.1", 1089 | "npm-bundled": "^1.0.1" 1090 | } 1091 | }, 1092 | "npmlog": { 1093 | "version": "4.1.2", 1094 | "bundled": true, 1095 | "dev": true, 1096 | "optional": true, 1097 | "requires": { 1098 | "are-we-there-yet": "~1.1.2", 1099 | "console-control-strings": "~1.1.0", 1100 | "gauge": "~2.7.3", 1101 | "set-blocking": "~2.0.0" 1102 | } 1103 | }, 1104 | "number-is-nan": { 1105 | "version": "1.0.1", 1106 | "bundled": true, 1107 | "dev": true, 1108 | "optional": true 1109 | }, 1110 | "object-assign": { 1111 | "version": "4.1.1", 1112 | "bundled": true, 1113 | "dev": true, 1114 | "optional": true 1115 | }, 1116 | "once": { 1117 | "version": "1.4.0", 1118 | "bundled": true, 1119 | "dev": true, 1120 | "optional": true, 1121 | "requires": { 1122 | "wrappy": "1" 1123 | } 1124 | }, 1125 | "os-homedir": { 1126 | "version": "1.0.2", 1127 | "bundled": true, 1128 | "dev": true, 1129 | "optional": true 1130 | }, 1131 | "os-tmpdir": { 1132 | "version": "1.0.2", 1133 | "bundled": true, 1134 | "dev": true, 1135 | "optional": true 1136 | }, 1137 | "osenv": { 1138 | "version": "0.1.5", 1139 | "bundled": true, 1140 | "dev": true, 1141 | "optional": true, 1142 | "requires": { 1143 | "os-homedir": "^1.0.0", 1144 | "os-tmpdir": "^1.0.0" 1145 | } 1146 | }, 1147 | "path-is-absolute": { 1148 | "version": "1.0.1", 1149 | "bundled": true, 1150 | "dev": true, 1151 | "optional": true 1152 | }, 1153 | "process-nextick-args": { 1154 | "version": "2.0.0", 1155 | "bundled": true, 1156 | "dev": true, 1157 | "optional": true 1158 | }, 1159 | "rc": { 1160 | "version": "1.2.7", 1161 | "bundled": true, 1162 | "dev": true, 1163 | "optional": true, 1164 | "requires": { 1165 | "deep-extend": "^0.5.1", 1166 | "ini": "~1.3.0", 1167 | "minimist": "^1.2.0", 1168 | "strip-json-comments": "~2.0.1" 1169 | }, 1170 | "dependencies": { 1171 | "minimist": { 1172 | "version": "1.2.0", 1173 | "bundled": true, 1174 | "dev": true, 1175 | "optional": true 1176 | } 1177 | } 1178 | }, 1179 | "readable-stream": { 1180 | "version": "2.3.6", 1181 | "bundled": true, 1182 | "dev": true, 1183 | "optional": true, 1184 | "requires": { 1185 | "core-util-is": "~1.0.0", 1186 | "inherits": "~2.0.3", 1187 | "isarray": "~1.0.0", 1188 | "process-nextick-args": "~2.0.0", 1189 | "safe-buffer": "~5.1.1", 1190 | "string_decoder": "~1.1.1", 1191 | "util-deprecate": "~1.0.1" 1192 | } 1193 | }, 1194 | "rimraf": { 1195 | "version": "2.6.2", 1196 | "bundled": true, 1197 | "dev": true, 1198 | "optional": true, 1199 | "requires": { 1200 | "glob": "^7.0.5" 1201 | } 1202 | }, 1203 | "safe-buffer": { 1204 | "version": "5.1.1", 1205 | "bundled": true, 1206 | "dev": true, 1207 | "optional": true 1208 | }, 1209 | "safer-buffer": { 1210 | "version": "2.1.2", 1211 | "bundled": true, 1212 | "dev": true, 1213 | "optional": true 1214 | }, 1215 | "sax": { 1216 | "version": "1.2.4", 1217 | "bundled": true, 1218 | "dev": true, 1219 | "optional": true 1220 | }, 1221 | "semver": { 1222 | "version": "5.5.0", 1223 | "bundled": true, 1224 | "dev": true, 1225 | "optional": true 1226 | }, 1227 | "set-blocking": { 1228 | "version": "2.0.0", 1229 | "bundled": true, 1230 | "dev": true, 1231 | "optional": true 1232 | }, 1233 | "signal-exit": { 1234 | "version": "3.0.2", 1235 | "bundled": true, 1236 | "dev": true, 1237 | "optional": true 1238 | }, 1239 | "string-width": { 1240 | "version": "1.0.2", 1241 | "bundled": true, 1242 | "dev": true, 1243 | "optional": true, 1244 | "requires": { 1245 | "code-point-at": "^1.0.0", 1246 | "is-fullwidth-code-point": "^1.0.0", 1247 | "strip-ansi": "^3.0.0" 1248 | } 1249 | }, 1250 | "string_decoder": { 1251 | "version": "1.1.1", 1252 | "bundled": true, 1253 | "dev": true, 1254 | "optional": true, 1255 | "requires": { 1256 | "safe-buffer": "~5.1.0" 1257 | } 1258 | }, 1259 | "strip-ansi": { 1260 | "version": "3.0.1", 1261 | "bundled": true, 1262 | "dev": true, 1263 | "optional": true, 1264 | "requires": { 1265 | "ansi-regex": "^2.0.0" 1266 | } 1267 | }, 1268 | "strip-json-comments": { 1269 | "version": "2.0.1", 1270 | "bundled": true, 1271 | "dev": true, 1272 | "optional": true 1273 | }, 1274 | "tar": { 1275 | "version": "4.4.1", 1276 | "bundled": true, 1277 | "dev": true, 1278 | "optional": true, 1279 | "requires": { 1280 | "chownr": "^1.0.1", 1281 | "fs-minipass": "^1.2.5", 1282 | "minipass": "^2.2.4", 1283 | "minizlib": "^1.1.0", 1284 | "mkdirp": "^0.5.0", 1285 | "safe-buffer": "^5.1.1", 1286 | "yallist": "^3.0.2" 1287 | } 1288 | }, 1289 | "util-deprecate": { 1290 | "version": "1.0.2", 1291 | "bundled": true, 1292 | "dev": true, 1293 | "optional": true 1294 | }, 1295 | "wide-align": { 1296 | "version": "1.1.2", 1297 | "bundled": true, 1298 | "dev": true, 1299 | "optional": true, 1300 | "requires": { 1301 | "string-width": "^1.0.2" 1302 | } 1303 | }, 1304 | "wrappy": { 1305 | "version": "1.0.2", 1306 | "bundled": true, 1307 | "dev": true, 1308 | "optional": true 1309 | }, 1310 | "yallist": { 1311 | "version": "3.0.2", 1312 | "bundled": true, 1313 | "dev": true, 1314 | "optional": true 1315 | } 1316 | } 1317 | }, 1318 | "get-stdin": { 1319 | "version": "4.0.1", 1320 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", 1321 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", 1322 | "dev": true 1323 | }, 1324 | "glob": { 1325 | "version": "5.0.15", 1326 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 1327 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 1328 | "dev": true, 1329 | "requires": { 1330 | "inflight": "^1.0.4", 1331 | "inherits": "2", 1332 | "minimatch": "2 || 3", 1333 | "once": "^1.3.0", 1334 | "path-is-absolute": "^1.0.0" 1335 | } 1336 | }, 1337 | "glob-base": { 1338 | "version": "0.3.0", 1339 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", 1340 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", 1341 | "dev": true, 1342 | "requires": { 1343 | "glob-parent": "^2.0.0", 1344 | "is-glob": "^2.0.0" 1345 | } 1346 | }, 1347 | "glob-parent": { 1348 | "version": "2.0.0", 1349 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", 1350 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", 1351 | "dev": true, 1352 | "requires": { 1353 | "is-glob": "^2.0.0" 1354 | } 1355 | }, 1356 | "globals": { 1357 | "version": "6.4.1", 1358 | "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", 1359 | "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=", 1360 | "dev": true 1361 | }, 1362 | "graceful-fs": { 1363 | "version": "4.1.11", 1364 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 1365 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 1366 | "dev": true 1367 | }, 1368 | "growl": { 1369 | "version": "1.9.2", 1370 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", 1371 | "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", 1372 | "dev": true 1373 | }, 1374 | "has-ansi": { 1375 | "version": "2.0.0", 1376 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1377 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1378 | "requires": { 1379 | "ansi-regex": "^2.0.0" 1380 | } 1381 | }, 1382 | "home-or-tmp": { 1383 | "version": "1.0.0", 1384 | "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", 1385 | "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", 1386 | "dev": true, 1387 | "requires": { 1388 | "os-tmpdir": "^1.0.1", 1389 | "user-home": "^1.1.1" 1390 | } 1391 | }, 1392 | "htmlparser2": { 1393 | "version": "3.8.3", 1394 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", 1395 | "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", 1396 | "dev": true, 1397 | "requires": { 1398 | "domelementtype": "1", 1399 | "domhandler": "2.3", 1400 | "domutils": "1.5", 1401 | "entities": "1.0", 1402 | "readable-stream": "1.1" 1403 | }, 1404 | "dependencies": { 1405 | "isarray": { 1406 | "version": "0.0.1", 1407 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 1408 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 1409 | "dev": true 1410 | }, 1411 | "readable-stream": { 1412 | "version": "1.1.14", 1413 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 1414 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 1415 | "dev": true, 1416 | "requires": { 1417 | "core-util-is": "~1.0.0", 1418 | "inherits": "~2.0.1", 1419 | "isarray": "0.0.1", 1420 | "string_decoder": "~0.10.x" 1421 | } 1422 | }, 1423 | "string_decoder": { 1424 | "version": "0.10.31", 1425 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1426 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 1427 | "dev": true 1428 | } 1429 | } 1430 | }, 1431 | "iconv-lite": { 1432 | "version": "0.4.23", 1433 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 1434 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 1435 | "dev": true, 1436 | "requires": { 1437 | "safer-buffer": ">= 2.1.2 < 3" 1438 | } 1439 | }, 1440 | "inflight": { 1441 | "version": "1.0.6", 1442 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1443 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1444 | "dev": true, 1445 | "requires": { 1446 | "once": "^1.3.0", 1447 | "wrappy": "1" 1448 | } 1449 | }, 1450 | "inherits": { 1451 | "version": "2.0.3", 1452 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1453 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 1454 | "dev": true 1455 | }, 1456 | "inquirer": { 1457 | "version": "0.12.0", 1458 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", 1459 | "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", 1460 | "requires": { 1461 | "ansi-escapes": "^1.1.0", 1462 | "ansi-regex": "^2.0.0", 1463 | "chalk": "^1.0.0", 1464 | "cli-cursor": "^1.0.1", 1465 | "cli-width": "^2.0.0", 1466 | "figures": "^1.3.5", 1467 | "lodash": "^4.3.0", 1468 | "readline2": "^1.0.1", 1469 | "run-async": "^0.1.0", 1470 | "rx-lite": "^3.1.2", 1471 | "string-width": "^1.0.1", 1472 | "strip-ansi": "^3.0.0", 1473 | "through": "^2.3.6" 1474 | } 1475 | }, 1476 | "invert-kv": { 1477 | "version": "1.0.0", 1478 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 1479 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", 1480 | "dev": true 1481 | }, 1482 | "is-binary-path": { 1483 | "version": "1.0.1", 1484 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", 1485 | "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", 1486 | "dev": true, 1487 | "requires": { 1488 | "binary-extensions": "^1.0.0" 1489 | } 1490 | }, 1491 | "is-buffer": { 1492 | "version": "1.1.6", 1493 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1494 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 1495 | "dev": true 1496 | }, 1497 | "is-dotfile": { 1498 | "version": "1.0.3", 1499 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", 1500 | "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", 1501 | "dev": true 1502 | }, 1503 | "is-equal-shallow": { 1504 | "version": "0.1.3", 1505 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", 1506 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", 1507 | "dev": true, 1508 | "requires": { 1509 | "is-primitive": "^2.0.0" 1510 | } 1511 | }, 1512 | "is-extendable": { 1513 | "version": "0.1.1", 1514 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1515 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", 1516 | "dev": true 1517 | }, 1518 | "is-extglob": { 1519 | "version": "1.0.0", 1520 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 1521 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", 1522 | "dev": true 1523 | }, 1524 | "is-finite": { 1525 | "version": "1.0.2", 1526 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 1527 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 1528 | "dev": true, 1529 | "requires": { 1530 | "number-is-nan": "^1.0.0" 1531 | } 1532 | }, 1533 | "is-fullwidth-code-point": { 1534 | "version": "1.0.0", 1535 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1536 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1537 | "requires": { 1538 | "number-is-nan": "^1.0.0" 1539 | } 1540 | }, 1541 | "is-glob": { 1542 | "version": "2.0.1", 1543 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 1544 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", 1545 | "dev": true, 1546 | "requires": { 1547 | "is-extglob": "^1.0.0" 1548 | } 1549 | }, 1550 | "is-integer": { 1551 | "version": "1.0.7", 1552 | "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.7.tgz", 1553 | "integrity": "sha1-a96Bqs3feLZZtmKdYpytxRqIbVw=", 1554 | "dev": true, 1555 | "requires": { 1556 | "is-finite": "^1.0.0" 1557 | } 1558 | }, 1559 | "is-number": { 1560 | "version": "2.1.0", 1561 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", 1562 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", 1563 | "dev": true, 1564 | "requires": { 1565 | "kind-of": "^3.0.2" 1566 | } 1567 | }, 1568 | "is-posix-bracket": { 1569 | "version": "0.1.1", 1570 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", 1571 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", 1572 | "dev": true 1573 | }, 1574 | "is-primitive": { 1575 | "version": "2.0.0", 1576 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", 1577 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", 1578 | "dev": true 1579 | }, 1580 | "is-wsl": { 1581 | "version": "1.1.0", 1582 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", 1583 | "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" 1584 | }, 1585 | "isarray": { 1586 | "version": "1.0.0", 1587 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1588 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1589 | "dev": true 1590 | }, 1591 | "isobject": { 1592 | "version": "2.1.0", 1593 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 1594 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 1595 | "dev": true, 1596 | "requires": { 1597 | "isarray": "1.0.0" 1598 | } 1599 | }, 1600 | "jade": { 1601 | "version": "0.26.3", 1602 | "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", 1603 | "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", 1604 | "dev": true, 1605 | "requires": { 1606 | "commander": "0.6.1", 1607 | "mkdirp": "0.3.0" 1608 | }, 1609 | "dependencies": { 1610 | "commander": { 1611 | "version": "0.6.1", 1612 | "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", 1613 | "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", 1614 | "dev": true 1615 | }, 1616 | "mkdirp": { 1617 | "version": "0.3.0", 1618 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", 1619 | "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", 1620 | "dev": true 1621 | } 1622 | } 1623 | }, 1624 | "js-tokens": { 1625 | "version": "1.0.1", 1626 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", 1627 | "integrity": "sha1-zENaXIuUrRWst5gxQPyAGCyJrq4=", 1628 | "dev": true 1629 | }, 1630 | "jsesc": { 1631 | "version": "0.5.0", 1632 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", 1633 | "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", 1634 | "dev": true 1635 | }, 1636 | "jshint": { 1637 | "version": "2.9.5", 1638 | "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.5.tgz", 1639 | "integrity": "sha1-HnJSkVzmgbQIJ+4UJIxG006apiw=", 1640 | "dev": true, 1641 | "requires": { 1642 | "cli": "~1.0.0", 1643 | "console-browserify": "1.1.x", 1644 | "exit": "0.1.x", 1645 | "htmlparser2": "3.8.x", 1646 | "lodash": "3.7.x", 1647 | "minimatch": "~3.0.2", 1648 | "shelljs": "0.3.x", 1649 | "strip-json-comments": "1.0.x" 1650 | }, 1651 | "dependencies": { 1652 | "lodash": { 1653 | "version": "3.7.0", 1654 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", 1655 | "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=", 1656 | "dev": true 1657 | }, 1658 | "minimatch": { 1659 | "version": "3.0.4", 1660 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1661 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1662 | "dev": true, 1663 | "requires": { 1664 | "brace-expansion": "^1.1.7" 1665 | } 1666 | } 1667 | } 1668 | }, 1669 | "json5": { 1670 | "version": "0.4.0", 1671 | "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", 1672 | "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=", 1673 | "dev": true 1674 | }, 1675 | "kind-of": { 1676 | "version": "3.2.2", 1677 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1678 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1679 | "dev": true, 1680 | "requires": { 1681 | "is-buffer": "^1.1.5" 1682 | } 1683 | }, 1684 | "lazy-cache": { 1685 | "version": "1.0.4", 1686 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 1687 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", 1688 | "dev": true 1689 | }, 1690 | "lcid": { 1691 | "version": "1.0.0", 1692 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 1693 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 1694 | "dev": true, 1695 | "requires": { 1696 | "invert-kv": "^1.0.0" 1697 | } 1698 | }, 1699 | "leven": { 1700 | "version": "1.0.2", 1701 | "resolved": "https://registry.npmjs.org/leven/-/leven-1.0.2.tgz", 1702 | "integrity": "sha1-kUS27ryl8dBoAWnxpncNzqYLdcM=", 1703 | "dev": true 1704 | }, 1705 | "lodash": { 1706 | "version": "4.17.13", 1707 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.13.tgz", 1708 | "integrity": "sha512-vm3/XWXfWtRua0FkUyEHBZy8kCPjErNBT9fJx8Zvs+U6zjqPbTUOpkaoum3O5uiA8sm+yNMHXfYkTUHFoMxFNA==" 1709 | }, 1710 | "longest": { 1711 | "version": "1.0.1", 1712 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 1713 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", 1714 | "dev": true 1715 | }, 1716 | "lru-cache": { 1717 | "version": "2.7.3", 1718 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", 1719 | "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", 1720 | "dev": true 1721 | }, 1722 | "math-random": { 1723 | "version": "1.0.1", 1724 | "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", 1725 | "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", 1726 | "dev": true 1727 | }, 1728 | "micromatch": { 1729 | "version": "2.3.11", 1730 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", 1731 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", 1732 | "dev": true, 1733 | "requires": { 1734 | "arr-diff": "^2.0.0", 1735 | "array-unique": "^0.2.1", 1736 | "braces": "^1.8.2", 1737 | "expand-brackets": "^0.1.4", 1738 | "extglob": "^0.3.1", 1739 | "filename-regex": "^2.0.0", 1740 | "is-extglob": "^1.0.0", 1741 | "is-glob": "^2.0.1", 1742 | "kind-of": "^3.0.2", 1743 | "normalize-path": "^2.0.1", 1744 | "object.omit": "^2.0.0", 1745 | "parse-glob": "^3.0.4", 1746 | "regex-cache": "^0.4.2" 1747 | } 1748 | }, 1749 | "minimatch": { 1750 | "version": "2.0.10", 1751 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", 1752 | "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", 1753 | "dev": true, 1754 | "requires": { 1755 | "brace-expansion": "^1.0.0" 1756 | } 1757 | }, 1758 | "minimist": { 1759 | "version": "1.2.0", 1760 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1761 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 1762 | "dev": true 1763 | }, 1764 | "mkdirp": { 1765 | "version": "0.5.1", 1766 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1767 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1768 | "dev": true, 1769 | "requires": { 1770 | "minimist": "0.0.8" 1771 | }, 1772 | "dependencies": { 1773 | "minimist": { 1774 | "version": "0.0.8", 1775 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1776 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1777 | "dev": true 1778 | } 1779 | } 1780 | }, 1781 | "mocha": { 1782 | "version": "2.5.3", 1783 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", 1784 | "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", 1785 | "dev": true, 1786 | "requires": { 1787 | "commander": "2.3.0", 1788 | "debug": "2.2.0", 1789 | "diff": "1.4.0", 1790 | "escape-string-regexp": "1.0.2", 1791 | "glob": "3.2.11", 1792 | "growl": "1.9.2", 1793 | "jade": "0.26.3", 1794 | "mkdirp": "0.5.1", 1795 | "supports-color": "1.2.0", 1796 | "to-iso-string": "0.0.2" 1797 | }, 1798 | "dependencies": { 1799 | "commander": { 1800 | "version": "2.3.0", 1801 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", 1802 | "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", 1803 | "dev": true 1804 | }, 1805 | "debug": { 1806 | "version": "2.2.0", 1807 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 1808 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 1809 | "dev": true, 1810 | "requires": { 1811 | "ms": "0.7.1" 1812 | } 1813 | }, 1814 | "escape-string-regexp": { 1815 | "version": "1.0.2", 1816 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", 1817 | "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", 1818 | "dev": true 1819 | }, 1820 | "glob": { 1821 | "version": "3.2.11", 1822 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", 1823 | "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", 1824 | "dev": true, 1825 | "requires": { 1826 | "inherits": "2", 1827 | "minimatch": "0.3" 1828 | } 1829 | }, 1830 | "minimatch": { 1831 | "version": "0.3.0", 1832 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", 1833 | "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", 1834 | "dev": true, 1835 | "requires": { 1836 | "lru-cache": "2", 1837 | "sigmund": "~1.0.0" 1838 | } 1839 | }, 1840 | "ms": { 1841 | "version": "0.7.1", 1842 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 1843 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", 1844 | "dev": true 1845 | }, 1846 | "supports-color": { 1847 | "version": "1.2.0", 1848 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", 1849 | "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", 1850 | "dev": true 1851 | } 1852 | } 1853 | }, 1854 | "ms": { 1855 | "version": "2.0.0", 1856 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1857 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1858 | "dev": true 1859 | }, 1860 | "mute-stream": { 1861 | "version": "0.0.5", 1862 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", 1863 | "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=" 1864 | }, 1865 | "nan": { 1866 | "version": "2.10.0", 1867 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", 1868 | "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", 1869 | "dev": true, 1870 | "optional": true 1871 | }, 1872 | "normalize-path": { 1873 | "version": "2.1.1", 1874 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 1875 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 1876 | "dev": true, 1877 | "requires": { 1878 | "remove-trailing-separator": "^1.0.1" 1879 | } 1880 | }, 1881 | "number-is-nan": { 1882 | "version": "1.0.1", 1883 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1884 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 1885 | }, 1886 | "object-assign": { 1887 | "version": "4.1.1", 1888 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1889 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1890 | }, 1891 | "object.omit": { 1892 | "version": "2.0.1", 1893 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", 1894 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", 1895 | "dev": true, 1896 | "requires": { 1897 | "for-own": "^0.1.4", 1898 | "is-extendable": "^0.1.1" 1899 | } 1900 | }, 1901 | "once": { 1902 | "version": "1.4.0", 1903 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1904 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1905 | "requires": { 1906 | "wrappy": "1" 1907 | } 1908 | }, 1909 | "onetime": { 1910 | "version": "1.1.0", 1911 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", 1912 | "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" 1913 | }, 1914 | "opn": { 1915 | "version": "5.3.0", 1916 | "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", 1917 | "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", 1918 | "requires": { 1919 | "is-wsl": "^1.1.0" 1920 | } 1921 | }, 1922 | "os-locale": { 1923 | "version": "1.4.0", 1924 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", 1925 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", 1926 | "dev": true, 1927 | "requires": { 1928 | "lcid": "^1.0.0" 1929 | } 1930 | }, 1931 | "os-tmpdir": { 1932 | "version": "1.0.2", 1933 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1934 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1935 | "dev": true 1936 | }, 1937 | "output-file-sync": { 1938 | "version": "1.1.2", 1939 | "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", 1940 | "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", 1941 | "dev": true, 1942 | "requires": { 1943 | "graceful-fs": "^4.1.4", 1944 | "mkdirp": "^0.5.1", 1945 | "object-assign": "^4.1.0" 1946 | } 1947 | }, 1948 | "parse-glob": { 1949 | "version": "3.0.4", 1950 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", 1951 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", 1952 | "dev": true, 1953 | "requires": { 1954 | "glob-base": "^0.3.0", 1955 | "is-dotfile": "^1.0.0", 1956 | "is-extglob": "^1.0.0", 1957 | "is-glob": "^2.0.0" 1958 | } 1959 | }, 1960 | "path-exists": { 1961 | "version": "1.0.0", 1962 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", 1963 | "integrity": "sha1-1aiZjrce83p0w06w2eum6HjuoIE=", 1964 | "dev": true 1965 | }, 1966 | "path-is-absolute": { 1967 | "version": "1.0.1", 1968 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1969 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1970 | "dev": true 1971 | }, 1972 | "path-parse": { 1973 | "version": "1.0.5", 1974 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 1975 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 1976 | "dev": true 1977 | }, 1978 | "preserve": { 1979 | "version": "0.2.0", 1980 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", 1981 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", 1982 | "dev": true 1983 | }, 1984 | "private": { 1985 | "version": "0.1.8", 1986 | "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", 1987 | "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", 1988 | "dev": true 1989 | }, 1990 | "process-nextick-args": { 1991 | "version": "2.0.0", 1992 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 1993 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 1994 | "dev": true 1995 | }, 1996 | "q": { 1997 | "version": "1.5.1", 1998 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 1999 | "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", 2000 | "dev": true 2001 | }, 2002 | "randomatic": { 2003 | "version": "3.0.0", 2004 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", 2005 | "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", 2006 | "dev": true, 2007 | "requires": { 2008 | "is-number": "^4.0.0", 2009 | "kind-of": "^6.0.0", 2010 | "math-random": "^1.0.1" 2011 | }, 2012 | "dependencies": { 2013 | "is-number": { 2014 | "version": "4.0.0", 2015 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", 2016 | "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", 2017 | "dev": true 2018 | }, 2019 | "kind-of": { 2020 | "version": "6.0.2", 2021 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 2022 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", 2023 | "dev": true 2024 | } 2025 | } 2026 | }, 2027 | "readable-stream": { 2028 | "version": "2.3.6", 2029 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 2030 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 2031 | "dev": true, 2032 | "requires": { 2033 | "core-util-is": "~1.0.0", 2034 | "inherits": "~2.0.3", 2035 | "isarray": "~1.0.0", 2036 | "process-nextick-args": "~2.0.0", 2037 | "safe-buffer": "~5.1.1", 2038 | "string_decoder": "~1.1.1", 2039 | "util-deprecate": "~1.0.1" 2040 | } 2041 | }, 2042 | "readdirp": { 2043 | "version": "2.1.0", 2044 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", 2045 | "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", 2046 | "dev": true, 2047 | "requires": { 2048 | "graceful-fs": "^4.1.2", 2049 | "minimatch": "^3.0.2", 2050 | "readable-stream": "^2.0.2", 2051 | "set-immediate-shim": "^1.0.1" 2052 | }, 2053 | "dependencies": { 2054 | "minimatch": { 2055 | "version": "3.0.4", 2056 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2057 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2058 | "dev": true, 2059 | "requires": { 2060 | "brace-expansion": "^1.1.7" 2061 | } 2062 | } 2063 | } 2064 | }, 2065 | "readline2": { 2066 | "version": "1.0.1", 2067 | "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", 2068 | "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", 2069 | "requires": { 2070 | "code-point-at": "^1.0.0", 2071 | "is-fullwidth-code-point": "^1.0.0", 2072 | "mute-stream": "0.0.5" 2073 | } 2074 | }, 2075 | "recast": { 2076 | "version": "0.10.33", 2077 | "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz", 2078 | "integrity": "sha1-lCgI96oBbx+nFCxGHX5XBKqo1pc=", 2079 | "dev": true, 2080 | "requires": { 2081 | "ast-types": "0.8.12", 2082 | "esprima-fb": "~15001.1001.0-dev-harmony-fb", 2083 | "private": "~0.1.5", 2084 | "source-map": "~0.5.0" 2085 | }, 2086 | "dependencies": { 2087 | "ast-types": { 2088 | "version": "0.8.12", 2089 | "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.12.tgz", 2090 | "integrity": "sha1-oNkOQ1G7iHcWyD/WN+v4GK9K38w=", 2091 | "dev": true 2092 | } 2093 | } 2094 | }, 2095 | "regenerate": { 2096 | "version": "1.4.0", 2097 | "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", 2098 | "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", 2099 | "dev": true 2100 | }, 2101 | "regenerator": { 2102 | "version": "0.8.40", 2103 | "resolved": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.40.tgz", 2104 | "integrity": "sha1-oORXxY69uuV1yfjNdRJ+k3VkNdg=", 2105 | "dev": true, 2106 | "requires": { 2107 | "commoner": "~0.10.3", 2108 | "defs": "~1.1.0", 2109 | "esprima-fb": "~15001.1001.0-dev-harmony-fb", 2110 | "private": "~0.1.5", 2111 | "recast": "0.10.33", 2112 | "through": "~2.3.8" 2113 | } 2114 | }, 2115 | "regex-cache": { 2116 | "version": "0.4.4", 2117 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", 2118 | "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", 2119 | "dev": true, 2120 | "requires": { 2121 | "is-equal-shallow": "^0.1.3" 2122 | } 2123 | }, 2124 | "regexpu": { 2125 | "version": "1.3.0", 2126 | "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", 2127 | "integrity": "sha1-5TTcmRqeWEYFDJjebX3UpVyeoW0=", 2128 | "dev": true, 2129 | "requires": { 2130 | "esprima": "^2.6.0", 2131 | "recast": "^0.10.10", 2132 | "regenerate": "^1.2.1", 2133 | "regjsgen": "^0.2.0", 2134 | "regjsparser": "^0.1.4" 2135 | }, 2136 | "dependencies": { 2137 | "esprima": { 2138 | "version": "2.7.3", 2139 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", 2140 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", 2141 | "dev": true 2142 | } 2143 | } 2144 | }, 2145 | "regjsgen": { 2146 | "version": "0.2.0", 2147 | "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", 2148 | "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", 2149 | "dev": true 2150 | }, 2151 | "regjsparser": { 2152 | "version": "0.1.5", 2153 | "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", 2154 | "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", 2155 | "dev": true, 2156 | "requires": { 2157 | "jsesc": "~0.5.0" 2158 | } 2159 | }, 2160 | "remove-trailing-separator": { 2161 | "version": "1.1.0", 2162 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 2163 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", 2164 | "dev": true 2165 | }, 2166 | "repeat-element": { 2167 | "version": "1.1.2", 2168 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", 2169 | "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", 2170 | "dev": true 2171 | }, 2172 | "repeat-string": { 2173 | "version": "1.6.1", 2174 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 2175 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 2176 | "dev": true 2177 | }, 2178 | "repeating": { 2179 | "version": "1.1.3", 2180 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", 2181 | "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", 2182 | "dev": true, 2183 | "requires": { 2184 | "is-finite": "^1.0.0" 2185 | } 2186 | }, 2187 | "resolve": { 2188 | "version": "1.8.1", 2189 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", 2190 | "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", 2191 | "dev": true, 2192 | "requires": { 2193 | "path-parse": "^1.0.5" 2194 | } 2195 | }, 2196 | "restore-cursor": { 2197 | "version": "1.0.1", 2198 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", 2199 | "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", 2200 | "requires": { 2201 | "exit-hook": "^1.0.0", 2202 | "onetime": "^1.0.0" 2203 | } 2204 | }, 2205 | "right-align": { 2206 | "version": "0.1.3", 2207 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 2208 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 2209 | "dev": true, 2210 | "requires": { 2211 | "align-text": "^0.1.1" 2212 | } 2213 | }, 2214 | "run-async": { 2215 | "version": "0.1.0", 2216 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", 2217 | "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", 2218 | "requires": { 2219 | "once": "^1.3.0" 2220 | } 2221 | }, 2222 | "rx-lite": { 2223 | "version": "3.1.2", 2224 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", 2225 | "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=" 2226 | }, 2227 | "safe-buffer": { 2228 | "version": "5.1.2", 2229 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2230 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 2231 | "dev": true 2232 | }, 2233 | "safer-buffer": { 2234 | "version": "2.1.2", 2235 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2236 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2237 | "dev": true 2238 | }, 2239 | "set-immediate-shim": { 2240 | "version": "1.0.1", 2241 | "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", 2242 | "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", 2243 | "dev": true 2244 | }, 2245 | "shebang-regex": { 2246 | "version": "1.0.0", 2247 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 2248 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 2249 | "dev": true 2250 | }, 2251 | "shelljs": { 2252 | "version": "0.3.0", 2253 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", 2254 | "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", 2255 | "dev": true 2256 | }, 2257 | "sigmund": { 2258 | "version": "1.0.1", 2259 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", 2260 | "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", 2261 | "dev": true 2262 | }, 2263 | "simple-fmt": { 2264 | "version": "0.1.0", 2265 | "resolved": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz", 2266 | "integrity": "sha1-GRv1ZqWeZTBILLJatTtKjchcOms=", 2267 | "dev": true 2268 | }, 2269 | "simple-is": { 2270 | "version": "0.2.0", 2271 | "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz", 2272 | "integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA=", 2273 | "dev": true 2274 | }, 2275 | "slash": { 2276 | "version": "1.0.0", 2277 | "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", 2278 | "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", 2279 | "dev": true 2280 | }, 2281 | "source-map": { 2282 | "version": "0.5.7", 2283 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 2284 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 2285 | "dev": true 2286 | }, 2287 | "source-map-support": { 2288 | "version": "0.2.10", 2289 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", 2290 | "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", 2291 | "dev": true, 2292 | "requires": { 2293 | "source-map": "0.1.32" 2294 | }, 2295 | "dependencies": { 2296 | "source-map": { 2297 | "version": "0.1.32", 2298 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", 2299 | "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", 2300 | "dev": true, 2301 | "requires": { 2302 | "amdefine": ">=0.0.4" 2303 | } 2304 | } 2305 | } 2306 | }, 2307 | "stable": { 2308 | "version": "0.1.8", 2309 | "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", 2310 | "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", 2311 | "dev": true 2312 | }, 2313 | "string-width": { 2314 | "version": "1.0.2", 2315 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 2316 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 2317 | "requires": { 2318 | "code-point-at": "^1.0.0", 2319 | "is-fullwidth-code-point": "^1.0.0", 2320 | "strip-ansi": "^3.0.0" 2321 | } 2322 | }, 2323 | "string_decoder": { 2324 | "version": "1.1.1", 2325 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2326 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2327 | "dev": true, 2328 | "requires": { 2329 | "safe-buffer": "~5.1.0" 2330 | } 2331 | }, 2332 | "stringmap": { 2333 | "version": "0.2.2", 2334 | "resolved": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz", 2335 | "integrity": "sha1-VWwTeyWPlCuHdvWy71gqoGnX0bE=", 2336 | "dev": true 2337 | }, 2338 | "stringset": { 2339 | "version": "0.2.1", 2340 | "resolved": "https://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz", 2341 | "integrity": "sha1-7yWcTjSTRDd/zRyRPdLoSMnAQrU=", 2342 | "dev": true 2343 | }, 2344 | "strip-ansi": { 2345 | "version": "3.0.1", 2346 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2347 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2348 | "requires": { 2349 | "ansi-regex": "^2.0.0" 2350 | } 2351 | }, 2352 | "strip-json-comments": { 2353 | "version": "1.0.4", 2354 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", 2355 | "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", 2356 | "dev": true 2357 | }, 2358 | "supports-color": { 2359 | "version": "2.0.0", 2360 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 2361 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 2362 | }, 2363 | "through": { 2364 | "version": "2.3.8", 2365 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2366 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 2367 | }, 2368 | "to-fast-properties": { 2369 | "version": "1.0.3", 2370 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", 2371 | "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", 2372 | "dev": true 2373 | }, 2374 | "to-iso-string": { 2375 | "version": "0.0.2", 2376 | "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", 2377 | "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", 2378 | "dev": true 2379 | }, 2380 | "trim-right": { 2381 | "version": "1.0.1", 2382 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", 2383 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", 2384 | "dev": true 2385 | }, 2386 | "try-resolve": { 2387 | "version": "1.0.1", 2388 | "resolved": "https://registry.npmjs.org/try-resolve/-/try-resolve-1.0.1.tgz", 2389 | "integrity": "sha1-z95vq9ctY+V5fPqrhzq76OcA6RI=", 2390 | "dev": true 2391 | }, 2392 | "tryor": { 2393 | "version": "0.1.2", 2394 | "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz", 2395 | "integrity": "sha1-gUXkynyv9ArN48z5Rui4u3W0Fys=", 2396 | "dev": true 2397 | }, 2398 | "user-home": { 2399 | "version": "1.1.1", 2400 | "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", 2401 | "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", 2402 | "dev": true 2403 | }, 2404 | "util-deprecate": { 2405 | "version": "1.0.2", 2406 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2407 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 2408 | "dev": true 2409 | }, 2410 | "window-size": { 2411 | "version": "0.1.4", 2412 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", 2413 | "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", 2414 | "dev": true 2415 | }, 2416 | "wordwrap": { 2417 | "version": "0.0.2", 2418 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 2419 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", 2420 | "dev": true 2421 | }, 2422 | "wrappy": { 2423 | "version": "1.0.2", 2424 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2425 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 2426 | }, 2427 | "y18n": { 2428 | "version": "3.2.1", 2429 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 2430 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", 2431 | "dev": true 2432 | }, 2433 | "yargs": { 2434 | "version": "3.27.0", 2435 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz", 2436 | "integrity": "sha1-ISBUaTFuk5Ex1Z8toMbX+YIh6kA=", 2437 | "dev": true, 2438 | "requires": { 2439 | "camelcase": "^1.2.1", 2440 | "cliui": "^2.1.0", 2441 | "decamelize": "^1.0.0", 2442 | "os-locale": "^1.4.0", 2443 | "window-size": "^0.1.2", 2444 | "y18n": "^3.2.0" 2445 | } 2446 | } 2447 | } 2448 | } 2449 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gh-jira", 3 | "description": "NodeGH plugin for integrating Jira, an issue management system", 4 | "version": "1.0.7", 5 | "author": { 6 | "name": "Eduardo Lundgren", 7 | "email": "eduardolundgren@gmail.com", 8 | "web": "http://www.eduardo.io", 9 | "twitter": "eduardolundgren" 10 | }, 11 | "license": "BSD", 12 | "repository": { 13 | "type": "git", 14 | "url": "git@github.com:node-gh/gh-jira.git" 15 | }, 16 | "bugs": { 17 | "url": "https://github.com/node-gh/gh-jira/issues" 18 | }, 19 | "keywords": [ 20 | "gh", 21 | "nodegh", 22 | "jira", 23 | "plugin" 24 | ], 25 | "bin": { 26 | "gh-ji": "bin/jira.js", 27 | "gh-jira": "bin/jira.js" 28 | }, 29 | "scripts": { 30 | "prepublish": "./node_modules/babel/bin/babel.js bin/jira.js --loose all --out-file bin/jira.js", 31 | "postpublish": "git checkout bin/jira.js", 32 | "lint": "node_modules/.bin/jshint bin/ test/", 33 | "test": "node_modules/.bin/mocha --reporter list" 34 | }, 35 | "dependencies": { 36 | "inquirer": "^0.12.0", 37 | "lodash": "^4.17.11", 38 | "opn": "^5.3.0" 39 | }, 40 | "devDependencies": { 41 | "babel": "^5.8", 42 | "jshint": "^2.8.0", 43 | "mocha": "^2.3.3" 44 | }, 45 | "engines": { 46 | "node": ">=0.12" 47 | }, 48 | "preferGlobal": "true" 49 | } 50 | -------------------------------------------------------------------------------- /test/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "bitwise": true, 3 | "curly": true, 4 | "eqeqeq": true, 5 | "es5": false, 6 | "expr": true, 7 | "forin": true, 8 | "funcscope": false, 9 | "globalstrict": false, 10 | "iterator": false, 11 | "latedef": true, 12 | "noarg": true, 13 | "node": true, 14 | "mocha": true, 15 | "nomen": false, 16 | "onevar": true, 17 | "passfail": false, 18 | "nonew": true, 19 | "shadow": false, 20 | "smarttabs": false, 21 | "strict": true, 22 | "trailing": true, 23 | "undef": true, 24 | "unused": true, 25 | "white": false 26 | } -------------------------------------------------------------------------------- /test/jira.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013, All Rights Reserved. 3 | * 4 | * Code licensed under the BSD License: 5 | * https://github.com/node-gh/gh/blob/master/LICENSE.md 6 | * 7 | * @author Author 8 | */ 9 | 10 | // -- Requires ----------------------------------------------------------------- 11 | var assert = require('assert'), 12 | boilerplate = require('../bin/jira.js'); 13 | 14 | // -- Suites ------------------------------------------------------------------- 15 | describe('A test suite', function() { 16 | it('should return a hello world message', function(){ 17 | var foo = boilerplate.foo(); 18 | assert.equal('NodeGH plugin boilerplate :)', foo); 19 | }); 20 | }); --------------------------------------------------------------------------------