├── .gitignore ├── README.md ├── index.js ├── package-lock.json ├── package.json ├── src ├── ApplyPatternsVisitor.js ├── BigNumberVisitor.js ├── InlineStaticClassAttrs.js ├── JS2Py.js ├── JSVisitor.js ├── ObjectPatternDestructure.js ├── Pattern.js ├── RenameVisitor.js ├── ToPyCodeVisitor.js └── Traverse.js └── test ├── JS2Py.spec.js ├── Pattern.spec.js └── Traverse.spec.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Converts JavaScript to Python 2 | ----------------------------------- 3 | 4 | Proof of concept, converting JS to Python, for example: 5 | 6 | ```js 7 | const BigN = require('bignumber.js') 8 | 9 | class Calculator extends MathDevice { 10 | constructor (args = []) { 11 | super({}) 12 | } 13 | 14 | static max (a, b) { 15 | return BigN.max(a, b) 16 | } 17 | ``` 18 | 19 | into 20 | 21 | ```py 22 | class Calculator(MathDevice): 23 | def __init__(self, args = []): 24 | super().__init__({}) 25 | 26 | def add(self, a, b): 27 | return max(a, b) 28 | ``` -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports.JS2Py = require('./src/JS2Py') 4 | module.exports.Patten = require('./src/Pattern') 5 | module.exports.Traverse = require('./src/Traverse') 6 | module.exports.BigNumberVisitor = require('./src/BigNumberVisitor') 7 | module.exports.ToPyCodeVisitor = require('./src/ToPyCodeVisitor') 8 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "js-to-py", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "acorn": { 8 | "version": "6.0.2", 9 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.2.tgz", 10 | "integrity": "sha512-GXmKIvbrN3TV7aVqAzVFaMW8F8wzVX7voEBRO3bDA64+EX37YSayggRJP5Xig6HYHBkWKpFg9W5gg6orklubhg==" 11 | }, 12 | "acorn-jsx": { 13 | "version": "5.0.0", 14 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.0.tgz", 15 | "integrity": "sha512-XkB50fn0MURDyww9+UYL3c1yLbOBz0ZFvrdYlGB8l+Ije1oSC75qAqrzSPjYQbdnQUzhlUGNKuesryAv0gxZOg==" 16 | }, 17 | "ansi-regex": { 18 | "version": "2.1.1", 19 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 20 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 21 | }, 22 | "ansi-styles": { 23 | "version": "2.2.1", 24 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 25 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 26 | }, 27 | "anymatch": { 28 | "version": "1.3.2", 29 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", 30 | "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", 31 | "requires": { 32 | "micromatch": "^2.1.5", 33 | "normalize-path": "^2.0.0" 34 | } 35 | }, 36 | "arr-diff": { 37 | "version": "2.0.0", 38 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", 39 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", 40 | "requires": { 41 | "arr-flatten": "^1.0.1" 42 | } 43 | }, 44 | "arr-flatten": { 45 | "version": "1.1.0", 46 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 47 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" 48 | }, 49 | "arr-union": { 50 | "version": "3.1.0", 51 | "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", 52 | "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" 53 | }, 54 | "array-filter": { 55 | "version": "0.0.1", 56 | "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", 57 | "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" 58 | }, 59 | "array-find-index": { 60 | "version": "1.0.2", 61 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", 62 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" 63 | }, 64 | "array-map": { 65 | "version": "0.0.0", 66 | "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", 67 | "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" 68 | }, 69 | "array-reduce": { 70 | "version": "0.0.0", 71 | "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", 72 | "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" 73 | }, 74 | "array-unique": { 75 | "version": "0.2.1", 76 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", 77 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" 78 | }, 79 | "assign-symbols": { 80 | "version": "1.0.0", 81 | "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", 82 | "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" 83 | }, 84 | "async-each": { 85 | "version": "1.0.1", 86 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", 87 | "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" 88 | }, 89 | "atob": { 90 | "version": "2.1.2", 91 | "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", 92 | "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" 93 | }, 94 | "balanced-match": { 95 | "version": "1.0.0", 96 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 97 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 98 | }, 99 | "base": { 100 | "version": "0.11.2", 101 | "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", 102 | "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", 103 | "requires": { 104 | "cache-base": "^1.0.1", 105 | "class-utils": "^0.3.5", 106 | "component-emitter": "^1.2.1", 107 | "define-property": "^1.0.0", 108 | "isobject": "^3.0.1", 109 | "mixin-deep": "^1.2.0", 110 | "pascalcase": "^0.1.1" 111 | }, 112 | "dependencies": { 113 | "define-property": { 114 | "version": "1.0.0", 115 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 116 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 117 | "requires": { 118 | "is-descriptor": "^1.0.0" 119 | } 120 | }, 121 | "is-accessor-descriptor": { 122 | "version": "1.0.0", 123 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 124 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 125 | "requires": { 126 | "kind-of": "^6.0.0" 127 | } 128 | }, 129 | "is-data-descriptor": { 130 | "version": "1.0.0", 131 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 132 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 133 | "requires": { 134 | "kind-of": "^6.0.0" 135 | } 136 | }, 137 | "is-descriptor": { 138 | "version": "1.0.2", 139 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 140 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 141 | "requires": { 142 | "is-accessor-descriptor": "^1.0.0", 143 | "is-data-descriptor": "^1.0.0", 144 | "kind-of": "^6.0.2" 145 | } 146 | }, 147 | "isobject": { 148 | "version": "3.0.1", 149 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 150 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 151 | }, 152 | "kind-of": { 153 | "version": "6.0.2", 154 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 155 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" 156 | } 157 | } 158 | }, 159 | "binary-extensions": { 160 | "version": "1.12.0", 161 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", 162 | "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==" 163 | }, 164 | "brace-expansion": { 165 | "version": "1.1.11", 166 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 167 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 168 | "requires": { 169 | "balanced-match": "^1.0.0", 170 | "concat-map": "0.0.1" 171 | } 172 | }, 173 | "braces": { 174 | "version": "1.8.5", 175 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", 176 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", 177 | "requires": { 178 | "expand-range": "^1.8.1", 179 | "preserve": "^0.2.0", 180 | "repeat-element": "^1.1.2" 181 | } 182 | }, 183 | "buffer-shims": { 184 | "version": "1.0.0", 185 | "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", 186 | "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" 187 | }, 188 | "builtin-modules": { 189 | "version": "1.1.1", 190 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 191 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" 192 | }, 193 | "cache-base": { 194 | "version": "1.0.1", 195 | "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", 196 | "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", 197 | "requires": { 198 | "collection-visit": "^1.0.0", 199 | "component-emitter": "^1.2.1", 200 | "get-value": "^2.0.6", 201 | "has-value": "^1.0.0", 202 | "isobject": "^3.0.1", 203 | "set-value": "^2.0.0", 204 | "to-object-path": "^0.3.0", 205 | "union-value": "^1.0.0", 206 | "unset-value": "^1.0.0" 207 | }, 208 | "dependencies": { 209 | "isobject": { 210 | "version": "3.0.1", 211 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 212 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 213 | } 214 | } 215 | }, 216 | "camelcase": { 217 | "version": "2.1.1", 218 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 219 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" 220 | }, 221 | "camelcase-keys": { 222 | "version": "2.1.0", 223 | "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", 224 | "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", 225 | "requires": { 226 | "camelcase": "^2.0.0", 227 | "map-obj": "^1.0.0" 228 | } 229 | }, 230 | "chalk": { 231 | "version": "1.1.3", 232 | "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 233 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 234 | "requires": { 235 | "ansi-styles": "^2.2.1", 236 | "escape-string-regexp": "^1.0.2", 237 | "has-ansi": "^2.0.0", 238 | "strip-ansi": "^3.0.0", 239 | "supports-color": "^2.0.0" 240 | } 241 | }, 242 | "chokidar": { 243 | "version": "1.6.0", 244 | "resolved": "http://registry.npmjs.org/chokidar/-/chokidar-1.6.0.tgz", 245 | "integrity": "sha1-kMMq1IApAddxPeUy3ChOlqY60Fg=", 246 | "requires": { 247 | "anymatch": "^1.3.0", 248 | "async-each": "^1.0.0", 249 | "fsevents": "^1.0.0", 250 | "glob-parent": "^2.0.0", 251 | "inherits": "^2.0.1", 252 | "is-binary-path": "^1.0.0", 253 | "is-glob": "^2.0.0", 254 | "path-is-absolute": "^1.0.0", 255 | "readdirp": "^2.0.0" 256 | } 257 | }, 258 | "class-utils": { 259 | "version": "0.3.6", 260 | "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", 261 | "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", 262 | "requires": { 263 | "arr-union": "^3.1.0", 264 | "define-property": "^0.2.5", 265 | "isobject": "^3.0.0", 266 | "static-extend": "^0.1.1" 267 | }, 268 | "dependencies": { 269 | "define-property": { 270 | "version": "0.2.5", 271 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 272 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 273 | "requires": { 274 | "is-descriptor": "^0.1.0" 275 | } 276 | }, 277 | "isobject": { 278 | "version": "3.0.1", 279 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 280 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 281 | } 282 | } 283 | }, 284 | "collection-visit": { 285 | "version": "1.0.0", 286 | "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", 287 | "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", 288 | "requires": { 289 | "map-visit": "^1.0.0", 290 | "object-visit": "^1.0.0" 291 | } 292 | }, 293 | "component-emitter": { 294 | "version": "1.2.1", 295 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", 296 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" 297 | }, 298 | "concat-map": { 299 | "version": "0.0.1", 300 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 301 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 302 | }, 303 | "copy-descriptor": { 304 | "version": "0.1.1", 305 | "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", 306 | "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" 307 | }, 308 | "core-util-is": { 309 | "version": "1.0.2", 310 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 311 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 312 | }, 313 | "currently-unhandled": { 314 | "version": "0.4.1", 315 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", 316 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", 317 | "requires": { 318 | "array-find-index": "^1.0.1" 319 | } 320 | }, 321 | "debounce-collect": { 322 | "version": "1.0.2", 323 | "resolved": "https://registry.npmjs.org/debounce-collect/-/debounce-collect-1.0.2.tgz", 324 | "integrity": "sha1-KhkGWTbVG/LhlymxqhC+pclqM88=" 325 | }, 326 | "debug": { 327 | "version": "2.6.0", 328 | "resolved": "http://registry.npmjs.org/debug/-/debug-2.6.0.tgz", 329 | "integrity": "sha1-vFlryr52F/Edn6FTYe3tVgi4SZs=", 330 | "requires": { 331 | "ms": "0.7.2" 332 | } 333 | }, 334 | "decamelize": { 335 | "version": "1.2.0", 336 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 337 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 338 | }, 339 | "decode-uri-component": { 340 | "version": "0.2.0", 341 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", 342 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" 343 | }, 344 | "deep-equal": { 345 | "version": "1.0.1", 346 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 347 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", 348 | "dev": true 349 | }, 350 | "define-properties": { 351 | "version": "1.1.3", 352 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 353 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 354 | "dev": true, 355 | "requires": { 356 | "object-keys": "^1.0.12" 357 | } 358 | }, 359 | "define-property": { 360 | "version": "2.0.2", 361 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", 362 | "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", 363 | "requires": { 364 | "is-descriptor": "^1.0.2", 365 | "isobject": "^3.0.1" 366 | }, 367 | "dependencies": { 368 | "is-accessor-descriptor": { 369 | "version": "1.0.0", 370 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 371 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 372 | "requires": { 373 | "kind-of": "^6.0.0" 374 | } 375 | }, 376 | "is-data-descriptor": { 377 | "version": "1.0.0", 378 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 379 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 380 | "requires": { 381 | "kind-of": "^6.0.0" 382 | } 383 | }, 384 | "is-descriptor": { 385 | "version": "1.0.2", 386 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 387 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 388 | "requires": { 389 | "is-accessor-descriptor": "^1.0.0", 390 | "is-data-descriptor": "^1.0.0", 391 | "kind-of": "^6.0.2" 392 | } 393 | }, 394 | "isobject": { 395 | "version": "3.0.1", 396 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 397 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 398 | }, 399 | "kind-of": { 400 | "version": "6.0.2", 401 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 402 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" 403 | } 404 | } 405 | }, 406 | "defined": { 407 | "version": "1.0.0", 408 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 409 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 410 | "dev": true 411 | }, 412 | "duplexer": { 413 | "version": "0.1.1", 414 | "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", 415 | "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" 416 | }, 417 | "error-ex": { 418 | "version": "1.3.2", 419 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 420 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 421 | "requires": { 422 | "is-arrayish": "^0.2.1" 423 | } 424 | }, 425 | "es-abstract": { 426 | "version": "1.12.0", 427 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", 428 | "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", 429 | "dev": true, 430 | "requires": { 431 | "es-to-primitive": "^1.1.1", 432 | "function-bind": "^1.1.1", 433 | "has": "^1.0.1", 434 | "is-callable": "^1.1.3", 435 | "is-regex": "^1.0.4" 436 | } 437 | }, 438 | "es-to-primitive": { 439 | "version": "1.2.0", 440 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", 441 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", 442 | "dev": true, 443 | "requires": { 444 | "is-callable": "^1.1.4", 445 | "is-date-object": "^1.0.1", 446 | "is-symbol": "^1.0.2" 447 | } 448 | }, 449 | "escape-string-regexp": { 450 | "version": "1.0.5", 451 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 452 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 453 | }, 454 | "eslint-visitor-keys": { 455 | "version": "1.0.0", 456 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 457 | "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==" 458 | }, 459 | "espree": { 460 | "version": "4.1.0", 461 | "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", 462 | "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", 463 | "requires": { 464 | "acorn": "^6.0.2", 465 | "acorn-jsx": "^5.0.0", 466 | "eslint-visitor-keys": "^1.0.0" 467 | } 468 | }, 469 | "expand-brackets": { 470 | "version": "0.1.5", 471 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", 472 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", 473 | "requires": { 474 | "is-posix-bracket": "^0.1.0" 475 | } 476 | }, 477 | "expand-range": { 478 | "version": "1.8.2", 479 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", 480 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", 481 | "requires": { 482 | "fill-range": "^2.1.0" 483 | } 484 | }, 485 | "extend-shallow": { 486 | "version": "3.0.2", 487 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", 488 | "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", 489 | "requires": { 490 | "assign-symbols": "^1.0.0", 491 | "is-extendable": "^1.0.1" 492 | }, 493 | "dependencies": { 494 | "is-extendable": { 495 | "version": "1.0.1", 496 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 497 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 498 | "requires": { 499 | "is-plain-object": "^2.0.4" 500 | } 501 | } 502 | } 503 | }, 504 | "extglob": { 505 | "version": "0.3.2", 506 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", 507 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", 508 | "requires": { 509 | "is-extglob": "^1.0.0" 510 | } 511 | }, 512 | "figures": { 513 | "version": "1.7.0", 514 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 515 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", 516 | "requires": { 517 | "escape-string-regexp": "^1.0.5", 518 | "object-assign": "^4.1.0" 519 | } 520 | }, 521 | "filename-regex": { 522 | "version": "2.0.1", 523 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", 524 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" 525 | }, 526 | "fill-range": { 527 | "version": "2.2.4", 528 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", 529 | "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", 530 | "requires": { 531 | "is-number": "^2.1.0", 532 | "isobject": "^2.0.0", 533 | "randomatic": "^3.0.0", 534 | "repeat-element": "^1.1.2", 535 | "repeat-string": "^1.5.2" 536 | } 537 | }, 538 | "find-up": { 539 | "version": "1.1.2", 540 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 541 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 542 | "requires": { 543 | "path-exists": "^2.0.0", 544 | "pinkie-promise": "^2.0.0" 545 | } 546 | }, 547 | "for-each": { 548 | "version": "0.3.3", 549 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 550 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 551 | "dev": true, 552 | "requires": { 553 | "is-callable": "^1.1.3" 554 | } 555 | }, 556 | "for-in": { 557 | "version": "1.0.2", 558 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 559 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" 560 | }, 561 | "for-own": { 562 | "version": "0.1.5", 563 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", 564 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", 565 | "requires": { 566 | "for-in": "^1.0.1" 567 | } 568 | }, 569 | "fragment-cache": { 570 | "version": "0.2.1", 571 | "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", 572 | "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", 573 | "requires": { 574 | "map-cache": "^0.2.2" 575 | } 576 | }, 577 | "fs.realpath": { 578 | "version": "1.0.0", 579 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 580 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 581 | }, 582 | "fsevents": { 583 | "version": "1.2.4", 584 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", 585 | "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", 586 | "optional": true, 587 | "requires": { 588 | "nan": "^2.9.2", 589 | "node-pre-gyp": "^0.10.0" 590 | }, 591 | "dependencies": { 592 | "abbrev": { 593 | "version": "1.1.1", 594 | "bundled": true, 595 | "optional": true 596 | }, 597 | "ansi-regex": { 598 | "version": "2.1.1", 599 | "bundled": true 600 | }, 601 | "aproba": { 602 | "version": "1.2.0", 603 | "bundled": true, 604 | "optional": true 605 | }, 606 | "are-we-there-yet": { 607 | "version": "1.1.4", 608 | "bundled": true, 609 | "optional": true, 610 | "requires": { 611 | "delegates": "^1.0.0", 612 | "readable-stream": "^2.0.6" 613 | } 614 | }, 615 | "balanced-match": { 616 | "version": "1.0.0", 617 | "bundled": true 618 | }, 619 | "brace-expansion": { 620 | "version": "1.1.11", 621 | "bundled": true, 622 | "requires": { 623 | "balanced-match": "^1.0.0", 624 | "concat-map": "0.0.1" 625 | } 626 | }, 627 | "chownr": { 628 | "version": "1.0.1", 629 | "bundled": true, 630 | "optional": true 631 | }, 632 | "code-point-at": { 633 | "version": "1.1.0", 634 | "bundled": true 635 | }, 636 | "concat-map": { 637 | "version": "0.0.1", 638 | "bundled": true 639 | }, 640 | "console-control-strings": { 641 | "version": "1.1.0", 642 | "bundled": true 643 | }, 644 | "core-util-is": { 645 | "version": "1.0.2", 646 | "bundled": true, 647 | "optional": true 648 | }, 649 | "debug": { 650 | "version": "2.6.9", 651 | "bundled": true, 652 | "optional": true, 653 | "requires": { 654 | "ms": "2.0.0" 655 | } 656 | }, 657 | "deep-extend": { 658 | "version": "0.5.1", 659 | "bundled": true, 660 | "optional": true 661 | }, 662 | "delegates": { 663 | "version": "1.0.0", 664 | "bundled": true, 665 | "optional": true 666 | }, 667 | "detect-libc": { 668 | "version": "1.0.3", 669 | "bundled": true, 670 | "optional": true 671 | }, 672 | "fs-minipass": { 673 | "version": "1.2.5", 674 | "bundled": true, 675 | "optional": true, 676 | "requires": { 677 | "minipass": "^2.2.1" 678 | } 679 | }, 680 | "fs.realpath": { 681 | "version": "1.0.0", 682 | "bundled": true, 683 | "optional": true 684 | }, 685 | "gauge": { 686 | "version": "2.7.4", 687 | "bundled": true, 688 | "optional": true, 689 | "requires": { 690 | "aproba": "^1.0.3", 691 | "console-control-strings": "^1.0.0", 692 | "has-unicode": "^2.0.0", 693 | "object-assign": "^4.1.0", 694 | "signal-exit": "^3.0.0", 695 | "string-width": "^1.0.1", 696 | "strip-ansi": "^3.0.1", 697 | "wide-align": "^1.1.0" 698 | } 699 | }, 700 | "glob": { 701 | "version": "7.1.2", 702 | "bundled": true, 703 | "optional": true, 704 | "requires": { 705 | "fs.realpath": "^1.0.0", 706 | "inflight": "^1.0.4", 707 | "inherits": "2", 708 | "minimatch": "^3.0.4", 709 | "once": "^1.3.0", 710 | "path-is-absolute": "^1.0.0" 711 | } 712 | }, 713 | "has-unicode": { 714 | "version": "2.0.1", 715 | "bundled": true, 716 | "optional": true 717 | }, 718 | "iconv-lite": { 719 | "version": "0.4.21", 720 | "bundled": true, 721 | "optional": true, 722 | "requires": { 723 | "safer-buffer": "^2.1.0" 724 | } 725 | }, 726 | "ignore-walk": { 727 | "version": "3.0.1", 728 | "bundled": true, 729 | "optional": true, 730 | "requires": { 731 | "minimatch": "^3.0.4" 732 | } 733 | }, 734 | "inflight": { 735 | "version": "1.0.6", 736 | "bundled": true, 737 | "optional": true, 738 | "requires": { 739 | "once": "^1.3.0", 740 | "wrappy": "1" 741 | } 742 | }, 743 | "inherits": { 744 | "version": "2.0.3", 745 | "bundled": true 746 | }, 747 | "ini": { 748 | "version": "1.3.5", 749 | "bundled": true, 750 | "optional": true 751 | }, 752 | "is-fullwidth-code-point": { 753 | "version": "1.0.0", 754 | "bundled": true, 755 | "requires": { 756 | "number-is-nan": "^1.0.0" 757 | } 758 | }, 759 | "isarray": { 760 | "version": "1.0.0", 761 | "bundled": true, 762 | "optional": true 763 | }, 764 | "minimatch": { 765 | "version": "3.0.4", 766 | "bundled": true, 767 | "requires": { 768 | "brace-expansion": "^1.1.7" 769 | } 770 | }, 771 | "minimist": { 772 | "version": "0.0.8", 773 | "bundled": true 774 | }, 775 | "minipass": { 776 | "version": "2.2.4", 777 | "bundled": true, 778 | "requires": { 779 | "safe-buffer": "^5.1.1", 780 | "yallist": "^3.0.0" 781 | } 782 | }, 783 | "minizlib": { 784 | "version": "1.1.0", 785 | "bundled": true, 786 | "optional": true, 787 | "requires": { 788 | "minipass": "^2.2.1" 789 | } 790 | }, 791 | "mkdirp": { 792 | "version": "0.5.1", 793 | "bundled": true, 794 | "requires": { 795 | "minimist": "0.0.8" 796 | } 797 | }, 798 | "ms": { 799 | "version": "2.0.0", 800 | "bundled": true, 801 | "optional": true 802 | }, 803 | "needle": { 804 | "version": "2.2.0", 805 | "bundled": true, 806 | "optional": true, 807 | "requires": { 808 | "debug": "^2.1.2", 809 | "iconv-lite": "^0.4.4", 810 | "sax": "^1.2.4" 811 | } 812 | }, 813 | "node-pre-gyp": { 814 | "version": "0.10.0", 815 | "bundled": true, 816 | "optional": true, 817 | "requires": { 818 | "detect-libc": "^1.0.2", 819 | "mkdirp": "^0.5.1", 820 | "needle": "^2.2.0", 821 | "nopt": "^4.0.1", 822 | "npm-packlist": "^1.1.6", 823 | "npmlog": "^4.0.2", 824 | "rc": "^1.1.7", 825 | "rimraf": "^2.6.1", 826 | "semver": "^5.3.0", 827 | "tar": "^4" 828 | } 829 | }, 830 | "nopt": { 831 | "version": "4.0.1", 832 | "bundled": true, 833 | "optional": true, 834 | "requires": { 835 | "abbrev": "1", 836 | "osenv": "^0.1.4" 837 | } 838 | }, 839 | "npm-bundled": { 840 | "version": "1.0.3", 841 | "bundled": true, 842 | "optional": true 843 | }, 844 | "npm-packlist": { 845 | "version": "1.1.10", 846 | "bundled": true, 847 | "optional": true, 848 | "requires": { 849 | "ignore-walk": "^3.0.1", 850 | "npm-bundled": "^1.0.1" 851 | } 852 | }, 853 | "npmlog": { 854 | "version": "4.1.2", 855 | "bundled": true, 856 | "optional": true, 857 | "requires": { 858 | "are-we-there-yet": "~1.1.2", 859 | "console-control-strings": "~1.1.0", 860 | "gauge": "~2.7.3", 861 | "set-blocking": "~2.0.0" 862 | } 863 | }, 864 | "number-is-nan": { 865 | "version": "1.0.1", 866 | "bundled": true 867 | }, 868 | "object-assign": { 869 | "version": "4.1.1", 870 | "bundled": true, 871 | "optional": true 872 | }, 873 | "once": { 874 | "version": "1.4.0", 875 | "bundled": true, 876 | "requires": { 877 | "wrappy": "1" 878 | } 879 | }, 880 | "os-homedir": { 881 | "version": "1.0.2", 882 | "bundled": true, 883 | "optional": true 884 | }, 885 | "os-tmpdir": { 886 | "version": "1.0.2", 887 | "bundled": true, 888 | "optional": true 889 | }, 890 | "osenv": { 891 | "version": "0.1.5", 892 | "bundled": true, 893 | "optional": true, 894 | "requires": { 895 | "os-homedir": "^1.0.0", 896 | "os-tmpdir": "^1.0.0" 897 | } 898 | }, 899 | "path-is-absolute": { 900 | "version": "1.0.1", 901 | "bundled": true, 902 | "optional": true 903 | }, 904 | "process-nextick-args": { 905 | "version": "2.0.0", 906 | "bundled": true, 907 | "optional": true 908 | }, 909 | "rc": { 910 | "version": "1.2.7", 911 | "bundled": true, 912 | "optional": true, 913 | "requires": { 914 | "deep-extend": "^0.5.1", 915 | "ini": "~1.3.0", 916 | "minimist": "^1.2.0", 917 | "strip-json-comments": "~2.0.1" 918 | }, 919 | "dependencies": { 920 | "minimist": { 921 | "version": "1.2.0", 922 | "bundled": true, 923 | "optional": true 924 | } 925 | } 926 | }, 927 | "readable-stream": { 928 | "version": "2.3.6", 929 | "bundled": true, 930 | "optional": true, 931 | "requires": { 932 | "core-util-is": "~1.0.0", 933 | "inherits": "~2.0.3", 934 | "isarray": "~1.0.0", 935 | "process-nextick-args": "~2.0.0", 936 | "safe-buffer": "~5.1.1", 937 | "string_decoder": "~1.1.1", 938 | "util-deprecate": "~1.0.1" 939 | } 940 | }, 941 | "rimraf": { 942 | "version": "2.6.2", 943 | "bundled": true, 944 | "optional": true, 945 | "requires": { 946 | "glob": "^7.0.5" 947 | } 948 | }, 949 | "safe-buffer": { 950 | "version": "5.1.1", 951 | "bundled": true 952 | }, 953 | "safer-buffer": { 954 | "version": "2.1.2", 955 | "bundled": true, 956 | "optional": true 957 | }, 958 | "sax": { 959 | "version": "1.2.4", 960 | "bundled": true, 961 | "optional": true 962 | }, 963 | "semver": { 964 | "version": "5.5.0", 965 | "bundled": true, 966 | "optional": true 967 | }, 968 | "set-blocking": { 969 | "version": "2.0.0", 970 | "bundled": true, 971 | "optional": true 972 | }, 973 | "signal-exit": { 974 | "version": "3.0.2", 975 | "bundled": true, 976 | "optional": true 977 | }, 978 | "string-width": { 979 | "version": "1.0.2", 980 | "bundled": true, 981 | "requires": { 982 | "code-point-at": "^1.0.0", 983 | "is-fullwidth-code-point": "^1.0.0", 984 | "strip-ansi": "^3.0.0" 985 | } 986 | }, 987 | "string_decoder": { 988 | "version": "1.1.1", 989 | "bundled": true, 990 | "optional": true, 991 | "requires": { 992 | "safe-buffer": "~5.1.0" 993 | } 994 | }, 995 | "strip-ansi": { 996 | "version": "3.0.1", 997 | "bundled": true, 998 | "requires": { 999 | "ansi-regex": "^2.0.0" 1000 | } 1001 | }, 1002 | "strip-json-comments": { 1003 | "version": "2.0.1", 1004 | "bundled": true, 1005 | "optional": true 1006 | }, 1007 | "tar": { 1008 | "version": "4.4.1", 1009 | "bundled": true, 1010 | "optional": true, 1011 | "requires": { 1012 | "chownr": "^1.0.1", 1013 | "fs-minipass": "^1.2.5", 1014 | "minipass": "^2.2.4", 1015 | "minizlib": "^1.1.0", 1016 | "mkdirp": "^0.5.0", 1017 | "safe-buffer": "^5.1.1", 1018 | "yallist": "^3.0.2" 1019 | } 1020 | }, 1021 | "util-deprecate": { 1022 | "version": "1.0.2", 1023 | "bundled": true, 1024 | "optional": true 1025 | }, 1026 | "wide-align": { 1027 | "version": "1.1.2", 1028 | "bundled": true, 1029 | "optional": true, 1030 | "requires": { 1031 | "string-width": "^1.0.2" 1032 | } 1033 | }, 1034 | "wrappy": { 1035 | "version": "1.0.2", 1036 | "bundled": true 1037 | }, 1038 | "yallist": { 1039 | "version": "3.0.2", 1040 | "bundled": true 1041 | } 1042 | } 1043 | }, 1044 | "function-bind": { 1045 | "version": "1.1.1", 1046 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1047 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1048 | "dev": true 1049 | }, 1050 | "get-stdin": { 1051 | "version": "4.0.1", 1052 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", 1053 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" 1054 | }, 1055 | "get-value": { 1056 | "version": "2.0.6", 1057 | "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", 1058 | "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" 1059 | }, 1060 | "glob": { 1061 | "version": "7.1.3", 1062 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 1063 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 1064 | "dev": true, 1065 | "requires": { 1066 | "fs.realpath": "^1.0.0", 1067 | "inflight": "^1.0.4", 1068 | "inherits": "2", 1069 | "minimatch": "^3.0.4", 1070 | "once": "^1.3.0", 1071 | "path-is-absolute": "^1.0.0" 1072 | } 1073 | }, 1074 | "glob-base": { 1075 | "version": "0.3.0", 1076 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", 1077 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", 1078 | "requires": { 1079 | "glob-parent": "^2.0.0", 1080 | "is-glob": "^2.0.0" 1081 | } 1082 | }, 1083 | "glob-parent": { 1084 | "version": "2.0.0", 1085 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", 1086 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", 1087 | "requires": { 1088 | "is-glob": "^2.0.0" 1089 | } 1090 | }, 1091 | "graceful-fs": { 1092 | "version": "4.1.15", 1093 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 1094 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" 1095 | }, 1096 | "has": { 1097 | "version": "1.0.3", 1098 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1099 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1100 | "dev": true, 1101 | "requires": { 1102 | "function-bind": "^1.1.1" 1103 | } 1104 | }, 1105 | "has-ansi": { 1106 | "version": "2.0.0", 1107 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1108 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1109 | "requires": { 1110 | "ansi-regex": "^2.0.0" 1111 | } 1112 | }, 1113 | "has-symbols": { 1114 | "version": "1.0.0", 1115 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 1116 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", 1117 | "dev": true 1118 | }, 1119 | "has-value": { 1120 | "version": "1.0.0", 1121 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", 1122 | "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", 1123 | "requires": { 1124 | "get-value": "^2.0.6", 1125 | "has-values": "^1.0.0", 1126 | "isobject": "^3.0.0" 1127 | }, 1128 | "dependencies": { 1129 | "isobject": { 1130 | "version": "3.0.1", 1131 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 1132 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 1133 | } 1134 | } 1135 | }, 1136 | "has-values": { 1137 | "version": "1.0.0", 1138 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", 1139 | "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", 1140 | "requires": { 1141 | "is-number": "^3.0.0", 1142 | "kind-of": "^4.0.0" 1143 | }, 1144 | "dependencies": { 1145 | "is-number": { 1146 | "version": "3.0.0", 1147 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", 1148 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", 1149 | "requires": { 1150 | "kind-of": "^3.0.2" 1151 | }, 1152 | "dependencies": { 1153 | "kind-of": { 1154 | "version": "3.2.2", 1155 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1156 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1157 | "requires": { 1158 | "is-buffer": "^1.1.5" 1159 | } 1160 | } 1161 | } 1162 | }, 1163 | "kind-of": { 1164 | "version": "4.0.0", 1165 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", 1166 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", 1167 | "requires": { 1168 | "is-buffer": "^1.1.5" 1169 | } 1170 | } 1171 | } 1172 | }, 1173 | "hosted-git-info": { 1174 | "version": "2.7.1", 1175 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", 1176 | "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" 1177 | }, 1178 | "indent-string": { 1179 | "version": "2.1.0", 1180 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", 1181 | "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", 1182 | "requires": { 1183 | "repeating": "^2.0.0" 1184 | } 1185 | }, 1186 | "inflight": { 1187 | "version": "1.0.6", 1188 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1189 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1190 | "requires": { 1191 | "once": "^1.3.0", 1192 | "wrappy": "1" 1193 | } 1194 | }, 1195 | "inherits": { 1196 | "version": "2.0.3", 1197 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1198 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1199 | }, 1200 | "is-accessor-descriptor": { 1201 | "version": "0.1.6", 1202 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", 1203 | "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", 1204 | "requires": { 1205 | "kind-of": "^3.0.2" 1206 | } 1207 | }, 1208 | "is-arrayish": { 1209 | "version": "0.2.1", 1210 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1211 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 1212 | }, 1213 | "is-binary-path": { 1214 | "version": "1.0.1", 1215 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", 1216 | "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", 1217 | "requires": { 1218 | "binary-extensions": "^1.0.0" 1219 | } 1220 | }, 1221 | "is-buffer": { 1222 | "version": "1.1.6", 1223 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1224 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 1225 | }, 1226 | "is-builtin-module": { 1227 | "version": "1.0.0", 1228 | "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 1229 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", 1230 | "requires": { 1231 | "builtin-modules": "^1.0.0" 1232 | } 1233 | }, 1234 | "is-callable": { 1235 | "version": "1.1.4", 1236 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 1237 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", 1238 | "dev": true 1239 | }, 1240 | "is-data-descriptor": { 1241 | "version": "0.1.4", 1242 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", 1243 | "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", 1244 | "requires": { 1245 | "kind-of": "^3.0.2" 1246 | } 1247 | }, 1248 | "is-date-object": { 1249 | "version": "1.0.1", 1250 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 1251 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 1252 | "dev": true 1253 | }, 1254 | "is-descriptor": { 1255 | "version": "0.1.6", 1256 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", 1257 | "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", 1258 | "requires": { 1259 | "is-accessor-descriptor": "^0.1.6", 1260 | "is-data-descriptor": "^0.1.4", 1261 | "kind-of": "^5.0.0" 1262 | }, 1263 | "dependencies": { 1264 | "kind-of": { 1265 | "version": "5.1.0", 1266 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", 1267 | "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" 1268 | } 1269 | } 1270 | }, 1271 | "is-dotfile": { 1272 | "version": "1.0.3", 1273 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", 1274 | "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" 1275 | }, 1276 | "is-equal-shallow": { 1277 | "version": "0.1.3", 1278 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", 1279 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", 1280 | "requires": { 1281 | "is-primitive": "^2.0.0" 1282 | } 1283 | }, 1284 | "is-extendable": { 1285 | "version": "0.1.1", 1286 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1287 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" 1288 | }, 1289 | "is-extglob": { 1290 | "version": "1.0.0", 1291 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 1292 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" 1293 | }, 1294 | "is-finite": { 1295 | "version": "1.0.2", 1296 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 1297 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 1298 | "requires": { 1299 | "number-is-nan": "^1.0.0" 1300 | } 1301 | }, 1302 | "is-glob": { 1303 | "version": "2.0.1", 1304 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 1305 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", 1306 | "requires": { 1307 | "is-extglob": "^1.0.0" 1308 | } 1309 | }, 1310 | "is-number": { 1311 | "version": "2.1.0", 1312 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", 1313 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", 1314 | "requires": { 1315 | "kind-of": "^3.0.2" 1316 | } 1317 | }, 1318 | "is-plain-object": { 1319 | "version": "2.0.4", 1320 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 1321 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 1322 | "requires": { 1323 | "isobject": "^3.0.1" 1324 | }, 1325 | "dependencies": { 1326 | "isobject": { 1327 | "version": "3.0.1", 1328 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 1329 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 1330 | } 1331 | } 1332 | }, 1333 | "is-posix-bracket": { 1334 | "version": "0.1.1", 1335 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", 1336 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" 1337 | }, 1338 | "is-primitive": { 1339 | "version": "2.0.0", 1340 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", 1341 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" 1342 | }, 1343 | "is-regex": { 1344 | "version": "1.0.4", 1345 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 1346 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 1347 | "dev": true, 1348 | "requires": { 1349 | "has": "^1.0.1" 1350 | } 1351 | }, 1352 | "is-symbol": { 1353 | "version": "1.0.2", 1354 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", 1355 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", 1356 | "dev": true, 1357 | "requires": { 1358 | "has-symbols": "^1.0.0" 1359 | } 1360 | }, 1361 | "is-utf8": { 1362 | "version": "0.2.1", 1363 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 1364 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" 1365 | }, 1366 | "is-windows": { 1367 | "version": "1.0.2", 1368 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 1369 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" 1370 | }, 1371 | "isarray": { 1372 | "version": "1.0.0", 1373 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1374 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1375 | }, 1376 | "isobject": { 1377 | "version": "2.1.0", 1378 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 1379 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 1380 | "requires": { 1381 | "isarray": "1.0.0" 1382 | } 1383 | }, 1384 | "jsonify": { 1385 | "version": "0.0.0", 1386 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 1387 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" 1388 | }, 1389 | "kind-of": { 1390 | "version": "3.2.2", 1391 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1392 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1393 | "requires": { 1394 | "is-buffer": "^1.1.5" 1395 | } 1396 | }, 1397 | "load-json-file": { 1398 | "version": "1.1.0", 1399 | "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", 1400 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", 1401 | "requires": { 1402 | "graceful-fs": "^4.1.2", 1403 | "parse-json": "^2.2.0", 1404 | "pify": "^2.0.0", 1405 | "pinkie-promise": "^2.0.0", 1406 | "strip-bom": "^2.0.0" 1407 | } 1408 | }, 1409 | "lodash": { 1410 | "version": "4.17.11", 1411 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 1412 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" 1413 | }, 1414 | "loud-rejection": { 1415 | "version": "1.6.0", 1416 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", 1417 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", 1418 | "requires": { 1419 | "currently-unhandled": "^0.4.1", 1420 | "signal-exit": "^3.0.0" 1421 | } 1422 | }, 1423 | "map-cache": { 1424 | "version": "0.2.2", 1425 | "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", 1426 | "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" 1427 | }, 1428 | "map-obj": { 1429 | "version": "1.0.1", 1430 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", 1431 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" 1432 | }, 1433 | "map-visit": { 1434 | "version": "1.0.0", 1435 | "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", 1436 | "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", 1437 | "requires": { 1438 | "object-visit": "^1.0.0" 1439 | } 1440 | }, 1441 | "math-random": { 1442 | "version": "1.0.1", 1443 | "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", 1444 | "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=" 1445 | }, 1446 | "meow": { 1447 | "version": "3.7.0", 1448 | "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", 1449 | "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", 1450 | "requires": { 1451 | "camelcase-keys": "^2.0.0", 1452 | "decamelize": "^1.1.2", 1453 | "loud-rejection": "^1.0.0", 1454 | "map-obj": "^1.0.1", 1455 | "minimist": "^1.1.3", 1456 | "normalize-package-data": "^2.3.4", 1457 | "object-assign": "^4.0.1", 1458 | "read-pkg-up": "^1.0.1", 1459 | "redent": "^1.0.0", 1460 | "trim-newlines": "^1.0.0" 1461 | } 1462 | }, 1463 | "micromatch": { 1464 | "version": "2.3.11", 1465 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", 1466 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", 1467 | "requires": { 1468 | "arr-diff": "^2.0.0", 1469 | "array-unique": "^0.2.1", 1470 | "braces": "^1.8.2", 1471 | "expand-brackets": "^0.1.4", 1472 | "extglob": "^0.3.1", 1473 | "filename-regex": "^2.0.0", 1474 | "is-extglob": "^1.0.0", 1475 | "is-glob": "^2.0.1", 1476 | "kind-of": "^3.0.2", 1477 | "normalize-path": "^2.0.1", 1478 | "object.omit": "^2.0.0", 1479 | "parse-glob": "^3.0.4", 1480 | "regex-cache": "^0.4.2" 1481 | } 1482 | }, 1483 | "minimatch": { 1484 | "version": "3.0.4", 1485 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1486 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1487 | "requires": { 1488 | "brace-expansion": "^1.1.7" 1489 | } 1490 | }, 1491 | "minimist": { 1492 | "version": "1.2.0", 1493 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1494 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 1495 | }, 1496 | "mixin-deep": { 1497 | "version": "1.3.1", 1498 | "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", 1499 | "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", 1500 | "requires": { 1501 | "for-in": "^1.0.2", 1502 | "is-extendable": "^1.0.1" 1503 | }, 1504 | "dependencies": { 1505 | "is-extendable": { 1506 | "version": "1.0.1", 1507 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 1508 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 1509 | "requires": { 1510 | "is-plain-object": "^2.0.4" 1511 | } 1512 | } 1513 | } 1514 | }, 1515 | "ms": { 1516 | "version": "0.7.2", 1517 | "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", 1518 | "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" 1519 | }, 1520 | "nan": { 1521 | "version": "2.11.1", 1522 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", 1523 | "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", 1524 | "optional": true 1525 | }, 1526 | "nanomatch": { 1527 | "version": "1.2.13", 1528 | "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", 1529 | "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", 1530 | "requires": { 1531 | "arr-diff": "^4.0.0", 1532 | "array-unique": "^0.3.2", 1533 | "define-property": "^2.0.2", 1534 | "extend-shallow": "^3.0.2", 1535 | "fragment-cache": "^0.2.1", 1536 | "is-windows": "^1.0.2", 1537 | "kind-of": "^6.0.2", 1538 | "object.pick": "^1.3.0", 1539 | "regex-not": "^1.0.0", 1540 | "snapdragon": "^0.8.1", 1541 | "to-regex": "^3.0.1" 1542 | }, 1543 | "dependencies": { 1544 | "arr-diff": { 1545 | "version": "4.0.0", 1546 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", 1547 | "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" 1548 | }, 1549 | "array-unique": { 1550 | "version": "0.3.2", 1551 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", 1552 | "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" 1553 | }, 1554 | "kind-of": { 1555 | "version": "6.0.2", 1556 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 1557 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" 1558 | } 1559 | } 1560 | }, 1561 | "normalize-package-data": { 1562 | "version": "2.4.0", 1563 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", 1564 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", 1565 | "requires": { 1566 | "hosted-git-info": "^2.1.4", 1567 | "is-builtin-module": "^1.0.0", 1568 | "semver": "2 || 3 || 4 || 5", 1569 | "validate-npm-package-license": "^3.0.1" 1570 | } 1571 | }, 1572 | "normalize-path": { 1573 | "version": "2.1.1", 1574 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 1575 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 1576 | "requires": { 1577 | "remove-trailing-separator": "^1.0.1" 1578 | } 1579 | }, 1580 | "number-is-nan": { 1581 | "version": "1.0.1", 1582 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1583 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 1584 | }, 1585 | "object-assign": { 1586 | "version": "4.1.1", 1587 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1588 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1589 | }, 1590 | "object-copy": { 1591 | "version": "0.1.0", 1592 | "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", 1593 | "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", 1594 | "requires": { 1595 | "copy-descriptor": "^0.1.0", 1596 | "define-property": "^0.2.5", 1597 | "kind-of": "^3.0.3" 1598 | }, 1599 | "dependencies": { 1600 | "define-property": { 1601 | "version": "0.2.5", 1602 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 1603 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 1604 | "requires": { 1605 | "is-descriptor": "^0.1.0" 1606 | } 1607 | } 1608 | } 1609 | }, 1610 | "object-inspect": { 1611 | "version": "1.6.0", 1612 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", 1613 | "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", 1614 | "dev": true 1615 | }, 1616 | "object-keys": { 1617 | "version": "1.0.12", 1618 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", 1619 | "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", 1620 | "dev": true 1621 | }, 1622 | "object-visit": { 1623 | "version": "1.0.1", 1624 | "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", 1625 | "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", 1626 | "requires": { 1627 | "isobject": "^3.0.0" 1628 | }, 1629 | "dependencies": { 1630 | "isobject": { 1631 | "version": "3.0.1", 1632 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 1633 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 1634 | } 1635 | } 1636 | }, 1637 | "object.omit": { 1638 | "version": "2.0.1", 1639 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", 1640 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", 1641 | "requires": { 1642 | "for-own": "^0.1.4", 1643 | "is-extendable": "^0.1.1" 1644 | } 1645 | }, 1646 | "object.pick": { 1647 | "version": "1.3.0", 1648 | "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", 1649 | "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", 1650 | "requires": { 1651 | "isobject": "^3.0.1" 1652 | }, 1653 | "dependencies": { 1654 | "isobject": { 1655 | "version": "3.0.1", 1656 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 1657 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 1658 | } 1659 | } 1660 | }, 1661 | "once": { 1662 | "version": "1.4.0", 1663 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1664 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1665 | "requires": { 1666 | "wrappy": "1" 1667 | } 1668 | }, 1669 | "outpipe": { 1670 | "version": "1.1.1", 1671 | "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz", 1672 | "integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=", 1673 | "requires": { 1674 | "shell-quote": "^1.4.2" 1675 | } 1676 | }, 1677 | "parse-glob": { 1678 | "version": "3.0.4", 1679 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", 1680 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", 1681 | "requires": { 1682 | "glob-base": "^0.3.0", 1683 | "is-dotfile": "^1.0.0", 1684 | "is-extglob": "^1.0.0", 1685 | "is-glob": "^2.0.0" 1686 | } 1687 | }, 1688 | "parse-json": { 1689 | "version": "2.2.0", 1690 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1691 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1692 | "requires": { 1693 | "error-ex": "^1.2.0" 1694 | } 1695 | }, 1696 | "parse-ms": { 1697 | "version": "1.0.1", 1698 | "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", 1699 | "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=" 1700 | }, 1701 | "pascalcase": { 1702 | "version": "0.1.1", 1703 | "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", 1704 | "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" 1705 | }, 1706 | "path-exists": { 1707 | "version": "2.1.0", 1708 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 1709 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 1710 | "requires": { 1711 | "pinkie-promise": "^2.0.0" 1712 | } 1713 | }, 1714 | "path-is-absolute": { 1715 | "version": "1.0.1", 1716 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1717 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1718 | }, 1719 | "path-parse": { 1720 | "version": "1.0.6", 1721 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1722 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 1723 | "dev": true 1724 | }, 1725 | "path-type": { 1726 | "version": "1.1.0", 1727 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", 1728 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", 1729 | "requires": { 1730 | "graceful-fs": "^4.1.2", 1731 | "pify": "^2.0.0", 1732 | "pinkie-promise": "^2.0.0" 1733 | } 1734 | }, 1735 | "pify": { 1736 | "version": "2.3.0", 1737 | "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1738 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 1739 | }, 1740 | "pinkie": { 1741 | "version": "2.0.4", 1742 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1743 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" 1744 | }, 1745 | "pinkie-promise": { 1746 | "version": "2.0.1", 1747 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1748 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1749 | "requires": { 1750 | "pinkie": "^2.0.0" 1751 | } 1752 | }, 1753 | "plur": { 1754 | "version": "1.0.0", 1755 | "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", 1756 | "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=" 1757 | }, 1758 | "posix-character-classes": { 1759 | "version": "0.1.1", 1760 | "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", 1761 | "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" 1762 | }, 1763 | "preserve": { 1764 | "version": "0.2.0", 1765 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", 1766 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" 1767 | }, 1768 | "pretty-ms": { 1769 | "version": "2.1.0", 1770 | "resolved": "http://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", 1771 | "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", 1772 | "requires": { 1773 | "is-finite": "^1.0.1", 1774 | "parse-ms": "^1.0.0", 1775 | "plur": "^1.0.0" 1776 | } 1777 | }, 1778 | "process-nextick-args": { 1779 | "version": "2.0.0", 1780 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 1781 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 1782 | }, 1783 | "randomatic": { 1784 | "version": "3.1.1", 1785 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", 1786 | "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", 1787 | "requires": { 1788 | "is-number": "^4.0.0", 1789 | "kind-of": "^6.0.0", 1790 | "math-random": "^1.0.1" 1791 | }, 1792 | "dependencies": { 1793 | "is-number": { 1794 | "version": "4.0.0", 1795 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", 1796 | "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" 1797 | }, 1798 | "kind-of": { 1799 | "version": "6.0.2", 1800 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 1801 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" 1802 | } 1803 | } 1804 | }, 1805 | "re-emitter": { 1806 | "version": "1.1.3", 1807 | "resolved": "https://registry.npmjs.org/re-emitter/-/re-emitter-1.1.3.tgz", 1808 | "integrity": "sha1-+p4xn/3u6zWycpbvDz03TawvUqc=" 1809 | }, 1810 | "read-pkg": { 1811 | "version": "1.1.0", 1812 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", 1813 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", 1814 | "requires": { 1815 | "load-json-file": "^1.0.0", 1816 | "normalize-package-data": "^2.3.2", 1817 | "path-type": "^1.0.0" 1818 | } 1819 | }, 1820 | "read-pkg-up": { 1821 | "version": "1.0.1", 1822 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", 1823 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", 1824 | "requires": { 1825 | "find-up": "^1.0.0", 1826 | "read-pkg": "^1.0.0" 1827 | } 1828 | }, 1829 | "readable-stream": { 1830 | "version": "2.3.6", 1831 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1832 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1833 | "requires": { 1834 | "core-util-is": "~1.0.0", 1835 | "inherits": "~2.0.3", 1836 | "isarray": "~1.0.0", 1837 | "process-nextick-args": "~2.0.0", 1838 | "safe-buffer": "~5.1.1", 1839 | "string_decoder": "~1.1.1", 1840 | "util-deprecate": "~1.0.1" 1841 | } 1842 | }, 1843 | "readdirp": { 1844 | "version": "2.2.1", 1845 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", 1846 | "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", 1847 | "requires": { 1848 | "graceful-fs": "^4.1.11", 1849 | "micromatch": "^3.1.10", 1850 | "readable-stream": "^2.0.2" 1851 | }, 1852 | "dependencies": { 1853 | "arr-diff": { 1854 | "version": "4.0.0", 1855 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", 1856 | "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" 1857 | }, 1858 | "array-unique": { 1859 | "version": "0.3.2", 1860 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", 1861 | "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" 1862 | }, 1863 | "braces": { 1864 | "version": "2.3.2", 1865 | "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", 1866 | "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", 1867 | "requires": { 1868 | "arr-flatten": "^1.1.0", 1869 | "array-unique": "^0.3.2", 1870 | "extend-shallow": "^2.0.1", 1871 | "fill-range": "^4.0.0", 1872 | "isobject": "^3.0.1", 1873 | "repeat-element": "^1.1.2", 1874 | "snapdragon": "^0.8.1", 1875 | "snapdragon-node": "^2.0.1", 1876 | "split-string": "^3.0.2", 1877 | "to-regex": "^3.0.1" 1878 | }, 1879 | "dependencies": { 1880 | "extend-shallow": { 1881 | "version": "2.0.1", 1882 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1883 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1884 | "requires": { 1885 | "is-extendable": "^0.1.0" 1886 | } 1887 | } 1888 | } 1889 | }, 1890 | "expand-brackets": { 1891 | "version": "2.1.4", 1892 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", 1893 | "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", 1894 | "requires": { 1895 | "debug": "^2.3.3", 1896 | "define-property": "^0.2.5", 1897 | "extend-shallow": "^2.0.1", 1898 | "posix-character-classes": "^0.1.0", 1899 | "regex-not": "^1.0.0", 1900 | "snapdragon": "^0.8.1", 1901 | "to-regex": "^3.0.1" 1902 | }, 1903 | "dependencies": { 1904 | "define-property": { 1905 | "version": "0.2.5", 1906 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 1907 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 1908 | "requires": { 1909 | "is-descriptor": "^0.1.0" 1910 | } 1911 | }, 1912 | "extend-shallow": { 1913 | "version": "2.0.1", 1914 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1915 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1916 | "requires": { 1917 | "is-extendable": "^0.1.0" 1918 | } 1919 | }, 1920 | "is-accessor-descriptor": { 1921 | "version": "0.1.6", 1922 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", 1923 | "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", 1924 | "requires": { 1925 | "kind-of": "^3.0.2" 1926 | }, 1927 | "dependencies": { 1928 | "kind-of": { 1929 | "version": "3.2.2", 1930 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1931 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1932 | "requires": { 1933 | "is-buffer": "^1.1.5" 1934 | } 1935 | } 1936 | } 1937 | }, 1938 | "is-data-descriptor": { 1939 | "version": "0.1.4", 1940 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", 1941 | "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", 1942 | "requires": { 1943 | "kind-of": "^3.0.2" 1944 | }, 1945 | "dependencies": { 1946 | "kind-of": { 1947 | "version": "3.2.2", 1948 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1949 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1950 | "requires": { 1951 | "is-buffer": "^1.1.5" 1952 | } 1953 | } 1954 | } 1955 | }, 1956 | "is-descriptor": { 1957 | "version": "0.1.6", 1958 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", 1959 | "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", 1960 | "requires": { 1961 | "is-accessor-descriptor": "^0.1.6", 1962 | "is-data-descriptor": "^0.1.4", 1963 | "kind-of": "^5.0.0" 1964 | } 1965 | }, 1966 | "kind-of": { 1967 | "version": "5.1.0", 1968 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", 1969 | "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" 1970 | } 1971 | } 1972 | }, 1973 | "extglob": { 1974 | "version": "2.0.4", 1975 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", 1976 | "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", 1977 | "requires": { 1978 | "array-unique": "^0.3.2", 1979 | "define-property": "^1.0.0", 1980 | "expand-brackets": "^2.1.4", 1981 | "extend-shallow": "^2.0.1", 1982 | "fragment-cache": "^0.2.1", 1983 | "regex-not": "^1.0.0", 1984 | "snapdragon": "^0.8.1", 1985 | "to-regex": "^3.0.1" 1986 | }, 1987 | "dependencies": { 1988 | "define-property": { 1989 | "version": "1.0.0", 1990 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 1991 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 1992 | "requires": { 1993 | "is-descriptor": "^1.0.0" 1994 | } 1995 | }, 1996 | "extend-shallow": { 1997 | "version": "2.0.1", 1998 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1999 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 2000 | "requires": { 2001 | "is-extendable": "^0.1.0" 2002 | } 2003 | } 2004 | } 2005 | }, 2006 | "fill-range": { 2007 | "version": "4.0.0", 2008 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", 2009 | "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", 2010 | "requires": { 2011 | "extend-shallow": "^2.0.1", 2012 | "is-number": "^3.0.0", 2013 | "repeat-string": "^1.6.1", 2014 | "to-regex-range": "^2.1.0" 2015 | }, 2016 | "dependencies": { 2017 | "extend-shallow": { 2018 | "version": "2.0.1", 2019 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 2020 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 2021 | "requires": { 2022 | "is-extendable": "^0.1.0" 2023 | } 2024 | } 2025 | } 2026 | }, 2027 | "is-accessor-descriptor": { 2028 | "version": "1.0.0", 2029 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 2030 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 2031 | "requires": { 2032 | "kind-of": "^6.0.0" 2033 | } 2034 | }, 2035 | "is-data-descriptor": { 2036 | "version": "1.0.0", 2037 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 2038 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 2039 | "requires": { 2040 | "kind-of": "^6.0.0" 2041 | } 2042 | }, 2043 | "is-descriptor": { 2044 | "version": "1.0.2", 2045 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 2046 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 2047 | "requires": { 2048 | "is-accessor-descriptor": "^1.0.0", 2049 | "is-data-descriptor": "^1.0.0", 2050 | "kind-of": "^6.0.2" 2051 | } 2052 | }, 2053 | "is-number": { 2054 | "version": "3.0.0", 2055 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", 2056 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", 2057 | "requires": { 2058 | "kind-of": "^3.0.2" 2059 | }, 2060 | "dependencies": { 2061 | "kind-of": { 2062 | "version": "3.2.2", 2063 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2064 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2065 | "requires": { 2066 | "is-buffer": "^1.1.5" 2067 | } 2068 | } 2069 | } 2070 | }, 2071 | "isobject": { 2072 | "version": "3.0.1", 2073 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 2074 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 2075 | }, 2076 | "kind-of": { 2077 | "version": "6.0.2", 2078 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 2079 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" 2080 | }, 2081 | "micromatch": { 2082 | "version": "3.1.10", 2083 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", 2084 | "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", 2085 | "requires": { 2086 | "arr-diff": "^4.0.0", 2087 | "array-unique": "^0.3.2", 2088 | "braces": "^2.3.1", 2089 | "define-property": "^2.0.2", 2090 | "extend-shallow": "^3.0.2", 2091 | "extglob": "^2.0.4", 2092 | "fragment-cache": "^0.2.1", 2093 | "kind-of": "^6.0.2", 2094 | "nanomatch": "^1.2.9", 2095 | "object.pick": "^1.3.0", 2096 | "regex-not": "^1.0.0", 2097 | "snapdragon": "^0.8.1", 2098 | "to-regex": "^3.0.2" 2099 | } 2100 | } 2101 | } 2102 | }, 2103 | "redent": { 2104 | "version": "1.0.0", 2105 | "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", 2106 | "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", 2107 | "requires": { 2108 | "indent-string": "^2.1.0", 2109 | "strip-indent": "^1.0.1" 2110 | } 2111 | }, 2112 | "regex-cache": { 2113 | "version": "0.4.4", 2114 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", 2115 | "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", 2116 | "requires": { 2117 | "is-equal-shallow": "^0.1.3" 2118 | } 2119 | }, 2120 | "regex-not": { 2121 | "version": "1.0.2", 2122 | "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", 2123 | "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", 2124 | "requires": { 2125 | "extend-shallow": "^3.0.2", 2126 | "safe-regex": "^1.1.0" 2127 | } 2128 | }, 2129 | "remove-trailing-separator": { 2130 | "version": "1.1.0", 2131 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 2132 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" 2133 | }, 2134 | "repeat-element": { 2135 | "version": "1.1.3", 2136 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", 2137 | "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" 2138 | }, 2139 | "repeat-string": { 2140 | "version": "1.6.1", 2141 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 2142 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 2143 | }, 2144 | "repeating": { 2145 | "version": "2.0.1", 2146 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", 2147 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", 2148 | "requires": { 2149 | "is-finite": "^1.0.0" 2150 | } 2151 | }, 2152 | "resolve": { 2153 | "version": "1.7.1", 2154 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", 2155 | "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", 2156 | "dev": true, 2157 | "requires": { 2158 | "path-parse": "^1.0.5" 2159 | } 2160 | }, 2161 | "resolve-url": { 2162 | "version": "0.2.1", 2163 | "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", 2164 | "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" 2165 | }, 2166 | "resumer": { 2167 | "version": "0.0.0", 2168 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 2169 | "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", 2170 | "dev": true, 2171 | "requires": { 2172 | "through": "~2.3.4" 2173 | } 2174 | }, 2175 | "ret": { 2176 | "version": "0.1.15", 2177 | "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", 2178 | "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" 2179 | }, 2180 | "safe-buffer": { 2181 | "version": "5.1.2", 2182 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2183 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2184 | }, 2185 | "safe-regex": { 2186 | "version": "1.1.0", 2187 | "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", 2188 | "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", 2189 | "requires": { 2190 | "ret": "~0.1.10" 2191 | } 2192 | }, 2193 | "semver": { 2194 | "version": "5.6.0", 2195 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 2196 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" 2197 | }, 2198 | "set-value": { 2199 | "version": "2.0.0", 2200 | "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", 2201 | "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", 2202 | "requires": { 2203 | "extend-shallow": "^2.0.1", 2204 | "is-extendable": "^0.1.1", 2205 | "is-plain-object": "^2.0.3", 2206 | "split-string": "^3.0.1" 2207 | }, 2208 | "dependencies": { 2209 | "extend-shallow": { 2210 | "version": "2.0.1", 2211 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 2212 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 2213 | "requires": { 2214 | "is-extendable": "^0.1.0" 2215 | } 2216 | } 2217 | } 2218 | }, 2219 | "shell-quote": { 2220 | "version": "1.6.1", 2221 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", 2222 | "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", 2223 | "requires": { 2224 | "array-filter": "~0.0.0", 2225 | "array-map": "~0.0.0", 2226 | "array-reduce": "~0.0.0", 2227 | "jsonify": "~0.0.0" 2228 | } 2229 | }, 2230 | "signal-exit": { 2231 | "version": "3.0.2", 2232 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 2233 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 2234 | }, 2235 | "simpler-debounce": { 2236 | "version": "1.0.0", 2237 | "resolved": "https://registry.npmjs.org/simpler-debounce/-/simpler-debounce-1.0.0.tgz", 2238 | "integrity": "sha1-Phyq7fdbTpPEW5UGAZK6L4u74TY=" 2239 | }, 2240 | "snapdragon": { 2241 | "version": "0.8.2", 2242 | "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", 2243 | "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", 2244 | "requires": { 2245 | "base": "^0.11.1", 2246 | "debug": "^2.2.0", 2247 | "define-property": "^0.2.5", 2248 | "extend-shallow": "^2.0.1", 2249 | "map-cache": "^0.2.2", 2250 | "source-map": "^0.5.6", 2251 | "source-map-resolve": "^0.5.0", 2252 | "use": "^3.1.0" 2253 | }, 2254 | "dependencies": { 2255 | "define-property": { 2256 | "version": "0.2.5", 2257 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 2258 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2259 | "requires": { 2260 | "is-descriptor": "^0.1.0" 2261 | } 2262 | }, 2263 | "extend-shallow": { 2264 | "version": "2.0.1", 2265 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 2266 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 2267 | "requires": { 2268 | "is-extendable": "^0.1.0" 2269 | } 2270 | } 2271 | } 2272 | }, 2273 | "snapdragon-node": { 2274 | "version": "2.1.1", 2275 | "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", 2276 | "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", 2277 | "requires": { 2278 | "define-property": "^1.0.0", 2279 | "isobject": "^3.0.0", 2280 | "snapdragon-util": "^3.0.1" 2281 | }, 2282 | "dependencies": { 2283 | "define-property": { 2284 | "version": "1.0.0", 2285 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 2286 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 2287 | "requires": { 2288 | "is-descriptor": "^1.0.0" 2289 | } 2290 | }, 2291 | "is-accessor-descriptor": { 2292 | "version": "1.0.0", 2293 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 2294 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 2295 | "requires": { 2296 | "kind-of": "^6.0.0" 2297 | } 2298 | }, 2299 | "is-data-descriptor": { 2300 | "version": "1.0.0", 2301 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 2302 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 2303 | "requires": { 2304 | "kind-of": "^6.0.0" 2305 | } 2306 | }, 2307 | "is-descriptor": { 2308 | "version": "1.0.2", 2309 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 2310 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 2311 | "requires": { 2312 | "is-accessor-descriptor": "^1.0.0", 2313 | "is-data-descriptor": "^1.0.0", 2314 | "kind-of": "^6.0.2" 2315 | } 2316 | }, 2317 | "isobject": { 2318 | "version": "3.0.1", 2319 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 2320 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 2321 | }, 2322 | "kind-of": { 2323 | "version": "6.0.2", 2324 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 2325 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" 2326 | } 2327 | } 2328 | }, 2329 | "snapdragon-util": { 2330 | "version": "3.0.1", 2331 | "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", 2332 | "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", 2333 | "requires": { 2334 | "kind-of": "^3.2.0" 2335 | } 2336 | }, 2337 | "source-map": { 2338 | "version": "0.5.7", 2339 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 2340 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" 2341 | }, 2342 | "source-map-resolve": { 2343 | "version": "0.5.2", 2344 | "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", 2345 | "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", 2346 | "requires": { 2347 | "atob": "^2.1.1", 2348 | "decode-uri-component": "^0.2.0", 2349 | "resolve-url": "^0.2.1", 2350 | "source-map-url": "^0.4.0", 2351 | "urix": "^0.1.0" 2352 | } 2353 | }, 2354 | "source-map-url": { 2355 | "version": "0.4.0", 2356 | "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", 2357 | "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" 2358 | }, 2359 | "spdx-correct": { 2360 | "version": "3.0.2", 2361 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", 2362 | "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", 2363 | "requires": { 2364 | "spdx-expression-parse": "^3.0.0", 2365 | "spdx-license-ids": "^3.0.0" 2366 | } 2367 | }, 2368 | "spdx-exceptions": { 2369 | "version": "2.2.0", 2370 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", 2371 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" 2372 | }, 2373 | "spdx-expression-parse": { 2374 | "version": "3.0.0", 2375 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 2376 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 2377 | "requires": { 2378 | "spdx-exceptions": "^2.1.0", 2379 | "spdx-license-ids": "^3.0.0" 2380 | } 2381 | }, 2382 | "spdx-license-ids": { 2383 | "version": "3.0.2", 2384 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", 2385 | "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==" 2386 | }, 2387 | "split": { 2388 | "version": "1.0.0", 2389 | "resolved": "http://registry.npmjs.org/split/-/split-1.0.0.tgz", 2390 | "integrity": "sha1-xDlc5oOrzSVLwo/h2rtuXCfc/64=", 2391 | "requires": { 2392 | "through": "2" 2393 | } 2394 | }, 2395 | "split-string": { 2396 | "version": "3.1.0", 2397 | "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", 2398 | "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", 2399 | "requires": { 2400 | "extend-shallow": "^3.0.0" 2401 | } 2402 | }, 2403 | "static-extend": { 2404 | "version": "0.1.2", 2405 | "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", 2406 | "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", 2407 | "requires": { 2408 | "define-property": "^0.2.5", 2409 | "object-copy": "^0.1.0" 2410 | }, 2411 | "dependencies": { 2412 | "define-property": { 2413 | "version": "0.2.5", 2414 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 2415 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2416 | "requires": { 2417 | "is-descriptor": "^0.1.0" 2418 | } 2419 | } 2420 | } 2421 | }, 2422 | "string.prototype.trim": { 2423 | "version": "1.1.2", 2424 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", 2425 | "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", 2426 | "dev": true, 2427 | "requires": { 2428 | "define-properties": "^1.1.2", 2429 | "es-abstract": "^1.5.0", 2430 | "function-bind": "^1.0.2" 2431 | } 2432 | }, 2433 | "string_decoder": { 2434 | "version": "1.1.1", 2435 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2436 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2437 | "requires": { 2438 | "safe-buffer": "~5.1.0" 2439 | } 2440 | }, 2441 | "strip-ansi": { 2442 | "version": "3.0.1", 2443 | "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2444 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2445 | "requires": { 2446 | "ansi-regex": "^2.0.0" 2447 | } 2448 | }, 2449 | "strip-bom": { 2450 | "version": "2.0.0", 2451 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 2452 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", 2453 | "requires": { 2454 | "is-utf8": "^0.2.0" 2455 | } 2456 | }, 2457 | "strip-indent": { 2458 | "version": "1.0.1", 2459 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", 2460 | "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", 2461 | "requires": { 2462 | "get-stdin": "^4.0.1" 2463 | } 2464 | }, 2465 | "supports-color": { 2466 | "version": "2.0.0", 2467 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 2468 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 2469 | }, 2470 | "tap-out": { 2471 | "version": "2.1.0", 2472 | "resolved": "https://registry.npmjs.org/tap-out/-/tap-out-2.1.0.tgz", 2473 | "integrity": "sha512-LJE+TBoVbOWhwdz4+FQk40nmbIuxJLqaGvj3WauQw3NYYU5TdjoV3C0x/yq37YAvVyi+oeBXmWnxWSjJ7IEyUw==", 2474 | "requires": { 2475 | "re-emitter": "1.1.3", 2476 | "readable-stream": "2.2.9", 2477 | "split": "1.0.0", 2478 | "trim": "0.0.1" 2479 | }, 2480 | "dependencies": { 2481 | "process-nextick-args": { 2482 | "version": "1.0.7", 2483 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 2484 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" 2485 | }, 2486 | "readable-stream": { 2487 | "version": "2.2.9", 2488 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", 2489 | "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", 2490 | "requires": { 2491 | "buffer-shims": "~1.0.0", 2492 | "core-util-is": "~1.0.0", 2493 | "inherits": "~2.0.1", 2494 | "isarray": "~1.0.0", 2495 | "process-nextick-args": "~1.0.6", 2496 | "string_decoder": "~1.0.0", 2497 | "util-deprecate": "~1.0.1" 2498 | } 2499 | }, 2500 | "string_decoder": { 2501 | "version": "1.0.3", 2502 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 2503 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 2504 | "requires": { 2505 | "safe-buffer": "~5.1.0" 2506 | } 2507 | } 2508 | } 2509 | }, 2510 | "tap-spec": { 2511 | "version": "5.0.0", 2512 | "resolved": "https://registry.npmjs.org/tap-spec/-/tap-spec-5.0.0.tgz", 2513 | "integrity": "sha512-zMDVJiE5I6Y4XGjlueGXJIX2YIkbDN44broZlnypT38Hj/czfOXrszHNNJBF/DXR8n+x6gbfSx68x04kIEHdrw==", 2514 | "requires": { 2515 | "chalk": "^1.0.0", 2516 | "duplexer": "^0.1.1", 2517 | "figures": "^1.4.0", 2518 | "lodash": "^4.17.10", 2519 | "pretty-ms": "^2.1.0", 2520 | "repeat-string": "^1.5.2", 2521 | "tap-out": "^2.1.0", 2522 | "through2": "^2.0.0" 2523 | } 2524 | }, 2525 | "tape": { 2526 | "version": "4.9.1", 2527 | "resolved": "https://registry.npmjs.org/tape/-/tape-4.9.1.tgz", 2528 | "integrity": "sha512-6fKIXknLpoe/Jp4rzHKFPpJUHDHDqn8jus99IfPnHIjyz78HYlefTGD3b5EkbQzuLfaEvmfPK3IolLgq2xT3kw==", 2529 | "dev": true, 2530 | "requires": { 2531 | "deep-equal": "~1.0.1", 2532 | "defined": "~1.0.0", 2533 | "for-each": "~0.3.3", 2534 | "function-bind": "~1.1.1", 2535 | "glob": "~7.1.2", 2536 | "has": "~1.0.3", 2537 | "inherits": "~2.0.3", 2538 | "minimist": "~1.2.0", 2539 | "object-inspect": "~1.6.0", 2540 | "resolve": "~1.7.1", 2541 | "resumer": "~0.0.0", 2542 | "string.prototype.trim": "~1.1.2", 2543 | "through": "~2.3.8" 2544 | } 2545 | }, 2546 | "tape-watch": { 2547 | "version": "2.3.0", 2548 | "resolved": "https://registry.npmjs.org/tape-watch/-/tape-watch-2.3.0.tgz", 2549 | "integrity": "sha1-fifLQYFln1F57CzMp/h4cs9DnY4=", 2550 | "requires": { 2551 | "chokidar": "1.6.0", 2552 | "debounce-collect": "1.0.2", 2553 | "debug": "2.6.0", 2554 | "glob": "7.0.4", 2555 | "meow": "3.7.0", 2556 | "once": "1.3.3", 2557 | "outpipe": "1.1.1", 2558 | "simpler-debounce": "1.0.0" 2559 | }, 2560 | "dependencies": { 2561 | "glob": { 2562 | "version": "7.0.4", 2563 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.4.tgz", 2564 | "integrity": "sha1-O0SvoJQ73DGyA3uTR5Hi4IS8t/Y=", 2565 | "requires": { 2566 | "fs.realpath": "^1.0.0", 2567 | "inflight": "^1.0.4", 2568 | "inherits": "2", 2569 | "minimatch": "2 || 3", 2570 | "once": "^1.3.0", 2571 | "path-is-absolute": "^1.0.0" 2572 | } 2573 | }, 2574 | "once": { 2575 | "version": "1.3.3", 2576 | "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", 2577 | "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", 2578 | "requires": { 2579 | "wrappy": "1" 2580 | } 2581 | } 2582 | } 2583 | }, 2584 | "through": { 2585 | "version": "2.3.8", 2586 | "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", 2587 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 2588 | }, 2589 | "through2": { 2590 | "version": "2.0.3", 2591 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", 2592 | "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", 2593 | "requires": { 2594 | "readable-stream": "^2.1.5", 2595 | "xtend": "~4.0.1" 2596 | } 2597 | }, 2598 | "to-object-path": { 2599 | "version": "0.3.0", 2600 | "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", 2601 | "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", 2602 | "requires": { 2603 | "kind-of": "^3.0.2" 2604 | } 2605 | }, 2606 | "to-regex": { 2607 | "version": "3.0.2", 2608 | "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", 2609 | "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", 2610 | "requires": { 2611 | "define-property": "^2.0.2", 2612 | "extend-shallow": "^3.0.2", 2613 | "regex-not": "^1.0.2", 2614 | "safe-regex": "^1.1.0" 2615 | } 2616 | }, 2617 | "to-regex-range": { 2618 | "version": "2.1.1", 2619 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", 2620 | "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", 2621 | "requires": { 2622 | "is-number": "^3.0.0", 2623 | "repeat-string": "^1.6.1" 2624 | }, 2625 | "dependencies": { 2626 | "is-number": { 2627 | "version": "3.0.0", 2628 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", 2629 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", 2630 | "requires": { 2631 | "kind-of": "^3.0.2" 2632 | } 2633 | } 2634 | } 2635 | }, 2636 | "trim": { 2637 | "version": "0.0.1", 2638 | "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", 2639 | "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" 2640 | }, 2641 | "trim-newlines": { 2642 | "version": "1.0.0", 2643 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", 2644 | "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" 2645 | }, 2646 | "union-value": { 2647 | "version": "1.0.0", 2648 | "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", 2649 | "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", 2650 | "requires": { 2651 | "arr-union": "^3.1.0", 2652 | "get-value": "^2.0.6", 2653 | "is-extendable": "^0.1.1", 2654 | "set-value": "^0.4.3" 2655 | }, 2656 | "dependencies": { 2657 | "extend-shallow": { 2658 | "version": "2.0.1", 2659 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 2660 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 2661 | "requires": { 2662 | "is-extendable": "^0.1.0" 2663 | } 2664 | }, 2665 | "set-value": { 2666 | "version": "0.4.3", 2667 | "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", 2668 | "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", 2669 | "requires": { 2670 | "extend-shallow": "^2.0.1", 2671 | "is-extendable": "^0.1.1", 2672 | "is-plain-object": "^2.0.1", 2673 | "to-object-path": "^0.3.0" 2674 | } 2675 | } 2676 | } 2677 | }, 2678 | "unset-value": { 2679 | "version": "1.0.0", 2680 | "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", 2681 | "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", 2682 | "requires": { 2683 | "has-value": "^0.3.1", 2684 | "isobject": "^3.0.0" 2685 | }, 2686 | "dependencies": { 2687 | "has-value": { 2688 | "version": "0.3.1", 2689 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", 2690 | "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", 2691 | "requires": { 2692 | "get-value": "^2.0.3", 2693 | "has-values": "^0.1.4", 2694 | "isobject": "^2.0.0" 2695 | }, 2696 | "dependencies": { 2697 | "isobject": { 2698 | "version": "2.1.0", 2699 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 2700 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 2701 | "requires": { 2702 | "isarray": "1.0.0" 2703 | } 2704 | } 2705 | } 2706 | }, 2707 | "has-values": { 2708 | "version": "0.1.4", 2709 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", 2710 | "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" 2711 | }, 2712 | "isobject": { 2713 | "version": "3.0.1", 2714 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 2715 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 2716 | } 2717 | } 2718 | }, 2719 | "urix": { 2720 | "version": "0.1.0", 2721 | "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", 2722 | "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" 2723 | }, 2724 | "use": { 2725 | "version": "3.1.1", 2726 | "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", 2727 | "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" 2728 | }, 2729 | "util-deprecate": { 2730 | "version": "1.0.2", 2731 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2732 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2733 | }, 2734 | "validate-npm-package-license": { 2735 | "version": "3.0.4", 2736 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 2737 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 2738 | "requires": { 2739 | "spdx-correct": "^3.0.0", 2740 | "spdx-expression-parse": "^3.0.0" 2741 | } 2742 | }, 2743 | "wrappy": { 2744 | "version": "1.0.2", 2745 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2746 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 2747 | }, 2748 | "xtend": { 2749 | "version": "4.0.1", 2750 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 2751 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 2752 | } 2753 | } 2754 | } 2755 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "js-to-py", 3 | "version": "1.0.2", 4 | "description": "Converts JavaScript to Python", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "tape test/*.spec.js | tap-spec", 8 | "watch": "tape-watch test/*.spec.js | tap-spec" 9 | }, 10 | "author": "Quadramadery ", 11 | "repository": { 12 | "type": "git", 13 | "url": "git@github.com:quadramadery/js2py.git" 14 | }, 15 | "license": "MIT", 16 | "dependencies": { 17 | "espree": "^4.1.0" 18 | }, 19 | "devDependencies": { 20 | "tape": "^4.9.1", 21 | "tap-spec": "^5.0.0", 22 | "tape-watch": "^2.3.0" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/ApplyPatternsVisitor.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const Pattern = require('./Pattern') 4 | 5 | class ApplyPatternsVisitor { 6 | 7 | constructor(patterns) { 8 | this.patterns = patterns.map(([from, to]) => [new Pattern(from), to]) 9 | } 10 | 11 | leave(ast) { 12 | const patterns = this.patterns.filter(([from]) => from.type === ast.type) 13 | for (const [from, to] of patterns) { 14 | const matches = from.match(ast) 15 | if (matches) { 16 | return (new Pattern(to)).apply(matches) 17 | } 18 | } 19 | } 20 | } 21 | 22 | module.exports = ApplyPatternsVisitor -------------------------------------------------------------------------------- /src/BigNumberVisitor.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | class BigNumberVisitor { 4 | 5 | leaveNewExpression (ast) { 6 | if (ast.callee.name !== 'BigN') return 7 | return ast.arguments[0] 8 | } 9 | } 10 | 11 | module.exports = BigNumberVisitor -------------------------------------------------------------------------------- /src/InlineStaticClassAttrs.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const Traverse = require('./Traverse') 4 | const Pattern = require('./Pattern') 5 | 6 | class SearchStaticClassAttrs { 7 | 8 | constructor () { 9 | this.classPatterns = [] 10 | this.staticAttrs = [] 11 | } 12 | 13 | leaveClassDeclaration(node) { 14 | this.classPatterns.push([node.id.name, new Pattern(`${node.id.name}._1 = _2`, {matchStatement: true})]) 15 | } 16 | 17 | leave(ast) { 18 | const patterns = this.classPatterns.filter(([_, pattern]) => pattern.type === ast.type) 19 | for (const [className, pattern] of patterns) { 20 | const matches = pattern.match(ast) 21 | if (matches) { 22 | const staticAttr = [`${className}.${matches._1.name}`, matches._2] 23 | this.staticAttrs.push(staticAttr) 24 | return { type: 'Noop' } 25 | } 26 | } 27 | } 28 | 29 | } 30 | 31 | class InlineStaticClassAttrs { 32 | constructor (staticAttrs) { 33 | this.patterns = staticAttrs.map(([attr, value]) => [new Pattern(attr), value]) 34 | } 35 | 36 | leave(ast) { 37 | const patterns = this.patterns.filter(([pattern]) => pattern.type === ast.type) 38 | for (const [pattern, value] of patterns) { 39 | const matches = pattern.match(ast) 40 | if (matches) { 41 | return value // TODO should return copy of value 42 | } 43 | } 44 | } 45 | } 46 | 47 | function inlineStaticClassAttrs(ast) { 48 | const search = new SearchStaticClassAttrs() 49 | Traverse.traverse(ast, search) 50 | if (search.staticAttrs.length > 0) { 51 | Traverse.traverse(ast, new InlineStaticClassAttrs(search.staticAttrs)) 52 | } 53 | } 54 | 55 | module.exports = inlineStaticClassAttrs -------------------------------------------------------------------------------- /src/JS2Py.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const espree = require('espree') 4 | const Traverse = require('./Traverse') 5 | const BigNumberVisitor = require('./BigNumberVisitor') 6 | const ApplyPatternsVisitor = require('./ApplyPatternsVisitor') 7 | const JSVisitor = require('./JSVisitor') 8 | const inlineStaticClassAttrs = require('./InlineStaticClassAttrs') 9 | const ObjectPatternDestructure = require('./ObjectPatternDestructure') 10 | const ToPyCodeVisitor = require('./ToPyCodeVisitor') 11 | 12 | class JS2Py { 13 | 14 | convert(code) { 15 | const ast = espree.parse(code, { 16 | ecmaVersion: 8, 17 | sourceType: 'module' 18 | }) 19 | Traverse.traverse(ast, new ObjectPatternDestructure()) 20 | Traverse.traverse(ast, new BigNumberVisitor()) 21 | 22 | const math = new ApplyPatternsVisitor([ 23 | ['Math.max(_1arguments)', 'max([_1elements])'], 24 | ['Math.min(_1arguments)', 'min([_1elements])'], 25 | ['Math.exp(_1)', 'exp(_1)'], 26 | ['Math.pow(_1)', 'pow(_1)'], 27 | ['Math.abs(_1)', 'abs(_1)'], 28 | ]) 29 | Traverse.traverse(ast, math) 30 | 31 | const bigNumber = new ApplyPatternsVisitor([ 32 | ['BigN._1(_2)', '_1(_2)'], 33 | ['_1.minus(_2)', '_1 - _2'], 34 | ['_1.plus(_2)', '_1 + _2'], 35 | ['_1.times(_2)', '_1 * _2'], 36 | ['_1.dividedBy(_2)', '_1 / _2'], 37 | ['_1.isEqualTo(_2)', '_1 == _2'], 38 | ['_1.toNumber()', '_1'], 39 | ["const _1 = require('bignumber.js')", {type: 'Noop'}], 40 | ]) 41 | Traverse.traverse(ast, bigNumber) 42 | 43 | const arrays = new ApplyPatternsVisitor([ 44 | ['(_1).length', 'len(_1)'], 45 | ['_1.push(_2)', '_1.append(_2)'], 46 | ['_1.splice(_2, 1)', 'delete _1[_2]'], 47 | ['_1[len(_2) - _3]', '_1[-_3]'], 48 | ['_1.map(_2)', 'map(_2, _1)'], 49 | ['_1.filter(_2)', 'filter(_2, _1)'], 50 | ]) 51 | Traverse.traverse(ast, arrays) 52 | 53 | const lodash = new ApplyPatternsVisitor([ 54 | ['_isEmpty(_1)', 'len(_1) === 0'], // TODO restrict to lodash.isEmpty 55 | ['_isFinite(_1)', 'isfinite(_1)'], // TODO restrict to lodash.isFinite 56 | ['_max(_1)', 'max(_1)'], // TODO restrict to lodash.max 57 | ['_min(_1)', 'min(_1)'], // TODO restrict to lodash.min 58 | ['_sum(_1)', 'sum(_1)'], // TODO restrict to lodash.sum 59 | ["const _1 = require('lodash/isFinite')", "const isfinite = require('math')"], 60 | ["const _1 = require('lodash/isEmpty')", {type: 'Noop'}], 61 | ["const _1 = require('lodash/min')", {type: 'Noop'}], 62 | ["const _1 = require('lodash/max')", {type: 'Noop'}], 63 | ["const _1 = require('lodash/sum')", {type: 'Noop'}], 64 | ]) 65 | Traverse.traverse(ast, lodash) 66 | Traverse.traverse(ast, new JSVisitor()) 67 | inlineStaticClassAttrs(ast) 68 | 69 | const toText = new ToPyCodeVisitor() 70 | Traverse.traverse(ast, toText) 71 | return ast.text 72 | } 73 | } 74 | 75 | module.exports = JS2Py 76 | -------------------------------------------------------------------------------- /src/JSVisitor.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const Pattern = require('./Pattern') 4 | 5 | class JSVisitor { 6 | 7 | constructor () { 8 | const importDeclFn = (matches) => ({ 9 | type: 'ImportDeclaration', 10 | specifiers: [{ 11 | type: 'ImportDefaultSpecifier', 12 | local: matches._1 13 | }], 14 | source: matches._2 15 | }) 16 | const removeFn = () => ({ type: 'Noop' }) 17 | 18 | this.patterns = [ 19 | [new Pattern('_1 = require(_2)'), importDeclFn], 20 | [new Pattern('const _1 = require(_2)'), importDeclFn], 21 | [new Pattern('module.exports = _1'), removeFn], 22 | ] 23 | } 24 | 25 | leaveExpressionStatement(ast) { 26 | if (ast.directive) { 27 | return { type: 'Noop' } 28 | } 29 | } 30 | 31 | leave(ast) { 32 | const patterns = this.patterns.filter(([from, toFn]) => from.type === ast.type) 33 | for (const [from, toFn] of patterns) { 34 | const matches = from.match(ast) 35 | if (matches) { 36 | return toFn(matches) 37 | } 38 | } 39 | } 40 | } 41 | 42 | module.exports = JSVisitor -------------------------------------------------------------------------------- /src/ObjectPatternDestructure.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const Traverse = require('./Traverse') 4 | const RenameVisitor = require('./RenameVisitor') 5 | 6 | class ObjectPatternDestructure { 7 | 8 | constructor() { 9 | this.scopes = [] 10 | this.scopeTypes = [ 11 | 'Program', 12 | 'FunctionDeclaration', 13 | 'ClassDeclaration', 14 | 'BlockStatement' 15 | ] 16 | } 17 | 18 | enter(ast) { 19 | if (this.scopeTypes.indexOf(ast.type) === -1) { 20 | return 21 | } 22 | this.scopes.push(ast) 23 | } 24 | 25 | leave(ast) { 26 | if (this.scopeTypes.indexOf(ast.type) === -1) { 27 | return 28 | } 29 | this.scopes.pop() 30 | } 31 | 32 | leaveVariableDeclarator(ast) { 33 | if (ast.id.type !== 'ObjectPattern') { 34 | return 35 | } 36 | 37 | if (ast.id.properties.length === 0) { 38 | return { type: 'Noop' } 39 | } 40 | if (ast.id.properties.length === 1) { 41 | return { 42 | type: 'VariableDeclarator', 43 | id: ast.id.properties[0].value, 44 | init: { 45 | type: 'MemberExpression', 46 | object: ast.init, 47 | property: { 48 | type: 'Identifier', 49 | name: ast.id.properties[0].value.name 50 | }, 51 | computed: false 52 | }, 53 | kind: ast.kind 54 | } 55 | } else { 56 | if (['Identifier', 'MemberExpression'].indexOf(ast.init.type) != -1) { 57 | ast.id.properties.forEach(property => { 58 | const oldIdentifier = property.value 59 | const newIdentifier = { 60 | type: 'MemberExpression', 61 | object: ast.init, 62 | property: { 63 | type: 'Identifier', 64 | name: property.value.name 65 | }, 66 | computed: false 67 | } 68 | Traverse.traverse(this.scopes[this.scopes.length - 1], new RenameVisitor(oldIdentifier, newIdentifier)) 69 | }) 70 | return { type: 'Noop' } 71 | } else if (ast.init.type === 'CallExpression') { 72 | const varName = ast.init.callee.type === 'Identifier' ? `${ast.init.callee.name}1` 73 | : ast.init.callee.type === 'MemberExpression' ? `${ast.init.callee.property.name}` 74 | : 'tmp' 75 | ast.id.properties.forEach(property => { 76 | const oldIdentifier = property.value 77 | const newIdentifier = { 78 | type: 'MemberExpression', 79 | object: { 80 | type: 'Identifier', 81 | name: varName 82 | }, 83 | property: { 84 | type: 'Identifier', 85 | name: property.value.name 86 | }, 87 | computed: false 88 | } 89 | Traverse.traverse(this.scopes[this.scopes.length - 1], new RenameVisitor(oldIdentifier, newIdentifier)) 90 | }) 91 | return { 92 | type: 'VariableDeclarator', 93 | id: { 94 | type: 'Identifier', 95 | name: varName 96 | }, 97 | init: ast.init, 98 | kind: ast.kind 99 | } 100 | } else { 101 | throw new Error(`ObjectPatternDestructure: Unsupported init type ${ast.init.type}`) 102 | } 103 | } 104 | } 105 | 106 | leaveVariableDeclaration(ast) { 107 | ast.declarations = ast.declarations.filter(decl => decl.type != 'Noop') 108 | if (ast.declarations.length === 0 ) { 109 | return { type: 'Noop' } 110 | } 111 | } 112 | } 113 | 114 | module.exports = ObjectPatternDestructure -------------------------------------------------------------------------------- /src/Pattern.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const espree = require('espree') 4 | const Traverse = require('./Traverse') 5 | 6 | class Pattern { 7 | constructor( 8 | patternOrString, 9 | {matchStatement} = {matchStatement: false} 10 | ) { 11 | if (typeof patternOrString === 'string') { 12 | const ast = espree.parse(patternOrString, { 13 | ecmaVersion: 8, 14 | sourceType: 'module' 15 | }) 16 | this.ast = !matchStatement && ast.body[0].expression || ast.body[0] 17 | } else { 18 | this.ast = patternOrString 19 | } 20 | 21 | this.type = this.ast.type 22 | } 23 | 24 | isVar(name) { 25 | return /^_[0-9]+/.test(name) 26 | } 27 | 28 | apply (matches) { 29 | const changesStack = [] 30 | this.ast = Traverse.traverse(this.ast, { 31 | leave: (ast, parent) => { 32 | changesStack.map(([obj, attr, newVal]) => { 33 | if (obj === ast) { 34 | ast[attr] = newVal 35 | } 36 | }) 37 | 38 | if (this.isVar(ast.name)) { 39 | return this.applyVar(ast.name, ast, parent, matches, changesStack) 40 | } 41 | } 42 | }) 43 | 44 | return this.ast 45 | } 46 | 47 | applyVar(varName, ast, parent, matches, changesStack) { 48 | const v = varName.replace(/^(_[0-9]+).*/, '$1') 49 | const path = v === varName ? [] : varName.replace(/^_[0-9]+/, '').split('_') 50 | if (path.length == 0) { 51 | return matches[v] 52 | } else { 53 | if (path.length === 1) { 54 | changesStack.push([parent, path[0], matches[v]]) 55 | } 56 | return ast 57 | } 58 | } 59 | 60 | match (ast) { 61 | const changesStack = [] 62 | this.ast = Traverse.traverse(this.ast, { 63 | leave: (ast, parent) => { 64 | delete ast.start 65 | delete ast.end 66 | if (this.isVar(ast.name)) { 67 | this.matchVar(ast.name, ast, parent, changesStack) 68 | } 69 | 70 | changesStack.map(([obj, attr, newVal]) => { 71 | if (obj === ast) { 72 | ast[attr] = newVal; 73 | } 74 | }) 75 | } 76 | }) 77 | 78 | const matches = {} 79 | const match = this._match(this.ast, ast, matches) 80 | return match ? matches : false 81 | } 82 | 83 | matchVar(varName, ast, parent, changesStack) { 84 | const v = varName.replace(/^(_[0-9]+).*/, '$1') 85 | const path = v === varName ? [] : varName.replace(/^_[0-9]+/, '').split('_') 86 | if (path.length == 0) { 87 | ast.wildcard = true 88 | } else if (path.length === 1) { 89 | changesStack.push([parent, path[0], { 90 | type: 'Identifier', 91 | name: v, 92 | wildcard: true 93 | }]) 94 | } 95 | } 96 | 97 | _match (a, b, matches) { 98 | if (a === null && b === null) { 99 | return true 100 | } else if (a.wildcard) { 101 | matches[a.name] = b 102 | return true 103 | } else if (a.type != undefined && b != undefined && a.type === b.type) { 104 | for (const k in a) { 105 | if (['type', 'start', 'end'].includes(k)) continue 106 | if (!this._match(a[k], b[k], matches)) { 107 | return false 108 | } 109 | } 110 | return true 111 | } else if (Array.isArray(a) && Array.isArray(b) && a.length === b.length) { 112 | for (let i = 0; i < a.length; i++) { 113 | if (!this._match(a[i], b[i], matches)) { 114 | return false 115 | } 116 | } 117 | return true 118 | } else { 119 | return a === b 120 | } 121 | } 122 | } 123 | 124 | module.exports = Pattern 125 | -------------------------------------------------------------------------------- /src/RenameVisitor.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | class RenameVisitor { 4 | 5 | constructor(oldIdentifier, newIdentifier) { 6 | this.oldIdentifier = oldIdentifier 7 | this.newIdentifier = newIdentifier 8 | } 9 | 10 | leaveIdentifier(ast, parent) { 11 | if ((parent != null) && (parent.type === 'MemberExpression') && !parent.computed) { 12 | return 13 | } 14 | if (ast.name === this.oldIdentifier.name) { 15 | return this.newIdentifier 16 | } 17 | } 18 | } 19 | 20 | module.exports = RenameVisitor -------------------------------------------------------------------------------- /src/ToPyCodeVisitor.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | class ToPyCodeVisitor { 4 | 5 | constructor() { 6 | this.DEFAULT_INDENT = ' ' 7 | this.indent = '' 8 | } 9 | 10 | indentBy(n) { 11 | return n > 0 ? this.indent + this.DEFAULT_INDENT 12 | : n < 0 ? this.indent.substring(0, this.indent.length - this.DEFAULT_INDENT.length) 13 | : this.indent 14 | } 15 | 16 | indentN(n) { 17 | let newIndent = '' 18 | for (let i = 0; i < n; i++) { 19 | newIndent += this.DEFAULT_INDENT 20 | } 21 | return newIndent 22 | } 23 | 24 | indentBlock(n, text) { 25 | const relIndent = this.indentN(Math.abs(n)) 26 | const absIndent = this.indentBy(Math.abs(n)) 27 | if (n >= 0) { 28 | return absIndent + text.split(`\n`).join(`\n${relIndent}`) 29 | } else { 30 | return text.replace(absIndent, '').split(`\n${relIndent}`).join(`\n`) 31 | } 32 | } 33 | 34 | setIndent(n) { 35 | this.indent = this.indentBy(n) 36 | } 37 | 38 | leaveSuper(node) { 39 | node.text = 'super()' 40 | } 41 | 42 | leaveIdentifier(node) { 43 | node.text = node.name 44 | } 45 | 46 | leaveLiteral(node) { 47 | node.text = node.value === null ? 'None' : node.raw 48 | } 49 | 50 | leaveThisExpression(node) { 51 | node.text = 'self' 52 | } 53 | 54 | leaveArrayPattern(node) { 55 | const elems = node.elements.map(e => e.text) 56 | node.text = `[ ${elems.join(', ')} ]` 57 | } 58 | 59 | leaveProperty(node) { 60 | node.text = `'${node.key.text}': ${node.value.text}` 61 | } 62 | 63 | enterObjectExpression(node) { 64 | this.setIndent(+1) 65 | } 66 | 67 | leaveObjectExpression(node) { 68 | if (node.properties.length === 0) { 69 | node.text = '{}' 70 | } else { 71 | const properties = node.properties.map(p => p.text).join(`,\n${this.indent}`) 72 | node.text = `{\n${this.indent}${properties}\n${this.indentBy(-1)}}` 73 | } 74 | this.setIndent(-1) 75 | } 76 | 77 | leaveArrayExpression(node) { 78 | const elems = node.elements.map(e => e.text) 79 | node.text = `[${elems.join(', ')}]` 80 | } 81 | 82 | leaveAssignmentPattern(node) { 83 | node.text = `${node.left.text} = ${node.right.text}` 84 | } 85 | 86 | enterClassBody(node) { 87 | this.setIndent(+1) 88 | } 89 | leaveClassBody(node) { 90 | const stmts = node.body.filter(({type}) => type !== 'Noop').map(e => e.text) 91 | if (stmts.length === 0) { 92 | node.text = `${this.indent}pass\n` 93 | } else { 94 | node.text = this.indent + stmts.join(`\n${this.indent}`) + '\n' 95 | } 96 | this.setIndent(-1) 97 | } 98 | 99 | enterBlockStatement(node) { 100 | this.setIndent(+1) 101 | } 102 | leaveBlockStatement(node) { 103 | const stmts = node.body.filter(({type}) => type !== 'Noop').map(e => e.text) 104 | if (stmts.length === 0) { 105 | node.text = `${this.indent}pass` 106 | } else { 107 | node.text = this.indent + stmts.join(`\n${this.indent}`) 108 | } 109 | this.setIndent(-1) 110 | } 111 | 112 | leaveMethodDefinition(node) { 113 | const NL_AFTER_METHOD = '\n' 114 | const isConstructor = node.kind === 'constructor' 115 | const methodName = isConstructor ? '__init__' : node.key.text 116 | const selfAndParams = (node.static ? [] : [{text: 'self'}]).concat(node.value.params) 117 | const params = selfAndParams.map(p => p.text).join(', ') 118 | node.text = `def ${methodName}(${params}):\n${node.value.body.text}${NL_AFTER_METHOD}` 119 | } 120 | 121 | leaveFunctionDeclaration(node) { 122 | const functionName = node.id ? node.id.text : '' 123 | const params = node.params.map(p => p.text).join(', ') 124 | node.text = `def ${functionName}(${params}):\n${node.body.text}\n` 125 | } 126 | 127 | leaveArrowFunctionExpression(node) { 128 | if ((node.expression === false) && (node.body.body.length > 1)) { 129 | throw new Error('Arrow function body has more than one statement') 130 | } 131 | const params = node.params.map(p => p.text).join(', ') 132 | node.text = `lambda ${params}: ${node.body.text}` 133 | } 134 | 135 | leaveClassDeclaration(n) { 136 | const superClass = n.superClass ? `(${n.superClass.text})` : '' 137 | n.text = `class ${n.id.text}${superClass}: 138 | ${n.body.text}` 139 | } 140 | 141 | leaveExpressionStatement(ast) { 142 | ast.text = ast.expression.text 143 | } 144 | 145 | leaveUnaryExpression(node) { 146 | const operators = { 147 | 'delete': 'del ', 148 | 'void': '??', 149 | 'typeof': '??', 150 | '+': '+', 151 | '-': '-', 152 | '~': '??', 153 | '!': 'not ' 154 | } 155 | node.text = `${operators[node.operator]}${node.argument.text}` 156 | } 157 | 158 | leaveBinaryExpression(node) { 159 | const left = node.left.type === 'BinaryExpression' ? `(${node.left.text})` : node.left.text 160 | const right = node.right.type === 'BinaryExpression' ? `(${node.right.text})` : node.right.text 161 | const operator = node.operator === '===' ? '==' : node.operator 162 | node.text = `${left} ${operator} ${right}` 163 | } 164 | 165 | leaveForStatement(node) { 166 | const asForInRange = false || 167 | (node.init.type === 'VariableDeclaration' && node.init.declarations.length === 1) && 168 | ((node.update.type === 'UpdateExpression' && node.update.operator === '++') || 169 | (node.update.type === 'AssignmentExpression' && node.update.operator === '+=')) && 170 | (node.test.type === 'BinaryExpression') 171 | 172 | if (asForInRange) { 173 | const id = node.init.declarations[0].id.name 174 | const low = node.init.declarations[0].init.text 175 | const high = node.test.right.text 176 | node.text = `for ${id} in range(${low}, ${high}):\n${node.body.text}` 177 | return 178 | } else { 179 | const init = node.init.text 180 | const test = node.test.text 181 | const update = node.update.text 182 | const body = node.body.text 183 | node.text = `${init} 184 | ${this.indent}while ${test}: 185 | ${this.indent}${body} 186 | ${this.indentBlock(+1, update)}` 187 | return 188 | } 189 | } 190 | 191 | leaveIfStatement(node) { 192 | const consequent = node.consequent.type === 'BlockStatement' ? node.consequent.text : this.indentBlock(+1, node.consequent.text) 193 | const alternate = node.alternate && (node.alternate.type === 'BlockStatement' ? node.alternate.text : this.indentBlock(+1, node.alternate.text)) 194 | const optionalAlternate = node.alternate ? `\n${this.indent}else:\n${alternate}` : '' 195 | const optionalElIf = node.alternate && ( 196 | (node.alternate.type === 'IfStatement') || 197 | (node.alternate.type === 'BlockStatement' && 198 | node.alternate.body.length === 1 && 199 | node.alternate.body[0].type === 'IfStatement')) ? `\n${this.indent}el${this.indentBlock(-1, alternate)}` : '' 200 | 201 | 202 | node.text = `if ${node.test.text}: 203 | ${consequent}${optionalElIf || optionalAlternate}` 204 | } 205 | 206 | leaveConditionalExpression(node) { 207 | node.text = `${node.consequent.text} if ${node.test.text} else ${node.alternate.text}` 208 | } 209 | 210 | leaveLogicalExpression(node) { 211 | const operator = { 212 | '||': 'or', 213 | '&&': 'and', 214 | }[node.operator] 215 | node.text = `${node.left.text} ${operator} ${node.right.text}` 216 | } 217 | 218 | leaveCallExpression(node) { 219 | const args = node.arguments.map(arg => arg.text) 220 | const callee = `${node.callee.text}${node.callee.type === 'Super' ? '.__init__' : ''}` 221 | node.text = `${callee}(${args.join(', ')})` 222 | } 223 | 224 | leaveMemberExpression(node) { 225 | if (node.computed) { 226 | node.text = `${node.object.text}[${node.property.text}]` 227 | } else { 228 | node.text = `${node.object.text}.${node.property.text}` 229 | } 230 | } 231 | 232 | leaveNewExpression(node) { 233 | const args = node.arguments.map(arg => arg.text) 234 | node.text = `${node.callee.text}(${args.join(', ')})` 235 | } 236 | 237 | leaveAssignmentExpression(node) { 238 | node.text = `${node.left.text} ${node.operator} ${node.right.text}` 239 | } 240 | 241 | leaveVariableDeclarator(node) { 242 | node.text = node.init ? `${node.id.text} = ${node.init.text}` : '' 243 | } 244 | 245 | leaveTemplateLiteral(node) { 246 | const fmtString = "'" + node.quasis.map(q => q.value.raw).join('%f') + "'" // TODO infer type 247 | const exprs = node.expressions.map(expr => expr.text).join(', ') 248 | node.text = exprs.length === 0 ? fmtString : `${fmtString} % (${exprs})` 249 | } 250 | 251 | leaveVariableDeclaration(node) { 252 | const decls = node.declarations.map(e => e.text) 253 | node.text = decls.join('\n') 254 | } 255 | 256 | leaveReturnStatement(node) { 257 | node.text = `return${node.argument ? ' '+node.argument.text:''}` 258 | } 259 | 260 | leaveImportDefaultSpecifier(node) { 261 | node.text = node.local.text 262 | } 263 | 264 | leaveImportDeclaration(node) { 265 | let packageName = node.source.text.substring(1, node.source.text.length - 1) 266 | if (/^\./.test(packageName)) packageName = packageName.replace('./', 'bfxhfindicators.') // TODO move out 267 | node.text = `from ${packageName} import ${node.specifiers[0].text}` 268 | } 269 | 270 | leaveProgram(node) { 271 | node.text = node.body.filter(({type}) => type !== 'Noop').map(e => e.text).join('\n') 272 | } 273 | } 274 | 275 | module.exports = ToPyCodeVisitor 276 | -------------------------------------------------------------------------------- /src/Traverse.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | class Traverse { 4 | 5 | static traverse (ast, visitor, parent) { 6 | if (ast == null) return ast 7 | 8 | if (Array.isArray(ast)) { 9 | return ast.map(elem => Traverse.traverse(elem, visitor, parent)) 10 | } 11 | 12 | if (ast.type === undefined) { 13 | return ast 14 | } 15 | 16 | const enter = `enter${ast.type}` 17 | const leave = `leave${ast.type}` 18 | visitor.enter && visitor.enter(ast, parent) 19 | visitor[enter] && visitor[enter](ast, parent) 20 | 21 | for (const k of Object.keys(ast)) { 22 | if (!['type', 'start', 'end'].includes(k)) { 23 | ast[k] = Traverse.traverse(ast[k], visitor, ast) 24 | } 25 | } 26 | 27 | const ret1 = visitor.leave && visitor.leave(ast, parent) 28 | const ret2 = visitor[leave] && visitor[leave](ast, parent) 29 | return ret1 || ret2 || ast 30 | } 31 | } 32 | 33 | module.exports = Traverse -------------------------------------------------------------------------------- /test/JS2Py.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const test = require('tape') 4 | const fs = require('fs') 5 | const JS2Py = require('../src/JS2Py') 6 | 7 | const f = new JS2Py() 8 | 9 | test('indenting', (t) => { 10 | const cases = [ 11 | [`for (let i = 0; i < 10; i++) { for (let j = 0; j < i; j++) { i+j }}`, 12 | `for i in range(0, 10): 13 | for j in range(0, i): 14 | i + j`], 15 | ['class A { b() { c(); d() } }', 'class A:\n def b(self):\n c()\n d()\n\n'], 16 | ] 17 | t.plan(cases.length) 18 | cases.map(([js, expected]) => t.equal(f.convert(js), expected, js)) 19 | }) 20 | 21 | test('if', (t) => { 22 | const cases = [ 23 | ['if (true) { a() } else { b() }', 'if true:\n a()\nelse:\n b()'], 24 | ['if (true) a(); else b()', 'if true:\n a()\nelse:\n b()'], 25 | ['if (a) b()', 'if a:\n b()'], 26 | ['if (a) if (b) if (c) { d() } else { e() }', 'if a:\n if b:\n if c:\n d()\n else:\n e()'], 27 | ['if (a) { b() } else for (let i = 0; i < 10; i++) { d(i) }', 'if a:\n b()\nelse:\n for i in range(0, 10):\n d(i)'], 28 | ['if (a) { b() } else if (c) d()', 'if a:\n b()\nelif c:\n d()'], 29 | ['if (a) { b() } else if (c) { d() }', 'if a:\n b()\nelif c:\n d()'], 30 | ['function z() { if (a) { b() } else if (c) { d() } else if (e) { f() } else { g() }}', 'def z():\n if a:\n b()\n elif c:\n d()\n elif e:\n f()\n else:\n g()\n'], 31 | ['if (a) if (b) c()', 'if a:\n if b:\n c()'], 32 | ['class A { b() { if (a) b() } }', 'class A:\n def b(self):\n if a:\n b()\n\n'], 33 | ['class A { b() { if (a) { b() } } }', 'class A:\n def b(self):\n if a:\n b()\n\n'], 34 | ['function b() { if (a) { b() } }', 'def b():\n if a:\n b()\n'], 35 | ] 36 | t.plan(cases.length) 37 | cases.map(([js, expected]) => t.equal(f.convert(js), expected, js)) 38 | }) 39 | 40 | test('js parts', (t) => { 41 | const cases = [ 42 | [`B = require('a')`, 'from a import B'], 43 | [`const B = require('a')`, 'from a import B'], 44 | [`"use static"`, ''], 45 | [`'use static'`, ''], 46 | [`"other directive"`, ''], 47 | [`a = "use static"`, 'a = "use static"'], 48 | [`module.exports = a`, ''], 49 | ] 50 | t.plan(cases.length) 51 | cases.map(([js, expected]) => t.equal(f.convert(js), expected, js)) 52 | }) 53 | 54 | test('for as while', (t) => { 55 | t.plan(1) 56 | t.equal(f.convert('for (let i = 0, j = 1; i < j; i += 1) {}'), `i = 0 57 | j = 1 58 | while i < j: 59 | pass 60 | i += 1`) 61 | }) 62 | 63 | test('for range', (t) => { 64 | t.plan(1) 65 | t.equal(f.convert('for (let i = 0; i < period; i++) {}'), 'for i in range(0, period):\n pass') 66 | }) 67 | 68 | 69 | test('language parts', (t) => { 70 | const cases = [ 71 | ['var a = 1', 'a = 1'], 72 | ['let a', ''], 73 | ['const a = 1', 'a = 1'], 74 | ['const [a] = 1', '[ a ] = 1'], 75 | ['const [a, b] = [1, 2]', '[ a, b ] = [1, 2]'], 76 | ['new Foo()', 'Foo()'], 77 | ['a.b()', 'a.b()'], 78 | ['a[b]', 'a[b]'], 79 | ['a.b', 'a.b'], 80 | ['a()', 'a()'], 81 | ['offset * (period - 1)', 'offset * (period - 1)'], 82 | ['function a(b, c) {}', 'def a(b, c):\n pass\n'], 83 | ['function a() {return}', 'def a():\n return\n'], 84 | ['function a() {return 1}', 'def a():\n return 1\n'], 85 | ['class A {}', 'class A:\n pass\n'], 86 | ['function a() { class A {} }', 'def a():\n class A:\n pass\n\n'], 87 | ['class A extends B {}', 'class A(B):\n pass\n'], 88 | ['class A { constructor (b, c) {} }', 'class A:\n def __init__(self, b, c):\n pass\n\n'], 89 | ['class A { b() { super.b() } }', 'class A:\n def b(self):\n super().b()\n\n'], 90 | ['class A { b() { super() } }', 'class A:\n def b(self):\n super().__init__()\n\n'], 91 | ['class A { b() { this.b() } }', 'class A:\n def b(self):\n self.b()\n\n'], 92 | ['class A { static b() { f() } }', 'class A:\n def b():\n f()\n\n'], 93 | ['a === b', 'a == b'], 94 | ['a = {}', 'a = {}'], 95 | ['function a() { b = {} }', 'def a():\n b = {}\n'], 96 | ['a = {b: 1}', `a = {\n 'b': 1\n}`], 97 | ['function f() { a = {b: 1}}', `def f():\n a = {\n 'b': 1\n }\n`], 98 | ['a = {b: 1, c:d}', `a = {\n 'b': 1,\n 'c': d\n}`], 99 | ['`text`', `'text'`], 100 | ['`hi ${a}/${b} in ${c}`', `'hi %f/%f in %f' % (a, b, c)`], 101 | ['delete a[0]', 'del a[0]'], 102 | ['-a', '-a'], 103 | ['+a', '+a'], 104 | ['!a', 'not a'], 105 | ['a || b', 'a or b'], 106 | ['a && b', 'a and b'], 107 | ['a ? b : c', 'b if a else c'], 108 | ] 109 | t.plan(cases.length) 110 | cases.map(([js, expected]) => t.equal(f.convert(js), expected, js)) 111 | }) 112 | 113 | test('BigNumber', (t) => { 114 | const cases = [ 115 | ['new BigN(a)', 'a'], 116 | ['BigN.max(list)', 'max(list)'], 117 | ['a.minus(b)', 'a - b'], 118 | ['a.plus(b)', 'a + b'], 119 | ['a.times(b)', 'a * b'], 120 | ['a.dividedBy(b)', 'a / b'], 121 | ['a.minus(b).times(0.5).plus(c.times(0.25))', '((a - b) * 0.5) + (c * 0.25)'], 122 | ['a.toNumber()', 'a'], 123 | ['a.isEqualTo(b)', 'a == b'], 124 | ] 125 | t.plan(cases.length) 126 | cases.map(([js, expected]) => t.equal(f.convert(js), expected, js)) 127 | }) 128 | 129 | test('Array', (t) => { 130 | const cases = [ 131 | ['z.push(a)', 'z.append(a)'], 132 | ['z.length', 'len(z)'], 133 | ['z.splice(0, 1)', 'del z[0]'], 134 | ['a[a.length - 1]', 'a[-1]'], 135 | ['a.map(f)', 'map(f, a)'], 136 | ['a.filter(f)', 'filter(f, a)'], 137 | ] 138 | t.plan(cases.length) 139 | cases.map(([js, expected]) => t.equal(f.convert(js), expected, js)) 140 | }) 141 | 142 | test('math', (t) => { 143 | const cases = [ 144 | ['Math.max(1)', 'max([1])'], 145 | ['Math.max(1, 2, 3)', 'max([1, 2, 3])'], 146 | ['Math.min(1, 2, 3)', 'min([1, 2, 3])'], 147 | ['Math.exp(1)', 'exp(1)'], 148 | ['Math.pow(1)', 'pow(1)'], 149 | ['Math.abs(1)', 'abs(1)'], 150 | ] 151 | t.plan(cases.length) 152 | cases.map(([js, expected]) => t.equal(f.convert(js), expected, js)) 153 | }) 154 | 155 | test('lodash', (t) => { 156 | const cases = [ 157 | ['_isEmpty(a)', 'len(a) == 0'], 158 | ['_isFinite(a)', 'isfinite(a)'], 159 | ['_max(a)', 'max(a)'], 160 | ['_min(a)', 'min(a)'], 161 | ['_sum(a)', 'sum(a)'], 162 | ["const a = require('lodash/isFinite')", 'from math import isfinite'], 163 | ] 164 | t.plan(cases.length) 165 | cases.map(([js, expected]) => t.equal(f.convert(js), expected, js)) 166 | }) 167 | 168 | test('Inline static class attrs', (t) => { 169 | const cases = [ 170 | ['class A { fun() {return A.id}} A.id = "MyId"', 'class A:\n def fun(self):\n return "MyId"\n\n'] 171 | ] 172 | t.plan(cases.length) 173 | cases.map(([js, expected]) => t.equal(f.convert(js), expected, js)) 174 | }) 175 | 176 | test('ObjectPattern', (t) => { 177 | const cases = [ 178 | ['let { a } = b', 'a = b.a'], 179 | ['let { } = b', ''], 180 | ['let { a, b } = c; d = a + b', 'd = c.a + c.b'], 181 | ['let { a, b } = c; d = j.a + j[a]', 'd = j.a + j[c.a]'], 182 | ['f(a); function b() { let { a, b } = g }', 'f(a)\ndef b():\n pass\n'], 183 | ['let { a, b } = c(); d = a + b', 'c1 = c()\nd = c1.a + c1.b'], 184 | ['let { a, b } = x.y.c(); d = a + b', 'c = x.y.c()\nd = c.a + c.b'], 185 | ['let { a, b } = f()(); d = a + b', 'tmp = f()()\nd = tmp.a + tmp.b'] 186 | ] 187 | t.plan(cases.length) 188 | cases.map(([js, expected]) => t.equal(f.convert(js), expected, js)) 189 | }) 190 | 191 | test('Arrow functions', (t) => { 192 | const cases = [ 193 | ['(a) => a', 'lambda a: a'] 194 | ] 195 | t.plan(cases.length) 196 | cases.map(([js, expected]) => t.equal(f.convert(js), expected, js)) 197 | }) 198 | 199 | test.skip('Manage/Insert imports', (t) => { 200 | t.plan(1) 201 | }) 202 | 203 | -------------------------------------------------------------------------------- /test/Pattern.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const test = require('tape') 4 | const Pattern = require('../src/Pattern') 5 | 6 | test('Pattern match', (t) => { 7 | const p1 = new Pattern('_1.minus(_2)') 8 | const p2 = new Pattern('BigN.minus(z)') 9 | 10 | t.plan(1) 11 | t.deepEqual(p1.match(p2.ast), { 12 | '_1': { type: 'Identifier', name: 'BigN', start: 0, end: 4}, 13 | '_2': { type: 'Identifier', name: 'z', start: 11, end: 12} 14 | }) 15 | }) 16 | 17 | test('Pattern is single wildcard identifier', (t) => { 18 | const p1 = new Pattern('_1') 19 | 20 | const ast = p1.apply({ 21 | '_1': { type: 'Identifier', name: 'a'} 22 | }) 23 | 24 | t.plan(1) 25 | t.deepEqual(ast, { 26 | type: 'Identifier', 27 | name: 'a' 28 | }) 29 | }) 30 | 31 | test('Apply replaces wildcards in pattern expression', (t) => { 32 | const p1 = new Pattern('_1 - _2') 33 | 34 | const ast = p1.apply({ 35 | '_1': { type: 'Identifier', name: 'BigN'}, 36 | '_2': { type: 'Identifier', name: 'z'} 37 | }) 38 | 39 | t.plan(1) 40 | t.deepEqual(ast, { 41 | type: 'BinaryExpression', 42 | start: 0, end: 8, 43 | left: { 44 | type: 'Identifier', 45 | name: 'BigN' 46 | }, 47 | operator: '-', 48 | right: { 49 | type: 'Identifier', 50 | name: 'z' 51 | } 52 | }) 53 | }) 54 | 55 | test('Apply pattern to statement', (t) => { 56 | const p1 = new Pattern('if (_1) {_2}') 57 | 58 | const ast = p1.apply({ 59 | '_1': { type: 'Literal', value: 'true'}, 60 | '_2': { type: 'ExpressionStatement', expression: { type: 'Identifier', name: 'z'}} 61 | }) 62 | 63 | t.plan(1) 64 | t.deepEqual(ast, { 65 | type: 'IfStatement', 66 | start: 0, end: 12, 67 | test: { type: 'Literal', value: 'true' }, 68 | consequent: { 69 | type: 'BlockStatement', 70 | start: 8, end: 12, 71 | body: [ 72 | { 73 | type: 'ExpressionStatement', 74 | start: 9, end: 11, 75 | expression: { 76 | type: 'ExpressionStatement', 77 | expression: { 78 | type: 'Identifier', 79 | name: 'z' 80 | } 81 | } 82 | } 83 | ] 84 | }, 85 | alternate: null 86 | }) 87 | }) 88 | 89 | test('Pattern wildcard match bubbles up the ast tree to named parent argument', (t) => { 90 | const p1 = new Pattern('f(_1arguments)') 91 | const p2 = new Pattern('f(a, b)') 92 | 93 | t.plan(1) 94 | t.deepEqual(p1.match(p2.ast), { 95 | '_1': [ 96 | {type: 'Identifier', name: 'a', start: 2, end: 3}, 97 | {type: 'Identifier', name: 'b', start: 5, end: 6} 98 | ] 99 | }) 100 | }) 101 | 102 | test('Pattern wildcard apply bubbles up the ast tree to named parent argument', (t) => { 103 | const p1 = new Pattern('f(_1arguments)') 104 | const matches = { 105 | '_1': [ 106 | {type: 'Identifier', name: 'a', start: 2, end: 3}, 107 | {type: 'Identifier', name: 'b', start: 5, end: 6} 108 | ] 109 | } 110 | 111 | t.plan(1) 112 | t.deepEqual(p1.apply(matches), { 113 | type: 'CallExpression', 114 | start: 0, 115 | end: 14, 116 | callee: { type: 'Identifier', name: 'f', start: 0, end: 1 }, 117 | arguments: matches._1 118 | }) 119 | }) 120 | -------------------------------------------------------------------------------- /test/Traverse.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const espree = require('espree') 4 | const test = require('tape') 5 | const Traverse = require('../src/Traverse') 6 | 7 | test('Traverse visits every node', (t) => { 8 | const ast = espree.parse(` 9 | function sum (a, b) { 10 | return a + b 11 | } 12 | `) 13 | 14 | const visited = [] 15 | Traverse.traverse(ast, { 16 | enter: (ast) => visited.push(ast.type) 17 | }) 18 | 19 | t.plan(1) 20 | t.deepEqual(visited, [ 21 | 'Program', 22 | 'FunctionDeclaration', // function... 23 | 'Identifier', // sum 24 | 'Identifier', // (a, 25 | 'Identifier', // b) 26 | 'BlockStatement', // { 27 | 'ReturnStatement', // return 28 | 'BinaryExpression', // a + b 29 | 'Identifier', // a 30 | 'Identifier' // b 31 | ]) 32 | }) 33 | 34 | test('Traverse modifies ast', (t) => { 35 | const ast = espree.parse(` 36 | a = b 37 | `) 38 | 39 | const ast2 = Traverse.traverse(ast, { 40 | leaveAssignmentExpression: (ast) => ast.right 41 | }) 42 | 43 | t.plan(1) 44 | t.deepEqual(ast2, { 45 | type: 'Program', 46 | start: 0, end: 13, 47 | body: [ 48 | { 49 | type: 'ExpressionStatement', 50 | start: 5, end: 10, 51 | expression: { 52 | type: 'Identifier', 53 | start: 9, end: 10, 54 | name: 'b' 55 | } 56 | } 57 | ], 58 | sourceType: 'script' 59 | }) 60 | }) 61 | --------------------------------------------------------------------------------