From a25e736ee1db3ef1c507c455f08c400078990f90 Mon Sep 17 00:00:00 2001 From: Shawn Date: Tue, 4 Sep 2018 17:40:14 -0500 Subject: [PATCH 01/13] Add chainquery dependencies for Spee.ch, does not include migrations --- cli/defaults/chainqueryConfig.json | 8 + package-lock.json | 532 +++++++++++++++++- package.json | 3 + server/chainquery/index.debug.js | 10 + server/chainquery/index.js | 80 +++ .../chainquery/models/AbnormalClaimModel.js | 65 +++ server/chainquery/models/AddressModel.js | 37 ++ .../models/ApplicationStatusModel.js | 33 ++ server/chainquery/models/BlockModel.js | 97 ++++ server/chainquery/models/ClaimModel.js | 177 ++++++ .../chainquery/models/GorpMigrationsModel.js | 25 + server/chainquery/models/InputModel.js | 77 +++ server/chainquery/models/JobStatusModel.js | 33 ++ server/chainquery/models/OutputModel.js | 77 +++ server/chainquery/models/SupportModel.js | 49 ++ .../models/TransactionAddressModel.js | 34 ++ server/chainquery/models/TransactionModel.js | 73 +++ .../chainquery/tables/abnormalClaimTable.js | 11 + server/chainquery/tables/addressTable.js | 11 + .../tables/applicationStatusTable.js | 11 + server/chainquery/tables/blockTable.js | 11 + server/chainquery/tables/claimTable.js | 11 + .../chainquery/tables/gorpMigrationsTable.js | 11 + server/chainquery/tables/inputTable.js | 11 + server/chainquery/tables/jobStatusTable.js | 11 + server/chainquery/tables/outputTable.js | 11 + server/chainquery/tables/supportTable.js | 11 + .../tables/transactionAddressTable.js | 11 + server/chainquery/tables/transactionTable.js | 11 + 29 files changed, 1539 insertions(+), 3 deletions(-) create mode 100644 cli/defaults/chainqueryConfig.json create mode 100644 server/chainquery/index.debug.js create mode 100644 server/chainquery/index.js create mode 100644 server/chainquery/models/AbnormalClaimModel.js create mode 100644 server/chainquery/models/AddressModel.js create mode 100644 server/chainquery/models/ApplicationStatusModel.js create mode 100644 server/chainquery/models/BlockModel.js create mode 100644 server/chainquery/models/ClaimModel.js create mode 100644 server/chainquery/models/GorpMigrationsModel.js create mode 100644 server/chainquery/models/InputModel.js create mode 100644 server/chainquery/models/JobStatusModel.js create mode 100644 server/chainquery/models/OutputModel.js create mode 100644 server/chainquery/models/SupportModel.js create mode 100644 server/chainquery/models/TransactionAddressModel.js create mode 100644 server/chainquery/models/TransactionModel.js create mode 100644 server/chainquery/tables/abnormalClaimTable.js create mode 100644 server/chainquery/tables/addressTable.js create mode 100644 server/chainquery/tables/applicationStatusTable.js create mode 100644 server/chainquery/tables/blockTable.js create mode 100644 server/chainquery/tables/claimTable.js create mode 100644 server/chainquery/tables/gorpMigrationsTable.js create mode 100644 server/chainquery/tables/inputTable.js create mode 100644 server/chainquery/tables/jobStatusTable.js create mode 100644 server/chainquery/tables/outputTable.js create mode 100644 server/chainquery/tables/supportTable.js create mode 100644 server/chainquery/tables/transactionAddressTable.js create mode 100644 server/chainquery/tables/transactionTable.js diff --git a/cli/defaults/chainqueryConfig.json b/cli/defaults/chainqueryConfig.json new file mode 100644 index 00000000..94c1898a --- /dev/null +++ b/cli/defaults/chainqueryConfig.json @@ -0,0 +1,8 @@ +{ + "host": "localhost", + "port": "3306", + "timeout": 30, + "database": "chainquery", + "username": "lbry", + "password": "root" +} diff --git a/package-lock.json b/package-lock.json index f45c2e93..794cfec8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -984,6 +984,15 @@ } } }, + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "5.0.0" + } + }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", @@ -1079,6 +1088,12 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, + "arch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", + "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==", + "dev": true + }, "are-we-there-yet": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", @@ -1238,6 +1253,12 @@ "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", "dev": true }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1914,6 +1935,16 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "dev": true, + "requires": { + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2" + } + }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -2131,6 +2162,35 @@ } } }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "1.1.0", + "buffer-fill": "1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true, + "optional": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -2545,6 +2605,33 @@ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" }, + "clipboardy": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.3.tgz", + "integrity": "sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA==", + "dev": true, + "requires": { + "arch": "2.1.1", + "execa": "0.8.0" + }, + "dependencies": { + "execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + } + } + }, "cliui": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", @@ -3161,6 +3248,138 @@ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, + "decompress": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", + "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", + "dev": true, + "optional": true, + "requires": { + "decompress-tar": "4.1.1", + "decompress-tarbz2": "4.1.1", + "decompress-targz": "4.1.1", + "decompress-unzip": "4.0.1", + "graceful-fs": "4.1.11", + "make-dir": "1.3.0", + "pify": "2.3.0", + "strip-dirs": "2.1.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "optional": true + } + } + }, + "decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dev": true, + "requires": { + "file-type": "5.2.0", + "is-stream": "1.1.0", + "tar-stream": "1.6.1" + } + }, + "decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dev": true, + "optional": true, + "requires": { + "decompress-tar": "4.1.1", + "file-type": "6.2.0", + "is-stream": "1.1.0", + "seek-bzip": "1.0.5", + "unbzip2-stream": "1.2.5" + }, + "dependencies": { + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "dev": true, + "optional": true + } + } + }, + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dev": true, + "requires": { + "decompress-tar": "4.1.1", + "file-type": "5.2.0", + "is-stream": "1.1.0" + } + }, + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "dev": true, + "optional": true, + "requires": { + "file-type": "3.9.0", + "get-stream": "2.3.1", + "pify": "2.3.0", + "yauzl": "2.10.0" + }, + "dependencies": { + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "optional": true, + "requires": { + "pend": "1.2.0" + } + }, + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "dev": true, + "optional": true + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "dev": true, + "optional": true, + "requires": { + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "optional": true + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "optional": true, + "requires": { + "buffer-crc32": "0.2.13", + "fd-slicer": "1.1.0" + } + } + } + }, "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", @@ -3433,6 +3652,15 @@ "iconv-lite": "0.4.23" } }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, "enhanced-resolve": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", @@ -3517,6 +3745,23 @@ "event-emitter": "0.3.5" } }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "4.2.4" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", + "dev": true + } + } + }, "es6-set": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", @@ -4235,6 +4480,29 @@ } } }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -4353,6 +4621,12 @@ } } }, + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -4522,6 +4796,18 @@ "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", "dev": true }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-copy-file-sync": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz", + "integrity": "sha512-2QY5eeqVv4m2PfyMiEuy9adxNP+ajf+8AR05cEi+OAzPcOj90hvFImeZhTmKLBgSd9EvG33jsD7ZRxsx9dThkQ==", + "dev": true + }, "fs-extra": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", @@ -5280,6 +5566,13 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true, + "optional": true + }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -5553,6 +5846,16 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, + "https-proxy-agent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "dev": true, + "requires": { + "agent-base": "4.2.1", + "debug": "3.1.0" + } + }, "husky": { "version": "0.14.3", "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz", @@ -5899,6 +6202,13 @@ "ip-regex": "2.1.0" } }, + "is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", + "dev": true, + "optional": true + }, "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", @@ -6030,11 +6340,26 @@ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "1.2.0" + } + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -6867,6 +7192,46 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "ndb": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/ndb/-/ndb-1.0.24.tgz", + "integrity": "sha512-GS72oSI/jrI+A/hh+qmGPPav/2+qLeup0txS3SbnFBKkH0KD/WXZhvmTO4LlEXOSV23v7x62EnqcQkrnCk2ZTA==", + "dev": true, + "requires": { + "chokidar": "2.0.4", + "clipboardy": "1.2.3", + "fs-copy-file-sync": "1.1.1", + "isbinaryfile": "3.0.3", + "mime": "2.3.1", + "ndb-node-pty-prebuilt": "0.8.0", + "opn": "5.3.0", + "puppeteer": "1.6.1", + "rimraf": "2.6.2", + "update-notifier": "2.5.0", + "ws": "6.0.0", + "xterm": "3.6.0" + }, + "dependencies": { + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true + } + } + }, + "ndb-node-pty-prebuilt": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/ndb-node-pty-prebuilt/-/ndb-node-pty-prebuilt-0.8.0.tgz", + "integrity": "sha512-j3XcGQgISib600/12hz56jaFsmpmDdFOKMHRq94+aWkxk0LqoPM5yAeJwacaPLnGm2NRFC3gTUocTIS+GSmQDQ==", + "dev": true, + "optional": true, + "requires": { + "decompress": "4.2.0", + "decompress-targz": "4.1.1", + "nan": "2.10.0" + } + }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", @@ -10049,6 +10414,15 @@ "mimic-fn": "1.2.0" } }, + "opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "requires": { + "is-wsl": "1.1.0" + } + }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -10933,6 +11307,12 @@ "ipaddr.js": "1.8.0" } }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "dev": true + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -10984,6 +11364,39 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, + "puppeteer": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.6.1.tgz", + "integrity": "sha512-qz6DLwK+PhlBMjJZOMOsgVCnweYLtmiqnmJYUDPT++ElMz+cQgbsCNKPw4YDVpg3RTbsRX/pqQqr20zrp0cuKw==", + "dev": true, + "requires": { + "debug": "3.1.0", + "extract-zip": "1.6.7", + "https-proxy-agent": "2.2.1", + "mime": "2.3.1", + "progress": "2.0.0", + "proxy-from-env": "1.0.0", + "rimraf": "2.6.2", + "ws": "5.2.2" + }, + "dependencies": { + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "1.0.0" + } + } + } + }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -11909,6 +12322,28 @@ "source-map": "0.4.4" } }, + "seek-bzip": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", + "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", + "dev": true, + "optional": true, + "requires": { + "commander": "2.8.1" + }, + "dependencies": { + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "dev": true, + "optional": true, + "requires": { + "graceful-readlink": "1.0.1" + } + } + } + }, "semver": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", @@ -12546,6 +12981,16 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" }, + "strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "dev": true, + "optional": true, + "requires": { + "is-natural-number": "4.0.1" + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -12717,6 +13162,21 @@ "inherits": "2.0.3" } }, + "tar-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", + "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==", + "dev": true, + "requires": { + "bl": "1.2.2", + "buffer-alloc": "1.2.0", + "end-of-stream": "1.4.1", + "fs-constants": "1.0.0", + "readable-stream": "2.3.6", + "to-buffer": "1.1.1", + "xtend": "4.0.1" + } + }, "term-size": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", @@ -12806,6 +13266,12 @@ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -13021,6 +13487,45 @@ "resolve": "1.8.1" } }, + "unbzip2-stream": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz", + "integrity": "sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og==", + "dev": true, + "optional": true, + "requires": { + "buffer": "3.6.0", + "through": "2.3.8" + }, + "dependencies": { + "base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=", + "dev": true, + "optional": true + }, + "buffer": { + "version": "3.6.0", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", + "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", + "dev": true, + "optional": true, + "requires": { + "base64-js": "0.0.8", + "ieee754": "1.1.12", + "isarray": "1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true + } + } + }, "undefsafe": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz", @@ -13647,9 +14152,6 @@ } } }, - "winston-slack-webhook": { - "version": "github:billbitt/winston-slack-webhook#ce99792bdf6473a9da69c91772eb4ecec4979b6c" - }, "wkx": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.5.tgz", @@ -13730,6 +14232,15 @@ "signal-exit": "3.0.2" } }, + "ws": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.0.0.tgz", + "integrity": "sha512-c2UlYcAZp1VS8AORtpq6y4RJIkJ9dQz18W32SpR/qXGfLDZ2jU4y4wKvvZwqbi7U6gxFQTeE+urMbXU/tsDy4w==", + "dev": true, + "requires": { + "async-limiter": "1.0.0" + } + }, "x-xss-protection": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.1.0.tgz", @@ -13746,6 +14257,12 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, + "xterm": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/xterm/-/xterm-3.6.0.tgz", + "integrity": "sha512-D/7/fm7oGzZksLFQdpn1TD63V+T4Ad3LZR2JfZ1QrPZ1yDjKedIKWAZXgzeHQw8S/5HYD08GdkLnjeLm/e6Yog==", + "dev": true + }, "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", @@ -13781,6 +14298,15 @@ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" } } + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "1.0.1" + } } } } diff --git a/package.json b/package.json index 524db99f..0a671a5e 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,8 @@ "prestart": "builder run bundle", "start": "node server.js", "start:build": "builder run start", + "devtools:server": "ndb server.js", + "devtools:chainquery": "ndb ./server/chainquery/index.debug.js", "test": "mocha --recursive", "test:no-lbc": "npm test -- --grep @usesLbc --invert", "test:server": "mocha --recursive './server/**/*.test.js'", @@ -108,6 +110,7 @@ "file-loader": "^1.1.11", "husky": "^0.14.3", "mocha": "^5.2.0", + "ndb": "^1.0.24", "node-sass": "^4.9.3", "nodemon": "^1.17.5", "redux-devtools": "^3.4.1", diff --git a/server/chainquery/index.debug.js b/server/chainquery/index.debug.js new file mode 100644 index 00000000..0563fa8f --- /dev/null +++ b/server/chainquery/index.debug.js @@ -0,0 +1,10 @@ +console.log('Loading `chainquery`, please wait...') + +require('@babel/polyfill'); +require('@babel/register'); + +const chainquery = require('./'); + +global.chainquery = chainquery.default ? chainquery.default : chainquery; + +console.log('`chainquery` has been loaded into the global context.') diff --git a/server/chainquery/index.js b/server/chainquery/index.js new file mode 100644 index 00000000..92a451ab --- /dev/null +++ b/server/chainquery/index.js @@ -0,0 +1,80 @@ +const Sequelize = require('sequelize'); +const logger = require('winston'); + +import abnormalClaimTable from './tables/abnormalClaimTable'; +import addressTable from './tables/addressTable'; +import applicationStatusTable from './tables/applicationStatusTable'; +import blockTable from './tables/blockTable'; +import claimTable from './tables/claimTable'; +import gorpMigrationsTable from './tables/gorpMigrationsTable'; +import inputTable from './tables/inputTable'; +import jobStatusTable from './tables/jobStatusTable'; +import outputTable from './tables/outputTable'; +import supportTable from './tables/supportTable'; +import transactionAddressTable from './tables/transactionAddressTable'; +import transactionTable from './tables/transactionTable'; + +const { + host, + port, + database, + username, + password, +} = require('../../config/chainqueryConfig'); // TODO: Make '@config/siteConfig' work outside Webpack for testing/dev + +if (!database || !username || !password) { + logger.warn('missing database, user, or password from chainqueryConfig'); +} + +// set sequelize options +const sequelize = new Sequelize(database, username, password, { + host : host, + import : port, + dialect : 'mysql', + dialectOptions: { + decimalNumbers: true, + }, + logging: false, + pool : { + max : 5, + min : 0, + idle : 10000, + acquire: 10000, + }, + operatorsAliases: false, +}); + +const db = {}; +db.abnormal_claim = sequelize.import('abnormal_claim', abnormalClaimTable.createModel); +db.application_status = sequelize.import('application_status', applicationStatusTable.createModel); +db.address = sequelize.import('address', addressTable.createModel); +db.block = sequelize.import('block', blockTable.createModel); +db.claim = sequelize.import('claim', claimTable.createModel); +db.gorp_migrations = sequelize.import('gorp_migrations', gorpMigrationsTable.createModel); +db.input = sequelize.import('input', inputTable.createModel); +db.job_status = sequelize.import('job_status', jobStatusTable.createModel); +db.output = sequelize.import('output', outputTable.createModel); +db.support = sequelize.import('support', supportTable.createModel); +db.transaction_address = sequelize.import('transaction_address', transactionAddressTable.createModel); +db.transaction = sequelize.import('transaction', transactionTable.createModel); + +// run model.association for each model in the db object that has an association +logger.info('associating chainquery db models...'); +Object.keys(db).forEach(modelName => { + if (db[modelName].associate) { + logger.info('Associating chainquery model:', modelName); + db[modelName].associate(db); + } +}); + +// establish mysql connection +sequelize + .authenticate() + .then(() => { + logger.info('Sequelize has established mysql connection for chainquery successfully.'); + }) + .catch(err => { + logger.error('Sequelize was unable to connect to the chainquery database:', err); + }); + +export default db; diff --git a/server/chainquery/models/AbnormalClaimModel.js b/server/chainquery/models/AbnormalClaimModel.js new file mode 100644 index 00000000..665953ff --- /dev/null +++ b/server/chainquery/models/AbnormalClaimModel.js @@ -0,0 +1,65 @@ +const getterMethods = { + // Add as needed, prefix all methods with `generated` +} + +export default (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'abnormal_claim', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + name: { + type: STRING, + set() { }, + }, + claim_id: { + type: STRING, + set() { }, + }, + is_update: { + type: INTEGER, + set() { }, + }, + block_hash: { + type: STRING, + set() { }, + }, + transaction_hash: { + type: STRING, + set() { }, + }, + vout: { + type: INTEGER, + set() { }, + }, + output_id: { + type: INTEGER, + set() { }, + }, + value_as_hex: { + type: TEXT, + set() { }, + }, + value_as_json: { + type: TEXT, + set() { }, + }, + created_at: { + type: INTEGER, + set() { }, + }, + modified_at: { + type: INTEGER, + set() { }, + }, + }, + { + freezeTableName: true, + getterMethods, + timestamps: false, // don't use default timestamps columns + } +); diff --git a/server/chainquery/models/AddressModel.js b/server/chainquery/models/AddressModel.js new file mode 100644 index 00000000..1d0d6ad1 --- /dev/null +++ b/server/chainquery/models/AddressModel.js @@ -0,0 +1,37 @@ +const getterMethods = { + // Add as needed, prefix all methods with `generated` +} + +export default (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'address', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + address: { + type: STRING, + set() { }, + }, + first_seen: { + type: INTEGER, + set() { }, + }, + created_at: { + type: INTEGER, + set() { }, + }, + modified_at: { + type: INTEGER, + set() { }, + }, + }, + { + freezeTableName: true, + getterMethods, + timestamps: false, // don't use default timestamps columns + } +); diff --git a/server/chainquery/models/ApplicationStatusModel.js b/server/chainquery/models/ApplicationStatusModel.js new file mode 100644 index 00000000..643d075f --- /dev/null +++ b/server/chainquery/models/ApplicationStatusModel.js @@ -0,0 +1,33 @@ +const getterMethods = { + // Add as needed, prefix all methods with `generated` +} + +export default (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'application_status', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + app_version: { + type: INTEGER, + set() { }, + }, + data_version: { + type: INTEGER, + set() { }, + }, + api_version: { + type: INTEGER, + set() { }, + }, + }, + { + freezeTableName: true, + getterMethods, + timestamps: false, // don't use default timestamps columns + } +); diff --git a/server/chainquery/models/BlockModel.js b/server/chainquery/models/BlockModel.js new file mode 100644 index 00000000..522156a5 --- /dev/null +++ b/server/chainquery/models/BlockModel.js @@ -0,0 +1,97 @@ +const getterMethods = { + // Add as needed, prefix all methods with `generated` +} + +export default (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'block', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + bits: { + type: STRING, + set() { }, + }, + chainwork: { + type: STRING, + set() { }, + }, + confirmations: { + type: STRING, + set() { }, + }, + difficulty: { + type: STRING, + set() { }, + }, + hash: { + type: STRING, + set() { }, + }, + height: { + type: STRING, + set() { }, + }, + merkle_root: { + type: STRING, + set() { }, + }, + name_claim_root: { + type: STRING, + set() { }, + }, + nonce: { + type: STRING, + set() { }, + }, + previous_block_hash: { + type: STRING, + set() { }, + }, + next_block_hash: { + type: STRING, + set() { }, + }, + block_size: { + type: STRING, + set() { }, + }, + block_time: { + type: STRING, + set() { }, + }, + version: { + type: STRING, + set() { }, + }, + version_hex: { + type: STRING, + set() { }, + }, + transaction_hashes: { + type: STRING, + set() { }, + }, + transactions_processed: { + type: STRING, + set() { }, + }, + created_at: { + type: INTEGER, + set() { }, + }, + modified_at: { + type: INTEGER, + set() { }, + }, + }, + { + freezeTableName: true, + getterMethods, + timestamps: false, // don't use default timestamps columns + } +); diff --git a/server/chainquery/models/ClaimModel.js b/server/chainquery/models/ClaimModel.js new file mode 100644 index 00000000..260b96f4 --- /dev/null +++ b/server/chainquery/models/ClaimModel.js @@ -0,0 +1,177 @@ +const logger = require('winston'); + +const { + assetDefaults: { thumbnail: defaultThumbnail }, + details: { host } +} = require('../../../config/siteConfig'); // TODO: Change back to '@config/siteConfig' when done testing + +const getterMethods = { + generated_extension() { + switch (this.content_type) { + case 'image/jpeg': + case 'image/jpg': + return 'jpg'; + case 'image/png': + return 'png'; + case 'image/gif': + return 'gif'; + case 'video/mp4': + return 'mp4'; + default: + logger.debug('setting unknown file type as file extension jpg'); + return 'jpg'; + } + }, + + // TODO: Factor this out. + generated_thumbnail() { + return this.thumbnail_url || defaultThumbnail; + }, + + generated_channel() { + console.log(this); + // + } +} + +export default (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'claim', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + transaction_hash_id: { + type: STRING, + set() { }, + }, + vout: { + type: INTEGER, + set() { }, + }, + name: { + type: STRING, + set() { }, + }, + claim_id: { + type: STRING, + set() { }, + }, + claim_type: { + type: INTEGER, + set() { }, + }, + publisher_id: { + type: STRING, + set() { }, + }, + publisher_sig: { + type: STRING, + set() { }, + }, + certificate: { + type: STRING, + set() { }, + }, + sd_hash: { + type: STRING, + set() { }, + }, + transaction_time: { + type: INTEGER, + set() { }, + }, + version: { + type: STRING, + set() { }, + }, + value_as_hex: { + type: STRING, + set() { }, + }, + value_as_json: { + type: STRING, + set() { }, + }, + valid_at_height: { + type: INTEGER, + set() { }, + }, + height: { + type: INTEGER, + set() { }, + }, + effective_amount: { + type: INTEGER, + set() { }, + }, + author: { + type: STRING, + set() { }, + }, + description: { + type: STRING, + set() { }, + }, + content_type: { + type: STRING, + set() { }, + }, + is_nsfw: { + type: INTEGER, + set() { }, + }, + language: { + type: STRING, + set() { }, + }, + thumbnail_url: { + type: STRING, + set() { }, + }, + title: { + type: STRING, + set() { }, + }, + fee: { + type: DECIMAL(58, 8), + set() { }, + }, + fee_currency: { + type: STRING, + set() { }, + }, + is_filtered: { + type: INTEGER, + set() { }, + }, + bid_state: { + type: STRING, + set() { }, + }, + created_at: { + type: INTEGER, + set() { }, + }, + modified_at: { + type: INTEGER, + set() { }, + }, + fee_address: { + type: STRING, + set() { }, + }, + claim_address: { + type: STRING, + set() { }, + }, + }, + { + freezeTableName: true, + getterMethods, + timestamps: false, // don't use default timestamps columns + } +); diff --git a/server/chainquery/models/GorpMigrationsModel.js b/server/chainquery/models/GorpMigrationsModel.js new file mode 100644 index 00000000..cbbb9614 --- /dev/null +++ b/server/chainquery/models/GorpMigrationsModel.js @@ -0,0 +1,25 @@ +const getterMethods = { + // Add as needed, prefix all methods with `generated` +} + +export default (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'gorp_migrations', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + applied_at: { + type: INTEGER, + set() { }, + }, + }, + { + freezeTableName: true, + getterMethods, + timestamps: false, // don't use default timestamps columns + } +); diff --git a/server/chainquery/models/InputModel.js b/server/chainquery/models/InputModel.js new file mode 100644 index 00000000..e77ec76f --- /dev/null +++ b/server/chainquery/models/InputModel.js @@ -0,0 +1,77 @@ +const getterMethods = { + // Add as needed, prefix all methods with `generated` +} + +export default (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'input', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + transaction_id: { + type: INTEGER, + set() { }, + }, + transaction_hash: { + type: STRING, + set() { }, + }, + input_address_id: { + type: INTEGER, + set() { }, + }, + is_coinbase: { + type: INTEGER, + set() { }, + }, + coinbase: { + type: STRING, + set() { }, + }, + prevout_hash: { + type: STRING, + set() { }, + }, + prevout_n: { + type: INTEGER, + set() { }, + }, + prevout_spend_updated: { + type: INTEGER, + set() { }, + }, + sequence: { + type: INTEGER, + set() { }, + }, + value: { + type: DECIMAL(18, 8), + set() { }, + }, + script_sig_asm: { + type: TEXT, + set() { }, + }, + script_sig_hex: { + type: TEXT, + set() { }, + }, + created: { + type: INTEGER, + set() { }, + }, + modified: { + type: INTEGER, + set() { }, + }, + }, + { + freezeTableName: true, + getterMethods, + timestamps: false, // don't use default timestamps columns + } +); diff --git a/server/chainquery/models/JobStatusModel.js b/server/chainquery/models/JobStatusModel.js new file mode 100644 index 00000000..768c4247 --- /dev/null +++ b/server/chainquery/models/JobStatusModel.js @@ -0,0 +1,33 @@ +const getterMethods = { + // Add as needed, prefix all methods with `generated` +} + +export default (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'job_status', + { + job_name: { + primaryKey: true, + type: STRING, + set() { }, + }, + last_sync: { + type: INTEGER, + set() { }, + }, + is_success: { + type: INTEGER, + set() { }, + }, + error_message: { + type: TEXT, + set() { }, + } + }, + { + freezeTableName: true, + getterMethods, + timestamps: false, // don't use default timestamps columns + } +); diff --git a/server/chainquery/models/OutputModel.js b/server/chainquery/models/OutputModel.js new file mode 100644 index 00000000..e2007115 --- /dev/null +++ b/server/chainquery/models/OutputModel.js @@ -0,0 +1,77 @@ +const getterMethods = { + // Add as needed, prefix all methods with `generated` +} + +export default (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'output', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + transaction_id: { + type: INTEGER, + set() { }, + }, + transaction_hash: { + type: STRING, + set() { }, + }, + value: { + type: DECIMAL(18, 8), + set() { }, + }, + vout: { + type: INTEGER, + set() { }, + }, + type: { + type: STRING, + set() { }, + }, + script_pub_key_asm: { + type: TEXT, + set() { }, + }, + script_pub_key_hex: { + type: TEXT, + set() { }, + }, + required_signatures: { + type: INTEGER, + set() { }, + }, + address_list: { + type: TEXT, + set() { }, + }, + is_spent: { + type: INTEGER, + set() { }, + }, + spent_by_input_id: { + type: INTEGER, + set() { }, + }, + created_at: { + type: INTEGER, + set() { }, + }, + modified_at: { + type: INTEGER, + set() { }, + }, + claim_id: { + type: STRING, + set() { }, + } + }, + { + freezeTableName: true, + getterMethods, + timestamps: false, // don't use default timestamps columns + } +); diff --git a/server/chainquery/models/SupportModel.js b/server/chainquery/models/SupportModel.js new file mode 100644 index 00000000..ffe29972 --- /dev/null +++ b/server/chainquery/models/SupportModel.js @@ -0,0 +1,49 @@ +const getterMethods = { + // Add as needed, prefix all methods with `generated` +} + +export default (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'support', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + supported_claim_id: { + type: STRING, + set() { }, + }, + support_amount: { + type: DECIMAL(18, 8), + set() { }, + }, + bid_state: { + type: STRING, + set() { }, + }, + transaction_hash_id: { + type: STRING, + set() { }, + }, + vout: { + type: INTEGER, + set() { }, + }, + created_at: { + type: INTEGER, + set() { }, + }, + modified_at: { + type: INTEGER, + set() { }, + }, + }, + { + freezeTableName: true, + getterMethods, + timestamps: false, // don't use default timestamps columns + } +); diff --git a/server/chainquery/models/TransactionAddressModel.js b/server/chainquery/models/TransactionAddressModel.js new file mode 100644 index 00000000..8bea1fcf --- /dev/null +++ b/server/chainquery/models/TransactionAddressModel.js @@ -0,0 +1,34 @@ +const getterMethods = { + // Add as needed, prefix all methods with `generated` +} + +export default (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'transaction_address', + { + transaction_id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + addess_id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + debit_amount: { + type: DECIMAL(18, 8), + set() { }, + }, + credit_amount: { + type: DECIMAL(18, 8), + set() { }, + }, + }, + { + freezeTableName: true, + getterMethods, + timestamps: false, // don't use default timestamps columns + } +); diff --git a/server/chainquery/models/TransactionModel.js b/server/chainquery/models/TransactionModel.js new file mode 100644 index 00000000..57b8b74b --- /dev/null +++ b/server/chainquery/models/TransactionModel.js @@ -0,0 +1,73 @@ +const getterMethods = { + // Add as needed, prefix all methods with `generated` +} + +export default (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'transaction', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + block_hash_id: { + type: STRING, + set() { }, + }, + input_count: { + type: INTEGER, + set() { }, + }, + output_count: { + type: INTEGER, + set() { }, + }, + fee: { + type: DECIMAL(18, 8), + set() { }, + }, + transaction_time: { + type: INTEGER, + set() { }, + }, + transaction_size: { + type: INTEGER, + set() { }, + }, + hash: { + type: STRING, + set() { }, + }, + version: { + type: INTEGER, + set() { }, + }, + lock_time: { + type: INTEGER, + set() { }, + }, + raw: { + type: TEXT, + set() { }, + }, + created_at: { + type: INTEGER, + set() { }, + }, + modified_at: { + type: INTEGER, + set() { }, + }, + created_time: { + type: INTEGER, + set() {}, + }, + }, + { + freezeTableName: true, + getterMethods, + timestamps: false, // don't use default timestamps columns + } +); diff --git a/server/chainquery/tables/abnormalClaimTable.js b/server/chainquery/tables/abnormalClaimTable.js new file mode 100644 index 00000000..1d696ce6 --- /dev/null +++ b/server/chainquery/tables/abnormalClaimTable.js @@ -0,0 +1,11 @@ +import AbnormalClaimModel from '../models/AbnormalClaimModel'; + +export default { + createModel(...args) { + return AbnormalClaimModel(...args); + }, + + associate(db) { + // associate + } +} diff --git a/server/chainquery/tables/addressTable.js b/server/chainquery/tables/addressTable.js new file mode 100644 index 00000000..a1bf2061 --- /dev/null +++ b/server/chainquery/tables/addressTable.js @@ -0,0 +1,11 @@ +import AddressModel from '../models/AddressModel'; + +export default { + createModel(...args) { + return AddressModel(...args); + }, + + associate(db) { + // associate + } +} diff --git a/server/chainquery/tables/applicationStatusTable.js b/server/chainquery/tables/applicationStatusTable.js new file mode 100644 index 00000000..2b8b14e9 --- /dev/null +++ b/server/chainquery/tables/applicationStatusTable.js @@ -0,0 +1,11 @@ +import ApplicationStatusModel from '../models/ApplicationStatusModel'; + +export default { + createModel(...args) { + return ApplicationStatusModel(...args); + }, + + associate(db) { + // associate + } +} diff --git a/server/chainquery/tables/blockTable.js b/server/chainquery/tables/blockTable.js new file mode 100644 index 00000000..86bafdc4 --- /dev/null +++ b/server/chainquery/tables/blockTable.js @@ -0,0 +1,11 @@ +import BlockModel from '../models/BlockModel'; + +export default { + createModel(...args) { + return BlockModel(...args); + }, + + associate(db) { + // associate + } +} diff --git a/server/chainquery/tables/claimTable.js b/server/chainquery/tables/claimTable.js new file mode 100644 index 00000000..ee43638d --- /dev/null +++ b/server/chainquery/tables/claimTable.js @@ -0,0 +1,11 @@ +import ClaimModel from '../models/ClaimModel'; + +export default { + createModel(...args) { + return ClaimModel(...args); + }, + + associate(db) { + // associate + } +} diff --git a/server/chainquery/tables/gorpMigrationsTable.js b/server/chainquery/tables/gorpMigrationsTable.js new file mode 100644 index 00000000..173ef6a9 --- /dev/null +++ b/server/chainquery/tables/gorpMigrationsTable.js @@ -0,0 +1,11 @@ +import GorpMigrationsModel from '../models/GorpMigrationsModel'; + +export default { + createModel(...args) { + return GorpMigrationsModel(...args); + }, + + associate(db) { + // associate + } +} diff --git a/server/chainquery/tables/inputTable.js b/server/chainquery/tables/inputTable.js new file mode 100644 index 00000000..3add28f7 --- /dev/null +++ b/server/chainquery/tables/inputTable.js @@ -0,0 +1,11 @@ +import InputModel from '../models/InputModel'; + +export default { + createModel(...args) { + return InputModel(...args); + }, + + associate(db) { + // associate + } +} diff --git a/server/chainquery/tables/jobStatusTable.js b/server/chainquery/tables/jobStatusTable.js new file mode 100644 index 00000000..76042c1b --- /dev/null +++ b/server/chainquery/tables/jobStatusTable.js @@ -0,0 +1,11 @@ +import JobStatusModel from '../models/JobStatusModel'; + +export default { + createModel(...args) { + return JobStatusModel(...args); + }, + + associate(db) { + // associate + } +} diff --git a/server/chainquery/tables/outputTable.js b/server/chainquery/tables/outputTable.js new file mode 100644 index 00000000..d00d0bac --- /dev/null +++ b/server/chainquery/tables/outputTable.js @@ -0,0 +1,11 @@ +import OutputModel from '../models/OutputModel'; + +export default { + createModel(...args) { + return OutputModel(...args); + }, + + associate(db) { + // associate + } +} diff --git a/server/chainquery/tables/supportTable.js b/server/chainquery/tables/supportTable.js new file mode 100644 index 00000000..82a81dcd --- /dev/null +++ b/server/chainquery/tables/supportTable.js @@ -0,0 +1,11 @@ +import SupportModel from '../models/SupportModel'; + +export default { + createModel(...args) { + return SupportModel(...args); + }, + + associate(db) { + // associate + } +} diff --git a/server/chainquery/tables/transactionAddressTable.js b/server/chainquery/tables/transactionAddressTable.js new file mode 100644 index 00000000..4d19bb09 --- /dev/null +++ b/server/chainquery/tables/transactionAddressTable.js @@ -0,0 +1,11 @@ +import TransactionAddressModel from '../models/TransactionAddressModel'; + +export default { + createModel(...args) { + return TransactionAddressModel(...args); + }, + + associate(db) { + // associate + } +} diff --git a/server/chainquery/tables/transactionTable.js b/server/chainquery/tables/transactionTable.js new file mode 100644 index 00000000..771c8a76 --- /dev/null +++ b/server/chainquery/tables/transactionTable.js @@ -0,0 +1,11 @@ +import TransactionModel from '../models/TransactionModel'; + +export default { + createModel(...args) { + return TransactionModel(...args); + }, + + associate(db) { + // associate + } +} From c9fdc9c3cfefc7031f8a34e650751c0b5e2febc3 Mon Sep 17 00:00:00 2001 From: Shawn Date: Tue, 25 Sep 2018 20:20:59 -0500 Subject: [PATCH 02/13] Move channels and claims to chainquery --- .gitignore | 3 +- client/src/sagas/file.js | 2 +- package-lock.json | 19 + package.json | 5 +- server/chainquery/bundle.debug.js | 1079 +++ server/chainquery/bundle.js | 1075 +++ server/chainquery/index.debug.js | 5 +- server/chainquery/index.js | 75 +- .../chainquery/models/AbnormalClaimModel.js | 2 +- server/chainquery/models/AddressModel.js | 2 +- .../models/ApplicationStatusModel.js | 33 - server/chainquery/models/BlockModel.js | 2 +- server/chainquery/models/ClaimModel.js | 2 +- .../chainquery/models/GorpMigrationsModel.js | 25 - server/chainquery/models/InputModel.js | 2 +- server/chainquery/models/JobStatusModel.js | 33 - server/chainquery/models/OutputModel.js | 2 +- server/chainquery/models/SupportModel.js | 2 +- .../models/TransactionAddressModel.js | 4 +- server/chainquery/models/TransactionModel.js | 2 +- .../queries/abnormalClaimQueries.js | 3 + server/chainquery/queries/addressQueries.js | 3 + server/chainquery/queries/blockQueries.js | 3 + server/chainquery/queries/claimQueries.js | 184 + server/chainquery/queries/inputQueries.js | 3 + server/chainquery/queries/outputQueries.js | 3 + server/chainquery/queries/supportQueries.js | 3 + .../queries/transactionAddressQueries.js | 3 + .../chainquery/queries/transactionQueries.js | 3 + .../chainquery/tables/abnormalClaimTable.js | 2 +- server/chainquery/tables/addressTable.js | 2 +- .../tables/applicationStatusTable.js | 11 - server/chainquery/tables/blockTable.js | 2 +- server/chainquery/tables/claimTable.js | 2 +- .../chainquery/tables/gorpMigrationsTable.js | 11 - server/chainquery/tables/inputTable.js | 2 +- server/chainquery/tables/jobStatusTable.js | 11 - server/chainquery/tables/outputTable.js | 2 +- server/chainquery/tables/supportTable.js | 2 +- .../tables/transactionAddressTable.js | 2 +- server/chainquery/tables/transactionTable.js | 2 +- .../api/channel/claims/getChannelClaims.js | 31 +- .../availability/checkClaimAvailability.js | 10 +- server/controllers/api/claim/data/index.js | 13 +- server/controllers/api/claim/get/index.js | 26 +- server/controllers/api/claim/longId/index.js | 9 +- server/utils/getClaimData.js | 13 + utils/createModuleAliases.js | 8 +- yarn.lock | 8231 +++++++++++++++++ 49 files changed, 10772 insertions(+), 202 deletions(-) create mode 100644 server/chainquery/bundle.debug.js create mode 100644 server/chainquery/bundle.js delete mode 100644 server/chainquery/models/ApplicationStatusModel.js delete mode 100644 server/chainquery/models/GorpMigrationsModel.js delete mode 100644 server/chainquery/models/JobStatusModel.js create mode 100644 server/chainquery/queries/abnormalClaimQueries.js create mode 100644 server/chainquery/queries/addressQueries.js create mode 100644 server/chainquery/queries/blockQueries.js create mode 100644 server/chainquery/queries/claimQueries.js create mode 100644 server/chainquery/queries/inputQueries.js create mode 100644 server/chainquery/queries/outputQueries.js create mode 100644 server/chainquery/queries/supportQueries.js create mode 100644 server/chainquery/queries/transactionAddressQueries.js create mode 100644 server/chainquery/queries/transactionQueries.js delete mode 100644 server/chainquery/tables/applicationStatusTable.js delete mode 100644 server/chainquery/tables/gorpMigrationsTable.js delete mode 100644 server/chainquery/tables/jobStatusTable.js create mode 100644 server/utils/getClaimData.js create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore index f7877770..73af4b5d 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ node_modules client/build +server/chainquery/build client_custom/build client_custom/scss @@ -22,4 +23,4 @@ public/bundle/bundle.js.map public/bundle/Lekton-* public/bundle/style.css -uploads \ No newline at end of file +uploads diff --git a/client/src/sagas/file.js b/client/src/sagas/file.js index 4b776521..77026b1b 100644 --- a/client/src/sagas/file.js +++ b/client/src/sagas/file.js @@ -7,7 +7,7 @@ import { selectSiteHost } from '../selectors/site'; function * retrieveFile (action) { const name = action.data.name; - const claimId = action.data.claimId; + const claimId = action.data.claim_id || action.data.claimId; const host = yield select(selectSiteHost); // see if the file is available let isAvailable; diff --git a/package-lock.json b/package-lock.json index 794cfec8..87374bf1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -908,6 +908,12 @@ "integrity": "sha512-EIjmpvnHj+T4nMcKwHwxZKUfDmphIKJc2qnEMhSoOvr1lYEQpuRKRz8orWr//krYIIArS/KGGLfL2YGVUYXmIA==", "dev": true }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, "@types/geojson": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-1.0.6.tgz", @@ -12030,6 +12036,16 @@ "inherits": "2.0.3" } }, + "rollup": { + "version": "0.66.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.66.2.tgz", + "integrity": "sha512-+rOLjWO170M3Y2jyyGU4ZJuTu1T1KuKNyH+RszHRzQdsuI5TulRbkSM4vlaMnwcxHm4XdgBNZ1mmNzhQIImbiQ==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "@types/node": "10.9.4" + } + }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", @@ -14152,6 +14168,9 @@ } } }, + "winston-slack-webhook": { + "version": "github:billbitt/winston-slack-webhook#ce99792bdf6473a9da69c91772eb4ecec4979b6c" + }, "wkx": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.5.tgz", diff --git a/package.json b/package.json index 0a671a5e..3d1cf596 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,10 @@ "prestart": "builder run bundle", "start": "node server.js", "start:build": "builder run start", + "chainquery:build": "rollup ./server/chainquery/index.js --file ./server/chainquery/bundle.js --format cjs", "devtools:server": "ndb server.js", - "devtools:chainquery": "ndb ./server/chainquery/index.debug.js", + "devtools:chainquery": "npm run devtools:chainquery:build && ndb ./server/chainquery/bundle.debug.js", + "devtools:chainquery:build": "rollup ./server/chainquery/index.debug.js --file ./server/chainquery/bundle.debug.js --format cjs", "test": "mocha --recursive", "test:no-lbc": "npm test -- --grep @usesLbc --invert", "test:server": "mocha --recursive './server/**/*.test.js'", @@ -115,6 +117,7 @@ "nodemon": "^1.17.5", "redux-devtools": "^3.4.1", "regenerator-transform": "^0.13.0", + "rollup": "^0.66.2", "sass-loader": "^7.1.0", "sequelize-cli": "^4.0.0", "style-loader": "^0.21.0", diff --git a/server/chainquery/bundle.debug.js b/server/chainquery/bundle.debug.js new file mode 100644 index 00000000..400e96cd --- /dev/null +++ b/server/chainquery/bundle.debug.js @@ -0,0 +1,1079 @@ +'use strict'; + +var AbnormalClaimModel = (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'abnormal_claim', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + name: { + type: STRING, + set() { }, + }, + claim_id: { + type: STRING, + set() { }, + }, + is_update: { + type: INTEGER, + set() { }, + }, + block_hash: { + type: STRING, + set() { }, + }, + transaction_hash: { + type: STRING, + set() { }, + }, + vout: { + type: INTEGER, + set() { }, + }, + output_id: { + type: INTEGER, + set() { }, + }, + value_as_hex: { + type: TEXT, + set() { }, + }, + value_as_json: { + type: TEXT, + set() { }, + }, + created_at: { + type: INTEGER, + set() { }, + }, + modified_at: { + type: INTEGER, + set() { }, + }, + }, + { + freezeTableName: true, + //getterMethods, + timestamps: false, // don't use default timestamps columns + } +); + +var abnormalClaimTable = { + createModel(...args) { + return AbnormalClaimModel(...args); + }, + + associate(db) { + // associate + }, +}; + +var AddressModel = (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'address', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + address: { + type: STRING, + set() { }, + }, + first_seen: { + type: INTEGER, + set() { }, + }, + created_at: { + type: INTEGER, + set() { }, + }, + modified_at: { + type: INTEGER, + set() { }, + }, + }, + { + freezeTableName: true, + //getterMethods, + timestamps: false, // don't use default timestamps columns + } +); + +var addressTable = { + createModel(...args) { + return AddressModel(...args); + }, + + associate(db) { + // associate + }, +}; + +var BlockModel = (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'block', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + bits: { + type: STRING, + set() { }, + }, + chainwork: { + type: STRING, + set() { }, + }, + confirmations: { + type: STRING, + set() { }, + }, + difficulty: { + type: STRING, + set() { }, + }, + hash: { + type: STRING, + set() { }, + }, + height: { + type: STRING, + set() { }, + }, + merkle_root: { + type: STRING, + set() { }, + }, + name_claim_root: { + type: STRING, + set() { }, + }, + nonce: { + type: STRING, + set() { }, + }, + previous_block_hash: { + type: STRING, + set() { }, + }, + next_block_hash: { + type: STRING, + set() { }, + }, + block_size: { + type: STRING, + set() { }, + }, + block_time: { + type: STRING, + set() { }, + }, + version: { + type: STRING, + set() { }, + }, + version_hex: { + type: STRING, + set() { }, + }, + transaction_hashes: { + type: STRING, + set() { }, + }, + transactions_processed: { + type: STRING, + set() { }, + }, + created_at: { + type: INTEGER, + set() { }, + }, + modified_at: { + type: INTEGER, + set() { }, + }, + }, + { + freezeTableName: true, + //getterMethods, + timestamps: false, // don't use default timestamps columns + } +); + +var blockTable = { + createModel(...args) { + return BlockModel(...args); + }, + + associate(db) { + // associate + }, +}; + +const logger = require('winston'); + +const { + assetDefaults: { thumbnail: defaultThumbnail }, + details: { host } +} = require('../../config/siteConfig'); // TODO: Fix paths for rollup + +const getterMethods$3 = { + generated_extension() { + switch (this.content_type) { + case 'image/jpeg': + case 'image/jpg': + return 'jpg'; + case 'image/png': + return 'png'; + case 'image/gif': + return 'gif'; + case 'video/mp4': + return 'mp4'; + default: + logger.debug('setting unknown file type as file extension jpg'); + return 'jpg'; + } + }, + + // TODO: Factor this out. + generated_thumbnail() { + return this.thumbnail_url || defaultThumbnail; + }, + + generated_channel() { + console.log(this); + // + } +}; + +var ClaimModel = (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'claim', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + transaction_hash_id: { + type: STRING, + set() { }, + }, + vout: { + type: INTEGER, + set() { }, + }, + name: { + type: STRING, + set() { }, + }, + claim_id: { + type: STRING, + set() { }, + }, + claim_type: { + type: INTEGER, + set() { }, + }, + publisher_id: { + type: STRING, + set() { }, + }, + publisher_sig: { + type: STRING, + set() { }, + }, + certificate: { + type: STRING, + set() { }, + }, + sd_hash: { + type: STRING, + set() { }, + }, + transaction_time: { + type: INTEGER, + set() { }, + }, + version: { + type: STRING, + set() { }, + }, + value_as_hex: { + type: STRING, + set() { }, + }, + value_as_json: { + type: STRING, + set() { }, + }, + valid_at_height: { + type: INTEGER, + set() { }, + }, + height: { + type: INTEGER, + set() { }, + }, + effective_amount: { + type: INTEGER, + set() { }, + }, + author: { + type: STRING, + set() { }, + }, + description: { + type: STRING, + set() { }, + }, + content_type: { + type: STRING, + set() { }, + }, + is_nsfw: { + type: INTEGER, + set() { }, + }, + language: { + type: STRING, + set() { }, + }, + thumbnail_url: { + type: STRING, + set() { }, + }, + title: { + type: STRING, + set() { }, + }, + fee: { + type: DECIMAL(58, 8), + set() { }, + }, + fee_currency: { + type: STRING, + set() { }, + }, + is_filtered: { + type: INTEGER, + set() { }, + }, + bid_state: { + type: STRING, + set() { }, + }, + created_at: { + type: INTEGER, + set() { }, + }, + modified_at: { + type: INTEGER, + set() { }, + }, + fee_address: { + type: STRING, + set() { }, + }, + claim_address: { + type: STRING, + set() { }, + }, + }, + { + freezeTableName: true, + getterMethods: getterMethods$3, + timestamps: false, // don't use default timestamps columns + } +); + +var claimTable = { + createModel(...args) { + return ClaimModel(...args); + }, + + associate(db) { + // associate + }, +}; + +var InputModel = (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'input', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + transaction_id: { + type: INTEGER, + set() { }, + }, + transaction_hash: { + type: STRING, + set() { }, + }, + input_address_id: { + type: INTEGER, + set() { }, + }, + is_coinbase: { + type: INTEGER, + set() { }, + }, + coinbase: { + type: STRING, + set() { }, + }, + prevout_hash: { + type: STRING, + set() { }, + }, + prevout_n: { + type: INTEGER, + set() { }, + }, + prevout_spend_updated: { + type: INTEGER, + set() { }, + }, + sequence: { + type: INTEGER, + set() { }, + }, + value: { + type: DECIMAL(18, 8), + set() { }, + }, + script_sig_asm: { + type: TEXT, + set() { }, + }, + script_sig_hex: { + type: TEXT, + set() { }, + }, + created: { + type: INTEGER, + set() { }, + }, + modified: { + type: INTEGER, + set() { }, + }, + }, + { + freezeTableName: true, + //getterMethods, + timestamps: false, // don't use default timestamps columns + } +); + +var inputTable = { + createModel(...args) { + return InputModel(...args); + }, + + associate(db) { + // associate + }, +}; + +var OutputModel = (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'output', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + transaction_id: { + type: INTEGER, + set() { }, + }, + transaction_hash: { + type: STRING, + set() { }, + }, + value: { + type: DECIMAL(18, 8), + set() { }, + }, + vout: { + type: INTEGER, + set() { }, + }, + type: { + type: STRING, + set() { }, + }, + script_pub_key_asm: { + type: TEXT, + set() { }, + }, + script_pub_key_hex: { + type: TEXT, + set() { }, + }, + required_signatures: { + type: INTEGER, + set() { }, + }, + address_list: { + type: TEXT, + set() { }, + }, + is_spent: { + type: INTEGER, + set() { }, + }, + spent_by_input_id: { + type: INTEGER, + set() { }, + }, + created_at: { + type: INTEGER, + set() { }, + }, + modified_at: { + type: INTEGER, + set() { }, + }, + claim_id: { + type: STRING, + set() { }, + } + }, + { + freezeTableName: true, + //getterMethods, + timestamps: false, // don't use default timestamps columns + } +); + +var outputTable = { + createModel(...args) { + return OutputModel(...args); + }, + + associate(db) { + // associate + }, +}; + +var SupportModel = (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'support', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + supported_claim_id: { + type: STRING, + set() { }, + }, + support_amount: { + type: DECIMAL(18, 8), + set() { }, + }, + bid_state: { + type: STRING, + set() { }, + }, + transaction_hash_id: { + type: STRING, + set() { }, + }, + vout: { + type: INTEGER, + set() { }, + }, + created_at: { + type: INTEGER, + set() { }, + }, + modified_at: { + type: INTEGER, + set() { }, + }, + }, + { + freezeTableName: true, + //getterMethods, + timestamps: false, // don't use default timestamps columns + } +); + +var supportTable = { + createModel(...args) { + return SupportModel(...args); + }, + + associate(db) { + // associate + }, +}; + +var TransactionAddressModel = (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'transaction_address', + { + transaction_id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + address_id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + debit_amount: { + type: DECIMAL(18, 8), + set() { }, + }, + credit_amount: { + type: DECIMAL(18, 8), + set() { }, + }, + }, + { + freezeTableName: true, + //getterMethods, + timestamps: false, // don't use default timestamps columns + } +); + +var transactionAddressTable = { + createModel(...args) { + return TransactionAddressModel(...args); + }, + + associate(db) { + // associate + }, +}; + +var TransactionModel = (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'transaction', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + block_hash_id: { + type: STRING, + set() { }, + }, + input_count: { + type: INTEGER, + set() { }, + }, + output_count: { + type: INTEGER, + set() { }, + }, + fee: { + type: DECIMAL(18, 8), + set() { }, + }, + transaction_time: { + type: INTEGER, + set() { }, + }, + transaction_size: { + type: INTEGER, + set() { }, + }, + hash: { + type: STRING, + set() { }, + }, + version: { + type: INTEGER, + set() { }, + }, + lock_time: { + type: INTEGER, + set() { }, + }, + raw: { + type: TEXT, + set() { }, + }, + created_at: { + type: INTEGER, + set() { }, + }, + modified_at: { + type: INTEGER, + set() { }, + }, + created_time: { + type: INTEGER, + set() {}, + }, + }, + { + freezeTableName: true, + //getterMethods, + timestamps: false, // don't use default timestamps columns + } +); + +var transactionTable = { + createModel(...args) { + return TransactionModel(...args); + }, + + associate(db) { + // associate + }, +}; + +var abnormalClaimQueries = (db, table) => ({ + example: () => table.findAll(), +}); + +var addressQueries = (db, table) => ({ + example: () => table.findAll(), +}); + +var blockQueries = (db, table) => ({ + example: () => table.findAll(), +}); + +const logger$1 = require('winston'); + +const returnShortId = (claimsArray, longId) => { + let claimIndex; + let shortId = longId.substring(0, 1); // default short id is the first letter + let shortIdLength = 0; + // find the index of this claim id + claimIndex = claimsArray.findIndex(element => { + return element.claim_id === longId; + }); + if (claimIndex < 0) { + throw new Error('claim id not found in claims list'); + } + // get an array of all claims with lower height + let possibleMatches = claimsArray.slice(0, claimIndex); + // remove certificates with the same prefixes until none are left. + while (possibleMatches.length > 0) { + shortIdLength += 1; + shortId = longId.substring(0, shortIdLength); + possibleMatches = possibleMatches.filter(element => { + return (element.claim_id && (element.claim_id.substring(0, shortIdLength) === shortId)); + }); + } + return shortId; +}; + +const isLongClaimId = (claimId) => { + return (claimId && (claimId.length === 40)); +}; + +const isShortClaimId = (claimId) => { + return (claimId && (claimId.length < 40)); +}; + +var claimQueries = (db, table) => ({ + + getShortClaimIdFromLongClaimId: async (claimId, claimName) => { + logger$1.debug(`claim.getShortClaimIdFromLongClaimId for ${claimName}#${claimId}`); + return await table.findAll({ + where: { name: claimName }, + order: [['height', 'ASC']], + }).then(result => { + if(result.length === 0) { + throw new Error('No claim(s) found with that claim name'); + } + + return returnShortId(result, claimId); + }); + }, + + getAllChannelClaims: async (channelClaimId) => { + logger$1.debug(`claim.getAllChannelClaims for ${channelClaimId}`); + return await table.findAll({ + where: { publisher_id: channelClaimId }, + order: [['height', 'DESC']], + raw : true, // returns an array of only data, not an array of instances + }) + .then(channelClaimsArray => { + if(channelClaimsArray.length === 0) { + return null; + } + + return channelClaimsArray; + }) + }, + + getClaimIdByLongChannelId: async (channelClaimId, claimName) => { + logger$1.debug(`finding claim id for claim ${claimName} from channel ${channelClaimId}`); + return await table.findAll({ + where: { name: claimName, publisher_id: channelClaimId }, + order: [['id', 'ASC']], + }) + .then(result => { + switch (result.length) { + case 0: + return null; + case 1: + return result[0].claim_id; + default: + // Does this actually happen??? (from converted code) + logger$1.warn(`${result.length} records found for "${claimName}" in channel "${channelClaimId}"`); + return result[0].claim_id; + } + }); + }, + + validateLongClaimId: async (name, claimId) => { + return await table.findOne({ + where: { + name, + claim_id: claimId, + }, + }).then(result => { + if (!result) { + return false; + } + return claimId; + }); + }, + + getLongClaimIdFromShortClaimId: async (name, shortId) => { + return await table.findAll({ + where: { + name, + claim_id: { + [sequelize.Op.like]: `${shortId}%`, + }}, + order: [['height', 'ASC']], + }) + .then(result => { + if(result.length === 0) { + return null; + } + + return result[0].claim_id; + }); + }, + + getTopFreeClaimIdByClaimName: async (name) => { + return await table.findAll({ + // TODO: Limit 1 + where: { name }, + order: [['effective_amount', 'DESC'], ['height', 'ASC']], + }).then(result => { + if(result.length === 0) { + return null; + } + return result[0].claim_id; + }) + }, + + getLongClaimId: async (claimName, claimId) => { + // TODO: Add failure case + logger$1.debug(`getLongClaimId(${claimName}, ${claimId})`); + if (isLongClaimId(claimId)) { + return table.queries.validateLongClaimId(claimName, claimId); + } else if (isShortClaimId(claimId)) { + return table.queries.getLongClaimIdFromShortClaimId(claimName, claimId); + } else { + return table.queries.getTopFreeClaimIdByClaimName(claimName); + } + }, + + resolveClaim: async (name, claimId) => { + logger$1.debug(`Claim.resolveClaim: ${name} ${claimId}`); + return table.findAll({ + where: { name, claim_id: claimId }, + }).then(claimArray => { + if(claimArray.length === 0) { + return null; + } else if(claimArray.length !== 1) { + logger$1.warn(`more than one record matches ${name}#${claimId} in db.Claim`); + } + + return claimArray[0]; + }); + }, + + getOutpoint: async (name, claimId) => { + logger$1.debug(`finding outpoint for ${name}#${claimId}`); + + return await table.findAll({ + where : { name, claim_id: claimId }, + attributes: ['transaction_hash_id'], + }).then(result => { + if(result.length === 0) { + throw new Error(`no record found for ${name}#${claimId}`); + } else if(result.length !== 1) { + logger$1.warn(`more than one record matches ${name}#${claimId} in db.Claim`); + } + + return result[0].transaction_hash_id; + }); + }, + + getCurrentHeight: async () => { + return await table + .max('height') + .then(result => { + return (result || 100000); + }); + }, + +}); + +var inputQueries = (db, table) => ({ + example: () => table.findAll(), +}); + +var outputQueries = (db, table) => ({ + example: () => table.findAll(), +}); + +var supportQueries = (db, table) => ({ + example: () => table.findAll(), +}); + +var transactionAddressQueries = (db, table) => ({ + example: () => table.findAll(), +}); + +var transactionQueries = (db, table) => ({ + example: () => table.findAll(), +}); + +const Sequelize = require('sequelize'); +const logger$2 = require('winston'); + +const DATABASE_STRUCTURE = { + 'abnormal_claim': { + table: abnormalClaimTable, + queries: abnormalClaimQueries, + }, + 'address': { + table: addressTable, + queries: addressQueries, + }, + 'block': { + table: blockTable, + queries: blockQueries, + }, + 'claim': { + table: claimTable, + queries: claimQueries, + }, + 'input': { + table: inputTable, + queries: inputQueries, + }, + 'output': { + table: outputTable, + queries: outputQueries, + }, + 'support': { + table: supportTable, + queries: supportQueries, + }, + 'transaction_address': { + table: transactionAddressTable, + queries: transactionAddressQueries, + }, + 'transaction': { + table: transactionTable, + queries: transactionQueries, + }, +}; + +const { + host: host$1, + port, + database, + username, + password, +} = require('../../config/chainqueryConfig'); // TODO: Make '@config/siteConfig' work outside Webpack for testing/dev + +if (!database || !username || !password) { + logger$2.warn('missing database, user, or password from chainqueryConfig'); +} + +// set sequelize options +const sequelize$1 = new Sequelize(database, username, password, { + host : host$1, + import : port, + dialect : 'mysql', + dialectOptions: { + decimalNumbers: true, + }, + logging: false, + pool : { + max : 5, + min : 0, + idle : 10000, + acquire: 10000, + }, + operatorsAliases: false, +}); + +const db = {}; +const DATABASE_STRUCTURE_KEYS = Object.keys(DATABASE_STRUCTURE); + +for(let i = 0; i < DATABASE_STRUCTURE_KEYS.length; i++) { + let dbKey = DATABASE_STRUCTURE_KEYS[i]; + let currentData = DATABASE_STRUCTURE[dbKey]; + + db[dbKey] = currentData.table.createModel(sequelize$1, Sequelize); + db[dbKey].queries = currentData.queries(db, db[dbKey]); +} + +// run model.association for each model in the db object that has an association +logger$2.info('associating chainquery db models...'); +DATABASE_STRUCTURE_KEYS.forEach(modelName => { + if (db[modelName].associate) { + logger$2.info('Associating chainquery model:', modelName); + db[modelName].associate(db); + } +}); + +// establish mysql connection +sequelize$1 + .authenticate() + .then(() => { + logger$2.info('Sequelize has established mysql connection for chainquery successfully.'); + }) + .catch(err => { + logger$2.error('Sequelize was unable to connect to the chainquery database:', err); + }); + +console.log('Loading `chainquery`, please wait...'); + +global.chainquery = db.default ? db.default : db; + +console.log('`chainquery` has been loaded into the global context.'); diff --git a/server/chainquery/bundle.js b/server/chainquery/bundle.js new file mode 100644 index 00000000..b8fc6b07 --- /dev/null +++ b/server/chainquery/bundle.js @@ -0,0 +1,1075 @@ +'use strict'; + +var AbnormalClaimModel = (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'abnormal_claim', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + name: { + type: STRING, + set() { }, + }, + claim_id: { + type: STRING, + set() { }, + }, + is_update: { + type: INTEGER, + set() { }, + }, + block_hash: { + type: STRING, + set() { }, + }, + transaction_hash: { + type: STRING, + set() { }, + }, + vout: { + type: INTEGER, + set() { }, + }, + output_id: { + type: INTEGER, + set() { }, + }, + value_as_hex: { + type: TEXT, + set() { }, + }, + value_as_json: { + type: TEXT, + set() { }, + }, + created_at: { + type: INTEGER, + set() { }, + }, + modified_at: { + type: INTEGER, + set() { }, + }, + }, + { + freezeTableName: true, + //getterMethods, + timestamps: false, // don't use default timestamps columns + } +); + +var abnormalClaimTable = { + createModel(...args) { + return AbnormalClaimModel(...args); + }, + + associate(db) { + // associate + }, +}; + +var AddressModel = (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'address', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + address: { + type: STRING, + set() { }, + }, + first_seen: { + type: INTEGER, + set() { }, + }, + created_at: { + type: INTEGER, + set() { }, + }, + modified_at: { + type: INTEGER, + set() { }, + }, + }, + { + freezeTableName: true, + //getterMethods, + timestamps: false, // don't use default timestamps columns + } +); + +var addressTable = { + createModel(...args) { + return AddressModel(...args); + }, + + associate(db) { + // associate + }, +}; + +var BlockModel = (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'block', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + bits: { + type: STRING, + set() { }, + }, + chainwork: { + type: STRING, + set() { }, + }, + confirmations: { + type: STRING, + set() { }, + }, + difficulty: { + type: STRING, + set() { }, + }, + hash: { + type: STRING, + set() { }, + }, + height: { + type: STRING, + set() { }, + }, + merkle_root: { + type: STRING, + set() { }, + }, + name_claim_root: { + type: STRING, + set() { }, + }, + nonce: { + type: STRING, + set() { }, + }, + previous_block_hash: { + type: STRING, + set() { }, + }, + next_block_hash: { + type: STRING, + set() { }, + }, + block_size: { + type: STRING, + set() { }, + }, + block_time: { + type: STRING, + set() { }, + }, + version: { + type: STRING, + set() { }, + }, + version_hex: { + type: STRING, + set() { }, + }, + transaction_hashes: { + type: STRING, + set() { }, + }, + transactions_processed: { + type: STRING, + set() { }, + }, + created_at: { + type: INTEGER, + set() { }, + }, + modified_at: { + type: INTEGER, + set() { }, + }, + }, + { + freezeTableName: true, + //getterMethods, + timestamps: false, // don't use default timestamps columns + } +); + +var blockTable = { + createModel(...args) { + return BlockModel(...args); + }, + + associate(db) { + // associate + }, +}; + +const logger = require('winston'); + +const { + assetDefaults: { thumbnail: defaultThumbnail }, + details: { host } +} = require('../../config/siteConfig'); // TODO: Fix paths for rollup + +const getterMethods$3 = { + generated_extension() { + switch (this.content_type) { + case 'image/jpeg': + case 'image/jpg': + return 'jpg'; + case 'image/png': + return 'png'; + case 'image/gif': + return 'gif'; + case 'video/mp4': + return 'mp4'; + default: + logger.debug('setting unknown file type as file extension jpg'); + return 'jpg'; + } + }, + + // TODO: Factor this out. + generated_thumbnail() { + return this.thumbnail_url || defaultThumbnail; + }, + + generated_channel() { + console.log(this); + // + } +}; + +var ClaimModel = (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'claim', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + transaction_hash_id: { + type: STRING, + set() { }, + }, + vout: { + type: INTEGER, + set() { }, + }, + name: { + type: STRING, + set() { }, + }, + claim_id: { + type: STRING, + set() { }, + }, + claim_type: { + type: INTEGER, + set() { }, + }, + publisher_id: { + type: STRING, + set() { }, + }, + publisher_sig: { + type: STRING, + set() { }, + }, + certificate: { + type: STRING, + set() { }, + }, + sd_hash: { + type: STRING, + set() { }, + }, + transaction_time: { + type: INTEGER, + set() { }, + }, + version: { + type: STRING, + set() { }, + }, + value_as_hex: { + type: STRING, + set() { }, + }, + value_as_json: { + type: STRING, + set() { }, + }, + valid_at_height: { + type: INTEGER, + set() { }, + }, + height: { + type: INTEGER, + set() { }, + }, + effective_amount: { + type: INTEGER, + set() { }, + }, + author: { + type: STRING, + set() { }, + }, + description: { + type: STRING, + set() { }, + }, + content_type: { + type: STRING, + set() { }, + }, + is_nsfw: { + type: INTEGER, + set() { }, + }, + language: { + type: STRING, + set() { }, + }, + thumbnail_url: { + type: STRING, + set() { }, + }, + title: { + type: STRING, + set() { }, + }, + fee: { + type: DECIMAL(58, 8), + set() { }, + }, + fee_currency: { + type: STRING, + set() { }, + }, + is_filtered: { + type: INTEGER, + set() { }, + }, + bid_state: { + type: STRING, + set() { }, + }, + created_at: { + type: INTEGER, + set() { }, + }, + modified_at: { + type: INTEGER, + set() { }, + }, + fee_address: { + type: STRING, + set() { }, + }, + claim_address: { + type: STRING, + set() { }, + }, + }, + { + freezeTableName: true, + getterMethods: getterMethods$3, + timestamps: false, // don't use default timestamps columns + } +); + +var claimTable = { + createModel(...args) { + return ClaimModel(...args); + }, + + associate(db) { + // associate + }, +}; + +var InputModel = (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'input', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + transaction_id: { + type: INTEGER, + set() { }, + }, + transaction_hash: { + type: STRING, + set() { }, + }, + input_address_id: { + type: INTEGER, + set() { }, + }, + is_coinbase: { + type: INTEGER, + set() { }, + }, + coinbase: { + type: STRING, + set() { }, + }, + prevout_hash: { + type: STRING, + set() { }, + }, + prevout_n: { + type: INTEGER, + set() { }, + }, + prevout_spend_updated: { + type: INTEGER, + set() { }, + }, + sequence: { + type: INTEGER, + set() { }, + }, + value: { + type: DECIMAL(18, 8), + set() { }, + }, + script_sig_asm: { + type: TEXT, + set() { }, + }, + script_sig_hex: { + type: TEXT, + set() { }, + }, + created: { + type: INTEGER, + set() { }, + }, + modified: { + type: INTEGER, + set() { }, + }, + }, + { + freezeTableName: true, + //getterMethods, + timestamps: false, // don't use default timestamps columns + } +); + +var inputTable = { + createModel(...args) { + return InputModel(...args); + }, + + associate(db) { + // associate + }, +}; + +var OutputModel = (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'output', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + transaction_id: { + type: INTEGER, + set() { }, + }, + transaction_hash: { + type: STRING, + set() { }, + }, + value: { + type: DECIMAL(18, 8), + set() { }, + }, + vout: { + type: INTEGER, + set() { }, + }, + type: { + type: STRING, + set() { }, + }, + script_pub_key_asm: { + type: TEXT, + set() { }, + }, + script_pub_key_hex: { + type: TEXT, + set() { }, + }, + required_signatures: { + type: INTEGER, + set() { }, + }, + address_list: { + type: TEXT, + set() { }, + }, + is_spent: { + type: INTEGER, + set() { }, + }, + spent_by_input_id: { + type: INTEGER, + set() { }, + }, + created_at: { + type: INTEGER, + set() { }, + }, + modified_at: { + type: INTEGER, + set() { }, + }, + claim_id: { + type: STRING, + set() { }, + } + }, + { + freezeTableName: true, + //getterMethods, + timestamps: false, // don't use default timestamps columns + } +); + +var outputTable = { + createModel(...args) { + return OutputModel(...args); + }, + + associate(db) { + // associate + }, +}; + +var SupportModel = (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'support', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + supported_claim_id: { + type: STRING, + set() { }, + }, + support_amount: { + type: DECIMAL(18, 8), + set() { }, + }, + bid_state: { + type: STRING, + set() { }, + }, + transaction_hash_id: { + type: STRING, + set() { }, + }, + vout: { + type: INTEGER, + set() { }, + }, + created_at: { + type: INTEGER, + set() { }, + }, + modified_at: { + type: INTEGER, + set() { }, + }, + }, + { + freezeTableName: true, + //getterMethods, + timestamps: false, // don't use default timestamps columns + } +); + +var supportTable = { + createModel(...args) { + return SupportModel(...args); + }, + + associate(db) { + // associate + }, +}; + +var TransactionAddressModel = (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'transaction_address', + { + transaction_id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + address_id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + debit_amount: { + type: DECIMAL(18, 8), + set() { }, + }, + credit_amount: { + type: DECIMAL(18, 8), + set() { }, + }, + }, + { + freezeTableName: true, + //getterMethods, + timestamps: false, // don't use default timestamps columns + } +); + +var transactionAddressTable = { + createModel(...args) { + return TransactionAddressModel(...args); + }, + + associate(db) { + // associate + }, +}; + +var TransactionModel = (sequelize, { + STRING, BOOLEAN, INTEGER, TEXT, DECIMAL +}) => sequelize.define( + 'transaction', + { + id: { + primaryKey: true, + type: INTEGER, + set() { }, + }, + block_hash_id: { + type: STRING, + set() { }, + }, + input_count: { + type: INTEGER, + set() { }, + }, + output_count: { + type: INTEGER, + set() { }, + }, + fee: { + type: DECIMAL(18, 8), + set() { }, + }, + transaction_time: { + type: INTEGER, + set() { }, + }, + transaction_size: { + type: INTEGER, + set() { }, + }, + hash: { + type: STRING, + set() { }, + }, + version: { + type: INTEGER, + set() { }, + }, + lock_time: { + type: INTEGER, + set() { }, + }, + raw: { + type: TEXT, + set() { }, + }, + created_at: { + type: INTEGER, + set() { }, + }, + modified_at: { + type: INTEGER, + set() { }, + }, + created_time: { + type: INTEGER, + set() {}, + }, + }, + { + freezeTableName: true, + //getterMethods, + timestamps: false, // don't use default timestamps columns + } +); + +var transactionTable = { + createModel(...args) { + return TransactionModel(...args); + }, + + associate(db) { + // associate + }, +}; + +var abnormalClaimQueries = (db, table) => ({ + example: () => table.findAll(), +}); + +var addressQueries = (db, table) => ({ + example: () => table.findAll(), +}); + +var blockQueries = (db, table) => ({ + example: () => table.findAll(), +}); + +const logger$1 = require('winston'); + +const returnShortId = (claimsArray, longId) => { + let claimIndex; + let shortId = longId.substring(0, 1); // default short id is the first letter + let shortIdLength = 0; + // find the index of this claim id + claimIndex = claimsArray.findIndex(element => { + return element.claim_id === longId; + }); + if (claimIndex < 0) { + throw new Error('claim id not found in claims list'); + } + // get an array of all claims with lower height + let possibleMatches = claimsArray.slice(0, claimIndex); + // remove certificates with the same prefixes until none are left. + while (possibleMatches.length > 0) { + shortIdLength += 1; + shortId = longId.substring(0, shortIdLength); + possibleMatches = possibleMatches.filter(element => { + return (element.claim_id && (element.claim_id.substring(0, shortIdLength) === shortId)); + }); + } + return shortId; +}; + +const isLongClaimId = (claimId) => { + return (claimId && (claimId.length === 40)); +}; + +const isShortClaimId = (claimId) => { + return (claimId && (claimId.length < 40)); +}; + +var claimQueries = (db, table) => ({ + + getShortClaimIdFromLongClaimId: async (claimId, claimName) => { + logger$1.debug(`claim.getShortClaimIdFromLongClaimId for ${claimName}#${claimId}`); + return await table.findAll({ + where: { name: claimName }, + order: [['height', 'ASC']], + }).then(result => { + if(result.length === 0) { + throw new Error('No claim(s) found with that claim name'); + } + + return returnShortId(result, claimId); + }); + }, + + getAllChannelClaims: async (channelClaimId) => { + logger$1.debug(`claim.getAllChannelClaims for ${channelClaimId}`); + return await table.findAll({ + where: { publisher_id: channelClaimId }, + order: [['height', 'DESC']], + raw : true, // returns an array of only data, not an array of instances + }) + .then(channelClaimsArray => { + if(channelClaimsArray.length === 0) { + return null; + } + + return channelClaimsArray; + }) + }, + + getClaimIdByLongChannelId: async (channelClaimId, claimName) => { + logger$1.debug(`finding claim id for claim ${claimName} from channel ${channelClaimId}`); + return await table.findAll({ + where: { name: claimName, publisher_id: channelClaimId }, + order: [['id', 'ASC']], + }) + .then(result => { + switch (result.length) { + case 0: + return null; + case 1: + return result[0].claim_id; + default: + // Does this actually happen??? (from converted code) + logger$1.warn(`${result.length} records found for "${claimName}" in channel "${channelClaimId}"`); + return result[0].claim_id; + } + }); + }, + + validateLongClaimId: async (name, claimId) => { + return await table.findOne({ + where: { + name, + claim_id: claimId, + }, + }).then(result => { + if (!result) { + return false; + } + return claimId; + }); + }, + + getLongClaimIdFromShortClaimId: async (name, shortId) => { + return await table.findAll({ + where: { + name, + claim_id: { + [sequelize.Op.like]: `${shortId}%`, + }}, + order: [['height', 'ASC']], + }) + .then(result => { + if(result.length === 0) { + return null; + } + + return result[0].claim_id; + }); + }, + + getTopFreeClaimIdByClaimName: async (name) => { + return await table.findAll({ + // TODO: Limit 1 + where: { name }, + order: [['effective_amount', 'DESC'], ['height', 'ASC']], + }).then(result => { + if(result.length === 0) { + return null; + } + return result[0].claim_id; + }) + }, + + getLongClaimId: async (claimName, claimId) => { + // TODO: Add failure case + logger$1.debug(`getLongClaimId(${claimName}, ${claimId})`); + if (isLongClaimId(claimId)) { + return table.queries.validateLongClaimId(claimName, claimId); + } else if (isShortClaimId(claimId)) { + return table.queries.getLongClaimIdFromShortClaimId(claimName, claimId); + } else { + return table.queries.getTopFreeClaimIdByClaimName(claimName); + } + }, + + resolveClaim: async (name, claimId) => { + logger$1.debug(`Claim.resolveClaim: ${name} ${claimId}`); + return table.findAll({ + where: { name, claim_id: claimId }, + }).then(claimArray => { + if(claimArray.length === 0) { + return null; + } else if(claimArray.length !== 1) { + logger$1.warn(`more than one record matches ${name}#${claimId} in db.Claim`); + } + + return claimArray[0]; + }); + }, + + getOutpoint: async (name, claimId) => { + logger$1.debug(`finding outpoint for ${name}#${claimId}`); + + return await table.findAll({ + where : { name, claim_id: claimId }, + attributes: ['transaction_hash_id'], + }).then(result => { + if(result.length === 0) { + throw new Error(`no record found for ${name}#${claimId}`); + } else if(result.length !== 1) { + logger$1.warn(`more than one record matches ${name}#${claimId} in db.Claim`); + } + + return result[0].transaction_hash_id; + }); + }, + + getCurrentHeight: async () => { + return await table + .max('height') + .then(result => { + return (result || 100000); + }); + }, + +}); + +var inputQueries = (db, table) => ({ + example: () => table.findAll(), +}); + +var outputQueries = (db, table) => ({ + example: () => table.findAll(), +}); + +var supportQueries = (db, table) => ({ + example: () => table.findAll(), +}); + +var transactionAddressQueries = (db, table) => ({ + example: () => table.findAll(), +}); + +var transactionQueries = (db, table) => ({ + example: () => table.findAll(), +}); + +const Sequelize = require('sequelize'); +const logger$2 = require('winston'); + +const DATABASE_STRUCTURE = { + 'abnormal_claim': { + table: abnormalClaimTable, + queries: abnormalClaimQueries, + }, + 'address': { + table: addressTable, + queries: addressQueries, + }, + 'block': { + table: blockTable, + queries: blockQueries, + }, + 'claim': { + table: claimTable, + queries: claimQueries, + }, + 'input': { + table: inputTable, + queries: inputQueries, + }, + 'output': { + table: outputTable, + queries: outputQueries, + }, + 'support': { + table: supportTable, + queries: supportQueries, + }, + 'transaction_address': { + table: transactionAddressTable, + queries: transactionAddressQueries, + }, + 'transaction': { + table: transactionTable, + queries: transactionQueries, + }, +}; + +const { + host: host$1, + port, + database, + username, + password, +} = require('../../config/chainqueryConfig'); // TODO: Make '@config/siteConfig' work outside Webpack for testing/dev + +if (!database || !username || !password) { + logger$2.warn('missing database, user, or password from chainqueryConfig'); +} + +// set sequelize options +const sequelize$1 = new Sequelize(database, username, password, { + host : host$1, + import : port, + dialect : 'mysql', + dialectOptions: { + decimalNumbers: true, + }, + logging: false, + pool : { + max : 5, + min : 0, + idle : 10000, + acquire: 10000, + }, + operatorsAliases: false, +}); + +const db = {}; +const DATABASE_STRUCTURE_KEYS = Object.keys(DATABASE_STRUCTURE); + +for(let i = 0; i < DATABASE_STRUCTURE_KEYS.length; i++) { + let dbKey = DATABASE_STRUCTURE_KEYS[i]; + let currentData = DATABASE_STRUCTURE[dbKey]; + + db[dbKey] = currentData.table.createModel(sequelize$1, Sequelize); + db[dbKey].queries = currentData.queries(db, db[dbKey]); +} + +// run model.association for each model in the db object that has an association +logger$2.info('associating chainquery db models...'); +DATABASE_STRUCTURE_KEYS.forEach(modelName => { + if (db[modelName].associate) { + logger$2.info('Associating chainquery model:', modelName); + db[modelName].associate(db); + } +}); + +// establish mysql connection +sequelize$1 + .authenticate() + .then(() => { + logger$2.info('Sequelize has established mysql connection for chainquery successfully.'); + }) + .catch(err => { + logger$2.error('Sequelize was unable to connect to the chainquery database:', err); + }); + +module.exports = db; diff --git a/server/chainquery/index.debug.js b/server/chainquery/index.debug.js index 0563fa8f..d836a885 100644 --- a/server/chainquery/index.debug.js +++ b/server/chainquery/index.debug.js @@ -1,9 +1,6 @@ console.log('Loading `chainquery`, please wait...') -require('@babel/polyfill'); -require('@babel/register'); - -const chainquery = require('./'); +import chainquery from './index' global.chainquery = chainquery.default ? chainquery.default : chainquery; diff --git a/server/chainquery/index.js b/server/chainquery/index.js index 92a451ab..e0c56e5c 100644 --- a/server/chainquery/index.js +++ b/server/chainquery/index.js @@ -3,17 +3,63 @@ const logger = require('winston'); import abnormalClaimTable from './tables/abnormalClaimTable'; import addressTable from './tables/addressTable'; -import applicationStatusTable from './tables/applicationStatusTable'; import blockTable from './tables/blockTable'; import claimTable from './tables/claimTable'; -import gorpMigrationsTable from './tables/gorpMigrationsTable'; import inputTable from './tables/inputTable'; -import jobStatusTable from './tables/jobStatusTable'; import outputTable from './tables/outputTable'; import supportTable from './tables/supportTable'; import transactionAddressTable from './tables/transactionAddressTable'; import transactionTable from './tables/transactionTable'; +import abnormalClaimQueries from './queries/abnormalClaimQueries'; +import addressQueries from './queries/addressQueries'; +import blockQueries from './queries/blockQueries'; +import claimQueries from './queries/claimQueries'; +import inputQueries from './queries/inputQueries'; +import outputQueries from './queries/outputQueries'; +import supportQueries from './queries/supportQueries'; +import transactionAddressQueries from './queries/transactionAddressQueries'; +import transactionQueries from './queries/transactionQueries'; + +const DATABASE_STRUCTURE = { + 'abnormal_claim': { + table: abnormalClaimTable, + queries: abnormalClaimQueries, + }, + 'address': { + table: addressTable, + queries: addressQueries, + }, + 'block': { + table: blockTable, + queries: blockQueries, + }, + 'claim': { + table: claimTable, + queries: claimQueries, + }, + 'input': { + table: inputTable, + queries: inputQueries, + }, + 'output': { + table: outputTable, + queries: outputQueries, + }, + 'support': { + table: supportTable, + queries: supportQueries, + }, + 'transaction_address': { + table: transactionAddressTable, + queries: transactionAddressQueries, + }, + 'transaction': { + table: transactionTable, + queries: transactionQueries, + }, +}; + const { host, port, @@ -45,22 +91,19 @@ const sequelize = new Sequelize(database, username, password, { }); const db = {}; -db.abnormal_claim = sequelize.import('abnormal_claim', abnormalClaimTable.createModel); -db.application_status = sequelize.import('application_status', applicationStatusTable.createModel); -db.address = sequelize.import('address', addressTable.createModel); -db.block = sequelize.import('block', blockTable.createModel); -db.claim = sequelize.import('claim', claimTable.createModel); -db.gorp_migrations = sequelize.import('gorp_migrations', gorpMigrationsTable.createModel); -db.input = sequelize.import('input', inputTable.createModel); -db.job_status = sequelize.import('job_status', jobStatusTable.createModel); -db.output = sequelize.import('output', outputTable.createModel); -db.support = sequelize.import('support', supportTable.createModel); -db.transaction_address = sequelize.import('transaction_address', transactionAddressTable.createModel); -db.transaction = sequelize.import('transaction', transactionTable.createModel); +const DATABASE_STRUCTURE_KEYS = Object.keys(DATABASE_STRUCTURE); + +for(let i = 0; i < DATABASE_STRUCTURE_KEYS.length; i++) { + let dbKey = DATABASE_STRUCTURE_KEYS[i]; + let currentData = DATABASE_STRUCTURE[dbKey]; + + db[dbKey] = currentData.table.createModel(sequelize, Sequelize); + db[dbKey].queries = currentData.queries(db, db[dbKey]); +} // run model.association for each model in the db object that has an association logger.info('associating chainquery db models...'); -Object.keys(db).forEach(modelName => { +DATABASE_STRUCTURE_KEYS.forEach(modelName => { if (db[modelName].associate) { logger.info('Associating chainquery model:', modelName); db[modelName].associate(db); diff --git a/server/chainquery/models/AbnormalClaimModel.js b/server/chainquery/models/AbnormalClaimModel.js index 665953ff..519aa55f 100644 --- a/server/chainquery/models/AbnormalClaimModel.js +++ b/server/chainquery/models/AbnormalClaimModel.js @@ -59,7 +59,7 @@ export default (sequelize, { }, { freezeTableName: true, - getterMethods, + //getterMethods, timestamps: false, // don't use default timestamps columns } ); diff --git a/server/chainquery/models/AddressModel.js b/server/chainquery/models/AddressModel.js index 1d0d6ad1..b110dd8d 100644 --- a/server/chainquery/models/AddressModel.js +++ b/server/chainquery/models/AddressModel.js @@ -31,7 +31,7 @@ export default (sequelize, { }, { freezeTableName: true, - getterMethods, + //getterMethods, timestamps: false, // don't use default timestamps columns } ); diff --git a/server/chainquery/models/ApplicationStatusModel.js b/server/chainquery/models/ApplicationStatusModel.js deleted file mode 100644 index 643d075f..00000000 --- a/server/chainquery/models/ApplicationStatusModel.js +++ /dev/null @@ -1,33 +0,0 @@ -const getterMethods = { - // Add as needed, prefix all methods with `generated` -} - -export default (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL -}) => sequelize.define( - 'application_status', - { - id: { - primaryKey: true, - type: INTEGER, - set() { }, - }, - app_version: { - type: INTEGER, - set() { }, - }, - data_version: { - type: INTEGER, - set() { }, - }, - api_version: { - type: INTEGER, - set() { }, - }, - }, - { - freezeTableName: true, - getterMethods, - timestamps: false, // don't use default timestamps columns - } -); diff --git a/server/chainquery/models/BlockModel.js b/server/chainquery/models/BlockModel.js index 522156a5..0d88f272 100644 --- a/server/chainquery/models/BlockModel.js +++ b/server/chainquery/models/BlockModel.js @@ -91,7 +91,7 @@ export default (sequelize, { }, { freezeTableName: true, - getterMethods, + //getterMethods, timestamps: false, // don't use default timestamps columns } ); diff --git a/server/chainquery/models/ClaimModel.js b/server/chainquery/models/ClaimModel.js index 260b96f4..45886d8d 100644 --- a/server/chainquery/models/ClaimModel.js +++ b/server/chainquery/models/ClaimModel.js @@ -3,7 +3,7 @@ const logger = require('winston'); const { assetDefaults: { thumbnail: defaultThumbnail }, details: { host } -} = require('../../../config/siteConfig'); // TODO: Change back to '@config/siteConfig' when done testing +} = require('../../config/siteConfig'); // TODO: Fix paths for rollup const getterMethods = { generated_extension() { diff --git a/server/chainquery/models/GorpMigrationsModel.js b/server/chainquery/models/GorpMigrationsModel.js deleted file mode 100644 index cbbb9614..00000000 --- a/server/chainquery/models/GorpMigrationsModel.js +++ /dev/null @@ -1,25 +0,0 @@ -const getterMethods = { - // Add as needed, prefix all methods with `generated` -} - -export default (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL -}) => sequelize.define( - 'gorp_migrations', - { - id: { - primaryKey: true, - type: INTEGER, - set() { }, - }, - applied_at: { - type: INTEGER, - set() { }, - }, - }, - { - freezeTableName: true, - getterMethods, - timestamps: false, // don't use default timestamps columns - } -); diff --git a/server/chainquery/models/InputModel.js b/server/chainquery/models/InputModel.js index e77ec76f..5a37d522 100644 --- a/server/chainquery/models/InputModel.js +++ b/server/chainquery/models/InputModel.js @@ -71,7 +71,7 @@ export default (sequelize, { }, { freezeTableName: true, - getterMethods, + //getterMethods, timestamps: false, // don't use default timestamps columns } ); diff --git a/server/chainquery/models/JobStatusModel.js b/server/chainquery/models/JobStatusModel.js deleted file mode 100644 index 768c4247..00000000 --- a/server/chainquery/models/JobStatusModel.js +++ /dev/null @@ -1,33 +0,0 @@ -const getterMethods = { - // Add as needed, prefix all methods with `generated` -} - -export default (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL -}) => sequelize.define( - 'job_status', - { - job_name: { - primaryKey: true, - type: STRING, - set() { }, - }, - last_sync: { - type: INTEGER, - set() { }, - }, - is_success: { - type: INTEGER, - set() { }, - }, - error_message: { - type: TEXT, - set() { }, - } - }, - { - freezeTableName: true, - getterMethods, - timestamps: false, // don't use default timestamps columns - } -); diff --git a/server/chainquery/models/OutputModel.js b/server/chainquery/models/OutputModel.js index e2007115..147b06db 100644 --- a/server/chainquery/models/OutputModel.js +++ b/server/chainquery/models/OutputModel.js @@ -71,7 +71,7 @@ export default (sequelize, { }, { freezeTableName: true, - getterMethods, + //getterMethods, timestamps: false, // don't use default timestamps columns } ); diff --git a/server/chainquery/models/SupportModel.js b/server/chainquery/models/SupportModel.js index ffe29972..b214e402 100644 --- a/server/chainquery/models/SupportModel.js +++ b/server/chainquery/models/SupportModel.js @@ -43,7 +43,7 @@ export default (sequelize, { }, { freezeTableName: true, - getterMethods, + //getterMethods, timestamps: false, // don't use default timestamps columns } ); diff --git a/server/chainquery/models/TransactionAddressModel.js b/server/chainquery/models/TransactionAddressModel.js index 8bea1fcf..7cd733ca 100644 --- a/server/chainquery/models/TransactionAddressModel.js +++ b/server/chainquery/models/TransactionAddressModel.js @@ -12,7 +12,7 @@ export default (sequelize, { type: INTEGER, set() { }, }, - addess_id: { + address_id: { primaryKey: true, type: INTEGER, set() { }, @@ -28,7 +28,7 @@ export default (sequelize, { }, { freezeTableName: true, - getterMethods, + //getterMethods, timestamps: false, // don't use default timestamps columns } ); diff --git a/server/chainquery/models/TransactionModel.js b/server/chainquery/models/TransactionModel.js index 57b8b74b..9287e01d 100644 --- a/server/chainquery/models/TransactionModel.js +++ b/server/chainquery/models/TransactionModel.js @@ -67,7 +67,7 @@ export default (sequelize, { }, { freezeTableName: true, - getterMethods, + //getterMethods, timestamps: false, // don't use default timestamps columns } ); diff --git a/server/chainquery/queries/abnormalClaimQueries.js b/server/chainquery/queries/abnormalClaimQueries.js new file mode 100644 index 00000000..4cd309e8 --- /dev/null +++ b/server/chainquery/queries/abnormalClaimQueries.js @@ -0,0 +1,3 @@ +export default (db, table) => ({ + example: () => table.findAll(), +}) diff --git a/server/chainquery/queries/addressQueries.js b/server/chainquery/queries/addressQueries.js new file mode 100644 index 00000000..4cd309e8 --- /dev/null +++ b/server/chainquery/queries/addressQueries.js @@ -0,0 +1,3 @@ +export default (db, table) => ({ + example: () => table.findAll(), +}) diff --git a/server/chainquery/queries/blockQueries.js b/server/chainquery/queries/blockQueries.js new file mode 100644 index 00000000..4cd309e8 --- /dev/null +++ b/server/chainquery/queries/blockQueries.js @@ -0,0 +1,3 @@ +export default (db, table) => ({ + example: () => table.findAll(), +}) diff --git a/server/chainquery/queries/claimQueries.js b/server/chainquery/queries/claimQueries.js new file mode 100644 index 00000000..8f56f922 --- /dev/null +++ b/server/chainquery/queries/claimQueries.js @@ -0,0 +1,184 @@ +const logger = require('winston'); + +const returnShortId = (claimsArray, longId) => { + let claimIndex; + let shortId = longId.substring(0, 1); // default short id is the first letter + let shortIdLength = 0; + // find the index of this claim id + claimIndex = claimsArray.findIndex(element => { + return element.claim_id === longId; + }); + if (claimIndex < 0) { + throw new Error('claim id not found in claims list'); + } + // get an array of all claims with lower height + let possibleMatches = claimsArray.slice(0, claimIndex); + // remove certificates with the same prefixes until none are left. + while (possibleMatches.length > 0) { + shortIdLength += 1; + shortId = longId.substring(0, shortIdLength); + possibleMatches = possibleMatches.filter(element => { + return (element.claim_id && (element.claim_id.substring(0, shortIdLength) === shortId)); + }); + } + return shortId; +}; + +const isLongClaimId = (claimId) => { + return (claimId && (claimId.length === 40)); +} + +const isShortClaimId = (claimId) => { + return (claimId && (claimId.length < 40)); +} + +export default (db, table) => ({ + + getShortClaimIdFromLongClaimId: async (claimId, claimName) => { + logger.debug(`claim.getShortClaimIdFromLongClaimId for ${claimName}#${claimId}`); + return await table.findAll({ + where: { name: claimName }, + order: [['height', 'ASC']], + }).then(result => { + if(result.length === 0) { + throw new Error('No claim(s) found with that claim name'); + } + + return returnShortId(result, claimId); + }); + }, + + getAllChannelClaims: async (channelClaimId) => { + logger.debug(`claim.getAllChannelClaims for ${channelClaimId}`); + return await table.findAll({ + where: { publisher_id: channelClaimId }, + order: [['height', 'DESC']], + raw : true, // returns an array of only data, not an array of instances + }) + .then(channelClaimsArray => { + if(channelClaimsArray.length === 0) { + return null; + } + + return channelClaimsArray; + }) + }, + + getClaimIdByLongChannelId: async (channelClaimId, claimName) => { + logger.debug(`finding claim id for claim ${claimName} from channel ${channelClaimId}`); + return await table.findAll({ + where: { name: claimName, publisher_id: channelClaimId }, + order: [['id', 'ASC']], + }) + .then(result => { + switch (result.length) { + case 0: + return null; + case 1: + return result[0].claim_id; + default: + // Does this actually happen??? (from converted code) + logger.warn(`${result.length} records found for "${claimName}" in channel "${channelClaimId}"`); + return result[0].claim_id; + } + }); + }, + + validateLongClaimId: async (name, claimId) => { + return await table.findOne({ + where: { + name, + claim_id: claimId, + }, + }).then(result => { + if (!result) { + return false; + } + return claimId; + }); + }, + + getLongClaimIdFromShortClaimId: async (name, shortId) => { + return await table.findAll({ + where: { + name, + claim_id: { + [sequelize.Op.like]: `${shortId}%`, + }}, + order: [['height', 'ASC']], + }) + .then(result => { + if(result.length === 0) { + return null; + } + + return result[0].claim_id; + }); + }, + + getTopFreeClaimIdByClaimName: async (name) => { + return await table.findAll({ + // TODO: Limit 1 + where: { name }, + order: [['effective_amount', 'DESC'], ['height', 'ASC']], + }).then(result => { + if(result.length === 0) { + return null; + } + return result[0].claim_id; + }) + }, + + getLongClaimId: async (claimName, claimId) => { + // TODO: Add failure case + logger.debug(`getLongClaimId(${claimName}, ${claimId})`); + if (isLongClaimId(claimId)) { + return table.queries.validateLongClaimId(claimName, claimId); + } else if (isShortClaimId(claimId)) { + return table.queries.getLongClaimIdFromShortClaimId(claimName, claimId); + } else { + return table.queries.getTopFreeClaimIdByClaimName(claimName); + } + }, + + resolveClaim: async (name, claimId) => { + logger.debug(`Claim.resolveClaim: ${name} ${claimId}`); + return table.findAll({ + where: { name, claim_id: claimId }, + }).then(claimArray => { + if(claimArray.length === 0) { + return null; + } else if(claimArray.length !== 1) { + logger.warn(`more than one record matches ${name}#${claimId} in db.Claim`); + } + + return claimArray[0]; + }); + }, + + getOutpoint: async (name, claimId) => { + logger.debug(`finding outpoint for ${name}#${claimId}`); + + return await table.findAll({ + where : { name, claim_id: claimId }, + attributes: ['transaction_hash_id'], + }).then(result => { + if(result.length === 0) { + throw new Error(`no record found for ${name}#${claimId}`); + } else if(result.length !== 1) { + logger.warn(`more than one record matches ${name}#${claimId} in db.Claim`); + } + + return result[0].transaction_hash_id; + }); + }, + + getCurrentHeight: async () => { + return await table + .max('height') + .then(result => { + return (result || 100000); + }); + }, + +}) diff --git a/server/chainquery/queries/inputQueries.js b/server/chainquery/queries/inputQueries.js new file mode 100644 index 00000000..4cd309e8 --- /dev/null +++ b/server/chainquery/queries/inputQueries.js @@ -0,0 +1,3 @@ +export default (db, table) => ({ + example: () => table.findAll(), +}) diff --git a/server/chainquery/queries/outputQueries.js b/server/chainquery/queries/outputQueries.js new file mode 100644 index 00000000..4cd309e8 --- /dev/null +++ b/server/chainquery/queries/outputQueries.js @@ -0,0 +1,3 @@ +export default (db, table) => ({ + example: () => table.findAll(), +}) diff --git a/server/chainquery/queries/supportQueries.js b/server/chainquery/queries/supportQueries.js new file mode 100644 index 00000000..4cd309e8 --- /dev/null +++ b/server/chainquery/queries/supportQueries.js @@ -0,0 +1,3 @@ +export default (db, table) => ({ + example: () => table.findAll(), +}) diff --git a/server/chainquery/queries/transactionAddressQueries.js b/server/chainquery/queries/transactionAddressQueries.js new file mode 100644 index 00000000..4cd309e8 --- /dev/null +++ b/server/chainquery/queries/transactionAddressQueries.js @@ -0,0 +1,3 @@ +export default (db, table) => ({ + example: () => table.findAll(), +}) diff --git a/server/chainquery/queries/transactionQueries.js b/server/chainquery/queries/transactionQueries.js new file mode 100644 index 00000000..4cd309e8 --- /dev/null +++ b/server/chainquery/queries/transactionQueries.js @@ -0,0 +1,3 @@ +export default (db, table) => ({ + example: () => table.findAll(), +}) diff --git a/server/chainquery/tables/abnormalClaimTable.js b/server/chainquery/tables/abnormalClaimTable.js index 1d696ce6..76d211f2 100644 --- a/server/chainquery/tables/abnormalClaimTable.js +++ b/server/chainquery/tables/abnormalClaimTable.js @@ -7,5 +7,5 @@ export default { associate(db) { // associate - } + }, } diff --git a/server/chainquery/tables/addressTable.js b/server/chainquery/tables/addressTable.js index a1bf2061..0489bde4 100644 --- a/server/chainquery/tables/addressTable.js +++ b/server/chainquery/tables/addressTable.js @@ -7,5 +7,5 @@ export default { associate(db) { // associate - } + }, } diff --git a/server/chainquery/tables/applicationStatusTable.js b/server/chainquery/tables/applicationStatusTable.js deleted file mode 100644 index 2b8b14e9..00000000 --- a/server/chainquery/tables/applicationStatusTable.js +++ /dev/null @@ -1,11 +0,0 @@ -import ApplicationStatusModel from '../models/ApplicationStatusModel'; - -export default { - createModel(...args) { - return ApplicationStatusModel(...args); - }, - - associate(db) { - // associate - } -} diff --git a/server/chainquery/tables/blockTable.js b/server/chainquery/tables/blockTable.js index 86bafdc4..615eebaf 100644 --- a/server/chainquery/tables/blockTable.js +++ b/server/chainquery/tables/blockTable.js @@ -7,5 +7,5 @@ export default { associate(db) { // associate - } + }, } diff --git a/server/chainquery/tables/claimTable.js b/server/chainquery/tables/claimTable.js index ee43638d..cb616dc2 100644 --- a/server/chainquery/tables/claimTable.js +++ b/server/chainquery/tables/claimTable.js @@ -7,5 +7,5 @@ export default { associate(db) { // associate - } + }, } diff --git a/server/chainquery/tables/gorpMigrationsTable.js b/server/chainquery/tables/gorpMigrationsTable.js deleted file mode 100644 index 173ef6a9..00000000 --- a/server/chainquery/tables/gorpMigrationsTable.js +++ /dev/null @@ -1,11 +0,0 @@ -import GorpMigrationsModel from '../models/GorpMigrationsModel'; - -export default { - createModel(...args) { - return GorpMigrationsModel(...args); - }, - - associate(db) { - // associate - } -} diff --git a/server/chainquery/tables/inputTable.js b/server/chainquery/tables/inputTable.js index 3add28f7..d1aa3489 100644 --- a/server/chainquery/tables/inputTable.js +++ b/server/chainquery/tables/inputTable.js @@ -7,5 +7,5 @@ export default { associate(db) { // associate - } + }, } diff --git a/server/chainquery/tables/jobStatusTable.js b/server/chainquery/tables/jobStatusTable.js deleted file mode 100644 index 76042c1b..00000000 --- a/server/chainquery/tables/jobStatusTable.js +++ /dev/null @@ -1,11 +0,0 @@ -import JobStatusModel from '../models/JobStatusModel'; - -export default { - createModel(...args) { - return JobStatusModel(...args); - }, - - associate(db) { - // associate - } -} diff --git a/server/chainquery/tables/outputTable.js b/server/chainquery/tables/outputTable.js index d00d0bac..d52bf8dc 100644 --- a/server/chainquery/tables/outputTable.js +++ b/server/chainquery/tables/outputTable.js @@ -7,5 +7,5 @@ export default { associate(db) { // associate - } + }, } diff --git a/server/chainquery/tables/supportTable.js b/server/chainquery/tables/supportTable.js index 82a81dcd..696f0806 100644 --- a/server/chainquery/tables/supportTable.js +++ b/server/chainquery/tables/supportTable.js @@ -7,5 +7,5 @@ export default { associate(db) { // associate - } + }, } diff --git a/server/chainquery/tables/transactionAddressTable.js b/server/chainquery/tables/transactionAddressTable.js index 4d19bb09..1ad29d07 100644 --- a/server/chainquery/tables/transactionAddressTable.js +++ b/server/chainquery/tables/transactionAddressTable.js @@ -7,5 +7,5 @@ export default { associate(db) { // associate - } + }, } diff --git a/server/chainquery/tables/transactionTable.js b/server/chainquery/tables/transactionTable.js index 771c8a76..5f630e8d 100644 --- a/server/chainquery/tables/transactionTable.js +++ b/server/chainquery/tables/transactionTable.js @@ -7,5 +7,5 @@ export default { associate(db) { // associate - } + }, } diff --git a/server/controllers/api/channel/claims/getChannelClaims.js b/server/controllers/api/channel/claims/getChannelClaims.js index d9787bf3..213b769e 100644 --- a/server/controllers/api/channel/claims/getChannelClaims.js +++ b/server/controllers/api/channel/claims/getChannelClaims.js @@ -1,28 +1,15 @@ const db = require('../../../../models'); +const chainquery = require('chainquery'); +const getClaimData = require('server/utils/getClaimData'); const { returnPaginatedChannelClaims } = require('./channelPagination.js'); -const getChannelClaims = (channelName, channelClaimId, page) => { - return new Promise((resolve, reject) => { - let longChannelClaimId; - // 1. get the long channel Id (make sure channel exists) - db.Certificate - .getLongChannelId(channelName, channelClaimId) - .then(result => { - longChannelClaimId = result; - return db - .Claim - .getAllChannelClaims(longChannelClaimId); - }) - .then(channelClaimsArray => { - // 3. format the data for the view, including pagination - let paginatedChannelViewData = returnPaginatedChannelClaims(channelName, longChannelClaimId, channelClaimsArray, page); - // 4. return all the channel information and contents - resolve(paginatedChannelViewData); - }) - .catch(error => { - reject(error); - }); - }); +const getChannelClaims = async (channelName, channelShortId, page) => { + const channelId = await chainquery.claim.queries.getLongClaimId(channelName, channelShortId); + const channelClaims = await chainquery.claim.queries.getAllChannelClaims(channelId); + + const processedChannelClaims = channelClaims.map((claim) => getClaimData(claim)); + + return returnPaginatedChannelClaims(channelName, channelId, processedChannelClaims, page); }; module.exports = getChannelClaims; diff --git a/server/controllers/api/claim/availability/checkClaimAvailability.js b/server/controllers/api/claim/availability/checkClaimAvailability.js index 37ecdfda..99a57c6c 100644 --- a/server/controllers/api/claim/availability/checkClaimAvailability.js +++ b/server/controllers/api/claim/availability/checkClaimAvailability.js @@ -1,18 +1,18 @@ -const db = require('../../../../models'); +const chainquery = require('chainquery'); const { publishing: { primaryClaimAddress, additionalClaimAddresses } } = require('@config/siteConfig'); const Sequelize = require('sequelize'); const Op = Sequelize.Op; -const claimAvailability = (name) => { +const claimAvailability = async (name) => { const claimAddresses = additionalClaimAddresses || []; claimAddresses.push(primaryClaimAddress); // find any records where the name is used - return db.Claim + return await chainquery.claim .findAll({ - attributes: ['address'], + attributes: ['claim_address'], where : { name, - address: { + claim_address: { [Op.or]: claimAddresses, }, }, diff --git a/server/controllers/api/claim/data/index.js b/server/controllers/api/claim/data/index.js index 5377f39f..0eeedd3d 100644 --- a/server/controllers/api/claim/data/index.js +++ b/server/controllers/api/claim/data/index.js @@ -1,4 +1,6 @@ const { handleErrorResponse } = require('../../../utils/errorHandlers.js'); +const getClaimData = require('server/utils/getClaimData'); +const chainquery = require('chainquery'); const db = require('../../../../models'); /* @@ -11,7 +13,14 @@ const claimData = ({ ip, originalUrl, body, params }, res) => { const claimName = params.claimName; let claimId = params.claimId; if (claimId === 'none') claimId = null; - db.Claim.resolveClaim(claimName, claimId) + chainquery.claim.queries.resolveClaim(claimName, claimId) + .then(claimInfo => { + if (!claimInfo) { + // Not found remote, try local + return db.Claim.resolveClaim(claimName, claimId) + } + return claimInfo + }) .then(claimInfo => { if (!claimInfo) { return res.status(404).json({ @@ -21,7 +30,7 @@ const claimData = ({ ip, originalUrl, body, params }, res) => { } res.status(200).json({ success: true, - data : claimInfo, + data : getClaimData(claimInfo), }); }) .catch(error => { diff --git a/server/controllers/api/claim/get/index.js b/server/controllers/api/claim/get/index.js index 9a2109ae..fc2df8fb 100644 --- a/server/controllers/api/claim/get/index.js +++ b/server/controllers/api/claim/get/index.js @@ -1,6 +1,8 @@ const { getClaim } = require('../../../../lbrynet'); const { createFileRecordDataAfterGet } = require('../../../../models/utils/createFileRecordData.js'); const { handleErrorResponse } = require('../../../utils/errorHandlers.js'); +const getClaimData = require('server/utils/getClaimData'); +const chainquery = require('chainquery'); const db = require('../../../../models'); /* @@ -15,21 +17,37 @@ const claimGet = ({ ip, originalUrl, params }, res) => { let resolveResult; let getResult; - db.Claim.resolveClaim(name, claimId) + + + chainquery.claim.queries.resolveClaim(name, claimId) + .then(result => { + if (!result) { + // could not find remote, return false to try local + return false; + } + return resolveResult = result; + }) + .then(result => { + if (result === false) { + // Could not find remote, try local + return db.Claim.resolveClaim(name, claimId); + } + return result; + }) .then(result => { if (!result) { throw new Error('No matching uri found in Claim table'); } - resolveResult = result; - return getClaim(`${name}#${claimId}`); + return resolveResult = result; }) + .then(result => getClaim(`${name}#${claimId}`)) .then(result => { if (!result) { throw new Error(`Unable to Get ${name}#${claimId}`); } getResult = result; if (result.completed) { - return createFileRecordDataAfterGet(resolveResult, getResult) + return createFileRecordDataAfterGet(getClaimData(resolveResult), getResult) .then(fileData => { const upsertCriteria = {name, claimId}; return db.upsert(db.File, fileData, upsertCriteria, 'File'); diff --git a/server/controllers/api/claim/longId/index.js b/server/controllers/api/claim/longId/index.js index c2c91d04..93f616af 100644 --- a/server/controllers/api/claim/longId/index.js +++ b/server/controllers/api/claim/longId/index.js @@ -1,4 +1,5 @@ const db = require('../../../../models'); +const chainquery = require('chainquery'); const { handleErrorResponse } = require('../../../utils/errorHandlers.js'); @@ -22,7 +23,13 @@ const claimLongId = ({ ip, originalUrl, body, params }, res) => { getClaimId(channelName, channelClaimId, claimName, claimId) .then(fullClaimId => { claimId = fullClaimId; - return db.Claim.getOutpoint(claimName, fullClaimId); + return chainquery.claim.queries.getOutpoint(claimName, fullClaimId); + }) + .then(outpointResult => { + if (!outpointResult) { + return db.Claim.getOutpoint(claimName, fullClaimId); + } + return outpointResult; }) .then(outpoint => { return db.Blocked.isNotBlocked(outpoint); diff --git a/server/utils/getClaimData.js b/server/utils/getClaimData.js new file mode 100644 index 00000000..8b84b3f7 --- /dev/null +++ b/server/utils/getClaimData.js @@ -0,0 +1,13 @@ +const { details: { host } } = require('@config/siteConfig'); + +module.exports = (data) => ({ + name: data.name, + title: data.title, + contentType: data.content_type || data.contentType, + claimId: data.claim_id || data.claimId, + fileExt: data.generated_extension || data.fileExt, + description: data.description, + thumbnail: data.generated_thumbnail || data.thumbnail, + outpoint: data.transaction_hash_id || data.outpoint, + host, +}) diff --git a/utils/createModuleAliases.js b/utils/createModuleAliases.js index 20eb89f2..1fae4c7a 100644 --- a/utils/createModuleAliases.js +++ b/utils/createModuleAliases.js @@ -36,9 +36,13 @@ const addAlliasesForSCSS = (aliasObject) => { // scss module.exports = () => { let moduleAliases = {}; + + moduleAliases['chainquery'] = resolve('./server/chainquery/bundle'); + moduleAliases['server'] = resolve('./server'); + // aliases for configs - moduleAliases['@config'] = resolve(`config`); - moduleAliases['@devConfig'] = resolve(`devConfig`); + moduleAliases['@config'] = resolve('config'); + moduleAliases['@devConfig'] = resolve('devConfig'); // create specific aliases for locally defined components in the following folders moduleAliases = addAliasesForCustomComponentFolder('containers', moduleAliases); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..b391bc0c --- /dev/null +++ b/yarn.lock @@ -0,0 +1,8231 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/cli@^7.0.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.1.0.tgz#a9429fd63911711b0fa93ae50d73beee6c42aef8" + dependencies: + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.1.0" + glob "^7.0.0" + lodash "^4.17.10" + mkdirp "^0.5.1" + output-file-sync "^2.0.0" + slash "^2.0.0" + source-map "^0.5.0" + optionalDependencies: + chokidar "^2.0.3" + +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@^7.0.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.1.0.tgz#08958f1371179f62df6966d8a614003d11faeb04" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.0.0" + "@babel/helpers" "^7.1.0" + "@babel/parser" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + convert-source-map "^1.1.0" + debug "^3.1.0" + json5 "^0.5.0" + lodash "^4.17.10" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0.tgz#1efd58bffa951dc846449e58ce3a1d7f02d393aa" + dependencies: + "@babel/types" "^7.0.0" + jsesc "^2.5.1" + lodash "^4.17.10" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-builder-react-jsx@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0.tgz#fa154cb53eb918cf2a9a7ce928e29eb649c5acdb" + dependencies: + "@babel/types" "^7.0.0" + esutils "^2.0.0" + +"@babel/helper-call-delegate@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-define-map@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.1.0.tgz#470d4f9676d9fad50b324cdcce5fbabbc3da5787" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + +"@babel/helper-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" + dependencies: + lodash "^4.17.10" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz#5fc31de522ec0ef0899dc9b3e7cf6a5dd655f362" + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-wrap-function@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.1.0.tgz#8cf54e9190706067f016af8f75cb3df829cc8c66" + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helpers@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.1.0.tgz#429bf0f0020be56a4242883432084e3d70a8a141" + dependencies: + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.0.tgz#a7cd42cb3c12aec52e24375189a47b39759b783e" + +"@babel/plugin-proposal-async-generator-functions@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.1.0.tgz#41c1a702e10081456e23a7b74d891922dd1bb6ce" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.0.0" + +"@babel/plugin-proposal-json-strings@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.0.0.tgz#3b4d7b5cf51e1f2e70f52351d28d44fc2970d01e" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.0.0" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz#9a17b547f64d0676b6c9cecd4edf74a82ab85e7e" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0.tgz#b610d928fe551ff7117d42c8bb410eec312a6425" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0.tgz#498b39cd72536cd7c4b26177d030226eba08cd33" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.2.0" + +"@babel/plugin-syntax-async-generators@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0.tgz#bf0891dcdbf59558359d0c626fdc9490e20bc13c" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.0.0.tgz#0d259a68090e15b383ce3710e01d5b23f3770cbd" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-jsx@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.0.0.tgz#034d5e2b4e14ccaea2e4c137af7e4afb39375ffd" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0.tgz#37d8fbcaf216bd658ea1aebbeb8b75e88ebc549b" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0.tgz#886f72008b3a8b185977f7cb70713b45e51ee475" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz#a6c14875848c68a3b4b3163a486535ef25c7e749" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.1.0.tgz#109e036496c51dd65857e16acab3bafdf3c57811" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0.tgz#482b3f75103927e37288b3b67b65f848e2aa0d07" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0.tgz#1745075edffd7cdaf69fab2fb6f9694424b7e9bc" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.10" + +"@babel/plugin-transform-classes@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.1.0.tgz#ab3f8a564361800cbc8ab1ca6f21108038432249" + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.1.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz#2fbb8900cd3e8258f2a2ede909b90e7556185e31" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0.tgz#68e911e1935dda2f06b6ccbbf184ffb024e9d43a" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0.tgz#73a24da69bc3c370251f43a3d048198546115e58" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/plugin-transform-duplicate-keys@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0.tgz#a0601e580991e7cace080e4cf919cfd58da74e86" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.1.0.tgz#9c34c2ee7fd77e02779cfa37e403a2e1003ccc73" + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0.tgz#f2ba4eadb83bd17dc3c7e9b30f4707365e1c3e39" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.1.0.tgz#29c5550d5c46208e7f730516d41eeddd4affadbb" + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0.tgz#2aec1d29cdd24c407359c930cdd89e914ee8ff86" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.1.0.tgz#f9e0a7072c12e296079b5a59f408ff5b97bf86a8" + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.1.0.tgz#0a9d86451cbbfb29bd15186306897c67f6f9a05c" + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + +"@babel/plugin-transform-modules-systemjs@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0.tgz#8873d876d4fee23209decc4d1feab8f198cf2df4" + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-umd@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.1.0.tgz#a29a7d85d6f28c3561c33964442257cc6a21f2a8" + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-new-target@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.1.0.tgz#b1ae194a054b826d8d4ba7ca91486d4ada0f91bb" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + +"@babel/plugin-transform-parameters@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.1.0.tgz#44f492f9d618c9124026e62301c296bf606a7aed" + dependencies: + "@babel/helper-call-delegate" "^7.1.0" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.0.0.tgz#93759e6c023782e52c2da3b75eca60d4f10533ee" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-jsx-self@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.0.0.tgz#a84bb70fea302d915ea81d9809e628266bb0bc11" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + +"@babel/plugin-transform-react-jsx-source@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.0.0.tgz#28e00584f9598c0dd279f6280eee213fa0121c3c" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.0.0.tgz#524379e4eca5363cd10c4446ba163f093da75f3e" + dependencies: + "@babel/helper-builder-react-jsx" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" + dependencies: + regenerator-transform "^0.13.3" + +"@babel/plugin-transform-shorthand-properties@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0.tgz#85f8af592dcc07647541a0350e8c95c7bf419d15" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0.tgz#93583ce48dd8c85e53f3a46056c856e4af30b49b" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0.tgz#30a9d64ac2ab46eec087b8530535becd90e73366" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0.tgz#084f1952efe5b153ddae69eb8945f882c7a97c65" + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0.tgz#4dcf1e52e943e5267b7313bff347fdbe0f81cec9" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz#c6780e5b1863a76fe792d90eded9fcd5b51d68fc" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/polyfill@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.0.0.tgz#c8ff65c9ec3be6a1ba10113ebd40e8750fb90bff" + dependencies: + core-js "^2.5.7" + regenerator-runtime "^0.11.1" + +"@babel/preset-env@^7.0.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.1.0.tgz#e67ea5b0441cfeab1d6f41e9b5c79798800e8d11" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.1.0" + "@babel/plugin-proposal-json-strings" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.0.0" + "@babel/plugin-syntax-async-generators" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.1.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.1.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-dotall-regex" "^7.0.0" + "@babel/plugin-transform-duplicate-keys" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator" "^7.1.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.1.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-amd" "^7.1.0" + "@babel/plugin-transform-modules-commonjs" "^7.1.0" + "@babel/plugin-transform-modules-systemjs" "^7.0.0" + "@babel/plugin-transform-modules-umd" "^7.1.0" + "@babel/plugin-transform-new-target" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.1.0" + "@babel/plugin-transform-parameters" "^7.1.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typeof-symbol" "^7.0.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + browserslist "^4.1.0" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.3.0" + +"@babel/preset-react@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + +"@babel/preset-stage-2@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-stage-2/-/preset-stage-2-7.0.0.tgz#11ec31263c8466aad63829bba724607029ddf0a5" + +"@babel/register@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.0.0.tgz#fa634bae1bfa429f60615b754fc1f1d745edd827" + dependencies: + core-js "^2.5.7" + find-cache-dir "^1.0.0" + home-or-tmp "^3.0.0" + lodash "^4.17.10" + mkdirp "^0.5.1" + pirates "^4.0.0" + source-map-support "^0.5.9" + +"@babel/template@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.0.tgz#58cc9572e1bfe24fe1537fdf99d839d53e517e22" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/traverse@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.0.tgz#503ec6669387efd182c3888c4eec07bcc45d91b2" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.0.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + debug "^3.1.0" + globals "^11.1.0" + lodash "^4.17.10" + +"@babel/types@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0.tgz#6e191793d3c854d19c6749989e3bc55f0e962118" + dependencies: + esutils "^2.0.2" + lodash "^4.17.10" + to-fast-properties "^2.0.0" + +"@types/chai@4": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.4.tgz#5ca073b330d90b4066d6ce18f60d57f2084ce8ca" + +"@types/commander@^2.11.0": + version "2.12.2" + resolved "https://registry.yarnpkg.com/@types/commander/-/commander-2.12.2.tgz#183041a23842d4281478fa5d23c5ca78e6fd08ae" + dependencies: + commander "*" + +"@types/cookiejar@*": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.0.tgz#4b7daf2c51696cfc70b942c11690528229d1a1ce" + +"@types/geojson@^1.0.0": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-1.0.6.tgz#3e02972728c69248c2af08d60a48cbb8680fffdf" + +"@types/node@*": + version "10.10.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.10.1.tgz#d5c96ca246a418404914d180b7fdd625ad18eca6" + +"@types/semver@^5.4.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-5.5.0.tgz#146c2a29ee7d3bae4bf2fcb274636e264c813c45" + +"@types/superagent@^3.8.3": + version "3.8.4" + resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-3.8.4.tgz#24a5973c7d1a9c024b4bbda742a79267c33fb86a" + dependencies: + "@types/cookiejar" "*" + "@types/node" "*" + +JSONStream@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.4.tgz#615bb2adb0cd34c8f4c447b5f6512fa1d8f16a2e" + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abbrev@1, abbrev@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + dependencies: + mime-types "~2.1.18" + negotiator "0.6.1" + +acorn-dynamic-import@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" + dependencies: + acorn "^4.0.3" + +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn@^3.0.4: + version "3.3.0" + resolved "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^4.0.3: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + +acorn@^5.0.0, acorn@^5.5.0: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + +agent-base@4, agent-base@^4.1.0, agent-base@~4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" + dependencies: + es6-promisify "^5.0.0" + +agentkeepalive@^3.4.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.1.tgz#4eba75cf2ad258fc09efd506cdb8d8c2971d35a4" + dependencies: + humanize-ms "^1.2.1" + +ajv-errors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59" + +ajv-keywords@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + +ajv-keywords@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" + +ajv@^5.0.0, ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ajv@^6.1.0: + version "6.5.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + dependencies: + string-width "^2.0.0" + +ansi-escapes@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" + +ansi-regex@^2.0.0, ansi-regex@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + +ansicolors@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + +ansistyles@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539" + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +aproba@^1.0.3, aproba@^1.1.1, aproba@^1.1.2, aproba@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + +"aproba@^1.1.2 || 2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + +arch@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" + +archy@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asap@^2.0.0, asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert@^1.1.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + dependencies: + util "0.10.3" + +assertion-error@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + +async@^1.4.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.1.2, async@^2.4.1, async@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + dependencies: + lodash "^4.17.10" + +async@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + +autoprefixer@^6.3.1: + version "6.7.7" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" + dependencies: + browserslist "^1.7.6" + caniuse-db "^1.0.30000634" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^5.2.16" + postcss-value-parser "^3.2.3" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.6.0, aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + +axios@^0.18.0: + version "0.18.0" + resolved "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102" + dependencies: + follow-redirects "^1.3.0" + is-buffer "^1.1.5" + +babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-loader@^7.1.2: + version "7.1.5" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz#e3ee0cd7394aa557e013b02d3e492bfd07aa6d68" + dependencies: + find-cache-dir "^1.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + +babel-plugin-module-resolver@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.1.1.tgz#881cf67e3d4b8400d5eaaefc1be44d2dc1fe404f" + dependencies: + find-babel-config "^1.1.0" + glob "^7.1.2" + pkg-up "^2.0.0" + reselect "^3.0.1" + resolve "^1.4.0" + +babel-runtime@^6.23.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +balanced-match@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base64-js@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" + +base64-js@^1.0.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + dependencies: + tweetnacl "^0.14.3" + +bcrypt@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-2.0.1.tgz#229c5afe09379789f918efe86e5e5b682e509f85" + dependencies: + nan "2.10.0" + node-pre-gyp "0.9.1" + +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + +bin-links@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.2.tgz#fb74bd54bae6b7befc6c6221f25322ac830d9757" + dependencies: + bluebird "^3.5.0" + cmd-shim "^2.0.2" + gentle-fs "^2.0.0" + graceful-fs "^4.1.11" + write-file-atomic "^2.3.0" + +binary-extensions@^1.0.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + +bl@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^3.4.1, bluebird@^3.4.6, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@~3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a" + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + +body-parser@1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.1" + http-errors "~1.6.2" + iconv-lite "0.4.19" + on-finished "~2.3.0" + qs "6.5.1" + raw-body "2.3.2" + type-is "~1.6.15" + +body-parser@^1.18.3: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" + on-finished "~2.3.0" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" + +boom@4.x.x: + version "4.3.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + dependencies: + hoek "4.x.x" + +boom@5.x.x: + version "5.2.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + dependencies: + hoek "4.x.x" + +boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.0, braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + dependencies: + pako "~1.0.5" + +browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: + version "1.7.7" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" + dependencies: + caniuse-db "^1.0.30000639" + electron-to-chromium "^1.2.7" + +browserslist@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.1.1.tgz#328eb4ff1215b12df6589e9ab82f8adaa4fc8cd6" + dependencies: + caniuse-lite "^1.0.30000884" + electron-to-chromium "^1.3.62" + node-releases "^1.0.0-alpha.11" + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + +buffer-alloc@^1.1.0, buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + +buffer@^3.0.1: + version "3.6.0" + resolved "http://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb" + dependencies: + base64-js "0.0.8" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffer@^4.3.0: + version "4.9.1" + resolved "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builder@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/builder/-/builder-4.0.0.tgz#590ce9999b749be1ec7b122511e58e785a58adea" + dependencies: + async "^1.4.2" + chalk "^1.1.1" + js-yaml "^3.4.3" + lodash "^3.10.1" + nopt "^4.0.1" + tree-kill "^1.0.0" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + +byline@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" + +byte-size@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-4.0.3.tgz#b7c095efc68eadf82985fccd9a2df43a74fa2ccd" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + +cacache@^10.0.4: + version "10.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^2.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^5.2.4" + unique-filename "^1.1.0" + y18n "^4.0.0" + +cacache@^11.0.1, cacache@^11.0.2, cacache@^11.2.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.2.0.tgz#617bdc0b02844af56310e411c0878941d5739965" + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + figgy-pudding "^3.1.0" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.3" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^6.0.0" + unique-filename "^1.1.0" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-limit@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/call-limit/-/call-limit-1.1.0.tgz#6fd61b03f3da42a2cd0ec2b60f02bd0e71991fea" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +camelcase@^4.0.0, camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + +camelize@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" + +caniuse-api@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" + dependencies: + browserslist "^1.3.6" + caniuse-db "^1.0.30000529" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: + version "1.0.30000885" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000885.tgz#cdc98dd168ed59678650071f7f6a70910e275bc8" + +caniuse-lite@^1.0.30000884: + version "1.0.30000885" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000885.tgz#e889e9f8e7e50e769f2a49634c932b8aee622984" + +capture-stack-trace@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + +cardinal@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" + dependencies: + ansicolors "~0.3.2" + redeyed "~2.1.0" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chai-http@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/chai-http/-/chai-http-4.2.0.tgz#25dc0c0cf9560802f069092ca834a81f04c673bc" + dependencies: + "@types/chai" "4" + "@types/superagent" "^3.8.3" + cookiejar "^2.1.1" + is-ip "^2.0.0" + methods "^1.1.2" + qs "^6.5.1" + superagent "^3.7.0" + +chai@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" + dependencies: + assertion-error "^1.0.1" + check-error "^1.0.1" + deep-eql "^3.0.0" + get-func-name "^2.0.0" + pathval "^1.0.0" + type-detect "^4.0.0" + +chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + +check-error@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + +chokidar@^2.0.2, chokidar@^2.0.3, chokidar@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" + dependencies: + anymatch "^2.0.0" + async-each "^1.0.0" + braces "^2.3.0" + glob-parent "^3.1.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + lodash.debounce "^4.0.8" + normalize-path "^2.1.1" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + upath "^1.0.5" + optionalDependencies: + fsevents "^1.2.2" + +chownr@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + +chownr@~1.0.1: + version "1.0.1" + resolved "http://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + +ci-info@^1.4.0, ci-info@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.5.1.tgz#17e8eb5de6f8b2b6038f0cbb714d410bfa9f3030" + +cidr-regex@^2.0.8: + version "2.0.9" + resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-2.0.9.tgz#9c17bb2b18e15af07f7d0c3b994b961d687ed1c9" + dependencies: + ip-regex "^2.1.0" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + +clap@^1.0.9: + version "1.2.3" + resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" + dependencies: + chalk "^1.1.3" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + +cli-color@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-1.3.0.tgz#cd2ec212efbd1a0eeb5b017f17d4e2d15e91420f" + dependencies: + ansi-regex "^2.1.1" + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + memoizee "^0.4.14" + timers-ext "^0.1.5" + +cli-columns@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/cli-columns/-/cli-columns-3.1.2.tgz#6732d972979efc2ae444a1f08e08fa139c96a18e" + dependencies: + string-width "^2.0.0" + strip-ansi "^3.0.1" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-table3@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" + dependencies: + object-assign "^4.1.0" + string-width "^2.1.1" + optionalDependencies: + colors "^1.1.2" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + +clipboardy@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.3.tgz#0526361bf78724c1f20be248d428e365433c07ef" + dependencies: + arch "^2.1.0" + execa "^0.8.0" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +clone-deep@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713" + dependencies: + for-own "^1.0.0" + is-plain-object "^2.0.4" + kind-of "^6.0.0" + shallow-clone "^1.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + +cls-bluebird@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cls-bluebird/-/cls-bluebird-2.1.0.tgz#37ef1e080a8ffb55c2f4164f536f1919e7968aee" + dependencies: + is-bluebird "^1.0.2" + shimmer "^1.1.0" + +cmd-shim@^2.0.2, cmd-shim@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb" + dependencies: + graceful-fs "^4.1.2" + mkdirp "~0.5.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +coa@~1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" + dependencies: + q "^1.1.2" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.3.0, color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + dependencies: + color-name "1.1.3" + +color-name@1.1.3, color-name@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +color-string@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" + dependencies: + color-name "^1.0.0" + +color@^0.11.0: + version "0.11.4" + resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" + dependencies: + clone "^1.0.2" + color-convert "^1.3.0" + color-string "^0.3.0" + +colormin@^1.0.5: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" + dependencies: + color "^0.11.0" + css-color-names "0.0.4" + has "^1.0.1" + +colors@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +colors@^1.1.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" + +colors@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + +columnify@~1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" + dependencies: + strip-ansi "^3.0.0" + wcwidth "^1.0.0" + +combined-stream@1.0.6, combined-stream@~1.0.5, combined-stream@~1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" + +commander@*, commander@^2.11.0, commander@^2.8.1: + version "2.18.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" + +commander@2.15.1: + version "2.15.1" + resolved "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + +commander@~2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + +commander@~2.8.1: + version "2.8.1" + resolved "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" + dependencies: + graceful-readlink ">= 1.0.0" + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + +component-emitter@^1.2.0, component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@1.6.2, concat-stream@^1.5.0, concat-stream@^1.5.2, concat-stream@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +config-chain@~1.1.11, config-chain@~1.1.5: + version "1.1.12" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +connect-multiparty@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/connect-multiparty/-/connect-multiparty-2.2.0.tgz#b4932482dba298f82b8a54b70fb60ec5d72393c3" + dependencies: + http-errors "~1.7.0" + multiparty "~4.2.1" + on-finished "~2.3.0" + qs "~6.5.2" + type-is "~1.6.16" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + +content-security-policy-builder@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/content-security-policy-builder/-/content-security-policy-builder-2.0.0.tgz#8749a1d542fcbe82237281ea9f716ce68b394dd2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + +convert-source-map@^1.1.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + dependencies: + safe-buffer "~5.1.1" + +cookie-session@^2.0.0-beta.3: + version "2.0.0-beta.3" + resolved "https://registry.yarnpkg.com/cookie-session/-/cookie-session-2.0.0-beta.3.tgz#4e446bd9f85bd7e27d3e226f4e99af12011a4386" + dependencies: + cookies "0.7.1" + debug "3.1.0" + on-headers "~1.0.1" + safe-buffer "5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +cookiejar@^2.1.0, cookiejar@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" + +cookies@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.7.1.tgz#7c8a615f5481c61ab9f16c833731bcb8f663b99b" + dependencies: + depd "~1.1.1" + keygrip "~1.0.2" + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + +core-js@^2.4.0, core-js@^2.5.7: + version "2.5.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + dependencies: + capture-stack-trace "^1.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-fetch@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.2.tgz#a47ff4f7fc712daba8f6a695a11c948440d45723" + dependencies: + node-fetch "2.1.2" + whatwg-fetch "2.0.4" + +cross-spawn@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^5.0.1, cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cryptiles@3.x.x: + version "3.1.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + dependencies: + boom "5.x.x" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + +css-color-names@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + +css-loader@^0.28.11: + version "0.28.11" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.11.tgz#c3f9864a700be2711bb5a2462b2389b1a392dab7" + dependencies: + babel-code-frame "^6.26.0" + css-selector-tokenizer "^0.7.0" + cssnano "^3.10.0" + icss-utils "^2.1.0" + loader-utils "^1.0.2" + lodash.camelcase "^4.3.0" + object-assign "^4.1.1" + postcss "^5.0.6" + postcss-modules-extract-imports "^1.2.0" + postcss-modules-local-by-default "^1.2.0" + postcss-modules-scope "^1.1.0" + postcss-modules-values "^1.3.0" + postcss-value-parser "^3.3.0" + source-list-map "^2.0.0" + +css-selector-tokenizer@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" + dependencies: + cssesc "^0.1.0" + fastparse "^1.1.1" + regexpu-core "^1.0.0" + +cssesc@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" + +cssnano@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" + dependencies: + autoprefixer "^6.3.1" + decamelize "^1.1.2" + defined "^1.0.0" + has "^1.0.1" + object-assign "^4.0.1" + postcss "^5.0.14" + postcss-calc "^5.2.0" + postcss-colormin "^2.1.8" + postcss-convert-values "^2.3.4" + postcss-discard-comments "^2.0.4" + postcss-discard-duplicates "^2.0.1" + postcss-discard-empty "^2.0.1" + postcss-discard-overridden "^0.1.1" + postcss-discard-unused "^2.2.1" + postcss-filter-plugins "^2.0.0" + postcss-merge-idents "^2.1.5" + postcss-merge-longhand "^2.0.1" + postcss-merge-rules "^2.0.3" + postcss-minify-font-values "^1.0.2" + postcss-minify-gradients "^1.0.1" + postcss-minify-params "^1.0.4" + postcss-minify-selectors "^2.0.4" + postcss-normalize-charset "^1.1.0" + postcss-normalize-url "^3.0.7" + postcss-ordered-values "^2.1.0" + postcss-reduce-idents "^2.2.2" + postcss-reduce-initial "^1.0.0" + postcss-reduce-transforms "^1.0.3" + postcss-svgo "^2.1.1" + postcss-unique-selectors "^2.0.2" + postcss-value-parser "^3.2.3" + postcss-zindex "^2.0.1" + +csso@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" + dependencies: + clap "^1.0.9" + source-map "^0.5.3" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + +cycle@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +dasherize@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dasherize/-/dasherize-2.0.0.tgz#6d809c9cd0cf7bb8952d80fc84fa13d47ddb1308" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +debug@3.1.0, debug@=3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + +debug@^3.0.0, debug@^3.1.0: + version "3.2.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.5.tgz#c2418fbfd7a29f4d4f70ff4cea604d4b64c46407" + dependencies: + ms "^2.1.1" + +debuglog@*, debuglog@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" + +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + +decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" + dependencies: + file-type "^5.2.0" + is-stream "^1.1.0" + tar-stream "^1.5.2" + +decompress-tarbz2@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b" + dependencies: + decompress-tar "^4.1.0" + file-type "^6.1.0" + is-stream "^1.1.0" + seek-bzip "^1.0.5" + unbzip2-stream "^1.0.9" + +decompress-targz@^4.0.0, decompress-targz@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee" + dependencies: + decompress-tar "^4.1.1" + file-type "^5.2.0" + is-stream "^1.1.0" + +decompress-unzip@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" + dependencies: + file-type "^3.8.0" + get-stream "^2.2.0" + pify "^2.3.0" + yauzl "^2.4.2" + +decompress@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d" + dependencies: + decompress-tar "^4.0.0" + decompress-tarbz2 "^4.0.0" + decompress-targz "^4.0.0" + decompress-unzip "^4.0.1" + graceful-fs "^4.1.10" + make-dir "^1.0.0" + pify "^2.3.0" + strip-dirs "^2.0.0" + +deep-eql@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + dependencies: + type-detect "^4.0.0" + +deep-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + +define-properties@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +denque@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/denque/-/denque-1.3.0.tgz#681092ef44a630246d3f6edb2a199230eae8e76b" + +depd@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + +depd@^1.1.0, depd@~1.1.1, depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-indent@~5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + +dezalgo@^1.0.0, dezalgo@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" + dependencies: + asap "^2.0.0" + wrappy "1" + +diff@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dns-prefetch-control@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz#60ddb457774e178f1f9415f0cabb0e85b0b300b2" + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + dependencies: + esutils "^2.0.2" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + +dont-sniff-mimetype@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz#5932890dc9f4e2f19e5eb02a20026e5e5efc8f58" + +dot-prop@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + dependencies: + is-obj "^1.0.0" + +dotenv@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef" + +dottie@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.0.tgz#da191981c8b8d713ca0115d5898cf397c2f0ddd0" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + +duplexer@^0.1.1, duplexer@~0.1.1: + version "0.1.1" + resolved "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +editor@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742" + +editorconfig@^0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.0.tgz#b6dd4a0b6b9e76ce48e066bdc15381aebb8804fd" + dependencies: + "@types/commander" "^2.11.0" + "@types/semver" "^5.4.0" + commander "^2.11.0" + lru-cache "^4.1.1" + semver "^5.4.1" + sigmund "^1.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.62: + version "1.3.68" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.68.tgz#bb3ccbadcdd06de2afea8fb73e31a60b6558de1f" + +elliptic@^6.0.0: + version "6.4.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + dependencies: + once "^1.4.0" + +enhanced-resolve@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + object-assign "^4.0.1" + tapable "^0.2.7" + +err-code@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.7.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + +es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2: + version "0.10.46" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + next-tick "1" + +es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-map@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + +es6-promise@^4.0.3: + version "4.2.5" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054" + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + dependencies: + es6-promise "^4.0.3" + +es6-set@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" + +es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-weak-map@^2.0.1, es6-weak-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escope@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-config-standard-jsx@^5.0.0: + version "5.0.0" + resolved "http://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-5.0.0.tgz#4abfac554f38668e0078c664569e7b2384e5d2aa" + +eslint-config-standard@^11.0.0: + version "11.0.0" + resolved "http://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz#87ee0d3c9d95382dc761958cbb23da9eea31e0ba" + +eslint-import-resolver-node@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + dependencies: + debug "^2.6.9" + resolve "^1.5.0" + +eslint-module-utils@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" + dependencies: + debug "^2.6.8" + pkg-dir "^1.0.0" + +eslint-plugin-import@^2.12.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8" + dependencies: + contains-path "^0.1.0" + debug "^2.6.8" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.1" + eslint-module-utils "^2.2.0" + has "^1.0.1" + lodash "^4.17.4" + minimatch "^3.0.3" + read-pkg-up "^2.0.0" + resolve "^1.6.0" + +eslint-plugin-node@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz#bf19642298064379315d7a4b2a75937376fa05e4" + dependencies: + ignore "^3.3.6" + minimatch "^3.0.4" + resolve "^1.3.3" + semver "^5.4.1" + +eslint-plugin-promise@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz#65ebf27a845e3c1e9d6f6a5622ddd3801694b621" + +eslint-plugin-react@^7.9.1: + version "7.11.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz#c01a7af6f17519457d6116aa94fc6d2ccad5443c" + dependencies: + array-includes "^3.0.3" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.0.1" + prop-types "^15.6.2" + +eslint-plugin-standard@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-3.1.0.tgz#2a9e21259ba4c47c02d53b2d0c9135d4b1022d47" + +eslint-scope@^3.7.1: + version "3.7.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + +eslint@4.19.1: + version "4.19.1" + resolved "http://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" + dependencies: + ajv "^5.3.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.4" + esquery "^1.0.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.0.1" + ignore "^3.3.3" + imurmurhash "^0.1.4" + inquirer "^3.0.6" + is-resolvable "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^1.0.1" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" + strip-json-comments "~2.0.1" + table "4.0.2" + text-table "~0.2.0" + +espree@^3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + dependencies: + acorn "^5.5.0" + acorn-jsx "^3.0.0" + +esprima@^2.6.0: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esprima@^4.0.0, esprima@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + +esquery@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +esutils@^2.0.0, esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + +event-emitter@^0.3.5, event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + dependencies: + d "1" + es5-ext "~0.10.14" + +event-stream@~3.3.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.6.tgz#cac1230890e07e73ec9cacd038f60a5b66173eef" + dependencies: + duplexer "^0.1.1" + flatmap-stream "^0.1.0" + from "^0.1.7" + map-stream "0.0.7" + pause-stream "^0.0.11" + split "^1.0.1" + stream-combiner "^0.2.2" + through "^2.3.8" + +events@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exenv@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect-ct@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/expect-ct/-/expect-ct-0.1.1.tgz#de84476a2dbcb85000d5903737e9bc8a5ba7b897" + +express-handlebars@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/express-handlebars/-/express-handlebars-3.0.0.tgz#80a070bb819b09e4af2ca6d0780f75ce05e75c2f" + dependencies: + glob "^6.0.4" + graceful-fs "^4.1.2" + handlebars "^4.0.5" + object.assign "^4.0.3" + promise "^7.0.0" + +express@^4.15.2: + version "4.16.3" + resolved "http://registry.npmjs.org/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.2" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.3" + qs "6.5.1" + range-parser "~1.2.0" + safe-buffer "5.1.1" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.1, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + +external-editor@^2.0.4, external-editor@^2.1.0: + version "2.2.0" + resolved "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extract-text-webpack-plugin@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz#5f043eaa02f9750a9258b78c0a6e0dc1408fb2f7" + dependencies: + async "^2.4.1" + loader-utils "^1.1.0" + schema-utils "^0.3.0" + webpack-sources "^1.0.1" + +extract-zip@^1.6.6: + version "1.6.7" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" + dependencies: + concat-stream "1.6.2" + debug "2.6.9" + mkdirp "0.5.1" + yauzl "2.4.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + +eyes@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +fastparse@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" + +fd-slicer@1.1.0, fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + dependencies: + pend "~1.2.0" + +fd-slicer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + dependencies: + pend "~1.2.0" + +figgy-pudding@^3.0.0, figgy-pudding@^3.1.0, figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +file-loader@^1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8" + dependencies: + loader-utils "^1.0.2" + schema-utils "^0.4.5" + +file-type@^3.8.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" + +file-type@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" + +file-type@^6.1.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" + +find-babel-config@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.1.0.tgz#acc01043a6749fec34429be6b64f542ebb5d6355" + dependencies: + json5 "^0.5.1" + path-exists "^3.0.0" + +find-cache-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^2.0.0" + +find-npm-prefix@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/find-npm-prefix/-/find-npm-prefix-1.0.2.tgz#8d8ce2c78b3b4b9e66c8acc6a37c231eb841cfdf" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +flat-cache@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +flatmap-stream@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/flatmap-stream/-/flatmap-stream-0.1.0.tgz#ed54e01422cd29281800914fcb968d58b685d5f1" + +flatten@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" + +flush-write-stream@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.4" + +follow-redirects@^1.3.0: + version "1.5.8" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.8.tgz#1dbfe13e45ad969f813e86c00e5296f525c885a1" + dependencies: + debug "=3.1.0" + +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@^2.3.1, form-data@~2.3.1, form-data@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + dependencies: + asynckit "^0.4.0" + combined-stream "1.0.6" + mime-types "^2.1.12" + +formidable@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + dependencies: + map-cache "^0.2.2" + +frameguard@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/frameguard/-/frameguard-3.0.0.tgz#7bcad469ee7b96e91d12ceb3959c78235a9272e9" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + +from2@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-1.3.0.tgz#88413baaa5f9a597cfde9221d86986cd3c061dfd" + dependencies: + inherits "~2.0.1" + readable-stream "~1.1.10" + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +from@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + +fs-copy-file-sync@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz#11bf32c096c10d126e5f6b36d06eece776062918" + +fs-extra@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + dependencies: + minipass "^2.2.1" + +fs-readdir-recursive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + +fs-vacuum@^1.2.10, fs-vacuum@~1.2.10: + version "1.2.10" + resolved "https://registry.yarnpkg.com/fs-vacuum/-/fs-vacuum-1.2.10.tgz#b7629bec07a4031a2548fdf99f5ecf1cc8b31e36" + dependencies: + graceful-fs "^4.1.2" + path-is-inside "^1.0.1" + rimraf "^2.5.2" + +fs-write-stream-atomic@^1.0.8, fs-write-stream-atomic@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + +fstream@^1.0.0, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + dependencies: + globule "^1.0.0" + +generate-function@^2.0.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" + dependencies: + is-property "^1.0.2" + +generic-pool@^3.4.0: + version "3.4.2" + resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.4.2.tgz#92ff7196520d670839a67308092a12aadf2f6a59" + +genfun@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/genfun/-/genfun-4.0.1.tgz#ed10041f2e4a7f1b0a38466d17a5c3e27df1dfc1" + +gentle-fs@^2.0.0, gentle-fs@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/gentle-fs/-/gentle-fs-2.0.1.tgz#585cfd612bfc5cd52471fdb42537f016a5ce3687" + dependencies: + aproba "^1.1.2" + fs-vacuum "^1.2.10" + graceful-fs "^4.1.11" + iferr "^0.1.5" + mkdirp "^0.5.1" + path-is-inside "^1.0.2" + read-cmd-shim "^1.0.1" + slide "^1.1.6" + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +get-stream@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + +get-video-dimensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-video-dimensions/-/get-video-dimensions-1.0.0.tgz#fc7e5ac81c392441f5b86d50dd77838a9b53147a" + dependencies: + mz "^1.2.1" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob@7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1, glob@~7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + dependencies: + ini "^1.3.4" + +globals@^11.0.1, globals@^11.1.0: + version "11.7.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globule@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + +got@^6.7.1: + version "6.7.1" + resolved "http://registry.npmjs.org/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@~4.1.11: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + +handlebars@^4.0.5: + version "4.0.12" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" + dependencies: + async "^2.5.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + +har-validator@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" + dependencies: + ajv "^5.3.0" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + +has-unicode@^2.0.0, has-unicode@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.5" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + dependencies: + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" + +he@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + +helmet-crossdomain@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/helmet-crossdomain/-/helmet-crossdomain-0.3.0.tgz#707e2df930f13ad61f76ed08e1bb51ab2b2e85fa" + +helmet-csp@2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/helmet-csp/-/helmet-csp-2.7.1.tgz#e8e0b5186ffd4db625cfcce523758adbfadb9dca" + dependencies: + camelize "1.0.0" + content-security-policy-builder "2.0.0" + dasherize "2.0.0" + platform "1.3.5" + +helmet@^3.13.0: + version "3.13.0" + resolved "https://registry.yarnpkg.com/helmet/-/helmet-3.13.0.tgz#d6d46763538f77b437be77f06d0af42078b2c656" + dependencies: + dns-prefetch-control "0.1.0" + dont-sniff-mimetype "1.0.0" + expect-ct "0.1.1" + frameguard "3.0.0" + helmet-crossdomain "0.3.0" + helmet-csp "2.7.1" + hide-powered-by "1.0.0" + hpkp "2.0.0" + hsts "2.1.0" + ienoopen "1.0.0" + nocache "2.0.0" + referrer-policy "1.1.0" + x-xss-protection "1.1.0" + +hide-powered-by@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hide-powered-by/-/hide-powered-by-1.0.0.tgz#4a85ad65881f62857fc70af7174a1184dccce32b" + +history@^4.7.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/history/-/history-4.7.2.tgz#22b5c7f31633c5b8021c7f4a8a954ac139ee8d5b" + dependencies: + invariant "^2.2.1" + loose-envify "^1.2.0" + resolve-pathname "^2.2.0" + value-equal "^0.4.0" + warning "^3.0.0" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoek@4.x.x: + version "4.2.1" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" + +hoist-non-react-statics@^2.5.0: + version "2.5.5" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" + +home-or-tmp@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-3.0.0.tgz#57a8fe24cf33cdd524860a15821ddc25c86671fb" + +hosted-git-info@^2.1.4, hosted-git-info@^2.6.0, hosted-git-info@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + +hpkp@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hpkp/-/hpkp-2.0.0.tgz#10e142264e76215a5d30c44ec43de64dee6d1672" + +hsts@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hsts/-/hsts-2.1.0.tgz#cbd6c918a2385fee1dd5680bfb2b3a194c0121cc" + +html-comment-regex@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" + +http-cache-semantics@^3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" + +http-errors@1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + dependencies: + depd "1.1.1" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: + version "1.6.3" + resolved "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.1.tgz#6a4ffe5d35188e1c39f872534690585852e1f027" + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-proxy-agent@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" + dependencies: + agent-base "4" + debug "3.1.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + +https-proxy-agent@^2.2.0, https-proxy-agent@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" + dependencies: + agent-base "^4.1.0" + debug "^3.1.0" + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + dependencies: + ms "^2.0.0" + +husky@^0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/husky/-/husky-0.14.3.tgz#c69ed74e2d2779769a17ba8399b54ce0b63c12c3" + dependencies: + is-ci "^1.0.10" + normalize-path "^1.0.0" + strip-indent "^2.0.0" + +iconv-lite@0.4.19: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +iconv-lite@0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.4.17, iconv-lite@^0.4.18, iconv-lite@^0.4.4, iconv-lite@~0.4.13: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + +icss-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" + dependencies: + postcss "^6.0.1" + +ieee754@^1.1.4: + version "1.1.12" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" + +ienoopen@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ienoopen/-/ienoopen-1.0.0.tgz#346a428f474aac8f50cf3784ea2d0f16f62bda6b" + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + +iferr@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-1.0.2.tgz#e9fde49a9da06dc4a4194c6c9ed6d08305037a6d" + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + dependencies: + minimatch "^3.0.4" + +ignore@^3.3.3, ignore@^3.3.6: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + +image-size@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + +imurmurhash@*, imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +in-publish@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +inflection@1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" + +inflight@^1.0.4, inflight@~1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + +init-package-json@^1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe" + dependencies: + glob "^7.1.1" + npm-package-arg "^4.0.0 || ^5.0.0 || ^6.0.0" + promzard "^0.3.0" + read "~1.0.1" + read-package-json "1 || 2" + semver "2.x || 3.x || 4 || 5" + validate-npm-package-license "^3.0.1" + validate-npm-package-name "^3.0.0" + +inquirer@^3.0.6: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +inquirer@^5.2.0: + version "5.2.0" + resolved "http://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.1.0" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^5.5.2" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +interpret@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" + +invariant@^2.0.0, invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +ip-regex@^2.0.0, ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + +ip@^1.1.4, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + +ipaddr.js@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-bluebird@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-bluebird/-/is-bluebird-1.0.2.tgz#096439060f4aa411abee19143a84d6a55346d6e2" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + +is-ci@^1.0.10: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + dependencies: + ci-info "^1.5.0" + +is-cidr@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-2.0.6.tgz#4b01c9693d8e18399dacd18a4f3d60ea5871ac60" + dependencies: + cidr-regex "^2.0.8" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-2.0.0.tgz#68eea07e8a0a0a94c2d080dd674c731ab2a461ab" + dependencies: + ip-regex "^2.0.0" + +is-natural-number@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-obj@^1.0.0: + version "1.0.1" + resolved "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + dependencies: + path-is-inside "^1.0.1" + +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + +is-promise@^2.1, is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + +is-property@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + +is-stream@^1.0.0, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-svg@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isbinaryfile@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" + dependencies: + buffer-alloc "^1.2.0" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + +isstream@0.1.x, isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +js-base64@^2.1.8, js-base64@^2.1.9: + version "2.4.9" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.9.tgz#748911fb04f48a60c4771b375cac45a80df11c03" + +js-beautify@^1.7.4: + version "1.8.6" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.8.6.tgz#6a7e61e47a6e45fb58c5e22499eed350f8607d98" + dependencies: + config-chain "~1.1.5" + editorconfig "^0.15.0" + mkdirp "~0.5.0" + nopt "~4.0.1" + +js-levenshtein@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.3.tgz#3ef627df48ec8cf24bacf05c0f184ff30ef413c5" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +js-yaml@^3.4.3, js-yaml@^3.9.1: + version "3.12.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@~3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsesc@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-loader@^0.5.4: + version "0.5.7" + resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" + +json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@^0.5.0, json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +jsx-ast-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" + dependencies: + array-includes "^3.0.3" + +keygrip@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.0.3.tgz#399d709f0aed2bab0a059e0cdd3a5023a053e1dc" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + dependencies: + package-json "^4.0.0" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lazy-property@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazy-property/-/lazy-property-1.0.0.tgz#84ddc4b370679ba8bd4cdcfa4c06b43d57111147" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +libcipm@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-2.0.2.tgz#4f38c2b37acf2ec156936cef1cbf74636568fc7b" + dependencies: + bin-links "^1.1.2" + bluebird "^3.5.1" + find-npm-prefix "^1.0.2" + graceful-fs "^4.1.11" + lock-verify "^2.0.2" + mkdirp "^0.5.1" + npm-lifecycle "^2.0.3" + npm-logical-tree "^1.2.1" + npm-package-arg "^6.1.0" + pacote "^8.1.6" + protoduck "^5.0.0" + read-package-json "^2.0.13" + rimraf "^2.6.2" + worker-farm "^1.6.0" + +libnpmhook@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-4.0.1.tgz#63641654de772cbeb96a88527a7fd5456ec3c2d7" + dependencies: + figgy-pudding "^3.1.0" + npm-registry-fetch "^3.0.0" + +libnpx@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/libnpx/-/libnpx-10.2.0.tgz#1bf4a1c9f36081f64935eb014041da10855e3102" + dependencies: + dotenv "^5.0.1" + npm-package-arg "^6.0.0" + rimraf "^2.6.2" + safe-buffer "^5.1.0" + update-notifier "^2.3.0" + which "^1.3.0" + y18n "^4.0.0" + yargs "^11.0.0" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" + +loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lock-verify@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.0.2.tgz#148e4f85974915c9e3c34d694b7de9ecb18ee7a8" + dependencies: + npm-package-arg "^5.1.2 || 6" + semver "^5.4.1" + +lockfile@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609" + dependencies: + signal-exit "^3.0.2" + +lodash-es@^4.17.5: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.11.tgz#145ab4a7ac5c5e52a3531fb4f310255a152b4be0" + +lodash._baseindexof@*: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" + +lodash._baseuniq@~4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" + dependencies: + lodash._createset "~4.0.0" + lodash._root "~3.0.0" + +lodash._bindcallback@*: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._cacheindexof@*: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" + +lodash._createcache@*: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" + dependencies: + lodash._getnative "^3.0.0" + +lodash._createset@~4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" + +lodash._getnative@*, lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._root@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + +lodash.clonedeep@^4.3.2, lodash.clonedeep@~4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + +lodash.mergewith@^4.6.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" + +lodash.restparam@*: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.tail@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" + +lodash.union@~4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" + +lodash.uniq@^4.5.0, lodash.uniq@~4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + +lodash.without@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" + +lodash@^3.10.1: + version "3.10.1" + resolved "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + +lodash@^4.0.0, lodash@^4.17.0, lodash@^4.17.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0, lodash@~4.17.10: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + +lru-cache@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.5.0.tgz#d82388ae9c960becbea0c73bb9eb79b6c6ce9aeb" + +lru-cache@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2, lru-cache@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-queue@0.1: + version "0.1.0" + resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" + dependencies: + es5-ext "~0.10.2" + +make-dir@^1.0.0, make-dir@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + dependencies: + pify "^3.0.0" + +"make-fetch-happen@^2.5.0 || 3 || 4", make-fetch-happen@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz#141497cb878f243ba93136c83d8aba12c216c083" + dependencies: + agentkeepalive "^3.4.1" + cacache "^11.0.1" + http-cache-semantics "^3.8.1" + http-proxy-agent "^2.1.0" + https-proxy-agent "^2.2.1" + lru-cache "^4.1.2" + mississippi "^3.0.0" + node-fetch-npm "^2.0.2" + promise-retry "^1.1.1" + socks-proxy-agent "^4.0.0" + ssri "^6.0.0" + +make-fetch-happen@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-3.0.0.tgz#7b661d2372fc4710ab5cc8e1fa3c290eea69a961" + dependencies: + agentkeepalive "^3.4.1" + cacache "^10.0.4" + http-cache-semantics "^3.8.1" + http-proxy-agent "^2.1.0" + https-proxy-agent "^2.2.0" + lru-cache "^4.1.2" + mississippi "^3.0.0" + node-fetch-npm "^2.0.2" + promise-retry "^1.1.1" + socks-proxy-agent "^3.0.1" + ssri "^5.2.4" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + +map-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz#8a1f07896d82b10926bd3744a2420009f88974a8" + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + dependencies: + object-visit "^1.0.0" + +math-expression-evaluator@^1.2.14: + version "1.2.17" + resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" + +md5.js@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +meant@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/meant/-/meant-1.0.1.tgz#66044fea2f23230ec806fb515efea29c44d2115d" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + dependencies: + mimic-fn "^1.0.0" + +memoizee@^0.4.14: + version "0.4.14" + resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" + dependencies: + d "1" + es5-ext "^0.10.45" + es6-weak-map "^2.0.2" + event-emitter "^0.3.5" + is-promise "^2.1" + lru-queue "0.1" + next-tick "1" + timers-ext "^0.1.5" + +memory-fs@^0.4.0, memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +methods@^1.1.1, methods@^1.1.2, methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@~1.36.0: + version "1.36.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.19: + version "2.1.20" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" + dependencies: + mime-db "~1.36.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + +mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + +mime@^2.0.3, mime@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + +"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1: + version "0.0.10" + resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +minipass@^2.2.1, minipass@^2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" + dependencies: + minipass "^2.2.1" + +mississippi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^2.0.1" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + +mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: + version "0.5.1" + resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mocha@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" + dependencies: + browser-stdout "1.3.1" + commander "2.15.1" + debug "3.1.0" + diff "3.5.0" + escape-string-regexp "1.0.5" + glob "7.1.2" + growl "1.10.5" + he "1.1.1" + minimatch "3.0.4" + mkdirp "0.5.1" + supports-color "5.4.0" + +module-alias@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/module-alias/-/module-alias-2.1.0.tgz#c36d4fd15f7f9d7112f62fa015385e7b65a286c1" + +moment-timezone@^0.5.14: + version "0.5.21" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.21.tgz#3cba247d84492174dbf71de2a9848fa13207b845" + dependencies: + moment ">= 2.9.0" + +"moment@>= 2.9.0", moment@^2.20.0: + version "2.22.2" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +ms@^2.0.0, ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + +multiparty@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/multiparty/-/multiparty-4.2.1.tgz#d9b6c46d8b8deab1ee70c734b0af771dd46e0b13" + dependencies: + fd-slicer "1.1.0" + http-errors "~1.7.0" + safe-buffer "5.1.2" + uid-safe "2.1.5" + +mute-stream@0.0.7, mute-stream@~0.0.4: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + +mysql2@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-1.6.1.tgz#9027fd93a05c5d86e79bfada35c9b677b3a0d7c5" + dependencies: + cardinal "2.1.1" + denque "1.3.0" + generate-function "^2.0.0" + iconv-lite "^0.4.18" + long "^4.0.0" + lru-cache "4.1.1" + named-placeholders "1.1.1" + object-assign "^4.1.1" + seq-queue "0.0.5" + sqlstring "2.3.1" + +mz@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-1.3.0.tgz#06f093fdd9956a06d37e1b1e81344e27478c42f0" + dependencies: + native-or-bluebird "1" + thenify "3" + thenify-all "1" + +named-placeholders@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/named-placeholders/-/named-placeholders-1.1.1.tgz#3b7a0d26203dd74b3a9df4c9cfb827b2fb907e64" + dependencies: + lru-cache "2.5.0" + +nan@2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + +nan@^2.10.0, nan@^2.9.2: + version "2.11.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +native-or-bluebird@1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/native-or-bluebird/-/native-or-bluebird-1.2.0.tgz#39c47bfd7825d1fb9ffad32210ae25daadf101c9" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +ndb-node-pty-prebuilt@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/ndb-node-pty-prebuilt/-/ndb-node-pty-prebuilt-0.8.0.tgz#dbe8df675d94cd28697e399925137cc71c089bee" + dependencies: + decompress "^4.2.0" + decompress-targz "^4.1.1" + nan "2.10.0" + +ndb@^1.0.24: + version "1.0.25" + resolved "https://registry.yarnpkg.com/ndb/-/ndb-1.0.25.tgz#7260d965de81e160db37f2b02ac7278ad204fc10" + dependencies: + chokidar "^2.0.4" + clipboardy "^1.2.3" + fs-copy-file-sync "^1.1.1" + isbinaryfile "^3.0.3" + mime "^2.3.1" + opn "^5.3.0" + puppeteer "1.7.0" + rimraf "^2.6.2" + update-notifier "^2.5.0" + ws "^6.0.0" + xterm "^3.7.0" + optionalDependencies: + ndb-node-pty-prebuilt "^0.8.0" + +needle@^2.2.0, needle@^2.2.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.3.tgz#c1b04da378cd634d8befe2de965dc2cfb0fd65ca" + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +neo-async@^2.5.0: + version "2.5.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.2.tgz#489105ce7bc54e709d736b195f82135048c50fcc" + +next-tick@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + +nocache@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/nocache/-/nocache-2.0.0.tgz#202b48021a0c4cbde2df80de15a17443c8b43980" + +node-fetch-npm@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" + dependencies: + encoding "^0.1.11" + json-parse-better-errors "^1.0.0" + safe-buffer "^5.1.1" + +node-fetch@2.1.2: + version "2.1.2" + resolved "http://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5" + +node-gyp@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-libs-browser@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^1.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.0" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.10.3" + vm-browserify "0.0.4" + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + +node-pre-gyp@0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz#f11c07516dd92f87199dbc7e1838eab7cd56c9e0" + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.0" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.1.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +node-releases@^1.0.0-alpha.11: + version "1.0.0-alpha.11" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.0-alpha.11.tgz#73c810acc2e5b741a17ddfbb39dfca9ab9359d8a" + dependencies: + semver "^5.3.0" + +node-sass@^4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.3.tgz#f407cf3d66f78308bb1e346b24fa428703196224" + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash.assign "^4.2.0" + lodash.clonedeep "^4.3.2" + lodash.mergewith "^4.6.0" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.10.0" + node-gyp "^3.8.0" + npmlog "^4.0.0" + request "2.87.0" + sass-graph "^2.2.4" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + +nodemon@^1.17.5: + version "1.18.4" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.18.4.tgz#873f65fdb53220eb166180cf106b1354ac5d714d" + dependencies: + chokidar "^2.0.2" + debug "^3.1.0" + ignore-by-default "^1.0.1" + minimatch "^3.0.4" + pstree.remy "^1.1.0" + semver "^5.5.0" + supports-color "^5.2.0" + touch "^3.1.0" + undefsafe "^2.0.2" + update-notifier "^2.3.0" + +"nopt@2 || 3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +nopt@^4.0.1, nopt@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + dependencies: + abbrev "1" + +normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.4.0, "normalize-package-data@~1.0.1 || ^2.0.0", normalize-package-data@~2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + +normalize-url@^1.4.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +npm-audit-report@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-1.3.1.tgz#e79ea1fcb5ffaf3031102b389d5222c2b0459632" + dependencies: + cli-table3 "^0.5.0" + console-control-strings "^1.1.0" + +npm-bundled@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" + +npm-cache-filename@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz#ded306c5b0bfc870a9e9faf823bc5f283e05ae11" + +npm-install-checks@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-3.0.0.tgz#d4aecdfd51a53e3723b7b2f93b2ee28e307bc0d7" + dependencies: + semver "^2.3.0 || 3.x || 4 || 5" + +npm-lifecycle@^2.0.3, npm-lifecycle@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-2.1.0.tgz#1eda2eedb82db929e3a0c50341ab0aad140ed569" + dependencies: + byline "^5.0.0" + graceful-fs "^4.1.11" + node-gyp "^3.8.0" + resolve-from "^4.0.0" + slide "^1.1.6" + uid-number "0.0.6" + umask "^1.1.0" + which "^1.3.1" + +npm-logical-tree@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/npm-logical-tree/-/npm-logical-tree-1.2.1.tgz#44610141ca24664cad35d1e607176193fd8f5b88" + +"npm-package-arg@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", "npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", "npm-package-arg@^5.1.2 || 6", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1" + dependencies: + hosted-git-info "^2.6.0" + osenv "^0.1.5" + semver "^5.5.0" + validate-npm-package-name "^3.0.0" + +npm-packlist@^1.1.10, npm-packlist@^1.1.11, npm-packlist@^1.1.6: + version "1.1.11" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-pick-manifest@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-2.1.0.tgz#dc381bdd670c35d81655e1d5a94aa3dd4d87fce5" + dependencies: + npm-package-arg "^6.0.0" + semver "^5.4.1" + +npm-profile@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-3.0.2.tgz#58d568f1b56ef769602fd0aed8c43fa0e0de0f57" + dependencies: + aproba "^1.1.2 || 2" + make-fetch-happen "^2.5.0 || 3 || 4" + +npm-registry-client@^8.6.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-8.6.0.tgz#7f1529f91450732e89f8518e0f21459deea3e4c4" + dependencies: + concat-stream "^1.5.2" + graceful-fs "^4.1.6" + normalize-package-data "~1.0.1 || ^2.0.0" + npm-package-arg "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + once "^1.3.3" + request "^2.74.0" + retry "^0.10.0" + safe-buffer "^5.1.1" + semver "2 >=2.2.1 || 3.x || 4 || 5" + slide "^1.1.3" + ssri "^5.2.4" + optionalDependencies: + npmlog "2 || ^3.1.0 || ^4.0.0" + +npm-registry-fetch@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-1.1.1.tgz#710bc5947d9ee2c549375072dab6d5d17baf2eb2" + dependencies: + bluebird "^3.5.1" + figgy-pudding "^3.0.0" + lru-cache "^4.1.2" + make-fetch-happen "^3.0.0" + npm-package-arg "^6.0.0" + safe-buffer "^5.1.1" + +npm-registry-fetch@^3.0.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-3.8.0.tgz#aa7d9a7c92aff94f48dba0984bdef4bd131c88cc" + dependencies: + JSONStream "^1.3.4" + bluebird "^3.5.1" + figgy-pudding "^3.4.1" + lru-cache "^4.1.3" + make-fetch-happen "^4.0.1" + npm-package-arg "^6.1.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + +npm-user-validate@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.0.tgz#8ceca0f5cea04d4e93519ef72d0557a75122e951" + +npm@^6.3.0: + version "6.4.1" + resolved "https://registry.yarnpkg.com/npm/-/npm-6.4.1.tgz#4f39f9337b557a28faed4a771d5c8802d6b4288b" + dependencies: + JSONStream "^1.3.4" + abbrev "~1.1.1" + ansicolors "~0.3.2" + ansistyles "~0.1.3" + aproba "~1.2.0" + archy "~1.0.0" + bin-links "^1.1.2" + bluebird "~3.5.1" + byte-size "^4.0.3" + cacache "^11.2.0" + call-limit "~1.1.0" + chownr "~1.0.1" + ci-info "^1.4.0" + cli-columns "^3.1.2" + cli-table3 "^0.5.0" + cmd-shim "~2.0.2" + columnify "~1.5.4" + config-chain "~1.1.11" + detect-indent "~5.0.0" + detect-newline "^2.1.0" + dezalgo "~1.0.3" + editor "~1.0.0" + figgy-pudding "^3.4.1" + find-npm-prefix "^1.0.2" + fs-vacuum "~1.2.10" + fs-write-stream-atomic "~1.0.10" + gentle-fs "^2.0.1" + glob "~7.1.2" + graceful-fs "~4.1.11" + has-unicode "~2.0.1" + hosted-git-info "^2.7.1" + iferr "^1.0.2" + inflight "~1.0.6" + inherits "~2.0.3" + ini "^1.3.5" + init-package-json "^1.10.3" + is-cidr "^2.0.6" + json-parse-better-errors "^1.0.2" + lazy-property "~1.0.0" + libcipm "^2.0.2" + libnpmhook "^4.0.1" + libnpx "^10.2.0" + lock-verify "^2.0.2" + lockfile "^1.0.4" + lodash._baseuniq "~4.6.0" + lodash.clonedeep "~4.5.0" + lodash.union "~4.6.0" + lodash.uniq "~4.5.0" + lodash.without "~4.4.0" + lru-cache "^4.1.3" + meant "~1.0.1" + mississippi "^3.0.0" + mkdirp "~0.5.1" + move-concurrently "^1.0.1" + node-gyp "^3.8.0" + nopt "~4.0.1" + normalize-package-data "~2.4.0" + npm-audit-report "^1.3.1" + npm-cache-filename "~1.0.2" + npm-install-checks "~3.0.0" + npm-lifecycle "^2.1.0" + npm-package-arg "^6.1.0" + npm-packlist "^1.1.11" + npm-pick-manifest "^2.1.0" + npm-profile "^3.0.2" + npm-registry-client "^8.6.0" + npm-registry-fetch "^1.1.0" + npm-user-validate "~1.0.0" + npmlog "~4.1.2" + once "~1.4.0" + opener "^1.5.0" + osenv "^0.1.5" + pacote "^8.1.6" + path-is-inside "~1.0.2" + promise-inflight "~1.0.1" + qrcode-terminal "^0.12.0" + query-string "^6.1.0" + qw "~1.0.1" + read "~1.0.7" + read-cmd-shim "~1.0.1" + read-installed "~4.0.3" + read-package-json "^2.0.13" + read-package-tree "^5.2.1" + readable-stream "^2.3.6" + request "^2.88.0" + retry "^0.12.0" + rimraf "~2.6.2" + safe-buffer "^5.1.2" + semver "^5.5.0" + sha "~2.0.1" + slide "~1.1.6" + sorted-object "~2.0.1" + sorted-union-stream "~2.1.3" + ssri "^6.0.0" + stringify-package "^1.0.0" + tar "^4.4.6" + text-table "~0.2.0" + tiny-relative-date "^1.3.0" + uid-number "0.0.6" + umask "~1.1.0" + unique-filename "~1.1.0" + unpipe "~1.0.0" + update-notifier "^2.5.0" + uuid "^3.3.2" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "~3.0.0" + which "^1.3.1" + worker-farm "^1.6.0" + write-file-atomic "^2.3.0" + +"npmlog@0 || 1 || 2 || 3 || 4", "npmlog@2 || ^3.1.0 || ^4.0.0", npmlog@^4.0.0, npmlog@^4.0.2, npmlog@~4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-keys@^1.0.11, object-keys@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + dependencies: + isobject "^3.0.0" + +object.assign@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + dependencies: + isobject "^3.0.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + +once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0, once@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +opener@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" + +opn@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" + dependencies: + is-wsl "^1.1.0" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@0, osenv@^0.1.4, osenv@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-2.0.1.tgz#f53118282f5f553c2799541792b723a4c71430c0" + dependencies: + graceful-fs "^4.1.11" + is-plain-obj "^1.1.0" + mkdirp "^0.5.1" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +pacote@^8.1.6: + version "8.1.6" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-8.1.6.tgz#8e647564d38156367e7a9dc47a79ca1ab278d46e" + dependencies: + bluebird "^3.5.1" + cacache "^11.0.2" + get-stream "^3.0.0" + glob "^7.1.2" + lru-cache "^4.1.3" + make-fetch-happen "^4.0.1" + minimatch "^3.0.4" + minipass "^2.3.3" + mississippi "^3.0.0" + mkdirp "^0.5.1" + normalize-package-data "^2.4.0" + npm-package-arg "^6.1.0" + npm-packlist "^1.1.10" + npm-pick-manifest "^2.1.0" + osenv "^0.1.5" + promise-inflight "^1.0.1" + promise-retry "^1.1.1" + protoduck "^5.0.0" + rimraf "^2.6.2" + safe-buffer "^5.1.2" + semver "^5.5.0" + ssri "^6.0.0" + tar "^4.4.3" + unique-filename "^1.1.0" + which "^1.3.0" + +pako@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" + +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parse-asn1@^5.0.0: + version "5.1.1" + resolved "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + +passport-local@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/passport-local/-/passport-local-1.0.0.tgz#1fe63268c92e75606626437e3b906662c15ba6ee" + dependencies: + passport-strategy "1.x.x" + +passport-strategy@1.x.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" + +passport@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/passport/-/passport-0.4.0.tgz#c5095691347bd5ad3b5e180238c3914d16f05811" + dependencies: + passport-strategy "1.x.x" + pause "0.0.1" + +path-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1, path-is-inside@^1.0.2, path-is-inside@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + +path-parse@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + +path-to-regexp@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + dependencies: + isarray "0.0.1" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + +pathval@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + +pause-stream@^0.0.11: + version "0.0.11" + resolved "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + dependencies: + through "~2.3" + +pause@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" + +pbkdf2@^3.0.3: + version "3.0.16" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pirates@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.0.tgz#850b18781b4ac6ec58a43c9ed9ec5fe6796addbd" + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + dependencies: + find-up "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + dependencies: + find-up "^2.1.0" + +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + dependencies: + find-up "^2.1.0" + +platform@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.5.tgz#fb6958c696e07e2918d2eeda0f0bc9448d733444" + +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + +postcss-calc@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" + dependencies: + postcss "^5.0.2" + postcss-message-helpers "^2.0.0" + reduce-css-calc "^1.2.6" + +postcss-colormin@^2.1.8: + version "2.2.2" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" + dependencies: + colormin "^1.0.5" + postcss "^5.0.13" + postcss-value-parser "^3.2.3" + +postcss-convert-values@^2.3.4: + version "2.6.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" + dependencies: + postcss "^5.0.11" + postcss-value-parser "^3.1.2" + +postcss-discard-comments@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" + dependencies: + postcss "^5.0.14" + +postcss-discard-duplicates@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" + dependencies: + postcss "^5.0.4" + +postcss-discard-empty@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" + dependencies: + postcss "^5.0.14" + +postcss-discard-overridden@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" + dependencies: + postcss "^5.0.16" + +postcss-discard-unused@^2.2.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" + dependencies: + postcss "^5.0.14" + uniqs "^2.0.0" + +postcss-filter-plugins@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec" + dependencies: + postcss "^5.0.4" + +postcss-merge-idents@^2.1.5: + version "2.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" + dependencies: + has "^1.0.1" + postcss "^5.0.10" + postcss-value-parser "^3.1.1" + +postcss-merge-longhand@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" + dependencies: + postcss "^5.0.4" + +postcss-merge-rules@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" + dependencies: + browserslist "^1.5.2" + caniuse-api "^1.5.2" + postcss "^5.0.4" + postcss-selector-parser "^2.2.2" + vendors "^1.0.0" + +postcss-message-helpers@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" + +postcss-minify-font-values@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" + dependencies: + object-assign "^4.0.1" + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-minify-gradients@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" + dependencies: + postcss "^5.0.12" + postcss-value-parser "^3.3.0" + +postcss-minify-params@^1.0.4: + version "1.2.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.2" + postcss-value-parser "^3.0.2" + uniqs "^2.0.0" + +postcss-minify-selectors@^2.0.4: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" + dependencies: + alphanum-sort "^1.0.2" + has "^1.0.1" + postcss "^5.0.14" + postcss-selector-parser "^2.0.0" + +postcss-modules-extract-imports@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" + dependencies: + postcss "^6.0.1" + +postcss-modules-local-by-default@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-scope@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-values@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + +postcss-normalize-charset@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" + dependencies: + postcss "^5.0.5" + +postcss-normalize-url@^3.0.7: + version "3.0.8" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^1.4.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + +postcss-ordered-values@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.1" + +postcss-reduce-idents@^2.2.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-reduce-initial@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" + dependencies: + postcss "^5.0.4" + +postcss-reduce-transforms@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" + dependencies: + has "^1.0.1" + postcss "^5.0.8" + postcss-value-parser "^3.0.1" + +postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^2.1.1: + version "2.1.6" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" + dependencies: + is-svg "^2.0.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + svgo "^0.7.0" + +postcss-unique-selectors@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.4" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" + +postcss-zindex@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" + dependencies: + has "^1.0.1" + postcss "^5.0.4" + uniqs "^2.0.0" + +postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: + version "5.2.18" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" + dependencies: + chalk "^1.1.3" + js-base64 "^2.1.9" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@^6.0.1: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +prepend-http@^1.0.0, prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +private@^0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + +progress@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + +promise-inflight@^1.0.1, promise-inflight@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + +promise-retry@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" + dependencies: + err-code "^1.0.0" + retry "^0.10.0" + +promise@^7.0.0: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + +promzard@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" + dependencies: + read "1" + +prop-types@^15.5.4, prop-types@^15.5.7, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2: + version "15.6.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" + dependencies: + loose-envify "^1.3.1" + object-assign "^4.1.1" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + +protoduck@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.0.tgz#752145e6be0ad834cb25716f670a713c860dce70" + dependencies: + genfun "^4.0.1" + +proxy-addr@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.8.0" + +proxy-from-env@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + +ps-tree@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" + dependencies: + event-stream "~3.3.0" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +psl@^1.1.24: + version "1.1.29" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" + +pstree.remy@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.0.tgz#f2af27265bd3e5b32bbfcc10e80bac55ba78688b" + dependencies: + ps-tree "^1.1.0" + +public-encrypt@^4.0.0: + version "4.0.2" + resolved "http://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + +pump@^2.0.0, pump@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + +puppeteer@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.7.0.tgz#edcba2300a50847202c0f19fd15e7a96171ff3bd" + dependencies: + debug "^3.1.0" + extract-zip "^1.6.6" + https-proxy-agent "^2.2.1" + mime "^2.0.3" + progress "^2.0.0" + proxy-from-env "^1.0.0" + rimraf "^2.6.1" + ws "^5.1.1" + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + +qrcode-terminal@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" + +qs@6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + +qs@6.5.2, qs@^6.5.1, qs@~6.5.1, qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +query-string@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.1.0.tgz#01e7d69f6a0940dac67a937d6c6325647aa4532a" + dependencies: + decode-uri-component "^0.2.0" + strict-uri-encode "^2.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + +qw@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/qw/-/qw-1.0.1.tgz#efbfdc740f9ad054304426acb183412cc8b996d4" + +random-bytes@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +raw-body@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" + dependencies: + bytes "3.0.0" + http-errors "1.6.2" + iconv-lite "0.4.19" + unpipe "1.0.0" + +raw-body@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + dependencies: + bytes "3.0.0" + http-errors "1.6.3" + iconv-lite "0.4.23" + unpipe "1.0.0" + +rc@^1.0.1, rc@^1.1.6, rc@^1.1.7, rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-dom@^16.4.2: + version "16.5.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.5.1.tgz#29d0c5a01ed3b6b4c14309aa91af6ec4eb4f292c" + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + schedule "^0.4.0" + +react-ga@^2.5.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/react-ga/-/react-ga-2.5.3.tgz#0f447c73664c069a5fc341f6f431262e3d4c23c4" + optionalDependencies: + prop-types "^15.6.0" + react "^15.6.2 || ^16.0" + +react-helmet@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-5.2.0.tgz#a81811df21313a6d55c5f058c4aeba5d6f3d97a7" + dependencies: + deep-equal "^1.0.1" + object-assign "^4.1.1" + prop-types "^15.5.4" + react-side-effect "^1.1.0" + +react-redux@^5.0.6: + version "5.0.7" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.7.tgz#0dc1076d9afb4670f993ffaef44b8f8c1155a4c8" + dependencies: + hoist-non-react-statics "^2.5.0" + invariant "^2.0.0" + lodash "^4.17.5" + lodash-es "^4.17.5" + loose-envify "^1.1.0" + prop-types "^15.6.0" + +react-router-dom@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.3.1.tgz#4c2619fc24c4fa87c9fd18f4fb4a43fe63fbd5c6" + dependencies: + history "^4.7.2" + invariant "^2.2.4" + loose-envify "^1.3.1" + prop-types "^15.6.1" + react-router "^4.3.1" + warning "^4.0.1" + +react-router@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.3.1.tgz#aada4aef14c809cb2e686b05cee4742234506c4e" + dependencies: + history "^4.7.2" + hoist-non-react-statics "^2.5.0" + invariant "^2.2.4" + loose-envify "^1.3.1" + path-to-regexp "^1.7.0" + prop-types "^15.6.1" + warning "^4.0.1" + +react-side-effect@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-1.1.5.tgz#f26059e50ed9c626d91d661b9f3c8bb38cd0ff2d" + dependencies: + exenv "^1.2.1" + shallowequal "^1.0.1" + +"react@^15.6.2 || ^16.0", react@^16.4.2: + version "16.5.1" + resolved "https://registry.yarnpkg.com/react/-/react-16.5.1.tgz#8cb8e9f8cdcb4bde41c9a138bfbf907e66132372" + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + schedule "^0.4.0" + +read-cmd-shim@^1.0.1, read-cmd-shim@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b" + dependencies: + graceful-fs "^4.1.2" + +read-installed@~4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067" + dependencies: + debuglog "^1.0.1" + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + semver "2 || 3 || 4 || 5" + slide "~1.1.3" + util-extend "^1.0.1" + optionalDependencies: + graceful-fs "^4.1.2" + +"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a" + dependencies: + glob "^7.1.1" + json-parse-better-errors "^1.0.1" + normalize-package-data "^2.0.0" + slash "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.2" + +read-package-tree@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.2.1.tgz#6218b187d6fac82289ce4387bbbaf8eef536ad63" + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + once "^1.3.0" + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read@1, read@~1.0.1, read@~1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + dependencies: + mute-stream "~0.0.4" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6: + version "2.3.6" + resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@~1.1.10: + version "1.1.14" + resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readdir-scoped-modules@*, readdir-scoped-modules@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + graceful-fs "^4.1.2" + once "^1.3.0" + +readdirp@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +redeyed@~2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" + dependencies: + esprima "~4.0.0" + +reduce-css-calc@^1.2.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" + dependencies: + balanced-match "^0.4.2" + math-expression-evaluator "^1.2.14" + reduce-function-call "^1.0.1" + +reduce-function-call@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" + dependencies: + balanced-match "^0.4.2" + +redux-devtools-instrument@^1.0.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/redux-devtools-instrument/-/redux-devtools-instrument-1.9.0.tgz#2faed9ac3292c783284b21843edfaa0567764a0c" + dependencies: + lodash "^4.2.0" + symbol-observable "^1.0.2" + +redux-devtools@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/redux-devtools/-/redux-devtools-3.4.1.tgz#09d342ce0ab6087be679e953a1d7c530efa1138e" + dependencies: + lodash "^4.2.0" + prop-types "^15.5.7" + redux-devtools-instrument "^1.0.1" + +redux-saga@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-0.16.0.tgz#0a231db0a1489301dd980f6f2f88d8ced418f724" + +redux@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.0.tgz#aa698a92b729315d22b34a0553d7e6533555cc03" + dependencies: + loose-envify "^1.1.0" + symbol-observable "^1.2.0" + +referrer-policy@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/referrer-policy/-/referrer-policy-1.1.0.tgz#35774eb735bf50fb6c078e83334b472350207d79" + +regenerate-unicode-properties@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" + dependencies: + regenerate "^1.4.0" + +regenerate@^1.2.1, regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + +regenerator-runtime@^0.11.0, regenerator-runtime@^0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + +regenerator-transform@^0.13.0, regenerator-transform@^0.13.3: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" + dependencies: + private "^0.1.6" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpp@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" + +regexpu-core@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regexpu-core@^4.1.3, regexpu-core@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.2.0.tgz#a3744fa03806cffe146dea4421a3e73bdcc47b1d" + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^7.0.0" + regjsgen "^0.4.0" + regjsparser "^0.3.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.0.2" + +registry-auth-token@^3.0.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsgen@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.4.0.tgz#c1eb4c89a209263f8717c782591523913ede2561" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +regjsparser@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.3.0.tgz#3c326da7fcfd69fa0d332575a41c8c0cdf588c96" + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@2.86.0: + version "2.86.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.86.0.tgz#2b9497f449b0a32654c081a5cf426bbfb5bf5b69" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +request@2.87.0: + version "2.87.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +request@^2.74.0, request@^2.87.0, request@^2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +require-uncached@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +reselect@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + +resolve-pathname@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + +resolve@^1.0.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.6.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + dependencies: + path-parse "^1.0.5" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + +retry-as-promised@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-2.3.2.tgz#cd974ee4fd9b5fe03cbf31871ee48221c07737b7" + dependencies: + bluebird "^3.4.6" + debug "^2.6.9" + +retry@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + dependencies: + aproba "^1.1.1" + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + +rxjs@^5.5.2: + version "5.5.12" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" + dependencies: + symbol-observable "1.0.1" + +safe-buffer@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + +sass-graph@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^7.0.0" + +sass-loader@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.1.0.tgz#16fd5138cb8b424bf8a759528a1972d72aad069d" + dependencies: + clone-deep "^2.0.1" + loader-utils "^1.0.1" + lodash.tail "^4.1.1" + neo-async "^2.5.0" + pify "^3.0.0" + semver "^5.5.0" + +sax@^1.2.4, sax@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + +schedule@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/schedule/-/schedule-0.4.0.tgz#fa20cfd0bfbf91c47d02272fd7096780d3170bbb" + dependencies: + object-assign "^4.1.1" + +schema-utils@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" + dependencies: + ajv "^5.0.0" + +schema-utils@^0.4.5: + version "0.4.7" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + +seek-bzip@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" + dependencies: + commander "~2.8.1" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + +"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: + version "5.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" + +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + +seq-queue@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/seq-queue/-/seq-queue-0.0.5.tgz#d56812e1c017a6e4e7c3e3a37a1da6d78dd3c93e" + +sequelize-cli@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/sequelize-cli/-/sequelize-cli-4.1.1.tgz#3cc75609c10262355be02f80535b7860f828ce03" + dependencies: + bluebird "^3.5.1" + cli-color "^1.2.0" + fs-extra "^5.0.0" + js-beautify "^1.7.4" + lodash "^4.17.5" + resolve "^1.5.0" + umzug "^2.1.0" + yargs "^8.0.2" + +sequelize@^4.38.0: + version "4.38.1" + resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-4.38.1.tgz#4fd832c33c0ff44a6516bf7133b1ec6311fa4297" + dependencies: + bluebird "^3.5.0" + cls-bluebird "^2.1.0" + debug "^3.1.0" + depd "^1.1.0" + dottie "^2.0.0" + generic-pool "^3.4.0" + inflection "1.12.0" + lodash "^4.17.1" + moment "^2.20.0" + moment-timezone "^0.5.14" + retry-as-promised "^2.3.2" + semver "^5.5.0" + terraformer-wkt-parser "^1.1.2" + toposort-class "^1.0.1" + uuid "^3.2.1" + validator "^10.4.0" + wkx "^0.4.1" + +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +sha@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/sha/-/sha-2.0.1.tgz#6030822fbd2c9823949f8f72ed6411ee5cf25aae" + dependencies: + graceful-fs "^4.1.2" + readable-stream "^2.0.2" + +shallow-clone@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571" + dependencies: + is-extendable "^0.1.1" + kind-of "^5.0.0" + mixin-object "^2.0.1" + +shallowequal@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +shimmer@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.0.tgz#f966f7555789763e74d8841193685a5e78736665" + +sigmund@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + dependencies: + is-fullwidth-code-point "^2.0.0" + +slide@^1.1.3, slide@^1.1.6, slide@~1.1.3, slide@~1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + +smart-buffer@^1.0.13: + version "1.1.15" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16" + +smart-buffer@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.0.1.tgz#07ea1ca8d4db24eb4cac86537d7d18995221ace3" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sntp@2.x.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + dependencies: + hoek "4.x.x" + +socks-proxy-agent@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz#2eae7cf8e2a82d34565761539a7f9718c5617659" + dependencies: + agent-base "^4.1.0" + socks "^1.1.10" + +socks-proxy-agent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz#5936bf8b707a993079c6f37db2091821bffa6473" + dependencies: + agent-base "~4.2.0" + socks "~2.2.0" + +socks@^1.1.10: + version "1.1.10" + resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.10.tgz#5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a" + dependencies: + ip "^1.1.4" + smart-buffer "^1.0.13" + +socks@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.2.1.tgz#68ad678b3642fbc5d99c64c165bc561eab0215f9" + dependencies: + ip "^1.1.5" + smart-buffer "^4.0.1" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + dependencies: + is-plain-obj "^1.0.0" + +sorted-object@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/sorted-object/-/sorted-object-2.0.1.tgz#7d631f4bd3a798a24af1dffcfbfe83337a5df5fc" + +sorted-union-stream@~2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/sorted-union-stream/-/sorted-union-stream-2.1.3.tgz#c7794c7e077880052ff71a8d4a2dbb4a9a638ac7" + dependencies: + from2 "^1.3.0" + stream-iterate "^1.1.0" + +source-list-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.9: + version "0.5.9" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + +source-map@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + +spdx-correct@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz#e2a303236cac54b04031fa7a5a79c7e701df852f" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + dependencies: + extend-shallow "^3.0.0" + +split@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sqlstring@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.1.tgz#475393ff9e91479aea62dcaf0ca3d14983a7fb40" + +sshpk@^1.7.0: + version "1.14.2" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + safer-buffer "^2.0.2" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +ssri@^5.2.4: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" + dependencies: + safe-buffer "^5.1.1" + +ssri@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + dependencies: + figgy-pudding "^3.5.1" + +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + +stdout-stream@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + dependencies: + readable-stream "^2.0.1" + +stream-browserify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-combiner@^0.2.2: + version "0.2.2" + resolved "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz#aec8cbac177b56b6f4fa479ced8c1912cee52858" + dependencies: + duplexer "~0.1.1" + through "~2.3.4" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-iterate@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/stream-iterate/-/stream-iterate-1.2.0.tgz#2bd7c77296c1702a46488b8ad41f79865eecd4e1" + dependencies: + readable-stream "^2.1.5" + stream-shift "^1.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@^1.0.0, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +stringify-package@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.0.tgz#e02828089333d7d45cd8c287c30aa9a13375081b" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +strip-dirs@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5" + dependencies: + is-natural-number "^4.0.1" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + +strip-indent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +style-loader@^0.21.0: + version "0.21.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.21.0.tgz#68c52e5eb2afc9ca92b6274be277ee59aea3a852" + dependencies: + loader-utils "^1.1.0" + schema-utils "^0.4.5" + +superagent@^3.7.0: + version "3.8.3" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128" + dependencies: + component-emitter "^1.2.0" + cookiejar "^2.1.0" + debug "^3.1.0" + extend "^3.0.0" + form-data "^2.3.1" + formidable "^1.2.0" + methods "^1.1.1" + mime "^1.4.1" + qs "^6.5.1" + readable-stream "^2.3.5" + +supports-color@5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + dependencies: + has-flag "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +supports-color@^4.2.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + dependencies: + has-flag "^2.0.0" + +supports-color@^5.2.0, supports-color@^5.3.0, supports-color@^5.4.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + dependencies: + has-flag "^3.0.0" + +svgo@^0.7.0: + version "0.7.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" + dependencies: + coa "~1.0.1" + colors "~1.1.2" + csso "~2.3.1" + js-yaml "~3.7.0" + mkdirp "~0.5.1" + sax "~1.2.1" + whet.extend "~0.9.9" + +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" + +symbol-observable@^1.0.2, symbol-observable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + +table@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + dependencies: + ajv "^5.2.3" + ajv-keywords "^2.1.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + +tapable@^0.2.7: + version "0.2.8" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" + +tar-stream@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.1.tgz#f84ef1696269d6223ca48f6e1eeede3f7e81f395" + dependencies: + bl "^1.0.0" + buffer-alloc "^1.1.0" + end-of-stream "^1.0.0" + fs-constants "^1.0.0" + readable-stream "^2.3.0" + to-buffer "^1.1.0" + xtend "^4.0.0" + +tar@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +tar@^4, tar@^4.4.3, tar@^4.4.6: + version "4.4.6" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" + dependencies: + chownr "^1.0.1" + fs-minipass "^1.2.5" + minipass "^2.3.3" + minizlib "^1.1.0" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + dependencies: + execa "^0.7.0" + +terraformer-wkt-parser@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/terraformer-wkt-parser/-/terraformer-wkt-parser-1.2.0.tgz#c9d6ac3dff25f4c0bd344e961f42694961834c34" + dependencies: + "@types/geojson" "^1.0.0" + terraformer "~1.0.5" + +terraformer@~1.0.5: + version "1.0.9" + resolved "https://registry.yarnpkg.com/terraformer/-/terraformer-1.0.9.tgz#77851fef4a49c90b345dc53cf26809fdf29dcda6" + optionalDependencies: + "@types/geojson" "^1.0.0" + +text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +thenify-all@1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + dependencies: + thenify ">= 3.1.0 < 4" + +thenify@3, "thenify@>= 3.1.0 < 4": + version "3.3.0" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" + dependencies: + any-promise "^1.0.0" + +through2@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +through@2, "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.4: + version "2.3.8" + resolved "http://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + +timers-browserify@^2.0.4: + version "2.0.10" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" + dependencies: + setimmediate "^1.0.4" + +timers-ext@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.5.tgz#77147dd4e76b660c2abb8785db96574cbbd12922" + dependencies: + es5-ext "~0.10.14" + next-tick "1" + +tiny-relative-date@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + dependencies: + os-tmpdir "~1.0.2" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + +to-buffer@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + +toposort-class@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toposort-class/-/toposort-class-1.0.1.tgz#7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988" + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + dependencies: + nopt "~1.0.10" + +tough-cookie@~2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + dependencies: + punycode "^1.4.1" + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +tree-kill@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.0.tgz#5846786237b4239014f05db156b643212d4c6f36" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +"true-case-path@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" + dependencies: + glob "^7.1.2" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-detect@^4.0.0: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + +type-is@~1.6.15, type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +uglify-js@^2.8.29: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-js@^3.1.4: + version "3.4.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" + dependencies: + commander "~2.17.1" + source-map "~0.6.1" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uglifyjs-webpack-plugin@^0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" + dependencies: + source-map "^0.5.6" + uglify-js "^2.8.29" + webpack-sources "^1.0.1" + +uid-number@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +uid-safe@2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" + dependencies: + random-bytes "~1.0.0" + +umask@^1.1.0, umask@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" + +umzug@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/umzug/-/umzug-2.1.0.tgz#c49dd71c7c26d082a9c9d3592dc6dc92cf867761" + dependencies: + babel-runtime "^6.23.0" + bluebird "^3.4.1" + lodash "^4.17.0" + resolve "^1.0.0" + +unbzip2-stream@^1.0.9: + version "1.3.0" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.0.tgz#745ad5745bc4d8f1ac2eb6fc707cfa51d52ab215" + dependencies: + buffer "^3.0.1" + through "^2.3.6" + +undefsafe@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" + dependencies: + debug "^2.2.0" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + +unique-filename@^1.1.0, unique-filename@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" + dependencies: + imurmurhash "^0.1.4" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + dependencies: + crypto-random-string "^1.0.0" + +universal-analytics@^0.4.17: + version "0.4.17" + resolved "https://registry.yarnpkg.com/universal-analytics/-/universal-analytics-0.4.17.tgz#b57a07e37446ebe4f32872b2152a44cbc5cc4b73" + dependencies: + debug "^3.0.0" + request "2.86.0" + uuid "^3.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + +upath@^1.0.5: + version "1.1.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" + +update-notifier@^2.3.0, update-notifier@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + +url-loader@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.1.1.tgz#4d1f3b4f90dde89f02c008e662d604d7511167c1" + dependencies: + loader-utils "^1.1.0" + mime "^2.0.3" + schema-utils "^1.0.0" + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + dependencies: + prepend-http "^1.0.1" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util-extend@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +util@^0.10.3: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + dependencies: + inherits "2.0.3" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + +uuid@^3.0.0, uuid@^3.1.0, uuid@^3.2.1, uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + +validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate-npm-package-name@^3.0.0, validate-npm-package-name@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + dependencies: + builtins "^1.0.3" + +validator@^10.4.0: + version "10.7.1" + resolved "https://registry.yarnpkg.com/validator/-/validator-10.7.1.tgz#dd4cc750c2134ce4a15a2acfc7b233669d659c5b" + +value-equal@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + +vendors@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + dependencies: + indexof "0.0.1" + +warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" + dependencies: + loose-envify "^1.0.0" + +warning@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.2.tgz#aa6876480872116fa3e11d434b0d0d8d91e44607" + dependencies: + loose-envify "^1.0.0" + +watchpack@^1.4.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +wcwidth@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + dependencies: + defaults "^1.0.3" + +webpack-merge@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.4.tgz#0fde38eabf2d5fd85251c24a5a8c48f8a3f4eb7b" + dependencies: + lodash "^4.17.5" + +webpack-node-externals@^1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-1.7.2.tgz#6e1ee79ac67c070402ba700ef033a9b8d52ac4e3" + +webpack-sources@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.2.0.tgz#18181e0d013fce096faf6f8e6d41eeffffdceac2" + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^3.10.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.12.0.tgz#3f9e34360370602fcf639e97939db486f4ec0d74" + dependencies: + acorn "^5.0.0" + acorn-dynamic-import "^2.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + async "^2.1.2" + enhanced-resolve "^3.4.0" + escope "^3.6.0" + interpret "^1.0.0" + json-loader "^0.5.4" + json5 "^0.5.1" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + mkdirp "~0.5.0" + node-libs-browser "^2.0.0" + source-map "^0.5.3" + supports-color "^4.2.1" + tapable "^0.2.7" + uglifyjs-webpack-plugin "^0.4.6" + watchpack "^1.4.0" + webpack-sources "^1.0.1" + yargs "^8.0.2" + +whatwg-fetch@2.0.4, whatwg-fetch@^2.0.4: + version "2.0.4" + resolved "http://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + +whet.extend@~0.9.9: + version "0.9.9" + resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + +which@1, which@^1.2.9, which@^1.3.0, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + dependencies: + string-width "^1.0.2 || 2" + +widest-line@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273" + dependencies: + string-width "^2.1.1" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +"winston-slack-webhook@github:billbitt/winston-slack-webhook": + version "0.1.5" + resolved "https://codeload.github.com/billbitt/winston-slack-webhook/tar.gz/ce99792bdf6473a9da69c91772eb4ecec4979b6c" + +winston@^2.3.1: + version "2.4.4" + resolved "https://registry.yarnpkg.com/winston/-/winston-2.4.4.tgz#a01e4d1d0a103cf4eada6fc1f886b3110d71c34b" + dependencies: + async "~1.0.0" + colors "1.0.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + stack-trace "0.0.x" + +wkx@^0.4.1: + version "0.4.5" + resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.4.5.tgz#a85e15a6e69d1bfaec2f3c523be3dfa40ab861d0" + dependencies: + "@types/node" "*" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +worker-farm@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" + dependencies: + errno "~0.1.7" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^2.0.0, write-file-atomic@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + +ws@^5.1.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + dependencies: + async-limiter "~1.0.0" + +ws@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.0.0.tgz#eaa494aded00ac4289d455bac8d84c7c651cef35" + dependencies: + async-limiter "~1.0.0" + +x-xss-protection@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/x-xss-protection/-/x-xss-protection-1.1.0.tgz#4f1898c332deb1e7f2be1280efb3e2c53d69c1a7" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +xterm@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.7.0.tgz#b3eb1335dc04b92abe361711731d3b661e13db17" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + dependencies: + camelcase "^3.0.0" + +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + dependencies: + camelcase "^4.1.0" + +yargs-parser@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" + dependencies: + camelcase "^4.1.0" + +yargs@^11.0.0: + version "11.1.0" + resolved "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^9.0.2" + +yargs@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + +yargs@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yauzl@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + dependencies: + fd-slicer "~1.0.1" + +yauzl@^2.4.2: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" From ec2aea5972ce268ce3c21e32a37bcab97601e128 Mon Sep 17 00:00:00 2001 From: Shawn Date: Tue, 25 Sep 2018 21:43:57 -0500 Subject: [PATCH 03/13] Unify routes/rendering --- .gitignore | 1 - client/src/sagas/show_uri.js | 4 +- server/controllers/pages/sendReactApp.js | 4 +- server/render/build/handlePageRender.js | 72 ++++++++++++++++++------ server/render/src/handlePageRender.jsx | 46 --------------- 5 files changed, 60 insertions(+), 67 deletions(-) delete mode 100644 server/render/src/handlePageRender.jsx diff --git a/.gitignore b/.gitignore index 73af4b5d..26605005 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,6 @@ node_modules client/build -server/chainquery/build client_custom/build client_custom/scss diff --git a/client/src/sagas/show_uri.js b/client/src/sagas/show_uri.js index 00432f67..2c85afcf 100644 --- a/client/src/sagas/show_uri.js +++ b/client/src/sagas/show_uri.js @@ -22,6 +22,7 @@ function * parseAndUpdateIdentifierAndClaim (modifier, claim) { }; yield call(newAssetRequest, onNewAssetRequest(claimName, claimId, null, null, extension)); } + function * parseAndUpdateClaimOnly (claim) { // this could be a request for an asset or a channel page // claim could be an asset claim or a channel claim @@ -50,8 +51,9 @@ export function * handleShowPageUri (action) { const { identifier, claim } = action.data; if (identifier) { return yield call(parseAndUpdateIdentifierAndClaim, identifier, claim); + } else if (claim) { + yield call(parseAndUpdateClaimOnly, claim); } - yield call(parseAndUpdateClaimOnly, claim); }; export function * watchHandleShowPageUri () { diff --git a/server/controllers/pages/sendReactApp.js b/server/controllers/pages/sendReactApp.js index e291fd0a..e777f581 100644 --- a/server/controllers/pages/sendReactApp.js +++ b/server/controllers/pages/sendReactApp.js @@ -1,7 +1,7 @@ -const handlePageRender = require('../../render/build/handlePageRender.js'); +const handleShowRender = require('../../render/build/handleShowRender.js'); const sendReactApp = (req, res) => { - handlePageRender(req, res); + handleShowRender(req, res); }; module.exports = sendReactApp; diff --git a/server/render/build/handlePageRender.js b/server/render/build/handlePageRender.js index f07cbe55..98f433ca 100644 --- a/server/render/build/handlePageRender.js +++ b/server/render/build/handlePageRender.js @@ -10,6 +10,12 @@ var _reactRedux = require("react-redux"); var _reactRouterDom = require("react-router-dom"); +var _renderFullPage = _interopRequireDefault(require("../renderFullPage")); + +var _reduxSaga = _interopRequireDefault(require("redux-saga")); + +var _effects = require("redux-saga/effects"); + var _reactHelmet = _interopRequireDefault(require("react-helmet")); var _reducers = _interopRequireDefault(require("@reducers")); @@ -18,33 +24,65 @@ var _GAListener = _interopRequireDefault(require("@components/GAListener")); var _app = _interopRequireDefault(require("@app")); -var _renderFullPage = _interopRequireDefault(require("../renderFullPage.js")); +var _sagas = _interopRequireDefault(require("@sagas")); + +var _actions = _interopRequireDefault(require("@actions")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var returnSagaWithParams = function returnSagaWithParams(saga, params) { + return ( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.next = 2; + return (0, _effects.call)(saga, params); + + case 2: + case "end": + return _context.stop(); + } + } + }, _callee, this); + }) + ); +}; + module.exports = function (req, res) { - var context = {}; // create a new Redux store instance + var context = {}; // create and apply middleware - var store = (0, _redux.createStore)(_reducers.default); // render component to a string + var sagaMiddleware = (0, _reduxSaga.default)(); + var middleware = (0, _redux.applyMiddleware)(sagaMiddleware); // create a new Redux store instance - var html = (0, _server.renderToString)(_react.default.createElement(_reactRedux.Provider, { - store: store - }, _react.default.createElement(_reactRouterDom.StaticRouter, { - location: req.url, - context: context - }, _react.default.createElement(_GAListener.default, null, _react.default.createElement(_app.default, null))))); // get head tags from helmet + var store = (0, _redux.createStore)(_reducers.default, middleware); // create an action to handle the given url, + // and create a the saga needed to handle that action - var helmet = _reactHelmet.default.renderStatic(); // check for a redirect + var action = _actions.default.onHandleShowPageUri(req.params); + + var saga = returnSagaWithParams(_sagas.default.handleShowPageUri, action); // run the saga middleware with the saga call + + sagaMiddleware.run(saga).done.then(function () { + // render component to a string + var html = (0, _server.renderToString)(_react.default.createElement(_reactRedux.Provider, { + store: store + }, _react.default.createElement(_reactRouterDom.StaticRouter, { + location: req.url, + context: context + }, _react.default.createElement(_GAListener.default, null, _react.default.createElement(_app.default, null))))); // get head tags from helmet + + var helmet = _reactHelmet.default.renderStatic(); // check for a redirect - if (context.url) { - // Somewhere a `` was rendered - return res.redirect(301, context.url); - } else {} // we're good, send the response - // get the initial state from our Redux store + if (context.url) { + return res.redirect(301, context.url); + } // get the initial state from our Redux store - var preloadedState = store.getState(); // send the rendered page back to the client + var preloadedState = store.getState(); // send the rendered page back to the client - res.send((0, _renderFullPage.default)(helmet, html, preloadedState)); + res.send((0, _renderFullPage.default)(helmet, html, preloadedState)); + }); }; \ No newline at end of file diff --git a/server/render/src/handlePageRender.jsx b/server/render/src/handlePageRender.jsx deleted file mode 100644 index f10704b1..00000000 --- a/server/render/src/handlePageRender.jsx +++ /dev/null @@ -1,46 +0,0 @@ -import React from 'react'; -import { renderToString } from 'react-dom/server'; -import { createStore } from 'redux'; -import { Provider } from 'react-redux'; -import { StaticRouter } from 'react-router-dom'; -import Helmet from 'react-helmet'; - -import Reducers from '@reducers'; -import GAListener from '@components/GAListener'; -import App from '@app'; -import renderFullPage from '../renderFullPage.js'; - -module.exports = (req, res) => { - let context = {}; - - // create a new Redux store instance - const store = createStore(Reducers); - - // render component to a string - const html = renderToString( - - - - - - - - ); - - // get head tags from helmet - const helmet = Helmet.renderStatic(); - - // check for a redirect - if (context.url) { - // Somewhere a `` was rendered - return res.redirect(301, context.url); - } else { - // we're good, send the response - } - - // get the initial state from our Redux store - const preloadedState = store.getState(); - - // send the rendered page back to the client - res.send(renderFullPage(helmet, html, preloadedState)); -}; From 158f0b48630e00d1f4d39db3eef2aec454b5a8f9 Mon Sep 17 00:00:00 2001 From: Shawn Date: Thu, 27 Sep 2018 22:56:10 -0500 Subject: [PATCH 04/13] Add context & dynamic route sagas, req for Osprey features --- client/src/actions/show.js | 7 +- package-lock.json | 39 ++++++++++++ package.json | 1 + server/index.js | 26 ++++++-- server/render/build/handleShowRender.js | 46 +++++++++---- server/render/src/handleShowRender.jsx | 85 +++++++++++++++---------- server/routes/api/index.js | 38 +++++------ server/routes/assets/index.js | 10 ++- server/routes/auth/index.js | 10 +-- server/routes/fallback/index.js | 4 +- server/routes/index.js | 7 ++ server/routes/pages/index.js | 18 +++--- 12 files changed, 200 insertions(+), 91 deletions(-) create mode 100644 server/routes/index.js diff --git a/client/src/actions/show.js b/client/src/actions/show.js index ee1d0b7e..b4ed7719 100644 --- a/client/src/actions/show.js +++ b/client/src/actions/show.js @@ -2,10 +2,13 @@ import * as actions from '../constants/show_action_types'; import { CHANNEL, ASSET_LITE, ASSET_DETAILS } from '../constants/show_request_types'; // basic request parsing -export function onHandleShowPageUri (params) { +export function onHandleShowPageUri (params, url) { return { type: actions.HANDLE_SHOW_URI, - data: params, + data: { + ...params, + url, + } }; } diff --git a/package-lock.json b/package-lock.json index 87374bf1..d625325d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1259,6 +1259,14 @@ "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", "dev": true }, + "async-hook-jl": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/async-hook-jl/-/async-hook-jl-1.7.6.tgz", + "integrity": "sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg==", + "requires": { + "stack-chain": "1.3.7" + } + }, "async-limiter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", @@ -2690,6 +2698,16 @@ "shimmer": "1.2.0" } }, + "cls-hooked": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/cls-hooked/-/cls-hooked-4.2.2.tgz", + "integrity": "sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw==", + "requires": { + "async-hook-jl": "1.7.6", + "emitter-listener": "1.1.1", + "semver": "5.5.1" + } + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -3640,6 +3658,14 @@ "minimalistic-crypto-utils": "1.0.1" } }, + "emitter-listener": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.1.tgz", + "integrity": "sha1-6Lu+gkS8jg0LTvcc0UKUx/JBx+w=", + "requires": { + "shimmer": "1.2.0" + } + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -4365,6 +4391,14 @@ "promise": "7.3.1" } }, + "express-http-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/express-http-context/-/express-http-context-1.1.0.tgz", + "integrity": "sha512-LS47HseitRIxzBHDEQrlVwZkEkMaViM+nhRCrlWYxPNIu7W8KUZyNUOxiD93OghHesl7y+DhBYuz3yfaNHDvVA==", + "requires": { + "cls-hooked": "4.2.2" + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -12893,6 +12927,11 @@ "tweetnacl": "0.14.5" } }, + "stack-chain": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz", + "integrity": "sha1-0ZLJ/06moiyUxN1FkXHj8AzqEoU=" + }, "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", diff --git a/package.json b/package.json index 3d1cf596..23f23980 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "cookie-session": "^2.0.0-beta.3", "express": "^4.15.2", "express-handlebars": "^3.0.0", + "express-http-context": "^1.1.0", "get-video-dimensions": "^1.0.0", "helmet": "^3.13.0", "image-size": "^0.6.3", diff --git a/server/index.js b/server/index.js index 85222a71..097fd9ce 100644 --- a/server/index.js +++ b/server/index.js @@ -7,6 +7,7 @@ const cookieSession = require('cookie-session'); const http = require('http'); const logger = require('winston'); const Path = require('path'); +const httpContext = require('express-http-context'); // load local modules const db = require('./models'); @@ -26,6 +27,14 @@ const { }, } = require('@config/siteConfig'); +function setRouteDataInContextMiddleware(routePath, routeData) { + return function (req, res, next) { + httpContext.set('routePath', routePath); + httpContext.set('routeData', routeData); + next(); + }; +} + function Server () { this.initialize = () => { // configure logging @@ -43,6 +52,9 @@ function Server () { // set HTTP headers to protect against well-known web vulnerabilties app.use(helmet()); + // Support per-request http-context + app.use(httpContext.middleware); + // 'express.static' to serve static files from public directory const publicPath = Path.resolve(process.cwd(), 'public'); app.use(express.static(publicPath)); @@ -78,11 +90,15 @@ function Server () { app.set('view engine', 'handlebars'); // set the routes on the app - require('./routes/auth/index')(app); - require('./routes/api/index')(app); - require('./routes/pages/index')(app); - require('./routes/assets/index')(app); - require('./routes/fallback/index')(app); + const routes = require('./routes'); + + Object.keys(routes).map((routePath) => { + let routeData = routes[routePath]; + let routeMethod = routeData.hasOwnProperty('method') ? routeData.method : 'get'; + let controllers = Array.isArray(routeData.controller) ? routeData.controller : [routeData.controller]; + + app[routeMethod](routePath, setRouteDataInContextMiddleware(routePath, routeData), ...controllers); + }); this.app = app; }; diff --git a/server/render/build/handleShowRender.js b/server/render/build/handleShowRender.js index 98f433ca..2236d1bb 100644 --- a/server/render/build/handleShowRender.js +++ b/server/render/build/handleShowRender.js @@ -18,6 +18,8 @@ var _effects = require("redux-saga/effects"); var _reactHelmet = _interopRequireDefault(require("react-helmet")); +var httpContext = _interopRequireWildcard(require("express-http-context")); + var _reducers = _interopRequireDefault(require("@reducers")); var _GAListener = _interopRequireDefault(require("@components/GAListener")); @@ -28,6 +30,8 @@ var _sagas = _interopRequireDefault(require("@sagas")); var _actions = _interopRequireDefault(require("@actions")); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var returnSagaWithParams = function returnSagaWithParams(saga, params) { @@ -52,19 +56,17 @@ var returnSagaWithParams = function returnSagaWithParams(saga, params) { }; module.exports = function (req, res) { - var context = {}; // create and apply middleware + var context = {}; - var sagaMiddleware = (0, _reduxSaga.default)(); - var middleware = (0, _redux.applyMiddleware)(sagaMiddleware); // create a new Redux store instance + var _httpContext$get = httpContext.get('routeData'), + _httpContext$get$acti = _httpContext$get.action, + action = _httpContext$get$acti === void 0 ? false : _httpContext$get$acti, + _httpContext$get$saga = _httpContext$get.saga, + saga = _httpContext$get$saga === void 0 ? false : _httpContext$get$saga; - var store = (0, _redux.createStore)(_reducers.default, middleware); // create an action to handle the given url, - // and create a the saga needed to handle that action + var runSaga = action !== false && saga !== false; - var action = _actions.default.onHandleShowPageUri(req.params); - - var saga = returnSagaWithParams(_sagas.default.handleShowPageUri, action); // run the saga middleware with the saga call - - sagaMiddleware.run(saga).done.then(function () { + var renderPage = function renderPage(store) { // render component to a string var html = (0, _server.renderToString)(_react.default.createElement(_reactRedux.Provider, { store: store @@ -84,5 +86,27 @@ module.exports = function (req, res) { var preloadedState = store.getState(); // send the rendered page back to the client res.send((0, _renderFullPage.default)(helmet, html, preloadedState)); - }); + }; + + console.log(httpContext.get('routePath'), runSaga, httpContext.get('routeData'), action, saga); + + if (runSaga) { + // create and apply middleware + var sagaMiddleware = (0, _reduxSaga.default)(); + var middleware = (0, _redux.applyMiddleware)(sagaMiddleware); // create a new Redux store instance + + var store = (0, _redux.createStore)(_reducers.default, middleware); // create an action to handle the given url, + // and create a the saga needed to handle that action + + var boundAction = action(req.params, req.url); + var boundSaga = returnSagaWithParams(saga, boundAction); // run the saga middleware with the saga call + + sagaMiddleware.run(boundSaga).done.then(function () { + return renderPage(store); + }); + } else { + var _store = (0, _redux.createStore)(_reducers.default); + + renderPage(_store); + } }; \ No newline at end of file diff --git a/server/render/src/handleShowRender.jsx b/server/render/src/handleShowRender.jsx index 2a8809f2..f96d8015 100644 --- a/server/render/src/handleShowRender.jsx +++ b/server/render/src/handleShowRender.jsx @@ -7,6 +7,7 @@ import renderFullPage from '../renderFullPage'; import createSagaMiddleware from 'redux-saga'; import { call } from 'redux-saga/effects'; import Helmet from 'react-helmet'; +import * as httpContext from 'express-http-context'; import Reducers from '@reducers'; import GAListener from '@components/GAListener'; @@ -23,46 +24,60 @@ const returnSagaWithParams = (saga, params) => { module.exports = (req, res) => { let context = {}; - // create and apply middleware - const sagaMiddleware = createSagaMiddleware(); - const middleware = applyMiddleware(sagaMiddleware); + const { + action = false, + saga = false, + } = httpContext.get('routeData'); - // create a new Redux store instance - const store = createStore(Reducers, middleware); + const runSaga = (action !== false && saga !== false); - // create an action to handle the given url, - // and create a the saga needed to handle that action - const action = Actions.onHandleShowPageUri(req.params); - const saga = returnSagaWithParams(Sagas.handleShowPageUri, action); + const renderPage = (store) => { + // render component to a string + const html = renderToString( + + + + + + + + ); - // run the saga middleware with the saga call - sagaMiddleware - .run(saga) - .done - .then(() => { - // render component to a string - const html = renderToString( - - - - - - - - ); + // get head tags from helmet + const helmet = Helmet.renderStatic(); - // get head tags from helmet - const helmet = Helmet.renderStatic(); + // check for a redirect + if (context.url) { + return res.redirect(301, context.url); + } - // check for a redirect - if (context.url) { - return res.redirect(301, context.url); - } + // get the initial state from our Redux store + const preloadedState = store.getState(); - // get the initial state from our Redux store - const preloadedState = store.getState(); + // send the rendered page back to the client + res.send(renderFullPage(helmet, html, preloadedState)); + }; - // send the rendered page back to the client - res.send(renderFullPage(helmet, html, preloadedState)); - }); + if (runSaga) { + // create and apply middleware + const sagaMiddleware = createSagaMiddleware(); + const middleware = applyMiddleware(sagaMiddleware); + + // create a new Redux store instance + const store = createStore(Reducers, middleware); + + // create an action to handle the given url, + // and create a the saga needed to handle that action + const boundAction = action(req.params, req.url); + const boundSaga = returnSagaWithParams(saga, boundAction); + + // run the saga middleware with the saga call + sagaMiddleware + .run(boundSaga) + .done + .then(() => renderPage(store) ); + } else { + const store = createStore(Reducers); + renderPage(store); + } }; diff --git a/server/routes/api/index.js b/server/routes/api/index.js index b5a0c466..f4220179 100644 --- a/server/routes/api/index.js +++ b/server/routes/api/index.js @@ -21,31 +21,31 @@ const getTorList = require('../../controllers/api/tor'); const getBlockedList = require('../../controllers/api/blocked'); const getOEmbedData = require('../../controllers/api/oEmbed'); -module.exports = (app) => { +module.exports = { // channel routes - app.get('/api/channel/availability/:name', torCheckMiddleware, channelAvailability); - app.get('/api/channel/short-id/:longId/:name', torCheckMiddleware, channelShortId); - app.get('/api/channel/data/:channelName/:channelClaimId', torCheckMiddleware, channelData); - app.get('/api/channel/claims/:channelName/:channelClaimId/:page', torCheckMiddleware, channelClaims); + '/api/channel/availability/:name': { controller: [ torCheckMiddleware, channelAvailability ] }, + '/api/channel/short-id/:longId/:name': { controller: [ torCheckMiddleware, channelShortId ] }, + '/api/channel/data/:channelName/:channelClaimId': { controller: [ torCheckMiddleware, channelData ] }, + '/api/channel/claims/:channelName/:channelClaimId/:page': { controller: [ torCheckMiddleware, channelClaims ] }, // claim routes - app.get('/api/claim/availability/:name', torCheckMiddleware, claimAvailability); - app.get('/api/claim/data/:claimName/:claimId', torCheckMiddleware, claimData); - app.get('/api/claim/get/:name/:claimId', torCheckMiddleware, claimGet); - app.get('/api/claim/list/:name', torCheckMiddleware, claimList); - app.post('/api/claim/long-id', torCheckMiddleware, claimLongId); // note: should be a 'get' - app.post('/api/claim/publish', torCheckMiddleware, multipartMiddleware, claimPublish); - app.get('/api/claim/resolve/:name/:claimId', torCheckMiddleware, claimResolve); - app.get('/api/claim/short-id/:longId/:name', torCheckMiddleware, claimShortId); + '/api/claim/availability/:name': { controller: [ torCheckMiddleware, claimAvailability ] }, + '/api/claim/data/:claimName/:claimId': { controller: [ torCheckMiddleware, claimData ] }, + '/api/claim/get/:name/:claimId': { controller: [ torCheckMiddleware, claimGet ] }, + '/api/claim/list/:name': { controller: [ torCheckMiddleware, claimList ] }, + '/api/claim/long-id': { method: 'post', controller: [ torCheckMiddleware, claimLongId ] }, // note: should be a 'get' + '/api/claim/publish': { method: 'post', controller: [ torCheckMiddleware, multipartMiddleware, claimPublish ] }, + '/api/claim/resolve/:name/:claimId': { controller: [ torCheckMiddleware, claimResolve ] }, + '/api/claim/short-id/:longId/:name': { controller: [ torCheckMiddleware, claimShortId ] }, // file routes - app.get('/api/file/availability/:name/:claimId', torCheckMiddleware, fileAvailability); + '/api/file/availability/:name/:claimId': { controller: [ torCheckMiddleware, fileAvailability ] }, // user routes - app.put('/api/user/password/', torCheckMiddleware, userPassword); + '/api/user/password/': { method: 'put', controller: [ torCheckMiddleware, userPassword ] }, // configs - app.get('/api/config/site/publishing', torCheckMiddleware, publishingConfig); + '/api/config/site/publishing': { controller: [ torCheckMiddleware, publishingConfig ] }, // tor - app.get('/api/tor', torCheckMiddleware, getTorList); + '/api/tor': { controller: [ torCheckMiddleware, getTorList ] }, // blocked - app.get('/api/blocked', torCheckMiddleware, getBlockedList); + '/api/blocked': { controller: [ torCheckMiddleware, getBlockedList ] }, // open embed - app.get('/api/oembed', torCheckMiddleware, getOEmbedData); + '/api/oembed': { controller: [ torCheckMiddleware, getOEmbedData ] }, }; diff --git a/server/routes/assets/index.js b/server/routes/assets/index.js index ef70ea3f..411a4f64 100644 --- a/server/routes/assets/index.js +++ b/server/routes/assets/index.js @@ -1,7 +1,11 @@ const serveByClaim = require('../../controllers/assets/serveByClaim'); const serveByIdentifierAndClaim = require('../../controllers/assets/serveByIdentifierAndClaim'); -module.exports = (app) => { - app.get('/:identifier/:claim', serveByIdentifierAndClaim); - app.get('/:claim', serveByClaim); +// TODO: Adjust build & sources to use import/export everywhere +const Actions = require('@actions').default; +const Sagas = require('@sagas').default; + +module.exports = { + '/:identifier/:claim': { controller: serveByIdentifierAndClaim, action: Actions.onHandleShowPageUri, saga: Sagas.handleShowPageUri }, + '/:claim': { controller: serveByClaim, action: Actions.onHandleShowPageUri, saga: Sagas.handleShowPageUri }, }; diff --git a/server/routes/auth/index.js b/server/routes/auth/index.js index 9754f5b2..8bdbe1b6 100644 --- a/server/routes/auth/index.js +++ b/server/routes/auth/index.js @@ -4,9 +4,9 @@ const handleLoginRequest = require('../../controllers/auth/login'); const handleLogoutRequest = require('../../controllers/auth/logout'); const handleUserRequest = require('../../controllers/auth/user'); -module.exports = (app) => { - app.post('/signup', speechPassport.authenticate('local-signup'), handleSignupRequest); - app.post('/login', handleLoginRequest); - app.get('/logout', handleLogoutRequest); - app.get('/user', handleUserRequest); +module.exports = { + '/signup': { method: 'post', controller: [ speechPassport.authenticate('local-signup'), handleSignupRequest ] }, + '/login': { method: 'post', controller: handleLoginRequest }, + '/logout': { controller: handleLogoutRequest }, + '/user': { controller: handleUserRequest }, }; diff --git a/server/routes/fallback/index.js b/server/routes/fallback/index.js index cc453b81..d46b3ae8 100644 --- a/server/routes/fallback/index.js +++ b/server/routes/fallback/index.js @@ -1,5 +1,5 @@ const handlePageRequest = require('../../controllers/pages/sendReactApp'); -module.exports = (app) => { - app.get('*', handlePageRequest); +module.exports = { + '*': { controller: handlePageRequest, action: 'fallback' }, }; diff --git a/server/routes/index.js b/server/routes/index.js new file mode 100644 index 00000000..73756955 --- /dev/null +++ b/server/routes/index.js @@ -0,0 +1,7 @@ +module.exports = { + ...require('./pages'), + ...require('./api'), + ...require('./assets'), + ...require('./auth'), + ...require('./fallback'), +}; diff --git a/server/routes/pages/index.js b/server/routes/pages/index.js index 2dff606b..0d097ddf 100644 --- a/server/routes/pages/index.js +++ b/server/routes/pages/index.js @@ -2,13 +2,13 @@ const handlePageRequest = require('../../controllers/pages/sendReactApp'); const handleVideoEmbedRequest = require('../../controllers/pages/sendVideoEmbedPage'); const redirect = require('../../controllers/utils/redirect'); -module.exports = (app) => { - app.get('/', handlePageRequest); - app.get('/login', handlePageRequest); - app.get('/about', handlePageRequest); - app.get('/trending', redirect('/popular')); - app.get('/popular', handlePageRequest); - app.get('/new', handlePageRequest); - app.get('/multisite', handlePageRequest); - app.get('/video-embed/:name/:claimId', handleVideoEmbedRequest); // for twitter +module.exports = { + '/': { controller: handlePageRequest }, + '/login': { controller: handlePageRequest }, + '/about': { controller: handlePageRequest }, + '/trending': { controller: redirect('/popular') }, + '/popular': { controller: handlePageRequest }, + '/new': { controller: handlePageRequest }, + '/multisite': { controller: handlePageRequest }, + '/video-embed/:name/:claimId': { controller: handleVideoEmbedRequest }, // for twitter }; From 580ca10a8e81b171c29bbdb36ae966dfd6141db7 Mon Sep 17 00:00:00 2001 From: Shawn Date: Mon, 8 Oct 2018 12:14:31 -0500 Subject: [PATCH 05/13] Finish chainquery changes (required for metrics/migrations/trending, moving to new PR) --- server/chainquery/models/AbnormalClaimModel.js | 13 +++++++++---- server/chainquery/models/AddressModel.js | 13 +++++++++---- server/chainquery/models/BlockModel.js | 11 ++++++++--- server/chainquery/models/ClaimModel.js | 15 ++++++++++----- server/chainquery/models/InputModel.js | 15 ++++++++++----- server/chainquery/models/OutputModel.js | 13 +++++++++---- server/chainquery/models/SupportModel.js | 11 ++++++++--- .../chainquery/models/TransactionAddressModel.js | 7 ++++++- server/chainquery/models/TransactionModel.js | 15 ++++++++++----- server/render/build/handleShowRender.js | 2 -- 10 files changed, 79 insertions(+), 36 deletions(-) diff --git a/server/chainquery/models/AbnormalClaimModel.js b/server/chainquery/models/AbnormalClaimModel.js index 519aa55f..5a616665 100644 --- a/server/chainquery/models/AbnormalClaimModel.js +++ b/server/chainquery/models/AbnormalClaimModel.js @@ -3,7 +3,12 @@ const getterMethods = { } export default (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'abnormal_claim', { @@ -21,7 +26,7 @@ export default (sequelize, { set() { }, }, is_update: { - type: INTEGER, + type: BOOLEAN, set() { }, }, block_hash: { @@ -49,11 +54,11 @@ export default (sequelize, { set() { }, }, created_at: { - type: INTEGER, + type: DATE(6), set() { }, }, modified_at: { - type: INTEGER, + type: DATE(6), set() { }, }, }, diff --git a/server/chainquery/models/AddressModel.js b/server/chainquery/models/AddressModel.js index b110dd8d..f6387e65 100644 --- a/server/chainquery/models/AddressModel.js +++ b/server/chainquery/models/AddressModel.js @@ -3,7 +3,12 @@ const getterMethods = { } export default (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'address', { @@ -17,15 +22,15 @@ export default (sequelize, { set() { }, }, first_seen: { - type: INTEGER, + type: DATE(6), set() { }, }, created_at: { - type: INTEGER, + type: DATE(6), set() { }, }, modified_at: { - type: INTEGER, + type: DATE(6), set() { }, }, }, diff --git a/server/chainquery/models/BlockModel.js b/server/chainquery/models/BlockModel.js index 0d88f272..95455b18 100644 --- a/server/chainquery/models/BlockModel.js +++ b/server/chainquery/models/BlockModel.js @@ -3,7 +3,12 @@ const getterMethods = { } export default (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'block', { @@ -81,11 +86,11 @@ export default (sequelize, { set() { }, }, created_at: { - type: INTEGER, + type: DATE(6), set() { }, }, modified_at: { - type: INTEGER, + type: DATE(6), set() { }, }, }, diff --git a/server/chainquery/models/ClaimModel.js b/server/chainquery/models/ClaimModel.js index 45886d8d..8f1fbedf 100644 --- a/server/chainquery/models/ClaimModel.js +++ b/server/chainquery/models/ClaimModel.js @@ -35,7 +35,12 @@ const getterMethods = { } export default (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'claim', { @@ -121,7 +126,7 @@ export default (sequelize, { set() { }, }, is_nsfw: { - type: INTEGER, + type: BOOLEAN, set() { }, }, language: { @@ -145,7 +150,7 @@ export default (sequelize, { set() { }, }, is_filtered: { - type: INTEGER, + type: BOOLEAN, set() { }, }, bid_state: { @@ -153,11 +158,11 @@ export default (sequelize, { set() { }, }, created_at: { - type: INTEGER, + type: DATE(6), set() { }, }, modified_at: { - type: INTEGER, + type: DATE(6), set() { }, }, fee_address: { diff --git a/server/chainquery/models/InputModel.js b/server/chainquery/models/InputModel.js index 5a37d522..e825c7f3 100644 --- a/server/chainquery/models/InputModel.js +++ b/server/chainquery/models/InputModel.js @@ -3,7 +3,12 @@ const getterMethods = { } export default (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'input', { @@ -25,7 +30,7 @@ export default (sequelize, { set() { }, }, is_coinbase: { - type: INTEGER, + type: BOOLEAN, set() { }, }, coinbase: { @@ -37,7 +42,7 @@ export default (sequelize, { set() { }, }, prevout_n: { - type: INTEGER, + type: INTEGER.UNSIGNED, set() { }, }, prevout_spend_updated: { @@ -61,11 +66,11 @@ export default (sequelize, { set() { }, }, created: { - type: INTEGER, + type: DATE(6), set() { }, }, modified: { - type: INTEGER, + type: DATE(6), set() { }, }, }, diff --git a/server/chainquery/models/OutputModel.js b/server/chainquery/models/OutputModel.js index 147b06db..47064078 100644 --- a/server/chainquery/models/OutputModel.js +++ b/server/chainquery/models/OutputModel.js @@ -3,7 +3,12 @@ const getterMethods = { } export default (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'output', { @@ -49,7 +54,7 @@ export default (sequelize, { set() { }, }, is_spent: { - type: INTEGER, + type: BOOLEAN, set() { }, }, spent_by_input_id: { @@ -57,11 +62,11 @@ export default (sequelize, { set() { }, }, created_at: { - type: INTEGER, + type: DATE(6), set() { }, }, modified_at: { - type: INTEGER, + type: DATE(6), set() { }, }, claim_id: { diff --git a/server/chainquery/models/SupportModel.js b/server/chainquery/models/SupportModel.js index b214e402..04e94e3b 100644 --- a/server/chainquery/models/SupportModel.js +++ b/server/chainquery/models/SupportModel.js @@ -3,7 +3,12 @@ const getterMethods = { } export default (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'support', { @@ -33,11 +38,11 @@ export default (sequelize, { set() { }, }, created_at: { - type: INTEGER, + type: DATE(6), set() { }, }, modified_at: { - type: INTEGER, + type: DATE(6), set() { }, }, }, diff --git a/server/chainquery/models/TransactionAddressModel.js b/server/chainquery/models/TransactionAddressModel.js index 7cd733ca..62623d2e 100644 --- a/server/chainquery/models/TransactionAddressModel.js +++ b/server/chainquery/models/TransactionAddressModel.js @@ -3,7 +3,12 @@ const getterMethods = { } export default (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'transaction_address', { diff --git a/server/chainquery/models/TransactionModel.js b/server/chainquery/models/TransactionModel.js index 9287e01d..68bec297 100644 --- a/server/chainquery/models/TransactionModel.js +++ b/server/chainquery/models/TransactionModel.js @@ -3,7 +3,12 @@ const getterMethods = { } export default (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'transaction', { @@ -45,7 +50,7 @@ export default (sequelize, { set() { }, }, lock_time: { - type: INTEGER, + type: DATE(6), set() { }, }, raw: { @@ -53,15 +58,15 @@ export default (sequelize, { set() { }, }, created_at: { - type: INTEGER, + type: DATE(6), set() { }, }, modified_at: { - type: INTEGER, + type: DATE(6), set() { }, }, created_time: { - type: INTEGER, + type: DATE(6), set() {}, }, }, diff --git a/server/render/build/handleShowRender.js b/server/render/build/handleShowRender.js index 2236d1bb..f655c8d1 100644 --- a/server/render/build/handleShowRender.js +++ b/server/render/build/handleShowRender.js @@ -88,8 +88,6 @@ module.exports = function (req, res) { res.send((0, _renderFullPage.default)(helmet, html, preloadedState)); }; - console.log(httpContext.get('routePath'), runSaga, httpContext.get('routeData'), action, saga); - if (runSaga) { // create and apply middleware var sagaMiddleware = (0, _reduxSaga.default)(); From 860c61dc4768d8992bc1a203b7aa3e49c8efb6a6 Mon Sep 17 00:00:00 2001 From: Shawn Date: Mon, 8 Oct 2018 19:02:05 -0500 Subject: [PATCH 06/13] Fix chainquery bugs and add initial metrics implementation --- client/src/actions/show.js | 10 ++ client/src/api/homepageApi.js | 6 + client/src/constants/show_action_types.js | 1 + client/src/pages/HomePage/index.jsx | 4 +- client/src/pages/HomePage/view.jsx | 10 ++ client/src/sagas/rootSaga.js | 3 +- client/src/sagas/show_uri.js | 13 ++ package-lock.json | 140 ++++++++++++++++++ package.json | 3 +- server/chainquery/bundle.debug.js | 123 +++++++++------ server/chainquery/bundle.js | 132 +++++++++++------ server/chainquery/index.js | 2 +- server/chainquery/models/ClaimModel.js | 8 - server/chainquery/queries/claimQueries.js | 3 +- server/controllers/api/claim/data/index.js | 3 +- server/controllers/api/claim/get/index.js | 81 +++++----- server/controllers/api/claim/longId/index.js | 5 +- server/controllers/api/claim/shortId/index.js | 21 ++- .../api/homepage/data/getChannelData.js | 28 ++++ server/controllers/api/homepage/data/index.js | 35 +++++ .../assets/utils/getClaimIdAndServeAsset.js | 10 +- server/controllers/utils/getClaimId.js | 34 +++-- server/index.js | 26 +++- server/models/index.js | 20 +-- server/models/metrics.js | 53 +++++++ server/routes/api/index.js | 4 + server/routes/index.js | 2 +- server/routes/pages/index.js | 6 +- 28 files changed, 599 insertions(+), 187 deletions(-) create mode 100644 client/src/api/homepageApi.js create mode 100644 server/controllers/api/homepage/data/getChannelData.js create mode 100644 server/controllers/api/homepage/data/index.js create mode 100644 server/models/metrics.js diff --git a/client/src/actions/show.js b/client/src/actions/show.js index b4ed7719..b5d6d5c0 100644 --- a/client/src/actions/show.js +++ b/client/src/actions/show.js @@ -12,6 +12,16 @@ export function onHandleShowPageUri (params, url) { }; } +export function onHandleShowHomepage (params, url) { + return { + type: actions.HANDLE_SHOW_HOMEPAGE, + data: { + ...params, + url, + } + }; +} + export function onRequestError (error) { return { type: actions.REQUEST_ERROR, diff --git a/client/src/api/homepageApi.js b/client/src/api/homepageApi.js new file mode 100644 index 00000000..58d37870 --- /dev/null +++ b/client/src/api/homepageApi.js @@ -0,0 +1,6 @@ +import Request from '../utils/request'; + +export function getHomepageChannelsData (host, name, id) { + const url = `${host}/api/homepage/data/channels`; + return Request(url); +} diff --git a/client/src/constants/show_action_types.js b/client/src/constants/show_action_types.js index 944b60a6..8bb2eca4 100644 --- a/client/src/constants/show_action_types.js +++ b/client/src/constants/show_action_types.js @@ -1,5 +1,6 @@ // request actions export const HANDLE_SHOW_URI = 'HANDLE_SHOW_URI'; +export const HANDLE_SHOW_HOMEPAGE = 'HANDLE_SHOW_HOMEPAGE'; export const REQUEST_ERROR = 'REQUEST_ERROR'; export const REQUEST_UPDATE = 'REQUEST_UPDATE'; export const ASSET_REQUEST_NEW = 'ASSET_REQUEST_NEW'; diff --git a/client/src/pages/HomePage/index.jsx b/client/src/pages/HomePage/index.jsx index f8357964..eed28610 100644 --- a/client/src/pages/HomePage/index.jsx +++ b/client/src/pages/HomePage/index.jsx @@ -1,5 +1,5 @@ import { connect } from 'react-redux'; -import { onHandleShowPageUri } from '../../actions/show'; +import { onHandleShowHomepage } from '../../actions/show'; import View from './view'; const mapStateToProps = ({ show }) => { @@ -10,7 +10,7 @@ const mapStateToProps = ({ show }) => { }; const mapDispatchToProps = { - onHandleShowPageUri, + onHandleShowHomepage, }; export default connect(mapStateToProps, mapDispatchToProps)(View); diff --git a/client/src/pages/HomePage/view.jsx b/client/src/pages/HomePage/view.jsx index 8ca1e065..91490fae 100644 --- a/client/src/pages/HomePage/view.jsx +++ b/client/src/pages/HomePage/view.jsx @@ -4,6 +4,16 @@ import PageLayout from '@components/PageLayout'; import PublishTool from '@containers/PublishTool'; class HomePage extends React.Component { + componentDidMount () { + this.props.onHandleShowHomepage(this.props.match.params); + } + + componentWillReceiveProps (nextProps) { + if (nextProps.match.params !== this.props.match.params) { + this.props.onHandleShowHomepage(nextProps.match.params); + } + } + render () { return ( sequelize.define( 'abnormal_claim', { @@ -19,7 +24,7 @@ var AbnormalClaimModel = (sequelize, { set() { }, }, is_update: { - type: INTEGER, + type: BOOLEAN, set() { }, }, block_hash: { @@ -47,11 +52,11 @@ var AbnormalClaimModel = (sequelize, { set() { }, }, created_at: { - type: INTEGER, + type: DATE(6), set() { }, }, modified_at: { - type: INTEGER, + type: DATE(6), set() { }, }, }, @@ -73,7 +78,12 @@ var abnormalClaimTable = { }; var AddressModel = (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'address', { @@ -87,15 +97,15 @@ var AddressModel = (sequelize, { set() { }, }, first_seen: { - type: INTEGER, + type: DATE(6), set() { }, }, created_at: { - type: INTEGER, + type: DATE(6), set() { }, }, modified_at: { - type: INTEGER, + type: DATE(6), set() { }, }, }, @@ -117,7 +127,12 @@ var addressTable = { }; var BlockModel = (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'block', { @@ -195,11 +210,11 @@ var BlockModel = (sequelize, { set() { }, }, created_at: { - type: INTEGER, + type: DATE(6), set() { }, }, modified_at: { - type: INTEGER, + type: DATE(6), set() { }, }, }, @@ -257,7 +272,12 @@ const getterMethods$3 = { }; var ClaimModel = (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'claim', { @@ -310,14 +330,6 @@ var ClaimModel = (sequelize, { type: STRING, set() { }, }, - value_as_hex: { - type: STRING, - set() { }, - }, - value_as_json: { - type: STRING, - set() { }, - }, valid_at_height: { type: INTEGER, set() { }, @@ -343,7 +355,7 @@ var ClaimModel = (sequelize, { set() { }, }, is_nsfw: { - type: INTEGER, + type: BOOLEAN, set() { }, }, language: { @@ -367,7 +379,7 @@ var ClaimModel = (sequelize, { set() { }, }, is_filtered: { - type: INTEGER, + type: BOOLEAN, set() { }, }, bid_state: { @@ -375,11 +387,11 @@ var ClaimModel = (sequelize, { set() { }, }, created_at: { - type: INTEGER, + type: DATE(6), set() { }, }, modified_at: { - type: INTEGER, + type: DATE(6), set() { }, }, fee_address: { @@ -409,7 +421,12 @@ var claimTable = { }; var InputModel = (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'input', { @@ -431,7 +448,7 @@ var InputModel = (sequelize, { set() { }, }, is_coinbase: { - type: INTEGER, + type: BOOLEAN, set() { }, }, coinbase: { @@ -443,7 +460,7 @@ var InputModel = (sequelize, { set() { }, }, prevout_n: { - type: INTEGER, + type: INTEGER.UNSIGNED, set() { }, }, prevout_spend_updated: { @@ -467,11 +484,11 @@ var InputModel = (sequelize, { set() { }, }, created: { - type: INTEGER, + type: DATE(6), set() { }, }, modified: { - type: INTEGER, + type: DATE(6), set() { }, }, }, @@ -493,7 +510,12 @@ var inputTable = { }; var OutputModel = (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'output', { @@ -539,7 +561,7 @@ var OutputModel = (sequelize, { set() { }, }, is_spent: { - type: INTEGER, + type: BOOLEAN, set() { }, }, spent_by_input_id: { @@ -547,11 +569,11 @@ var OutputModel = (sequelize, { set() { }, }, created_at: { - type: INTEGER, + type: DATE(6), set() { }, }, modified_at: { - type: INTEGER, + type: DATE(6), set() { }, }, claim_id: { @@ -577,7 +599,12 @@ var outputTable = { }; var SupportModel = (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'support', { @@ -607,11 +634,11 @@ var SupportModel = (sequelize, { set() { }, }, created_at: { - type: INTEGER, + type: DATE(6), set() { }, }, modified_at: { - type: INTEGER, + type: DATE(6), set() { }, }, }, @@ -633,7 +660,12 @@ var supportTable = { }; var TransactionAddressModel = (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'transaction_address', { @@ -674,7 +706,12 @@ var transactionAddressTable = { }; var TransactionModel = (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'transaction', { @@ -716,7 +753,7 @@ var TransactionModel = (sequelize, { set() { }, }, lock_time: { - type: INTEGER, + type: DATE(6), set() { }, }, raw: { @@ -724,15 +761,15 @@ var TransactionModel = (sequelize, { set() { }, }, created_at: { - type: INTEGER, + type: DATE(6), set() { }, }, modified_at: { - type: INTEGER, + type: DATE(6), set() { }, }, created_time: { - type: INTEGER, + type: DATE(6), set() {}, }, }, @@ -820,7 +857,7 @@ var claimQueries = (db, table) => ({ return await table.findAll({ where: { publisher_id: channelClaimId }, order: [['height', 'DESC']], - raw : true, // returns an array of only data, not an array of instances + raw : false, // returns an array of only data, not an array of instances }) .then(channelClaimsArray => { if(channelClaimsArray.length === 0) { diff --git a/server/chainquery/bundle.js b/server/chainquery/bundle.js index b8fc6b07..52802d7f 100644 --- a/server/chainquery/bundle.js +++ b/server/chainquery/bundle.js @@ -1,7 +1,12 @@ 'use strict'; var AbnormalClaimModel = (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'abnormal_claim', { @@ -19,7 +24,7 @@ var AbnormalClaimModel = (sequelize, { set() { }, }, is_update: { - type: INTEGER, + type: BOOLEAN, set() { }, }, block_hash: { @@ -47,11 +52,11 @@ var AbnormalClaimModel = (sequelize, { set() { }, }, created_at: { - type: INTEGER, + type: DATE(6), set() { }, }, modified_at: { - type: INTEGER, + type: DATE(6), set() { }, }, }, @@ -73,7 +78,12 @@ var abnormalClaimTable = { }; var AddressModel = (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'address', { @@ -87,15 +97,15 @@ var AddressModel = (sequelize, { set() { }, }, first_seen: { - type: INTEGER, + type: DATE(6), set() { }, }, created_at: { - type: INTEGER, + type: DATE(6), set() { }, }, modified_at: { - type: INTEGER, + type: DATE(6), set() { }, }, }, @@ -117,7 +127,12 @@ var addressTable = { }; var BlockModel = (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'block', { @@ -195,11 +210,11 @@ var BlockModel = (sequelize, { set() { }, }, created_at: { - type: INTEGER, + type: DATE(6), set() { }, }, modified_at: { - type: INTEGER, + type: DATE(6), set() { }, }, }, @@ -257,7 +272,12 @@ const getterMethods$3 = { }; var ClaimModel = (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'claim', { @@ -310,14 +330,6 @@ var ClaimModel = (sequelize, { type: STRING, set() { }, }, - value_as_hex: { - type: STRING, - set() { }, - }, - value_as_json: { - type: STRING, - set() { }, - }, valid_at_height: { type: INTEGER, set() { }, @@ -343,7 +355,7 @@ var ClaimModel = (sequelize, { set() { }, }, is_nsfw: { - type: INTEGER, + type: BOOLEAN, set() { }, }, language: { @@ -367,7 +379,7 @@ var ClaimModel = (sequelize, { set() { }, }, is_filtered: { - type: INTEGER, + type: BOOLEAN, set() { }, }, bid_state: { @@ -375,11 +387,11 @@ var ClaimModel = (sequelize, { set() { }, }, created_at: { - type: INTEGER, + type: DATE(6), set() { }, }, modified_at: { - type: INTEGER, + type: DATE(6), set() { }, }, fee_address: { @@ -409,7 +421,12 @@ var claimTable = { }; var InputModel = (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'input', { @@ -431,7 +448,7 @@ var InputModel = (sequelize, { set() { }, }, is_coinbase: { - type: INTEGER, + type: BOOLEAN, set() { }, }, coinbase: { @@ -443,7 +460,7 @@ var InputModel = (sequelize, { set() { }, }, prevout_n: { - type: INTEGER, + type: INTEGER.UNSIGNED, set() { }, }, prevout_spend_updated: { @@ -467,11 +484,11 @@ var InputModel = (sequelize, { set() { }, }, created: { - type: INTEGER, + type: DATE(6), set() { }, }, modified: { - type: INTEGER, + type: DATE(6), set() { }, }, }, @@ -493,7 +510,12 @@ var inputTable = { }; var OutputModel = (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'output', { @@ -539,7 +561,7 @@ var OutputModel = (sequelize, { set() { }, }, is_spent: { - type: INTEGER, + type: BOOLEAN, set() { }, }, spent_by_input_id: { @@ -547,11 +569,11 @@ var OutputModel = (sequelize, { set() { }, }, created_at: { - type: INTEGER, + type: DATE(6), set() { }, }, modified_at: { - type: INTEGER, + type: DATE(6), set() { }, }, claim_id: { @@ -577,7 +599,12 @@ var outputTable = { }; var SupportModel = (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'support', { @@ -607,11 +634,11 @@ var SupportModel = (sequelize, { set() { }, }, created_at: { - type: INTEGER, + type: DATE(6), set() { }, }, modified_at: { - type: INTEGER, + type: DATE(6), set() { }, }, }, @@ -633,7 +660,12 @@ var supportTable = { }; var TransactionAddressModel = (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'transaction_address', { @@ -674,7 +706,12 @@ var transactionAddressTable = { }; var TransactionModel = (sequelize, { - STRING, BOOLEAN, INTEGER, TEXT, DECIMAL + BOOLEAN, + DATE, + DECIMAL, + INTEGER, + STRING, + TEXT, }) => sequelize.define( 'transaction', { @@ -716,7 +753,7 @@ var TransactionModel = (sequelize, { set() { }, }, lock_time: { - type: INTEGER, + type: DATE(6), set() { }, }, raw: { @@ -724,15 +761,15 @@ var TransactionModel = (sequelize, { set() { }, }, created_at: { - type: INTEGER, + type: DATE(6), set() { }, }, modified_at: { - type: INTEGER, + type: DATE(6), set() { }, }, created_time: { - type: INTEGER, + type: DATE(6), set() {}, }, }, @@ -799,7 +836,7 @@ const isShortClaimId = (claimId) => { return (claimId && (claimId.length < 40)); }; -var claimQueries = (db, table) => ({ +var claimQueries = (db, table, sequelize) => ({ getShortClaimIdFromLongClaimId: async (claimId, claimName) => { logger$1.debug(`claim.getShortClaimIdFromLongClaimId for ${claimName}#${claimId}`); @@ -820,7 +857,6 @@ var claimQueries = (db, table) => ({ return await table.findAll({ where: { publisher_id: channelClaimId }, order: [['height', 'DESC']], - raw : true, // returns an array of only data, not an array of instances }) .then(channelClaimsArray => { if(channelClaimsArray.length === 0) { @@ -1025,7 +1061,7 @@ if (!database || !username || !password) { } // set sequelize options -const sequelize$1 = new Sequelize(database, username, password, { +const sequelize = new Sequelize(database, username, password, { host : host$1, import : port, dialect : 'mysql', @@ -1049,8 +1085,8 @@ for(let i = 0; i < DATABASE_STRUCTURE_KEYS.length; i++) { let dbKey = DATABASE_STRUCTURE_KEYS[i]; let currentData = DATABASE_STRUCTURE[dbKey]; - db[dbKey] = currentData.table.createModel(sequelize$1, Sequelize); - db[dbKey].queries = currentData.queries(db, db[dbKey]); + db[dbKey] = currentData.table.createModel(sequelize, Sequelize); + db[dbKey].queries = currentData.queries(db, db[dbKey], sequelize); } // run model.association for each model in the db object that has an association @@ -1063,7 +1099,7 @@ DATABASE_STRUCTURE_KEYS.forEach(modelName => { }); // establish mysql connection -sequelize$1 +sequelize .authenticate() .then(() => { logger$2.info('Sequelize has established mysql connection for chainquery successfully.'); diff --git a/server/chainquery/index.js b/server/chainquery/index.js index e0c56e5c..fd1c2a81 100644 --- a/server/chainquery/index.js +++ b/server/chainquery/index.js @@ -98,7 +98,7 @@ for(let i = 0; i < DATABASE_STRUCTURE_KEYS.length; i++) { let currentData = DATABASE_STRUCTURE[dbKey]; db[dbKey] = currentData.table.createModel(sequelize, Sequelize); - db[dbKey].queries = currentData.queries(db, db[dbKey]); + db[dbKey].queries = currentData.queries(db, db[dbKey], sequelize); } // run model.association for each model in the db object that has an association diff --git a/server/chainquery/models/ClaimModel.js b/server/chainquery/models/ClaimModel.js index 8f1fbedf..f6a31a22 100644 --- a/server/chainquery/models/ClaimModel.js +++ b/server/chainquery/models/ClaimModel.js @@ -93,14 +93,6 @@ export default (sequelize, { type: STRING, set() { }, }, - value_as_hex: { - type: STRING, - set() { }, - }, - value_as_json: { - type: STRING, - set() { }, - }, valid_at_height: { type: INTEGER, set() { }, diff --git a/server/chainquery/queries/claimQueries.js b/server/chainquery/queries/claimQueries.js index 8f56f922..8972aaa3 100644 --- a/server/chainquery/queries/claimQueries.js +++ b/server/chainquery/queries/claimQueries.js @@ -32,7 +32,7 @@ const isShortClaimId = (claimId) => { return (claimId && (claimId.length < 40)); } -export default (db, table) => ({ +export default (db, table, sequelize) => ({ getShortClaimIdFromLongClaimId: async (claimId, claimName) => { logger.debug(`claim.getShortClaimIdFromLongClaimId for ${claimName}#${claimId}`); @@ -53,7 +53,6 @@ export default (db, table) => ({ return await table.findAll({ where: { publisher_id: channelClaimId }, order: [['height', 'DESC']], - raw : true, // returns an array of only data, not an array of instances }) .then(channelClaimsArray => { if(channelClaimsArray.length === 0) { diff --git a/server/controllers/api/claim/data/index.js b/server/controllers/api/claim/data/index.js index 0eeedd3d..5909abcb 100644 --- a/server/controllers/api/claim/data/index.js +++ b/server/controllers/api/claim/data/index.js @@ -13,7 +13,7 @@ const claimData = ({ ip, originalUrl, body, params }, res) => { const claimName = params.claimName; let claimId = params.claimId; if (claimId === 'none') claimId = null; - chainquery.claim.queries.resolveClaim(claimName, claimId) + chainquery.claim.queries.resolveClaim(claimName, claimId).catch(() => {}) .then(claimInfo => { if (!claimInfo) { // Not found remote, try local @@ -28,6 +28,7 @@ const claimData = ({ ip, originalUrl, body, params }, res) => { message: 'No claim could be found', }); } + res.status(200).json({ success: true, data : getClaimData(claimInfo), diff --git a/server/controllers/api/claim/get/index.js b/server/controllers/api/claim/get/index.js index fc2df8fb..4223c473 100644 --- a/server/controllers/api/claim/get/index.js +++ b/server/controllers/api/claim/get/index.js @@ -4,6 +4,7 @@ const { handleErrorResponse } = require('../../../utils/errorHandlers.js'); const getClaimData = require('server/utils/getClaimData'); const chainquery = require('chainquery'); const db = require('../../../../models'); +const waitOn = require('wait-on'); /* @@ -11,60 +12,46 @@ const db = require('../../../../models'); */ -const claimGet = ({ ip, originalUrl, params }, res) => { +const claimGet = async ({ ip, originalUrl, params }, res) => { const name = params.name; const claimId = params.claimId; - let resolveResult; - let getResult; + try { + let claimData = await chainquery.claim.queries.resolveClaim(name, claimId).catch(() => {}); + if(!claimData) { + claimData = await db.Claim.resolveClaim(name, claimId); + } + if(!claimData) { + throw new Error('No matching uri found in Claim table'); + } - chainquery.claim.queries.resolveClaim(name, claimId) - .then(result => { - if (!result) { - // could not find remote, return false to try local - return false; - } - return resolveResult = result; - }) - .then(result => { - if (result === false) { - // Could not find remote, try local - return db.Claim.resolveClaim(name, claimId); - } - return result; - }) - .then(result => { - if (!result) { - throw new Error('No matching uri found in Claim table'); - } - return resolveResult = result; - }) - .then(result => getClaim(`${name}#${claimId}`)) - .then(result => { - if (!result) { - throw new Error(`Unable to Get ${name}#${claimId}`); - } - getResult = result; - if (result.completed) { - return createFileRecordDataAfterGet(getClaimData(resolveResult), getResult) - .then(fileData => { - const upsertCriteria = {name, claimId}; - return db.upsert(db.File, fileData, upsertCriteria, 'File'); - }); - } - }) - .then(() => { - const { message, completed } = getResult; - res.status(200).json({ - success: true, - message, - completed, + let lbrynetResult = await getClaim(`${name}#${claimId}`); + if(!lbrynetResult) { + throw new Error(`Unable to Get ${name}#${claimId}`); + } + + let fileData = await createFileRecordDataAfterGet(getClaimData(claimData), lbrynetResult); + const upsertCriteria = { name, claimId }; + await db.upsert(db.File, fileData, upsertCriteria, 'File'); + + try { + await waitOn({ + resources: [ lbrynetResult.file_name ], + delay: 100, + timeout: 10000, // 10 seconds }); - }) - .catch(error => { - handleErrorResponse(originalUrl, ip, error, res); + } catch (e) {} + + const { message, completed } = lbrynetResult; + res.status(200).json({ + success: true, + message, + completed, }); + } catch(error) { + handleErrorResponse(originalUrl, ip, error, res); + } }; module.exports = claimGet; diff --git a/server/controllers/api/claim/longId/index.js b/server/controllers/api/claim/longId/index.js index 93f616af..cc197bc8 100644 --- a/server/controllers/api/claim/longId/index.js +++ b/server/controllers/api/claim/longId/index.js @@ -20,14 +20,15 @@ const claimLongId = ({ ip, originalUrl, body, params }, res) => { const channelClaimId = body.channelClaimId; const claimName = body.claimName; let claimId = body.claimId; + getClaimId(channelName, channelClaimId, claimName, claimId) .then(fullClaimId => { claimId = fullClaimId; - return chainquery.claim.queries.getOutpoint(claimName, fullClaimId); + return chainquery.claim.queries.getOutpoint(claimName, fullClaimId).catch(() => {}); }) .then(outpointResult => { if (!outpointResult) { - return db.Claim.getOutpoint(claimName, fullClaimId); + return db.Claim.getOutpoint(claimName, claimId); } return outpointResult; }) diff --git a/server/controllers/api/claim/shortId/index.js b/server/controllers/api/claim/shortId/index.js index c10e41ee..34bf6d8e 100644 --- a/server/controllers/api/claim/shortId/index.js +++ b/server/controllers/api/claim/shortId/index.js @@ -1,5 +1,6 @@ const { handleErrorResponse } = require('../../../utils/errorHandlers.js'); const db = require('../../../../models'); +const chainquery = require('chainquery'); /* @@ -7,14 +8,18 @@ const db = require('../../../../models'); */ -const claimShortId = ({ ip, originalUrl, body, params }, res) => { - db.Claim.getShortClaimIdFromLongClaimId(params.longId, params.name) - .then(shortId => { - res.status(200).json({success: true, data: shortId}); - }) - .catch(error => { - handleErrorResponse(originalUrl, ip, error, res); - }); +const claimShortId = async ({ ip, originalUrl, body, params }, res) => { + try { + let shortId = await chainquery.claim.queries.getShortClaimIdFromLongClaimId(params.longId, params.name); + + if(shortId === null) { + shortId = await db.Claim.getShortClaimIdFromLongClaimId(params.longId, params.name); + } + + res.status(200).json({success: true, data: shortId}); + } catch(error) { + handleErrorResponse(originalUrl, ip, error, res); + } }; module.exports = claimShortId; diff --git a/server/controllers/api/homepage/data/getChannelData.js b/server/controllers/api/homepage/data/getChannelData.js new file mode 100644 index 00000000..a0db2374 --- /dev/null +++ b/server/controllers/api/homepage/data/getChannelData.js @@ -0,0 +1,28 @@ +const db = require('../../../../models'); + +const getChannelData = (channelName, channelClaimId) => { + return new Promise((resolve, reject) => { + let longChannelClaimId; + // 1. get the long channel Id (make sure channel exists) + db.Certificate + .getLongChannelId(channelName, channelClaimId) + .then(fullClaimId => { + longChannelClaimId = fullClaimId; + return db + .Certificate + .getShortChannelIdFromLongChannelId(fullClaimId, channelName); + }) + .then(shortChannelClaimId => { + resolve({ + channelName, + longChannelClaimId, + shortChannelClaimId, + }); + }) + .catch(error => { + reject(error); + }); + }); +}; + +module.exports = getChannelData; diff --git a/server/controllers/api/homepage/data/index.js b/server/controllers/api/homepage/data/index.js new file mode 100644 index 00000000..610f1cb5 --- /dev/null +++ b/server/controllers/api/homepage/data/index.js @@ -0,0 +1,35 @@ +const { handleErrorResponse } = require('../../../utils/errorHandlers.js'); + +const getChannelData = require('./getChannelData.js'); + +const NO_CHANNEL = 'NO_CHANNEL'; + +/* + + route to get data for a channel + +*/ + +const channelData = ({ ip, originalUrl, body, params }, res) => { + const channelName = params.channelName; + let channelClaimId = params.channelClaimId; + if (channelClaimId === 'none') channelClaimId = null; + getChannelData(channelName, channelClaimId) + .then(data => { + res.status(200).json({ + success: true, + data, + }); + }) + .catch(error => { + if (error === NO_CHANNEL) { + return res.status(404).json({ + success: false, + message: 'No matching channel was found', + }); + } + handleErrorResponse(originalUrl, ip, error, res); + }); +}; + +module.exports = channelData; diff --git a/server/controllers/assets/utils/getClaimIdAndServeAsset.js b/server/controllers/assets/utils/getClaimIdAndServeAsset.js index 00bf9532..636ed6b3 100644 --- a/server/controllers/assets/utils/getClaimIdAndServeAsset.js +++ b/server/controllers/assets/utils/getClaimIdAndServeAsset.js @@ -1,6 +1,7 @@ const logger = require('winston'); const db = require('../../../models'); +const chainquery = require('chainquery'); const getClaimId = require('../../utils/getClaimId.js'); const { handleErrorResponse } = require('../../utils/errorHandlers.js'); @@ -16,8 +17,13 @@ const getClaimIdAndServeAsset = (channelName, channelClaimId, claimName, claimId getClaimId(channelName, channelClaimId, claimName, claimId) .then(fullClaimId => { claimId = fullClaimId; - logger.debug('Full claim id:', fullClaimId); - return db.Claim.getOutpoint(claimName, fullClaimId); + return chainquery.claim.queries.getOutpoint(claimName, fullClaimId).catch(() => {}); + }) + .then(outpointResult => { + if (!outpointResult) { + return db.Claim.getOutpoint(claimName, claimId); + } + return outpointResult; }) .then(outpoint => { logger.debug('Outpoint:', outpoint); diff --git a/server/controllers/utils/getClaimId.js b/server/controllers/utils/getClaimId.js index 7feaa8c4..da771bd1 100644 --- a/server/controllers/utils/getClaimId.js +++ b/server/controllers/utils/getClaimId.js @@ -1,22 +1,38 @@ const logger = require('winston'); const db = require('../../models'); +const chainquery = require('chainquery'); -const getClaimIdByChannel = (channelName, channelClaimId, claimName) => { +const getClaimIdByChannel = async (channelName, channelClaimId, claimName) => { logger.debug(`getClaimIdByChannel(${channelName}, ${channelClaimId}, ${claimName})`); - return db.Certificate - .getLongChannelId(channelName, channelClaimId) - .then(longChannelId => { - return db.Claim.getClaimIdByLongChannelId(longChannelId, claimName); - }); + + let channelId = await chainquery.claim.queries.getLongClaimIdFromShortClaimId(channelName, channelClaimId); + + if(channelId === null) { + channelId = await db.Certificate.getLongChannelId(channelName, channelClaimId); + } + + let claimId = await chainquery.claim.queries.getClaimIdByLongChannelId(longChannelId, claimName); + + if(claimId === null) { + claimId = db.Claim.getClaimIdByLongChannelId(longChannelId, claimName); + } + + return claimId; }; -const getClaimId = (channelName, channelClaimId, name, claimId) => { +const getClaimId = async (channelName, channelClaimId, name, claimId) => { logger.debug(`getClaimId: ${channelName}, ${channelClaimId}, ${name}, ${claimId})`); if (channelName) { - return getClaimIdByChannel(channelName, channelClaimId, name); + return await getClaimIdByChannel(channelName, channelClaimId, name); } else { - return db.Claim.getLongClaimId(name, claimId); + let claimIdResult = await chainquery.claim.queries.getLongClaimId(name, claimId); + + if(claimIdResult === null) { + claimIdResult = await db.Claim.getLongClaimId(name, claimId); + } + + return claimIdResult; } }; diff --git a/server/index.js b/server/index.js index 097fd9ce..6b140d28 100644 --- a/server/index.js +++ b/server/index.js @@ -27,6 +27,25 @@ const { }, } = require('@config/siteConfig'); +function logMetricsMiddleware(req, res, next) { + res.on('finish', () => { + const userAgent = req.get('user-agent'); + + db.RequestMetrics.create({ + isInternal: /node\-fetch/.test(userAgent), + routePath: httpContext.get('routePath'), + params: JSON.stringify(req.params), + ip: req.headers['x-forwarded-for'] || req.connection.remoteAddress, + request: req.url, + routeData: JSON.stringify(httpContext.get('routeData')), + referrer: req.get('referrer'), + userAgent, + }); + }); + + next(); +} + function setRouteDataInContextMiddleware(routePath, routeData) { return function (req, res, next) { httpContext.set('routePath', routePath); @@ -97,7 +116,12 @@ function Server () { let routeMethod = routeData.hasOwnProperty('method') ? routeData.method : 'get'; let controllers = Array.isArray(routeData.controller) ? routeData.controller : [routeData.controller]; - app[routeMethod](routePath, setRouteDataInContextMiddleware(routePath, routeData), ...controllers); + app[routeMethod]( + routePath, + logMetricsMiddleware, + setRouteDataInContextMiddleware(routePath, routeData), + ...controllers, + ); }); this.app = app; diff --git a/server/models/index.js b/server/models/index.js index 44da2e83..54461da6 100644 --- a/server/models/index.js +++ b/server/models/index.js @@ -1,13 +1,14 @@ const Sequelize = require('sequelize'); const logger = require('winston'); -const Certificate = require('./certificate.js'); -const Channel = require('./channel.js'); -const Claim = require('./claim.js'); -const File = require('./file.js'); -const User = require('./user.js'); -const Blocked = require('./blocked.js'); -const Tor = require('./tor.js'); +const Blocked = require('./blocked'); +const Certificate = require('./certificate'); +const Channel = require('./channel'); +const Claim = require('./claim'); +const File = require('./file'); +const Metrics = require('./metrics'); +const Tor = require('./tor'); +const User = require('./user'); const { database, @@ -48,13 +49,14 @@ sequelize // manually add each model to the db object (note: make this dynamic) const db = {}; +db['Blocked'] = sequelize.import('Blocked', Blocked); db['Certificate'] = sequelize.import('Certificate', Certificate); db['Channel'] = sequelize.import('Channel', Channel); db['Claim'] = sequelize.import('Claim', Claim); db['File'] = sequelize.import('File', File); -db['User'] = sequelize.import('User', User); -db['Blocked'] = sequelize.import('Blocked', Blocked); +db['Metrics'] = sequelize.import('Metrics', Metrics); db['Tor'] = sequelize.import('Tor', Tor); +db['User'] = sequelize.import('User', User); // run model.association for each model in the db object that has an association logger.info('associating db models...'); diff --git a/server/models/metrics.js b/server/models/metrics.js new file mode 100644 index 00000000..766f2525 --- /dev/null +++ b/server/models/metrics.js @@ -0,0 +1,53 @@ +module.exports = (sequelize, { BOOLEAN, DATE, STRING }) => { + const RequestMetrics = sequelize.define( + 'RequestMetrics', + { + time: { + type: DATE(6), + defaultValue: sequelize.NOW, + }, + isInternal: { + type: BOOLEAN, + }, + claimId: { + type: STRING, + defaultValue: null, + }, + ip: { + type: STRING, + defaultValue: null, + }, + request: { + type: STRING, + defaultValue: null, + }, + userAgent: { + type: STRING, + defaultValue: null, + }, + referrer: { + type: STRING, + defaultValue: null, + }, + routePath: { + type: STRING, + defaultValue: null, + }, + params: { + type: STRING, + defaultValue: null, + } + }, + { + freezeTableName: true, + timestamps: false, // don't use default timestamps columns + indexes: [ + { + fields: ['isInternal', 'isChannel', 'time', 'claimId', 'routePath'], + }, + ], + } + ); + + return RequestMetrics; +}; diff --git a/server/routes/api/index.js b/server/routes/api/index.js index f4220179..3866f5d6 100644 --- a/server/routes/api/index.js +++ b/server/routes/api/index.js @@ -22,10 +22,14 @@ const getBlockedList = require('../../controllers/api/blocked'); const getOEmbedData = require('../../controllers/api/oEmbed'); module.exports = { + // homepage routes + '/api/homepage/data/channels': { controller: [ torCheckMiddleware, channelData ] }, + // channel routes '/api/channel/availability/:name': { controller: [ torCheckMiddleware, channelAvailability ] }, '/api/channel/short-id/:longId/:name': { controller: [ torCheckMiddleware, channelShortId ] }, '/api/channel/data/:channelName/:channelClaimId': { controller: [ torCheckMiddleware, channelData ] }, + '/api/channel/data/:channelName/:channelClaimId': { controller: [ torCheckMiddleware, channelData ] }, '/api/channel/claims/:channelName/:channelClaimId/:page': { controller: [ torCheckMiddleware, channelClaims ] }, // claim routes '/api/claim/availability/:name': { controller: [ torCheckMiddleware, claimAvailability ] }, diff --git a/server/routes/index.js b/server/routes/index.js index 73756955..71223948 100644 --- a/server/routes/index.js +++ b/server/routes/index.js @@ -1,7 +1,7 @@ module.exports = { ...require('./pages'), ...require('./api'), - ...require('./assets'), ...require('./auth'), + ...require('./assets'), ...require('./fallback'), }; diff --git a/server/routes/pages/index.js b/server/routes/pages/index.js index 0d097ddf..da05cc64 100644 --- a/server/routes/pages/index.js +++ b/server/routes/pages/index.js @@ -2,8 +2,12 @@ const handlePageRequest = require('../../controllers/pages/sendReactApp'); const handleVideoEmbedRequest = require('../../controllers/pages/sendVideoEmbedPage'); const redirect = require('../../controllers/utils/redirect'); +// TODO: Adjust build & sources to use import/export everywhere +const Actions = require('@actions').default; +const Sagas = require('@sagas').default; + module.exports = { - '/': { controller: handlePageRequest }, + '/': { controller: handlePageRequest, action: Actions.onHandleShowHomepage, saga: Sagas.handleShowHomepage }, '/login': { controller: handlePageRequest }, '/about': { controller: handlePageRequest }, '/trending': { controller: redirect('/popular') }, From 29fe0cb9b832168e2277d08672f56239ec04cb82 Mon Sep 17 00:00:00 2001 From: Shawn Date: Mon, 8 Oct 2018 19:13:03 -0500 Subject: [PATCH 07/13] Remove deprecated index (until an async context allows support) --- server/models/metrics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/models/metrics.js b/server/models/metrics.js index 766f2525..7b3b57e5 100644 --- a/server/models/metrics.js +++ b/server/models/metrics.js @@ -43,7 +43,7 @@ module.exports = (sequelize, { BOOLEAN, DATE, STRING }) => { timestamps: false, // don't use default timestamps columns indexes: [ { - fields: ['isInternal', 'isChannel', 'time', 'claimId', 'routePath'], + fields: ['isInternal', 'time', 'claimId', 'routePath'], }, ], } From 4395579fcaded816357e848048376791252185e8 Mon Sep 17 00:00:00 2001 From: Shawn Date: Mon, 8 Oct 2018 19:13:24 -0500 Subject: [PATCH 08/13] Remove deprecated index (until an async context allows support) --- server/models/metrics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/models/metrics.js b/server/models/metrics.js index 7b3b57e5..d17e8748 100644 --- a/server/models/metrics.js +++ b/server/models/metrics.js @@ -43,7 +43,7 @@ module.exports = (sequelize, { BOOLEAN, DATE, STRING }) => { timestamps: false, // don't use default timestamps columns indexes: [ { - fields: ['isInternal', 'time', 'claimId', 'routePath'], + fields: ['isInternal', 'time', 'routePath'], }, ], } From 0be8422e6526e83ba798b9a016dcad5cd6f3b7eb Mon Sep 17 00:00:00 2001 From: Shawn Date: Mon, 8 Oct 2018 19:15:44 -0500 Subject: [PATCH 09/13] Remove deprecated index (until an async context allows support) --- server/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/index.js b/server/index.js index 3baf6fd0..e7d546ee 100644 --- a/server/index.js +++ b/server/index.js @@ -31,7 +31,7 @@ function logMetricsMiddleware(req, res, next) { res.on('finish', () => { const userAgent = req.get('user-agent'); - db.RequestMetrics.create({ + db.Metrics.create({ isInternal: /node\-fetch/.test(userAgent), routePath: httpContext.get('routePath'), params: JSON.stringify(req.params), From 4aaff575b32268392aed78b41d58f03abf9412d8 Mon Sep 17 00:00:00 2001 From: Shawn Date: Tue, 9 Oct 2018 09:57:09 -0500 Subject: [PATCH 10/13] Remove old column --- server/chainquery/models/ClaimModel.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/server/chainquery/models/ClaimModel.js b/server/chainquery/models/ClaimModel.js index f6a31a22..60f08482 100644 --- a/server/chainquery/models/ClaimModel.js +++ b/server/chainquery/models/ClaimModel.js @@ -141,10 +141,6 @@ export default (sequelize, { type: STRING, set() { }, }, - is_filtered: { - type: BOOLEAN, - set() { }, - }, bid_state: { type: STRING, set() { }, From bacb05abe8850000c84bd2e5efd6a6f3a7a2ead0 Mon Sep 17 00:00:00 2001 From: Shawn Date: Tue, 9 Oct 2018 13:10:06 -0500 Subject: [PATCH 11/13] Fix minor exception in getting claimId util, fix metrics --- server/controllers/utils/getClaimId.js | 2 +- server/index.js | 5 ++++- server/models/metrics.js | 12 ++++++++---- server/render/build/handleShowRender.js | 14 +++++++++++++- server/render/src/handleShowRender.jsx | 12 ++++++++++++ 5 files changed, 38 insertions(+), 7 deletions(-) diff --git a/server/controllers/utils/getClaimId.js b/server/controllers/utils/getClaimId.js index da771bd1..3eab179e 100644 --- a/server/controllers/utils/getClaimId.js +++ b/server/controllers/utils/getClaimId.js @@ -12,7 +12,7 @@ const getClaimIdByChannel = async (channelName, channelClaimId, claimName) => { channelId = await db.Certificate.getLongChannelId(channelName, channelClaimId); } - let claimId = await chainquery.claim.queries.getClaimIdByLongChannelId(longChannelId, claimName); + let claimId = await chainquery.claim.queries.getClaimIdByLongChannelId(channelId, claimName); if(claimId === null) { claimId = db.Claim.getClaimIdByLongChannelId(longChannelId, claimName); diff --git a/server/index.js b/server/index.js index e7d546ee..83a1dbbd 100644 --- a/server/index.js +++ b/server/index.js @@ -30,9 +30,12 @@ const { function logMetricsMiddleware(req, res, next) { res.on('finish', () => { const userAgent = req.get('user-agent'); + const routePath = httpContext.get('routePath'); db.Metrics.create({ isInternal: /node\-fetch/.test(userAgent), + isChannel: res.isChannel, + claimId: res.claimId, routePath: httpContext.get('routePath'), params: JSON.stringify(req.params), ip: req.headers['x-forwarded-for'] || req.connection.remoteAddress, @@ -97,7 +100,7 @@ function Server () { app.use(speechPassport.session()); // configure handlebars & register it with express app - const viewsPath = Path.resolve(process.cwd(), 'server/views'); + const viewsPath = Path.resolve(process.cwd(), 'node_modules/spee.ch/server/views'); app.engine('handlebars', expressHandlebars({ async : false, dataType : 'text', diff --git a/server/models/metrics.js b/server/models/metrics.js index d17e8748..1747aa1e 100644 --- a/server/models/metrics.js +++ b/server/models/metrics.js @@ -1,6 +1,6 @@ module.exports = (sequelize, { BOOLEAN, DATE, STRING }) => { - const RequestMetrics = sequelize.define( - 'RequestMetrics', + const Metrics = sequelize.define( + 'Metrics', { time: { type: DATE(6), @@ -9,6 +9,10 @@ module.exports = (sequelize, { BOOLEAN, DATE, STRING }) => { isInternal: { type: BOOLEAN, }, + isChannel: { + type: BOOLEAN, + defaultValue: false, + }, claimId: { type: STRING, defaultValue: null, @@ -43,11 +47,11 @@ module.exports = (sequelize, { BOOLEAN, DATE, STRING }) => { timestamps: false, // don't use default timestamps columns indexes: [ { - fields: ['isInternal', 'time', 'routePath'], + fields: ['isInternal', 'isChannel', 'time', 'claimId', 'routePath'], }, ], } ); - return RequestMetrics; + return Metrics; }; diff --git a/server/render/build/handleShowRender.js b/server/render/build/handleShowRender.js index f655c8d1..d777c86a 100644 --- a/server/render/build/handleShowRender.js +++ b/server/render/build/handleShowRender.js @@ -67,7 +67,19 @@ module.exports = function (req, res) { var runSaga = action !== false && saga !== false; var renderPage = function renderPage(store) { - // render component to a string + // Workaround, remove when a solution for async httpContext exists + var showState = store.getState().show; + var assetKeys = Object.keys(showState.assetList); + + if (assetKeys.length !== 0) { + res.claimId = showState.assetList[assetKeys[0]].claimId; + } else { + var channelKeys = Object.keys(showState.channelList); + res.claimId = showState.channelList[channelKeys[0]].longId; + res.isChannel = true; + } // render component to a string + + var html = (0, _server.renderToString)(_react.default.createElement(_reactRedux.Provider, { store: store }, _react.default.createElement(_reactRouterDom.StaticRouter, { diff --git a/server/render/src/handleShowRender.jsx b/server/render/src/handleShowRender.jsx index f96d8015..e4db93d1 100644 --- a/server/render/src/handleShowRender.jsx +++ b/server/render/src/handleShowRender.jsx @@ -32,6 +32,18 @@ module.exports = (req, res) => { const runSaga = (action !== false && saga !== false); const renderPage = (store) => { + + // Workaround, remove when a solution for async httpContext exists + const showState = store.getState().show; + const assetKeys = Object.keys(showState.assetList); + if(assetKeys.length !== 0) { + res.claimId = showState.assetList[assetKeys[0]].claimId; + } else { + const channelKeys = Object.keys(showState.channelList); + res.claimId = showState.channelList[channelKeys[0]].longId; + res.isChannel = true; + } + // render component to a string const html = renderToString( From 42ef398107f182b8d22aa63b4b4c4fc2dc3dfc39 Mon Sep 17 00:00:00 2001 From: Shawn Date: Tue, 9 Oct 2018 13:18:02 -0500 Subject: [PATCH 12/13] User anumeration for bid_state --- server/chainquery/bundle.js | 7 ++----- server/chainquery/models/ClaimModel.js | 3 ++- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/server/chainquery/bundle.js b/server/chainquery/bundle.js index 52802d7f..7661f9f9 100644 --- a/server/chainquery/bundle.js +++ b/server/chainquery/bundle.js @@ -275,6 +275,7 @@ var ClaimModel = (sequelize, { BOOLEAN, DATE, DECIMAL, + ENUM, INTEGER, STRING, TEXT, @@ -378,12 +379,8 @@ var ClaimModel = (sequelize, { type: STRING, set() { }, }, - is_filtered: { - type: BOOLEAN, - set() { }, - }, bid_state: { - type: STRING, + type: ENUM('Active', 'Expired', 'Controlling', 'Spent', 'Accepted'), set() { }, }, created_at: { diff --git a/server/chainquery/models/ClaimModel.js b/server/chainquery/models/ClaimModel.js index 60f08482..0008f457 100644 --- a/server/chainquery/models/ClaimModel.js +++ b/server/chainquery/models/ClaimModel.js @@ -38,6 +38,7 @@ export default (sequelize, { BOOLEAN, DATE, DECIMAL, + ENUM, INTEGER, STRING, TEXT, @@ -142,7 +143,7 @@ export default (sequelize, { set() { }, }, bid_state: { - type: STRING, + type: ENUM('Active', 'Expired', 'Controlling', 'Spent', 'Accepted'), set() { }, }, created_at: { From f8f611905be1186bc030df37594d513294c526a6 Mon Sep 17 00:00:00 2001 From: Shawn Date: Tue, 9 Oct 2018 19:11:06 -0500 Subject: [PATCH 13/13] Fix channel names not showing on view pages --- server/chainquery/bundle.js | 15 +++++++ server/chainquery/queries/claimQueries.js | 15 +++++++ .../api/channel/claims/getChannelClaims.js | 2 +- server/controllers/api/claim/data/index.js | 42 +++++++++---------- server/controllers/api/claim/get/index.js | 2 +- server/utils/getClaimData.js | 35 +++++++++++----- 6 files changed, 76 insertions(+), 35 deletions(-) diff --git a/server/chainquery/bundle.js b/server/chainquery/bundle.js index 7661f9f9..95b1b589 100644 --- a/server/chainquery/bundle.js +++ b/server/chainquery/bundle.js @@ -835,6 +835,21 @@ const isShortClaimId = (claimId) => { var claimQueries = (db, table, sequelize) => ({ + getClaimChannelName: async (publisher_id) => { + return await table.findAll({ + where : { claim_id: publisher_id }, + attributes: ['name'], + }).then(result => { + if(result.length === 0) { + throw new Error(`no record found for ${claimId}`); + } else if(result.length !== 1) { + logger$1.warn(`more than one record matches ${claimId} in db.Claim`); + } + + return result[0].name; + }); + }, + getShortClaimIdFromLongClaimId: async (claimId, claimName) => { logger$1.debug(`claim.getShortClaimIdFromLongClaimId for ${claimName}#${claimId}`); return await table.findAll({ diff --git a/server/chainquery/queries/claimQueries.js b/server/chainquery/queries/claimQueries.js index 8972aaa3..27f2ea93 100644 --- a/server/chainquery/queries/claimQueries.js +++ b/server/chainquery/queries/claimQueries.js @@ -34,6 +34,21 @@ const isShortClaimId = (claimId) => { export default (db, table, sequelize) => ({ + getClaimChannelName: async (publisher_id) => { + return await table.findAll({ + where : { claim_id: publisher_id }, + attributes: ['name'], + }).then(result => { + if(result.length === 0) { + throw new Error(`no record found for ${claimId}`); + } else if(result.length !== 1) { + logger.warn(`more than one record matches ${claimId} in db.Claim`); + } + + return result[0].name; + }); + }, + getShortClaimIdFromLongClaimId: async (claimId, claimName) => { logger.debug(`claim.getShortClaimIdFromLongClaimId for ${claimName}#${claimId}`); return await table.findAll({ diff --git a/server/controllers/api/channel/claims/getChannelClaims.js b/server/controllers/api/channel/claims/getChannelClaims.js index 213b769e..f0252b53 100644 --- a/server/controllers/api/channel/claims/getChannelClaims.js +++ b/server/controllers/api/channel/claims/getChannelClaims.js @@ -7,7 +7,7 @@ const getChannelClaims = async (channelName, channelShortId, page) => { const channelId = await chainquery.claim.queries.getLongClaimId(channelName, channelShortId); const channelClaims = await chainquery.claim.queries.getAllChannelClaims(channelId); - const processedChannelClaims = channelClaims.map((claim) => getClaimData(claim)); + const processedChannelClaims = await channelClaims.map((claim) => getClaimData(claim)); return returnPaginatedChannelClaims(channelName, channelId, processedChannelClaims, page); }; diff --git a/server/controllers/api/claim/data/index.js b/server/controllers/api/claim/data/index.js index 5909abcb..482be972 100644 --- a/server/controllers/api/claim/data/index.js +++ b/server/controllers/api/claim/data/index.js @@ -9,34 +9,32 @@ const db = require('../../../../models'); */ -const claimData = ({ ip, originalUrl, body, params }, res) => { +const claimData = async ({ ip, originalUrl, body, params }, res) => { const claimName = params.claimName; let claimId = params.claimId; if (claimId === 'none') claimId = null; - chainquery.claim.queries.resolveClaim(claimName, claimId).catch(() => {}) - .then(claimInfo => { - if (!claimInfo) { - // Not found remote, try local - return db.Claim.resolveClaim(claimName, claimId) - } - return claimInfo - }) - .then(claimInfo => { - if (!claimInfo) { - return res.status(404).json({ - success: false, - message: 'No claim could be found', - }); - } - res.status(200).json({ - success: true, - data : getClaimData(claimInfo), + try { + let resolvedClaim = await chainquery.claim.queries.resolveClaim(claimName, claimId).catch(() => {}); + + if(!resolvedClaim) { + resolvedClaim = await db.Claim.resolveClaim(claimName, claimId); + } + + if (!resolvedClaim) { + return res.status(404).json({ + success: false, + message: 'No claim could be found', }); - }) - .catch(error => { - handleErrorResponse(originalUrl, ip, error, res); + } + + res.status(200).json({ + success: true, + data : await getClaimData(resolvedClaim), }); + } catch(error) { + handleErrorResponse(originalUrl, ip, error, res); + } }; module.exports = claimData; diff --git a/server/controllers/api/claim/get/index.js b/server/controllers/api/claim/get/index.js index 4223c473..5af4e9a5 100644 --- a/server/controllers/api/claim/get/index.js +++ b/server/controllers/api/claim/get/index.js @@ -31,7 +31,7 @@ const claimGet = async ({ ip, originalUrl, params }, res) => { throw new Error(`Unable to Get ${name}#${claimId}`); } - let fileData = await createFileRecordDataAfterGet(getClaimData(claimData), lbrynetResult); + let fileData = await createFileRecordDataAfterGet(await getClaimData(claimData), lbrynetResult); const upsertCriteria = { name, claimId }; await db.upsert(db.File, fileData, upsertCriteria, 'File'); diff --git a/server/utils/getClaimData.js b/server/utils/getClaimData.js index 8b84b3f7..68c367e2 100644 --- a/server/utils/getClaimData.js +++ b/server/utils/getClaimData.js @@ -1,13 +1,26 @@ const { details: { host } } = require('@config/siteConfig'); +const chainquery = require('chainquery'); -module.exports = (data) => ({ - name: data.name, - title: data.title, - contentType: data.content_type || data.contentType, - claimId: data.claim_id || data.claimId, - fileExt: data.generated_extension || data.fileExt, - description: data.description, - thumbnail: data.generated_thumbnail || data.thumbnail, - outpoint: data.transaction_hash_id || data.outpoint, - host, -}) +module.exports = async (data) => { + // TODO: Refactor getching the channel name out; requires invasive changes. + const certificateId = data.publisher_id || data.certificateId; + let channelName = data.channelName; + + if(certificateId && !channelName) { + channelName = await chainquery.claim.queries.getClaimChannelName(certificateId).catch(()=>{}); + } + + return ({ + name: data.name, + title: data.title, + certificateId, + channelName, + contentType: data.content_type || data.contentType, + claimId: data.claim_id || data.claimId, + fileExt: data.generated_extension || data.fileExt, + description: data.description, + thumbnail: data.generated_thumbnail || data.thumbnail, + outpoint: data.transaction_hash_id || data.outpoint, + host, + }) +}