public inbox for [email protected]
help / color / mirror / Atom feedFrom: George Gelashvili <[email protected]>
To: Dave Page <[email protected]>
Cc: Joao Pedro De Almeida Pereira <[email protected]>
Cc: Matthew Kleiman <[email protected]>
Cc: Murtuza Zabuawala <[email protected]>
Cc: pgadmin-hackers <[email protected]>
Subject: Re: [pgAdmin4] [PATCH] History Tab rewrite in React
Date: Fri, 26 May 2017 18:30:01 -0400
Message-ID: <CAHowoHZJtKn8F9XuiK2yFT=_OcgG7Ctx83iiFab17PwexajfDQ@mail.gmail.com> (raw)
In-Reply-To: <CA+OCxoxH+5gAjw17rWQb-jqNBeQGgOs4Q=GZ7KEwdmGHOQrsBw@mail.gmail.com>
References: <CAFS4TJYDRi6fs+wrhkj89gFe3xaFOkoApCK+AU2O4DfU2XfXog@mail.gmail.com>
<CAKKotZQSTtJVkBKMeFi9vTrPugBEbEE38dhbbn-hr+hpd0Qzbw@mail.gmail.com>
<CA+OCxowChMtZzaSwrG5Sganh4LiMQcgL7BpoqhTxZga30DqDXw@mail.gmail.com>
<CAKKotZRmvbScMdUtjMgUJdRe-EXaqDoDbYBxrMZrkbVDVR_iUg@mail.gmail.com>
<CA+OCxow3e=q9w_e=Kkw1ebZJ82EM8RyFmiTaXihdqhX6HbzZhw@mail.gmail.com>
<CAFS4TJapVubRP_BK01GwYjfN7zpaTbCMX+CROC4mV93aL08DOg@mail.gmail.com>
<CA+OCxozPDpP_5zdLjOSQhiGHgzE-QDsFv8-WyC8-XTxf5+uSJg@mail.gmail.com>
<CAE+jjakzXbzvtai0Z2q0bXfecMhDzZwtn+p8mQwV7kfRGPON_Q@mail.gmail.com>
<CA+OCxoxkM--KjFWt7FkJm+mrL5sA9jdZ59YN7=n=2ZMrkH8iSg@mail.gmail.com>
<CAFS4TJaZA0U_BtiUBdx1jT6Z5bQzMQbjhwrjimDLgfkTb=gWJg@mail.gmail.com>
<CAE+jjakrsf7f41LyCy6BWvjrsH9FyKK98koO0MgUkR0qmbk-uw@mail.gmail.com>
<CA+OCxoxH+5gAjw17rWQb-jqNBeQGgOs4Q=GZ7KEwdmGHOQrsBw@mail.gmail.com>
List-Unsubscribe: <mailto:[email protected]?body=unsub%20pgadmin-hackers>
okay
We recreated the patches over new master.
Please apply the patches attached after "feature test timeouts" is merged
into master, as that should resolve "waiting for app to start"
Thanks!
George and Joao
On Fri, May 26, 2017 at 4:39 PM, Dave Page <[email protected]> wrote:
> Hi
>
> That fixed the JS tests, however, the feature tests are completely
> broken now - the browser fails to load the app, so they just timeout:
>
> ======================================================================
> ERROR: runTest (pgadmin.feature_tests.connect_to_server_feature_test.
> ConnectsToServerFeatureTest)
> Test database connection
> ----------------------------------------------------------------------
> Traceback (most recent call last):
> File "/Users/dpage/git/pgadmin4/web/regression/feature_utils/
> base_feature_test.py",
> line 36, in setUp
> self.page.wait_for_app()
> File "/Users/dpage/git/pgadmin4/web/regression/feature_utils/
> pgadmin_page.py",
> line 187, in wait_for_app
> self._wait_for("app to start", page_shows_app)
> File "/Users/dpage/git/pgadmin4/web/regression/feature_utils/
> pgadmin_page.py",
> line 191, in _wait_for
> "Timed out waiting for " + waiting_for_message)
> File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-
> packages/selenium/webdriver/support/wait.py",
> line 80, in until
> raise TimeoutException(message, screen, stacktrace)
> TimeoutException: Message: Timed out waiting for app to start
>
>
> ======================================================================
> ERROR: runTest (pgadmin.feature_tests.copy_selected_query_results_
> feature_test.CopySelectedQueryResultsFeatureTest)
> Test Copying Query Results
> ----------------------------------------------------------------------
> Traceback (most recent call last):
> File "/Users/dpage/git/pgadmin4/web/regression/feature_utils/
> base_feature_test.py",
> line 36, in setUp
> self.page.wait_for_app()
> File "/Users/dpage/git/pgadmin4/web/regression/feature_utils/
> pgadmin_page.py",
> line 187, in wait_for_app
> self._wait_for("app to start", page_shows_app)
> File "/Users/dpage/git/pgadmin4/web/regression/feature_utils/
> pgadmin_page.py",
> line 191, in _wait_for
> "Timed out waiting for " + waiting_for_message)
> File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-
> packages/selenium/webdriver/support/wait.py",
> line 80, in until
> raise TimeoutException(message, screen, stacktrace)
> TimeoutException: Message: Timed out waiting for app to start
>
>
> ======================================================================
> ERROR: runTest (pgadmin.feature_tests.pg_datatype_validation_test.
> PGDataypeFeatureTest)
> Test checks for PG data-types output
> ----------------------------------------------------------------------
> Traceback (most recent call last):
> File "/Users/dpage/git/pgadmin4/web/regression/feature_utils/
> base_feature_test.py",
> line 36, in setUp
> self.page.wait_for_app()
> File "/Users/dpage/git/pgadmin4/web/regression/feature_utils/
> pgadmin_page.py",
> line 187, in wait_for_app
> self._wait_for("app to start", page_shows_app)
> File "/Users/dpage/git/pgadmin4/web/regression/feature_utils/
> pgadmin_page.py",
> line 191, in _wait_for
> "Timed out waiting for " + waiting_for_message)
> File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-
> packages/selenium/webdriver/support/wait.py",
> line 80, in until
> raise TimeoutException(message, screen, stacktrace)
> TimeoutException: Message: Timed out waiting for app to start
>
>
> ======================================================================
> ERROR: runTest (pgadmin.feature_tests.query_tool_journey_test.
> QueryToolJourneyTest)
> Tests the path through the query tool
> ----------------------------------------------------------------------
> Traceback (most recent call last):
> File "/Users/dpage/git/pgadmin4/web/regression/feature_utils/
> base_feature_test.py",
> line 36, in setUp
> self.page.wait_for_app()
> File "/Users/dpage/git/pgadmin4/web/regression/feature_utils/
> pgadmin_page.py",
> line 187, in wait_for_app
> self._wait_for("app to start", page_shows_app)
> File "/Users/dpage/git/pgadmin4/web/regression/feature_utils/
> pgadmin_page.py",
> line 191, in _wait_for
> "Timed out waiting for " + waiting_for_message)
> File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-
> packages/selenium/webdriver/support/wait.py",
> line 80, in until
> raise TimeoutException(message, screen, stacktrace)
> TimeoutException: Message: Timed out waiting for app to start
>
>
> ======================================================================
> ERROR: runTest (pgadmin.feature_tests.table_ddl_feature_test.
> TableDdlFeatureTest)
> Test table DDL generation
> ----------------------------------------------------------------------
> Traceback (most recent call last):
> File "/Users/dpage/git/pgadmin4/web/regression/feature_utils/
> base_feature_test.py",
> line 36, in setUp
> self.page.wait_for_app()
> File "/Users/dpage/git/pgadmin4/web/regression/feature_utils/
> pgadmin_page.py",
> line 187, in wait_for_app
> self._wait_for("app to start", page_shows_app)
> File "/Users/dpage/git/pgadmin4/web/regression/feature_utils/
> pgadmin_page.py",
> line 191, in _wait_for
> "Timed out waiting for " + waiting_for_message)
> File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-
> packages/selenium/webdriver/support/wait.py",
> line 80, in until
> raise TimeoutException(message, screen, stacktrace)
> TimeoutException: Message: Timed out waiting for app to start
>
>
> ======================================================================
> ERROR: runTest (pgadmin.feature_tests.xss_checks_panels_and_query_tool_
> test.CheckForXssFeatureTest)
> Test XSS check for panels and query tool
> ----------------------------------------------------------------------
> Traceback (most recent call last):
> File "/Users/dpage/git/pgadmin4/web/regression/feature_utils/
> base_feature_test.py",
> line 36, in setUp
> self.page.wait_for_app()
> File "/Users/dpage/git/pgadmin4/web/regression/feature_utils/
> pgadmin_page.py",
> line 187, in wait_for_app
> self._wait_for("app to start", page_shows_app)
> File "/Users/dpage/git/pgadmin4/web/regression/feature_utils/
> pgadmin_page.py",
> line 191, in _wait_for
> "Timed out waiting for " + waiting_for_message)
> File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-
> packages/selenium/webdriver/support/wait.py",
> line 80, in until
> raise TimeoutException(message, screen, stacktrace)
> TimeoutException: Message: Timed out waiting for app to start
>
>
> ======================================================================
> ERROR: runTest (pgadmin.feature_tests.xss_checks_pgadmin_debugger_test.
> CheckDebuggerForXssFeatureTest)
> Tests to check if Debugger is vulnerable to XSS
> ----------------------------------------------------------------------
> Traceback (most recent call last):
> File "/Users/dpage/git/pgadmin4/web/regression/feature_utils/
> base_feature_test.py",
> line 36, in setUp
> self.page.wait_for_app()
> File "/Users/dpage/git/pgadmin4/web/regression/feature_utils/
> pgadmin_page.py",
> line 187, in wait_for_app
> self._wait_for("app to start", page_shows_app)
> File "/Users/dpage/git/pgadmin4/web/regression/feature_utils/
> pgadmin_page.py",
> line 191, in _wait_for
> "Timed out waiting for " + waiting_for_message)
> File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-
> packages/selenium/webdriver/support/wait.py",
> line 80, in until
> raise TimeoutException(message, screen, stacktrace)
> TimeoutException: Message: Timed out waiting for app to start
>
>
> ----------------------------------------------------------------------
> Ran 166 tests in 113.200s
>
> FAILED (errors=7, skipped=16)
>
> =============Running the test cases for 'PostgreSQL 9.6'=============
> runTest (pgadmin.browser.server_groups.servers.databases.
> casts.tests.test_cast_add.CastsAddTestCase)
> Check Cast Node ... 2017-05-26 16:27:56,754: ERROR pgadmin: 'Mock'
> object does not support item assignment
> Traceback (most recent call last):
> File "/Users/dpage/git/pgadmin4/web/pgadmin/browser/server_
> groups/servers/__init__.py",
> line 774, in connect
> server_types=ServerType.types()
> File "/Users/dpage/git/pgadmin4/web/pgadmin/utils/driver/
> psycopg2/__init__.py",
> line 309, in connect
> os.environ['PGAPPNAME'] = '{0} - {1}'.format(config.APP_NAME, conn_id)
> TypeError: 'Mock' object does not support item assignment
> FAIL
> ERROR
> runTest (pgadmin.browser.server_groups.servers.databases.
> casts.tests.test_cast_delete.CastsDeleteTestCase)
> Check Cast Node ... 2017-05-26 16:27:56,840: ERROR pgadmin: 'Mock'
> object does not support item assignment
> Traceback (most recent call last):
> File "/Users/dpage/git/pgadmin4/web/pgadmin/browser/server_
> groups/servers/__init__.py",
> line 774, in connect
> server_types=ServerType.types()
> File "/Users/dpage/git/pgadmin4/web/pgadmin/utils/driver/
> psycopg2/__init__.py",
> line 309, in connect
> os.environ['PGAPPNAME'] = '{0} - {1}'.format(config.APP_NAME, conn_id)
> TypeError: 'Mock' object does not support item assignment
> FAIL
> ERROR
> runTest (pgadmin.browser.server_groups.servers.databases.
> casts.tests.test_cast_get.CastsGetTestCase)
> Check Cast Node ... Traceback (most recent call last):
> File "/Users/dpage/git/pgadmin4/web/pgadmin/browser/server_
> groups/servers/databases/casts/tests/utils.py",
> line 51, in create_cast
> " FUNCTION AS IMPLICIT" % (source_type, target_type))
> ProgrammingError: cast from type money to type bigint already exists
>
> 2017-05-26 16:27:56,960: ERROR pgadmin: 'Mock' object does not support
> item assignment
> Traceback (most recent call last):
> File "/Users/dpage/git/pgadmin4/web/pgadmin/browser/server_
> groups/servers/__init__.py",
> line 774, in connect
> server_types=ServerType.types()
> File "/Users/dpage/git/pgadmin4/web/pgadmin/utils/driver/
> psycopg2/__init__.py",
> line 309, in connect
> os.environ['PGAPPNAME'] = '{0} - {1}'.format(config.APP_NAME, conn_id)
> TypeError: 'Mock' object does not support item assignment
> FAIL
> ERROR
> runTest (pgadmin.browser.server_groups.servers.databases.
> casts.tests.test_cast_put.CastsPutTestCase)
> Check Cast Node ... 2017-05-26 16:27:57,060: ERROR pgadmin: 'Mock'
> object does not support item assignment
> Traceback (most recent call last):
> File "/Users/dpage/git/pgadmin4/web/pgadmin/browser/server_
> groups/servers/__init__.py",
> line 774, in connect
> server_types=ServerType.types()
> File "/Users/dpage/git/pgadmin4/web/pgadmin/utils/driver/
> psycopg2/__init__.py",
> line 309, in connect
> os.environ['PGAPPNAME'] = '{0} - {1}'.format(config.APP_NAME, conn_id)
> TypeError: 'Mock' object does not support item assignment
> FAIL
> ERROR
>
> On Wed, May 24, 2017 at 10:22 AM, Joao Pedro De Almeida Pereira
> <[email protected]> wrote:
> > Hi Hackers!
> >
> > Please find attached the two patches, now including a new grunt task to
> run
> > the tests only once that can be used in CI. For development, use grunt
> > test, for ci or to run tests only once, use grunt test-ci. This is
> > documented in the README file.
> >
> > Also note, these patches were generated using git diff as per
> > https://www.pgadmin.org/docs/pgadmin4/dev/submitting_patches.html.
> Sorry for
> > any inconvenience from generating a patch in an alternate manner earlier.
> >
> > Thanks,
> > Joao & Matt
> >
> > On Wed, May 24, 2017 at 9:36 AM, Matthew Kleiman <[email protected]>
> > wrote:
> >>
> >> Hi Dave,
> >>
> >> This one is our bad! We didn't create a grunt task to run the tests only
> >> once, as you would in CI. grunt tests currently runs the tests and
> continues
> >> to watch for changes, running the tests again each time the source code
> is
> >> modified. We will create a task that is suitable to run in CI.
> >>
> >> In the meantime, if you have any free time during the day today and
> would
> >> like to schedule a sync call with us, that would help us to tighten the
> >> feedback loop.
> >>
> >> Thanks,
> >> Joao & Matt
> >>
> >> On Tue, May 23, 2017 at 4:44 PM, Dave Page <[email protected]> wrote:
> >>>
> >>> On Tue, May 23, 2017 at 12:12 PM, Joao Pedro De Almeida Pereira
> >>> <[email protected]> wrote:
> >>> > Okay
> >>> >
> >>> > Can you try removing web/node_modules and web/yarn.lock, and running
> >>> > $ yarn install
> >>> > $ grunt tests
> >>> >
> >>> > We think this might be due to a bad version of phantomjs-prebuilt.
> >>> >
> >>> > If that still fails, can you try running grunt as "yarn run grunt
> >>> > tests"?
> >>>
> >>> I'm on a different machine now, and here grunt just seems to never
> >>> exit when it's doing anything. For example, I ran this a few minutes
> >>> ago, it finished in seconds and has been sitting here ever since:
> >>>
> >>> (pgadmin4)snake:web dpage$ grunt tests
> >>> Running "eslint:target" (eslint) task
> >>>
> >>> Running "karma:unit" (karma) task
> >>>
> >>> webpack: Compiled successfully.
> >>> webpack: Compiling...
> >>> webpack: wait until bundle finished:
> >>> webpack: wait until bundle finished:
> >>> webpack: wait until bundle finished:
> >>> webpack: wait until bundle finished:
> >>> webpack: wait until bundle finished:
> >>> webpack: wait until bundle finished:
> >>> webpack: wait until bundle finished:
> >>> webpack: wait until bundle finished:
> >>> webpack: wait until bundle finished:
> >>> webpack: wait until bundle finished:
> >>> webpack: wait until bundle finished:
> >>> webpack: wait until bundle finished:
> >>> (node:4902) DeprecationWarning: loaderUtils.parseQuery() received a
> >>> non-string value which can be problematic, see
> >>> https://github.com/webpack/loader-utils/issues/56
> >>> parseQuery() will be replaced with getOptions() in the next major
> >>> version of loader-utils.
> >>> 23 05 2017 16:41:54.549:WARN [karma]: No captured browser, open
> >>> http://localhost:9876/
> >>>
> >>> webpack: Compiled successfully.
> >>> PhantomJS 2.1.1 (Mac OS X 0.0.0): Executed 87 of 88 (skipped 1)
> >>> SUCCESS (1.353 secs / 1.328 secs)
> >>>
> >>> I'm quite unimpressed with it so far :-(
> >>>
> >>> --
> >>> Dave Page
> >>> Blog: http://pgsnake.blogspot.com
> >>> Twitter: @pgsnake
> >>>
> >>> EnterpriseDB UK: http://www.enterprisedb.com
> >>> The Enterprise PostgreSQL Company
> >>
> >>
> >
>
>
>
> --
> Dave Page
> Blog: http://pgsnake.blogspot.com
> Twitter: @pgsnake
>
> EnterpriseDB UK: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>
>
> --
> Sent via pgadmin-hackers mailing list ([email protected])
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgadmin-hackers
>
diff --git a/.gitignore b/.gitignore
index f6d14903..67cec303 100644
--- a/.gitignore
+++ b/.gitignore
@@ -36,5 +36,5 @@ runtime/release/
runtime/ui_BrowserWindow.h
web/config_local.py
web/regression/test_config.json
-node_modules/
-yarn.lock
+/web/pgadmin/static/**/generated/
+/web/node_modules/
diff --git a/Make.bat b/Make.bat
index 8082c56d..a71223eb 100644
--- a/Make.bat
+++ b/Make.bat
@@ -238,6 +238,12 @@ REM Main function Ends
CD "%WD%\web"
IF %ERRORLEVEL% NEQ 0 EXIT /B %ERRORLEVEL%
+
+ ECHO Install Javascript dependencies
+ yarn install
+ ECHO Bundle all Javascript
+ yarn run grunt minify
+
XCOPY /S /I /E /H /Y "%WD%\web" "%PGBUILDPATH%\web" > nul
IF %ERRORLEVEL% NEQ 0 EXIT /B %ERRORLEVEL%
diff --git a/README b/README
index ff567db2..dfb4c5e1 100644
--- a/README
+++ b/README
@@ -196,6 +196,35 @@ http://www.tylerbutler.com/2012/05/how-to-install-python-pip-and-virtualenv-on-w
Once a virtual environment has been created and enabled, setup can continue
from step 4 above.
+
+Bundling Javascript
+-------------------
+
+The current build process for the JS frontend is: source_file.js(x) -> babel -> webpack -> bundled_output.js
+
+To setup your environment for building:
+
+ get Yarn: https://yarnpkg.com/en/docs/install
+ get grunt-cli:
+
+ $ yarn global add grunt-cli
+
+If you do not install the grunt cli, you will have to prepend each grunt command with "yarn run"
+
+Build:
+
+ (pgadmin4/web)$ yarn install
+ (pgadmin4/web)$ grunt bundle
+
+This will also run a linter against the js source files.
+
+For development, you may want to run:
+
+ (pgadmin4/web)$ grunt
+
+instead, as the default grunt task is configured to watch for changes and rerun.
+
+
Configuring the Runtime
-----------------------
diff --git a/pkg/mac/build.sh b/pkg/mac/build.sh
index a138a8a5..c13584e0 100755
--- a/pkg/mac/build.sh
+++ b/pkg/mac/build.sh
@@ -178,6 +178,11 @@ _complete_bundle() {
# run complete-bundle to copy the dependent libraries and frameworks and fix the rpaths
./complete-bundle.sh "$BUILDROOT/$APP_BUNDLE_NAME" || { echo complete-bundle.sh failed; exit 1; }
+ pushd $SOURCEDIR/web
+ yarn install
+ yarn run grunt minify
+ popd
+
# copy the web directory to the bundle as it is required by runtime
cp -r $SOURCEDIR/web "$BUILDROOT/$APP_BUNDLE_NAME/Contents/Resources/" || exit 1
cd "$BUILDROOT/$APP_BUNDLE_NAME/Contents/Resources/web"
diff --git a/pkg/pip/build.sh b/pkg/pip/build.sh
index 3ceaec4f..cc4c0d18 100755
--- a/pkg/pip/build.sh
+++ b/pkg/pip/build.sh
@@ -57,6 +57,15 @@ do
tar cf - $FILE | (cd ../pip-build/pgadmin4; tar xf -)
done
+yarn install
+yarn run grunt minify
+
+for FILE in `ls -d pgAdmin/static/js/generated/*`
+do
+ echo Adding $FILE
+ tar cf - $FILE | (cd ../pip-build/pgadmin4; tar xf -)
+done
+
cd ../docs
for FILE in `git ls-files`
do
diff --git a/pkg/src/build.sh b/pkg/src/build.sh
index a2c6f90e..1b2f765e 100755
--- a/pkg/src/build.sh
+++ b/pkg/src/build.sh
@@ -69,6 +69,17 @@ do
tar cf - $FILE | (cd src-build/$TARBALL_NAME; tar xf -)
done
+pushd web
+ yarn install
+ yarn run grunt minify
+
+ for FILE in `ls -d pgAdmin/static/js/generated/*`
+ do
+ echo Adding $FILE
+ tar cf - $FILE | (cd ../src-build/$TARBALL_NAME/web; tar xf -)
+ done
+popd
+
# Create the tarball
echo Creating tarball...
cd src-build
diff --git a/web/.eslintrc.js b/web/.eslintrc.js
new file mode 100644
index 00000000..c60569db
--- /dev/null
+++ b/web/.eslintrc.js
@@ -0,0 +1,45 @@
+module.exports = {
+ 'env': {
+ 'browser': true,
+ 'es6': true,
+ 'amd': true,
+ 'jasmine': true,
+ },
+ 'extends': 'eslint:recommended',
+ 'parserOptions': {
+ 'ecmaFeatures': {
+ 'experimentalObjectRestSpread': true,
+ 'jsx': true
+ },
+ 'sourceType': 'module'
+ },
+ 'plugins': [
+ 'react'
+ ],
+ 'globals': {
+ '_': true,
+ 'module': true,
+ },
+ 'rules': {
+ 'indent': [
+ 'error',
+ 2
+ ],
+ 'linebreak-style': [
+ 'error',
+ 'unix'
+ ],
+ 'quotes': [
+ 'error',
+ 'single'
+ ],
+ 'semi': [
+ 'error',
+ 'always'
+ ],
+ 'comma-dangle': [
+ 'error',
+ 'always-multiline'
+ ]
+ }
+};
\ No newline at end of file
diff --git a/web/Gruntfile.js b/web/Gruntfile.js
new file mode 100644
index 00000000..000224e4
--- /dev/null
+++ b/web/Gruntfile.js
@@ -0,0 +1,62 @@
+const webpackConfig = require('./webpack.config.js');
+
+var srcFiles = [
+ 'pgadmin/static/jsx/*.jsx',
+ 'pgadmin/static/js/selection/*.js',
+ 'regression/javascript/**.js',
+ 'regression/javascript/**/*.js',
+ '*.js',
+];
+
+module.exports = function (grunt) {
+ grunt.initConfig({
+ watch: {
+ files: srcFiles,
+ tasks: ['eslint', 'webpack'],
+ },
+ babel: {
+ options: {
+ sourceMap: true,
+ presets: ['react', 'es2015'],
+ },
+ dist: {
+ files: {
+ 'pgadmin/static/js/generated/reactComponents.js': 'pgadmin/static/jsx/components.jsx',
+ },
+ },
+ },
+ webpack: {
+ app: webpackConfig,
+ },
+ eslint: {
+ target: srcFiles,
+ },
+ karma: {
+ unit: {
+ configFile: 'karma.conf.js',
+ },
+ },
+ uglify: {
+ my_target: {
+ files: [{
+ expand: true,
+ cwd: 'pgadmin/static/js/generated',
+ src: '**/*.js',
+ dest: 'pgadmin/static/js/generated',
+ }],
+ },
+ },
+ });
+
+ grunt.loadNpmTasks('grunt-contrib-watch');
+ grunt.loadNpmTasks('grunt-webpack');
+ grunt.loadNpmTasks('grunt-eslint');
+ grunt.loadNpmTasks('grunt-karma');
+ grunt.loadNpmTasks('grunt-contrib-uglify');
+
+ grunt.registerTask('tests', ['eslint', 'karma']);
+
+ grunt.registerTask('bundle', ['eslint', 'webpack']);
+ grunt.registerTask('default', ['bundle', 'watch']);
+ grunt.registerTask('minify', ['bundle', 'uglify']);
+};
diff --git a/web/karma.conf.js b/web/karma.conf.js
index 95613f77..7fa51b50 100644
--- a/web/karma.conf.js
+++ b/web/karma.conf.js
@@ -1,75 +1,34 @@
-// Karma configuration
-// Generated on Wed Mar 01 2017 14:19:28 GMT-0500 (EST)
+const webpackConfig = require('./webpack.test.config.js');
-module.exports = function(config) {
+module.exports = function (config) {
config.set({
-
- // base path that will be used to resolve all patterns (eg. files, exclude)
- basePath: '',
-
-
- // frameworks to use
- // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
- frameworks: ['jasmine', 'requirejs'],
-
-
- // list of files / patterns to load in the browser
- files: [
- 'regression/javascript/test-main.js',
- {pattern: 'regression/javascript/**/*.js', included: false},
- {pattern: 'pgadmin/static/vendor/**/*.js', included: false},
- {pattern: 'pgadmin/static/js/**/*.js', included: false}
+ frameworks: ['jasmine'],
+ plugins: [
+ 'karma-webpack',
+ 'karma-phantomjs-launcher',
+ 'karma-jasmine',
+ 'karma-jasmine-html-reporter',
],
-
-
- // list of files to exclude
- exclude: [
- 'pgadmin/static/js/pgadmin.js',
- 'pgadmin/static/vendor/**/*[Tt]est.js',
- 'pgadmin/static/vendor/**/*[Ss]pec.js'
+ files: [
+ {pattern: 'pgadmin/static/**/*.js', included: false},
+ 'regression/javascript/**/*.jsx',
+ 'regression/javascript/**/*.js',
],
-
-
- // preprocess matching files before serving them to the browser
- // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
preprocessors: {
+ 'regression/javascript/**/*.js': ['webpack'],
+ // 'regression/javascript/**/*.jsx': ['webpack'],
},
-
-
- // test results reporter to use
- // possible values: 'dots', 'progress'
- // available reporters: https://npmjs.org/browse/keyword/karma-reporter
- reporters: ['progress'],
-
-
- // web server port
+ webpack: webpackConfig,
+ webpackMiddleware: {
+ stats: 'errors-only',
+ },
+ reporters: ['progress', 'kjhtml'],
port: 9876,
-
-
- // enable / disable colors in the output (reporters and logs)
colors: true,
-
-
- // level of logging
- // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
- logLevel: config.LOG_INFO,
-
-
- // enable / disable watching file and executing tests whenever any file changes
- autoWatch: false,
-
-
- // start these browsers
- // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
+ logLevel: config.LOG_WARN,
+ autoWatch: true,
browsers: ['PhantomJS'],
-
-
- // Continuous Integration mode
- // if true, Karma captures browsers, runs the tests and exits
- singleRun: true,
-
- // Concurrency level
- // how many browser should be started simultaneous
- concurrency: Infinity
- })
-}
+ singleRun: false,
+ concurrency: Infinity,
+ });
+};
diff --git a/web/package.json b/web/package.json
index 80e4e5ad..760e1e0c 100644
--- a/web/package.json
+++ b/web/package.json
@@ -1,10 +1,44 @@
{
"devDependencies": {
- "jasmine-core": "^2.5.2",
- "karma": "^1.5.0",
- "karma-jasmine": "^1.1.0",
- "karma-phantomjs-launcher": "^1.0.2",
- "karma-requirejs": "^1.1.0",
- "requirejs": "^2.3.3"
+ "babel-core": "~6.24.0",
+ "babel-loader": "~6.4.1",
+ "babel-preset-es2015": "~6.24.0",
+ "babel-preset-react": "~6.23.0",
+ "enzyme": "~2.8.2",
+ "eslint": "^3.19.0",
+ "eslint-plugin-react": "^6.10.3",
+ "grunt": "~1.0.1",
+ "grunt-contrib-uglify": "^3.0.0",
+ "grunt-contrib-watch": "~1.0.0",
+ "grunt-eslint": "^19.0.0",
+ "grunt-karma": "^2.0.0",
+ "grunt-webpack": "~2.0.1",
+ "jasmine-core": "~2.5.2",
+ "karma": "~1.5.0",
+ "karma-babel-preprocessor": "^6.0.1",
+ "karma-browserify": "~5.1.1",
+ "karma-jasmine": "~1.1.0",
+ "karma-jasmine-html-reporter": "~0.2.2",
+ "karma-phantomjs-launcher": "~1.0.2",
+ "karma-requirejs": "~1.1.0",
+ "karma-sourcemap-loader": "~0.3.7",
+ "karma-webpack": "~2.0.3",
+ "react-addons-test-utils": "~15.4.2",
+ "webpack": "~2.3.1"
+ },
+ "dependencies": {
+ "axios": "^0.16.1",
+ "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
+ "babel-polyfill": "^6.23.0",
+ "babel-preset-es2015-without-strict": "~0.0.4",
+ "babelify": "~7.3.0",
+ "browserify": "~14.1.0",
+ "exports-loader": "~0.6.4",
+ "imports-loader": "git+https://github.com/webpack-contrib/imports-loader.git#44d6f48463b256a17c1ba6fd9b5cc1449b4e379d";,
+ "react": "~15.4.2",
+ "react-dom": "~15.4.2",
+ "requirejs": "~2.3.3",
+ "underscore": "~1.8.3",
+ "watchify": "~3.9.0"
}
}
diff --git a/web/pgAdmin4.py b/web/pgAdmin4.py
index 24e1564a..e56a6bbe 100644
--- a/web/pgAdmin4.py
+++ b/web/pgAdmin4.py
@@ -14,25 +14,40 @@ to start a web server."""
import os
import sys
-# We need to include the root directory in sys.path to ensure that we can
-# find everything we need when running in the standalone runtime.
+from pgadmin.tools.javascript.javascript_bundler import JavascriptBundler, JsState
+
root = os.path.dirname(os.path.realpath(__file__))
if sys.path[0] != root:
sys.path.insert(0, root)
import config
from pgadmin import create_app
+from pgadmin.utils import u, fs_encoding, file_quote
# Get the config database schema version. We store this in pgadmin.model
# as it turns out that putting it in the config files isn't a great idea
from pgadmin.model import SCHEMA_VERSION
config.SETTINGS_SCHEMA_VERSION = SCHEMA_VERSION
+##########################################################################
+# Sanity checks
+##########################################################################
+
+# Check if the database exists. If it does not, create it.
+if not os.path.isfile(config.SQLITE_PATH):
+ setupfile = os.path.join(
+ os.path.dirname(os.path.realpath(u(__file__, fs_encoding))), u'setup.py'
+ )
+ exec(open(file_quote(setupfile), 'r').read())
##########################################################################
-# Server starup
+# Server startup
##########################################################################
+# Build Javascript files
+javascriptBundler = JavascriptBundler()
+javascriptBundler.bundle()
+
# Create the app!
app = create_app()
@@ -41,6 +56,13 @@ if config.DEBUG:
else:
app.debug = False
+# respond to JS
+if javascriptBundler.report() == JsState.NONE:
+ app.logger.error("Unable to generate javascript")
+ app.logger.error("To run the app ensure that grunt is installed globally "
+ "and that yarn install command runs successfully")
+ raise Exception("No generated javascript, aborting")
+
# Start the web server. The port number should have already been set by the
# runtime if we're running in desktop mode, otherwise we'll just use the
# Flask default.
diff --git a/web/pgadmin/browser/static/vendor/aciTree/jquery.aciPlugin.min.js b/web/pgadmin/browser/static/vendor/aciTree/jquery.aciPlugin.min.js
index b315a857..ea3fd412 100755
--- a/web/pgadmin/browser/static/vendor/aciTree/jquery.aciPlugin.min.js
+++ b/web/pgadmin/browser/static/vendor/aciTree/jquery.aciPlugin.min.js
@@ -9,4 +9,4 @@
* Require jQuery Library >= v1.2.3 http://jquery.com
*/
-(function(d,c,e){if(typeof aciPluginClass!=="undefined"){return}var a;this.aciPluginClass=function(){};aciPluginClass.extend=function(g,j){i.extend=arguments.callee;function i(){if(a){this._instance={};return this.__construct.apply(this,arguments)}}a=false;i.prototype=new this();a=true;var h=this.prototype;for(var f in g){i.prototype[f]=((typeof g[f]=="function")&&(f!="proxy"))?(function(k){return function(){var p=this._parent;this._parent=h;var n=this._super;this._super=h[k];var o=this._private;if(this._instance&&j){var m=this._instance._private;if(m[j]===e){m[j]={nameSpace:"."+j}}this._private=m[j]}var l=g[k].apply(this,arguments);this._parent=p;this._super=n;this._private=o;return l}})(f):g[f]}return i};var b=0;aciPluginClass.aciPluginUi=aciPluginClass.extend({__construct:function(k,l,i,h,j){var f="."+k;var g=l.data(f);if(g){this._instance=g._instance;return g.__request(i,h,j)}l.data(f,this);d.extend(true,this._instance,{_private:{},nameSpace:f,jQuery:l,options:d.extend(true,{},d.fn[k].defaults,(typeof i=="object")?i:{}),index:b++,wasInit:false});this.__extend();return this.__request(i,h,j)},__extend:function(){},__request:function(g,f,h){if((g===e)||(typeof g=="object")){if(this._instance.options.autoInit){this.init()}}else{if(typeof g=="string"){switch(g){case"init":this.init();break;case"api":return{object:this};case"options":if(f===e){return{object:this.options()}}else{if(typeof f=="string"){return{object:this.options(f)}}else{this.options(f)}}break;case"option":this.option(f,h);break;case"destroy":this.destroy();break}}}return this._instance.jQuery},proxy:function(j,h){var m=c.Array.prototype.slice;var f=m.call(arguments,2);var i=this,g=i._parent,l=i._super,k=i._private;return function(){i._parent=g;i._super=l;i._private=k;return j.apply(i,h?f.concat([this],m.call(arguments)):f.concat(m.call(arguments)))}},init:function(){if(!this._instance.wasInit){this._instance.wasInit=true;return true}return false},wasInit:function(){return this._instance.wasInit},__parent:function(h,f,l){var m=f.split(".");if(m.length>1){var j=h,k;for(var g in m){k=j;j=j[m[g]]}l.name=m[g];return k}l.name=f;return h},options:function(f){if(f){var i={name:null};var h;if(typeof f=="string"){h=this.__parent(this._instance.options,f,i);return h[i.name]}else{for(var g in f){h=this.__parent(this._instance.options,g,i);h[i.name]=f[g]}}}else{return this._instance.options}},option:function(g,i){var h={name:null};var f=this.__parent(this._instance.options,g,h);f[h.name]=i},destroy:function(){if(this._instance.wasInit){this._instance.wasInit=false;this._instance.jQuery.removeData(this._instance.nameSpace);return true}return false}});aciPluginClass.plugins={};aciPluginClass.publish=function(f,g){d.fn[f]=function(j,m,n){var h=null;for(var l=0,k=this.length;l<k;l++){h=new aciPluginClass.plugins[f](f,d(this[l]),j,m,n);if(!(h instanceof d)){return h.object}}return this};d.fn[f].defaults=d.extend(true,{autoInit:true},(typeof g=="object")?g:{})};aciPluginClass.defaults=function(f,g){d.extend(true,d.fn[f].defaults,(typeof g=="object")?g:{})}})(jQuery,this);
+(function(d,c,e){if(typeof aciPluginClass!=="undefined"){return}var a;window.aciPluginClass=function(){};aciPluginClass.extend=function(g,j){i.extend=arguments.callee;function i(){if(a){this._instance={};return this.__construct.apply(this,arguments)}}a=false;i.prototype=new this();a=true;var h=this.prototype;for(var f in g){i.prototype[f]=((typeof g[f]=="function")&&(f!="proxy"))?(function(k){return function(){var p=this._parent;this._parent=h;var n=this._super;this._super=h[k];var o=this._private;if(this._instance&&j){var m=this._instance._private;if(m[j]===e){m[j]={nameSpace:"."+j}}this._private=m[j]}var l=g[k].apply(this,arguments);this._parent=p;this._super=n;this._private=o;return l}})(f):g[f]}return i};var b=0;aciPluginClass.aciPluginUi=aciPluginClass.extend({__construct:function(k,l,i,h,j){var f="."+k;var g=l.data(f);if(g){this._instance=g._instance;return g.__request(i,h,j)}l.data(f,this);d.extend(true,this._instance,{_private:{},nameSpace:f,jQuery:l,options:d.extend(true,{},d.fn[k].defaults,(typeof i=="object")?i:{}),index:b++,wasInit:false});this.__extend();return this.__request(i,h,j)},__extend:function(){},__request:function(g,f,h){if((g===e)||(typeof g=="object")){if(this._instance.options.autoInit){this.init()}}else{if(typeof g=="string"){switch(g){case"init":this.init();break;case"api":return{object:this};case"options":if(f===e){return{object:this.options()}}else{if(typeof f=="string"){return{object:this.options(f)}}else{this.options(f)}}break;case"option":this.option(f,h);break;case"destroy":this.destroy();break}}}return this._instance.jQuery},proxy:function(j,h){var m=c.Array.prototype.slice;var f=m.call(arguments,2);var i=this,g=i._parent,l=i._super,k=i._private;return function(){i._parent=g;i._super=l;i._private=k;return j.apply(i,h?f.concat([this],m.call(arguments)):f.concat(m.call(arguments)))}},init:function(){if(!this._instance.wasInit){this._instance.wasInit=true;return true}return false},wasInit:function(){return this._instance.wasInit},__parent:function(h,f,l){var m=f.split(".");if(m.length>1){var j=h,k;for(var g in m){k=j;j=j[m[g]]}l.name=m[g];return k}l.name=f;return h},options:function(f){if(f){var i={name:null};var h;if(typeof f=="string"){h=this.__parent(this._instance.options,f,i);return h[i.name]}else{for(var g in f){h=this.__parent(this._instance.options,g,i);h[i.name]=f[g]}}}else{return this._instance.options}},option:function(g,i){var h={name:null};var f=this.__parent(this._instance.options,g,h);f[h.name]=i},destroy:function(){if(this._instance.wasInit){this._instance.wasInit=false;this._instance.jQuery.removeData(this._instance.nameSpace);return true}return false}});aciPluginClass.plugins={};aciPluginClass.publish=function(f,g){d.fn[f]=function(j,m,n){var h=null;for(var l=0,k=this.length;l<k;l++){h=new aciPluginClass.plugins[f](f,d(this[l]),j,m,n);if(!(h instanceof d)){return h.object}}return this};d.fn[f].defaults=d.extend(true,{autoInit:true},(typeof g=="object")?g:{})};aciPluginClass.defaults=function(f,g){d.extend(true,d.fn[f].defaults,(typeof g=="object")?g:{})}})(jQuery,this);
diff --git a/web/pgadmin/browser/utils.py b/web/pgadmin/browser/utils.py
index 708bfdfb..993a5c6f 100644
--- a/web/pgadmin/browser/utils.py
+++ b/web/pgadmin/browser/utils.py
@@ -241,6 +241,7 @@ class NodeView(with_metaclass(MethodViewType, View)):
commands = cls.generate_ops()
+
for c in commands:
if c['with_id']:
blueprint.add_url_rule(
diff --git a/web/pgadmin/static/js/selection/clipboard.js b/web/pgadmin/static/js/selection/clipboard.js
index 9e20da7e..9794ae7e 100644
--- a/web/pgadmin/static/js/selection/clipboard.js
+++ b/web/pgadmin/static/js/selection/clipboard.js
@@ -1,7 +1,7 @@
define(['sources/gettext', 'alertify'], function (gettext, alertify) {
var clipboard = {
copyTextToClipboard: function (text) {
- var textArea = document.createElement("textarea");
+ var textArea = document.createElement('textarea');
//
// *** This styling is an extra step which is likely not required. ***
@@ -55,7 +55,7 @@ define(['sources/gettext', 'alertify'], function (gettext, alertify) {
}
document.body.removeChild(textArea);
- }
+ },
};
return clipboard;
});
\ No newline at end of file
diff --git a/web/pgadmin/static/js/selection/column_selector.js b/web/pgadmin/static/js/selection/column_selector.js
index c89b3fa8..a81b6918 100644
--- a/web/pgadmin/static/js/selection/column_selector.js
+++ b/web/pgadmin/static/js/selection/column_selector.js
@@ -2,18 +2,18 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func
var ColumnSelector = function () {
var init = function (grid) {
grid.onHeaderClick.subscribe(function (event, eventArgument) {
- var column = eventArgument.column;
+ var column = eventArgument.column;
- if (column.selectable !== false) {
+ if (column.selectable !== false) {
- if (!clickedCheckbox(event)) {
- var $checkbox = $("[data-id='checkbox-" + column.id + "']");
- toggleCheckbox($checkbox);
- }
-
- updateRanges(grid, column.id);
+ if (!clickedCheckbox(event)) {
+ var $checkbox = $('[data-id=\'checkbox-' + column.id + '\']');
+ toggleCheckbox($checkbox);
}
+
+ updateRanges(grid, column.id);
}
+ }
);
grid.getSelectionModel().onSelectedRangesChanged
.subscribe(handleSelectedRangesChanged.bind(null, grid));
@@ -52,14 +52,14 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func
};
var clickedCheckbox = function (e) {
- return e.target.type == "checkbox"
+ return e.target.type == 'checkbox';
};
var toggleCheckbox = function (checkbox) {
- if (checkbox.prop("checked")) {
- checkbox.prop("checked", false)
+ if (checkbox.prop('checked')) {
+ checkbox.prop('checked', false);
} else {
- checkbox.prop("checked", true)
+ checkbox.prop('checked', true);
}
};
@@ -67,15 +67,15 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func
return _.map(columnDefinitions, function (columnDefinition) {
if (columnDefinition.selectable !== false) {
var name =
- "<span data-cell-type='column-header-row' " +
- " data-test='output-column-header'>" +
- " <input data-id='checkbox-" + columnDefinition.id + "' " +
- " data-column-id='" + columnDefinition.id + "' " +
- " type='checkbox'/>" +
- " <span class='column-description'>" + columnDefinition.name + "</span>" +
- "</span>";
+ '<span data-cell-type=\'column-header-row\' ' +
+ ' data-test=\'output-column-header\'>' +
+ ' <input data-id=\'checkbox-' + columnDefinition.id + '\' ' +
+ ' data-column-id=\'' + columnDefinition.id + '\' ' +
+ ' type=\'checkbox\'/>' +
+ ' <span class=\'column-description\'>' + columnDefinition.name + '</span>' +
+ '</span>';
return _.extend(columnDefinition, {
- name: name
+ name: name,
});
} else {
return columnDefinition;
@@ -84,8 +84,8 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func
};
$.extend(this, {
- "init": init,
- "getColumnDefinitionsWithCheckboxes": getColumnDefinitionsWithCheckboxes
+ 'init': init,
+ 'getColumnDefinitionsWithCheckboxes': getColumnDefinitionsWithCheckboxes,
});
};
return ColumnSelector;
diff --git a/web/pgadmin/static/js/selection/copy_data.js b/web/pgadmin/static/js/selection/copy_data.js
index 018efead..0ccd4b96 100644
--- a/web/pgadmin/static/js/selection/copy_data.js
+++ b/web/pgadmin/static/js/selection/copy_data.js
@@ -5,48 +5,48 @@ define([
'sources/selection/range_selection_helper',
'sources/selection/range_boundary_navigator'],
function ($, _, clipboard, RangeSelectionHelper, rangeBoundaryNavigator) {
- var copyData = function () {
- var self = this;
-
- var grid = self.slickgrid;
- var columnDefinitions = grid.getColumns();
- var selectedRanges = grid.getSelectionModel().getSelectedRanges();
- var data = grid.getData();
- var rows = grid.getSelectedRows();
+ var copyData = function () {
+ var self = this;
+
+ var grid = self.slickgrid;
+ var columnDefinitions = grid.getColumns();
+ var selectedRanges = grid.getSelectionModel().getSelectedRanges();
+ var data = grid.getData();
+ var rows = grid.getSelectedRows();
+
+
+ if (allTheRangesAreFullRows(selectedRanges, columnDefinitions)) {
+ self.copied_rows = rows.map(function (rowIndex) {
+ return data[rowIndex];
+ });
+ setPasteRowButtonEnablement(self.can_edit, true);
+ } else {
+ self.copied_rows = [];
+ setPasteRowButtonEnablement(self.can_edit, false);
+ }
+
+ var csvText = rangeBoundaryNavigator.rangesToCsv(data, columnDefinitions, selectedRanges);
+ if (csvText) {
+ clipboard.copyTextToClipboard(csvText);
+ }
+ };
+
+ var setPasteRowButtonEnablement = function (canEditFlag, isEnabled) {
+ if (canEditFlag) {
+ $('#btn-paste-row').prop('disabled', !isEnabled);
+ }
+ };
+
+ var allTheRangesAreFullRows = function (ranges, columnDefinitions) {
+ var colRangeBounds = ranges.map(function (range) {
+ return [range.fromCell, range.toCell];
+ });
+ if(RangeSelectionHelper.isFirstColumnData(columnDefinitions)) {
+ return _.isEqual(_.union.apply(null, colRangeBounds), [0, columnDefinitions.length - 1]);
+ }
+ return _.isEqual(_.union.apply(null, colRangeBounds), [1, columnDefinitions.length - 1]);
+ };
- if (allTheRangesAreFullRows(selectedRanges, columnDefinitions)) {
- self.copied_rows = rows.map(function (rowIndex) {
- return data[rowIndex];
- });
- setPasteRowButtonEnablement(self.can_edit, true);
- } else {
- self.copied_rows = [];
- setPasteRowButtonEnablement(self.can_edit, false);
- }
-
- var csvText = rangeBoundaryNavigator.rangesToCsv(data, columnDefinitions, selectedRanges);
- if (csvText) {
- clipboard.copyTextToClipboard(csvText);
- }
- };
-
- var setPasteRowButtonEnablement = function (canEditFlag, isEnabled) {
- if (canEditFlag) {
- $("#btn-paste-row").prop('disabled', !isEnabled);
- }
- };
-
- var allTheRangesAreFullRows = function (ranges, columnDefinitions) {
- var colRangeBounds = ranges.map(function (range) {
- return [range.fromCell, range.toCell];
- });
-
- if(RangeSelectionHelper.isFirstColumnData(columnDefinitions)) {
- return _.isEqual(_.union.apply(null, colRangeBounds), [0, columnDefinitions.length - 1]);
- }
- return _.isEqual(_.union.apply(null, colRangeBounds), [1, columnDefinitions.length - 1]);
- };
-
- return copyData;
-});
+ return copyData;
+ });
diff --git a/web/pgadmin/static/js/selection/grid_selector.js b/web/pgadmin/static/js/selection/grid_selector.js
index 31aee69f..6317f44e 100644
--- a/web/pgadmin/static/js/selection/grid_selector.js
+++ b/web/pgadmin/static/js/selection/grid_selector.js
@@ -31,7 +31,7 @@ define(['jquery', 'sources/selection/column_selector', 'sources/selection/row_se
};
function handleSelectedRangesChanged(grid) {
- $("[data-id='checkbox-select-all']").prop("checked", isEntireGridSelected(grid));
+ $('[data-id=\'checkbox-select-all\']').prop('checked', isEntireGridSelected(grid));
}
function isEntireGridSelected(grid) {
@@ -44,7 +44,7 @@ define(['jquery', 'sources/selection/column_selector', 'sources/selection/row_se
if (isEntireGridSelected(grid)) {
deselect(grid);
} else {
- selectAll(grid)
+ selectAll(grid);
}
}
@@ -70,8 +70,8 @@ define(['jquery', 'sources/selection/column_selector', 'sources/selection/row_se
}
$.extend(this, {
- "init": init,
- "getColumnDefinitionsWithCheckboxes": getColumnDefinitionsWithCheckboxes
+ 'init': init,
+ 'getColumnDefinitionsWithCheckboxes': getColumnDefinitionsWithCheckboxes,
});
};
diff --git a/web/pgadmin/static/js/selection/range_boundary_navigator.js b/web/pgadmin/static/js/selection/range_boundary_navigator.js
index a268d245..f69540b9 100644
--- a/web/pgadmin/static/js/selection/range_boundary_navigator.js
+++ b/web/pgadmin/static/js/selection/range_boundary_navigator.js
@@ -99,13 +99,13 @@ define(['sources/selection/range_selection_helper'], function (RangeSelectionHel
var val = data[rowId][columnDefinitions[colId].pos];
if (val && _.isObject(val)) {
- val = "'" + JSON.stringify(val) + "'";
- } else if (val && typeof val != "number" && typeof val != "boolean") {
- val = "'" + val.toString() + "'";
+ val = '\'' + JSON.stringify(val) + '\'';
+ } else if (val && typeof val != 'number' && typeof val != 'boolean') {
+ val = '\'' + val.toString() + '\'';
} else if (_.isNull(val) || _.isUndefined(val)) {
val = '';
}
return val;
- }
+ },
};
});
\ No newline at end of file
diff --git a/web/pgadmin/static/js/selection/range_selection_helper.js b/web/pgadmin/static/js/selection/range_selection_helper.js
index 31ad3bf7..4bd55975 100644
--- a/web/pgadmin/static/js/selection/range_selection_helper.js
+++ b/web/pgadmin/static/js/selection/range_selection_helper.js
@@ -8,14 +8,14 @@ define(['slickgrid'], function () {
var isRangeSelected = function (selectedRanges, range) {
return _.any(selectedRanges, function (selectedRange) {
- return isSameRange(selectedRange, range)
- })
+ return isSameRange(selectedRange, range);
+ });
};
var removeRange = function (selectedRanges, range) {
return _.filter(selectedRanges, function (selectedRange) {
- return !(isSameRange(selectedRange, range))
- })
+ return !(isSameRange(selectedRange, range));
+ });
};
var addRange = function (ranges, range) {
@@ -26,15 +26,15 @@ define(['slickgrid'], function () {
var areAllRangesRows = function (ranges, grid) {
return _.every(ranges, function (range) {
return range.fromRow == range.toRow &&
- range.fromCell == 1 && range.toCell == grid.getColumns().length - 1
- })
+ range.fromCell == 1 && range.toCell == grid.getColumns().length - 1;
+ });
};
var areAllRangesColumns = function (ranges, grid) {
return _.every(ranges, function (range) {
return range.fromCell == range.toCell &&
- range.fromRow == 0 && range.toRow == grid.getDataLength() - 1
- })
+ range.fromRow == 0 && range.toRow == grid.getDataLength() - 1;
+ });
};
var rangeForRow = function (grid, rowId) {
@@ -46,8 +46,8 @@ define(['slickgrid'], function () {
};
function rangeForColumn(grid, columnIndex) {
- return new Slick.Range(0, columnIndex, grid.getDataLength() - 1, columnIndex)
- };
+ return new Slick.Range(0, columnIndex, grid.getDataLength() - 1, columnIndex);
+ }
var getRangeOfWholeGrid = function (grid) {
return new Slick.Range(0, 1, grid.getDataLength() - 1, grid.getColumns().length - 1);
@@ -73,6 +73,6 @@ define(['slickgrid'], function () {
rangeForColumn: rangeForColumn,
isEntireGridSelected: isEntireGridSelected,
getRangeOfWholeGrid: getRangeOfWholeGrid,
- isFirstColumnData: isFirstColumnData
- }
+ isFirstColumnData: isFirstColumnData,
+ };
});
\ No newline at end of file
diff --git a/web/pgadmin/static/js/selection/row_selector.js b/web/pgadmin/static/js/selection/row_selector.js
index 76a8c1a7..583f8a75 100644
--- a/web/pgadmin/static/js/selection/row_selector.js
+++ b/web/pgadmin/static/js/selection/row_selector.js
@@ -8,18 +8,18 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func
grid.getSelectionModel()
.onSelectedRangesChanged.subscribe(handleSelectedRangesChanged.bind(null, grid));
gridEventBus
- .subscribe(grid.onClick, handleClick.bind(null, grid))
+ .subscribe(grid.onClick, handleClick.bind(null, grid));
};
var handleClick = function (grid, event, args) {
if (grid.getColumns()[args.cell].id === 'row-header-column') {
- if (event.target.type != "checkbox") {
+ if (event.target.type != 'checkbox') {
var checkbox = $(event.target).find('input[type="checkbox"]');
toggleCheckbox($(checkbox));
}
updateRanges(grid, args.row);
}
- }
+ };
var handleSelectedRangesChanged = function (grid, event, ranges) {
$('[data-cell-type="row-header-checkbox"]:checked')
@@ -32,7 +32,7 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func
toggleCheckbox($checkbox);
}
});
- }
+ };
var updateRanges = function (grid, rowId) {
var selectionModel = grid.getSelectionModel();
@@ -51,13 +51,13 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func
}
}
selectionModel.setSelectedRanges(newRanges);
- }
+ };
var toggleCheckbox = function (checkbox) {
- if (checkbox.prop("checked")) {
- checkbox.prop("checked", false)
+ if (checkbox.prop('checked')) {
+ checkbox.prop('checked', false);
} else {
- checkbox.prop("checked", true)
+ checkbox.prop('checked', true);
}
};
@@ -70,15 +70,15 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func
formatter: function (rowIndex) {
return '<input type="checkbox" ' +
'data-row="' + rowIndex + '" ' +
- 'data-cell-type="row-header-checkbox"/>'
- }
+ 'data-cell-type="row-header-checkbox"/>';
+ },
});
return columnDefinitions;
};
$.extend(this, {
- "init": init,
- "getColumnDefinitionsWithCheckboxes": getColumnDefinitionsWithCheckboxes
+ 'init': init,
+ 'getColumnDefinitionsWithCheckboxes': getColumnDefinitionsWithCheckboxes,
});
};
return RowSelector;
diff --git a/web/pgadmin/static/jsx/components.jsx b/web/pgadmin/static/jsx/components.jsx
new file mode 100644
index 00000000..5bcb5208
--- /dev/null
+++ b/web/pgadmin/static/jsx/components.jsx
@@ -0,0 +1,8 @@
+
+import React from 'react';
+import {render} from 'react-dom';
+
+export {
+ render,
+ React,
+};
\ No newline at end of file
diff --git a/web/pgadmin/tools/javascript/__init__.py b/web/pgadmin/tools/javascript/__init__.py
new file mode 100644
index 00000000..9e55d2b2
--- /dev/null
+++ b/web/pgadmin/tools/javascript/__init__.py
@@ -0,0 +1,6 @@
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
diff --git a/web/pgadmin/tools/javascript/javascript_bundler.py b/web/pgadmin/tools/javascript/javascript_bundler.py
new file mode 100644
index 00000000..d74e3cbe
--- /dev/null
+++ b/web/pgadmin/tools/javascript/javascript_bundler.py
@@ -0,0 +1,63 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import os
+from contextlib import contextmanager
+from subprocess import call
+from pgadmin.utils import u, fs_encoding, file_quote
+
+
+# enum-like for tracking whether we have
+class JsState:
+ NONE = 0
+ OLD = 1
+ NEW = 2
+
+
+class JavascriptBundler:
+ """Builds Javascript bundle files by delegating to webpack"""
+
+ def __init__(self):
+ self.jsState = JsState.NONE
+
+ def bundle(self):
+ try:
+ try_building_js()
+ self.jsState = JsState.NEW
+ except OSError:
+ webdir_path()
+ generatedJavascriptDir = os.path.join(webdir_path(), 'pgadmin', 'static', 'js', 'generated')
+ if os.path.exists(generatedJavascriptDir) and os.listdir(generatedJavascriptDir):
+ self.jsState = JsState.OLD
+ else:
+ self.jsState = JsState.NONE
+
+ def report(self):
+ return self.jsState
+
+
+@contextmanager
+def pushd(new_dir):
+ previous_dir = os.getcwd()
+ os.chdir(new_dir)
+ yield
+ os.chdir(previous_dir)
+
+
+def webdir_path():
+ dirname = os.path.dirname
+ thisPath = os.path.realpath(u(__file__, fs_encoding))
+ return dirname(dirname(dirname(dirname(thisPath))))
+
+
+def try_building_js():
+ node_modules_dir = os.path.join(webdir_path(), 'node_modules', '.bin')
+ with pushd(node_modules_dir):
+ if call(['grunt', 'webpack']) != 0:
+ raise OSError('Error executing grunt')
diff --git a/web/pgadmin/tools/javascript/tests/__init__.py b/web/pgadmin/tools/javascript/tests/__init__.py
new file mode 100644
index 00000000..9e55d2b2
--- /dev/null
+++ b/web/pgadmin/tools/javascript/tests/__init__.py
@@ -0,0 +1,6 @@
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
diff --git a/web/pgadmin/tools/javascript/tests/test_javascript_bundler.py b/web/pgadmin/tools/javascript/tests/test_javascript_bundler.py
new file mode 100644
index 00000000..8c8533c4
--- /dev/null
+++ b/web/pgadmin/tools/javascript/tests/test_javascript_bundler.py
@@ -0,0 +1,114 @@
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+
+import sys
+
+from pgadmin.utils.route import BaseTestGenerator
+if sys.version_info < (3, 3):
+ import mock
+else:
+ import unittest.mock as mock
+
+
+class JavascriptBundlerTestCase(BaseTestGenerator):
+ """This tests that the javascript bundler tool causes grunt to build,
+ and can be invoked before and after app start correctly"""
+
+ scenarios = [('scenario name: JavascriptBundlerTestCase', dict())]
+
+ def setUp(self):
+ self.mockSubprocess = mock.Mock()
+ self.mockOs = mock.Mock()
+ sys.modules['subprocess'] = self.mockSubprocess
+ sys.modules['os'] = self.mockOs
+
+ def runTest(self):
+ from pgadmin.tools.javascript.javascript_bundler import JavascriptBundler
+ from pgadmin.tools.javascript.javascript_bundler import JsState
+ self.JavascriptBundler = JavascriptBundler
+ self.JsState = JsState
+
+ self._bundling_succeeds()
+ self.resetTestState()
+ self._bundling_fails_and_there_is_no_existing_bundle()
+ self.resetTestState()
+ self._bundling_fails_when_grunt_returns_nonzero()
+ self.resetTestState()
+ self._bundling_fails_and_there_is_no_existing_bundle_directory()
+ self.resetTestState()
+ self._bundling_fails_but_there_was_existing_bundle()
+ self.resetTestState()
+
+ def resetTestState(self):
+ self.mockSubprocess.reset_mock()
+ self.mockSubprocess.call.side_effect = None
+ self.mockOs.reset_mock()
+ self.mockOs.listdir.side_effect = None
+ self.mockOs.path.exists.side_effect = None
+
+ def _bundling_succeeds(self):
+ javascriptBundler = self.JavascriptBundler()
+ self.assertEqual(len(self.mockSubprocess.method_calls), 0)
+ self.mockSubprocess.call.return_value = 0
+
+ self.mockOs.listdir.return_value = [u'history.js', u'reactComponents.js']
+
+ javascriptBundler.bundle()
+ self.mockSubprocess.call.assert_called_once_with(['grunt', 'webpack'])
+
+ reportedState = javascriptBundler.report()
+ expectedState = self.JsState.NEW
+ self.assertEqual(reportedState, expectedState)
+
+ def _bundling_fails_when_grunt_returns_nonzero(self):
+ javascriptBundler = self.JavascriptBundler()
+ self.assertEqual(len(self.mockSubprocess.method_calls), 0)
+ self.mockOs.listdir.return_value = []
+ self.mockSubprocess.call.return_value = 99
+
+ javascriptBundler.bundle()
+
+ reportedState = javascriptBundler.report()
+ expectedState = self.JsState.NONE
+ self.assertEqual(reportedState, expectedState)
+
+ def _bundling_fails_and_there_is_no_existing_bundle(self):
+ javascriptBundler = self.JavascriptBundler()
+ self.mockSubprocess.call.side_effect = OSError("mock exception behavior")
+ self.mockOs.path.exists.return_value = True
+ self.mockOs.listdir.return_value = []
+
+ javascriptBundler.bundle()
+
+ reportedState = javascriptBundler.report()
+ expectedState = self.JsState.NONE
+ self.assertEqual(reportedState, expectedState)
+
+ def _bundling_fails_and_there_is_no_existing_bundle_directory(self):
+ javascriptBundler = self.JavascriptBundler()
+ self.mockSubprocess.call.side_effect = OSError("mock exception behavior")
+ self.mockOs.path.exists.return_value = False
+ self.mockOs.listdir.side_effect = OSError("mock exception behavior")
+
+ javascriptBundler.bundle()
+
+ reportedState = javascriptBundler.report()
+ expectedState = self.JsState.NONE
+ self.assertEqual(reportedState, expectedState)
+
+ def _bundling_fails_but_there_was_existing_bundle(self):
+ javascriptBundler = self.JavascriptBundler()
+ self.mockSubprocess.call.side_effect = OSError("mock exception behavior")
+ self.mockOs.path.exists.return_value = True
+ self.mockOs.listdir.return_value = [u'history.js', u'reactComponents.js']
+
+ javascriptBundler.bundle()
+ self.mockSubprocess.call.assert_called_once_with(['grunt', 'webpack'])
+
+ reportedState = javascriptBundler.report()
+ expectedState = self.JsState.OLD
+ self.assertEqual(reportedState, expectedState)
diff --git a/web/regression/README b/web/regression/README
index f0d7282e..7bb61ab0 100644
--- a/web/regression/README
+++ b/web/regression/README
@@ -177,16 +177,16 @@ Javascript Tests:
sudo port install nodejs7 yarn
+- See also the top-level pgadmin/README : Bundling Javascript
+
- Javascript tests must be run from the web directory (since that is where node_modules and karma.conf reside):
cd web/
- Install the JS modules required for testing:
- yarn
+ yarn install
- Now run the tests:
- yarn run karma start --single-run
-
-
+ grunt tests
diff --git a/web/regression/javascript/fake_translations.js b/web/regression/javascript/fake_translations.js
index 9516fd63..a3d4f5bd 100644
--- a/web/regression/javascript/fake_translations.js
+++ b/web/regression/javascript/fake_translations.js
@@ -8,5 +8,5 @@
//////////////////////////////////////////////////////////////////////////
define(function () {
- return {}
+ return {};
});
\ No newline at end of file
diff --git a/web/regression/javascript/gettext_spec.js b/web/regression/javascript/gettext_spec.js
index 2ce98a23..54fc498d 100644
--- a/web/regression/javascript/gettext_spec.js
+++ b/web/regression/javascript/gettext_spec.js
@@ -7,45 +7,46 @@
//
//////////////////////////////////////////////////////////////////////////
-define(["sources/gettext", "translations"], function (gettext, translations) {
- describe("translate", function () {
- describe("when there is no translation", function () {
- it("returns the original string", function () {
- expect(gettext("something to be translated")).toEqual("something to be translated");
- });
-
- describe("when there are substitutions", function () {
- it("interpolates a substitution", function () {
- expect(gettext("translate text for %(person)s", {"person": "Sarah"})).toEqual("translate text for Sarah")
- });
-
- it("interpolates multiple substitutions", function () {
- expect(gettext("translate '%(text)s' for %(person)s",
- {
- "text": "constitution",
- "person": "Sarah"
- }
- )).toEqual("translate 'constitution' for Sarah")
- });
- });
+import gettext from 'sources/gettext';
+import translations from 'translations';
+describe('translate', function () {
+ describe('when there is no translation', function () {
+ it('returns the original string', function () {
+ expect(gettext('something to be translated')).toEqual('something to be translated');
});
- describe("when there is a translation", function () {
- beforeEach(function () {
- translations['something to be translated'] = 'etwas zum uebersetzen';
- translations['another translation for %(person)s'] = 'eine weitere Uebersetzung fuer %(person)s';
+ describe('when there are substitutions', function () {
+ it('interpolates a substitution', function () {
+ expect(gettext('translate text for %(person)s', {'person': 'Sarah'})).toEqual('translate text for Sarah');
});
- it("returns the translation", function () {
- expect(gettext("something to be translated")).toEqual("etwas zum uebersetzen");
+ it('interpolates multiple substitutions', function () {
+ expect(gettext('translate \'%(text)s\' for %(person)s',
+ {
+ 'text': 'constitution',
+ 'person': 'Sarah',
+ }
+ )).toEqual('translate \'constitution\' for Sarah');
});
+ });
+
+ });
+
+ describe('when there is a translation', function () {
+ beforeEach(function () {
+ translations['something to be translated'] = 'etwas zum uebersetzen';
+ translations['another translation for %(person)s'] = 'eine weitere Uebersetzung fuer %(person)s';
+ });
+
+ it('returns the translation', function () {
+ expect(gettext('something to be translated')).toEqual('etwas zum uebersetzen');
+ });
- describe("when there is a substitution", function () {
- it("interpolates the substitution", function () {
- expect(gettext("another translation for %(person)s", {"person": "Sarah"}))
- .toEqual("eine weitere Uebersetzung fuer Sarah");
- });
+ describe('when there is a substitution', function () {
+ it('interpolates the substitution', function () {
+ expect(gettext('another translation for %(person)s', {'person': 'Sarah'}))
+ .toEqual('eine weitere Uebersetzung fuer Sarah');
});
});
});
diff --git a/web/regression/javascript/jasmine_capture_warnings_beforeall.js b/web/regression/javascript/jasmine_capture_warnings_beforeall.js
new file mode 100644
index 00000000..a83e6f61
--- /dev/null
+++ b/web/regression/javascript/jasmine_capture_warnings_beforeall.js
@@ -0,0 +1,23 @@
+//////////////////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////////////////
+
+/* eslint-disable no-console */
+
+beforeAll(function () {
+ spyOn(console, 'warn').and.callThrough();
+ spyOn(console, 'error').and.callThrough();
+});
+
+afterEach(function (done) {
+ setTimeout(function () {
+ expect(console.warn).not.toHaveBeenCalled();
+ expect(console.error).not.toHaveBeenCalled();
+ done();
+ }, 0);
+});
\ No newline at end of file
diff --git a/web/regression/javascript/selection/column_selector_spec.js b/web/regression/javascript/selection/column_selector_spec.js
index 947f4852..2cba0af5 100644
--- a/web/regression/javascript/selection/column_selector_spec.js
+++ b/web/regression/javascript/selection/column_selector_spec.js
@@ -1,235 +1,243 @@
-define(
- ["jquery",
- "underscore",
- "slickgrid/slick.grid",
- "sources/selection/column_selector",
- "slickgrid/slick.rowselectionmodel",
- "slickgrid"
- ],
- function ($, _, SlickGrid, ColumnSelector, RowSelectionModel, Slick) {
- describe("ColumnSelector", function () {
- var container, data, columns, options;
+//////////////////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////////////////
+
+import $ from 'jquery';
+
+import Slick from 'slickgrid';
+import 'slickgrid.grid';
+
+import RowSelectionModel from '../../../pgadmin/static/vendor/slickgrid/plugins/slick.rowselectionmodel';
+import ColumnSelector from '../../../pgadmin/static/js/selection/column_selector';
+
+
+describe('ColumnSelector', function () {
+ var container, data, columns, options;
+ beforeEach(function () {
+ container = $('<div></div>');
+ container.height(9999);
+
+ data = [{'some-column-name': 'first value', 'second column': 'second value'}];
+
+ columns = [
+ {
+ id: '1',
+ name: 'some-column-name',
+ },
+ {
+ id: '2',
+ name: 'second column',
+ },
+ {
+ name: 'some-non-selectable-column',
+ selectable: false,
+ },
+ ];
+ });
+
+ describe('when a column is not selectable', function () {
+ it('does not create a checkbox for selecting the column', function () {
+ var checkboxColumn = {
+ name: 'some-column-name-4',
+ selectable: false,
+ };
+ columns.push(checkboxColumn);
+
+ setupGrid(columns);
+
+ expect(container.find('.slick-header-columns input').length).toBe(2);
+ });
+ });
+
+ it('renders a checkbox in the column header', function () {
+ setupGrid(columns);
+
+ expect(container.find('.slick-header-columns input').length).toBe(2);
+ });
+
+ it('displays the name of the column', function () {
+ setupGrid(columns);
+
+ expect($(container.find('.slick-header-columns .slick-column-name')[0]).text())
+ .toContain('some-column-name');
+ expect($(container.find('.slick-header-columns .slick-column-name')[1]).text())
+ .toContain('second column');
+ });
+
+ it('preserves the other attributes of column definitions', function () {
+ var columnSelector = new ColumnSelector();
+ var selectableColumns = columnSelector.getColumnDefinitionsWithCheckboxes(columns);
+
+ expect(selectableColumns[0].id).toBe('1');
+ });
+
+ describe('selecting columns', function () {
+ var grid, rowSelectionModel;
+ beforeEach(function () {
+ var columnSelector = new ColumnSelector();
+ columns = columnSelector.getColumnDefinitionsWithCheckboxes(columns);
+ data = [];
+ for (var i = 0; i < 10; i++) {
+ data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i});
+ }
+ grid = new Slick.Grid(container, data, columns, options);
+
+ rowSelectionModel = new RowSelectionModel();
+ grid.setSelectionModel(rowSelectionModel);
+
+ grid.registerPlugin(columnSelector);
+ grid.invalidate();
+ $('body').append(container);
+ });
+
+ afterEach(function () {
+ $('body').find(container).remove();
+ });
+
+ describe('when the user clicks a column header', function () {
+ it('selects the column', function () {
+ container.find('.slick-header-column')[0].click();
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+ expectOnlyTheFirstColumnToBeSelected(selectedRanges);
+ });
+ });
+
+ describe('when the user clicks additional column headers', function () {
+ beforeEach(function () {
+ container.find('.slick-header-column')[1].click();
+ });
+
+ it('selects additional columns', function () {
+ container.find('.slick-header-column')[0].click();
+
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+ var column1 = selectedRanges[0];
+
+ expect(selectedRanges.length).toEqual(2);
+ expect(column1.fromCell).toBe(1);
+ expect(column1.toCell).toBe(1);
+
+ var column2 = selectedRanges[1];
+
+ expect(column2.fromCell).toBe(0);
+ expect(column2.toCell).toBe(0);
+ });
+ });
+
+ describe('when the user clicks a column header checkbox', function () {
+ it('selects the column', function () {
+ container.find('.slick-header-columns input')[0].click();
+
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+ expectOnlyTheFirstColumnToBeSelected(selectedRanges);
+ });
+
+ it('checks the checkbox', function () {
+ container.find('.slick-header-column')[1].click();
+ expect($(container.find('.slick-header-columns input')[1]).is(':checked')).toBeTruthy();
+ });
+ });
+
+ describe('when a row is selected', function () {
beforeEach(function () {
- container = $("<div></div>");
- container.height(9999);
-
- data = [{'some-column-name': 'first value', 'second column': 'second value'}];
-
- columns = [
- {
- id: '1',
- name: 'some-column-name',
- },
- {
- id: '2',
- name: 'second column',
- },
- {
- name: 'some-non-selectable-column',
- selectable: false
- }
- ]
+ var selectedRanges = [new Slick.Range(0, 0, 0, 1)];
+ rowSelectionModel.setSelectedRanges(selectedRanges);
});
- describe("when a column is not selectable", function () {
- it("does not create a checkbox for selecting the column", function () {
- var checkboxColumn = {
- name: 'some-column-name-4',
- selectable: false
- };
- columns.push(checkboxColumn);
+ it('deselects the row', function () {
+ container.find('.slick-header-column')[1].click();
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
- setupGrid(columns);
+ expect(selectedRanges.length).toBe(1);
- expect(container.find('.slick-header-columns input').length).toBe(2)
- });
+ var column = selectedRanges[0];
+
+ expect(column.fromCell).toBe(1);
+ expect(column.toCell).toBe(1);
+ expect(column.fromRow).toBe(0);
+ expect(column.toRow).toBe(9);
});
+ });
- it("renders a checkbox in the column header", function () {
- setupGrid(columns);
+ describe('clicking a second time', function () {
+ beforeEach(function () {
+ container.find('.slick-header-column')[1].click();
+ });
- expect(container.find('.slick-header-columns input').length).toBe(2)
+ it('unchecks checkbox', function () {
+ container.find('.slick-header-column')[1].click();
+ expect($(container.find('.slick-header-columns input')[1]).is(':checked')).toBeFalsy();
});
- it("displays the name of the column", function () {
- setupGrid(columns);
+ it('deselects the column', function () {
+ container.find('.slick-header-column')[1].click();
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
- expect($(container.find('.slick-header-columns .slick-column-name')[0]).text())
- .toContain('some-column-name');
- expect($(container.find('.slick-header-columns .slick-column-name')[1]).text())
- .toContain('second column');
+ expect(selectedRanges.length).toEqual(0);
});
+ });
- it("preserves the other attributes of column definitions", function () {
- var columnSelector = new ColumnSelector();
- var selectableColumns = columnSelector.getColumnDefinitionsWithCheckboxes(columns);
+ describe('when the column is not selectable', function () {
+ it('does not select the column', function () {
+ $(container.find('.slick-header-column:contains(some-non-selectable-column)')).click();
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
- expect(selectableColumns[0].id).toBe('1');
+ expect(selectedRanges.length).toEqual(0);
});
+ });
- describe("selecting columns", function () {
- var grid, rowSelectionModel;
- beforeEach(function () {
- var columnSelector = new ColumnSelector();
- columns = columnSelector.getColumnDefinitionsWithCheckboxes(columns);
- data = [];
- for (var i = 0; i < 10; i++) {
- data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i});
- }
- grid = new SlickGrid(container, data, columns, options);
-
- rowSelectionModel = new RowSelectionModel();
- grid.setSelectionModel(rowSelectionModel);
-
- grid.registerPlugin(columnSelector);
- grid.invalidate();
- $("body").append(container);
- });
-
- afterEach(function () {
- $("body").find(container).remove();
- });
-
- describe("when the user clicks a column header", function () {
- it("selects the column", function () {
- container.find('.slick-header-column')[0].click();
- var selectedRanges = rowSelectionModel.getSelectedRanges();
- expectOnlyTheFirstColumnToBeSelected(selectedRanges);
- });
- });
-
- describe("when the user clicks additional column headers", function () {
- beforeEach(function () {
- container.find('.slick-header-column')[1].click();
- });
-
- it("selects additional columns", function () {
- container.find('.slick-header-column')[0].click();
-
- var selectedRanges = rowSelectionModel.getSelectedRanges();
- var column1 = selectedRanges[0];
-
- expect(selectedRanges.length).toEqual(2);
- expect(column1.fromCell).toBe(1);
- expect(column1.toCell).toBe(1);
-
- var column2 = selectedRanges[1];
-
- expect(column2.fromCell).toBe(0);
- expect(column2.toCell).toBe(0);
- });
- });
-
- describe("when the user clicks a column header checkbox", function () {
- it("selects the column", function () {
- container.find('.slick-header-columns input')[0].click();
-
- var selectedRanges = rowSelectionModel.getSelectedRanges();
- expectOnlyTheFirstColumnToBeSelected(selectedRanges);
- });
-
- it("checks the checkbox", function () {
- container.find('.slick-header-column')[1].click();
- expect($(container.find('.slick-header-columns input')[1]).is(':checked')).toBeTruthy();
- });
- });
-
- describe("when a row is selected", function () {
- beforeEach(function () {
- var selectedRanges = [new Slick.Range(0, 0, 0, 1)];
- rowSelectionModel.setSelectedRanges(selectedRanges);
- });
-
- it("deselects the row", function () {
- container.find('.slick-header-column')[1].click();
- var selectedRanges = rowSelectionModel.getSelectedRanges();
-
- expect(selectedRanges.length).toBe(1);
-
- var column = selectedRanges[0];
-
- expect(column.fromCell).toBe(1);
- expect(column.toCell).toBe(1);
- expect(column.fromRow).toBe(0);
- expect(column.toRow).toBe(9);
- })
- });
-
- describe("clicking a second time", function () {
- beforeEach(function () {
- container.find('.slick-header-column')[1].click();
- });
-
- it("unchecks checkbox", function () {
- container.find('.slick-header-column')[1].click();
- expect($(container.find('.slick-header-columns input')[1]).is(':checked')).toBeFalsy();
- });
-
- it("deselects the column", function () {
- container.find('.slick-header-column')[1].click();
- var selectedRanges = rowSelectionModel.getSelectedRanges();
-
- expect(selectedRanges.length).toEqual(0);
- })
- });
-
- describe("when the column is not selectable", function () {
- it("does not select the column", function () {
- $(container.find('.slick-header-column:contains(some-non-selectable-column)')).click();
- var selectedRanges = rowSelectionModel.getSelectedRanges();
-
- expect(selectedRanges.length).toEqual(0);
- });
- });
-
- describe("when the column is deselected through setSelectedRanges", function () {
- beforeEach(function () {
- container.find('.slick-header-column')[1].click();
- });
-
- it("unchecks the checkbox", function () {
- rowSelectionModel.setSelectedRanges([]);
-
- expect($(container.find('.slick-header-columns input')[1])
- .is(':checked')).toBeFalsy();
- });
- });
-
- describe("when a non-column range was already selected", function () {
- beforeEach(function () {
- var selectedRanges = [new Slick.Range(0, 0, 1, 0)];
- rowSelectionModel.setSelectedRanges(selectedRanges);
- });
-
- it("deselects the non-column range", function () {
- container.find('.slick-header-column')[0].click();
-
- var selectedRanges = rowSelectionModel.getSelectedRanges();
- expectOnlyTheFirstColumnToBeSelected(selectedRanges);
- })
- });
+ describe('when the column is deselected through setSelectedRanges', function () {
+ beforeEach(function () {
+ container.find('.slick-header-column')[1].click();
});
- var setupGrid = function (columns) {
- var columnSelector = new ColumnSelector();
- columns = columnSelector.getColumnDefinitionsWithCheckboxes(columns);
- var grid = new SlickGrid(container, data, columns, options);
+ it('unchecks the checkbox', function () {
+ rowSelectionModel.setSelectedRanges([]);
- var rowSelectionModel = new RowSelectionModel();
- grid.setSelectionModel(rowSelectionModel);
+ expect($(container.find('.slick-header-columns input')[1])
+ .is(':checked')).toBeFalsy();
+ });
+ });
- grid.registerPlugin(columnSelector);
- grid.invalidate();
- };
+ describe('when a non-column range was already selected', function () {
+ beforeEach(function () {
+ var selectedRanges = [new Slick.Range(0, 0, 1, 0)];
+ rowSelectionModel.setSelectedRanges(selectedRanges);
+ });
- function expectOnlyTheFirstColumnToBeSelected(selectedRanges) {
- var row = selectedRanges[0];
+ it('deselects the non-column range', function () {
+ container.find('.slick-header-column')[0].click();
- expect(selectedRanges.length).toEqual(1);
- expect(row.fromCell).toBe(0);
- expect(row.toCell).toBe(0);
- expect(row.fromRow).toBe(0);
- expect(row.toRow).toBe(9);
- }
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+ expectOnlyTheFirstColumnToBeSelected(selectedRanges);
+ });
});
});
+
+ var setupGrid = function (columns) {
+ var columnSelector = new ColumnSelector();
+ columns = columnSelector.getColumnDefinitionsWithCheckboxes(columns);
+ var grid = new Slick.Grid(container, data, columns, options);
+
+ var rowSelectionModel = new RowSelectionModel();
+ grid.setSelectionModel(rowSelectionModel);
+
+ grid.registerPlugin(columnSelector);
+ grid.invalidate();
+ };
+
+ function expectOnlyTheFirstColumnToBeSelected(selectedRanges) {
+ var row = selectedRanges[0];
+
+ expect(selectedRanges.length).toEqual(1);
+ expect(row.fromCell).toBe(0);
+ expect(row.toCell).toBe(0);
+ expect(row.fromRow).toBe(0);
+ expect(row.toRow).toBe(9);
+ }
+});
diff --git a/web/regression/javascript/selection/copy_data_spec.js b/web/regression/javascript/selection/copy_data_spec.js
index affad66e..ffb0deca 100644
--- a/web/regression/javascript/selection/copy_data_spec.js
+++ b/web/regression/javascript/selection/copy_data_spec.js
@@ -1,119 +1,128 @@
-define(
- ["jquery",
- "slickgrid/slick.grid",
- "slickgrid/slick.rowselectionmodel",
- "sources/selection/copy_data",
- "sources/selection/clipboard",
- "sources/selection/range_selection_helper"
- ],
- function ($, SlickGrid, RowSelectionModel, copyData, clipboard, RangeSelectionHelper) {
- describe('copyData', function () {
- var grid, sqlEditor;
-
- beforeEach(function () {
- var data = [[1, "leopord", "12"],
- [2, "lion", "13"],
- [3, "puma", "9"]];
-
- var columns = [{
- name: "id",
- pos: 0,
- label: "id<br> numeric",
- cell: "number",
- can_edit: false,
- type: "numeric"
- }, {
- name: "brand",
- pos: 1,
- label: "flavor<br> character varying",
- cell: "string",
- can_edit: false,
- type: "character varying"
- }, {
- name: "size",
- pos: 2,
- label: "size<br> numeric",
- cell: "number",
- can_edit: false,
- type: "numeric"
- }
- ]
- ;
- var gridContainer = $("<div id='grid'></div>");
- $("body").append(gridContainer);
- $("body").append("<button id='btn-paste-row' disabled></button>");
- grid = new Slick.Grid("#grid", data, columns, {});
- grid.setSelectionModel(new Slick.RowSelectionModel({selectActiveRow: false}));
- sqlEditor = {slickgrid: grid};
- });
+//////////////////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////////////////
+
+import $ from 'jquery';
+
+import Slick from 'slickgrid';
+import 'slickgrid.grid';
+
+import clipboard from '../../../pgadmin/static/js/selection/clipboard';
+import copyData from '../../../pgadmin/static/js/selection/copy_data';
+
+import RangeSelectionHelper from 'sources/selection/range_selection_helper';
+
+describe('copyData', function () {
+ var grid, sqlEditor;
+
+ beforeEach(function () {
+ var data = [[1, 'leopord', '12'],
+ [2, 'lion', '13'],
+ [3, 'puma', '9']];
+
+ var columns = [{
+ name: 'id',
+ pos: 0,
+ label: 'id<br> numeric',
+ cell: 'number',
+ can_edit: false,
+ type: 'numeric',
+ }, {
+ name: 'brand',
+ pos: 1,
+ label: 'flavor<br> character varying',
+ cell: 'string',
+ can_edit: false,
+ type: 'character varying',
+ }, {
+ name: 'size',
+ pos: 2,
+ label: 'size<br> numeric',
+ cell: 'number',
+ can_edit: false,
+ type: 'numeric',
+ },
+ ]
+ ;
+ var gridContainer = $('<div id=\'grid\'></div>');
+ $('body').append(gridContainer);
+ $('body').append('<button id=\'btn-paste-row\' disabled></button>');
+ grid = new Slick.Grid('#grid', data, columns, {});
+ grid.setSelectionModel(new Slick.RowSelectionModel({selectActiveRow: false}));
+ sqlEditor = {slickgrid: grid};
+ });
- afterEach(function() {
- $("body").remove('#grid');
- $("body").remove('#btn-paste-row');
- });
+ afterEach(function () {
+ $('body').remove('#grid');
+ $('body').remove('#btn-paste-row');
+ });
- describe("when rows are selected", function () {
- beforeEach(function () {
- grid.getSelectionModel().setSelectedRanges([
- RangeSelectionHelper.rangeForRow(grid, 0),
- RangeSelectionHelper.rangeForRow(grid, 2)]
- );
- });
+ describe('when rows are selected', function () {
+ beforeEach(function () {
+ grid.getSelectionModel().setSelectedRanges([
+ RangeSelectionHelper.rangeForRow(grid, 0),
+ RangeSelectionHelper.rangeForRow(grid, 2)]
+ );
+ });
- it("copies them", function () {
- spyOn(clipboard, 'copyTextToClipboard');
+ it('copies them', function () {
+ spyOn(clipboard, 'copyTextToClipboard');
- copyData.apply(sqlEditor);
+ copyData.apply(sqlEditor);
- expect(sqlEditor.copied_rows.length).toBe(2);
+ expect(sqlEditor.copied_rows.length).toBe(2);
- expect(clipboard.copyTextToClipboard).toHaveBeenCalled();
- expect(clipboard.copyTextToClipboard.calls.mostRecent().args[0]).toContain("1,'leopord','12'");
- expect(clipboard.copyTextToClipboard.calls.mostRecent().args[0]).toContain("3,'puma','9'");
- });
+ expect(clipboard.copyTextToClipboard).toHaveBeenCalled();
+ expect(clipboard.copyTextToClipboard.calls.mostRecent().args[0]).toContain('1,\'leopord\',\'12\'');
+ expect(clipboard.copyTextToClipboard.calls.mostRecent().args[0]).toContain('3,\'puma\',\'9\'');
+ });
- describe("when the user can edit the grid", function () {
- it("enables the paste row button", function () {
- copyData.apply(_.extend({can_edit: true}, sqlEditor));
+ describe('when the user can edit the grid', function () {
+ it('enables the paste row button', function () {
+ copyData.apply(_.extend({can_edit: true}, sqlEditor));
- expect($("#btn-paste-row").prop('disabled')).toBe(false);
- });
- });
+ expect($('#btn-paste-row').prop('disabled')).toBe(false);
});
+ });
+ });
- describe("when a column is selected", function () {
- beforeEach(function () {
- var firstColumn = new Slick.Range(0, 0, 2, 0);
- grid.getSelectionModel().setSelectedRanges([firstColumn])
- });
+ describe('when a column is selected', function () {
+ beforeEach(function () {
+ var firstColumn = new Slick.Range(0, 0, 2, 0);
+ grid.getSelectionModel().setSelectedRanges([firstColumn]);
+ });
- it("copies text to the clipboard", function () {
- spyOn(clipboard, 'copyTextToClipboard');
+ it('copies text to the clipboard', function () {
+ spyOn(clipboard, 'copyTextToClipboard');
- copyData.apply(sqlEditor);
+ copyData.apply(sqlEditor);
- expect(clipboard.copyTextToClipboard).toHaveBeenCalled();
+ expect(clipboard.copyTextToClipboard).toHaveBeenCalled();
- var copyArg = clipboard.copyTextToClipboard.calls.mostRecent().args[0];
- var rowStrings = copyArg.split('\n');
- expect(rowStrings[0]).toBe("1");
- expect(rowStrings[1]).toBe("2");
- expect(rowStrings[2]).toBe("3");
- });
+ var copyArg = clipboard.copyTextToClipboard.calls.mostRecent().args[0];
+ var rowStrings = copyArg.split('\n');
+ expect(rowStrings[0]).toBe('1');
+ expect(rowStrings[1]).toBe('2');
+ expect(rowStrings[2]).toBe('3');
+ });
- it("sets copied_rows to empty", function () {
- copyData.apply(sqlEditor);
+ it('sets copied_rows to empty', function () {
+ copyData.apply(sqlEditor);
- expect(sqlEditor.copied_rows.length).toBe(0);
- });
+ expect(sqlEditor.copied_rows.length).toBe(0);
+ });
- describe("when the user can edit the grid", function () {
- it("disables the paste row button", function () {
- copyData.apply(_.extend({can_edit: true}, sqlEditor));
+ describe('when the user can edit the grid', function () {
+ it('disables the paste row button', function () {
+ copyData.apply(_.extend({can_edit: true}, sqlEditor));
- expect($("#btn-paste-row").prop('disabled')).toBe(true);
- });
- });
+ expect($('#btn-paste-row').prop('disabled')).toBe(true);
});
});
});
+});
\ No newline at end of file
diff --git a/web/regression/javascript/selection/grid_selector_spec.js b/web/regression/javascript/selection/grid_selector_spec.js
index a74a66f9..22886b77 100644
--- a/web/regression/javascript/selection/grid_selector_spec.js
+++ b/web/regression/javascript/selection/grid_selector_spec.js
@@ -1,126 +1,127 @@
-define(["jquery",
- "underscore",
- "slickgrid/slick.grid",
- "slickgrid/slick.rowselectionmodel",
- "sources/selection/grid_selector"
- ],
- function ($, _, SlickGrid, RowSelectionModel, GridSelector) {
- describe("GridSelector", function () {
- var container, data, columns, gridSelector, rowSelectionModel;
+import $ from 'jquery';
- beforeEach(function () {
- container = $("<div></div>");
- container.height(9999);
- columns = [{
- id: '1',
- name: 'some-column-name',
- }, {
- id: '2',
- name: 'second column',
- }];
-
- gridSelector = new GridSelector();
- columns = gridSelector.getColumnDefinitionsWithCheckboxes(columns);
-
- data = [];
- for (var i = 0; i < 10; i++) {
- data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i});
- }
- var grid = new SlickGrid(container, data, columns);
-
- rowSelectionModel = new RowSelectionModel();
- grid.setSelectionModel(rowSelectionModel);
-
- grid.registerPlugin(gridSelector);
- grid.invalidate();
-
- $("body").append(container);
- });
+import Slick from 'slickgrid';
+import 'slickgrid.grid';
- afterEach(function () {
- $("body").find(container).remove();
- });
+import RowSelectionModel from 'slickgrid.rowselectionmodel';
- it("renders an additional column on the left for selecting rows", function () {
- expect(columns.length).toBe(3);
+import GridSelector from 'sources/selection/grid_selector';
- var leftmostColumn = columns[0];
- expect(leftmostColumn.id).toBe('row-header-column');
- });
+describe('GridSelector', function () {
+ var container, data, columns, gridSelector, rowSelectionModel;
- it("renders checkboxes for selecting columns", function () {
- expect(container.find('[data-test="output-column-header"] input').length).toBe(2)
- });
+ beforeEach(function () {
+ container = $('<div></div>');
+ container.height(9999);
+ columns = [{
+ id: '1',
+ name: 'some-column-name',
+ }, {
+ id: '2',
+ name: 'second column',
+ }];
- it("renders a checkbox for selecting all the cells", function () {
- expect(container.find("[title='Select/Deselect All']").length).toBe(1);
- });
+ gridSelector = new GridSelector();
+ columns = gridSelector.getColumnDefinitionsWithCheckboxes(columns);
+
+ data = [];
+ for (var i = 0; i < 10; i++) {
+ data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i});
+ }
+ var grid = new Slick.Grid(container, data, columns);
+
+ rowSelectionModel = new RowSelectionModel();
+ grid.setSelectionModel(rowSelectionModel);
+
+ grid.registerPlugin(gridSelector);
+ grid.invalidate();
+
+ $('body').append(container);
+ });
+
+ afterEach(function () {
+ $('body').find(container).remove();
+ });
+
+ it('renders an additional column on the left for selecting rows', function () {
+ expect(columns.length).toBe(3);
+
+ var leftmostColumn = columns[0];
+ expect(leftmostColumn.id).toBe('row-header-column');
+ });
+
+ it('renders checkboxes for selecting columns', function () {
+ expect(container.find('[data-test="output-column-header"] input').length).toBe(2);
+ });
+
+ it('renders a checkbox for selecting all the cells', function () {
+ expect(container.find('[title=\'Select/Deselect All\']').length).toBe(1);
+ });
+
+ describe('when the cell for the select/deselect all is clicked', function () {
+ it('selects the whole grid', function () {
+ container.find('[title=\'Select/Deselect All\']').parent().click();
+
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+ expect(selectedRanges.length).toBe(1);
+ var selectedRange = selectedRanges[0];
+ expect(selectedRange.fromCell).toBe(1);
+ expect(selectedRange.toCell).toBe(2);
+ expect(selectedRange.fromRow).toBe(0);
+ expect(selectedRange.toRow).toBe(9);
+ });
+
+ it('checks the checkbox', function () {
+ container.find('[title=\'Select/Deselect All\']').parent().click();
+
+ expect($(container.find('[data-id=\'checkbox-select-all\']')).is(':checked')).toBeTruthy();
+ });
+ });
- describe("when the cell for the select/deselect all is clicked", function () {
- it("selects the whole grid", function () {
- container.find("[title='Select/Deselect All']").parent().click();
+ describe('when the main checkbox in the corner gets selected', function () {
+ it('unchecks all the columns', function () {
+ container.find('[title=\'Select/Deselect All\']').click();
- var selectedRanges = rowSelectionModel.getSelectedRanges();
- expect(selectedRanges.length).toBe(1);
- var selectedRange = selectedRanges[0];
- expect(selectedRange.fromCell).toBe(1);
- expect(selectedRange.toCell).toBe(2);
- expect(selectedRange.fromRow).toBe(0);
- expect(selectedRange.toRow).toBe(9);
- });
+ expect($(container.find('.slick-header-columns input')[1]).is(':checked')).toBeFalsy();
+ expect($(container.find('.slick-header-columns input')[2]).is(':checked')).toBeFalsy();
+ });
- it("checks the checkbox", function () {
- container.find("[title='Select/Deselect All']").parent().click();
+ it('selects all the cells', function () {
+ container.find('[title=\'Select/Deselect All\']').click();
+
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+ expect(selectedRanges.length).toBe(1);
+ var selectedRange = selectedRanges[0];
+ expect(selectedRange.fromCell).toBe(1);
+ expect(selectedRange.toCell).toBe(2);
+ expect(selectedRange.fromRow).toBe(0);
+ expect(selectedRange.toRow).toBe(9);
+ });
- expect($(container.find("[data-id='checkbox-select-all']")).is(':checked')).toBeTruthy();
- })
+ describe('when the main checkbox in the corner gets deselected', function () {
+ beforeEach(function () {
+ container.find('[title=\'Select/Deselect All\']').click();
});
- describe("when the main checkbox in the corner gets selected", function () {
- it("unchecks all the columns", function () {
- container.find("[title='Select/Deselect All']").click();
-
- expect($(container.find('.slick-header-columns input')[1]).is(':checked')).toBeFalsy();
- expect($(container.find('.slick-header-columns input')[2]).is(':checked')).toBeFalsy();
- });
-
- it("selects all the cells", function () {
- container.find("[title='Select/Deselect All']").click();
-
- var selectedRanges = rowSelectionModel.getSelectedRanges();
- expect(selectedRanges.length).toBe(1);
- var selectedRange = selectedRanges[0];
- expect(selectedRange.fromCell).toBe(1);
- expect(selectedRange.toCell).toBe(2);
- expect(selectedRange.fromRow).toBe(0);
- expect(selectedRange.toRow).toBe(9);
- });
-
- describe("when the main checkbox in the corner gets deselected", function () {
- beforeEach(function () {
- container.find("[title='Select/Deselect All']").click();
- });
-
- it("deselects all the cells", function () {
- container.find("[title='Select/Deselect All']").click();
-
- var selectedRanges = rowSelectionModel.getSelectedRanges();
- expect(selectedRanges.length).toBe(0);
- });
- });
-
- describe("and then the underlying selection changes", function () {
- beforeEach(function () {
- container.find("[title='Select/Deselect All']").click();
- });
-
- it("unchecks the main checkbox", function () {
- var ranges = [new Slick.Range(0, 0, 0, 1)];
- rowSelectionModel.setSelectedRanges(ranges);
-
- expect($(container.find("[title='Select/Deselect All']")).is(':checked')).toBeFalsy();
- });
- });
+ it('deselects all the cells', function () {
+ container.find('[title=\'Select/Deselect All\']').click();
+
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+ expect(selectedRanges.length).toBe(0);
+ });
+ });
+
+ describe('and then the underlying selection changes', function () {
+ beforeEach(function () {
+ container.find('[title=\'Select/Deselect All\']').click();
+ });
+
+ it('unchecks the main checkbox', function () {
+ var ranges = [new Slick.Range(0, 0, 0, 1)];
+ rowSelectionModel.setSelectedRanges(ranges);
+
+ expect($(container.find('[title=\'Select/Deselect All\']')).is(':checked')).toBeFalsy();
});
});
});
+});
\ No newline at end of file
diff --git a/web/regression/javascript/selection/range_boundary_navigator_spec.js b/web/regression/javascript/selection/range_boundary_navigator_spec.js
index 8376d0a7..6e9173d1 100644
--- a/web/regression/javascript/selection/range_boundary_navigator_spec.js
+++ b/web/regression/javascript/selection/range_boundary_navigator_spec.js
@@ -1,8 +1,20 @@
-define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNavigator) {
-
- describe("#getUnion", function () {
- describe("when the ranges completely overlap", function () {
- it("returns a list with that range", function () {
+//////////////////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////////////////
+
+import rangeBoundaryNavigator from 'sources/selection/range_boundary_navigator';
+import Slick from 'slickgrid';
+
+describe('RangeBoundaryNavigator', function () {
+
+ describe('#getUnion', function () {
+ describe('when the ranges completely overlap', function () {
+ it('returns a list with that range', function () {
var ranges = [[1, 4], [1, 4], [1, 4]];
var union = rangeBoundaryNavigator.getUnion(ranges);
@@ -11,8 +23,8 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa
});
});
- describe("when the ranges all overlap partially or touch", function () {
- it("returns one long range", function () {
+ describe('when the ranges all overlap partially or touch', function () {
+ it('returns one long range', function () {
var rangeBounds = [[3, 6], [1, 4], [7, 14]];
var union = rangeBoundaryNavigator.getUnion(rangeBounds);
@@ -20,7 +32,7 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa
expect(union).toEqual([[1, 14]]);
});
- it("returns them in order from lowest to highest", function () {
+ it('returns them in order from lowest to highest', function () {
var rangeBounds = [[3, 6], [2, 3], [10, 12]];
var union = rangeBoundaryNavigator.getUnion(rangeBounds);
@@ -28,9 +40,9 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa
expect(union).toEqual([[2, 6], [10, 12]]);
});
- describe("when one range completely overlaps another", function() {
+ describe('when one range completely overlaps another', function() {
- it("returns them in order from lowest to highest", function () {
+ it('returns them in order from lowest to highest', function () {
var rangeBounds = [[9, 14], [2, 3], [11, 13]];
var union = rangeBoundaryNavigator.getUnion(rangeBounds);
@@ -39,19 +51,19 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa
});
});
- describe("when one range is a subset of another", function () {
- it("returns the larger range", function () {
+ describe('when one range is a subset of another', function () {
+ it('returns the larger range', function () {
var rangeBounds = [[2, 6], [1, 14], [8, 10]];
var union = rangeBoundaryNavigator.getUnion(rangeBounds);
expect(union).toEqual([[1, 14]]);
- })
- })
+ });
+ });
});
- describe("when the ranges do not touch", function () {
- it("returns them in order from lowest to highest", function () {
+ describe('when the ranges do not touch', function () {
+ it('returns them in order from lowest to highest', function () {
var rangeBounds = [[3, 6], [1, 1], [8, 10]];
var union = rangeBoundaryNavigator.getUnion(rangeBounds);
@@ -62,8 +74,8 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa
});
- describe("#mapDimensionBoundaryUnion", function () {
- it("returns a list of the results of the callback", function () {
+ describe('#mapDimensionBoundaryUnion', function () {
+ it('returns a list of the results of the callback', function () {
var rangeBounds = [[0, 1], [3, 3]];
var callback = function () {
return 'hello';
@@ -72,7 +84,7 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa
expect(result).toEqual(['hello', 'hello', 'hello']);
});
- it("calls the callback with each index in the dimension", function () {
+ it('calls the callback with each index in the dimension', function () {
var rangeBounds = [[0, 1], [3, 3]];
var callback = jasmine.createSpy('callbackSpy');
rangeBoundaryNavigator.mapDimensionBoundaryUnion(rangeBounds, callback);
@@ -80,7 +92,7 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa
});
});
- describe("#mapOver2DArray", function () {
+ describe('#mapOver2DArray', function () {
var data, rowCollector, processCell;
beforeEach(function () {
data = [[0, 1, 2, 3], [2, 2, 2, 2], [4, 5, 6, 7]];
@@ -92,66 +104,66 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa
};
});
- it("calls the callback for each item in the ranges", function () {
+ it('calls the callback for each item in the ranges', function () {
var rowRanges = [[0, 0], [2, 2]];
var colRanges = [[0, 3]];
var selectionResult = rangeBoundaryNavigator.mapOver2DArray(rowRanges, colRanges, processCell, rowCollector);
- expect(selectionResult).toEqual(["[0,1,2,3]", "[4,5,6,7]"]);
+ expect(selectionResult).toEqual(['[0,1,2,3]', '[4,5,6,7]']);
});
- describe("when the ranges are out of order/duplicated", function () {
+ describe('when the ranges are out of order/duplicated', function () {
var rowRanges, colRanges;
beforeEach(function () {
rowRanges = [[2, 2], [2, 2], [0, 0]];
colRanges = [[0, 3]];
});
- it("uses the union of the ranges", function () {
- spyOn(rangeBoundaryNavigator, "getUnion").and.callThrough();
+ it('uses the union of the ranges', function () {
+ spyOn(rangeBoundaryNavigator, 'getUnion').and.callThrough();
var selectionResult = rangeBoundaryNavigator.mapOver2DArray(rowRanges, colRanges, processCell, rowCollector);
expect(rangeBoundaryNavigator.getUnion).toHaveBeenCalledWith(rowRanges);
expect(rangeBoundaryNavigator.getUnion).toHaveBeenCalledWith(colRanges);
- expect(selectionResult).toEqual(["[0,1,2,3]", "[4,5,6,7]"]);
+ expect(selectionResult).toEqual(['[0,1,2,3]', '[4,5,6,7]']);
});
});
});
- describe("#rangesToCsv", function () {
+ describe('#rangesToCsv', function () {
var data, columnDefinitions, ranges;
beforeEach(function () {
- data = [[1, "leopard", "12"],
- [2, "lion", "13"],
- [3, "cougar", "9"],
- [4, "tiger", "10"]];
+ data = [[1, 'leopard', '12'],
+ [2, 'lion', '13'],
+ [3, 'cougar', '9'],
+ [4, 'tiger', '10']];
columnDefinitions = [{name: 'id', pos: 0}, {name: 'animal', pos: 1}, {name: 'size', pos: 2}];
ranges = [new Slick.Range(0, 0, 0, 2), new Slick.Range(3, 0, 3, 2)];
});
- it("returns csv for the provided ranges", function () {
+ it('returns csv for the provided ranges', function () {
var csvResult = rangeBoundaryNavigator.rangesToCsv(data, columnDefinitions, ranges);
- expect(csvResult).toEqual("1,'leopard','12'\n4,'tiger','10'");
+ expect(csvResult).toEqual('1,\'leopard\',\'12\'\n4,\'tiger\',\'10\'');
});
- describe("when there is an extra column with checkboxes", function () {
+ describe('when there is an extra column with checkboxes', function () {
beforeEach(function () {
columnDefinitions = [{name: 'not-a-data-column'}, {name: 'id', pos: 0}, {name: 'animal', pos: 1}, {
name: 'size',
- pos: 2
+ pos: 2,
}];
ranges = [new Slick.Range(0, 0, 0, 3), new Slick.Range(3, 0, 3, 3)];
});
- it("returns csv for the columns with data", function () {
+ it('returns csv for the columns with data', function () {
var csvResult = rangeBoundaryNavigator.rangesToCsv(data, columnDefinitions, ranges);
- expect(csvResult).toEqual("1,'leopard','12'\n4,'tiger','10'");
+ expect(csvResult).toEqual('1,\'leopard\',\'12\'\n4,\'tiger\',\'10\'');
});
});
});
diff --git a/web/regression/javascript/selection/row_selector_spec.js b/web/regression/javascript/selection/row_selector_spec.js
index 10697e6a..be741d42 100644
--- a/web/regression/javascript/selection/row_selector_spec.js
+++ b/web/regression/javascript/selection/row_selector_spec.js
@@ -1,174 +1,172 @@
-define(
- ["jquery",
- "underscore",
- "slickgrid/slick.grid",
- "sources/selection/row_selector",
- "slickgrid/slick.rowselectionmodel",
- "slickgrid",
- ],
- function ($, _, SlickGrid, RowSelector, RowSelectionModel, Slick) {
- describe("RowSelector", function () {
- var container, data, columnDefinitions, grid, rowSelectionModel;
+import $ from 'jquery';
+
+import Slick from 'slickgrid';
+import 'slickgrid.grid';
+import RowSelectionModel from 'slickgrid.rowselectionmodel';
+
+import RowSelector from 'sources/selection/row_selector';
+
+describe('RowSelector', function () {
+ var container, data, columnDefinitions, grid, rowSelectionModel;
+
+ beforeEach(function () {
+ container = $('<div></div>');
+ container.height(9999);
+
+ columnDefinitions = [{
+ id: '1',
+ name: 'some-column-name',
+ selectable: true,
+ }, {
+ id: '2',
+ name: 'second column',
+ selectable: true,
+ }];
+
+ var rowSelector = new RowSelector();
+ data = [];
+ for (var i = 0; i < 10; i++) {
+ data.push(['some-value-' + i, 'second value ' + i]);
+ }
+ columnDefinitions = rowSelector.getColumnDefinitionsWithCheckboxes(columnDefinitions);
+ grid = new Slick.Grid(container, data, columnDefinitions);
+
+ rowSelectionModel = new RowSelectionModel();
+ grid.setSelectionModel(rowSelectionModel);
+ grid.registerPlugin(rowSelector);
+ grid.invalidate();
+
+ $('body').append(container);
+ });
+
+ afterEach(function () {
+ $('body').find(container).remove();
+ });
+
+ it('renders an additional column on the left', function () {
+ expect(columnDefinitions.length).toBe(3);
+
+ var leftmostColumn = columnDefinitions[0];
+ expect(leftmostColumn.id).toBe('row-header-column');
+ expect(leftmostColumn.name).toBe('');
+ expect(leftmostColumn.selectable).toBe(false);
+ });
+
+ it('renders a checkbox the leftmost column', function () {
+ expect(container.find('.sr').length).toBe(11);
+ expect(container.find('.sr .sc:first-child input[type="checkbox"]').length).toBe(10);
+ });
+
+ it('preserves the other attributes of column definitions', function () {
+ expect(columnDefinitions[1].id).toBe('1');
+ expect(columnDefinitions[1].selectable).toBe(true);
+ });
+
+ describe('selecting rows', function () {
+ describe('when the user clicks a row header checkbox', function () {
+ it('selects the row', function () {
+ container.find('.sr .sc:first-child input[type="checkbox"]')[0].click();
+
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+ expectOnlyTheFirstRowToBeSelected(selectedRanges);
+ });
- beforeEach(function () {
- container = $("<div></div>");
- container.height(9999);
-
- columnDefinitions = [{
- id: '1',
- name: 'some-column-name',
- selectable: true
- }, {
- id: '2',
- name: 'second column',
- selectable: true
- }];
-
- var rowSelector = new RowSelector();
- data = [];
- for (var i = 0; i < 10; i++) {
- data.push(['some-value-' + i, 'second value ' + i]);
- }
- columnDefinitions = rowSelector.getColumnDefinitionsWithCheckboxes(columnDefinitions);
- grid = new SlickGrid(container, data, columnDefinitions);
-
- rowSelectionModel = new RowSelectionModel();
- grid.setSelectionModel(rowSelectionModel);
- grid.registerPlugin(rowSelector);
- grid.invalidate();
-
- $("body").append(container);
+ it('checks the checkbox', function () {
+ container.find('.sr .sc:first-child input[type="checkbox"]')[5].click();
+
+ expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[5])
+ .is(':checked')).toBeTruthy();
+ });
+ });
+
+ describe('when the user clicks a row header', function () {
+ it('selects the row', function () {
+ container.find('.sr .sc:first-child')[0].click();
+
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+ expectOnlyTheFirstRowToBeSelected(selectedRanges);
});
- afterEach(function () {
- $("body").find(container).remove();
+ it('checks the checkbox', function () {
+ container.find('.sr .sc:first-child')[7].click();
+
+ expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[7])
+ .is(':checked')).toBeTruthy();
});
+ });
+
+ describe('when the user clicks multiple row headers', function () {
+ it('selects another row', function () {
+ container.find('.sr .sc:first-child')[4].click();
+ container.find('.sr .sc:first-child')[0].click();
- it("renders an additional column on the left", function () {
- expect(columnDefinitions.length).toBe(3);
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+ expect(selectedRanges.length).toEqual(2);
+
+ var row1 = selectedRanges[0];
+ expect(row1.fromRow).toBe(4);
+ expect(row1.toRow).toBe(4);
+
+ var row2 = selectedRanges[1];
+ expect(row2.fromRow).toBe(0);
+ expect(row2.toRow).toBe(0);
+ });
+ });
- var leftmostColumn = columnDefinitions[0];
- expect(leftmostColumn.id).toBe('row-header-column');
- expect(leftmostColumn.name).toBe('');
- expect(leftmostColumn.selectable).toBe(false);
+ describe('when a column was already selected', function () {
+ beforeEach(function () {
+ var selectedRanges = [new Slick.Range(0, 0, 0, 1)];
+ rowSelectionModel.setSelectedRanges(selectedRanges);
});
- it("renders a checkbox the leftmost column", function () {
- expect(container.find('.sr').length).toBe(11);
- expect(container.find('.sr .sc:first-child input[type="checkbox"]').length).toBe(10);
+ it('deselects the column', function () {
+ container.find('.sr .sc:first-child')[0].click();
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+
+ expectOnlyTheFirstRowToBeSelected(selectedRanges);
});
+ });
- it("preserves the other attributes of column definitions", function () {
- expect(columnDefinitions[1].id).toBe('1');
- expect(columnDefinitions[1].selectable).toBe(true);
+ describe('when the row is deselected through setSelectedRanges', function () {
+ beforeEach(function () {
+ container.find('.sr .sc:first-child')[4].click();
});
- describe("selecting rows", function () {
- describe("when the user clicks a row header checkbox", function () {
- it("selects the row", function () {
- container.find('.sr .sc:first-child input[type="checkbox"]')[0].click();
-
- var selectedRanges = rowSelectionModel.getSelectedRanges();
- expectOnlyTheFirstRowToBeSelected(selectedRanges);
- });
-
- it("checks the checkbox", function () {
- container.find('.sr .sc:first-child input[type="checkbox"]')[5].click();
-
- expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[5])
- .is(':checked')).toBeTruthy();
- });
- });
-
- describe("when the user clicks a row header", function () {
- it("selects the row", function () {
- container.find('.sr .sc:first-child')[0].click();
-
- var selectedRanges = rowSelectionModel.getSelectedRanges();
- expectOnlyTheFirstRowToBeSelected(selectedRanges);
- });
-
- it("checks the checkbox", function () {
- container.find('.sr .sc:first-child')[7].click();
-
- expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[7])
- .is(':checked')).toBeTruthy();
- });
- });
-
- describe("when the user clicks multiple row headers", function () {
- it("selects another row", function () {
- container.find('.sr .sc:first-child')[4].click();
- container.find('.sr .sc:first-child')[0].click();
-
- var selectedRanges = rowSelectionModel.getSelectedRanges();
- expect(selectedRanges.length).toEqual(2);
-
- var row1 = selectedRanges[0];
- expect(row1.fromRow).toBe(4);
- expect(row1.toRow).toBe(4);
-
- var row2 = selectedRanges[1];
- expect(row2.fromRow).toBe(0);
- expect(row2.toRow).toBe(0);
- });
- });
-
- describe("when a column was already selected", function () {
- beforeEach(function () {
- var selectedRanges = [new Slick.Range(0, 0, 0, 1)];
- rowSelectionModel.setSelectedRanges(selectedRanges);
- });
-
- it("deselects the column", function () {
- container.find('.sr .sc:first-child')[0].click();
- var selectedRanges = rowSelectionModel.getSelectedRanges();
-
- expectOnlyTheFirstRowToBeSelected(selectedRanges);
- })
- });
-
- describe("when the row is deselected through setSelectedRanges", function () {
- beforeEach(function () {
- container.find('.sr .sc:first-child')[4].click();
- });
-
- it("should uncheck the checkbox", function () {
- rowSelectionModel.setSelectedRanges([]);
-
- expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[4])
- .is(':checked')).toBeFalsy();
- });
- });
-
- describe("click a second time", function () {
- beforeEach(function () {
- container.find('.sr .sc:first-child')[1].click();
- });
-
- it("unchecks checkbox", function () {
- container.find('.sr .sc:first-child')[1].click();
- expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[1])
- .is(':checked')).toBeFalsy();
- });
-
- it("unselects the row", function () {
- container.find('.sr .sc:first-child')[1].click();
- var selectedRanges = rowSelectionModel.getSelectedRanges();
-
- expect(selectedRanges.length).toEqual(0);
- })
- });
+ it('should uncheck the checkbox', function () {
+ rowSelectionModel.setSelectedRanges([]);
+
+ expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[4])
+ .is(':checked')).toBeFalsy();
});
});
- function expectOnlyTheFirstRowToBeSelected(selectedRanges) {
- var row = selectedRanges[0];
+ describe('click a second time', function () {
+ beforeEach(function () {
+ container.find('.sr .sc:first-child')[1].click();
+ });
+
+ it('unchecks checkbox', function () {
+ container.find('.sr .sc:first-child')[1].click();
+ expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[1])
+ .is(':checked')).toBeFalsy();
+ });
- expect(selectedRanges.length).toEqual(1);
- expect(row.fromCell).toBe(1);
- expect(row.toCell).toBe(2);
- expect(row.fromRow).toBe(0);
- expect(row.toRow).toBe(0);
- }
- });
\ No newline at end of file
+ it('unselects the row', function () {
+ container.find('.sr .sc:first-child')[1].click();
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+
+ expect(selectedRanges.length).toEqual(0);
+ });
+ });
+ });
+});
+
+function expectOnlyTheFirstRowToBeSelected(selectedRanges) {
+ var row = selectedRanges[0];
+
+ expect(selectedRanges.length).toEqual(1);
+ expect(row.fromCell).toBe(1);
+ expect(row.toCell).toBe(2);
+ expect(row.fromRow).toBe(0);
+ expect(row.toRow).toBe(0);
+}
\ No newline at end of file
diff --git a/web/regression/javascript/size_prettify_spec.js b/web/regression/javascript/size_prettify_spec.js
index 7d370fcb..f60c79c0 100644
--- a/web/regression/javascript/size_prettify_spec.js
+++ b/web/regression/javascript/size_prettify_spec.js
@@ -7,59 +7,59 @@
//
//////////////////////////////////////////////////////////////////////////
-define(["sources/size_prettify"], function (sizePrettify) {
- describe("sizePrettify", function () {
- describe("when size is 0", function () {
- it("returns 0 bytes", function () {
- expect(sizePrettify(0)).toEqual("0 bytes");
+define(['sources/size_prettify'], function (sizePrettify) {
+ describe('sizePrettify', function () {
+ describe('when size is 0', function () {
+ it('returns 0 bytes', function () {
+ expect(sizePrettify(0)).toEqual('0 bytes');
});
});
- describe("when size >= 10kB and size < 10 MB", function () {
- it("returns size in kB", function () {
- expect(sizePrettify(10240)).toEqual("10 kB");
+ describe('when size >= 10kB and size < 10 MB', function () {
+ it('returns size in kB', function () {
+ expect(sizePrettify(10240)).toEqual('10 kB');
});
- it("returns size in kB", function () {
- expect(sizePrettify(99999)).toEqual("98 kB");
+ it('returns size in kB', function () {
+ expect(sizePrettify(99999)).toEqual('98 kB');
});
});
- describe("when size >= 10MB and size < 10 GB", function () {
- it("returns size in MB", function () {
- expect(sizePrettify(10485760)).toEqual("10 MB");
+ describe('when size >= 10MB and size < 10 GB', function () {
+ it('returns size in MB', function () {
+ expect(sizePrettify(10485760)).toEqual('10 MB');
});
- it("returns size in MB", function () {
- expect(sizePrettify(44040192)).toEqual("42 MB");
+ it('returns size in MB', function () {
+ expect(sizePrettify(44040192)).toEqual('42 MB');
});
});
- describe("when size >= 10GB and size < 10 TB", function () {
- it("returns size in GB", function () {
- expect(sizePrettify(10737418240)).toEqual("10 GB");
+ describe('when size >= 10GB and size < 10 TB', function () {
+ it('returns size in GB', function () {
+ expect(sizePrettify(10737418240)).toEqual('10 GB');
});
- it("returns size in GB", function () {
- expect(sizePrettify(10736344498176)).toEqual("9999 GB");
+ it('returns size in GB', function () {
+ expect(sizePrettify(10736344498176)).toEqual('9999 GB');
});
});
- describe("when size >= 10TB and size < 10 PB", function () {
- it("returns size in TB", function () {
- expect(sizePrettify(10995116277760)).toEqual("10 TB");
+ describe('when size >= 10TB and size < 10 PB', function () {
+ it('returns size in TB', function () {
+ expect(sizePrettify(10995116277760)).toEqual('10 TB');
});
- it("returns size in TB", function () {
- expect(sizePrettify(29995116277760)).toEqual("27 TB");
+ it('returns size in TB', function () {
+ expect(sizePrettify(29995116277760)).toEqual('27 TB');
});
});
- describe("when size >= 10 PB", function () {
- it("returns size in PB", function () {
- expect(sizePrettify(11258999068426200)).toEqual("10 PB");
+ describe('when size >= 10 PB', function () {
+ it('returns size in PB', function () {
+ expect(sizePrettify(11258999068426200)).toEqual('10 PB');
});
});
diff --git a/web/regression/javascript/test-main.js b/web/regression/javascript/test-main.js
deleted file mode 100644
index fe28a5f8..00000000
--- a/web/regression/javascript/test-main.js
+++ /dev/null
@@ -1,125 +0,0 @@
-//////////////////////////////////////////////////////////////////////////
-//
-// pgAdmin 4 - PostgreSQL Tools
-//
-// Copyright (C) 2013 - 2017, The pgAdmin Development Team
-// This software is released under the PostgreSQL Licence
-//
-//////////////////////////////////////////////////////////////////////////
-
-var allTestFiles = [];
-var TEST_REGEXP = /(spec|test)\.js$/i;
-
-// Get a list of all the test files to include
-Object.keys(window.__karma__.files).forEach(function (file) {
- if (TEST_REGEXP.test(file)) {
- // Normalize paths to RequireJS module names.
- // If you require sub-dependencies of test files to be loaded as-is (requiring file extension)
- // then do not normalize the paths
- var normalizedTestModule = file.replace(/^\/base\/|\.js$/g, '');
- allTestFiles.push(normalizedTestModule)
- }
-});
-
-var sourcesDir = '/base/pgadmin/static/';
-require.config({
- // Karma serves files under /base, which is the basePath from your config file
- baseUrl: '/base',
-
- paths: {
- 'alertify': sourcesDir + 'vendor/alertifyjs/alertify',
- 'jquery': sourcesDir + 'vendor/jquery/jquery-1.11.2',
- 'jquery.ui': sourcesDir + 'vendor/jquery-ui/jquery-ui-1.11.3',
- 'jquery.event.drag': sourcesDir + 'vendor/jquery-ui/jquery.event.drag-2.2',
- 'underscore': sourcesDir + 'vendor/underscore/underscore',
- 'underscore.string': sourcesDir + 'vendor/underscore/underscore.string',
- 'slickgrid': sourcesDir + 'vendor/slickgrid/slick.core',
- 'slickgrid/slick.grid': sourcesDir + 'vendor/slickgrid/slick.grid',
- 'slickgrid/slick.rowselectionmodel': sourcesDir + 'vendor/slickgrid/plugins/slick.rowselectionmodel',
- 'translations': '/base/regression/javascript/fake_translations',
- 'sources': sourcesDir + 'js'
- },
-
- shim: {
- 'underscore': {
- exports: '_'
- },
- "slickgrid": {
- "deps": [
- 'jquery', "jquery.ui", "jquery.event.drag"
- ],
- "exports": 'window.Slick'
- },
- "slickgrid/slick.grid": {
- "deps": [
- 'jquery', "jquery.ui", "jquery.event.drag", "slickgrid"
- ],
- "exports": 'window.Slick.Grid'
- },
- "slickgrid/slick.rowselectionmodel": {
- "deps": [
- "jquery"
- ],
- "exports": 'window.Slick.RowSelectionModel'
- },
- "backbone": {
- "deps": ['underscore', 'jquery'],
- "exports": 'Backbone'
- },
- "backbone.paginator": {
- "deps": ['underscore', 'jquery', 'backbone']
- },
- "bootstrap": {
- "deps": ['jquery'],
- },
- "backgrid": {
- "deps": ['backform'],
- "exports": 'Backgrid',
- },
- "backgrid.select.all": {
- "deps": ['backgrid']
- },
- "backgrid.paginator": {
- "deps": ['backgrid', 'backbone.paginator']
- },
- "backgrid.filter": {
- "deps": ['backgrid']
- },
- "backgrid.sizeable.columns": {
- "deps": ['backgrid']
- },
- "bootstrap.switch": {
- "deps": ['jquery', 'bootstrap'],
- "exports": 'jQuery.fn.bootstrapSwitch'
- },
- "select2": {
- "deps": ['jquery'],
- "exports": 'jQuery.fn.select2'
- },
- "bootstrap.datepicker": {
- "deps": ['jquery', 'bootstrap'],
- "exports": 'jQuery.fn.datepicker'
- },
- "bootstrap.datetimepicker": {
- "deps": ['jquery', 'bootstrap', 'moment'],
- "exports": 'jQuery.fn.datetimepicker'
- },
- "pgadmin.backgrid": {
- "deps": ["backgrid", "bootstrap.datetimepicker", "bootstrap.switch"],
- },
- "pgadmin.backform": {
- "deps": ['backform', "pgadmin.backgrid", "select2"],
- },
- "jquery.event.drag": {
- "deps": ['jquery'], "exports": 'jQuery.fn.drag'
- },
- "jquery.ui": {"deps": ['jquery']}
- },
-
- // dynamically load all test files
- deps: allTestFiles,
-
- // we have to kickoff jasmine, as it is asynchronous
- callback: window.__karma__.start
-});
-
diff --git a/web/regression/requirements.txt b/web/regression/requirements.txt
index 6babf987..fd5ed5d9 100644
--- a/web/regression/requirements.txt
+++ b/web/regression/requirements.txt
@@ -4,6 +4,7 @@ testscenarios==0.5.0
testtools==2.0.0
traceback2==1.4.0
unittest2==1.1.0
+mock~=2.0.0
# Leave this at the end because there is a bug where the '--install-option' is applied to all subsequent requirements
chromedriver_installer==0.0.6 --install-option='--chromedriver-version=2.29'
diff --git a/web/webpack.config.js b/web/webpack.config.js
new file mode 100644
index 00000000..91586592
--- /dev/null
+++ b/web/webpack.config.js
@@ -0,0 +1,29 @@
+/* eslint-env node */
+
+module.exports = {
+ context: __dirname + '/pgadmin/static/jsx',
+ entry: './components.jsx',
+ output: {
+ libraryTarget: 'amd',
+ path: __dirname + '/pgadmin/static/js/generated',
+ filename: 'reactComponents.js',
+ },
+
+ module: {
+ rules: [{
+ test: /\.jsx?$/,
+ exclude: /node_modules/,
+ use: {
+ loader: 'babel-loader',
+ options: {
+ presets: ['es2015', 'react'],
+ },
+ },
+ },
+ ],
+ },
+
+ resolve: {
+ extensions: ['.js', '.jsx'],
+ },
+};
\ No newline at end of file
diff --git a/web/webpack.test.config.js b/web/webpack.test.config.js
new file mode 100644
index 00000000..49bef069
--- /dev/null
+++ b/web/webpack.test.config.js
@@ -0,0 +1,65 @@
+/* eslint-env node */
+const path = require('path');
+const webpack = require('webpack');
+
+const sourcesDir = path.resolve(__dirname, 'pgadmin/static');
+const regressionDir = path.resolve(__dirname, 'regression');
+
+module.exports = {
+ plugins: [
+ new webpack.ProvidePlugin({
+ jQuery: 'jquery',
+ _: 'underscore',
+ }),
+ ],
+
+ module: {
+ rules: [
+ {
+ test: /\.jsx?$/,
+ exclude: [/node_modules/, /vendor/],
+ use: {
+ loader: 'babel-loader',
+ options: {
+ presets: ['es2015'],
+ },
+ },
+ },
+ {
+ test: /.*slickgrid\/slick\.(?!core)*/,
+ loader: 'imports-loader?' +
+ 'jquery.ui' +
+ ',jquery.event.drag' +
+ ',slickgrid',
+ }, {
+ test: /.*slickgrid\/plugins\/slick\.rowselectionmodel/,
+ loader: 'imports-loader?' +
+ 'jquery.ui' +
+ ',jquery.event.drag' +
+ ',slickgrid' +
+ '!exports-loader?' +
+ 'Slick.RowSelectionModel',
+ }, {
+ test: /.*slickgrid\/slick\.core.*/,
+ loader: 'imports-loader?' +
+ 'jquery.ui' +
+ ',jquery.event.drag' +
+ '!exports-loader?' +
+ 'Slick',
+ }],
+ },
+
+ resolve: {
+ alias: {
+ 'alertify': sourcesDir + '/vendor/alertifyjs/alertify',
+ 'jquery': sourcesDir + '/vendor/jquery/jquery-1.11.2',
+ 'jquery.ui': sourcesDir + '/vendor/jquery-ui/jquery-ui-1.11.3',
+ 'jquery.event.drag': sourcesDir + '/vendor/jquery-ui/jquery.event.drag-2.2',
+ 'sources': sourcesDir + '/js',
+ 'translations': regressionDir + '/javascript/fake_translations',
+ 'slickgrid': sourcesDir + '/vendor/slickgrid/slick.core',
+ 'slickgrid.grid': sourcesDir + '/vendor/slickgrid/slick.grid',
+ 'slickgrid.rowselectionmodel': sourcesDir + '/vendor/slickgrid/plugins/slick.rowselectionmodel',
+ },
+ },
+};
\ No newline at end of file
diff --git a/web/yarn.lock b/web/yarn.lock
new file mode 100644
index 00000000..47f2e13c
--- /dev/null
+++ b/web/yarn.lock
@@ -0,0 +1,4888 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+JSONStream@^1.0.3:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.1.tgz#707f761e01dae9e16f1bcf93703b78c709665...;
+ dependencies:
+ jsonparse "^1.2.0"
+ through ">=2.2.7 <3"
+
+abbrev@1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f";
+
[email protected]:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca...;
+ dependencies:
+ mime-types "~2.1.11"
+ 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#c752bd210bef67950...;
+ 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#afdf9488fb1ecefc8348f6fb22f464e32a58b36...;
+ dependencies:
+ acorn "^3.0.4"
+
+acorn@^3.0.4:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a";
+
+acorn@^4.0.3, acorn@^4.0.4:
+ version "4.0.11"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0";
+
+acorn@^5.0.1:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d";
+
[email protected]:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f";
+
+ajv-keywords@^1.0.0, ajv-keywords@^1.1.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b8...;
+
+ajv@^4.7.0, ajv@^4.9.1:
+ version "4.11.7"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.7.tgz#8655a5d86d0824985cc471a1d913fb6729a0ec48";
+ dependencies:
+ co "^4.6.0"
+ json-stable-stringify "^1.0.1"
+
+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#0cd90a561093f35d0a99256c22b7069433fad...;
+ dependencies:
+ kind-of "^3.0.2"
+ longest "^1.0.1"
+ repeat-string "^1.5.2"
+
+amdefine@>=0.0.4:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5&...;
+
+ansi-escapes@^1.1.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911...;
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d65...;
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c...;
+
+anymatch@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507&...;
+ dependencies:
+ arrify "^1.0.0"
+ micromatch "^2.1.5"
+
+aproba@^1.0.3:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab";
+
+are-we-there-yet@~1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373...;
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+argparse@^1.0.2:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86&...;
+ dependencies:
+ sprintf-js "~1.0.2"
+
+arr-diff@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf&...;
+ dependencies:
+ arr-flatten "^1.0.1"
+
+arr-flatten@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51...;
+
+array-filter@~0.0.0:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67ca...;
+
+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#df010aa1287e164bbda6f9723...;
+
+array-map@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa66...;
+
+array-reduce@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278...;
+
+array-slice@^0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86...;
+
+array-union@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f2477...;
+ 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#af6ac877a25cc7f74e058894753858dfdb24f...;
+
+array-unique@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c5...;
+
+array.prototype.find@^2.0.1:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.4.tgz#556a5c5362c086483...;
+ dependencies:
+ define-properties "^1.1.2"
+ es-abstract "^1.7.0"
+
[email protected]:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a27...;
+
+arrify@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d";
+
+asap@~2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f";
+
+asn1.js@^4.0.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40...;
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+asn1@~0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86";
+
[email protected], assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4...;
+
+assert-plus@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101...;
+
+assert@^1.1.1, assert@^1.4.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91";
+ dependencies:
+ util "0.10.3"
+
+astw@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/astw/-/astw-2.2.0.tgz#7bd41784d32493987aeb239b6b4e1c57a873b917";
+ dependencies:
+ acorn "^4.0.3"
+
+async-each@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d336...;
+
+async@^1.5.0, async@~1.5.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a";
+
+async@^2.1.2:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.3.0.tgz#1013d1051047dd320fe24e494d5c66ecaf6147d9";
+ dependencies:
+ lodash "^4.14.0"
+
+async@~0.9.0:
+ version "0.9.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d";
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79&...;
+
+aws-sign2@~0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794...;
+
+aws4@^1.2.1:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e";
+
+axios@^0.16.1:
+ version "0.16.1"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.16.1.tgz#c0b6d26600842384b8f509e57111f0d2df8223ca";
+ dependencies:
+ follow-redirects "^1.2.3"
+
+babel-code-frame@^6.16.0, babel-code-frame@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574...;
+ dependencies:
+ chalk "^1.1.0"
+ esutils "^2.0.2"
+ js-tokens "^3.0.0"
+
+babel-core@^6.0.0, babel-core@^6.0.14, babel-core@^6.24.1, babel-core@~6.24.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5...;
+ dependencies:
+ babel-code-frame "^6.22.0"
+ babel-generator "^6.24.1"
+ babel-helpers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-register "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+ babylon "^6.11.0"
+ convert-source-map "^1.1.0"
+ debug "^2.1.1"
+ json5 "^0.5.0"
+ lodash "^4.2.0"
+ minimatch "^3.0.2"
+ path-is-absolute "^1.0.0"
+ private "^0.1.6"
+ slash "^1.0.0"
+ source-map "^0.5.0"
+
+babel-generator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944...;
+ dependencies:
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ detect-indent "^4.0.0"
+ jsesc "^1.3.0"
+ lodash "^4.2.0"
+ source-map "^0.5.0"
+ trim-right "^1.0.1"
+
+babel-helper-builder-react-jsx@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.24.1....;
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ esutils "^2.0.0"
+
+babel-helper-call-delegate@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6...;
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-define-map@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258...;
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ lodash "^4.2.0"
+
+babel-helper-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d347...;
+ dependencies:
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-get-function-arity@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24....;
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#...;
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expr...;
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d886...;
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ lodash "^4.2.0"
+
+babel-helper-replace-supers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf...;
+ dependencies:
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helpers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26...;
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-loader@~6.4.1:
+ version "6.4.1"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.4.1.tgz#0b34112d5b0748a8dcdbf51acf6f9bd42...;
+ dependencies:
+ find-cache-dir "^0.1.1"
+ loader-utils "^0.2.16"
+ mkdirp "^0.5.1"
+ object-assign "^4.0.1"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5e...;
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0, babel-plugin-check-es2015-constants@^6.3.13:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constan...;
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-syntax-flow@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a...;
+
+babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e...;
+
+babel-plugin-transform-es2015-arrow-functions@^6.22.0, babel-plugin-transform-es2015-arrow-functions@^6.3.13:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-...;
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0, babel-plugin-transform-es2015-block-scoped-functions@^6.3.13:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-tra...;
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.24.1, babel-plugin-transform-es2015-block-scoping@^6.9.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es...;
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+ lodash "^4.2.0"
+
+babel-plugin-transform-es2015-classes@^6.24.1, babel-plugin-transform-es2015-classes@^6.9.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-c...;
+ dependencies:
+ babel-helper-define-map "^6.24.1"
+ babel-helper-function-name "^6.24.1"
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-helper-replace-supers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-computed-properties@^6.24.1, babel-plugin-transform-es2015-computed-properties@^6.3.13:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transf...;
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.22.0, babel-plugin-transform-es2015-destructuring@^6.9.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es...;
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.24.1, babel-plugin-transform-es2015-duplicate-keys@^6.6.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-e...;
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.22.0, babel-plugin-transform-es2015-for-of@^6.6.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-fo...;
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.24.1, babel-plugin-transform-es2015-function-name@^6.9.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es...;
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0, babel-plugin-transform-es2015-literals@^6.3.13:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-...;
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es20...;
+ dependencies:
+ babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-commonjs@^6.24.1, babel-plugin-transform-es2015-modules-commonjs@^6.6.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform...;
+ dependencies:
+ babel-plugin-transform-strict-mode "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-modules-systemjs@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform...;
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es20...;
+ dependencies:
+ babel-plugin-transform-es2015-modules-amd "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-object-super@^6.24.1, babel-plugin-transform-es2015-object-super@^6.3.13:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2...;
+ dependencies:
+ babel-helper-replace-supers "^6.24.1"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.24.1, babel-plugin-transform-es2015-parameters@^6.9.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es201...;
+ dependencies:
+ babel-helper-call-delegate "^6.24.1"
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-shorthand-properties@^6.24.1, babel-plugin-transform-es2015-shorthand-properties@^6.3.13:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-trans...;
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0, babel-plugin-transform-es2015-spread@^6.3.13:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-sp...;
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.24.1, babel-plugin-transform-es2015-sticky-regex@^6.3.13:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2...;
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0, babel-plugin-transform-es2015-template-literals@^6.6.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transfor...;
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.22.0, babel-plugin-transform-es2015-typeof-symbol@^6.6.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es...;
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.24.1, babel-plugin-transform-es2015-unicode-regex@^6.3.13:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es...;
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ regexpu-core "^2.0.0"
+
+babel-plugin-transform-flow-strip-types@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-s...;
+ dependencies:
+ babel-plugin-syntax-flow "^6.18.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-display-name@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-reac...;
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx-self@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-js...;
+ dependencies:
+ babel-plugin-syntax-jsx "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx-source@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-...;
+ dependencies:
+ babel-plugin-syntax-jsx "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.2...;
+ dependencies:
+ babel-helper-builder-react-jsx "^6.24.1"
+ babel-plugin-syntax-jsx "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-regenerator@^6.24.1, babel-plugin-transform-regenerator@^6.9.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator...;
+ dependencies:
+ regenerator-transform "0.9.11"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode...;
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-polyfill@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177...;
+ dependencies:
+ babel-runtime "^6.22.0"
+ core-js "^2.4.0"
+ regenerator-runtime "^0.10.0"
+
+babel-preset-es2015-without-strict@~0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/babel-preset-es2015-without-strict/-/babel-preset-es2015-without-strict...;
+ dependencies:
+ babel-plugin-check-es2015-constants "^6.3.13"
+ babel-plugin-transform-es2015-arrow-functions "^6.3.13"
+ babel-plugin-transform-es2015-block-scoped-functions "^6.3.13"
+ babel-plugin-transform-es2015-block-scoping "^6.9.0"
+ babel-plugin-transform-es2015-classes "^6.9.0"
+ babel-plugin-transform-es2015-computed-properties "^6.3.13"
+ babel-plugin-transform-es2015-destructuring "^6.9.0"
+ babel-plugin-transform-es2015-duplicate-keys "^6.6.0"
+ babel-plugin-transform-es2015-for-of "^6.6.0"
+ babel-plugin-transform-es2015-function-name "^6.9.0"
+ babel-plugin-transform-es2015-literals "^6.3.13"
+ babel-plugin-transform-es2015-modules-commonjs "^6.6.0"
+ babel-plugin-transform-es2015-object-super "^6.3.13"
+ babel-plugin-transform-es2015-parameters "^6.9.0"
+ babel-plugin-transform-es2015-shorthand-properties "^6.3.13"
+ babel-plugin-transform-es2015-spread "^6.3.13"
+ babel-plugin-transform-es2015-sticky-regex "^6.3.13"
+ babel-plugin-transform-es2015-template-literals "^6.6.0"
+ babel-plugin-transform-es2015-typeof-symbol "^6.6.0"
+ babel-plugin-transform-es2015-unicode-regex "^6.3.13"
+ babel-plugin-transform-regenerator "^6.9.0"
+
+babel-preset-es2015@~6.24.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea7...;
+ dependencies:
+ babel-plugin-check-es2015-constants "^6.22.0"
+ babel-plugin-transform-es2015-arrow-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoping "^6.24.1"
+ babel-plugin-transform-es2015-classes "^6.24.1"
+ babel-plugin-transform-es2015-computed-properties "^6.24.1"
+ babel-plugin-transform-es2015-destructuring "^6.22.0"
+ babel-plugin-transform-es2015-duplicate-keys "^6.24.1"
+ babel-plugin-transform-es2015-for-of "^6.22.0"
+ babel-plugin-transform-es2015-function-name "^6.24.1"
+ babel-plugin-transform-es2015-literals "^6.22.0"
+ babel-plugin-transform-es2015-modules-amd "^6.24.1"
+ babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+ babel-plugin-transform-es2015-modules-systemjs "^6.24.1"
+ babel-plugin-transform-es2015-modules-umd "^6.24.1"
+ babel-plugin-transform-es2015-object-super "^6.24.1"
+ babel-plugin-transform-es2015-parameters "^6.24.1"
+ babel-plugin-transform-es2015-shorthand-properties "^6.24.1"
+ babel-plugin-transform-es2015-spread "^6.22.0"
+ babel-plugin-transform-es2015-sticky-regex "^6.24.1"
+ babel-plugin-transform-es2015-template-literals "^6.22.0"
+ babel-plugin-transform-es2015-typeof-symbol "^6.22.0"
+ babel-plugin-transform-es2015-unicode-regex "^6.24.1"
+ babel-plugin-transform-regenerator "^6.24.1"
+
+babel-preset-flow@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be...;
+ dependencies:
+ babel-plugin-transform-flow-strip-types "^6.22.0"
+
+babel-preset-react@~6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.23.0.tgz#eb7cee4de98a3f94502c...;
+ dependencies:
+ babel-plugin-syntax-jsx "^6.3.13"
+ babel-plugin-transform-react-display-name "^6.23.0"
+ babel-plugin-transform-react-jsx "^6.23.0"
+ babel-plugin-transform-react-jsx-self "^6.22.0"
+ babel-plugin-transform-react-jsx-source "^6.22.0"
+ babel-preset-flow "^6.23.0"
+
+babel-register@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba...;
+ dependencies:
+ babel-core "^6.24.1"
+ babel-runtime "^6.22.0"
+ core-js "^2.4.0"
+ home-or-tmp "^2.0.0"
+ lodash "^4.2.0"
+ mkdirp "^0.5.1"
+ source-map-support "^0.4.2"
+
+babel-runtime@^6.18.0, babel-runtime@^6.22.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb3...;
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.10.0"
+
+babel-template@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5...;
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+ babylon "^6.11.0"
+ lodash "^4.2.0"
+
+babel-traverse@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338...;
+ dependencies:
+ babel-code-frame "^6.22.0"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ babylon "^6.15.0"
+ debug "^2.2.0"
+ globals "^9.0.0"
+ invariant "^2.2.0"
+ lodash "^4.2.0"
+
+babel-types@^6.19.0, babel-types@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2...;
+ dependencies:
+ babel-runtime "^6.22.0"
+ esutils "^2.0.2"
+ lodash "^4.2.0"
+ to-fast-properties "^1.0.1"
+
+babelify@~7.3.0:
+ version "7.3.0"
+ resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5&...;
+ dependencies:
+ babel-core "^6.0.14"
+ object-assign "^4.0.0"
+
+babylon@^6.11.0, babylon@^6.15.0:
+ version "6.17.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.0.tgz#37da948878488b9c4e3c4038893fa3314b3fc932...;
+
[email protected]:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947";
+
+balanced-match@^0.4.1:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302...;
+
[email protected]:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad...;
+
+base64-js@^1.0.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f...;
+
[email protected]:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6&...;
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c3346...;
+ dependencies:
+ tweetnacl "^0.14.3"
+
+better-assert@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68fa...;
+ dependencies:
+ callsite "1.0.0"
+
+big.js@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978";
+
+binary-extensions@^1.0.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa588...;
+
[email protected]:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921";
+
+block-stream@*:
+ version "0.0.9"
+ resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b33...;
+ dependencies:
+ inherits "~2.0.0"
+
+bluebird@^3.3.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c&...;
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215";
+
+body-parser@^1.16.1:
+ version "1.17.1"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.1.tgz#75b3bc98ddd6e7e0d8ffe750dfaca5c669...;
+ dependencies:
+ bytes "2.4.0"
+ content-type "~1.0.2"
+ debug "2.6.1"
+ depd "~1.1.0"
+ http-errors "~1.6.1"
+ iconv-lite "0.4.15"
+ on-finished "~2.3.0"
+ qs "6.4.0"
+ raw-body "~2.2.0"
+ type-is "~1.6.14"
+
+body-parser@~1.14.0:
+ version "1.14.2"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.14.2.tgz#1015cb1fe2c443858259581db53332f8d0...;
+ dependencies:
+ bytes "2.2.0"
+ content-type "~1.0.1"
+ debug "~2.2.0"
+ depd "~1.1.0"
+ http-errors "~1.3.1"
+ iconv-lite "0.4.13"
+ on-finished "~2.3.0"
+ qs "5.2.0"
+ raw-body "~2.1.5"
+ type-is "~1.6.10"
+
+boolbase@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e&...;
+
[email protected]:
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f";
+ dependencies:
+ hoek "2.x.x"
+
+brace-expansion@^1.0.0:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80...;
+ dependencies:
+ balanced-match "^0.4.1"
+ concat-map "0.0.1"
+
+braces@^0.1.2:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6";
+ dependencies:
+ expand-range "^0.1.0"
+
+braces@^1.8.2:
+ version "1.8.5"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7";
+ dependencies:
+ expand-range "^1.8.1"
+ preserve "^0.2.0"
+ repeat-element "^1.1.2"
+
+brorand@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f...;
+
+browser-pack@^6.0.1:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.0.2.tgz#f86cd6cef4f5300c8e63e07a4d512f65f...;
+ dependencies:
+ JSONStream "^1.0.3"
+ combine-source-map "~0.7.1"
+ defined "^1.0.0"
+ through2 "^2.0.0"
+ umd "^3.0.0"
+
+browser-resolve@^1.11.0, browser-resolve@^1.7.0:
+ version "1.11.2"
+ resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b...;
+ dependencies:
+ resolve "1.1.7"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567...;
+ dependencies:
+ buffer-xor "^1.0.2"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.0"
+ inherits "^2.0.1"
+
+browserify-cipher@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95...;
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a...;
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+
+browserify-rsa@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a...;
+ 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#aa4eb68e5d7b658baa6bf6a57e6...;
+ 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.1.4, browserify-zlib@~0.1.2:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241...;
+ dependencies:
+ pako "~0.2.0"
+
+browserify@^14.0.0, browserify@~14.1.0:
+ version "14.1.0"
+ resolved "https://registry.yarnpkg.com/browserify/-/browserify-14.1.0.tgz#0508cc1e7bf4c152312c2fa523e676c0b0b9...;
+ dependencies:
+ JSONStream "^1.0.3"
+ assert "^1.4.0"
+ browser-pack "^6.0.1"
+ browser-resolve "^1.11.0"
+ browserify-zlib "~0.1.2"
+ buffer "^5.0.2"
+ cached-path-relative "^1.0.0"
+ concat-stream "~1.5.1"
+ console-browserify "^1.1.0"
+ constants-browserify "~1.0.0"
+ crypto-browserify "^3.0.0"
+ defined "^1.0.0"
+ deps-sort "^2.0.0"
+ domain-browser "~1.1.0"
+ duplexer2 "~0.1.2"
+ events "~1.1.0"
+ glob "^7.1.0"
+ has "^1.0.0"
+ htmlescape "^1.1.0"
+ https-browserify "~0.0.0"
+ inherits "~2.0.1"
+ insert-module-globals "^7.0.0"
+ labeled-stream-splicer "^2.0.0"
+ module-deps "^4.0.8"
+ os-browserify "~0.1.1"
+ parents "^1.0.1"
+ path-browserify "~0.0.0"
+ process "~0.11.0"
+ punycode "^1.3.2"
+ querystring-es3 "~0.2.0"
+ read-only-stream "^2.0.0"
+ readable-stream "^2.0.2"
+ resolve "^1.1.4"
+ shasum "^1.0.0"
+ shell-quote "^1.6.1"
+ stream-browserify "^2.0.0"
+ stream-http "^2.0.0"
+ string_decoder "~0.10.0"
+ subarg "^1.0.0"
+ syntax-error "^1.1.1"
+ through2 "^2.0.0"
+ timers-browserify "^1.0.1"
+ tty-browserify "~0.0.0"
+ url "~0.11.0"
+ util "~0.10.1"
+ vm-browserify "~0.0.1"
+ xtend "^4.0.0"
+
+buffer-shims@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef0...;
+
+buffer-xor@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe...;
+
+buffer@^4.3.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298";
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+buffer@^5.0.2:
+ version "5.0.6"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.0.6.tgz#2ea669f7eec0b6eda05b08f8b5ff661b28573588";
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+
+builtin-modules@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94...;
+
+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#85982878e21b98e1c...;
+
[email protected]:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.2.0.tgz#fd35464a403f6f9117c2de3609ecff9cae000588";
+
[email protected]:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339";
+
+cached-path-relative@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.1.tgz#d09c4b52800aa4c07...;
+
+caller-path@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e8257...;
+ dependencies:
+ callsites "^0.2.0"
+
[email protected]:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20&...;
+
+callsites@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350c...;
+
+camelcase-keys@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d93221...;
+ 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#9bb5304d2e0b56698b2c758b08a3eaa9daa58a3...;
+
+camelcase@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1...;
+
+camelcase@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0...;
+
+caseless@~0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7...;
+
+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#aa0d32629b6ee972200411cbd4461c907...;
+ dependencies:
+ align-text "^0.1.3"
+ lazy-cache "^1.0.3"
+
+chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3, chalk@~1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/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"
+
+cheerio@^0.22.0:
+ version "0.22.0"
+ resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e...;
+ dependencies:
+ css-select "~1.2.0"
+ dom-serializer "~0.1.0"
+ entities "~1.1.1"
+ htmlparser2 "^3.9.1"
+ lodash.assignin "^4.0.9"
+ lodash.bind "^4.1.4"
+ lodash.defaults "^4.0.1"
+ lodash.filter "^4.4.0"
+ lodash.flatten "^4.2.0"
+ lodash.foreach "^4.3.0"
+ lodash.map "^4.4.0"
+ lodash.merge "^4.4.0"
+ lodash.pick "^4.2.1"
+ lodash.reduce "^4.4.0"
+ lodash.reject "^4.4.0"
+ lodash.some "^4.4.0"
+
+chokidar@^1.0.0, chokidar@^1.4.1, chokidar@^1.4.3:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2&...;
+ dependencies:
+ anymatch "^1.3.0"
+ async-each "^1.0.0"
+ glob-parent "^2.0.0"
+ inherits "^2.0.1"
+ is-binary-path "^1.0.0"
+ is-glob "^2.0.0"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.0.0"
+ optionalDependencies:
+ fsevents "^1.0.0"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6d...;
+ dependencies:
+ inherits "^2.0.1"
+
+circular-json@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a3...;
+
+cli-cursor@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2...;
+ dependencies:
+ restore-cursor "^1.0.1"
+
+cli-width@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00...;
+
+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"
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184";
+
+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#0d070b4d043a5bea33a2f1a40e2edb3...;
+
+coffee-script@~1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.10.0.tgz#12938bcf9be1948fa006f92e0c4c9e...;
+
+colors@^1.1.0, colors@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63";
+
+combine-lists@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dac...;
+ dependencies:
+ lodash "^4.5.0"
+
+combine-source-map@~0.7.1:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.7.2.tgz#0870312856b307a87cc4a...;
+ dependencies:
+ convert-source-map "~1.1.0"
+ inline-source-map "~0.6.0"
+ lodash.memoize "~3.0.3"
+ source-map "~0.5.3"
+
+combined-stream@^1.0.5, combined-stream@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c...;
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@^2.9.0, commander@~2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d...;
+ 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#ddd800da0c66127393cca5950ea968a3aaf1253...;
+
[email protected]:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3...;
+
[email protected]:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af...;
+
[email protected]:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7...;
+
[email protected]:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae...;
+
[email protected]:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d4...;
+
[email protected]:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.0.tgz#53f7d43c51c5e43f81c8fdd03321c63...;
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "~2.0.0"
+ typedarray "~0.0.5"
+
+concat-stream@^1.4.1, concat-stream@^1.5.2, concat-stream@~1.5.0, concat-stream@~1.5.1:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261...;
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "~2.0.0"
+ typedarray "~0.0.5"
+
+connect@^3.6.0:
+ version "3.6.1"
+ resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.1.tgz#b7760693a74f0454face1d9378edb3f885b43227...;
+ dependencies:
+ debug "2.6.3"
+ finalhandler "1.0.1"
+ parseurl "~1.3.1"
+ utils-merge "1.0.0"
+
+console-browserify@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b2...;
+ dependencies:
+ date-now "^0.1.4"
+
+console-control-strings@^1.0.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#3d7cf4464db...;
+
+constants-browserify@^1.0.0, constants-browserify@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aa...;
+
+content-type@~1.0.1, content-type@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df...;
+
+convert-source-map@^1.1.0, convert-source-map@^1.1.3:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9...;
+
+convert-source-map@~1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3...;
+
[email protected]:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb";
+
+core-js@^1.0.0:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636...;
+
+core-js@^2.2.0, core-js@^2.4.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e...;
+
+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#b5fd54220aa2bc5ab57aab7140c940754...;
+
+create-ecdh@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a3530...;
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.2.tgz#51210062d7bb7479f6c65bb41a92208b1d6...;
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ ripemd160 "^1.0.0"
+ sha.js "^2.3.6"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.4.tgz#d3fb4ba253eb8b3f56e39ea2fbcb8af747b...;
+ dependencies:
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+
[email protected]:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b...;
+ dependencies:
+ boom "2.x.x"
+
+crypto-browserify@^3.0.0, crypto-browserify@^3.11.0:
+ version "3.11.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.0.tgz#3652a0906ab9b2a7e0c3ce...;
+ 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"
+
+css-select@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec...;
+ dependencies:
+ boolbase "~1.0.0"
+ css-what "2.1"
+ domutils "1.5.1"
+ nth-check "~1.0.1"
+
[email protected]:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd&...;
+
+currently-unhandled@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799...;
+ dependencies:
+ array-find-index "^1.0.1"
+
+custom-event@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5...;
+
+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"
+
+date-now@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b&...;
+
+dateformat@~1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbb...;
+ dependencies:
+ get-stdin "^4.0.1"
+ meow "^3.3.0"
+
[email protected]:
+ version "0.7.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39";
+
[email protected], debug@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da";
+ dependencies:
+ ms "0.7.1"
+
[email protected]:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c";
+ dependencies:
+ ms "0.7.2"
+
[email protected]:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351";
+ dependencies:
+ ms "0.7.2"
+
[email protected]:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.3.tgz#0f7eb8c30965ec08c72accfa0130c8b79984141d";
+ dependencies:
+ ms "0.7.2"
+
+debug@^2.1.1, debug@^2.2.0, debug@^2.4.5:
+ version "2.6.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.4.tgz#7586a9b3c39741c0282ae33445c4e8ac74734fe0";
+ dependencies:
+ ms "0.7.3"
+
+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#f6534d15148269b20352e7bee26f501f9a191...;
+
+deep-extend@~0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469...;
+
+deep-is@~0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34...;
+
+define-properties@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb73719...;
+ dependencies:
+ foreach "^2.0.5"
+ object-keys "^1.0.8"
+
+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#df3ae199acadfb7d440aaae0b29e2...;
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9...;
+
[email protected], depd@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3";
+
+deps-sort@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb...;
+ dependencies:
+ JSONStream "^1.0.3"
+ shasum "^1.0.0"
+ subarg "^1.0.0"
+ through2 "^2.0.0"
+
+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"
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a...;
+ dependencies:
+ repeating "^2.0.0"
+
+detective@^4.0.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/detective/-/detective-4.5.0.tgz#6e5a8c6b26e6c7a254b1c6b6d7490d98ec91edd...;
+ dependencies:
+ acorn "^4.0.3"
+ defined "^1.0.0"
+
+di@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c";
+
+diffie-hellman@^5.0.0:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded...;
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+doctrine@^1.2.2:
+ 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.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63&...;
+ dependencies:
+ esutils "^2.0.2"
+ isarray "^1.0.0"
+
+dom-serialize@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59...;
+ dependencies:
+ custom-event "~1.0.0"
+ ent "~2.2.0"
+ extend "^3.0.0"
+ void-elements "^2.0.0"
+
+dom-serializer@0, dom-serializer@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e29...;
+ dependencies:
+ domelementtype "~1.1.1"
+ entities "~1.1.1"
+
+domain-browser@^1.1.1, domain-browser@~1.1.0:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b...;
+
+domelementtype@1, domelementtype@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e...;
+
+domelementtype@~1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299...;
+
+domhandler@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe...;
+ dependencies:
+ domelementtype "1"
+
[email protected], domutils@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf&...;
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc...;
+ dependencies:
+ readable-stream "^2.0.2"
+
+ecc-jsbn@~0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505&...;
+ dependencies:
+ jsbn "~0.1.0"
+
[email protected]:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d&...;
+
+elliptic@^6.0.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df&...;
+ 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#4daa4d9db00f9819880c79fa457ae5b09a1...;
+
+encodeurl@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d2...;
+
+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"
+
[email protected]:
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.3.tgz#1798ed93451246453d4c6f635...;
+ dependencies:
+ component-emitter "1.2.1"
+ component-inherit "0.0.3"
+ debug "2.3.3"
+ engine.io-parser "1.3.2"
+ has-cors "1.1.0"
+ indexof "0.0.1"
+ parsejson "0.0.3"
+ parseqs "0.0.5"
+ parseuri "0.0.5"
+ ws "1.1.2"
+ xmlhttprequest-ssl "1.5.3"
+ yeast "0.1.2"
+
[email protected]:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.2.tgz#937b079f0007d0893ec56d46c...;
+ dependencies:
+ after "0.8.2"
+ arraybuffer.slice "0.0.6"
+ base64-arraybuffer "0.1.5"
+ blob "0.0.4"
+ has-binary "0.1.7"
+ wtf-8 "1.0.0"
+
[email protected]:
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.3.tgz#8de7f97895d20d39b85f88eeee777b2bd42b13d...;
+ dependencies:
+ accepts "1.3.3"
+ base64id "1.0.0"
+ cookie "0.3.1"
+ debug "2.3.3"
+ engine.io-parser "1.3.2"
+ ws "1.1.2"
+
+enhanced-resolve@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.1.0.tgz#9f4b626f577245edcf4b2ad83...;
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.4.0"
+ object-assign "^4.0.1"
+ tapable "^0.2.5"
+
+ent@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d";
+
+entities@^1.1.1, entities@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0&...;
+
+enzyme@~2.8.2:
+ version "2.8.2"
+ resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-2.8.2.tgz#6c8bcb05012abc4aa4bc3213fb23780b9b5b1714";
+ dependencies:
+ cheerio "^0.22.0"
+ function.prototype.name "^1.0.0"
+ is-subset "^0.1.1"
+ lodash "^4.17.2"
+ object-is "^1.0.1"
+ object.assign "^4.0.4"
+ object.entries "^1.0.3"
+ object.values "^1.0.3"
+ prop-types "^15.5.4"
+ uuid "^2.0.3"
+
+errno@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d";
+ dependencies:
+ prr "~0.0.0"
+
+error-ex@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc&...;
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.6.1, es-abstract@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623...;
+ dependencies:
+ es-to-primitive "^1.1.1"
+ function-bind "^1.1.0"
+ is-callable "^1.1.3"
+ is-regex "^1.0.3"
+
+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#45355248a88979034b6792e19bb...;
+ 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.9, es5-ext@~0.10.14:
+ version "0.10.15"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.15.tgz#c330a5934c1ee21284a7c081a86e5fd937c91ea6&...;
+ dependencies:
+ es6-iterator "2"
+ es6-symbol "~3.1"
+
+es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e5...;
+ dependencies:
+ d "1"
+ es5-ext "^0.10.14"
+ es6-symbol "^3.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.0.5"
+ resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.0.5.tgz#7882f30adde5b240ccfa7f7d78c54833095...;
+
+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"
+
[email protected], es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715c...;
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+es6-weak-map@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772...;
+ 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#0258eae4d3d0c0974de1c169188ef0051d1...;
+
+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#1b61c0562190a8dff...;
+
+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-plugin-react@^6.10.3:
+ version "6.10.3"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz#c5435beb06774e12c7...;
+ dependencies:
+ array.prototype.find "^2.0.1"
+ doctrine "^1.2.2"
+ has "^1.0.1"
+ jsx-ast-utils "^1.3.4"
+ object.assign "^4.0.4"
+
+eslint@^3.0.0, eslint@^3.19.0:
+ version "3.19.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc";
+ dependencies:
+ babel-code-frame "^6.16.0"
+ chalk "^1.1.3"
+ concat-stream "^1.5.2"
+ debug "^2.1.1"
+ doctrine "^2.0.0"
+ escope "^3.6.0"
+ espree "^3.4.0"
+ esquery "^1.0.0"
+ estraverse "^4.2.0"
+ esutils "^2.0.2"
+ file-entry-cache "^2.0.0"
+ glob "^7.0.3"
+ globals "^9.14.0"
+ ignore "^3.2.0"
+ imurmurhash "^0.1.4"
+ inquirer "^0.12.0"
+ is-my-json-valid "^2.10.0"
+ is-resolvable "^1.0.0"
+ js-yaml "^3.5.1"
+ json-stable-stringify "^1.0.0"
+ levn "^0.3.0"
+ lodash "^4.0.0"
+ mkdirp "^0.5.0"
+ natural-compare "^1.4.0"
+ optionator "^0.8.2"
+ path-is-inside "^1.0.1"
+ pluralize "^1.2.1"
+ progress "^1.1.8"
+ require-uncached "^1.0.2"
+ shelljs "^0.7.5"
+ strip-bom "^3.0.0"
+ strip-json-comments "~2.0.1"
+ table "^3.7.8"
+ text-table "~0.2.0"
+ user-home "^2.0.0"
+
+espree@^3.4.0:
+ version "3.4.2"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.2.tgz#38dbdedbedc95b8961a1fbf04734a8f6a9c8c592";
+ dependencies:
+ acorn "^5.0.1"
+ 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...;
+
+esquery@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa...;
+ dependencies:
+ estraverse "^4.0.0"
+
+esrecurse@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff64822...;
+ dependencies:
+ estraverse "~4.1.0"
+ object-assign "^4.0.1"
+
+estraverse@^4.0.0, estraverse@^4.1.1, estraverse@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bd...;
+
+estraverse@~4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba4711...;
+
+esutils@^2.0.0, esutils@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b...;
+
+event-emitter@~0.3.5:
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce838406...;
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+eventemitter2@~0.4.13:
+ version "0.4.14"
+ resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583...;
+
[email protected]:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224e...;
+
+events@^1.0.0, events@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924";
+
+evp_bytestokey@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz#497b66ad9fef65cd7c08a6180824b...;
+ dependencies:
+ create-hash "^1.1.1"
+
+exit-hook@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff...;
+
+exit@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c";
+
+expand-braces@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f4...;
+ dependencies:
+ array-slice "^0.2.3"
+ array-unique "^0.2.1"
+ braces "^0.1.2"
+
+expand-brackets@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72...;
+ dependencies:
+ is-posix-bracket "^0.1.0"
+
+expand-range@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4cc...;
+ dependencies:
+ is-number "^0.1.1"
+ repeat-string "^0.2.2"
+
+expand-range@^1.8.1:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644...;
+ dependencies:
+ fill-range "^2.1.0"
+
+exports-loader@~0.6.4:
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/exports-loader/-/exports-loader-0.6.4.tgz#d70fc6121975b35fc12830cf52754...;
+ dependencies:
+ loader-utils "^1.0.2"
+ source-map "0.5.x"
+
+extend@^3.0.0, extend@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4";
+
+extglob@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1...;
+ dependencies:
+ is-extglob "^1.0.0"
+
+extract-zip@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.5.0.tgz#92ccf6d81ef70a9fa4c1747114ccef6d868...;
+ dependencies:
+ concat-stream "1.5.0"
+ debug "0.7.4"
+ mkdirp "0.5.0"
+ yauzl "2.4.1"
+
[email protected]:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd...;
+
+fast-levenshtein@~2.0.4:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e8...;
+
+faye-websocket@~0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edb...;
+ dependencies:
+ websocket-driver ">=0.5.1"
+
+fbjs@^0.8.1, fbjs@^0.8.4, fbjs@^0.8.9:
+ version "0.8.12"
+ resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.12.tgz#10b5d92f76d45575fd63a217d4ea02bea2f8ed04";
+ dependencies:
+ core-js "^1.0.0"
+ isomorphic-fetch "^2.1.1"
+ loose-envify "^1.0.0"
+ object-assign "^4.1.0"
+ promise "^7.1.1"
+ setimmediate "^1.0.5"
+ ua-parser-js "^0.7.9"
+
+fd-slicer@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e6...;
+ dependencies:
+ pend "~1.2.0"
+
+figures@^1.0.1, figures@^1.3.5:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e...;
+ dependencies:
+ escape-string-regexp "^1.0.5"
+ object-assign "^4.1.0"
+
+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#c392990c3e684783d838b8c84...;
+ dependencies:
+ flat-cache "^1.2.1"
+ object-assign "^4.0.1"
+
+filename-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3...;
+
+fill-range@^2.1.0:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a...;
+ dependencies:
+ is-number "^2.1.0"
+ isobject "^2.0.0"
+ randomatic "^1.1.3"
+ repeat-element "^1.1.2"
+ repeat-string "^1.5.2"
+
[email protected]:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.1.tgz#bcd15d1689c0e5ed729b6f7f541a6df98...;
+ dependencies:
+ debug "2.6.3"
+ encodeurl "~1.0.1"
+ escape-html "~1.0.3"
+ on-finished "~2.3.0"
+ parseurl "~1.3.1"
+ statuses "~1.3.1"
+ unpipe "~1.0.0"
+
+find-cache-dir@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c...;
+ dependencies:
+ commondir "^1.0.1"
+ mkdirp "^0.5.1"
+ pkg-dir "^1.0.0"
+
+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"
+
+findup-sync@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4...;
+ dependencies:
+ glob "~5.0.0"
+
+flat-cache@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6...;
+ dependencies:
+ circular-json "^0.3.1"
+ del "^2.0.2"
+ graceful-fs "^4.1.2"
+ write "^0.2.1"
+
+follow-redirects@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.2.3.tgz#01abaeca85e3609837d9fcda3...;
+ dependencies:
+ debug "^2.4.5"
+
+for-in@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80";
+
+for-own@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce...;
+ dependencies:
+ for-in "^1.0.1"
+
+foreach@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99...;
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d...;
+
+form-data@~2.1.1:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d...;
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.5"
+ mime-types "^2.1.12"
+
+fs-extra@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950&...;
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^2.1.0"
+ klaw "^1.0.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb0141199...;
+
+fsevents@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff&...;
+ dependencies:
+ nan "^2.3.0"
+ node-pre-gyp "^0.6.29"
+
+fstream-ignore@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada...;
+ dependencies:
+ fstream "^1.0.0"
+ inherits "2"
+ minimatch "^3.0.0"
+
+fstream@^1.0.0, fstream@^1.0.10, 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.0.2, function-bind@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f752946...;
+
+function.prototype.name@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.0.0.tgz#5f523ca64e4...;
+ dependencies:
+ define-properties "^1.1.2"
+ function-bind "^1.1.0"
+ is-callable "^1.1.2"
+
+gauge@~2.7.1:
+ 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.2"
+ resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105";
+ dependencies:
+ globule "^1.0.0"
+
+generate-function@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e909333...;
+
+generate-object-property@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c403...;
+ dependencies:
+ is-property "^1.0.0"
+
+get-caller-file@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c155...;
+
+get-stdin@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450f...;
+
+getobject@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/getobject/-/getobject-0.1.0.tgz#047a449789fa160d018f5486ed91320b6ec7885...;
+
+getpass@^0.1.1:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6...;
+ dependencies:
+ assert-plus "^1.0.0"
+
+glob-base@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c...;
+ dependencies:
+ glob-parent "^2.0.0"
+ is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6e...;
+ dependencies:
+ is-glob "^2.0.0"
+
+glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.0, glob@^7.1.1, glob@~7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8";
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.2"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@~5.0.0:
+ version "5.0.15"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1";
+ dependencies:
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "2 || 3"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@~7.0.0:
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a";
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.2"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^9.0.0, globals@^9.14.0:
+ version "9.17.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286...;
+
+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.1.0"
+ resolved "https://registry.yarnpkg.com/globule/-/globule-1.1.0.tgz#c49352e4dc183d85893ee825385eb994bb6df45f...;
+ dependencies:
+ glob "~7.1.1"
+ lodash "~4.16.4"
+ minimatch "~3.0.2"
+
+graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a02...;
+
+"graceful-readlink@>= 1.0.0":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f...;
+
+grunt-cli@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.2.0.tgz#562b119ebb069ddb464ace2845501be97b35b6a...;
+ dependencies:
+ findup-sync "~0.3.0"
+ grunt-known-options "~1.1.0"
+ nopt "~3.0.6"
+ resolve "~1.1.0"
+
+grunt-contrib-uglify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/grunt-contrib-uglify/-/grunt-contrib-uglify-3.0.0.tgz#7411fb74ed0f730cf...;
+ dependencies:
+ chalk "^1.0.0"
+ maxmin "^1.1.0"
+ uglify-js "~3.0.4"
+ uri-path "^1.0.0"
+
+grunt-contrib-watch@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/grunt-contrib-watch/-/grunt-contrib-watch-1.0.0.tgz#84a1a7a1d6abd26ed56...;
+ dependencies:
+ async "^1.5.0"
+ gaze "^1.0.0"
+ lodash "^3.10.1"
+ tiny-lr "^0.2.1"
+
+grunt-eslint@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/grunt-eslint/-/grunt-eslint-19.0.0.tgz#bb74c379061599cec1f66169def2a89d...;
+ dependencies:
+ chalk "^1.0.0"
+ eslint "^3.0.0"
+
+grunt-karma@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/grunt-karma/-/grunt-karma-2.0.0.tgz#753583d115dfdc055fe57e58f96d6b3c7e6...;
+ dependencies:
+ lodash "^3.10.1"
+
+grunt-known-options@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-1.1.0.tgz#a4274eeb32fa765da5a...;
+
+grunt-legacy-log-utils@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz#a7b8e2d0fb35b...;
+ dependencies:
+ chalk "~1.1.1"
+ lodash "~4.3.0"
+
+grunt-legacy-log@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/grunt-legacy-log/-/grunt-legacy-log-1.0.0.tgz#fb86f1809847bc07dc47843f9...;
+ dependencies:
+ colors "~1.1.2"
+ grunt-legacy-log-utils "~1.0.0"
+ hooker "~0.2.3"
+ lodash "~3.10.1"
+ underscore.string "~3.2.3"
+
+grunt-legacy-util@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz#386aa78dc6ed50986c2b189...;
+ dependencies:
+ async "~1.5.2"
+ exit "~0.1.1"
+ getobject "~0.1.0"
+ hooker "~0.2.3"
+ lodash "~4.3.0"
+ underscore.string "~3.2.3"
+ which "~1.2.1"
+
+grunt-webpack@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/grunt-webpack/-/grunt-webpack-2.0.1.tgz#84c5d9373ade88468285de787021c42...;
+ dependencies:
+ lodash "^4.7.0"
+
+grunt@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/grunt/-/grunt-1.0.1.tgz#e8778764e944b18f32bb0f10b9078475c9dfb56b";
+ dependencies:
+ coffee-script "~1.10.0"
+ dateformat "~1.0.12"
+ eventemitter2 "~0.4.13"
+ exit "~0.1.1"
+ findup-sync "~0.3.0"
+ glob "~7.0.0"
+ grunt-cli "~1.2.0"
+ grunt-known-options "~1.1.0"
+ grunt-legacy-log "~1.0.0"
+ grunt-legacy-util "~1.0.0"
+ iconv-lite "~0.4.13"
+ js-yaml "~3.5.2"
+ minimatch "~3.0.0"
+ nopt "~3.0.6"
+ path-is-absolute "~1.0.0"
+ rimraf "~2.2.8"
+
+gzip-size@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-1.0.0.tgz#66cf8b101047227b95bace6ea1da0c177ed5c22...;
+ dependencies:
+ browserify-zlib "^0.1.4"
+ concat-stream "^1.4.1"
+
+har-schema@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c01513...;
+
+har-validator@~2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70e...;
+ dependencies:
+ chalk "^1.1.1"
+ commander "^2.9.0"
+ is-my-json-valid "^2.12.4"
+ pinkie-promise "^2.0.0"
+
+har-validator@~4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5...;
+ dependencies:
+ ajv "^4.9.1"
+ har-schema "^1.0.5"
+
+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"
+
[email protected]:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e...;
+ dependencies:
+ isarray "0.0.1"
+
[email protected]:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39&...;
+
+has-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa&...;
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de...;
+
+has@^1.0.0, has@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28";
+ dependencies:
+ function-bind "^1.0.2"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.0.3.tgz#1332ff00156c0a0ffdd8236013d07b77a0451573...;
+ dependencies:
+ inherits "^2.0.1"
+
+hasha@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1";
+ dependencies:
+ is-stream "^1.0.1"
+ pinkie-promise "^2.0.0"
+
+hat@^0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/hat/-/hat-0.0.3.tgz#bb014a9e64b3788aed8005917413d4ff3d502d8a";
+
+hawk@~3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4";
+ dependencies:
+ boom "2.x.x"
+ cryptiles "2.x.x"
+ hoek "2.x.x"
+ sntp "1.x.x"
+
+hmac-drbg@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a...;
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
[email protected]:
+ version "2.16.3"
+ resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed";
+
+home-or-tmp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a78...;
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.1"
+
+hooker@~0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/hooker/-/hooker-0.2.3.tgz#b834f723cc4a242aa65963459df6d984c5d3d959";
+
+hosted-git-info@^2.1.4:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea5649...;
+
+htmlescape@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0...;
+
+htmlparser2@^3.9.1:
+ version "3.9.2"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb0...;
+ dependencies:
+ domelementtype "^1.3.0"
+ domhandler "^2.3.0"
+ domutils "^1.5.1"
+ entities "^1.1.1"
+ inherits "^2.0.1"
+ readable-stream "^2.0.2"
+
+http-errors@~1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91...;
+ dependencies:
+ inherits "~2.0.1"
+ statuses "1"
+
+http-errors@~1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a7...;
+ dependencies:
+ depd "1.1.0"
+ inherits "2.0.3"
+ setprototypeof "1.0.3"
+ statuses ">= 1.3.1 < 2"
+
+http-proxy@^1.13.0:
+ version "1.16.2"
+ resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f3...;
+ dependencies:
+ eventemitter3 "1.x.x"
+ requires-port "1.x.x"
+
+http-signature@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e13...;
+ dependencies:
+ assert-plus "^0.2.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
[email protected], https-browserify@~0.0.0:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24...;
+
[email protected]:
+ version "0.4.13"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992...;
+
[email protected]:
+ version "0.4.15"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825e...;
+
+iconv-lite@~0.4.13:
+ version "0.4.16"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.16.tgz#65de3beeb39e2960d67f049f1634ffcbcde9...;
+
+ieee754@^1.1.4:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4...;
+
+ignore@^3.2.0:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.7.tgz#4810ca5f1d8eca5595213a34b94f2eb4ed926bbd";
+
+"imports-loader@git+https://github.com/webpack-contrib/imports-loader.git#44d6f48463b256a17c1ba6fd9b5cc1449b4e379d";:
+ version "0.7.1"
+ resolved "git+https://github.com/webpack-contrib/imports-loader.git#44d6f48463b256a17c1ba6fd9b5cc1449b4e379d";
+ dependencies:
+ loader-utils "^1.0.2"
+ source-map "^0.5.6"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231...;
+
+indent-string@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a...;
+ dependencies:
+ repeating "^2.0.0"
+
[email protected]:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d...;
+
+inflight@^1.0.4:
+ 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, [email protected], inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de&...;
+
[email protected]:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1&...;
+
+ini@~1.3.0:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e";
+
+inline-source-map@~0.6.0:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863...;
+ dependencies:
+ source-map "~0.5.3"
+
+inquirer@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e...;
+ dependencies:
+ ansi-escapes "^1.1.0"
+ ansi-regex "^2.0.0"
+ chalk "^1.0.0"
+ cli-cursor "^1.0.1"
+ cli-width "^2.0.0"
+ figures "^1.3.5"
+ lodash "^4.3.0"
+ readline2 "^1.0.1"
+ run-async "^0.1.0"
+ rx-lite "^3.1.2"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.0"
+ through "^2.3.6"
+
+insert-module-globals@^7.0.0:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.0.1.tgz#c03bf4e01cb086d...;
+ dependencies:
+ JSONStream "^1.0.3"
+ combine-source-map "~0.7.1"
+ concat-stream "~1.5.1"
+ is-buffer "^1.1.0"
+ lexical-scope "^1.2.0"
+ process "~0.11.0"
+ through2 "^2.0.0"
+ xtend "^4.0.0"
+
+interpret@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f9...;
+
+invariant@^2.2.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae6036...;
+ 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#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb...;
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a9...;
+
+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#75f16642b480f187a711c814161fd...;
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-buffer@^1.1.0, is-buffer@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eec...;
+
+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#540572d34f7ac3119f8f76c...;
+ dependencies:
+ builtin-modules "^1.0.0"
+
+is-callable@^1.1.1, is-callable@^1.1.2, is-callable@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7...;
+
+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#9aa20eb6aeebbff77fbd33e74ca01...;
+
+is-dotfile@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205c...;
+
+is-equal-shallow@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac...;
+ dependencies:
+ is-primitive "^2.0.0"
+
+is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472...;
+
+is-extglob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc620...;
+
+is-finite@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0a...;
+ 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#ef9e31386f0...;
+ 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#a3b30a5c4f1...;
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863...;
+ dependencies:
+ is-extglob "^1.0.0"
+
+is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4:
+ version "2.16.0"
+ resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8...;
+ dependencies:
+ generate-function "^2.0.0"
+ generate-object-property "^1.1.0"
+ jsonpointer "^4.0.0"
+ xtend "^4.0.0"
+
+is-number@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e380...;
+
+is-number@^2.0.2, is-number@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908...;
+ dependencies:
+ kind-of "^3.0.2"
+
+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#d225ec23132e89edd38fda767472e62e65f...;
+
+is-path-in-cwd@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003b...;
+ dependencies:
+ is-path-inside "^1.0.0"
+
+is-path-inside@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717b...;
+ dependencies:
+ path-is-inside "^1.0.1"
+
+is-posix-bracket@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fb...;
+
+is-primitive@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a8721...;
+
+is-property@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095...;
+
+is-regex@^1.0.3:
+ 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.0.0"
+ resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf...;
+ dependencies:
+ tryit "^1.0.1"
+
+is-stream@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca4...;
+
+is-subset@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a...;
+
+is-symbol@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b66057...;
+
+is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f9601...;
+
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72...;
+
[email protected], isarray@~0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf...;
+
[email protected], 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.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69...;
+
+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"
+
+isomorphic-fetch@^2.1.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f72950747...;
+ dependencies:
+ node-fetch "^1.0.1"
+ whatwg-fetch ">=0.10.0"
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a&...;
+
+jasmine-core@~2.5.2:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.5.2.tgz#6f61bd79061e27f43e6f9355e44b3c6ca...;
+
+jodid25519@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782...;
+ dependencies:
+ jsbn "~0.1.0"
+
+js-string-escape@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1...;
+
+js-tokens@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d...;
+
+js-yaml@^3.5.1, js-yaml@~3.5.2:
+ version "3.5.5"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.5.5.tgz#0377c38017cabc7322b0d1fbcd25a491641f2fbe...;
+ dependencies:
+ argparse "^1.0.2"
+ 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@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b";
+
+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.4"
+ resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96...;
+
[email protected]:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882...;
+
+json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff5...;
+ dependencies:
+ jsonify "~0.0.0"
+
+json-stable-stringify@~0.0.0:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375...;
+ dependencies:
+ jsonify "~0.0.0"
+
+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#1296a2d58fd45f19a0f...;
+
[email protected]:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1";
+
+json5@^0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821";
+
+jsonfile@^2.1.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8&...;
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73...;
+
+jsonparse@^1.2.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.0.tgz#85fc245b1d9259acc6941960b905adf64e7de0e...;
+
+jsonpointer@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978...;
+
+jsprim@^1.2.2:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918";
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.0.2"
+ json-schema "0.2.3"
+ verror "1.3.6"
+
+jsx-ast-utils@^1.3.4:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1ef...;
+
+karma-babel-preprocessor@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/karma-babel-preprocessor/-/karma-babel-preprocessor-6.0.1.tgz#7ae1d3e64...;
+ dependencies:
+ babel-core "^6.0.0"
+
+karma-browserify@~5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/karma-browserify/-/karma-browserify-5.1.1.tgz#f642d70d776d9ab3b73526c57...;
+ dependencies:
+ convert-source-map "^1.1.3"
+ hat "^0.0.3"
+ js-string-escape "^1.0.0"
+ lodash "^3.10.1"
+ minimatch "^3.0.0"
+ os-shim "^0.1.3"
+
+karma-jasmine-html-reporter@~0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz#48a...;
+ dependencies:
+ karma-jasmine "^1.0.2"
+
+karma-jasmine@^1.0.2, karma-jasmine@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.0.tgz#22e4c06bf9a182e5294d1f705e37338...;
+
+karma-phantomjs-launcher@~1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz#d23ca3480...;
+ dependencies:
+ lodash "^4.0.1"
+ phantomjs-prebuilt "^2.1.7"
+
+karma-requirejs@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/karma-requirejs/-/karma-requirejs-1.1.0.tgz#fddae2cb87d7ebc16fb02228935...;
+
+karma-sourcemap-loader@~0.3.7:
+ version "0.3.7"
+ resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz#91322c77f8f13...;
+ dependencies:
+ graceful-fs "^4.1.2"
+
+karma-webpack@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-2.0.3.tgz#39cebf5ca2580139b27f9ae69b78816...;
+ dependencies:
+ async "~0.9.0"
+ loader-utils "^0.2.5"
+ lodash "^3.8.0"
+ source-map "^0.1.41"
+ webpack-dev-middleware "^1.0.11"
+
+karma@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/karma/-/karma-1.5.0.tgz#9c4c14f0400bef2c04c8e8e6bff59371025cc009";
+ dependencies:
+ bluebird "^3.3.0"
+ body-parser "^1.16.1"
+ chokidar "^1.4.1"
+ colors "^1.1.0"
+ combine-lists "^1.0.0"
+ connect "^3.6.0"
+ core-js "^2.2.0"
+ di "^0.0.1"
+ dom-serialize "^2.2.0"
+ expand-braces "^0.1.1"
+ glob "^7.1.1"
+ graceful-fs "^4.1.2"
+ http-proxy "^1.13.0"
+ isbinaryfile "^3.0.0"
+ lodash "^3.8.0"
+ log4js "^0.6.31"
+ mime "^1.3.4"
+ minimatch "^3.0.0"
+ optimist "^0.6.1"
+ qjobs "^1.1.4"
+ range-parser "^1.2.0"
+ rimraf "^2.6.0"
+ safe-buffer "^5.0.1"
+ socket.io "1.7.3"
+ source-map "^0.5.3"
+ tmp "0.0.31"
+ useragent "^2.1.12"
+
+kew@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b";
+
+kind-of@^3.0.2:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.0.tgz#b58abe4d5c044ad33726a8c1525b48cf891bff07...;
+ dependencies:
+ is-buffer "^1.1.5"
+
+klaw@^1.0.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439";
+ optionalDependencies:
+ graceful-fs "^4.1.9"
+
+labeled-stream-splicer@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz#a52e1d138024c...;
+ dependencies:
+ inherits "^2.0.1"
+ isarray "~0.0.1"
+ stream-splicer "^2.0.0"
+
+lazy-cache@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446...;
+
+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"
+
+lexical-scope@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/lexical-scope/-/lexical-scope-1.2.0.tgz#fcea5edc704a4b3a8796cdca419c3a0...;
+ dependencies:
+ astw "^2.0.0"
+
+livereload-js@^2.2.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.2.2.tgz#6c87257e648ab475bc24ea257457edc...;
+
+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#956905708d58b4bab4c2261b04f59...;
+ 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"
+
+loader-runner@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26...;
+
+loader-utils@^0.2.16, loader-utils@^0.2.5:
+ version "0.2.17"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c02...;
+ dependencies:
+ big.js "^3.1.3"
+ emojis-list "^2.0.0"
+ json5 "^0.5.0"
+ object-assign "^4.0.1"
+
+loader-utils@^1.0.2:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754...;
+ dependencies:
+ big.js "^3.1.3"
+ emojis-list "^2.0.0"
+ json5 "^0.5.0"
+
+lodash.assignin@^4.0.9:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e...;
+
+lodash.bind@^4.1.4:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db16...;
+
+lodash.defaults@^4.0.1:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f...;
+
+lodash.filter@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e4...;
+
+lodash.flatten@^4.2.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef2...;
+
+lodash.foreach@^4.3.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec351...;
+
+lodash.map@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f...;
+
+lodash.memoize@~3.0.3:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c7...;
+
+lodash.merge@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffad...;
+
+lodash.pick@^4.2.1:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03...;
+
+lodash.reduce@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f...;
+
+lodash.reject@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f4...;
+
+lodash.some@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb...;
+
+lodash@^3.10.1, lodash@^3.8.0, lodash@~3.10.1:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6";
+
+lodash@^4.0.0, lodash@^4.0.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.7.0:
+ version "4.17.4"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae";
+
+lodash@~4.16.4:
+ version "4.16.6"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.6.tgz#d22c9ac660288f3843e16ba7d2b5d06cca27d777";
+
+lodash@~4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.3.0.tgz#efd9c4a6ec53f3b05412429915c3e4824e4d25a4";
+
+log4js@^0.6.31:
+ version "0.6.38"
+ resolved "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd";
+ dependencies:
+ readable-stream "~1.0.2"
+ semver "~4.3.3"
+
+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:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d...;
+ dependencies:
+ js-tokens "^3.0.0"
+
+loud-rejection@^1.0.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d0482...;
+ dependencies:
+ currently-unhandled "^0.4.1"
+ signal-exit "^3.0.0"
+
[email protected]:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063...;
+
+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...;
+
+maxmin@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/maxmin/-/maxmin-1.1.0.tgz#71365e84a99dd8f8b3f7d5fde2f00d1e7f73be61";
+ dependencies:
+ chalk "^1.0.0"
+ figures "^1.0.1"
+ gzip-size "^1.0.0"
+ pretty-bytes "^1.0.0"
+
[email protected]:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce001685452632...;
+
+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#3a9a20b8462523e447cfbc7e8bb80ed667bfc55...;
+ dependencies:
+ errno "^0.1.3"
+ readable-stream "^2.0.1"
+
+meow@^3.1.0, meow@^3.3.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"
+
+micromatch@^2.1.5:
+ version "2.3.11"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c...;
+ dependencies:
+ arr-diff "^2.0.0"
+ array-unique "^0.2.1"
+ braces "^1.8.2"
+ expand-brackets "^0.1.4"
+ extglob "^0.3.1"
+ filename-regex "^2.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.1"
+ kind-of "^3.0.2"
+ normalize-path "^2.0.1"
+ object.omit "^2.0.0"
+ parse-glob "^3.0.4"
+ regex-cache "^0.4.2"
+
+miller-rabin@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9...;
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+mime-db@~1.27.0:
+ version "1.27.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1...;
+
+mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7:
+ version "2.1.15"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc9...;
+ dependencies:
+ mime-db "~1.27.0"
+
+mime@^1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53";
+
+minimalistic-assert@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836b...;
+
+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#f6c00c1...;
+
+"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@~3.0.0, minimatch@~3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b77...;
+ dependencies:
+ brace-expansion "^1.0.0"
+
[email protected], minimist@~0.0.1:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d&...;
+
+minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284&...;
+
[email protected]:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12";
+ dependencies:
+ minimist "0.0.8"
+
+"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903";
+ dependencies:
+ minimist "0.0.8"
+
+module-deps@^4.0.8:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-4.1.1.tgz#23215833f1da13fd606ccb8087b44852dcb...;
+ dependencies:
+ JSONStream "^1.0.3"
+ browser-resolve "^1.7.0"
+ cached-path-relative "^1.0.0"
+ concat-stream "~1.5.0"
+ defined "^1.0.0"
+ detective "^4.0.0"
+ duplexer2 "^0.1.2"
+ inherits "^2.0.1"
+ parents "^1.0.0"
+ readable-stream "^2.0.2"
+ resolve "^1.1.3"
+ stream-combiner2 "^1.1.1"
+ subarg "^1.0.0"
+ through2 "^2.0.0"
+ xtend "^4.0.0"
+
[email protected]:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098";
+
[email protected]:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765";
+
[email protected]:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff";
+
[email protected]:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372f...;
+
+nan@^2.3.0:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45";
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdb...;
+
[email protected]:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0...;
+
+node-fetch@^1.0.1:
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8...;
+ dependencies:
+ encoding "^0.1.11"
+ is-stream "^1.0.1"
+
+node-libs-browser@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e9583...;
+ dependencies:
+ assert "^1.1.1"
+ browserify-zlib "^0.1.4"
+ 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 "0.0.1"
+ os-browserify "^0.2.0"
+ path-browserify "0.0.0"
+ process "^0.11.0"
+ punycode "^1.2.4"
+ querystring-es3 "^0.2.0"
+ readable-stream "^2.0.5"
+ stream-browserify "^2.0.1"
+ stream-http "^2.3.1"
+ string_decoder "^0.10.25"
+ timers-browserify "^2.0.2"
+ tty-browserify "0.0.0"
+ url "^0.11.0"
+ util "^0.10.3"
+ vm-browserify "0.0.4"
+
+node-pre-gyp@^0.6.29:
+ version "0.6.34"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc1...;
+ dependencies:
+ mkdirp "^0.5.1"
+ nopt "^4.0.1"
+ npmlog "^4.0.2"
+ rc "^1.1.7"
+ request "^2.81.0"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^2.2.1"
+ tar-pack "^3.4.0"
+
+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@~3.0.6:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9";
+ dependencies:
+ abbrev "1"
+
+normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9ded...;
+ 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@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa2...;
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+npmlog@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f";
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.1"
+ set-blocking "~2.0.0"
+
+nth-check@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae...;
+ dependencies:
+ boolbase "~1.0.0"
+
+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#097b602b53422a522c1afb879031833...;
+
+oauth-sign@~0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9...;
+
[email protected]:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd5...;
+
+object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8b...;
+
[email protected]:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f40...;
+
+object-is@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b...;
+
+object-keys@^1.0.10, object-keys@^1.0.8:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d...;
+
+object.assign@^4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.0.4.tgz#b1c9cc044ef1b9fe63606fc141abbb3...;
+ dependencies:
+ define-properties "^1.1.2"
+ function-bind "^1.1.0"
+ object-keys "^1.0.10"
+
+object.entries@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d25766...;
+ dependencies:
+ define-properties "^1.1.2"
+ es-abstract "^1.6.1"
+ function-bind "^1.1.0"
+ has "^1.0.1"
+
+object.omit@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54e...;
+ dependencies:
+ for-own "^0.1.4"
+ is-extendable "^0.1.1"
+
+object.values@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac...;
+ dependencies:
+ define-properties "^1.1.2"
+ es-abstract "^1.6.1"
+ function-bind "^1.1.0"
+ has "^1.0.1"
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d9...;
+ dependencies:
+ ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.3:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1";
+ dependencies:
+ wrappy "1"
+
+onetime@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789...;
+
+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#364c5e409d3f4d6301d6c0b4c05bba50180ae...;
+ 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"
+
+options@>=0.0.5:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f...;
+
+os-browserify@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e...;
+
+os-browserify@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.1.2.tgz#49ca0293e0b19590a5f5de10c7f265a...;
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7...;
+
+os-locale@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d...;
+ dependencies:
+ lcid "^1.0.0"
+
+os-shim@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917...;
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa127...;
+
+osenv@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644";
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+outpipe@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2...;
+ dependencies:
+ shell-quote "^1.4.2"
+
+pako@~0.2.0:
+ version "0.2.9"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75";
+
+parents@^1.0.0, parents@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751...;
+ dependencies:
+ path-platform "~0.11.15"
+
+parse-asn1@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c...;
+ 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-glob@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a3883...;
+ dependencies:
+ glob-base "^0.3.0"
+ is-dotfile "^1.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.0"
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4...;
+ dependencies:
+ error-ex "^1.2.0"
+
[email protected]:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64a...;
+ dependencies:
+ better-assert "~1.0.0"
+
[email protected]:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d...;
+ dependencies:
+ better-assert "~1.0.0"
+
[email protected]:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a&...;
+ dependencies:
+ better-assert "~1.0.0"
+
+parseurl@~1.3.0, parseurl@~1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56&...;
+
[email protected], path-browserify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec...;
+
+path-exists@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c70227...;
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+path-is-absolute@^1.0.0, 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#174b9268735534ffbc7ace6bf...;
+
+path-is-inside@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027fa...;
+
+path-parse@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c...;
+
+path-platform@~0.11.15:
+ version "0.11.15"
+ resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf...;
+
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe44...;
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+pbkdf2@^3.0.3:
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.9.tgz#f2c4b25a600058b3c3773c086c37dbbee1ffe693";
+ dependencies:
+ create-hmac "^1.1.2"
+
+pend@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50";
+
+performance-now@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d9...;
+
+phantomjs-prebuilt@^2.1.7:
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.14.tgz#d53d311fcfb7d1d08ddb...;
+ dependencies:
+ es6-promise "~4.0.3"
+ extract-zip "~1.5.0"
+ fs-extra "~1.0.0"
+ hasha "~2.2.0"
+ kew "~0.7.0"
+ progress "~1.1.8"
+ request "~2.79.0"
+ request-progress "~2.0.1"
+ which "~1.2.10"
+
+pify@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c";
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b1787762...;
+ 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";
+
+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"
+
+pluralize@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c4...;
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97d...;
+
+preserve@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b&...;
+
+pretty-bytes@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff...;
+ dependencies:
+ get-stdin "^4.0.1"
+ meow "^3.1.0"
+
+private@^0.1.6:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1...;
+
+process-nextick-args@~1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f...;
+
+process@^0.11.0, process@~0.11.0:
+ version "0.11.9"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.9.tgz#7bd5ad21aa6253e7da8682264f1e11d11c0318c1...;
+
+progress@^1.1.8, progress@~1.1.8:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be&...;
+
+promise@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf...;
+ dependencies:
+ asap "~2.0.3"
+
+prop-types@^15.5.4:
+ version "15.5.8"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.8.tgz#6b7b2e141083be38c8595aa51fc55775c719...;
+ dependencies:
+ fbjs "^0.8.9"
+
+prr@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a";
+
+public-encrypt@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693ca...;
+ 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"
+
[email protected]:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d&...;
+
+punycode@^1.2.4, punycode@^1.3.2, punycode@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e&...;
+
+qjobs@^1.1.4:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73";
+
[email protected]:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-5.2.0.tgz#a9f31142af468cb72b25b30136ba2456834916be";
+
[email protected], qs@~6.4.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233";
+
+qs@~5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-5.1.0.tgz#4d932e5c7ea411cca76a312d39a606200fd50cd9";
+
+qs@~6.3.0:
+ version "6.3.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c";
+
+querystring-es3@^0.2.0, querystring-es3@~0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596f...;
+
[email protected]:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e7470058785...;
+
+randomatic@^1.1.3:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec...;
+ dependencies:
+ is-number "^2.0.2"
+ kind-of "^3.0.2"
+
+randombytes@^2.0.0, randombytes@^2.0.1:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.3.tgz#674c99760901c3c4112771a31e521dc349c...;
+
+range-parser@^1.0.3, range-parser@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f61109...;
+
+raw-body@~2.1.5:
+ version "2.1.7"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774&...;
+ dependencies:
+ bytes "2.4.0"
+ iconv-lite "0.4.13"
+ unpipe "1.0.0"
+
+raw-body@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96&...;
+ dependencies:
+ bytes "2.4.0"
+ iconv-lite "0.4.15"
+ unpipe "1.0.0"
+
+rc@^1.1.7:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95";
+ dependencies:
+ deep-extend "~0.4.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+react-addons-test-utils@~15.4.2:
+ version "15.4.2"
+ resolved "https://registry.yarnpkg.com/react-addons-test-utils/-/react-addons-test-utils-15.4.2.tgz#93bcaa718f...;
+ dependencies:
+ fbjs "^0.8.4"
+ object-assign "^4.1.0"
+
+react-dom@~15.4.2:
+ version "15.4.2"
+ resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.4.2.tgz#015363f05b0a1fd52ae9efdd3a0060d9069520...;
+ dependencies:
+ fbjs "^0.8.1"
+ loose-envify "^1.1.0"
+ object-assign "^4.1.0"
+
+react@~15.4.2:
+ version "15.4.2"
+ resolved "https://registry.yarnpkg.com/react/-/react-15.4.2.tgz#41f7991b26185392ba9bae96c8889e7e018397ef";
+ dependencies:
+ fbjs "^0.8.4"
+ loose-envify "^1.1.0"
+ object-assign "^4.1.0"
+
+read-only-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4...;
+ dependencies:
+ readable-stream "^2.0.2"
+
+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#9d63c13276c065918d57f002a57f40a1b64...;
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.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"
+
+readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.6:
+ version "2.2.9"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac9...;
+ dependencies:
+ buffer-shims "~1.0.0"
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "~1.0.0"
+ process-nextick-args "~1.0.6"
+ string_decoder "~1.0.0"
+ util-deprecate "~1.0.1"
+
+readable-stream@~1.0.2:
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4...;
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@~2.0.0:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfc...;
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "~1.0.0"
+ process-nextick-args "~1.0.6"
+ string_decoder "~0.10.x"
+ util-deprecate "~1.0.1"
+
+readdirp@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78&...;
+ dependencies:
+ graceful-fs "^4.1.2"
+ minimatch "^3.0.2"
+ readable-stream "^2.0.2"
+ set-immediate-shim "^1.0.1"
+
+readline2@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e3...;
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ mute-stream "0.0.5"
+
+rechoir@^0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384...;
+ dependencies:
+ resolve "^1.1.6"
+
+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"
+
+regenerate@^1.2.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19...;
+
+regenerator-runtime@^0.10.0:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a...;
+
[email protected]:
+ version "0.9.11"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b...;
+ dependencies:
+ babel-runtime "^6.18.0"
+ babel-types "^6.19.0"
+ private "^0.1.6"
+
+regex-cache@^0.4.2:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d71...;
+ dependencies:
+ is-equal-shallow "^0.1.3"
+ is-primitive "^2.0.0"
+
+regexpu-core@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6e...;
+ dependencies:
+ regenerate "^1.2.1"
+ regjsgen "^0.2.0"
+ regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7&...;
+
+regjsparser@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ea...;
+ dependencies:
+ jsesc "~0.5.0"
+
+remove-trailing-separator@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb9...;
+
+repeat-element@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f...;
+
+repeat-string@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884...;
+
+repeat-string@^1.5.2:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a77628...;
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dd...;
+ dependencies:
+ is-finite "^1.0.0"
+
+request-progress@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc...;
+ dependencies:
+ throttleit "^1.0.0"
+
+request@^2.81.0:
+ version "2.81.0"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0...;
+ dependencies:
+ aws-sign2 "~0.6.0"
+ aws4 "^1.2.1"
+ caseless "~0.12.0"
+ combined-stream "~1.0.5"
+ extend "~3.0.0"
+ forever-agent "~0.6.1"
+ form-data "~2.1.1"
+ har-validator "~4.2.1"
+ hawk "~3.1.3"
+ http-signature "~1.1.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.7"
+ oauth-sign "~0.8.1"
+ performance-now "^0.2.0"
+ qs "~6.4.0"
+ safe-buffer "^5.0.1"
+ stringstream "~0.0.4"
+ tough-cookie "~2.3.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.0.0"
+
+request@~2.79.0:
+ version "2.79.0"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de...;
+ dependencies:
+ aws-sign2 "~0.6.0"
+ aws4 "^1.2.1"
+ caseless "~0.11.0"
+ combined-stream "~1.0.5"
+ extend "~3.0.0"
+ forever-agent "~0.6.1"
+ form-data "~2.1.1"
+ har-validator "~2.0.6"
+ hawk "~3.1.3"
+ http-signature "~1.1.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.7"
+ oauth-sign "~0.8.1"
+ qs "~6.3.0"
+ stringstream "~0.0.4"
+ tough-cookie "~2.3.0"
+ tunnel-agent "~0.4.1"
+ uuid "^3.0.0"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e234...;
+
+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#97f717b69d48784...;
+
+require-uncached@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4...;
+ dependencies:
+ caller-path "^0.1.0"
+ resolve-from "^1.0.0"
+
+requirejs@~2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/requirejs/-/requirejs-2.3.3.tgz#aa59fd3a0287eaf407959a138228044b5dd6a6a...;
+
[email protected]:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e69...;
+
+resolve-from@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e9...;
+
[email protected], resolve@~1.1.0:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b...;
+
+resolve@^1.1.3, resolve@^1.1.4, resolve@^1.1.6:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5...;
+ dependencies:
+ path-parse "^1.0.5"
+
+restore-cursor@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed299147915225...;
+ dependencies:
+ exit-hook "^1.0.0"
+ onetime "^1.0.0"
+
+right-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148...;
+ dependencies:
+ align-text "^0.1.1"
+
+rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.0, rimraf@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d";
+ dependencies:
+ glob "^7.0.5"
+
+rimraf@~2.2.8:
+ version "2.2.8"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582";
+
+ripemd160@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-1.0.1.tgz#93a4bbd4942bc574b69a8fa57c71de10ecca7d6...;
+
+run-async@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e38...;
+ dependencies:
+ once "^1.3.0"
+
+rx-lite@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102...;
+
+safe-buffer@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de5791...;
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f";
+
+semver@~4.3.3:
+ version "4.3.6"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da";
+
+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#045f9782d011ae9a6803ddd382b24392b...;
+
+set-immediate-shim@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc4...;
+
+setimmediate@^1.0.4, setimmediate@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab78...;
+
[email protected]:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0c...;
+
+sha.js@^2.3.6, sha.js@~2.4.4:
+ version "2.4.8"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f";
+ dependencies:
+ inherits "^2.0.1"
+
+shasum@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f";
+ dependencies:
+ json-stable-stringify "~0.0.0"
+ sha.js "~2.4.4"
+
+shell-quote@^1.4.2, shell-quote@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f4...;
+ dependencies:
+ array-filter "~0.0.0"
+ array-map "~0.0.0"
+ array-reduce "~0.0.0"
+ jsonify "~0.0.0"
+
+shelljs@^0.7.5:
+ version "0.7.7"
+ resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1...;
+ dependencies:
+ glob "^7.0.0"
+ interpret "^1.0.0"
+ rechoir "^0.6.2"
+
+signal-exit@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b736...;
+
+slash@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55";
+
[email protected]:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831...;
+
[email protected]:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198";
+ dependencies:
+ hoek "2.x.x"
+
[email protected]:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b9967...;
+ dependencies:
+ debug "2.3.3"
+ socket.io-parser "2.3.1"
+
[email protected]:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.7.3.tgz#b30e86aa10d5ef3546601c09c...;
+ dependencies:
+ backo2 "1.0.2"
+ component-bind "1.0.0"
+ component-emitter "1.2.1"
+ debug "2.3.3"
+ engine.io-client "1.8.3"
+ has-binary "0.1.7"
+ indexof "0.0.1"
+ object-component "0.0.3"
+ parseuri "0.0.5"
+ socket.io-parser "2.3.1"
+ to-array "0.1.4"
+
[email protected]:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326bef...;
+ dependencies:
+ component-emitter "1.1.2"
+ debug "2.2.0"
+ isarray "0.0.1"
+ json3 "3.3.2"
+
[email protected]:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.7.3.tgz#b8af9caba00949e568e369f1327ea9be9ea2461...;
+ dependencies:
+ debug "2.3.3"
+ engine.io "1.8.3"
+ has-binary "0.1.7"
+ object-assign "4.1.0"
+ socket.io-adapter "0.5.0"
+ socket.io-client "1.7.3"
+ socket.io-parser "2.3.1"
+
+source-list-map@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-1.1.1.tgz#1a33ac210ca144d1e561f906ebc...;
+
+source-map-support@^0.4.2:
+ version "0.4.14"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.14.tgz#9d4463772598b86271b4...;
+ dependencies:
+ source-map "^0.5.6"
+
[email protected], source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3:
+ version "0.5.6"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f...;
+
+source-map@^0.1.41:
+ version "0.1.43"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e...;
+ dependencies:
+ amdefine ">=0.0.4"
+
+spdx-correct@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4...;
+ dependencies:
+ spdx-license-ids "^1.0.2"
+
+spdx-expression-parse@~1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed...;
+
+spdx-license-ids@^1.0.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d...;
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297...;
+
+sshpk@^1.7.0:
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c";
+ dependencies:
+ asn1 "~0.2.3"
+ assert-plus "^1.0.0"
+ dashdash "^1.12.0"
+ getpass "^0.1.1"
+ optionalDependencies:
+ bcrypt-pbkdf "^1.0.0"
+ ecc-jsbn "~0.1.1"
+ jodid25519 "^1.0.0"
+ jsbn "~0.1.0"
+ tweetnacl "~0.14.0"
+
+statuses@1, "statuses@>= 1.3.1 < 2", statuses@~1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e&...;
+
+stream-browserify@^2.0.0, stream-browserify@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e451...;
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "^2.0.2"
+
+stream-combiner2@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad47...;
+ dependencies:
+ duplexer2 "~0.1.0"
+ readable-stream "^2.0.2"
+
+stream-http@^2.0.0, stream-http@^2.3.1:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.0.tgz#cec1f4e3b494bc4a81b451808970f8b20b4...;
+ dependencies:
+ builtin-status-codes "^3.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.2.6"
+ to-arraybuffer "^1.0.0"
+ xtend "^4.0.0"
+
+stream-splicer@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc19351976...;
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.2"
+
+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#118bdf5b8cdc51a2a7e70d211e07e2b0b...;
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+string-width@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2ee...;
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^3.0.0"
+
+string_decoder@^0.10.25, string_decoder@~0.10.0, string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301...;
+
+string_decoder@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b...;
+ dependencies:
+ buffer-shims "~1.0.0"
+
+stringstream@~0.0.4:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a8...;
+
+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#6a385fb8853d952d5ff05d0e8aaf94278dc63...;
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0...;
+ 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#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed...;
+
+strip-indent@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552...;
+ dependencies:
+ get-stdin "^4.0.1"
+
+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#3c531942e908c2697c0...;
+
+subarg@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2";
+ dependencies:
+ minimist "^1.1.0"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa401170846299...;
+
+supports-color@^3.1.0:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3...;
+ dependencies:
+ has-flag "^1.0.0"
+
+syntax-error@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.3.0.tgz#1ed9266c4d40be75dc55bf9bb1cb77062...;
+ dependencies:
+ acorn "^4.0.3"
+
+table@^3.7.8:
+ version "3.8.3"
+ resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f";
+ dependencies:
+ ajv "^4.7.0"
+ ajv-keywords "^1.0.0"
+ chalk "^1.1.1"
+ lodash "^4.0.0"
+ slice-ansi "0.0.4"
+ string-width "^2.0.0"
+
+tapable@^0.2.5, tapable@~0.2.5:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.6.tgz#206be8e188860b514425375e6f1ae89bfb01fd8d...;
+
+tar-pack@^3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984&...;
+ dependencies:
+ debug "^2.2.0"
+ fstream "^1.0.10"
+ fstream-ignore "^1.0.5"
+ once "^1.3.3"
+ readable-stream "^2.1.4"
+ rimraf "^2.5.1"
+ tar "^2.2.1"
+ uid-number "^0.0.6"
+
+tar@^2.2.1:
+ 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"
+
+text-table@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa57...;
+
+throttleit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528a...;
+
+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.2.7 <3", through@^2.3.6:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5...;
+
+timers-browserify@^1.0.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2...;
+ dependencies:
+ process "~0.11.0"
+
+timers-browserify@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af21134...;
+ dependencies:
+ setimmediate "^1.0.4"
+
+tiny-lr@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-0.2.1.tgz#b3fdba802e5d56a33c2f6f10794b32e477ac729d...;
+ dependencies:
+ body-parser "~1.14.0"
+ debug "~2.2.0"
+ faye-websocket "~0.10.0"
+ livereload-js "^2.2.0"
+ parseurl "~1.3.0"
+ qs "~5.1.0"
+
[email protected], [email protected]:
+ version "0.0.31"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7";
+ dependencies:
+ os-tmpdir "~1.0.1"
+
[email protected]:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890&...;
+
+to-arraybuffer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a...;
+
+to-fast-properties@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef994...;
+
+tough-cookie@~2.3.0:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150...;
+ dependencies:
+ punycode "^1.4.1"
+
+trim-newlines@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d350...;
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6...;
+
+tryit@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb";
+
[email protected], tty-browserify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d52...;
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f...;
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tunnel-agent@~0.4.1:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828...;
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f...;
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520d...;
+ dependencies:
+ prelude-ls "~1.1.2"
+
+type-is@~1.6.10, type-is@~1.6.14:
+ version "1.6.15"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410...;
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.15"
+
+typedarray@~0.0.5:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830...;
+
+ua-parser-js@^0.7.9:
+ version "0.7.12"
+ resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d...;
+
+uglify-js@^2.8.5:
+ version "2.8.22"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.22.tgz#d54934778a8da14903fa29a326fb24c0ab51a1...;
+ dependencies:
+ source-map "~0.5.1"
+ yargs "~3.10.0"
+ optionalDependencies:
+ uglify-to-browserify "~1.0.0"
+
+uglify-js@~3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.4.tgz#13da18bc4ecec20d29861b4ab7b60cb9ef9a9cc...;
+ dependencies:
+ commander "~2.9.0"
+ source-map "~0.5.1"
+ optionalDependencies:
+ uglify-to-browserify "~1.0.0"
+
+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#6e0924d6bda6b5afe...;
+
+uid-number@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663ba...;
+
[email protected]:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa";
+
+umd@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.1.tgz#8ae556e11011f63c2596708a8837259f01b3d60e";
+
+underscore.string@~3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.2.3.tgz#806992633665d5e5fcb4db1...;
+
+underscore@~1.8.3:
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5...;
+
[email protected], unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec";
+
+uri-path@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/uri-path/-/uri-path-1.0.0.tgz#9747f018358933c31de0fccfd82d138e67262e32&...;
+
+url@^0.11.0, 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"
+
+user-home@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9...;
+ dependencies:
+ os-homedir "^1.0.0"
+
+useragent@^2.1.12:
+ version "2.1.13"
+ resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.1.13.tgz#bba43e8aa24d5ceb83c2937473e102e21df74c...;
+ dependencies:
+ lru-cache "2.2.x"
+ tmp "0.0.x"
+
+util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28...;
+
[email protected], util@^0.10.3, util@~0.10.1:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9";
+ dependencies:
+ inherits "2.0.1"
+
[email protected]:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287...;
+
+uuid@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a";
+
+uuid@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1";
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2...;
+ dependencies:
+ spdx-correct "~1.0.0"
+ spdx-expression-parse "~1.0.0"
+
[email protected]:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c";
+ dependencies:
+ extsprintf "1.0.2"
+
[email protected], vm-browserify@~0.0.1:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87...;
+ dependencies:
+ indexof "0.0.1"
+
+void-elements@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e9...;
+
+watchify@~3.9.0:
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/watchify/-/watchify-3.9.0.tgz#f075fd2e8a86acde84cedba6e5c2a0bedd523d9e&...;
+ dependencies:
+ anymatch "^1.3.0"
+ browserify "^14.0.0"
+ chokidar "^1.0.0"
+ defined "^1.0.0"
+ outpipe "^1.1.0"
+ through2 "^2.0.0"
+ xtend "^4.0.0"
+
+watchpack@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.3.1.tgz#7d8693907b28ce6013e7f3610aa2a1acf07dad8...;
+ dependencies:
+ async "^2.1.2"
+ chokidar "^1.4.3"
+ graceful-fs "^4.1.2"
+
+webpack-dev-middleware@^1.0.11:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.10.2.tgz#2e252ce1dfb0...;
+ dependencies:
+ memory-fs "~0.4.1"
+ mime "^1.3.4"
+ path-is-absolute "^1.0.0"
+ range-parser "^1.0.3"
+
+webpack-sources@^0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.2.3.tgz#17c62bfaf13c707f9d02c479e0d...;
+ dependencies:
+ source-list-map "^1.1.1"
+ source-map "~0.5.3"
+
+webpack@~2.3.1:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.3.3.tgz#eecc083c18fb7bf958ea4f40b57a6640c5a0cc78...;
+ dependencies:
+ acorn "^4.0.4"
+ acorn-dynamic-import "^2.0.0"
+ ajv "^4.7.0"
+ ajv-keywords "^1.1.1"
+ async "^2.1.2"
+ enhanced-resolve "^3.0.0"
+ interpret "^1.0.0"
+ json-loader "^0.5.4"
+ loader-runner "^2.3.0"
+ loader-utils "^0.2.16"
+ memory-fs "~0.4.1"
+ mkdirp "~0.5.0"
+ node-libs-browser "^2.0.0"
+ source-map "^0.5.3"
+ supports-color "^3.1.0"
+ tapable "~0.2.5"
+ uglify-js "^2.8.5"
+ watchpack "^1.3.1"
+ webpack-sources "^0.2.3"
+ yargs "^6.0.0"
+
+websocket-driver@>=0.5.1:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238a...;
+ dependencies:
+ websocket-extensions ">=0.1.1"
+
+websocket-extensions@>=0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef7...;
+
+whatwg-fetch@>=0.10.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b4421...;
+
+which-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b960...;
+
+which@~1.2.1, which@~1.2.10:
+ version "1.2.14"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5";
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add9...;
+ dependencies:
+ string-width "^1.0.1"
+
[email protected]:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94...;
+
[email protected]:
+ 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&...;
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd8...;
+ 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@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757";
+ dependencies:
+ mkdirp "^0.5.1"
+
[email protected]:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.2.tgz#8a244fa052401e08c9886cf44a85189e1fd4067f";
+ dependencies:
+ options ">=0.0.5"
+ ultron "1.0.x"
+
[email protected]:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a";
+
[email protected]:
+ version "1.5.3"
+ resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e407...;
+
+xtend@^4.0.0, xtend@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af";
+
+y18n@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41";
+
+yargs-parser@^4.2.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9...;
+ dependencies:
+ camelcase "^3.0.0"
+
+yargs@^6.0.0:
+ version "6.6.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208";
+ 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 "^4.2.0"
+
+yargs@~3.10.0:
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/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"
+
[email protected]:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005";
+ dependencies:
+ fd-slicer "~1.0.1"
+
[email protected]:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419";
diff --git a/web/.eslintrc.js b/web/.eslintrc.js
index c60569db..98486dcd 100644
--- a/web/.eslintrc.js
+++ b/web/.eslintrc.js
@@ -5,7 +5,10 @@ module.exports = {
'amd': true,
'jasmine': true,
},
- 'extends': 'eslint:recommended',
+ 'extends': [
+ 'eslint:recommended',
+ "plugin:react/recommended",
+ ],
'parserOptions': {
'ecmaFeatures': {
'experimentalObjectRestSpread': true,
@@ -40,6 +43,6 @@ module.exports = {
'comma-dangle': [
'error',
'always-multiline'
- ]
+ ],
}
};
\ No newline at end of file
diff --git a/web/Gruntfile.js b/web/Gruntfile.js
index 000224e4..46cd3593 100644
--- a/web/Gruntfile.js
+++ b/web/Gruntfile.js
@@ -1,9 +1,9 @@
const webpackConfig = require('./webpack.config.js');
var srcFiles = [
- 'pgadmin/static/jsx/*.jsx',
+ 'pgadmin/static/jsx/**/*.jsx',
'pgadmin/static/js/selection/*.js',
- 'regression/javascript/**.js',
+ 'regression/javascript/**/*.jsx',
'regression/javascript/**/*.js',
'*.js',
];
diff --git a/web/karma.conf.js b/web/karma.conf.js
index 7fa51b50..01eb4224 100644
--- a/web/karma.conf.js
+++ b/web/karma.conf.js
@@ -16,7 +16,7 @@ module.exports = function (config) {
],
preprocessors: {
'regression/javascript/**/*.js': ['webpack'],
- // 'regression/javascript/**/*.jsx': ['webpack'],
+ 'regression/javascript/**/*.jsx': ['webpack'],
},
webpack: webpackConfig,
webpackMiddleware: {
diff --git a/web/package.json b/web/package.json
index 760e1e0c..a775057d 100644
--- a/web/package.json
+++ b/web/package.json
@@ -5,6 +5,7 @@
"babel-preset-es2015": "~6.24.0",
"babel-preset-react": "~6.23.0",
"enzyme": "~2.8.2",
+ "enzyme-matchers": "^3.1.0",
"eslint": "^3.19.0",
"eslint-plugin-react": "^6.10.3",
"grunt": "~1.0.1",
@@ -14,6 +15,7 @@
"grunt-karma": "^2.0.0",
"grunt-webpack": "~2.0.1",
"jasmine-core": "~2.5.2",
+ "jasmine-enzyme": "^3.1.0",
"karma": "~1.5.0",
"karma-babel-preprocessor": "^6.0.1",
"karma-browserify": "~5.1.1",
@@ -34,7 +36,9 @@
"babelify": "~7.3.0",
"browserify": "~14.1.0",
"exports-loader": "~0.6.4",
+ "immutability-helper": "^2.2.0",
"imports-loader": "git+https://github.com/webpack-contrib/imports-loader.git#44d6f48463b256a17c1ba6fd9b5cc1449b4e379d";,
+ "moment": "^2.18.1",
"react": "~15.4.2",
"react-dom": "~15.4.2",
"requirejs": "~2.3.3",
diff --git a/web/pgadmin/feature_tests/query_tool_journey_test.py b/web/pgadmin/feature_tests/query_tool_journey_test.py
new file mode 100644
index 00000000..530ed8b2
--- /dev/null
+++ b/web/pgadmin/feature_tests/query_tool_journey_test.py
@@ -0,0 +1,112 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import pyperclip
+import time
+
+from selenium.webdriver import ActionChains
+
+from regression.python_test_utils import test_utils
+from regression.feature_utils.base_feature_test import BaseFeatureTest
+
+
+class QueryToolJourneyTest(BaseFeatureTest):
+ """
+ Tests the path through the query tool
+ """
+
+ scenarios = [
+ ("Tests the path through the query tool", dict())
+ ]
+
+ def before(self):
+ connection = test_utils.get_db_connection(self.server['db'],
+ self.server['username'],
+ self.server['db_password'],
+ self.server['host'],
+ self.server['port'])
+ test_utils.drop_database(connection, "acceptance_test_db")
+ test_utils.create_database(self.server, "acceptance_test_db")
+ test_utils.create_table(self.server, "acceptance_test_db", "test_table")
+ self.page.add_server(self.server)
+
+ def runTest(self):
+ self._navigate_to_query_tool()
+ self._execute_query("SELECT * FROM test_table ORDER BY value")
+
+ self._test_copies_rows()
+ self._test_copies_columns()
+ self._test_history_tab()
+
+ def _test_copies_rows(self):
+ pyperclip.copy("old clipboard contents")
+ time.sleep(5)
+ self.page.driver.switch_to.default_content()
+ self.page.driver.switch_to_frame(self.page.driver.find_element_by_tag_name("iframe"))
+ self.page.find_by_xpath("//*[contains(@class, 'sr')]/*[1]/input[@type='checkbox']").click()
+ self.page.find_by_xpath("//*[@id='btn-copy-row']").click()
+
+ self.assertEqual("'Some-Name','6'",
+ pyperclip.paste())
+
+ def _test_copies_columns(self):
+ pyperclip.copy("old clipboard contents")
+
+ self.page.driver.switch_to.default_content()
+ self.page.driver.switch_to_frame(self.page.driver.find_element_by_tag_name("iframe"))
+ self.page.find_by_xpath("//*[@data-test='output-column-header' and contains(., 'some_column')]/input").click()
+ self.page.find_by_xpath("//*[@id='btn-copy-row']").click()
+
+ self.assertEqual(
+ """'Some-Name'
+'Some-Other-Name'""",
+ pyperclip.paste())
+
+ def _test_history_tab(self):
+ self.__clear_query_tool()
+
+ editor_input = self.page.find_by_id("output-panel")
+ self.page.click_element(editor_input)
+ self._execute_query("SELECT * FROM shoes")
+
+ self.page.click_tab("History")
+ history_element = self.page.find_by_id("history_grid")
+ self.assertIn("SELECT * FROM test_table", history_element.text)
+ self.assertIn("SELECT * FROM shoes", history_element.text)
+
+ def __clear_query_tool(self):
+ self.page.click_element(self.page.find_by_xpath("//*[@id='btn-edit']"))
+ self.page.click_modal('Yes')
+
+ def _navigate_to_query_tool(self):
+ self.page.toggle_open_tree_item(self.server['name'])
+ self.page.toggle_open_tree_item('Databases')
+ self.page.toggle_open_tree_item('acceptance_test_db')
+ time.sleep(5)
+ self.page.find_by_partial_link_text("Tools").click()
+ self.page.find_by_partial_link_text("Query Tool").click()
+ self.page.click_tab('Query-1')
+ time.sleep(5)
+
+ def _execute_query(self, query):
+ ActionChains(self.page.driver).send_keys(query).perform()
+ self.page.driver.switch_to.default_content()
+ self.page.driver.switch_to_frame(self.page.driver.find_element_by_tag_name("iframe"))
+ self.page.find_by_id("btn-flash").click()
+
+ def after(self):
+ self.page.close_query_tool()
+ self.page.remove_server(self.server)
+
+ connection = test_utils.get_db_connection(self.server['db'],
+ self.server['username'],
+ self.server['db_password'],
+ self.server['host'],
+ self.server['port'])
+ test_utils.drop_database(connection, "acceptance_test_db")
diff --git a/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py b/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py
index 17bc7bf5..ae3af820 100644
--- a/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py
+++ b/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py
@@ -83,7 +83,7 @@ class CheckDebuggerForXssFeatureTest(BaseFeatureTest):
# If debugger plugin is not found
if is_error and is_error == "Debugger Error":
- self.page.click_modal_ok()
+ self.page.click_modal('OK')
self.skipTest("Please make sure that debugger plugin is properly configured")
else:
time.sleep(2)
diff --git a/web/pgadmin/static/js/history/history_collection.js b/web/pgadmin/static/js/history/history_collection.js
new file mode 100644
index 00000000..f7b6acd7
--- /dev/null
+++ b/web/pgadmin/static/js/history/history_collection.js
@@ -0,0 +1,34 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+export default class HistoryCollection {
+
+ constructor(history_model) {
+ this.historyList = history_model;
+ this.onChange(() => {});
+ }
+
+ length() {
+ return this.historyList.length;
+ }
+
+ add(object) {
+ this.historyList.push(object);
+ this.onChangeHandler(this.historyList);
+ }
+
+ reset() {
+ this.historyList = [];
+ this.onChangeHandler(this.historyList);
+ }
+
+ onChange(onChangeHandler) {
+ this.onChangeHandler = onChangeHandler;
+ }
+}
\ No newline at end of file
diff --git a/web/pgadmin/static/js/history/index.js b/web/pgadmin/static/js/history/index.js
new file mode 100644
index 00000000..834878a8
--- /dev/null
+++ b/web/pgadmin/static/js/history/index.js
@@ -0,0 +1,14 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import historyCollection from './history_collection';
+
+export {
+ historyCollection,
+};
diff --git a/web/pgadmin/static/jsx/components.jsx b/web/pgadmin/static/jsx/components.jsx
index 5bcb5208..6ff34e4c 100644
--- a/web/pgadmin/static/jsx/components.jsx
+++ b/web/pgadmin/static/jsx/components.jsx
@@ -1,8 +1,10 @@
import React from 'react';
import {render} from 'react-dom';
+import QueryHistory from './history/query_history';
export {
render,
React,
+ QueryHistory,
};
\ No newline at end of file
diff --git a/web/pgadmin/static/jsx/history/query_history.jsx b/web/pgadmin/static/jsx/history/query_history.jsx
new file mode 100644
index 00000000..d36f5ce9
--- /dev/null
+++ b/web/pgadmin/static/jsx/history/query_history.jsx
@@ -0,0 +1,49 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import React from 'react';
+import QueryHistoryEntry from './query_history_entry';
+
+const liStyle = {
+ borderBottom: '1px solid #cccccc',
+};
+
+export default class QueryHistory extends React.Component {
+
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ history: [],
+ };
+ }
+
+ componentWillMount() {
+ this.setState({history: this.props.historyCollection.historyList});
+ this.props.historyCollection.onChange((historyList) => this.setState({history: historyList}));
+ }
+
+ render() {
+ return <ul>
+ {_.chain(this.state.history)
+ .sortBy(historyEntry => historyEntry.start_time)
+ .reverse()
+ .map((entry, index) =>
+ <li key={index} style={liStyle}>
+ <QueryHistoryEntry historyEntry={entry}/>
+ </li>)
+ .value()
+ }
+ </ul>;
+ }
+}
+
+QueryHistory.propTypes = {
+ historyCollection: React.PropTypes.object.isRequired,
+};
\ No newline at end of file
diff --git a/web/pgadmin/static/jsx/history/query_history_entry.jsx b/web/pgadmin/static/jsx/history/query_history_entry.jsx
new file mode 100644
index 00000000..d66cb3a7
--- /dev/null
+++ b/web/pgadmin/static/jsx/history/query_history_entry.jsx
@@ -0,0 +1,93 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import React from 'react';
+import update from 'immutability-helper';
+import moment from 'moment';
+
+const outerDivStyle = {
+ paddingLeft: '10px',
+ fontFamily: 'monospace',
+ paddingRight: '20px',
+ fontSize: '14px',
+ backgroundColor: '#FFF',
+};
+const sqlStyle = {
+ textOverflow: 'ellipsis',
+ overflow: 'hidden',
+ whiteSpace: 'nowrap',
+ userSelect: 'auto',
+};
+const secondLineStyle = {
+ display: 'flex',
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ fontSize: '13px',
+ color: '#888888',
+};
+const timestampStyle = {
+ alignSelf: 'flex-start',
+};
+const rowsAffectedStyle = {
+ alignSelf: 'flex-end',
+};
+const errorMessageStyle = {
+ textOverflow: 'ellipsis',
+ overflow: 'hidden',
+ whiteSpace: 'nowrap',
+ userSelect: 'auto',
+ fontSize: '13px',
+ color: '#888888',
+};
+
+export default class QueryHistoryEntry extends React.Component {
+ formatDate(date) {
+ return (moment(date).format('MMM D YYYY [–] HH:mm:ss'));
+ }
+
+ render() {
+ return (
+ <div style={this.queryEntryBackgroundColor()}>
+ <div style={sqlStyle}>
+ {this.props.historyEntry.query}
+ </div>
+ <div style={secondLineStyle}>
+ <div style={timestampStyle}>
+ {this.formatDate(this.props.historyEntry.start_time)} /
+ total time: {this.props.historyEntry.total_time}
+ </div>
+ <div style={rowsAffectedStyle}>
+ {this.props.historyEntry.row_affected} rows affected
+ </div>
+ </div>
+ <div style={errorMessageStyle}>
+ {this.props.historyEntry.message}
+ </div>
+ </div>
+ );
+ }
+
+ queryEntryBackgroundColor() {
+ if (!this.props.historyEntry.status) {
+ return update(outerDivStyle, {$merge: {backgroundColor: '#F7D0D5'}});
+ }
+ return outerDivStyle;
+ }
+}
+
+QueryHistoryEntry.propTypes = {
+ historyEntry: React.PropTypes.shape({
+ query: React.PropTypes.string,
+ start_time: React.PropTypes.instanceOf(Date),
+ status: React.PropTypes.bool,
+ total_time: React.PropTypes.string,
+ row_affected: React.PropTypes.int,
+ message: React.PropTypes.string,
+ }),
+};
\ No newline at end of file
diff --git a/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js b/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js
index d8ae73ee..f28bc13f 100644
--- a/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js
+++ b/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js
@@ -4,6 +4,8 @@ define(
'backbone', 'backgrid', 'codemirror', 'pgadmin.misc.explain',
'sources/selection/grid_selector', 'sources/selection/clipboard',
'sources/selection/copy_data',
+ 'sources/generated/history',
+ 'sources/generated/reactComponents',
'slickgrid', 'bootstrap', 'pgadmin.browser', 'wcdocker',
'codemirror/mode/sql/sql', 'codemirror/addon/selection/mark-selection',
@@ -27,7 +29,7 @@ define(
'slickgrid/slick.grid'
],
function(
- $, _, S, alertify, pgAdmin, Backbone, Backgrid, CodeMirror, pgExplain, GridSelector, clipboard, copyData
+ $, _, S, alertify, pgAdmin, Backbone, Backgrid, CodeMirror, pgExplain, GridSelector, clipboard, copyData, HistoryBundle, reactComponents
) {
/* Return back, this has been called more than once */
if (pgAdmin.SqlEditor)
@@ -226,6 +228,7 @@ define(
self.messages_panel = main_docker.addPanel('messages', wcDocker.DOCK.STACKED, self.data_output_panel);
self.history_panel = main_docker.addPanel('history', wcDocker.DOCK.STACKED, self.data_output_panel);
+
self.render_history_grid();
if (!self.handler.is_new_browser_tab) {
@@ -944,147 +947,145 @@ define(
// Remove any existing grid first
if (self.history_grid) {
- self.history_grid.remove();
+ self.history_grid.remove();
}
- var history_model = Backbone.Model.extend({
- defaults: {
- status: undefined,
- start_time: undefined,
- query: undefined,
- row_affected: 0,
- row_retrieved: 0,
- total_time: undefined,
- message: ''
- }
- });
-
- var history_collection = self.history_collection = new (Backbone.Collection.extend({
- model: history_model,
- // comparator to sort the history in reverse order of the start_time
- comparator: function(a, b) {
- return -a.get('start_time').localeCompare(b.get('start_time'));
- }
- }));
- var columns = [{
- name: "status",
- label: "",
- cell: Backgrid.Cell.extend({
- class: 'sql-status-cell',
- render: function() {
- this.$el.empty();
- var $btn = $('<button></button>', {
- class: 'btn btn-circle'
- }).appendTo(this.$el);
- var $circleDiv = $('<i></i>', {class: 'fa'}).appendTo($btn);
- if (this.model.get('status')) {
- $btn.addClass('btn-success');
- $circleDiv.addClass('fa-check');
- } else {
- $btn.addClass('btn-danger');
- $circleDiv.addClass('fa-times');
- }
-
- return this;
- },
- editable: false
- }),
- editable: false
- }, {
- name: "start_time",
- label: "Date",
- cell: "string",
- editable: false,
- resizeable: true
- }, {
- name: "query",
- label: "Query",
- cell: "string",
- editable: false,
- resizeable: true
- }, {
- name: "row_affected",
- label: "Rows affected",
- cell: "integer",
- editable: false,
- resizeable: true
- }, {
- name: "total_time",
- label: "Total Time",
- cell: "string",
- editable: false,
- resizeable: true
- }, {
- name: "message",
- label: "Message",
- cell: "string",
- editable: false,
- resizeable: true
- }];
-
-
- // Create Collection of Backgrid columns
- var columnsColl = new Backgrid.Columns(columns);
- var $history_grid = self.$el.find('#history_grid');
-
- var grid = self.history_grid = new Backgrid.Grid({
- columns: columnsColl,
- collection: history_collection,
- className: "backgrid table-bordered presentation table backgrid-striped"
- });
-
- // Render the grid
- $history_grid.append(grid.render().$el);
-
- var sizeAbleCol = new Backgrid.Extension.SizeAbleColumns({
- collection: history_collection,
- columns: columnsColl,
- grid: self.history_grid
- });
-
- $history_grid.find('thead').before(sizeAbleCol.render().el);
-
- // Add resize handlers
- var sizeHandler = new Backgrid.Extension.SizeAbleColumnsHandlers({
- sizeAbleColumns: sizeAbleCol,
- grid: self.history_grid,
- saveColumnWidth: true
- });
-
- // sizeHandler should render only when table grid loaded completely.
- setTimeout(function() {
- $history_grid.find('thead').before(sizeHandler.render().el);
- }, 1000);
-
- // re render sizeHandler whenever history panel tab becomes visible
- self.history_panel.on(wcDocker.EVENT.VISIBILITY_CHANGED, function(ev) {
- $history_grid.find('thead').before(sizeHandler.render().el);
- });
-
- // Initialized table width 0 still not calculated
- var table_width = 0;
- // Listen to resize events
- columnsColl.on('resize',
- function(columnModel, newWidth, oldWidth, offset) {
- var $grid_el = $history_grid.find('table'),
- tbl_orig_width = $grid_el.width(),
- offset = oldWidth - newWidth,
- tbl_new_width = tbl_orig_width - offset;
-
- if (table_width == 0) {
- table_width = tbl_orig_width
- }
- // Table new width cannot be less than original width
- if (tbl_new_width >= table_width) {
- $($grid_el).css('width', tbl_new_width + 'px');
- }
- else {
- // reset if calculated tbl_new_width is less than original
- // table width
- tbl_new_width = table_width;
- $($grid_el).css('width', tbl_new_width + 'px');
- }
- });
+ self.history_collection = new HistoryBundle.historyCollection([]);
+
+ let queryHistoryElement = reactComponents.React.createElement(
+ reactComponents.QueryHistory, {historyCollection: self.history_collection});
+ reactComponents.render(queryHistoryElement, $('#history_grid')[0]);
+
+ // var history_model = Backbone.Model.extend({
+ // defaults: {
+ // status: undefined,
+ // start_time: undefined,
+ // query: undefined,
+ // row_affected: 0,
+ // row_retrieved: 0,
+ // total_time: undefined,
+ // message: ''
+ // }
+ // });
+ // var columns = [{
+ // name: "status",
+ // label: "",
+ // cell: Backgrid.Cell.extend({
+ // class: 'sql-status-cell',
+ // render: function() {
+ // this.$el.empty();
+ // var $btn = $('<button></button>', {
+ // class: 'btn btn-circle'
+ // }).appendTo(this.$el);
+ // var $circleDiv = $('<i></i>', {class: 'fa'}).appendTo($btn);
+ // if (this.model.get('status')) {
+ // $btn.addClass('btn-success');
+ // $circleDiv.addClass('fa-check');
+ // } else {
+ // $btn.addClass('btn-danger');
+ // $circleDiv.addClass('fa-times');
+ // }
+ //
+ // return this;
+ // },
+ // editable: false
+ // }),
+ // editable: false
+ // }, {
+ // name: "start_time",
+ // label: "Date",
+ // cell: "string",
+ // editable: false,
+ // resizeable: true
+ // }, {
+ // name: "query",
+ // label: "Query",
+ // cell: "string",
+ // editable: false,
+ // resizeable: true
+ // }, {
+ // name: "row_affected",
+ // label: "Rows affected",
+ // cell: "integer",
+ // editable: false,
+ // resizeable: true
+ // }, {
+ // name: "total_time",
+ // label: "Total Time",
+ // cell: "string",
+ // editable: false,
+ // resizeable: true
+ // }, {
+ // name: "message",
+ // label: "Message",
+ // cell: "string",
+ // editable: false,
+ // resizeable: true
+ // }];
+
+
+ // // Create Collection of Backgrid columns
+ // var columnsColl = new Backgrid.Columns(columns);
+ // var $history_grid = self.$el.find('#history_grid');
+ //
+ // var grid = self.history_grid = new Backgrid.Grid({
+ // columns: columnsColl,
+ // collection: self.history_collection,
+ // className: "backgrid table-bordered presentation table backgrid-striped"
+ // });
+ //
+ // // Render the grid
+ // $history_grid.append(grid.render().$el);
+ //
+ // var sizeAbleCol = new Backgrid.Extension.SizeAbleColumns({
+ // collection: self.history_collection,
+ // columns: columnsColl,
+ // grid: self.history_grid
+ // });
+ //
+ // $history_grid.find('thead').before(sizeAbleCol.render().el);
+ //
+ // // Add resize handlers
+ // var sizeHandler = new Backgrid.Extension.SizeAbleColumnsHandlers({
+ // sizeAbleColumns: sizeAbleCol,
+ // grid: self.history_grid,
+ // saveColumnWidth: true
+ // });
+ //
+ // // sizeHandler should render only when table grid loaded completely.
+ // setTimeout(function() {
+ // $history_grid.find('thead').before(sizeHandler.render().el);
+ // }, 1000);
+ //
+ // // re render sizeHandler whenever history panel tab becomes visible
+ // self.history_panel.on(wcDocker.EVENT.VISIBILITY_CHANGED, function(ev) {
+ // $history_grid.find('thead').before(sizeHandler.render().el);
+ // });
+ //
+ // // Initialized table width 0 still not calculated
+ // var table_width = 0;
+ // // Listen to resize events
+ // columnsColl.on('resize',
+ // function(columnModel, newWidth, oldWidth, offset) {
+ // var $grid_el = $history_grid.find('table'),
+ // tbl_orig_width = $grid_el.width(),
+ // offset = oldWidth - newWidth,
+ // tbl_new_width = tbl_orig_width - offset;
+ //
+ // if (table_width == 0) {
+ // table_width = tbl_orig_width
+ // }
+ // // Table new width cannot be less than original width
+ // if (tbl_new_width >= table_width) {
+ // $($grid_el).css('width', tbl_new_width + 'px');
+ // }
+ // else {
+ // // reset if calculated tbl_new_width is less than original
+ // // table width
+ // tbl_new_width = table_width;
+ // $($grid_el).css('width', tbl_new_width + 'px');
+ // }
+ // });
},
// Callback function for Add New Row button click.
@@ -1387,7 +1388,7 @@ define(
this._stopEventPropogation(ev);
this._closeDropDown(ev);
// ask for confirmation only if anything to clear
- if(!self.history_collection.length) { return; }
+ if(!self.history_collection.length()) { return; }
alertify.confirm("{{ _('Clear history') }}",
"{{ _('Are you sure you wish to clear the history?') }}",
@@ -2208,11 +2209,13 @@ define(
$("#btn-flash").prop('disabled', false);
self.trigger('pgadmin-sqleditor:loading-icon:hide');
self.gridView.history_collection.add({
- 'status' : status, 'start_time': self.query_start_time.toString(),
- 'query': self.query, 'row_affected': self.rows_affected,
- 'total_time': self.total_time, 'message':msg
+ 'status' : status,
+ 'start_time': self.query_start_time,
+ 'query': self.query,
+ 'row_affected': self.rows_affected,
+ 'total_time': self.total_time,
+ 'message':msg,
});
- self.gridView.history_collection.sort();
}
},
@@ -2478,10 +2481,13 @@ define(
// Update the sql results in history tab
_.each(res.data.query_result, function(r) {
- self.gridView.history_collection.add(
- {'status' : r.status, 'start_time': self.query_start_time.toString(),
- 'query': r.sql, 'row_affected': r.rows_affected,
- 'total_time': self.total_time, 'message': r.result
+ self.gridView.history_collection.add({
+ 'status': r.status,
+ 'start_time': self.query_start_time,
+ 'query': r.sql,
+ 'row_affected': r.rows_affected,
+ 'total_time': self.total_time,
+ 'message': r.result,
});
});
self.trigger('pgadmin-sqleditor:loading-icon:hide');
diff --git a/web/regression/feature_utils/app_starter.py b/web/regression/feature_utils/app_starter.py
index 96cc516b..f40d6921 100644
--- a/web/regression/feature_utils/app_starter.py
+++ b/web/regression/feature_utils/app_starter.py
@@ -11,6 +11,7 @@ import subprocess
import signal
import random
+import time
class AppStarter:
""" Helper for starting the full pgadmin4 app and loading the page via
@@ -40,6 +41,7 @@ class AppStarter:
)
self.driver.set_window_size(1024, 1024)
+ time.sleep(10)
self.driver.get(
"http://"; + self.app_config.DEFAULT_SERVER + ":" +
random_server_port)
diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py
index b1dfa182..0a89b623 100644
--- a/web/regression/feature_utils/pgadmin_page.py
+++ b/web/regression/feature_utils/pgadmin_page.py
@@ -31,15 +31,16 @@ class PgadminPage:
def reset_layout(self):
self.click_element(self.find_by_partial_link_text("File"))
self.find_by_partial_link_text("Reset Layout").click()
- self.click_modal_ok()
+ self.click_modal('OK')
self.wait_for_reloading_indicator_to_disappear()
- def click_modal_ok(self):
+ def click_modal(self, button_text):
time.sleep(0.5)
# Find active alertify dialog in case of multiple alertify dialog & click on that dialog
- self.click_element(
- self.find_by_xpath("//div[contains(@class, 'alertify') and not(contains(@class, 'ajs-hidden'))]//button[.='OK']")
- )
+ modal_button = self.find_by_xpath(
+ "//div[contains(@class, 'alertify') and not(contains(@class, 'ajs-hidden'))]//button[.='%s']"
+ % button_text)
+ self.click_element(modal_button)
def add_server(self, server_config):
self.find_by_xpath("//*[@class='aciTreeText' and contains(.,'Servers')]").click()
@@ -71,10 +72,13 @@ class PgadminPage:
def remove_server(self, server_config):
self.driver.switch_to.default_content()
- self.find_by_xpath("//*[@id='tree']//*[.='" + server_config['name'] + "' and @class='aciTreeItem']").click()
- self.find_by_partial_link_text("Object").click()
- self.find_by_partial_link_text("Delete/Drop").click()
- self.click_modal_ok()
+ server_to_remove = self.find_by_xpath("//*[@id='tree']//*[.='" + server_config['name'] + "' and @class='aciTreeItem']")
+ self.click_element(server_to_remove)
+ object_menu_item = self.find_by_partial_link_text("Object")
+ self.click_element(object_menu_item)
+ delete_menu_item = self.find_by_partial_link_text("Delete/Drop")
+ self.click_element(delete_menu_item)
+ self.click_modal('OK')
def select_tree_item(self, tree_item_text):
self.find_by_xpath("//*[@id='tree']//*[.='" + tree_item_text + "' and @class='aciTreeItem']").click()
@@ -95,6 +99,7 @@ class PgadminPage:
)
def click_element(self, element):
+ # driver must be here to adhere to the method contract in selenium.webdriver.support.wait.WebDriverWait.until()
def click_succeeded(driver):
try:
element.click()
@@ -127,8 +132,9 @@ class PgadminPage:
time.sleep(1)
def click_tab(self, tab_name):
- self.find_by_xpath("//*[contains(@class,'wcTabTop')]//*[contains(@class,'wcPanelTab') "
- "and contains(.,'" + tab_name + "')]").click()
+ tab = self.find_by_xpath("//*[contains(@class,'wcTabTop')]//*[contains(@class,'wcPanelTab') "
+ "and contains(.,'" + tab_name + "')]")
+ self.click_element(tab)
def wait_for_input_field_content(self, field_name, content):
def input_field_has_content(driver):
diff --git a/web/regression/javascript/check_node_visiblity_spec.js b/web/regression/javascript/check_node_visibility_spec.js
similarity index 60%
rename from web/regression/javascript/check_node_visiblity_spec.js
rename to web/regression/javascript/check_node_visibility_spec.js
index 130b1c21..96a8961f 100644
--- a/web/regression/javascript/check_node_visiblity_spec.js
+++ b/web/regression/javascript/check_node_visibility_spec.js
@@ -7,24 +7,24 @@
//
//////////////////////////////////////////////////////////////////////////
-define(["sources/check_node_visibility"],
-function (checkNodeVisibility, pgBrowser) {
- describe("checkNodeVisibility", function () {
+define(['sources/check_node_visibility'],
+function (checkNodeVisibility) {
+ describe('checkNodeVisibility', function () {
var browser;
browser = jasmine.createSpyObj('browser', [
- 'node_preference_data', 'get_preference']
+ 'node_preference_data', 'get_preference']
);
- describe("when node is server collection", function () {
- it("returns true", function () {
+ describe('when node is server collection', function () {
+ it('returns true', function () {
expect(checkNodeVisibility(browser, 'coll-server')).toEqual(true);
});
});
- describe("when node is server", function () {
- it("returns true", function () {
+ describe('when node is server', function () {
+ it('returns true', function () {
expect(checkNodeVisibility(browser, 'server')).toEqual(true);
});
});
diff --git a/web/regression/javascript/history/history_collection_spec.js b/web/regression/javascript/history/history_collection_spec.js
new file mode 100644
index 00000000..e1baa554
--- /dev/null
+++ b/web/regression/javascript/history/history_collection_spec.js
@@ -0,0 +1,83 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import HistoryCollection from '../../../pgadmin/static/js/history/history_collection';
+
+describe('historyCollection', function () {
+ let historyCollection, historyModel, onChangeSpy;
+ beforeEach(() => {
+ historyModel = [{some: 'thing', someOther: ['array element']}];
+ historyCollection = new HistoryCollection(historyModel);
+ onChangeSpy = jasmine.createSpy('onChangeHandler');
+
+ historyCollection.onChange(onChangeSpy);
+ });
+
+ describe('length', function () {
+ it('returns 0 when underlying history model has no elements', function () {
+ historyCollection = new HistoryCollection([]);
+
+ expect(historyCollection.length()).toBe(0);
+ });
+
+ it('returns the length of the underlying history model', function () {
+ expect(historyCollection.length()).toBe(1);
+ });
+ });
+
+ describe('add', function () {
+ let expectedHistory;
+ beforeEach(() => {
+ historyCollection.add({some: 'new thing', someOther: ['value1', 'value2']});
+
+ expectedHistory = [
+ {some: 'thing', someOther: ['array element']},
+ {some: 'new thing', someOther: ['value1', 'value2']},
+ ];
+ });
+
+ it('adds a passed entry', function () {
+ expect(historyCollection.historyList).toEqual(expectedHistory);
+ });
+
+ it('calls the onChange function', function () {
+ expect(onChangeSpy).toHaveBeenCalledWith(expectedHistory);
+ });
+ });
+
+ describe('reset', function () {
+ beforeEach(() => {
+ historyCollection.reset();
+ });
+
+ it('drops the history', function () {
+ expect(historyCollection.historyList).toEqual([]);
+ expect(historyCollection.length()).toBe(0);
+ });
+
+ it('calls the onChange function', function () {
+ expect(onChangeSpy).toHaveBeenCalledWith([]);
+ });
+ });
+
+ describe('sort', function () {
+ it('doesn\'t sort');
+ });
+
+ describe('when instantiated', function () {
+ describe('from a history model', function () {
+ it('has the historyModel', () => {
+ let content = historyCollection.historyList;
+
+ expect(content).toEqual(historyModel);
+ });
+
+ });
+ });
+});
\ No newline at end of file
diff --git a/web/regression/javascript/history/query_history_entry_spec.jsx b/web/regression/javascript/history/query_history_entry_spec.jsx
new file mode 100644
index 00000000..c86a1cfc
--- /dev/null
+++ b/web/regression/javascript/history/query_history_entry_spec.jsx
@@ -0,0 +1,50 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import React from 'react';
+
+import QueryHistoryEntry from '../../../pgadmin/static/jsx/history/query_history_entry';
+
+import {mount} from 'enzyme';
+import jasmineEnzyme from 'jasmine-enzyme';
+
+describe('QueryHistoryEntry', () => {
+ let historyWrapper;
+ beforeEach(() => {
+ jasmineEnzyme();
+ });
+
+ describe('for a failed query', () => {
+ beforeEach(() => {
+ const historyEntry = {
+ query: 'second sql statement',
+ start_time: new Date(2016, 11, 11, 1, 33, 5, 99),
+ status: false,
+ };
+ historyWrapper = mount(<QueryHistoryEntry historyEntry={historyEntry}/>);
+ });
+ it('displays a pink background color', () => {
+ expect(historyWrapper.find('div').first()).toHaveStyle('backgroundColor', '#F7D0D5');
+ });
+ });
+
+ describe('for a successful query', () => {
+ beforeEach(() => {
+ const historyEntry = {
+ query: 'second sql statement',
+ start_time: new Date(2016, 11, 11, 1, 33, 5, 99),
+ status: true,
+ };
+ historyWrapper = mount(<QueryHistoryEntry historyEntry={historyEntry}/>);
+ });
+ it('does not display a pink background color', () => {
+ expect(historyWrapper.find('div').first()).toHaveStyle('backgroundColor', '#FFF');
+ });
+ });
+});
diff --git a/web/regression/javascript/history/query_history_spec.jsx b/web/regression/javascript/history/query_history_spec.jsx
new file mode 100644
index 00000000..e36988a8
--- /dev/null
+++ b/web/regression/javascript/history/query_history_spec.jsx
@@ -0,0 +1,103 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import React from 'react';
+import QueryHistory from '../../../pgadmin/static/jsx/history/query_history';
+import QueryHistoryEntry from '../../../pgadmin/static/jsx/history/query_history_entry';
+import HistoryCollection from '../../../pgadmin/static/js/history/history_collection';
+import jasmineEnzyme from 'jasmine-enzyme';
+
+import {mount, shallow} from 'enzyme';
+
+describe('QueryHistory', () => {
+ let historyWrapper;
+ beforeEach(() => {
+ jasmineEnzyme();
+ const historyCollection = new HistoryCollection([]);
+ historyWrapper = shallow(<QueryHistory historyCollection={historyCollection}/>);
+ });
+
+ describe('on construction', () => {
+ it('has no entries', (done) => {
+ let foundChildren = historyWrapper.find(QueryHistoryEntry);
+ expect(foundChildren.length).toBe(0);
+ done();
+ });
+ });
+
+ describe('when it has history', () => {
+ describe('when two SQL queries were executed', () => {
+ let foundChildren;
+
+ beforeEach(() => {
+ const historyObjects = [
+ {
+ query: 'second sql statement',
+ start_time: new Date(2016, 11, 11, 1, 33, 5, 99),
+ status: false,
+ row_affected: 1,
+ total_time: '234 msec',
+ message: 'some other message',
+ },
+ {
+ query: 'first sql statement',
+ start_time: new Date(2017, 5, 3, 14, 3, 15, 150),
+ status: true,
+ row_affected: 2,
+ total_time: '14 msec',
+ message: 'a very important message',
+ },
+ ];
+ const historyCollection = new HistoryCollection(historyObjects);
+
+ historyWrapper = mount(<QueryHistory historyCollection={historyCollection}/>);
+
+ foundChildren = historyWrapper.find(QueryHistoryEntry);
+ });
+
+ it('has two query history entries', () => {
+ expect(foundChildren.length).toBe(2);
+ });
+
+ it('displays the SQL of the queries in order', () => {
+ expect(foundChildren.at(0).text()).toContain('first sql statement');
+ expect(foundChildren.at(1).text()).toContain('second sql statement');
+ });
+
+ it('displays the formatted timestamp of the queries in chronological order by most recent first', () => {
+ expect(foundChildren.at(0).text()).toContain('Jun 3 2017 – 14:03:15');
+ expect(foundChildren.at(1).text()).toContain('Dec 11 2016 – 01:33:05');
+ });
+
+ it('displays the number of rows affected', () => {
+ expect(foundChildren.at(1).text()).toContain('1 rows affected');
+ expect(foundChildren.at(0).text()).toContain('2 rows affected');
+ });
+
+ it('displays the total time', () => {
+ expect(foundChildren.at(0).text()).toContain('total time: 14 msec');
+ expect(foundChildren.at(1).text()).toContain('total time: 234 msec');
+ });
+
+ it('displays the truncated message', () => {
+ expect(foundChildren.at(0).text()).toContain('a very important message');
+ expect(foundChildren.at(1).text()).toContain('some other message');
+ });
+
+ describe('when there are one failing and one successful query each', () => {
+ it('adds a white background color for the successful query', () => {
+ expect(foundChildren.at(0).find('div').first()).toHaveStyle('backgroundColor', '#FFF');
+ });
+ it('adds a red background color for the failed query', () => {
+ expect(foundChildren.at(1).find('div').first()).toHaveStyle('backgroundColor', '#F7D0D5');
+ });
+ });
+ });
+ });
+});
\ No newline at end of file
diff --git a/web/regression/python_test_utils/test_utils.py b/web/regression/python_test_utils/test_utils.py
index 2b7c6954..202802a3 100644
--- a/web/regression/python_test_utils/test_utils.py
+++ b/web/regression/python_test_utils/test_utils.py
@@ -172,6 +172,7 @@ def create_table(server, db_name, table_name):
except Exception:
traceback.print_exc(file=sys.stderr)
+
def create_constraint(
server, db_name, table_name,
constraint_type="unique", constraint_name="test_unique"):
@@ -196,6 +197,7 @@ def create_constraint(
except Exception:
traceback.print_exc(file=sys.stderr)
+
def create_debug_function(server, db_name, function_name="test_func"):
try:
connection = get_db_connection(db_name,
diff --git a/web/webpack.config.js b/web/webpack.config.js
index 91586592..fc6d29e0 100644
--- a/web/webpack.config.js
+++ b/web/webpack.config.js
@@ -1,18 +1,21 @@
/* eslint-env node */
module.exports = {
- context: __dirname + '/pgadmin/static/jsx',
- entry: './components.jsx',
+ context: __dirname + '/pgadmin/static',
+ entry: {
+ reactComponents: './jsx/components.jsx',
+ history: './js/history/index.js',
+ },
output: {
libraryTarget: 'amd',
path: __dirname + '/pgadmin/static/js/generated',
- filename: 'reactComponents.js',
+ filename: '[name].js',
},
module: {
rules: [{
test: /\.jsx?$/,
- exclude: /node_modules/,
+ exclude: [/node_modules/, /vendor/],
use: {
loader: 'babel-loader',
options: {
diff --git a/web/webpack.test.config.js b/web/webpack.test.config.js
index 49bef069..2d87ad04 100644
--- a/web/webpack.test.config.js
+++ b/web/webpack.test.config.js
@@ -21,7 +21,7 @@ module.exports = {
use: {
loader: 'babel-loader',
options: {
- presets: ['es2015'],
+ presets: ['es2015', 'react'],
},
},
},
@@ -50,6 +50,7 @@ module.exports = {
},
resolve: {
+ extensions: ['.js', '.jsx'],
alias: {
'alertify': sourcesDir + '/vendor/alertifyjs/alertify',
'jquery': sourcesDir + '/vendor/jquery/jquery-1.11.2',
@@ -62,4 +63,11 @@ module.exports = {
'slickgrid.rowselectionmodel': sourcesDir + '/vendor/slickgrid/plugins/slick.rowselectionmodel',
},
},
+ externals: {
+ 'react/addons': true,
+ 'react/lib/ReactContext': true,
+ 'react/lib/ExecutionEnvironment': true,
+ 'react-dom/test-utils': true,
+ 'react-test-renderer/shallow': true,
+ },
};
\ No newline at end of file
diff --git a/web/yarn.lock b/web/yarn.lock
index 47f2e13c..fdbcfb4e 100644
--- a/web/yarn.lock
+++ b/web/yarn.lock
@@ -1431,6 +1431,12 @@ 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#f6534d15148269b20352e7bee26f501f9a191...;
+deep-equal-ident@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/deep-equal-ident/-/deep-equal-ident-1.1.1.tgz#06f4b89e53710cd6cea4a7781...;
+ dependencies:
+ lodash.isequal "^3.0"
+
deep-extend@~0.4.0:
version "0.4.1"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469...;
@@ -1668,6 +1674,12 @@ entities@^1.1.1, entities@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0&...;
+enzyme-matchers@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/enzyme-matchers/-/enzyme-matchers-3.1.0.tgz#097fe2b734a7493ed0f8aea727d...;
+ dependencies:
+ deep-equal-ident "^1.1.1"
+
enzyme@~2.8.2:
version "2.8.2"
resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-2.8.2.tgz#6c8bcb05012abc4aa4bc3213fb23780b9b5b1714";
@@ -2542,6 +2554,12 @@ ignore@^3.2.0:
version "3.2.7"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.7.tgz#4810ca5f1d8eca5595213a34b94f2eb4ed926bbd";
+immutability-helper@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/immutability-helper/-/immutability-helper-2.2.0.tgz#c4385ad4f68315843ef...;
+ dependencies:
+ invariant "^2.2.0"
+
"imports-loader@git+https://github.com/webpack-contrib/imports-loader.git#44d6f48463b256a17c1ba6fd9b5cc1449b4e379d";:
version "0.7.1"
resolved "git+https://github.com/webpack-contrib/imports-loader.git#44d6f48463b256a17c1ba6fd9b5cc1449b4e379d";
@@ -2817,6 +2835,12 @@ jasmine-core@~2.5.2:
version "2.5.2"
resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.5.2.tgz#6f61bd79061e27f43e6f9355e44b3c6ca...;
+jasmine-enzyme@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/jasmine-enzyme/-/jasmine-enzyme-3.1.0.tgz#99cdc5bd850c6a741332928fe988b...;
+ dependencies:
+ enzyme-matchers "^3.1.0"
+
jodid25519@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782...;
@@ -3081,6 +3105,22 @@ loader-utils@^1.0.2:
emojis-list "^2.0.0"
json5 "^0.5.0"
+lodash._baseisequal@^3.0.0:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz#d8025f76339d2934276...;
+ dependencies:
+ lodash.isarray "^3.0.0"
+ lodash.istypedarray "^3.0.0"
+ lodash.keys "^3.0.0"
+
+lodash._bindcallback@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a...;
+
+lodash._getnative@^3.0.0:
+ version "3.9.1"
+ resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687...;
+
lodash.assignin@^4.0.9:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e...;
@@ -3105,6 +3145,33 @@ lodash.foreach@^4.3.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec351...;
+lodash.isarguments@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff006...;
+
+lodash.isarray@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bc...;
+
+lodash.isequal@^3.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-3.0.4.tgz#1c35eb3b6ef0cd1ff51743e3ea3cf...;
+ dependencies:
+ lodash._baseisequal "^3.0.0"
+ lodash._bindcallback "^3.0.0"
+
+lodash.istypedarray@^3.0.0:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz#c9a477498607501d8e8...;
+
+lodash.keys@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c65...;
+ dependencies:
+ lodash._getnative "^3.0.0"
+ lodash.isarguments "^3.0.0"
+ lodash.isarray "^3.0.0"
+
lodash.map@^4.4.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f...;
@@ -3309,6 +3376,10 @@ module-deps@^4.0.8:
through2 "^2.0.0"
xtend "^4.0.0"
+moment@^2.18.1:
+ version "2.18.1"
+ resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f";
+
[email protected]:
version "0.7.1"
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098";
--
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers
Attachments:
[text/plain] 0001-Bring-React-into-the-codebase.diff (283.3K, 3-0001-Bring-React-into-the-codebase.diff)
download | inline diff:
diff --git a/.gitignore b/.gitignore
index f6d14903..67cec303 100644
--- a/.gitignore
+++ b/.gitignore
@@ -36,5 +36,5 @@ runtime/release/
runtime/ui_BrowserWindow.h
web/config_local.py
web/regression/test_config.json
-node_modules/
-yarn.lock
+/web/pgadmin/static/**/generated/
+/web/node_modules/
diff --git a/Make.bat b/Make.bat
index 8082c56d..a71223eb 100644
--- a/Make.bat
+++ b/Make.bat
@@ -238,6 +238,12 @@ REM Main function Ends
CD "%WD%\web"
IF %ERRORLEVEL% NEQ 0 EXIT /B %ERRORLEVEL%
+
+ ECHO Install Javascript dependencies
+ yarn install
+ ECHO Bundle all Javascript
+ yarn run grunt minify
+
XCOPY /S /I /E /H /Y "%WD%\web" "%PGBUILDPATH%\web" > nul
IF %ERRORLEVEL% NEQ 0 EXIT /B %ERRORLEVEL%
diff --git a/README b/README
index ff567db2..dfb4c5e1 100644
--- a/README
+++ b/README
@@ -196,6 +196,35 @@ http://www.tylerbutler.com/2012/05/how-to-install-python-pip-and-virtualenv-on-w
Once a virtual environment has been created and enabled, setup can continue
from step 4 above.
+
+Bundling Javascript
+-------------------
+
+The current build process for the JS frontend is: source_file.js(x) -> babel -> webpack -> bundled_output.js
+
+To setup your environment for building:
+
+ get Yarn: https://yarnpkg.com/en/docs/install
+ get grunt-cli:
+
+ $ yarn global add grunt-cli
+
+If you do not install the grunt cli, you will have to prepend each grunt command with "yarn run"
+
+Build:
+
+ (pgadmin4/web)$ yarn install
+ (pgadmin4/web)$ grunt bundle
+
+This will also run a linter against the js source files.
+
+For development, you may want to run:
+
+ (pgadmin4/web)$ grunt
+
+instead, as the default grunt task is configured to watch for changes and rerun.
+
+
Configuring the Runtime
-----------------------
diff --git a/pkg/mac/build.sh b/pkg/mac/build.sh
index a138a8a5..c13584e0 100755
--- a/pkg/mac/build.sh
+++ b/pkg/mac/build.sh
@@ -178,6 +178,11 @@ _complete_bundle() {
# run complete-bundle to copy the dependent libraries and frameworks and fix the rpaths
./complete-bundle.sh "$BUILDROOT/$APP_BUNDLE_NAME" || { echo complete-bundle.sh failed; exit 1; }
+ pushd $SOURCEDIR/web
+ yarn install
+ yarn run grunt minify
+ popd
+
# copy the web directory to the bundle as it is required by runtime
cp -r $SOURCEDIR/web "$BUILDROOT/$APP_BUNDLE_NAME/Contents/Resources/" || exit 1
cd "$BUILDROOT/$APP_BUNDLE_NAME/Contents/Resources/web"
diff --git a/pkg/pip/build.sh b/pkg/pip/build.sh
index 3ceaec4f..cc4c0d18 100755
--- a/pkg/pip/build.sh
+++ b/pkg/pip/build.sh
@@ -57,6 +57,15 @@ do
tar cf - $FILE | (cd ../pip-build/pgadmin4; tar xf -)
done
+yarn install
+yarn run grunt minify
+
+for FILE in `ls -d pgAdmin/static/js/generated/*`
+do
+ echo Adding $FILE
+ tar cf - $FILE | (cd ../pip-build/pgadmin4; tar xf -)
+done
+
cd ../docs
for FILE in `git ls-files`
do
diff --git a/pkg/src/build.sh b/pkg/src/build.sh
index a2c6f90e..1b2f765e 100755
--- a/pkg/src/build.sh
+++ b/pkg/src/build.sh
@@ -69,6 +69,17 @@ do
tar cf - $FILE | (cd src-build/$TARBALL_NAME; tar xf -)
done
+pushd web
+ yarn install
+ yarn run grunt minify
+
+ for FILE in `ls -d pgAdmin/static/js/generated/*`
+ do
+ echo Adding $FILE
+ tar cf - $FILE | (cd ../src-build/$TARBALL_NAME/web; tar xf -)
+ done
+popd
+
# Create the tarball
echo Creating tarball...
cd src-build
diff --git a/web/.eslintrc.js b/web/.eslintrc.js
new file mode 100644
index 00000000..c60569db
--- /dev/null
+++ b/web/.eslintrc.js
@@ -0,0 +1,45 @@
+module.exports = {
+ 'env': {
+ 'browser': true,
+ 'es6': true,
+ 'amd': true,
+ 'jasmine': true,
+ },
+ 'extends': 'eslint:recommended',
+ 'parserOptions': {
+ 'ecmaFeatures': {
+ 'experimentalObjectRestSpread': true,
+ 'jsx': true
+ },
+ 'sourceType': 'module'
+ },
+ 'plugins': [
+ 'react'
+ ],
+ 'globals': {
+ '_': true,
+ 'module': true,
+ },
+ 'rules': {
+ 'indent': [
+ 'error',
+ 2
+ ],
+ 'linebreak-style': [
+ 'error',
+ 'unix'
+ ],
+ 'quotes': [
+ 'error',
+ 'single'
+ ],
+ 'semi': [
+ 'error',
+ 'always'
+ ],
+ 'comma-dangle': [
+ 'error',
+ 'always-multiline'
+ ]
+ }
+};
\ No newline at end of file
diff --git a/web/Gruntfile.js b/web/Gruntfile.js
new file mode 100644
index 00000000..000224e4
--- /dev/null
+++ b/web/Gruntfile.js
@@ -0,0 +1,62 @@
+const webpackConfig = require('./webpack.config.js');
+
+var srcFiles = [
+ 'pgadmin/static/jsx/*.jsx',
+ 'pgadmin/static/js/selection/*.js',
+ 'regression/javascript/**.js',
+ 'regression/javascript/**/*.js',
+ '*.js',
+];
+
+module.exports = function (grunt) {
+ grunt.initConfig({
+ watch: {
+ files: srcFiles,
+ tasks: ['eslint', 'webpack'],
+ },
+ babel: {
+ options: {
+ sourceMap: true,
+ presets: ['react', 'es2015'],
+ },
+ dist: {
+ files: {
+ 'pgadmin/static/js/generated/reactComponents.js': 'pgadmin/static/jsx/components.jsx',
+ },
+ },
+ },
+ webpack: {
+ app: webpackConfig,
+ },
+ eslint: {
+ target: srcFiles,
+ },
+ karma: {
+ unit: {
+ configFile: 'karma.conf.js',
+ },
+ },
+ uglify: {
+ my_target: {
+ files: [{
+ expand: true,
+ cwd: 'pgadmin/static/js/generated',
+ src: '**/*.js',
+ dest: 'pgadmin/static/js/generated',
+ }],
+ },
+ },
+ });
+
+ grunt.loadNpmTasks('grunt-contrib-watch');
+ grunt.loadNpmTasks('grunt-webpack');
+ grunt.loadNpmTasks('grunt-eslint');
+ grunt.loadNpmTasks('grunt-karma');
+ grunt.loadNpmTasks('grunt-contrib-uglify');
+
+ grunt.registerTask('tests', ['eslint', 'karma']);
+
+ grunt.registerTask('bundle', ['eslint', 'webpack']);
+ grunt.registerTask('default', ['bundle', 'watch']);
+ grunt.registerTask('minify', ['bundle', 'uglify']);
+};
diff --git a/web/karma.conf.js b/web/karma.conf.js
index 95613f77..7fa51b50 100644
--- a/web/karma.conf.js
+++ b/web/karma.conf.js
@@ -1,75 +1,34 @@
-// Karma configuration
-// Generated on Wed Mar 01 2017 14:19:28 GMT-0500 (EST)
+const webpackConfig = require('./webpack.test.config.js');
-module.exports = function(config) {
+module.exports = function (config) {
config.set({
-
- // base path that will be used to resolve all patterns (eg. files, exclude)
- basePath: '',
-
-
- // frameworks to use
- // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
- frameworks: ['jasmine', 'requirejs'],
-
-
- // list of files / patterns to load in the browser
- files: [
- 'regression/javascript/test-main.js',
- {pattern: 'regression/javascript/**/*.js', included: false},
- {pattern: 'pgadmin/static/vendor/**/*.js', included: false},
- {pattern: 'pgadmin/static/js/**/*.js', included: false}
+ frameworks: ['jasmine'],
+ plugins: [
+ 'karma-webpack',
+ 'karma-phantomjs-launcher',
+ 'karma-jasmine',
+ 'karma-jasmine-html-reporter',
],
-
-
- // list of files to exclude
- exclude: [
- 'pgadmin/static/js/pgadmin.js',
- 'pgadmin/static/vendor/**/*[Tt]est.js',
- 'pgadmin/static/vendor/**/*[Ss]pec.js'
+ files: [
+ {pattern: 'pgadmin/static/**/*.js', included: false},
+ 'regression/javascript/**/*.jsx',
+ 'regression/javascript/**/*.js',
],
-
-
- // preprocess matching files before serving them to the browser
- // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
preprocessors: {
+ 'regression/javascript/**/*.js': ['webpack'],
+ // 'regression/javascript/**/*.jsx': ['webpack'],
},
-
-
- // test results reporter to use
- // possible values: 'dots', 'progress'
- // available reporters: https://npmjs.org/browse/keyword/karma-reporter
- reporters: ['progress'],
-
-
- // web server port
+ webpack: webpackConfig,
+ webpackMiddleware: {
+ stats: 'errors-only',
+ },
+ reporters: ['progress', 'kjhtml'],
port: 9876,
-
-
- // enable / disable colors in the output (reporters and logs)
colors: true,
-
-
- // level of logging
- // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
- logLevel: config.LOG_INFO,
-
-
- // enable / disable watching file and executing tests whenever any file changes
- autoWatch: false,
-
-
- // start these browsers
- // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
+ logLevel: config.LOG_WARN,
+ autoWatch: true,
browsers: ['PhantomJS'],
-
-
- // Continuous Integration mode
- // if true, Karma captures browsers, runs the tests and exits
- singleRun: true,
-
- // Concurrency level
- // how many browser should be started simultaneous
- concurrency: Infinity
- })
-}
+ singleRun: false,
+ concurrency: Infinity,
+ });
+};
diff --git a/web/package.json b/web/package.json
index 80e4e5ad..760e1e0c 100644
--- a/web/package.json
+++ b/web/package.json
@@ -1,10 +1,44 @@
{
"devDependencies": {
- "jasmine-core": "^2.5.2",
- "karma": "^1.5.0",
- "karma-jasmine": "^1.1.0",
- "karma-phantomjs-launcher": "^1.0.2",
- "karma-requirejs": "^1.1.0",
- "requirejs": "^2.3.3"
+ "babel-core": "~6.24.0",
+ "babel-loader": "~6.4.1",
+ "babel-preset-es2015": "~6.24.0",
+ "babel-preset-react": "~6.23.0",
+ "enzyme": "~2.8.2",
+ "eslint": "^3.19.0",
+ "eslint-plugin-react": "^6.10.3",
+ "grunt": "~1.0.1",
+ "grunt-contrib-uglify": "^3.0.0",
+ "grunt-contrib-watch": "~1.0.0",
+ "grunt-eslint": "^19.0.0",
+ "grunt-karma": "^2.0.0",
+ "grunt-webpack": "~2.0.1",
+ "jasmine-core": "~2.5.2",
+ "karma": "~1.5.0",
+ "karma-babel-preprocessor": "^6.0.1",
+ "karma-browserify": "~5.1.1",
+ "karma-jasmine": "~1.1.0",
+ "karma-jasmine-html-reporter": "~0.2.2",
+ "karma-phantomjs-launcher": "~1.0.2",
+ "karma-requirejs": "~1.1.0",
+ "karma-sourcemap-loader": "~0.3.7",
+ "karma-webpack": "~2.0.3",
+ "react-addons-test-utils": "~15.4.2",
+ "webpack": "~2.3.1"
+ },
+ "dependencies": {
+ "axios": "^0.16.1",
+ "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
+ "babel-polyfill": "^6.23.0",
+ "babel-preset-es2015-without-strict": "~0.0.4",
+ "babelify": "~7.3.0",
+ "browserify": "~14.1.0",
+ "exports-loader": "~0.6.4",
+ "imports-loader": "git+https://github.com/webpack-contrib/imports-loader.git#44d6f48463b256a17c1ba6fd9b5cc1449b4e379d",
+ "react": "~15.4.2",
+ "react-dom": "~15.4.2",
+ "requirejs": "~2.3.3",
+ "underscore": "~1.8.3",
+ "watchify": "~3.9.0"
}
}
diff --git a/web/pgAdmin4.py b/web/pgAdmin4.py
index 24e1564a..e56a6bbe 100644
--- a/web/pgAdmin4.py
+++ b/web/pgAdmin4.py
@@ -14,25 +14,40 @@ to start a web server."""
import os
import sys
-# We need to include the root directory in sys.path to ensure that we can
-# find everything we need when running in the standalone runtime.
+from pgadmin.tools.javascript.javascript_bundler import JavascriptBundler, JsState
+
root = os.path.dirname(os.path.realpath(__file__))
if sys.path[0] != root:
sys.path.insert(0, root)
import config
from pgadmin import create_app
+from pgadmin.utils import u, fs_encoding, file_quote
# Get the config database schema version. We store this in pgadmin.model
# as it turns out that putting it in the config files isn't a great idea
from pgadmin.model import SCHEMA_VERSION
config.SETTINGS_SCHEMA_VERSION = SCHEMA_VERSION
+##########################################################################
+# Sanity checks
+##########################################################################
+
+# Check if the database exists. If it does not, create it.
+if not os.path.isfile(config.SQLITE_PATH):
+ setupfile = os.path.join(
+ os.path.dirname(os.path.realpath(u(__file__, fs_encoding))), u'setup.py'
+ )
+ exec(open(file_quote(setupfile), 'r').read())
##########################################################################
-# Server starup
+# Server startup
##########################################################################
+# Build Javascript files
+javascriptBundler = JavascriptBundler()
+javascriptBundler.bundle()
+
# Create the app!
app = create_app()
@@ -41,6 +56,13 @@ if config.DEBUG:
else:
app.debug = False
+# respond to JS
+if javascriptBundler.report() == JsState.NONE:
+ app.logger.error("Unable to generate javascript")
+ app.logger.error("To run the app ensure that grunt is installed globally "
+ "and that yarn install command runs successfully")
+ raise Exception("No generated javascript, aborting")
+
# Start the web server. The port number should have already been set by the
# runtime if we're running in desktop mode, otherwise we'll just use the
# Flask default.
diff --git a/web/pgadmin/browser/static/vendor/aciTree/jquery.aciPlugin.min.js b/web/pgadmin/browser/static/vendor/aciTree/jquery.aciPlugin.min.js
index b315a857..ea3fd412 100755
--- a/web/pgadmin/browser/static/vendor/aciTree/jquery.aciPlugin.min.js
+++ b/web/pgadmin/browser/static/vendor/aciTree/jquery.aciPlugin.min.js
@@ -9,4 +9,4 @@
* Require jQuery Library >= v1.2.3 http://jquery.com
*/
-(function(d,c,e){if(typeof aciPluginClass!=="undefined"){return}var a;this.aciPluginClass=function(){};aciPluginClass.extend=function(g,j){i.extend=arguments.callee;function i(){if(a){this._instance={};return this.__construct.apply(this,arguments)}}a=false;i.prototype=new this();a=true;var h=this.prototype;for(var f in g){i.prototype[f]=((typeof g[f]=="function")&&(f!="proxy"))?(function(k){return function(){var p=this._parent;this._parent=h;var n=this._super;this._super=h[k];var o=this._private;if(this._instance&&j){var m=this._instance._private;if(m[j]===e){m[j]={nameSpace:"."+j}}this._private=m[j]}var l=g[k].apply(this,arguments);this._parent=p;this._super=n;this._private=o;return l}})(f):g[f]}return i};var b=0;aciPluginClass.aciPluginUi=aciPluginClass.extend({__construct:function(k,l,i,h,j){var f="."+k;var g=l.data(f);if(g){this._instance=g._instance;return g.__request(i,h,j)}l.data(f,this);d.extend(true,this._instance,{_private:{},nameSpace:f,jQuery:l,options:d.extend(true,{},d.fn[k].defaults,(typeof i=="object")?i:{}),index:b++,wasInit:false});this.__extend();return this.__request(i,h,j)},__extend:function(){},__request:function(g,f,h){if((g===e)||(typeof g=="object")){if(this._instance.options.autoInit){this.init()}}else{if(typeof g=="string"){switch(g){case"init":this.init();break;case"api":return{object:this};case"options":if(f===e){return{object:this.options()}}else{if(typeof f=="string"){return{object:this.options(f)}}else{this.options(f)}}break;case"option":this.option(f,h);break;case"destroy":this.destroy();break}}}return this._instance.jQuery},proxy:function(j,h){var m=c.Array.prototype.slice;var f=m.call(arguments,2);var i=this,g=i._parent,l=i._super,k=i._private;return function(){i._parent=g;i._super=l;i._private=k;return j.apply(i,h?f.concat([this],m.call(arguments)):f.concat(m.call(arguments)))}},init:function(){if(!this._instance.wasInit){this._instance.wasInit=true;return true}return false},wasInit:function(){return this._instance.wasInit},__parent:function(h,f,l){var m=f.split(".");if(m.length>1){var j=h,k;for(var g in m){k=j;j=j[m[g]]}l.name=m[g];return k}l.name=f;return h},options:function(f){if(f){var i={name:null};var h;if(typeof f=="string"){h=this.__parent(this._instance.options,f,i);return h[i.name]}else{for(var g in f){h=this.__parent(this._instance.options,g,i);h[i.name]=f[g]}}}else{return this._instance.options}},option:function(g,i){var h={name:null};var f=this.__parent(this._instance.options,g,h);f[h.name]=i},destroy:function(){if(this._instance.wasInit){this._instance.wasInit=false;this._instance.jQuery.removeData(this._instance.nameSpace);return true}return false}});aciPluginClass.plugins={};aciPluginClass.publish=function(f,g){d.fn[f]=function(j,m,n){var h=null;for(var l=0,k=this.length;l<k;l++){h=new aciPluginClass.plugins[f](f,d(this[l]),j,m,n);if(!(h instanceof d)){return h.object}}return this};d.fn[f].defaults=d.extend(true,{autoInit:true},(typeof g=="object")?g:{})};aciPluginClass.defaults=function(f,g){d.extend(true,d.fn[f].defaults,(typeof g=="object")?g:{})}})(jQuery,this);
+(function(d,c,e){if(typeof aciPluginClass!=="undefined"){return}var a;window.aciPluginClass=function(){};aciPluginClass.extend=function(g,j){i.extend=arguments.callee;function i(){if(a){this._instance={};return this.__construct.apply(this,arguments)}}a=false;i.prototype=new this();a=true;var h=this.prototype;for(var f in g){i.prototype[f]=((typeof g[f]=="function")&&(f!="proxy"))?(function(k){return function(){var p=this._parent;this._parent=h;var n=this._super;this._super=h[k];var o=this._private;if(this._instance&&j){var m=this._instance._private;if(m[j]===e){m[j]={nameSpace:"."+j}}this._private=m[j]}var l=g[k].apply(this,arguments);this._parent=p;this._super=n;this._private=o;return l}})(f):g[f]}return i};var b=0;aciPluginClass.aciPluginUi=aciPluginClass.extend({__construct:function(k,l,i,h,j){var f="."+k;var g=l.data(f);if(g){this._instance=g._instance;return g.__request(i,h,j)}l.data(f,this);d.extend(true,this._instance,{_private:{},nameSpace:f,jQuery:l,options:d.extend(true,{},d.fn[k].defaults,(typeof i=="object")?i:{}),index:b++,wasInit:false});this.__extend();return this.__request(i,h,j)},__extend:function(){},__request:function(g,f,h){if((g===e)||(typeof g=="object")){if(this._instance.options.autoInit){this.init()}}else{if(typeof g=="string"){switch(g){case"init":this.init();break;case"api":return{object:this};case"options":if(f===e){return{object:this.options()}}else{if(typeof f=="string"){return{object:this.options(f)}}else{this.options(f)}}break;case"option":this.option(f,h);break;case"destroy":this.destroy();break}}}return this._instance.jQuery},proxy:function(j,h){var m=c.Array.prototype.slice;var f=m.call(arguments,2);var i=this,g=i._parent,l=i._super,k=i._private;return function(){i._parent=g;i._super=l;i._private=k;return j.apply(i,h?f.concat([this],m.call(arguments)):f.concat(m.call(arguments)))}},init:function(){if(!this._instance.wasInit){this._instance.wasInit=true;return true}return false},wasInit:function(){return this._instance.wasInit},__parent:function(h,f,l){var m=f.split(".");if(m.length>1){var j=h,k;for(var g in m){k=j;j=j[m[g]]}l.name=m[g];return k}l.name=f;return h},options:function(f){if(f){var i={name:null};var h;if(typeof f=="string"){h=this.__parent(this._instance.options,f,i);return h[i.name]}else{for(var g in f){h=this.__parent(this._instance.options,g,i);h[i.name]=f[g]}}}else{return this._instance.options}},option:function(g,i){var h={name:null};var f=this.__parent(this._instance.options,g,h);f[h.name]=i},destroy:function(){if(this._instance.wasInit){this._instance.wasInit=false;this._instance.jQuery.removeData(this._instance.nameSpace);return true}return false}});aciPluginClass.plugins={};aciPluginClass.publish=function(f,g){d.fn[f]=function(j,m,n){var h=null;for(var l=0,k=this.length;l<k;l++){h=new aciPluginClass.plugins[f](f,d(this[l]),j,m,n);if(!(h instanceof d)){return h.object}}return this};d.fn[f].defaults=d.extend(true,{autoInit:true},(typeof g=="object")?g:{})};aciPluginClass.defaults=function(f,g){d.extend(true,d.fn[f].defaults,(typeof g=="object")?g:{})}})(jQuery,this);
diff --git a/web/pgadmin/browser/utils.py b/web/pgadmin/browser/utils.py
index 708bfdfb..993a5c6f 100644
--- a/web/pgadmin/browser/utils.py
+++ b/web/pgadmin/browser/utils.py
@@ -241,6 +241,7 @@ class NodeView(with_metaclass(MethodViewType, View)):
commands = cls.generate_ops()
+
for c in commands:
if c['with_id']:
blueprint.add_url_rule(
diff --git a/web/pgadmin/static/js/selection/clipboard.js b/web/pgadmin/static/js/selection/clipboard.js
index 9e20da7e..9794ae7e 100644
--- a/web/pgadmin/static/js/selection/clipboard.js
+++ b/web/pgadmin/static/js/selection/clipboard.js
@@ -1,7 +1,7 @@
define(['sources/gettext', 'alertify'], function (gettext, alertify) {
var clipboard = {
copyTextToClipboard: function (text) {
- var textArea = document.createElement("textarea");
+ var textArea = document.createElement('textarea');
//
// *** This styling is an extra step which is likely not required. ***
@@ -55,7 +55,7 @@ define(['sources/gettext', 'alertify'], function (gettext, alertify) {
}
document.body.removeChild(textArea);
- }
+ },
};
return clipboard;
});
\ No newline at end of file
diff --git a/web/pgadmin/static/js/selection/column_selector.js b/web/pgadmin/static/js/selection/column_selector.js
index c89b3fa8..a81b6918 100644
--- a/web/pgadmin/static/js/selection/column_selector.js
+++ b/web/pgadmin/static/js/selection/column_selector.js
@@ -2,18 +2,18 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func
var ColumnSelector = function () {
var init = function (grid) {
grid.onHeaderClick.subscribe(function (event, eventArgument) {
- var column = eventArgument.column;
+ var column = eventArgument.column;
- if (column.selectable !== false) {
+ if (column.selectable !== false) {
- if (!clickedCheckbox(event)) {
- var $checkbox = $("[data-id='checkbox-" + column.id + "']");
- toggleCheckbox($checkbox);
- }
-
- updateRanges(grid, column.id);
+ if (!clickedCheckbox(event)) {
+ var $checkbox = $('[data-id=\'checkbox-' + column.id + '\']');
+ toggleCheckbox($checkbox);
}
+
+ updateRanges(grid, column.id);
}
+ }
);
grid.getSelectionModel().onSelectedRangesChanged
.subscribe(handleSelectedRangesChanged.bind(null, grid));
@@ -52,14 +52,14 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func
};
var clickedCheckbox = function (e) {
- return e.target.type == "checkbox"
+ return e.target.type == 'checkbox';
};
var toggleCheckbox = function (checkbox) {
- if (checkbox.prop("checked")) {
- checkbox.prop("checked", false)
+ if (checkbox.prop('checked')) {
+ checkbox.prop('checked', false);
} else {
- checkbox.prop("checked", true)
+ checkbox.prop('checked', true);
}
};
@@ -67,15 +67,15 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func
return _.map(columnDefinitions, function (columnDefinition) {
if (columnDefinition.selectable !== false) {
var name =
- "<span data-cell-type='column-header-row' " +
- " data-test='output-column-header'>" +
- " <input data-id='checkbox-" + columnDefinition.id + "' " +
- " data-column-id='" + columnDefinition.id + "' " +
- " type='checkbox'/>" +
- " <span class='column-description'>" + columnDefinition.name + "</span>" +
- "</span>";
+ '<span data-cell-type=\'column-header-row\' ' +
+ ' data-test=\'output-column-header\'>' +
+ ' <input data-id=\'checkbox-' + columnDefinition.id + '\' ' +
+ ' data-column-id=\'' + columnDefinition.id + '\' ' +
+ ' type=\'checkbox\'/>' +
+ ' <span class=\'column-description\'>' + columnDefinition.name + '</span>' +
+ '</span>';
return _.extend(columnDefinition, {
- name: name
+ name: name,
});
} else {
return columnDefinition;
@@ -84,8 +84,8 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func
};
$.extend(this, {
- "init": init,
- "getColumnDefinitionsWithCheckboxes": getColumnDefinitionsWithCheckboxes
+ 'init': init,
+ 'getColumnDefinitionsWithCheckboxes': getColumnDefinitionsWithCheckboxes,
});
};
return ColumnSelector;
diff --git a/web/pgadmin/static/js/selection/copy_data.js b/web/pgadmin/static/js/selection/copy_data.js
index 018efead..0ccd4b96 100644
--- a/web/pgadmin/static/js/selection/copy_data.js
+++ b/web/pgadmin/static/js/selection/copy_data.js
@@ -5,48 +5,48 @@ define([
'sources/selection/range_selection_helper',
'sources/selection/range_boundary_navigator'],
function ($, _, clipboard, RangeSelectionHelper, rangeBoundaryNavigator) {
- var copyData = function () {
- var self = this;
-
- var grid = self.slickgrid;
- var columnDefinitions = grid.getColumns();
- var selectedRanges = grid.getSelectionModel().getSelectedRanges();
- var data = grid.getData();
- var rows = grid.getSelectedRows();
+ var copyData = function () {
+ var self = this;
+
+ var grid = self.slickgrid;
+ var columnDefinitions = grid.getColumns();
+ var selectedRanges = grid.getSelectionModel().getSelectedRanges();
+ var data = grid.getData();
+ var rows = grid.getSelectedRows();
+
+
+ if (allTheRangesAreFullRows(selectedRanges, columnDefinitions)) {
+ self.copied_rows = rows.map(function (rowIndex) {
+ return data[rowIndex];
+ });
+ setPasteRowButtonEnablement(self.can_edit, true);
+ } else {
+ self.copied_rows = [];
+ setPasteRowButtonEnablement(self.can_edit, false);
+ }
+
+ var csvText = rangeBoundaryNavigator.rangesToCsv(data, columnDefinitions, selectedRanges);
+ if (csvText) {
+ clipboard.copyTextToClipboard(csvText);
+ }
+ };
+
+ var setPasteRowButtonEnablement = function (canEditFlag, isEnabled) {
+ if (canEditFlag) {
+ $('#btn-paste-row').prop('disabled', !isEnabled);
+ }
+ };
+
+ var allTheRangesAreFullRows = function (ranges, columnDefinitions) {
+ var colRangeBounds = ranges.map(function (range) {
+ return [range.fromCell, range.toCell];
+ });
+ if(RangeSelectionHelper.isFirstColumnData(columnDefinitions)) {
+ return _.isEqual(_.union.apply(null, colRangeBounds), [0, columnDefinitions.length - 1]);
+ }
+ return _.isEqual(_.union.apply(null, colRangeBounds), [1, columnDefinitions.length - 1]);
+ };
- if (allTheRangesAreFullRows(selectedRanges, columnDefinitions)) {
- self.copied_rows = rows.map(function (rowIndex) {
- return data[rowIndex];
- });
- setPasteRowButtonEnablement(self.can_edit, true);
- } else {
- self.copied_rows = [];
- setPasteRowButtonEnablement(self.can_edit, false);
- }
-
- var csvText = rangeBoundaryNavigator.rangesToCsv(data, columnDefinitions, selectedRanges);
- if (csvText) {
- clipboard.copyTextToClipboard(csvText);
- }
- };
-
- var setPasteRowButtonEnablement = function (canEditFlag, isEnabled) {
- if (canEditFlag) {
- $("#btn-paste-row").prop('disabled', !isEnabled);
- }
- };
-
- var allTheRangesAreFullRows = function (ranges, columnDefinitions) {
- var colRangeBounds = ranges.map(function (range) {
- return [range.fromCell, range.toCell];
- });
-
- if(RangeSelectionHelper.isFirstColumnData(columnDefinitions)) {
- return _.isEqual(_.union.apply(null, colRangeBounds), [0, columnDefinitions.length - 1]);
- }
- return _.isEqual(_.union.apply(null, colRangeBounds), [1, columnDefinitions.length - 1]);
- };
-
- return copyData;
-});
+ return copyData;
+ });
diff --git a/web/pgadmin/static/js/selection/grid_selector.js b/web/pgadmin/static/js/selection/grid_selector.js
index 31aee69f..6317f44e 100644
--- a/web/pgadmin/static/js/selection/grid_selector.js
+++ b/web/pgadmin/static/js/selection/grid_selector.js
@@ -31,7 +31,7 @@ define(['jquery', 'sources/selection/column_selector', 'sources/selection/row_se
};
function handleSelectedRangesChanged(grid) {
- $("[data-id='checkbox-select-all']").prop("checked", isEntireGridSelected(grid));
+ $('[data-id=\'checkbox-select-all\']').prop('checked', isEntireGridSelected(grid));
}
function isEntireGridSelected(grid) {
@@ -44,7 +44,7 @@ define(['jquery', 'sources/selection/column_selector', 'sources/selection/row_se
if (isEntireGridSelected(grid)) {
deselect(grid);
} else {
- selectAll(grid)
+ selectAll(grid);
}
}
@@ -70,8 +70,8 @@ define(['jquery', 'sources/selection/column_selector', 'sources/selection/row_se
}
$.extend(this, {
- "init": init,
- "getColumnDefinitionsWithCheckboxes": getColumnDefinitionsWithCheckboxes
+ 'init': init,
+ 'getColumnDefinitionsWithCheckboxes': getColumnDefinitionsWithCheckboxes,
});
};
diff --git a/web/pgadmin/static/js/selection/range_boundary_navigator.js b/web/pgadmin/static/js/selection/range_boundary_navigator.js
index a268d245..f69540b9 100644
--- a/web/pgadmin/static/js/selection/range_boundary_navigator.js
+++ b/web/pgadmin/static/js/selection/range_boundary_navigator.js
@@ -99,13 +99,13 @@ define(['sources/selection/range_selection_helper'], function (RangeSelectionHel
var val = data[rowId][columnDefinitions[colId].pos];
if (val && _.isObject(val)) {
- val = "'" + JSON.stringify(val) + "'";
- } else if (val && typeof val != "number" && typeof val != "boolean") {
- val = "'" + val.toString() + "'";
+ val = '\'' + JSON.stringify(val) + '\'';
+ } else if (val && typeof val != 'number' && typeof val != 'boolean') {
+ val = '\'' + val.toString() + '\'';
} else if (_.isNull(val) || _.isUndefined(val)) {
val = '';
}
return val;
- }
+ },
};
});
\ No newline at end of file
diff --git a/web/pgadmin/static/js/selection/range_selection_helper.js b/web/pgadmin/static/js/selection/range_selection_helper.js
index 31ad3bf7..4bd55975 100644
--- a/web/pgadmin/static/js/selection/range_selection_helper.js
+++ b/web/pgadmin/static/js/selection/range_selection_helper.js
@@ -8,14 +8,14 @@ define(['slickgrid'], function () {
var isRangeSelected = function (selectedRanges, range) {
return _.any(selectedRanges, function (selectedRange) {
- return isSameRange(selectedRange, range)
- })
+ return isSameRange(selectedRange, range);
+ });
};
var removeRange = function (selectedRanges, range) {
return _.filter(selectedRanges, function (selectedRange) {
- return !(isSameRange(selectedRange, range))
- })
+ return !(isSameRange(selectedRange, range));
+ });
};
var addRange = function (ranges, range) {
@@ -26,15 +26,15 @@ define(['slickgrid'], function () {
var areAllRangesRows = function (ranges, grid) {
return _.every(ranges, function (range) {
return range.fromRow == range.toRow &&
- range.fromCell == 1 && range.toCell == grid.getColumns().length - 1
- })
+ range.fromCell == 1 && range.toCell == grid.getColumns().length - 1;
+ });
};
var areAllRangesColumns = function (ranges, grid) {
return _.every(ranges, function (range) {
return range.fromCell == range.toCell &&
- range.fromRow == 0 && range.toRow == grid.getDataLength() - 1
- })
+ range.fromRow == 0 && range.toRow == grid.getDataLength() - 1;
+ });
};
var rangeForRow = function (grid, rowId) {
@@ -46,8 +46,8 @@ define(['slickgrid'], function () {
};
function rangeForColumn(grid, columnIndex) {
- return new Slick.Range(0, columnIndex, grid.getDataLength() - 1, columnIndex)
- };
+ return new Slick.Range(0, columnIndex, grid.getDataLength() - 1, columnIndex);
+ }
var getRangeOfWholeGrid = function (grid) {
return new Slick.Range(0, 1, grid.getDataLength() - 1, grid.getColumns().length - 1);
@@ -73,6 +73,6 @@ define(['slickgrid'], function () {
rangeForColumn: rangeForColumn,
isEntireGridSelected: isEntireGridSelected,
getRangeOfWholeGrid: getRangeOfWholeGrid,
- isFirstColumnData: isFirstColumnData
- }
+ isFirstColumnData: isFirstColumnData,
+ };
});
\ No newline at end of file
diff --git a/web/pgadmin/static/js/selection/row_selector.js b/web/pgadmin/static/js/selection/row_selector.js
index 76a8c1a7..583f8a75 100644
--- a/web/pgadmin/static/js/selection/row_selector.js
+++ b/web/pgadmin/static/js/selection/row_selector.js
@@ -8,18 +8,18 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func
grid.getSelectionModel()
.onSelectedRangesChanged.subscribe(handleSelectedRangesChanged.bind(null, grid));
gridEventBus
- .subscribe(grid.onClick, handleClick.bind(null, grid))
+ .subscribe(grid.onClick, handleClick.bind(null, grid));
};
var handleClick = function (grid, event, args) {
if (grid.getColumns()[args.cell].id === 'row-header-column') {
- if (event.target.type != "checkbox") {
+ if (event.target.type != 'checkbox') {
var checkbox = $(event.target).find('input[type="checkbox"]');
toggleCheckbox($(checkbox));
}
updateRanges(grid, args.row);
}
- }
+ };
var handleSelectedRangesChanged = function (grid, event, ranges) {
$('[data-cell-type="row-header-checkbox"]:checked')
@@ -32,7 +32,7 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func
toggleCheckbox($checkbox);
}
});
- }
+ };
var updateRanges = function (grid, rowId) {
var selectionModel = grid.getSelectionModel();
@@ -51,13 +51,13 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func
}
}
selectionModel.setSelectedRanges(newRanges);
- }
+ };
var toggleCheckbox = function (checkbox) {
- if (checkbox.prop("checked")) {
- checkbox.prop("checked", false)
+ if (checkbox.prop('checked')) {
+ checkbox.prop('checked', false);
} else {
- checkbox.prop("checked", true)
+ checkbox.prop('checked', true);
}
};
@@ -70,15 +70,15 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func
formatter: function (rowIndex) {
return '<input type="checkbox" ' +
'data-row="' + rowIndex + '" ' +
- 'data-cell-type="row-header-checkbox"/>'
- }
+ 'data-cell-type="row-header-checkbox"/>';
+ },
});
return columnDefinitions;
};
$.extend(this, {
- "init": init,
- "getColumnDefinitionsWithCheckboxes": getColumnDefinitionsWithCheckboxes
+ 'init': init,
+ 'getColumnDefinitionsWithCheckboxes': getColumnDefinitionsWithCheckboxes,
});
};
return RowSelector;
diff --git a/web/pgadmin/static/jsx/components.jsx b/web/pgadmin/static/jsx/components.jsx
new file mode 100644
index 00000000..5bcb5208
--- /dev/null
+++ b/web/pgadmin/static/jsx/components.jsx
@@ -0,0 +1,8 @@
+
+import React from 'react';
+import {render} from 'react-dom';
+
+export {
+ render,
+ React,
+};
\ No newline at end of file
diff --git a/web/pgadmin/tools/javascript/__init__.py b/web/pgadmin/tools/javascript/__init__.py
new file mode 100644
index 00000000..9e55d2b2
--- /dev/null
+++ b/web/pgadmin/tools/javascript/__init__.py
@@ -0,0 +1,6 @@
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
diff --git a/web/pgadmin/tools/javascript/javascript_bundler.py b/web/pgadmin/tools/javascript/javascript_bundler.py
new file mode 100644
index 00000000..d74e3cbe
--- /dev/null
+++ b/web/pgadmin/tools/javascript/javascript_bundler.py
@@ -0,0 +1,63 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import os
+from contextlib import contextmanager
+from subprocess import call
+from pgadmin.utils import u, fs_encoding, file_quote
+
+
+# enum-like for tracking whether we have
+class JsState:
+ NONE = 0
+ OLD = 1
+ NEW = 2
+
+
+class JavascriptBundler:
+ """Builds Javascript bundle files by delegating to webpack"""
+
+ def __init__(self):
+ self.jsState = JsState.NONE
+
+ def bundle(self):
+ try:
+ try_building_js()
+ self.jsState = JsState.NEW
+ except OSError:
+ webdir_path()
+ generatedJavascriptDir = os.path.join(webdir_path(), 'pgadmin', 'static', 'js', 'generated')
+ if os.path.exists(generatedJavascriptDir) and os.listdir(generatedJavascriptDir):
+ self.jsState = JsState.OLD
+ else:
+ self.jsState = JsState.NONE
+
+ def report(self):
+ return self.jsState
+
+
+@contextmanager
+def pushd(new_dir):
+ previous_dir = os.getcwd()
+ os.chdir(new_dir)
+ yield
+ os.chdir(previous_dir)
+
+
+def webdir_path():
+ dirname = os.path.dirname
+ thisPath = os.path.realpath(u(__file__, fs_encoding))
+ return dirname(dirname(dirname(dirname(thisPath))))
+
+
+def try_building_js():
+ node_modules_dir = os.path.join(webdir_path(), 'node_modules', '.bin')
+ with pushd(node_modules_dir):
+ if call(['grunt', 'webpack']) != 0:
+ raise OSError('Error executing grunt')
diff --git a/web/pgadmin/tools/javascript/tests/__init__.py b/web/pgadmin/tools/javascript/tests/__init__.py
new file mode 100644
index 00000000..9e55d2b2
--- /dev/null
+++ b/web/pgadmin/tools/javascript/tests/__init__.py
@@ -0,0 +1,6 @@
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
diff --git a/web/pgadmin/tools/javascript/tests/test_javascript_bundler.py b/web/pgadmin/tools/javascript/tests/test_javascript_bundler.py
new file mode 100644
index 00000000..8c8533c4
--- /dev/null
+++ b/web/pgadmin/tools/javascript/tests/test_javascript_bundler.py
@@ -0,0 +1,114 @@
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+
+import sys
+
+from pgadmin.utils.route import BaseTestGenerator
+if sys.version_info < (3, 3):
+ import mock
+else:
+ import unittest.mock as mock
+
+
+class JavascriptBundlerTestCase(BaseTestGenerator):
+ """This tests that the javascript bundler tool causes grunt to build,
+ and can be invoked before and after app start correctly"""
+
+ scenarios = [('scenario name: JavascriptBundlerTestCase', dict())]
+
+ def setUp(self):
+ self.mockSubprocess = mock.Mock()
+ self.mockOs = mock.Mock()
+ sys.modules['subprocess'] = self.mockSubprocess
+ sys.modules['os'] = self.mockOs
+
+ def runTest(self):
+ from pgadmin.tools.javascript.javascript_bundler import JavascriptBundler
+ from pgadmin.tools.javascript.javascript_bundler import JsState
+ self.JavascriptBundler = JavascriptBundler
+ self.JsState = JsState
+
+ self._bundling_succeeds()
+ self.resetTestState()
+ self._bundling_fails_and_there_is_no_existing_bundle()
+ self.resetTestState()
+ self._bundling_fails_when_grunt_returns_nonzero()
+ self.resetTestState()
+ self._bundling_fails_and_there_is_no_existing_bundle_directory()
+ self.resetTestState()
+ self._bundling_fails_but_there_was_existing_bundle()
+ self.resetTestState()
+
+ def resetTestState(self):
+ self.mockSubprocess.reset_mock()
+ self.mockSubprocess.call.side_effect = None
+ self.mockOs.reset_mock()
+ self.mockOs.listdir.side_effect = None
+ self.mockOs.path.exists.side_effect = None
+
+ def _bundling_succeeds(self):
+ javascriptBundler = self.JavascriptBundler()
+ self.assertEqual(len(self.mockSubprocess.method_calls), 0)
+ self.mockSubprocess.call.return_value = 0
+
+ self.mockOs.listdir.return_value = [u'history.js', u'reactComponents.js']
+
+ javascriptBundler.bundle()
+ self.mockSubprocess.call.assert_called_once_with(['grunt', 'webpack'])
+
+ reportedState = javascriptBundler.report()
+ expectedState = self.JsState.NEW
+ self.assertEqual(reportedState, expectedState)
+
+ def _bundling_fails_when_grunt_returns_nonzero(self):
+ javascriptBundler = self.JavascriptBundler()
+ self.assertEqual(len(self.mockSubprocess.method_calls), 0)
+ self.mockOs.listdir.return_value = []
+ self.mockSubprocess.call.return_value = 99
+
+ javascriptBundler.bundle()
+
+ reportedState = javascriptBundler.report()
+ expectedState = self.JsState.NONE
+ self.assertEqual(reportedState, expectedState)
+
+ def _bundling_fails_and_there_is_no_existing_bundle(self):
+ javascriptBundler = self.JavascriptBundler()
+ self.mockSubprocess.call.side_effect = OSError("mock exception behavior")
+ self.mockOs.path.exists.return_value = True
+ self.mockOs.listdir.return_value = []
+
+ javascriptBundler.bundle()
+
+ reportedState = javascriptBundler.report()
+ expectedState = self.JsState.NONE
+ self.assertEqual(reportedState, expectedState)
+
+ def _bundling_fails_and_there_is_no_existing_bundle_directory(self):
+ javascriptBundler = self.JavascriptBundler()
+ self.mockSubprocess.call.side_effect = OSError("mock exception behavior")
+ self.mockOs.path.exists.return_value = False
+ self.mockOs.listdir.side_effect = OSError("mock exception behavior")
+
+ javascriptBundler.bundle()
+
+ reportedState = javascriptBundler.report()
+ expectedState = self.JsState.NONE
+ self.assertEqual(reportedState, expectedState)
+
+ def _bundling_fails_but_there_was_existing_bundle(self):
+ javascriptBundler = self.JavascriptBundler()
+ self.mockSubprocess.call.side_effect = OSError("mock exception behavior")
+ self.mockOs.path.exists.return_value = True
+ self.mockOs.listdir.return_value = [u'history.js', u'reactComponents.js']
+
+ javascriptBundler.bundle()
+ self.mockSubprocess.call.assert_called_once_with(['grunt', 'webpack'])
+
+ reportedState = javascriptBundler.report()
+ expectedState = self.JsState.OLD
+ self.assertEqual(reportedState, expectedState)
diff --git a/web/regression/README b/web/regression/README
index f0d7282e..7bb61ab0 100644
--- a/web/regression/README
+++ b/web/regression/README
@@ -177,16 +177,16 @@ Javascript Tests:
sudo port install nodejs7 yarn
+- See also the top-level pgadmin/README : Bundling Javascript
+
- Javascript tests must be run from the web directory (since that is where node_modules and karma.conf reside):
cd web/
- Install the JS modules required for testing:
- yarn
+ yarn install
- Now run the tests:
- yarn run karma start --single-run
-
-
+ grunt tests
diff --git a/web/regression/javascript/fake_translations.js b/web/regression/javascript/fake_translations.js
index 9516fd63..a3d4f5bd 100644
--- a/web/regression/javascript/fake_translations.js
+++ b/web/regression/javascript/fake_translations.js
@@ -8,5 +8,5 @@
//////////////////////////////////////////////////////////////////////////
define(function () {
- return {}
+ return {};
});
\ No newline at end of file
diff --git a/web/regression/javascript/gettext_spec.js b/web/regression/javascript/gettext_spec.js
index 2ce98a23..54fc498d 100644
--- a/web/regression/javascript/gettext_spec.js
+++ b/web/regression/javascript/gettext_spec.js
@@ -7,45 +7,46 @@
//
//////////////////////////////////////////////////////////////////////////
-define(["sources/gettext", "translations"], function (gettext, translations) {
- describe("translate", function () {
- describe("when there is no translation", function () {
- it("returns the original string", function () {
- expect(gettext("something to be translated")).toEqual("something to be translated");
- });
-
- describe("when there are substitutions", function () {
- it("interpolates a substitution", function () {
- expect(gettext("translate text for %(person)s", {"person": "Sarah"})).toEqual("translate text for Sarah")
- });
-
- it("interpolates multiple substitutions", function () {
- expect(gettext("translate '%(text)s' for %(person)s",
- {
- "text": "constitution",
- "person": "Sarah"
- }
- )).toEqual("translate 'constitution' for Sarah")
- });
- });
+import gettext from 'sources/gettext';
+import translations from 'translations';
+describe('translate', function () {
+ describe('when there is no translation', function () {
+ it('returns the original string', function () {
+ expect(gettext('something to be translated')).toEqual('something to be translated');
});
- describe("when there is a translation", function () {
- beforeEach(function () {
- translations['something to be translated'] = 'etwas zum uebersetzen';
- translations['another translation for %(person)s'] = 'eine weitere Uebersetzung fuer %(person)s';
+ describe('when there are substitutions', function () {
+ it('interpolates a substitution', function () {
+ expect(gettext('translate text for %(person)s', {'person': 'Sarah'})).toEqual('translate text for Sarah');
});
- it("returns the translation", function () {
- expect(gettext("something to be translated")).toEqual("etwas zum uebersetzen");
+ it('interpolates multiple substitutions', function () {
+ expect(gettext('translate \'%(text)s\' for %(person)s',
+ {
+ 'text': 'constitution',
+ 'person': 'Sarah',
+ }
+ )).toEqual('translate \'constitution\' for Sarah');
});
+ });
+
+ });
+
+ describe('when there is a translation', function () {
+ beforeEach(function () {
+ translations['something to be translated'] = 'etwas zum uebersetzen';
+ translations['another translation for %(person)s'] = 'eine weitere Uebersetzung fuer %(person)s';
+ });
+
+ it('returns the translation', function () {
+ expect(gettext('something to be translated')).toEqual('etwas zum uebersetzen');
+ });
- describe("when there is a substitution", function () {
- it("interpolates the substitution", function () {
- expect(gettext("another translation for %(person)s", {"person": "Sarah"}))
- .toEqual("eine weitere Uebersetzung fuer Sarah");
- });
+ describe('when there is a substitution', function () {
+ it('interpolates the substitution', function () {
+ expect(gettext('another translation for %(person)s', {'person': 'Sarah'}))
+ .toEqual('eine weitere Uebersetzung fuer Sarah');
});
});
});
diff --git a/web/regression/javascript/jasmine_capture_warnings_beforeall.js b/web/regression/javascript/jasmine_capture_warnings_beforeall.js
new file mode 100644
index 00000000..a83e6f61
--- /dev/null
+++ b/web/regression/javascript/jasmine_capture_warnings_beforeall.js
@@ -0,0 +1,23 @@
+//////////////////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////////////////
+
+/* eslint-disable no-console */
+
+beforeAll(function () {
+ spyOn(console, 'warn').and.callThrough();
+ spyOn(console, 'error').and.callThrough();
+});
+
+afterEach(function (done) {
+ setTimeout(function () {
+ expect(console.warn).not.toHaveBeenCalled();
+ expect(console.error).not.toHaveBeenCalled();
+ done();
+ }, 0);
+});
\ No newline at end of file
diff --git a/web/regression/javascript/selection/column_selector_spec.js b/web/regression/javascript/selection/column_selector_spec.js
index 947f4852..2cba0af5 100644
--- a/web/regression/javascript/selection/column_selector_spec.js
+++ b/web/regression/javascript/selection/column_selector_spec.js
@@ -1,235 +1,243 @@
-define(
- ["jquery",
- "underscore",
- "slickgrid/slick.grid",
- "sources/selection/column_selector",
- "slickgrid/slick.rowselectionmodel",
- "slickgrid"
- ],
- function ($, _, SlickGrid, ColumnSelector, RowSelectionModel, Slick) {
- describe("ColumnSelector", function () {
- var container, data, columns, options;
+//////////////////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////////////////
+
+import $ from 'jquery';
+
+import Slick from 'slickgrid';
+import 'slickgrid.grid';
+
+import RowSelectionModel from '../../../pgadmin/static/vendor/slickgrid/plugins/slick.rowselectionmodel';
+import ColumnSelector from '../../../pgadmin/static/js/selection/column_selector';
+
+
+describe('ColumnSelector', function () {
+ var container, data, columns, options;
+ beforeEach(function () {
+ container = $('<div></div>');
+ container.height(9999);
+
+ data = [{'some-column-name': 'first value', 'second column': 'second value'}];
+
+ columns = [
+ {
+ id: '1',
+ name: 'some-column-name',
+ },
+ {
+ id: '2',
+ name: 'second column',
+ },
+ {
+ name: 'some-non-selectable-column',
+ selectable: false,
+ },
+ ];
+ });
+
+ describe('when a column is not selectable', function () {
+ it('does not create a checkbox for selecting the column', function () {
+ var checkboxColumn = {
+ name: 'some-column-name-4',
+ selectable: false,
+ };
+ columns.push(checkboxColumn);
+
+ setupGrid(columns);
+
+ expect(container.find('.slick-header-columns input').length).toBe(2);
+ });
+ });
+
+ it('renders a checkbox in the column header', function () {
+ setupGrid(columns);
+
+ expect(container.find('.slick-header-columns input').length).toBe(2);
+ });
+
+ it('displays the name of the column', function () {
+ setupGrid(columns);
+
+ expect($(container.find('.slick-header-columns .slick-column-name')[0]).text())
+ .toContain('some-column-name');
+ expect($(container.find('.slick-header-columns .slick-column-name')[1]).text())
+ .toContain('second column');
+ });
+
+ it('preserves the other attributes of column definitions', function () {
+ var columnSelector = new ColumnSelector();
+ var selectableColumns = columnSelector.getColumnDefinitionsWithCheckboxes(columns);
+
+ expect(selectableColumns[0].id).toBe('1');
+ });
+
+ describe('selecting columns', function () {
+ var grid, rowSelectionModel;
+ beforeEach(function () {
+ var columnSelector = new ColumnSelector();
+ columns = columnSelector.getColumnDefinitionsWithCheckboxes(columns);
+ data = [];
+ for (var i = 0; i < 10; i++) {
+ data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i});
+ }
+ grid = new Slick.Grid(container, data, columns, options);
+
+ rowSelectionModel = new RowSelectionModel();
+ grid.setSelectionModel(rowSelectionModel);
+
+ grid.registerPlugin(columnSelector);
+ grid.invalidate();
+ $('body').append(container);
+ });
+
+ afterEach(function () {
+ $('body').find(container).remove();
+ });
+
+ describe('when the user clicks a column header', function () {
+ it('selects the column', function () {
+ container.find('.slick-header-column')[0].click();
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+ expectOnlyTheFirstColumnToBeSelected(selectedRanges);
+ });
+ });
+
+ describe('when the user clicks additional column headers', function () {
+ beforeEach(function () {
+ container.find('.slick-header-column')[1].click();
+ });
+
+ it('selects additional columns', function () {
+ container.find('.slick-header-column')[0].click();
+
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+ var column1 = selectedRanges[0];
+
+ expect(selectedRanges.length).toEqual(2);
+ expect(column1.fromCell).toBe(1);
+ expect(column1.toCell).toBe(1);
+
+ var column2 = selectedRanges[1];
+
+ expect(column2.fromCell).toBe(0);
+ expect(column2.toCell).toBe(0);
+ });
+ });
+
+ describe('when the user clicks a column header checkbox', function () {
+ it('selects the column', function () {
+ container.find('.slick-header-columns input')[0].click();
+
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+ expectOnlyTheFirstColumnToBeSelected(selectedRanges);
+ });
+
+ it('checks the checkbox', function () {
+ container.find('.slick-header-column')[1].click();
+ expect($(container.find('.slick-header-columns input')[1]).is(':checked')).toBeTruthy();
+ });
+ });
+
+ describe('when a row is selected', function () {
beforeEach(function () {
- container = $("<div></div>");
- container.height(9999);
-
- data = [{'some-column-name': 'first value', 'second column': 'second value'}];
-
- columns = [
- {
- id: '1',
- name: 'some-column-name',
- },
- {
- id: '2',
- name: 'second column',
- },
- {
- name: 'some-non-selectable-column',
- selectable: false
- }
- ]
+ var selectedRanges = [new Slick.Range(0, 0, 0, 1)];
+ rowSelectionModel.setSelectedRanges(selectedRanges);
});
- describe("when a column is not selectable", function () {
- it("does not create a checkbox for selecting the column", function () {
- var checkboxColumn = {
- name: 'some-column-name-4',
- selectable: false
- };
- columns.push(checkboxColumn);
+ it('deselects the row', function () {
+ container.find('.slick-header-column')[1].click();
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
- setupGrid(columns);
+ expect(selectedRanges.length).toBe(1);
- expect(container.find('.slick-header-columns input').length).toBe(2)
- });
+ var column = selectedRanges[0];
+
+ expect(column.fromCell).toBe(1);
+ expect(column.toCell).toBe(1);
+ expect(column.fromRow).toBe(0);
+ expect(column.toRow).toBe(9);
});
+ });
- it("renders a checkbox in the column header", function () {
- setupGrid(columns);
+ describe('clicking a second time', function () {
+ beforeEach(function () {
+ container.find('.slick-header-column')[1].click();
+ });
- expect(container.find('.slick-header-columns input').length).toBe(2)
+ it('unchecks checkbox', function () {
+ container.find('.slick-header-column')[1].click();
+ expect($(container.find('.slick-header-columns input')[1]).is(':checked')).toBeFalsy();
});
- it("displays the name of the column", function () {
- setupGrid(columns);
+ it('deselects the column', function () {
+ container.find('.slick-header-column')[1].click();
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
- expect($(container.find('.slick-header-columns .slick-column-name')[0]).text())
- .toContain('some-column-name');
- expect($(container.find('.slick-header-columns .slick-column-name')[1]).text())
- .toContain('second column');
+ expect(selectedRanges.length).toEqual(0);
});
+ });
- it("preserves the other attributes of column definitions", function () {
- var columnSelector = new ColumnSelector();
- var selectableColumns = columnSelector.getColumnDefinitionsWithCheckboxes(columns);
+ describe('when the column is not selectable', function () {
+ it('does not select the column', function () {
+ $(container.find('.slick-header-column:contains(some-non-selectable-column)')).click();
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
- expect(selectableColumns[0].id).toBe('1');
+ expect(selectedRanges.length).toEqual(0);
});
+ });
- describe("selecting columns", function () {
- var grid, rowSelectionModel;
- beforeEach(function () {
- var columnSelector = new ColumnSelector();
- columns = columnSelector.getColumnDefinitionsWithCheckboxes(columns);
- data = [];
- for (var i = 0; i < 10; i++) {
- data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i});
- }
- grid = new SlickGrid(container, data, columns, options);
-
- rowSelectionModel = new RowSelectionModel();
- grid.setSelectionModel(rowSelectionModel);
-
- grid.registerPlugin(columnSelector);
- grid.invalidate();
- $("body").append(container);
- });
-
- afterEach(function () {
- $("body").find(container).remove();
- });
-
- describe("when the user clicks a column header", function () {
- it("selects the column", function () {
- container.find('.slick-header-column')[0].click();
- var selectedRanges = rowSelectionModel.getSelectedRanges();
- expectOnlyTheFirstColumnToBeSelected(selectedRanges);
- });
- });
-
- describe("when the user clicks additional column headers", function () {
- beforeEach(function () {
- container.find('.slick-header-column')[1].click();
- });
-
- it("selects additional columns", function () {
- container.find('.slick-header-column')[0].click();
-
- var selectedRanges = rowSelectionModel.getSelectedRanges();
- var column1 = selectedRanges[0];
-
- expect(selectedRanges.length).toEqual(2);
- expect(column1.fromCell).toBe(1);
- expect(column1.toCell).toBe(1);
-
- var column2 = selectedRanges[1];
-
- expect(column2.fromCell).toBe(0);
- expect(column2.toCell).toBe(0);
- });
- });
-
- describe("when the user clicks a column header checkbox", function () {
- it("selects the column", function () {
- container.find('.slick-header-columns input')[0].click();
-
- var selectedRanges = rowSelectionModel.getSelectedRanges();
- expectOnlyTheFirstColumnToBeSelected(selectedRanges);
- });
-
- it("checks the checkbox", function () {
- container.find('.slick-header-column')[1].click();
- expect($(container.find('.slick-header-columns input')[1]).is(':checked')).toBeTruthy();
- });
- });
-
- describe("when a row is selected", function () {
- beforeEach(function () {
- var selectedRanges = [new Slick.Range(0, 0, 0, 1)];
- rowSelectionModel.setSelectedRanges(selectedRanges);
- });
-
- it("deselects the row", function () {
- container.find('.slick-header-column')[1].click();
- var selectedRanges = rowSelectionModel.getSelectedRanges();
-
- expect(selectedRanges.length).toBe(1);
-
- var column = selectedRanges[0];
-
- expect(column.fromCell).toBe(1);
- expect(column.toCell).toBe(1);
- expect(column.fromRow).toBe(0);
- expect(column.toRow).toBe(9);
- })
- });
-
- describe("clicking a second time", function () {
- beforeEach(function () {
- container.find('.slick-header-column')[1].click();
- });
-
- it("unchecks checkbox", function () {
- container.find('.slick-header-column')[1].click();
- expect($(container.find('.slick-header-columns input')[1]).is(':checked')).toBeFalsy();
- });
-
- it("deselects the column", function () {
- container.find('.slick-header-column')[1].click();
- var selectedRanges = rowSelectionModel.getSelectedRanges();
-
- expect(selectedRanges.length).toEqual(0);
- })
- });
-
- describe("when the column is not selectable", function () {
- it("does not select the column", function () {
- $(container.find('.slick-header-column:contains(some-non-selectable-column)')).click();
- var selectedRanges = rowSelectionModel.getSelectedRanges();
-
- expect(selectedRanges.length).toEqual(0);
- });
- });
-
- describe("when the column is deselected through setSelectedRanges", function () {
- beforeEach(function () {
- container.find('.slick-header-column')[1].click();
- });
-
- it("unchecks the checkbox", function () {
- rowSelectionModel.setSelectedRanges([]);
-
- expect($(container.find('.slick-header-columns input')[1])
- .is(':checked')).toBeFalsy();
- });
- });
-
- describe("when a non-column range was already selected", function () {
- beforeEach(function () {
- var selectedRanges = [new Slick.Range(0, 0, 1, 0)];
- rowSelectionModel.setSelectedRanges(selectedRanges);
- });
-
- it("deselects the non-column range", function () {
- container.find('.slick-header-column')[0].click();
-
- var selectedRanges = rowSelectionModel.getSelectedRanges();
- expectOnlyTheFirstColumnToBeSelected(selectedRanges);
- })
- });
+ describe('when the column is deselected through setSelectedRanges', function () {
+ beforeEach(function () {
+ container.find('.slick-header-column')[1].click();
});
- var setupGrid = function (columns) {
- var columnSelector = new ColumnSelector();
- columns = columnSelector.getColumnDefinitionsWithCheckboxes(columns);
- var grid = new SlickGrid(container, data, columns, options);
+ it('unchecks the checkbox', function () {
+ rowSelectionModel.setSelectedRanges([]);
- var rowSelectionModel = new RowSelectionModel();
- grid.setSelectionModel(rowSelectionModel);
+ expect($(container.find('.slick-header-columns input')[1])
+ .is(':checked')).toBeFalsy();
+ });
+ });
- grid.registerPlugin(columnSelector);
- grid.invalidate();
- };
+ describe('when a non-column range was already selected', function () {
+ beforeEach(function () {
+ var selectedRanges = [new Slick.Range(0, 0, 1, 0)];
+ rowSelectionModel.setSelectedRanges(selectedRanges);
+ });
- function expectOnlyTheFirstColumnToBeSelected(selectedRanges) {
- var row = selectedRanges[0];
+ it('deselects the non-column range', function () {
+ container.find('.slick-header-column')[0].click();
- expect(selectedRanges.length).toEqual(1);
- expect(row.fromCell).toBe(0);
- expect(row.toCell).toBe(0);
- expect(row.fromRow).toBe(0);
- expect(row.toRow).toBe(9);
- }
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+ expectOnlyTheFirstColumnToBeSelected(selectedRanges);
+ });
});
});
+
+ var setupGrid = function (columns) {
+ var columnSelector = new ColumnSelector();
+ columns = columnSelector.getColumnDefinitionsWithCheckboxes(columns);
+ var grid = new Slick.Grid(container, data, columns, options);
+
+ var rowSelectionModel = new RowSelectionModel();
+ grid.setSelectionModel(rowSelectionModel);
+
+ grid.registerPlugin(columnSelector);
+ grid.invalidate();
+ };
+
+ function expectOnlyTheFirstColumnToBeSelected(selectedRanges) {
+ var row = selectedRanges[0];
+
+ expect(selectedRanges.length).toEqual(1);
+ expect(row.fromCell).toBe(0);
+ expect(row.toCell).toBe(0);
+ expect(row.fromRow).toBe(0);
+ expect(row.toRow).toBe(9);
+ }
+});
diff --git a/web/regression/javascript/selection/copy_data_spec.js b/web/regression/javascript/selection/copy_data_spec.js
index affad66e..ffb0deca 100644
--- a/web/regression/javascript/selection/copy_data_spec.js
+++ b/web/regression/javascript/selection/copy_data_spec.js
@@ -1,119 +1,128 @@
-define(
- ["jquery",
- "slickgrid/slick.grid",
- "slickgrid/slick.rowselectionmodel",
- "sources/selection/copy_data",
- "sources/selection/clipboard",
- "sources/selection/range_selection_helper"
- ],
- function ($, SlickGrid, RowSelectionModel, copyData, clipboard, RangeSelectionHelper) {
- describe('copyData', function () {
- var grid, sqlEditor;
-
- beforeEach(function () {
- var data = [[1, "leopord", "12"],
- [2, "lion", "13"],
- [3, "puma", "9"]];
-
- var columns = [{
- name: "id",
- pos: 0,
- label: "id<br> numeric",
- cell: "number",
- can_edit: false,
- type: "numeric"
- }, {
- name: "brand",
- pos: 1,
- label: "flavor<br> character varying",
- cell: "string",
- can_edit: false,
- type: "character varying"
- }, {
- name: "size",
- pos: 2,
- label: "size<br> numeric",
- cell: "number",
- can_edit: false,
- type: "numeric"
- }
- ]
- ;
- var gridContainer = $("<div id='grid'></div>");
- $("body").append(gridContainer);
- $("body").append("<button id='btn-paste-row' disabled></button>");
- grid = new Slick.Grid("#grid", data, columns, {});
- grid.setSelectionModel(new Slick.RowSelectionModel({selectActiveRow: false}));
- sqlEditor = {slickgrid: grid};
- });
+//////////////////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////////////////
+
+import $ from 'jquery';
+
+import Slick from 'slickgrid';
+import 'slickgrid.grid';
+
+import clipboard from '../../../pgadmin/static/js/selection/clipboard';
+import copyData from '../../../pgadmin/static/js/selection/copy_data';
+
+import RangeSelectionHelper from 'sources/selection/range_selection_helper';
+
+describe('copyData', function () {
+ var grid, sqlEditor;
+
+ beforeEach(function () {
+ var data = [[1, 'leopord', '12'],
+ [2, 'lion', '13'],
+ [3, 'puma', '9']];
+
+ var columns = [{
+ name: 'id',
+ pos: 0,
+ label: 'id<br> numeric',
+ cell: 'number',
+ can_edit: false,
+ type: 'numeric',
+ }, {
+ name: 'brand',
+ pos: 1,
+ label: 'flavor<br> character varying',
+ cell: 'string',
+ can_edit: false,
+ type: 'character varying',
+ }, {
+ name: 'size',
+ pos: 2,
+ label: 'size<br> numeric',
+ cell: 'number',
+ can_edit: false,
+ type: 'numeric',
+ },
+ ]
+ ;
+ var gridContainer = $('<div id=\'grid\'></div>');
+ $('body').append(gridContainer);
+ $('body').append('<button id=\'btn-paste-row\' disabled></button>');
+ grid = new Slick.Grid('#grid', data, columns, {});
+ grid.setSelectionModel(new Slick.RowSelectionModel({selectActiveRow: false}));
+ sqlEditor = {slickgrid: grid};
+ });
- afterEach(function() {
- $("body").remove('#grid');
- $("body").remove('#btn-paste-row');
- });
+ afterEach(function () {
+ $('body').remove('#grid');
+ $('body').remove('#btn-paste-row');
+ });
- describe("when rows are selected", function () {
- beforeEach(function () {
- grid.getSelectionModel().setSelectedRanges([
- RangeSelectionHelper.rangeForRow(grid, 0),
- RangeSelectionHelper.rangeForRow(grid, 2)]
- );
- });
+ describe('when rows are selected', function () {
+ beforeEach(function () {
+ grid.getSelectionModel().setSelectedRanges([
+ RangeSelectionHelper.rangeForRow(grid, 0),
+ RangeSelectionHelper.rangeForRow(grid, 2)]
+ );
+ });
- it("copies them", function () {
- spyOn(clipboard, 'copyTextToClipboard');
+ it('copies them', function () {
+ spyOn(clipboard, 'copyTextToClipboard');
- copyData.apply(sqlEditor);
+ copyData.apply(sqlEditor);
- expect(sqlEditor.copied_rows.length).toBe(2);
+ expect(sqlEditor.copied_rows.length).toBe(2);
- expect(clipboard.copyTextToClipboard).toHaveBeenCalled();
- expect(clipboard.copyTextToClipboard.calls.mostRecent().args[0]).toContain("1,'leopord','12'");
- expect(clipboard.copyTextToClipboard.calls.mostRecent().args[0]).toContain("3,'puma','9'");
- });
+ expect(clipboard.copyTextToClipboard).toHaveBeenCalled();
+ expect(clipboard.copyTextToClipboard.calls.mostRecent().args[0]).toContain('1,\'leopord\',\'12\'');
+ expect(clipboard.copyTextToClipboard.calls.mostRecent().args[0]).toContain('3,\'puma\',\'9\'');
+ });
- describe("when the user can edit the grid", function () {
- it("enables the paste row button", function () {
- copyData.apply(_.extend({can_edit: true}, sqlEditor));
+ describe('when the user can edit the grid', function () {
+ it('enables the paste row button', function () {
+ copyData.apply(_.extend({can_edit: true}, sqlEditor));
- expect($("#btn-paste-row").prop('disabled')).toBe(false);
- });
- });
+ expect($('#btn-paste-row').prop('disabled')).toBe(false);
});
+ });
+ });
- describe("when a column is selected", function () {
- beforeEach(function () {
- var firstColumn = new Slick.Range(0, 0, 2, 0);
- grid.getSelectionModel().setSelectedRanges([firstColumn])
- });
+ describe('when a column is selected', function () {
+ beforeEach(function () {
+ var firstColumn = new Slick.Range(0, 0, 2, 0);
+ grid.getSelectionModel().setSelectedRanges([firstColumn]);
+ });
- it("copies text to the clipboard", function () {
- spyOn(clipboard, 'copyTextToClipboard');
+ it('copies text to the clipboard', function () {
+ spyOn(clipboard, 'copyTextToClipboard');
- copyData.apply(sqlEditor);
+ copyData.apply(sqlEditor);
- expect(clipboard.copyTextToClipboard).toHaveBeenCalled();
+ expect(clipboard.copyTextToClipboard).toHaveBeenCalled();
- var copyArg = clipboard.copyTextToClipboard.calls.mostRecent().args[0];
- var rowStrings = copyArg.split('\n');
- expect(rowStrings[0]).toBe("1");
- expect(rowStrings[1]).toBe("2");
- expect(rowStrings[2]).toBe("3");
- });
+ var copyArg = clipboard.copyTextToClipboard.calls.mostRecent().args[0];
+ var rowStrings = copyArg.split('\n');
+ expect(rowStrings[0]).toBe('1');
+ expect(rowStrings[1]).toBe('2');
+ expect(rowStrings[2]).toBe('3');
+ });
- it("sets copied_rows to empty", function () {
- copyData.apply(sqlEditor);
+ it('sets copied_rows to empty', function () {
+ copyData.apply(sqlEditor);
- expect(sqlEditor.copied_rows.length).toBe(0);
- });
+ expect(sqlEditor.copied_rows.length).toBe(0);
+ });
- describe("when the user can edit the grid", function () {
- it("disables the paste row button", function () {
- copyData.apply(_.extend({can_edit: true}, sqlEditor));
+ describe('when the user can edit the grid', function () {
+ it('disables the paste row button', function () {
+ copyData.apply(_.extend({can_edit: true}, sqlEditor));
- expect($("#btn-paste-row").prop('disabled')).toBe(true);
- });
- });
+ expect($('#btn-paste-row').prop('disabled')).toBe(true);
});
});
});
+});
\ No newline at end of file
diff --git a/web/regression/javascript/selection/grid_selector_spec.js b/web/regression/javascript/selection/grid_selector_spec.js
index a74a66f9..22886b77 100644
--- a/web/regression/javascript/selection/grid_selector_spec.js
+++ b/web/regression/javascript/selection/grid_selector_spec.js
@@ -1,126 +1,127 @@
-define(["jquery",
- "underscore",
- "slickgrid/slick.grid",
- "slickgrid/slick.rowselectionmodel",
- "sources/selection/grid_selector"
- ],
- function ($, _, SlickGrid, RowSelectionModel, GridSelector) {
- describe("GridSelector", function () {
- var container, data, columns, gridSelector, rowSelectionModel;
+import $ from 'jquery';
- beforeEach(function () {
- container = $("<div></div>");
- container.height(9999);
- columns = [{
- id: '1',
- name: 'some-column-name',
- }, {
- id: '2',
- name: 'second column',
- }];
-
- gridSelector = new GridSelector();
- columns = gridSelector.getColumnDefinitionsWithCheckboxes(columns);
-
- data = [];
- for (var i = 0; i < 10; i++) {
- data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i});
- }
- var grid = new SlickGrid(container, data, columns);
-
- rowSelectionModel = new RowSelectionModel();
- grid.setSelectionModel(rowSelectionModel);
-
- grid.registerPlugin(gridSelector);
- grid.invalidate();
-
- $("body").append(container);
- });
+import Slick from 'slickgrid';
+import 'slickgrid.grid';
- afterEach(function () {
- $("body").find(container).remove();
- });
+import RowSelectionModel from 'slickgrid.rowselectionmodel';
- it("renders an additional column on the left for selecting rows", function () {
- expect(columns.length).toBe(3);
+import GridSelector from 'sources/selection/grid_selector';
- var leftmostColumn = columns[0];
- expect(leftmostColumn.id).toBe('row-header-column');
- });
+describe('GridSelector', function () {
+ var container, data, columns, gridSelector, rowSelectionModel;
- it("renders checkboxes for selecting columns", function () {
- expect(container.find('[data-test="output-column-header"] input').length).toBe(2)
- });
+ beforeEach(function () {
+ container = $('<div></div>');
+ container.height(9999);
+ columns = [{
+ id: '1',
+ name: 'some-column-name',
+ }, {
+ id: '2',
+ name: 'second column',
+ }];
- it("renders a checkbox for selecting all the cells", function () {
- expect(container.find("[title='Select/Deselect All']").length).toBe(1);
- });
+ gridSelector = new GridSelector();
+ columns = gridSelector.getColumnDefinitionsWithCheckboxes(columns);
+
+ data = [];
+ for (var i = 0; i < 10; i++) {
+ data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i});
+ }
+ var grid = new Slick.Grid(container, data, columns);
+
+ rowSelectionModel = new RowSelectionModel();
+ grid.setSelectionModel(rowSelectionModel);
+
+ grid.registerPlugin(gridSelector);
+ grid.invalidate();
+
+ $('body').append(container);
+ });
+
+ afterEach(function () {
+ $('body').find(container).remove();
+ });
+
+ it('renders an additional column on the left for selecting rows', function () {
+ expect(columns.length).toBe(3);
+
+ var leftmostColumn = columns[0];
+ expect(leftmostColumn.id).toBe('row-header-column');
+ });
+
+ it('renders checkboxes for selecting columns', function () {
+ expect(container.find('[data-test="output-column-header"] input').length).toBe(2);
+ });
+
+ it('renders a checkbox for selecting all the cells', function () {
+ expect(container.find('[title=\'Select/Deselect All\']').length).toBe(1);
+ });
+
+ describe('when the cell for the select/deselect all is clicked', function () {
+ it('selects the whole grid', function () {
+ container.find('[title=\'Select/Deselect All\']').parent().click();
+
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+ expect(selectedRanges.length).toBe(1);
+ var selectedRange = selectedRanges[0];
+ expect(selectedRange.fromCell).toBe(1);
+ expect(selectedRange.toCell).toBe(2);
+ expect(selectedRange.fromRow).toBe(0);
+ expect(selectedRange.toRow).toBe(9);
+ });
+
+ it('checks the checkbox', function () {
+ container.find('[title=\'Select/Deselect All\']').parent().click();
+
+ expect($(container.find('[data-id=\'checkbox-select-all\']')).is(':checked')).toBeTruthy();
+ });
+ });
- describe("when the cell for the select/deselect all is clicked", function () {
- it("selects the whole grid", function () {
- container.find("[title='Select/Deselect All']").parent().click();
+ describe('when the main checkbox in the corner gets selected', function () {
+ it('unchecks all the columns', function () {
+ container.find('[title=\'Select/Deselect All\']').click();
- var selectedRanges = rowSelectionModel.getSelectedRanges();
- expect(selectedRanges.length).toBe(1);
- var selectedRange = selectedRanges[0];
- expect(selectedRange.fromCell).toBe(1);
- expect(selectedRange.toCell).toBe(2);
- expect(selectedRange.fromRow).toBe(0);
- expect(selectedRange.toRow).toBe(9);
- });
+ expect($(container.find('.slick-header-columns input')[1]).is(':checked')).toBeFalsy();
+ expect($(container.find('.slick-header-columns input')[2]).is(':checked')).toBeFalsy();
+ });
- it("checks the checkbox", function () {
- container.find("[title='Select/Deselect All']").parent().click();
+ it('selects all the cells', function () {
+ container.find('[title=\'Select/Deselect All\']').click();
+
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+ expect(selectedRanges.length).toBe(1);
+ var selectedRange = selectedRanges[0];
+ expect(selectedRange.fromCell).toBe(1);
+ expect(selectedRange.toCell).toBe(2);
+ expect(selectedRange.fromRow).toBe(0);
+ expect(selectedRange.toRow).toBe(9);
+ });
- expect($(container.find("[data-id='checkbox-select-all']")).is(':checked')).toBeTruthy();
- })
+ describe('when the main checkbox in the corner gets deselected', function () {
+ beforeEach(function () {
+ container.find('[title=\'Select/Deselect All\']').click();
});
- describe("when the main checkbox in the corner gets selected", function () {
- it("unchecks all the columns", function () {
- container.find("[title='Select/Deselect All']").click();
-
- expect($(container.find('.slick-header-columns input')[1]).is(':checked')).toBeFalsy();
- expect($(container.find('.slick-header-columns input')[2]).is(':checked')).toBeFalsy();
- });
-
- it("selects all the cells", function () {
- container.find("[title='Select/Deselect All']").click();
-
- var selectedRanges = rowSelectionModel.getSelectedRanges();
- expect(selectedRanges.length).toBe(1);
- var selectedRange = selectedRanges[0];
- expect(selectedRange.fromCell).toBe(1);
- expect(selectedRange.toCell).toBe(2);
- expect(selectedRange.fromRow).toBe(0);
- expect(selectedRange.toRow).toBe(9);
- });
-
- describe("when the main checkbox in the corner gets deselected", function () {
- beforeEach(function () {
- container.find("[title='Select/Deselect All']").click();
- });
-
- it("deselects all the cells", function () {
- container.find("[title='Select/Deselect All']").click();
-
- var selectedRanges = rowSelectionModel.getSelectedRanges();
- expect(selectedRanges.length).toBe(0);
- });
- });
-
- describe("and then the underlying selection changes", function () {
- beforeEach(function () {
- container.find("[title='Select/Deselect All']").click();
- });
-
- it("unchecks the main checkbox", function () {
- var ranges = [new Slick.Range(0, 0, 0, 1)];
- rowSelectionModel.setSelectedRanges(ranges);
-
- expect($(container.find("[title='Select/Deselect All']")).is(':checked')).toBeFalsy();
- });
- });
+ it('deselects all the cells', function () {
+ container.find('[title=\'Select/Deselect All\']').click();
+
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+ expect(selectedRanges.length).toBe(0);
+ });
+ });
+
+ describe('and then the underlying selection changes', function () {
+ beforeEach(function () {
+ container.find('[title=\'Select/Deselect All\']').click();
+ });
+
+ it('unchecks the main checkbox', function () {
+ var ranges = [new Slick.Range(0, 0, 0, 1)];
+ rowSelectionModel.setSelectedRanges(ranges);
+
+ expect($(container.find('[title=\'Select/Deselect All\']')).is(':checked')).toBeFalsy();
});
});
});
+});
\ No newline at end of file
diff --git a/web/regression/javascript/selection/range_boundary_navigator_spec.js b/web/regression/javascript/selection/range_boundary_navigator_spec.js
index 8376d0a7..6e9173d1 100644
--- a/web/regression/javascript/selection/range_boundary_navigator_spec.js
+++ b/web/regression/javascript/selection/range_boundary_navigator_spec.js
@@ -1,8 +1,20 @@
-define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNavigator) {
-
- describe("#getUnion", function () {
- describe("when the ranges completely overlap", function () {
- it("returns a list with that range", function () {
+//////////////////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////////////////
+
+import rangeBoundaryNavigator from 'sources/selection/range_boundary_navigator';
+import Slick from 'slickgrid';
+
+describe('RangeBoundaryNavigator', function () {
+
+ describe('#getUnion', function () {
+ describe('when the ranges completely overlap', function () {
+ it('returns a list with that range', function () {
var ranges = [[1, 4], [1, 4], [1, 4]];
var union = rangeBoundaryNavigator.getUnion(ranges);
@@ -11,8 +23,8 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa
});
});
- describe("when the ranges all overlap partially or touch", function () {
- it("returns one long range", function () {
+ describe('when the ranges all overlap partially or touch', function () {
+ it('returns one long range', function () {
var rangeBounds = [[3, 6], [1, 4], [7, 14]];
var union = rangeBoundaryNavigator.getUnion(rangeBounds);
@@ -20,7 +32,7 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa
expect(union).toEqual([[1, 14]]);
});
- it("returns them in order from lowest to highest", function () {
+ it('returns them in order from lowest to highest', function () {
var rangeBounds = [[3, 6], [2, 3], [10, 12]];
var union = rangeBoundaryNavigator.getUnion(rangeBounds);
@@ -28,9 +40,9 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa
expect(union).toEqual([[2, 6], [10, 12]]);
});
- describe("when one range completely overlaps another", function() {
+ describe('when one range completely overlaps another', function() {
- it("returns them in order from lowest to highest", function () {
+ it('returns them in order from lowest to highest', function () {
var rangeBounds = [[9, 14], [2, 3], [11, 13]];
var union = rangeBoundaryNavigator.getUnion(rangeBounds);
@@ -39,19 +51,19 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa
});
});
- describe("when one range is a subset of another", function () {
- it("returns the larger range", function () {
+ describe('when one range is a subset of another', function () {
+ it('returns the larger range', function () {
var rangeBounds = [[2, 6], [1, 14], [8, 10]];
var union = rangeBoundaryNavigator.getUnion(rangeBounds);
expect(union).toEqual([[1, 14]]);
- })
- })
+ });
+ });
});
- describe("when the ranges do not touch", function () {
- it("returns them in order from lowest to highest", function () {
+ describe('when the ranges do not touch', function () {
+ it('returns them in order from lowest to highest', function () {
var rangeBounds = [[3, 6], [1, 1], [8, 10]];
var union = rangeBoundaryNavigator.getUnion(rangeBounds);
@@ -62,8 +74,8 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa
});
- describe("#mapDimensionBoundaryUnion", function () {
- it("returns a list of the results of the callback", function () {
+ describe('#mapDimensionBoundaryUnion', function () {
+ it('returns a list of the results of the callback', function () {
var rangeBounds = [[0, 1], [3, 3]];
var callback = function () {
return 'hello';
@@ -72,7 +84,7 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa
expect(result).toEqual(['hello', 'hello', 'hello']);
});
- it("calls the callback with each index in the dimension", function () {
+ it('calls the callback with each index in the dimension', function () {
var rangeBounds = [[0, 1], [3, 3]];
var callback = jasmine.createSpy('callbackSpy');
rangeBoundaryNavigator.mapDimensionBoundaryUnion(rangeBounds, callback);
@@ -80,7 +92,7 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa
});
});
- describe("#mapOver2DArray", function () {
+ describe('#mapOver2DArray', function () {
var data, rowCollector, processCell;
beforeEach(function () {
data = [[0, 1, 2, 3], [2, 2, 2, 2], [4, 5, 6, 7]];
@@ -92,66 +104,66 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa
};
});
- it("calls the callback for each item in the ranges", function () {
+ it('calls the callback for each item in the ranges', function () {
var rowRanges = [[0, 0], [2, 2]];
var colRanges = [[0, 3]];
var selectionResult = rangeBoundaryNavigator.mapOver2DArray(rowRanges, colRanges, processCell, rowCollector);
- expect(selectionResult).toEqual(["[0,1,2,3]", "[4,5,6,7]"]);
+ expect(selectionResult).toEqual(['[0,1,2,3]', '[4,5,6,7]']);
});
- describe("when the ranges are out of order/duplicated", function () {
+ describe('when the ranges are out of order/duplicated', function () {
var rowRanges, colRanges;
beforeEach(function () {
rowRanges = [[2, 2], [2, 2], [0, 0]];
colRanges = [[0, 3]];
});
- it("uses the union of the ranges", function () {
- spyOn(rangeBoundaryNavigator, "getUnion").and.callThrough();
+ it('uses the union of the ranges', function () {
+ spyOn(rangeBoundaryNavigator, 'getUnion').and.callThrough();
var selectionResult = rangeBoundaryNavigator.mapOver2DArray(rowRanges, colRanges, processCell, rowCollector);
expect(rangeBoundaryNavigator.getUnion).toHaveBeenCalledWith(rowRanges);
expect(rangeBoundaryNavigator.getUnion).toHaveBeenCalledWith(colRanges);
- expect(selectionResult).toEqual(["[0,1,2,3]", "[4,5,6,7]"]);
+ expect(selectionResult).toEqual(['[0,1,2,3]', '[4,5,6,7]']);
});
});
});
- describe("#rangesToCsv", function () {
+ describe('#rangesToCsv', function () {
var data, columnDefinitions, ranges;
beforeEach(function () {
- data = [[1, "leopard", "12"],
- [2, "lion", "13"],
- [3, "cougar", "9"],
- [4, "tiger", "10"]];
+ data = [[1, 'leopard', '12'],
+ [2, 'lion', '13'],
+ [3, 'cougar', '9'],
+ [4, 'tiger', '10']];
columnDefinitions = [{name: 'id', pos: 0}, {name: 'animal', pos: 1}, {name: 'size', pos: 2}];
ranges = [new Slick.Range(0, 0, 0, 2), new Slick.Range(3, 0, 3, 2)];
});
- it("returns csv for the provided ranges", function () {
+ it('returns csv for the provided ranges', function () {
var csvResult = rangeBoundaryNavigator.rangesToCsv(data, columnDefinitions, ranges);
- expect(csvResult).toEqual("1,'leopard','12'\n4,'tiger','10'");
+ expect(csvResult).toEqual('1,\'leopard\',\'12\'\n4,\'tiger\',\'10\'');
});
- describe("when there is an extra column with checkboxes", function () {
+ describe('when there is an extra column with checkboxes', function () {
beforeEach(function () {
columnDefinitions = [{name: 'not-a-data-column'}, {name: 'id', pos: 0}, {name: 'animal', pos: 1}, {
name: 'size',
- pos: 2
+ pos: 2,
}];
ranges = [new Slick.Range(0, 0, 0, 3), new Slick.Range(3, 0, 3, 3)];
});
- it("returns csv for the columns with data", function () {
+ it('returns csv for the columns with data', function () {
var csvResult = rangeBoundaryNavigator.rangesToCsv(data, columnDefinitions, ranges);
- expect(csvResult).toEqual("1,'leopard','12'\n4,'tiger','10'");
+ expect(csvResult).toEqual('1,\'leopard\',\'12\'\n4,\'tiger\',\'10\'');
});
});
});
diff --git a/web/regression/javascript/selection/row_selector_spec.js b/web/regression/javascript/selection/row_selector_spec.js
index 10697e6a..be741d42 100644
--- a/web/regression/javascript/selection/row_selector_spec.js
+++ b/web/regression/javascript/selection/row_selector_spec.js
@@ -1,174 +1,172 @@
-define(
- ["jquery",
- "underscore",
- "slickgrid/slick.grid",
- "sources/selection/row_selector",
- "slickgrid/slick.rowselectionmodel",
- "slickgrid",
- ],
- function ($, _, SlickGrid, RowSelector, RowSelectionModel, Slick) {
- describe("RowSelector", function () {
- var container, data, columnDefinitions, grid, rowSelectionModel;
+import $ from 'jquery';
+
+import Slick from 'slickgrid';
+import 'slickgrid.grid';
+import RowSelectionModel from 'slickgrid.rowselectionmodel';
+
+import RowSelector from 'sources/selection/row_selector';
+
+describe('RowSelector', function () {
+ var container, data, columnDefinitions, grid, rowSelectionModel;
+
+ beforeEach(function () {
+ container = $('<div></div>');
+ container.height(9999);
+
+ columnDefinitions = [{
+ id: '1',
+ name: 'some-column-name',
+ selectable: true,
+ }, {
+ id: '2',
+ name: 'second column',
+ selectable: true,
+ }];
+
+ var rowSelector = new RowSelector();
+ data = [];
+ for (var i = 0; i < 10; i++) {
+ data.push(['some-value-' + i, 'second value ' + i]);
+ }
+ columnDefinitions = rowSelector.getColumnDefinitionsWithCheckboxes(columnDefinitions);
+ grid = new Slick.Grid(container, data, columnDefinitions);
+
+ rowSelectionModel = new RowSelectionModel();
+ grid.setSelectionModel(rowSelectionModel);
+ grid.registerPlugin(rowSelector);
+ grid.invalidate();
+
+ $('body').append(container);
+ });
+
+ afterEach(function () {
+ $('body').find(container).remove();
+ });
+
+ it('renders an additional column on the left', function () {
+ expect(columnDefinitions.length).toBe(3);
+
+ var leftmostColumn = columnDefinitions[0];
+ expect(leftmostColumn.id).toBe('row-header-column');
+ expect(leftmostColumn.name).toBe('');
+ expect(leftmostColumn.selectable).toBe(false);
+ });
+
+ it('renders a checkbox the leftmost column', function () {
+ expect(container.find('.sr').length).toBe(11);
+ expect(container.find('.sr .sc:first-child input[type="checkbox"]').length).toBe(10);
+ });
+
+ it('preserves the other attributes of column definitions', function () {
+ expect(columnDefinitions[1].id).toBe('1');
+ expect(columnDefinitions[1].selectable).toBe(true);
+ });
+
+ describe('selecting rows', function () {
+ describe('when the user clicks a row header checkbox', function () {
+ it('selects the row', function () {
+ container.find('.sr .sc:first-child input[type="checkbox"]')[0].click();
+
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+ expectOnlyTheFirstRowToBeSelected(selectedRanges);
+ });
- beforeEach(function () {
- container = $("<div></div>");
- container.height(9999);
-
- columnDefinitions = [{
- id: '1',
- name: 'some-column-name',
- selectable: true
- }, {
- id: '2',
- name: 'second column',
- selectable: true
- }];
-
- var rowSelector = new RowSelector();
- data = [];
- for (var i = 0; i < 10; i++) {
- data.push(['some-value-' + i, 'second value ' + i]);
- }
- columnDefinitions = rowSelector.getColumnDefinitionsWithCheckboxes(columnDefinitions);
- grid = new SlickGrid(container, data, columnDefinitions);
-
- rowSelectionModel = new RowSelectionModel();
- grid.setSelectionModel(rowSelectionModel);
- grid.registerPlugin(rowSelector);
- grid.invalidate();
-
- $("body").append(container);
+ it('checks the checkbox', function () {
+ container.find('.sr .sc:first-child input[type="checkbox"]')[5].click();
+
+ expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[5])
+ .is(':checked')).toBeTruthy();
+ });
+ });
+
+ describe('when the user clicks a row header', function () {
+ it('selects the row', function () {
+ container.find('.sr .sc:first-child')[0].click();
+
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+ expectOnlyTheFirstRowToBeSelected(selectedRanges);
});
- afterEach(function () {
- $("body").find(container).remove();
+ it('checks the checkbox', function () {
+ container.find('.sr .sc:first-child')[7].click();
+
+ expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[7])
+ .is(':checked')).toBeTruthy();
});
+ });
+
+ describe('when the user clicks multiple row headers', function () {
+ it('selects another row', function () {
+ container.find('.sr .sc:first-child')[4].click();
+ container.find('.sr .sc:first-child')[0].click();
- it("renders an additional column on the left", function () {
- expect(columnDefinitions.length).toBe(3);
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+ expect(selectedRanges.length).toEqual(2);
+
+ var row1 = selectedRanges[0];
+ expect(row1.fromRow).toBe(4);
+ expect(row1.toRow).toBe(4);
+
+ var row2 = selectedRanges[1];
+ expect(row2.fromRow).toBe(0);
+ expect(row2.toRow).toBe(0);
+ });
+ });
- var leftmostColumn = columnDefinitions[0];
- expect(leftmostColumn.id).toBe('row-header-column');
- expect(leftmostColumn.name).toBe('');
- expect(leftmostColumn.selectable).toBe(false);
+ describe('when a column was already selected', function () {
+ beforeEach(function () {
+ var selectedRanges = [new Slick.Range(0, 0, 0, 1)];
+ rowSelectionModel.setSelectedRanges(selectedRanges);
});
- it("renders a checkbox the leftmost column", function () {
- expect(container.find('.sr').length).toBe(11);
- expect(container.find('.sr .sc:first-child input[type="checkbox"]').length).toBe(10);
+ it('deselects the column', function () {
+ container.find('.sr .sc:first-child')[0].click();
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+
+ expectOnlyTheFirstRowToBeSelected(selectedRanges);
});
+ });
- it("preserves the other attributes of column definitions", function () {
- expect(columnDefinitions[1].id).toBe('1');
- expect(columnDefinitions[1].selectable).toBe(true);
+ describe('when the row is deselected through setSelectedRanges', function () {
+ beforeEach(function () {
+ container.find('.sr .sc:first-child')[4].click();
});
- describe("selecting rows", function () {
- describe("when the user clicks a row header checkbox", function () {
- it("selects the row", function () {
- container.find('.sr .sc:first-child input[type="checkbox"]')[0].click();
-
- var selectedRanges = rowSelectionModel.getSelectedRanges();
- expectOnlyTheFirstRowToBeSelected(selectedRanges);
- });
-
- it("checks the checkbox", function () {
- container.find('.sr .sc:first-child input[type="checkbox"]')[5].click();
-
- expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[5])
- .is(':checked')).toBeTruthy();
- });
- });
-
- describe("when the user clicks a row header", function () {
- it("selects the row", function () {
- container.find('.sr .sc:first-child')[0].click();
-
- var selectedRanges = rowSelectionModel.getSelectedRanges();
- expectOnlyTheFirstRowToBeSelected(selectedRanges);
- });
-
- it("checks the checkbox", function () {
- container.find('.sr .sc:first-child')[7].click();
-
- expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[7])
- .is(':checked')).toBeTruthy();
- });
- });
-
- describe("when the user clicks multiple row headers", function () {
- it("selects another row", function () {
- container.find('.sr .sc:first-child')[4].click();
- container.find('.sr .sc:first-child')[0].click();
-
- var selectedRanges = rowSelectionModel.getSelectedRanges();
- expect(selectedRanges.length).toEqual(2);
-
- var row1 = selectedRanges[0];
- expect(row1.fromRow).toBe(4);
- expect(row1.toRow).toBe(4);
-
- var row2 = selectedRanges[1];
- expect(row2.fromRow).toBe(0);
- expect(row2.toRow).toBe(0);
- });
- });
-
- describe("when a column was already selected", function () {
- beforeEach(function () {
- var selectedRanges = [new Slick.Range(0, 0, 0, 1)];
- rowSelectionModel.setSelectedRanges(selectedRanges);
- });
-
- it("deselects the column", function () {
- container.find('.sr .sc:first-child')[0].click();
- var selectedRanges = rowSelectionModel.getSelectedRanges();
-
- expectOnlyTheFirstRowToBeSelected(selectedRanges);
- })
- });
-
- describe("when the row is deselected through setSelectedRanges", function () {
- beforeEach(function () {
- container.find('.sr .sc:first-child')[4].click();
- });
-
- it("should uncheck the checkbox", function () {
- rowSelectionModel.setSelectedRanges([]);
-
- expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[4])
- .is(':checked')).toBeFalsy();
- });
- });
-
- describe("click a second time", function () {
- beforeEach(function () {
- container.find('.sr .sc:first-child')[1].click();
- });
-
- it("unchecks checkbox", function () {
- container.find('.sr .sc:first-child')[1].click();
- expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[1])
- .is(':checked')).toBeFalsy();
- });
-
- it("unselects the row", function () {
- container.find('.sr .sc:first-child')[1].click();
- var selectedRanges = rowSelectionModel.getSelectedRanges();
-
- expect(selectedRanges.length).toEqual(0);
- })
- });
+ it('should uncheck the checkbox', function () {
+ rowSelectionModel.setSelectedRanges([]);
+
+ expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[4])
+ .is(':checked')).toBeFalsy();
});
});
- function expectOnlyTheFirstRowToBeSelected(selectedRanges) {
- var row = selectedRanges[0];
+ describe('click a second time', function () {
+ beforeEach(function () {
+ container.find('.sr .sc:first-child')[1].click();
+ });
+
+ it('unchecks checkbox', function () {
+ container.find('.sr .sc:first-child')[1].click();
+ expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[1])
+ .is(':checked')).toBeFalsy();
+ });
- expect(selectedRanges.length).toEqual(1);
- expect(row.fromCell).toBe(1);
- expect(row.toCell).toBe(2);
- expect(row.fromRow).toBe(0);
- expect(row.toRow).toBe(0);
- }
- });
\ No newline at end of file
+ it('unselects the row', function () {
+ container.find('.sr .sc:first-child')[1].click();
+ var selectedRanges = rowSelectionModel.getSelectedRanges();
+
+ expect(selectedRanges.length).toEqual(0);
+ });
+ });
+ });
+});
+
+function expectOnlyTheFirstRowToBeSelected(selectedRanges) {
+ var row = selectedRanges[0];
+
+ expect(selectedRanges.length).toEqual(1);
+ expect(row.fromCell).toBe(1);
+ expect(row.toCell).toBe(2);
+ expect(row.fromRow).toBe(0);
+ expect(row.toRow).toBe(0);
+}
\ No newline at end of file
diff --git a/web/regression/javascript/size_prettify_spec.js b/web/regression/javascript/size_prettify_spec.js
index 7d370fcb..f60c79c0 100644
--- a/web/regression/javascript/size_prettify_spec.js
+++ b/web/regression/javascript/size_prettify_spec.js
@@ -7,59 +7,59 @@
//
//////////////////////////////////////////////////////////////////////////
-define(["sources/size_prettify"], function (sizePrettify) {
- describe("sizePrettify", function () {
- describe("when size is 0", function () {
- it("returns 0 bytes", function () {
- expect(sizePrettify(0)).toEqual("0 bytes");
+define(['sources/size_prettify'], function (sizePrettify) {
+ describe('sizePrettify', function () {
+ describe('when size is 0', function () {
+ it('returns 0 bytes', function () {
+ expect(sizePrettify(0)).toEqual('0 bytes');
});
});
- describe("when size >= 10kB and size < 10 MB", function () {
- it("returns size in kB", function () {
- expect(sizePrettify(10240)).toEqual("10 kB");
+ describe('when size >= 10kB and size < 10 MB', function () {
+ it('returns size in kB', function () {
+ expect(sizePrettify(10240)).toEqual('10 kB');
});
- it("returns size in kB", function () {
- expect(sizePrettify(99999)).toEqual("98 kB");
+ it('returns size in kB', function () {
+ expect(sizePrettify(99999)).toEqual('98 kB');
});
});
- describe("when size >= 10MB and size < 10 GB", function () {
- it("returns size in MB", function () {
- expect(sizePrettify(10485760)).toEqual("10 MB");
+ describe('when size >= 10MB and size < 10 GB', function () {
+ it('returns size in MB', function () {
+ expect(sizePrettify(10485760)).toEqual('10 MB');
});
- it("returns size in MB", function () {
- expect(sizePrettify(44040192)).toEqual("42 MB");
+ it('returns size in MB', function () {
+ expect(sizePrettify(44040192)).toEqual('42 MB');
});
});
- describe("when size >= 10GB and size < 10 TB", function () {
- it("returns size in GB", function () {
- expect(sizePrettify(10737418240)).toEqual("10 GB");
+ describe('when size >= 10GB and size < 10 TB', function () {
+ it('returns size in GB', function () {
+ expect(sizePrettify(10737418240)).toEqual('10 GB');
});
- it("returns size in GB", function () {
- expect(sizePrettify(10736344498176)).toEqual("9999 GB");
+ it('returns size in GB', function () {
+ expect(sizePrettify(10736344498176)).toEqual('9999 GB');
});
});
- describe("when size >= 10TB and size < 10 PB", function () {
- it("returns size in TB", function () {
- expect(sizePrettify(10995116277760)).toEqual("10 TB");
+ describe('when size >= 10TB and size < 10 PB', function () {
+ it('returns size in TB', function () {
+ expect(sizePrettify(10995116277760)).toEqual('10 TB');
});
- it("returns size in TB", function () {
- expect(sizePrettify(29995116277760)).toEqual("27 TB");
+ it('returns size in TB', function () {
+ expect(sizePrettify(29995116277760)).toEqual('27 TB');
});
});
- describe("when size >= 10 PB", function () {
- it("returns size in PB", function () {
- expect(sizePrettify(11258999068426200)).toEqual("10 PB");
+ describe('when size >= 10 PB', function () {
+ it('returns size in PB', function () {
+ expect(sizePrettify(11258999068426200)).toEqual('10 PB');
});
});
diff --git a/web/regression/javascript/test-main.js b/web/regression/javascript/test-main.js
deleted file mode 100644
index fe28a5f8..00000000
--- a/web/regression/javascript/test-main.js
+++ /dev/null
@@ -1,125 +0,0 @@
-//////////////////////////////////////////////////////////////////////////
-//
-// pgAdmin 4 - PostgreSQL Tools
-//
-// Copyright (C) 2013 - 2017, The pgAdmin Development Team
-// This software is released under the PostgreSQL Licence
-//
-//////////////////////////////////////////////////////////////////////////
-
-var allTestFiles = [];
-var TEST_REGEXP = /(spec|test)\.js$/i;
-
-// Get a list of all the test files to include
-Object.keys(window.__karma__.files).forEach(function (file) {
- if (TEST_REGEXP.test(file)) {
- // Normalize paths to RequireJS module names.
- // If you require sub-dependencies of test files to be loaded as-is (requiring file extension)
- // then do not normalize the paths
- var normalizedTestModule = file.replace(/^\/base\/|\.js$/g, '');
- allTestFiles.push(normalizedTestModule)
- }
-});
-
-var sourcesDir = '/base/pgadmin/static/';
-require.config({
- // Karma serves files under /base, which is the basePath from your config file
- baseUrl: '/base',
-
- paths: {
- 'alertify': sourcesDir + 'vendor/alertifyjs/alertify',
- 'jquery': sourcesDir + 'vendor/jquery/jquery-1.11.2',
- 'jquery.ui': sourcesDir + 'vendor/jquery-ui/jquery-ui-1.11.3',
- 'jquery.event.drag': sourcesDir + 'vendor/jquery-ui/jquery.event.drag-2.2',
- 'underscore': sourcesDir + 'vendor/underscore/underscore',
- 'underscore.string': sourcesDir + 'vendor/underscore/underscore.string',
- 'slickgrid': sourcesDir + 'vendor/slickgrid/slick.core',
- 'slickgrid/slick.grid': sourcesDir + 'vendor/slickgrid/slick.grid',
- 'slickgrid/slick.rowselectionmodel': sourcesDir + 'vendor/slickgrid/plugins/slick.rowselectionmodel',
- 'translations': '/base/regression/javascript/fake_translations',
- 'sources': sourcesDir + 'js'
- },
-
- shim: {
- 'underscore': {
- exports: '_'
- },
- "slickgrid": {
- "deps": [
- 'jquery', "jquery.ui", "jquery.event.drag"
- ],
- "exports": 'window.Slick'
- },
- "slickgrid/slick.grid": {
- "deps": [
- 'jquery', "jquery.ui", "jquery.event.drag", "slickgrid"
- ],
- "exports": 'window.Slick.Grid'
- },
- "slickgrid/slick.rowselectionmodel": {
- "deps": [
- "jquery"
- ],
- "exports": 'window.Slick.RowSelectionModel'
- },
- "backbone": {
- "deps": ['underscore', 'jquery'],
- "exports": 'Backbone'
- },
- "backbone.paginator": {
- "deps": ['underscore', 'jquery', 'backbone']
- },
- "bootstrap": {
- "deps": ['jquery'],
- },
- "backgrid": {
- "deps": ['backform'],
- "exports": 'Backgrid',
- },
- "backgrid.select.all": {
- "deps": ['backgrid']
- },
- "backgrid.paginator": {
- "deps": ['backgrid', 'backbone.paginator']
- },
- "backgrid.filter": {
- "deps": ['backgrid']
- },
- "backgrid.sizeable.columns": {
- "deps": ['backgrid']
- },
- "bootstrap.switch": {
- "deps": ['jquery', 'bootstrap'],
- "exports": 'jQuery.fn.bootstrapSwitch'
- },
- "select2": {
- "deps": ['jquery'],
- "exports": 'jQuery.fn.select2'
- },
- "bootstrap.datepicker": {
- "deps": ['jquery', 'bootstrap'],
- "exports": 'jQuery.fn.datepicker'
- },
- "bootstrap.datetimepicker": {
- "deps": ['jquery', 'bootstrap', 'moment'],
- "exports": 'jQuery.fn.datetimepicker'
- },
- "pgadmin.backgrid": {
- "deps": ["backgrid", "bootstrap.datetimepicker", "bootstrap.switch"],
- },
- "pgadmin.backform": {
- "deps": ['backform', "pgadmin.backgrid", "select2"],
- },
- "jquery.event.drag": {
- "deps": ['jquery'], "exports": 'jQuery.fn.drag'
- },
- "jquery.ui": {"deps": ['jquery']}
- },
-
- // dynamically load all test files
- deps: allTestFiles,
-
- // we have to kickoff jasmine, as it is asynchronous
- callback: window.__karma__.start
-});
-
diff --git a/web/regression/requirements.txt b/web/regression/requirements.txt
index 6babf987..fd5ed5d9 100644
--- a/web/regression/requirements.txt
+++ b/web/regression/requirements.txt
@@ -4,6 +4,7 @@ testscenarios==0.5.0
testtools==2.0.0
traceback2==1.4.0
unittest2==1.1.0
+mock~=2.0.0
# Leave this at the end because there is a bug where the '--install-option' is applied to all subsequent requirements
chromedriver_installer==0.0.6 --install-option='--chromedriver-version=2.29'
diff --git a/web/webpack.config.js b/web/webpack.config.js
new file mode 100644
index 00000000..91586592
--- /dev/null
+++ b/web/webpack.config.js
@@ -0,0 +1,29 @@
+/* eslint-env node */
+
+module.exports = {
+ context: __dirname + '/pgadmin/static/jsx',
+ entry: './components.jsx',
+ output: {
+ libraryTarget: 'amd',
+ path: __dirname + '/pgadmin/static/js/generated',
+ filename: 'reactComponents.js',
+ },
+
+ module: {
+ rules: [{
+ test: /\.jsx?$/,
+ exclude: /node_modules/,
+ use: {
+ loader: 'babel-loader',
+ options: {
+ presets: ['es2015', 'react'],
+ },
+ },
+ },
+ ],
+ },
+
+ resolve: {
+ extensions: ['.js', '.jsx'],
+ },
+};
\ No newline at end of file
diff --git a/web/webpack.test.config.js b/web/webpack.test.config.js
new file mode 100644
index 00000000..49bef069
--- /dev/null
+++ b/web/webpack.test.config.js
@@ -0,0 +1,65 @@
+/* eslint-env node */
+const path = require('path');
+const webpack = require('webpack');
+
+const sourcesDir = path.resolve(__dirname, 'pgadmin/static');
+const regressionDir = path.resolve(__dirname, 'regression');
+
+module.exports = {
+ plugins: [
+ new webpack.ProvidePlugin({
+ jQuery: 'jquery',
+ _: 'underscore',
+ }),
+ ],
+
+ module: {
+ rules: [
+ {
+ test: /\.jsx?$/,
+ exclude: [/node_modules/, /vendor/],
+ use: {
+ loader: 'babel-loader',
+ options: {
+ presets: ['es2015'],
+ },
+ },
+ },
+ {
+ test: /.*slickgrid\/slick\.(?!core)*/,
+ loader: 'imports-loader?' +
+ 'jquery.ui' +
+ ',jquery.event.drag' +
+ ',slickgrid',
+ }, {
+ test: /.*slickgrid\/plugins\/slick\.rowselectionmodel/,
+ loader: 'imports-loader?' +
+ 'jquery.ui' +
+ ',jquery.event.drag' +
+ ',slickgrid' +
+ '!exports-loader?' +
+ 'Slick.RowSelectionModel',
+ }, {
+ test: /.*slickgrid\/slick\.core.*/,
+ loader: 'imports-loader?' +
+ 'jquery.ui' +
+ ',jquery.event.drag' +
+ '!exports-loader?' +
+ 'Slick',
+ }],
+ },
+
+ resolve: {
+ alias: {
+ 'alertify': sourcesDir + '/vendor/alertifyjs/alertify',
+ 'jquery': sourcesDir + '/vendor/jquery/jquery-1.11.2',
+ 'jquery.ui': sourcesDir + '/vendor/jquery-ui/jquery-ui-1.11.3',
+ 'jquery.event.drag': sourcesDir + '/vendor/jquery-ui/jquery.event.drag-2.2',
+ 'sources': sourcesDir + '/js',
+ 'translations': regressionDir + '/javascript/fake_translations',
+ 'slickgrid': sourcesDir + '/vendor/slickgrid/slick.core',
+ 'slickgrid.grid': sourcesDir + '/vendor/slickgrid/slick.grid',
+ 'slickgrid.rowselectionmodel': sourcesDir + '/vendor/slickgrid/plugins/slick.rowselectionmodel',
+ },
+ },
+};
\ No newline at end of file
diff --git a/web/yarn.lock b/web/yarn.lock
new file mode 100644
index 00000000..47f2e13c
--- /dev/null
+++ b/web/yarn.lock
@@ -0,0 +1,4888 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+JSONStream@^1.0.3:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.1.tgz#707f761e01dae9e16f1bcf93703b78c70966579a"
+ dependencies:
+ jsonparse "^1.2.0"
+ through ">=2.2.7 <3"
+
+abbrev@1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f"
+
[email protected]:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca"
+ dependencies:
+ mime-types "~2.1.11"
+ 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 "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+
+acorn@^4.0.3, acorn@^4.0.4:
+ version "4.0.11"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0"
+
+acorn@^5.0.1:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d"
+
[email protected]:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
+
+ajv-keywords@^1.0.0, ajv-keywords@^1.1.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
+
+ajv@^4.7.0, ajv@^4.9.1:
+ version "4.11.7"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.7.tgz#8655a5d86d0824985cc471a1d913fb6729a0ec48"
+ dependencies:
+ co "^4.6.0"
+ json-stable-stringify "^1.0.1"
+
+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"
+
+amdefine@>=0.0.4:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+
+ansi-escapes@^1.1.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+anymatch@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507"
+ dependencies:
+ arrify "^1.0.0"
+ micromatch "^2.1.5"
+
+aproba@^1.0.3:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab"
+
+are-we-there-yet@~1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+argparse@^1.0.2:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86"
+ dependencies:
+ sprintf-js "~1.0.2"
+
+arr-diff@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+ dependencies:
+ arr-flatten "^1.0.1"
+
+arr-flatten@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1"
+
+array-filter@~0.0.0:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
+
+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-map@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
+
+array-reduce@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
+
+array-slice@^0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5"
+
+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.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+array.prototype.find@^2.0.1:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.4.tgz#556a5c5362c08648323ddaeb9de9d14bc1864c90"
+ dependencies:
+ define-properties "^1.1.2"
+ es-abstract "^1.7.0"
+
[email protected]:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca"
+
+arrify@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+
+asap@~2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f"
+
+asn1.js@^4.0.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40"
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+asn1@~0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
+
[email protected], assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+assert-plus@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
+
+assert@^1.1.1, assert@^1.4.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+ dependencies:
+ util "0.10.3"
+
+astw@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/astw/-/astw-2.2.0.tgz#7bd41784d32493987aeb239b6b4e1c57a873b917"
+ dependencies:
+ acorn "^4.0.3"
+
+async-each@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+async@^1.5.0, async@~1.5.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+
+async@^2.1.2:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.3.0.tgz#1013d1051047dd320fe24e494d5c66ecaf6147d9"
+ dependencies:
+ lodash "^4.14.0"
+
+async@~0.9.0:
+ version "0.9.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+aws-sign2@~0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
+
+aws4@^1.2.1:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
+
+axios@^0.16.1:
+ version "0.16.1"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.16.1.tgz#c0b6d26600842384b8f509e57111f0d2df8223ca"
+ dependencies:
+ follow-redirects "^1.2.3"
+
+babel-code-frame@^6.16.0, babel-code-frame@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
+ dependencies:
+ chalk "^1.1.0"
+ esutils "^2.0.2"
+ js-tokens "^3.0.0"
+
+babel-core@^6.0.0, babel-core@^6.0.14, babel-core@^6.24.1, babel-core@~6.24.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83"
+ dependencies:
+ babel-code-frame "^6.22.0"
+ babel-generator "^6.24.1"
+ babel-helpers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-register "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+ babylon "^6.11.0"
+ convert-source-map "^1.1.0"
+ debug "^2.1.1"
+ json5 "^0.5.0"
+ lodash "^4.2.0"
+ minimatch "^3.0.2"
+ path-is-absolute "^1.0.0"
+ private "^0.1.6"
+ slash "^1.0.0"
+ source-map "^0.5.0"
+
+babel-generator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497"
+ dependencies:
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ detect-indent "^4.0.0"
+ jsesc "^1.3.0"
+ lodash "^4.2.0"
+ source-map "^0.5.0"
+ trim-right "^1.0.1"
+
+babel-helper-builder-react-jsx@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.24.1.tgz#0ad7917e33c8d751e646daca4e77cc19377d2cbc"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ esutils "^2.0.0"
+
+babel-helper-call-delegate@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-define-map@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ lodash "^4.2.0"
+
+babel-helper-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+ dependencies:
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-get-function-arity@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ lodash "^4.2.0"
+
+babel-helper-replace-supers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+ dependencies:
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helpers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-loader@~6.4.1:
+ version "6.4.1"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.4.1.tgz#0b34112d5b0748a8dcdbf51acf6f9bd42d50b8ca"
+ dependencies:
+ find-cache-dir "^0.1.1"
+ loader-utils "^0.2.16"
+ mkdirp "^0.5.1"
+ object-assign "^4.0.1"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0, babel-plugin-check-es2015-constants@^6.3.13:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-syntax-flow@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d"
+
+babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
+
+babel-plugin-transform-es2015-arrow-functions@^6.22.0, babel-plugin-transform-es2015-arrow-functions@^6.3.13:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0, babel-plugin-transform-es2015-block-scoped-functions@^6.3.13:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.24.1, babel-plugin-transform-es2015-block-scoping@^6.9.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+ lodash "^4.2.0"
+
+babel-plugin-transform-es2015-classes@^6.24.1, babel-plugin-transform-es2015-classes@^6.9.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+ dependencies:
+ babel-helper-define-map "^6.24.1"
+ babel-helper-function-name "^6.24.1"
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-helper-replace-supers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-computed-properties@^6.24.1, babel-plugin-transform-es2015-computed-properties@^6.3.13:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.22.0, babel-plugin-transform-es2015-destructuring@^6.9.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.24.1, babel-plugin-transform-es2015-duplicate-keys@^6.6.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.22.0, babel-plugin-transform-es2015-for-of@^6.6.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.24.1, babel-plugin-transform-es2015-function-name@^6.9.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0, babel-plugin-transform-es2015-literals@^6.3.13:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
+ dependencies:
+ babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-commonjs@^6.24.1, babel-plugin-transform-es2015-modules-commonjs@^6.6.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe"
+ dependencies:
+ babel-plugin-transform-strict-mode "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-modules-systemjs@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
+ dependencies:
+ babel-plugin-transform-es2015-modules-amd "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-object-super@^6.24.1, babel-plugin-transform-es2015-object-super@^6.3.13:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+ dependencies:
+ babel-helper-replace-supers "^6.24.1"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.24.1, babel-plugin-transform-es2015-parameters@^6.9.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+ dependencies:
+ babel-helper-call-delegate "^6.24.1"
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-shorthand-properties@^6.24.1, babel-plugin-transform-es2015-shorthand-properties@^6.3.13:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0, babel-plugin-transform-es2015-spread@^6.3.13:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.24.1, babel-plugin-transform-es2015-sticky-regex@^6.3.13:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0, babel-plugin-transform-es2015-template-literals@^6.6.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.22.0, babel-plugin-transform-es2015-typeof-symbol@^6.6.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.24.1, babel-plugin-transform-es2015-unicode-regex@^6.3.13:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ regexpu-core "^2.0.0"
+
+babel-plugin-transform-flow-strip-types@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf"
+ dependencies:
+ babel-plugin-syntax-flow "^6.18.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-display-name@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.23.0.tgz#4398910c358441dc4cef18787264d0412ed36b37"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx-self@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e"
+ dependencies:
+ babel-plugin-syntax-jsx "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx-source@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6"
+ dependencies:
+ babel-plugin-syntax-jsx "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3"
+ dependencies:
+ babel-helper-builder-react-jsx "^6.24.1"
+ babel-plugin-syntax-jsx "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-regenerator@^6.24.1, babel-plugin-transform-regenerator@^6.9.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418"
+ dependencies:
+ regenerator-transform "0.9.11"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-polyfill@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d"
+ dependencies:
+ babel-runtime "^6.22.0"
+ core-js "^2.4.0"
+ regenerator-runtime "^0.10.0"
+
+babel-preset-es2015-without-strict@~0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/babel-preset-es2015-without-strict/-/babel-preset-es2015-without-strict-0.0.4.tgz#88c9f36e79d4762c58347b1a698a07c35b6bda5d"
+ dependencies:
+ babel-plugin-check-es2015-constants "^6.3.13"
+ babel-plugin-transform-es2015-arrow-functions "^6.3.13"
+ babel-plugin-transform-es2015-block-scoped-functions "^6.3.13"
+ babel-plugin-transform-es2015-block-scoping "^6.9.0"
+ babel-plugin-transform-es2015-classes "^6.9.0"
+ babel-plugin-transform-es2015-computed-properties "^6.3.13"
+ babel-plugin-transform-es2015-destructuring "^6.9.0"
+ babel-plugin-transform-es2015-duplicate-keys "^6.6.0"
+ babel-plugin-transform-es2015-for-of "^6.6.0"
+ babel-plugin-transform-es2015-function-name "^6.9.0"
+ babel-plugin-transform-es2015-literals "^6.3.13"
+ babel-plugin-transform-es2015-modules-commonjs "^6.6.0"
+ babel-plugin-transform-es2015-object-super "^6.3.13"
+ babel-plugin-transform-es2015-parameters "^6.9.0"
+ babel-plugin-transform-es2015-shorthand-properties "^6.3.13"
+ babel-plugin-transform-es2015-spread "^6.3.13"
+ babel-plugin-transform-es2015-sticky-regex "^6.3.13"
+ babel-plugin-transform-es2015-template-literals "^6.6.0"
+ babel-plugin-transform-es2015-typeof-symbol "^6.6.0"
+ babel-plugin-transform-es2015-unicode-regex "^6.3.13"
+ babel-plugin-transform-regenerator "^6.9.0"
+
+babel-preset-es2015@~6.24.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939"
+ dependencies:
+ babel-plugin-check-es2015-constants "^6.22.0"
+ babel-plugin-transform-es2015-arrow-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoping "^6.24.1"
+ babel-plugin-transform-es2015-classes "^6.24.1"
+ babel-plugin-transform-es2015-computed-properties "^6.24.1"
+ babel-plugin-transform-es2015-destructuring "^6.22.0"
+ babel-plugin-transform-es2015-duplicate-keys "^6.24.1"
+ babel-plugin-transform-es2015-for-of "^6.22.0"
+ babel-plugin-transform-es2015-function-name "^6.24.1"
+ babel-plugin-transform-es2015-literals "^6.22.0"
+ babel-plugin-transform-es2015-modules-amd "^6.24.1"
+ babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+ babel-plugin-transform-es2015-modules-systemjs "^6.24.1"
+ babel-plugin-transform-es2015-modules-umd "^6.24.1"
+ babel-plugin-transform-es2015-object-super "^6.24.1"
+ babel-plugin-transform-es2015-parameters "^6.24.1"
+ babel-plugin-transform-es2015-shorthand-properties "^6.24.1"
+ babel-plugin-transform-es2015-spread "^6.22.0"
+ babel-plugin-transform-es2015-sticky-regex "^6.24.1"
+ babel-plugin-transform-es2015-template-literals "^6.22.0"
+ babel-plugin-transform-es2015-typeof-symbol "^6.22.0"
+ babel-plugin-transform-es2015-unicode-regex "^6.24.1"
+ babel-plugin-transform-regenerator "^6.24.1"
+
+babel-preset-flow@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d"
+ dependencies:
+ babel-plugin-transform-flow-strip-types "^6.22.0"
+
+babel-preset-react@~6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.23.0.tgz#eb7cee4de98a3f94502c28565332da9819455195"
+ dependencies:
+ babel-plugin-syntax-jsx "^6.3.13"
+ babel-plugin-transform-react-display-name "^6.23.0"
+ babel-plugin-transform-react-jsx "^6.23.0"
+ babel-plugin-transform-react-jsx-self "^6.22.0"
+ babel-plugin-transform-react-jsx-source "^6.22.0"
+ babel-preset-flow "^6.23.0"
+
+babel-register@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f"
+ dependencies:
+ babel-core "^6.24.1"
+ babel-runtime "^6.22.0"
+ core-js "^2.4.0"
+ home-or-tmp "^2.0.0"
+ lodash "^4.2.0"
+ mkdirp "^0.5.1"
+ source-map-support "^0.4.2"
+
+babel-runtime@^6.18.0, babel-runtime@^6.22.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b"
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.10.0"
+
+babel-template@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+ babylon "^6.11.0"
+ lodash "^4.2.0"
+
+babel-traverse@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695"
+ dependencies:
+ babel-code-frame "^6.22.0"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+ babylon "^6.15.0"
+ debug "^2.2.0"
+ globals "^9.0.0"
+ invariant "^2.2.0"
+ lodash "^4.2.0"
+
+babel-types@^6.19.0, babel-types@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975"
+ dependencies:
+ babel-runtime "^6.22.0"
+ esutils "^2.0.2"
+ lodash "^4.2.0"
+ to-fast-properties "^1.0.1"
+
+babelify@~7.3.0:
+ version "7.3.0"
+ resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5"
+ dependencies:
+ babel-core "^6.0.14"
+ object-assign "^4.0.0"
+
+babylon@^6.11.0, babylon@^6.15.0:
+ version "6.17.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.0.tgz#37da948878488b9c4e3c4038893fa3314b3fc932"
+
[email protected]:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
+
+balanced-match@^0.4.1:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
+
[email protected]:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
+
+base64-js@^1.0.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1"
+
[email protected]:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6"
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
+ dependencies:
+ tweetnacl "^0.14.3"
+
+better-assert@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
+ dependencies:
+ callsite "1.0.0"
+
+big.js@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978"
+
+binary-extensions@^1.0.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774"
+
[email protected]:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921"
+
+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.3.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
+
+body-parser@^1.16.1:
+ version "1.17.1"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.1.tgz#75b3bc98ddd6e7e0d8ffe750dfaca5c66993fa47"
+ dependencies:
+ bytes "2.4.0"
+ content-type "~1.0.2"
+ debug "2.6.1"
+ depd "~1.1.0"
+ http-errors "~1.6.1"
+ iconv-lite "0.4.15"
+ on-finished "~2.3.0"
+ qs "6.4.0"
+ raw-body "~2.2.0"
+ type-is "~1.6.14"
+
+body-parser@~1.14.0:
+ version "1.14.2"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.14.2.tgz#1015cb1fe2c443858259581db53332f8d0cf50f9"
+ dependencies:
+ bytes "2.2.0"
+ content-type "~1.0.1"
+ debug "~2.2.0"
+ depd "~1.1.0"
+ http-errors "~1.3.1"
+ iconv-lite "0.4.13"
+ on-finished "~2.3.0"
+ qs "5.2.0"
+ raw-body "~2.1.5"
+ type-is "~1.6.10"
+
+boolbase@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+
[email protected]:
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
+ dependencies:
+ hoek "2.x.x"
+
+brace-expansion@^1.0.0:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59"
+ dependencies:
+ balanced-match "^0.4.1"
+ concat-map "0.0.1"
+
+braces@^0.1.2:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6"
+ dependencies:
+ expand-range "^0.1.0"
+
+braces@^1.8.2:
+ version "1.8.5"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+ dependencies:
+ expand-range "^1.8.1"
+ preserve "^0.2.0"
+ repeat-element "^1.1.2"
+
+brorand@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browser-pack@^6.0.1:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.0.2.tgz#f86cd6cef4f5300c8e63e07a4d512f65fbff4531"
+ dependencies:
+ JSONStream "^1.0.3"
+ combine-source-map "~0.7.1"
+ defined "^1.0.0"
+ through2 "^2.0.0"
+ umd "^3.0.0"
+
+browser-resolve@^1.11.0, browser-resolve@^1.7.0:
+ version "1.11.2"
+ resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
+ dependencies:
+ resolve "1.1.7"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a"
+ dependencies:
+ buffer-xor "^1.0.2"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.0"
+ inherits "^2.0.1"
+
+browserify-cipher@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a"
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd"
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+
+browserify-rsa@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/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.1.4, browserify-zlib@~0.1.2:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d"
+ dependencies:
+ pako "~0.2.0"
+
+browserify@^14.0.0, browserify@~14.1.0:
+ version "14.1.0"
+ resolved "https://registry.yarnpkg.com/browserify/-/browserify-14.1.0.tgz#0508cc1e7bf4c152312c2fa523e676c0b0b92311"
+ dependencies:
+ JSONStream "^1.0.3"
+ assert "^1.4.0"
+ browser-pack "^6.0.1"
+ browser-resolve "^1.11.0"
+ browserify-zlib "~0.1.2"
+ buffer "^5.0.2"
+ cached-path-relative "^1.0.0"
+ concat-stream "~1.5.1"
+ console-browserify "^1.1.0"
+ constants-browserify "~1.0.0"
+ crypto-browserify "^3.0.0"
+ defined "^1.0.0"
+ deps-sort "^2.0.0"
+ domain-browser "~1.1.0"
+ duplexer2 "~0.1.2"
+ events "~1.1.0"
+ glob "^7.1.0"
+ has "^1.0.0"
+ htmlescape "^1.1.0"
+ https-browserify "~0.0.0"
+ inherits "~2.0.1"
+ insert-module-globals "^7.0.0"
+ labeled-stream-splicer "^2.0.0"
+ module-deps "^4.0.8"
+ os-browserify "~0.1.1"
+ parents "^1.0.1"
+ path-browserify "~0.0.0"
+ process "~0.11.0"
+ punycode "^1.3.2"
+ querystring-es3 "~0.2.0"
+ read-only-stream "^2.0.0"
+ readable-stream "^2.0.2"
+ resolve "^1.1.4"
+ shasum "^1.0.0"
+ shell-quote "^1.6.1"
+ stream-browserify "^2.0.0"
+ stream-http "^2.0.0"
+ string_decoder "~0.10.0"
+ subarg "^1.0.0"
+ syntax-error "^1.1.1"
+ through2 "^2.0.0"
+ timers-browserify "^1.0.1"
+ tty-browserify "~0.0.0"
+ url "~0.11.0"
+ util "~0.10.1"
+ vm-browserify "~0.0.1"
+ xtend "^4.0.0"
+
+buffer-shims@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51"
+
+buffer-xor@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+buffer@^5.0.2:
+ version "5.0.6"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.0.6.tgz#2ea669f7eec0b6eda05b08f8b5ff661b28573588"
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+
+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"
+
[email protected]:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.2.0.tgz#fd35464a403f6f9117c2de3609ecff9cae000588"
+
[email protected]:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339"
+
+cached-path-relative@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.1.tgz#d09c4b52800aa4c078e2dd81a869aac90d2e54e7"
+
+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"
+
[email protected]:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
+
+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"
+
+caseless@~0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
+
+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"
+
+chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3, chalk@~1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/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"
+
+cheerio@^0.22.0:
+ version "0.22.0"
+ resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e"
+ dependencies:
+ css-select "~1.2.0"
+ dom-serializer "~0.1.0"
+ entities "~1.1.1"
+ htmlparser2 "^3.9.1"
+ lodash.assignin "^4.0.9"
+ lodash.bind "^4.1.4"
+ lodash.defaults "^4.0.1"
+ lodash.filter "^4.4.0"
+ lodash.flatten "^4.2.0"
+ lodash.foreach "^4.3.0"
+ lodash.map "^4.4.0"
+ lodash.merge "^4.4.0"
+ lodash.pick "^4.2.1"
+ lodash.reduce "^4.4.0"
+ lodash.reject "^4.4.0"
+ lodash.some "^4.4.0"
+
+chokidar@^1.0.0, chokidar@^1.4.1, chokidar@^1.4.3:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2"
+ dependencies:
+ anymatch "^1.3.0"
+ async-each "^1.0.0"
+ glob-parent "^2.0.0"
+ inherits "^2.0.1"
+ is-binary-path "^1.0.0"
+ is-glob "^2.0.0"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.0.0"
+ optionalDependencies:
+ fsevents "^1.0.0"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07"
+ dependencies:
+ inherits "^2.0.1"
+
+circular-json@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d"
+
+cli-cursor@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
+ dependencies:
+ restore-cursor "^1.0.1"
+
+cli-width@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a"
+
+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"
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+
+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"
+
+coffee-script@~1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.10.0.tgz#12938bcf9be1948fa006f92e0c4c9e81705108c0"
+
+colors@^1.1.0, colors@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
+
+combine-lists@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6"
+ dependencies:
+ lodash "^4.5.0"
+
+combine-source-map@~0.7.1:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.7.2.tgz#0870312856b307a87cc4ac486f3a9a62aeccc09e"
+ dependencies:
+ convert-source-map "~1.1.0"
+ inline-source-map "~0.6.0"
+ lodash.memoize "~3.0.3"
+ source-map "~0.5.3"
+
+combined-stream@^1.0.5, combined-stream@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@^2.9.0, commander@~2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
+ 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"
+
[email protected]:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
+
[email protected]:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3"
+
[email protected]:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
[email protected]:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
+
[email protected]:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
[email protected]:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.0.tgz#53f7d43c51c5e43f81c8fdd03321c631be68d611"
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "~2.0.0"
+ typedarray "~0.0.5"
+
+concat-stream@^1.4.1, concat-stream@^1.5.2, concat-stream@~1.5.0, concat-stream@~1.5.1:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266"
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "~2.0.0"
+ typedarray "~0.0.5"
+
+connect@^3.6.0:
+ version "3.6.1"
+ resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.1.tgz#b7760693a74f0454face1d9378edb3f885b43227"
+ dependencies:
+ debug "2.6.3"
+ finalhandler "1.0.1"
+ parseurl "~1.3.1"
+ utils-merge "1.0.0"
+
+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:
+ 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, constants-browserify@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+content-type@~1.0.1, content-type@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed"
+
+convert-source-map@^1.1.0, convert-source-map@^1.1.3:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5"
+
+convert-source-map@~1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860"
+
[email protected]:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+
+core-js@^1.0.0:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
+
+core-js@^2.2.0, core-js@^2.4.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e"
+
+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.0"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.2.tgz#51210062d7bb7479f6c65bb41a92208b1d61abad"
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ ripemd160 "^1.0.0"
+ sha.js "^2.3.6"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.4.tgz#d3fb4ba253eb8b3f56e39ea2fbcb8af747bd3170"
+ dependencies:
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+
[email protected]:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
+ dependencies:
+ boom "2.x.x"
+
+crypto-browserify@^3.0.0, crypto-browserify@^3.11.0:
+ version "3.11.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.0.tgz#3652a0906ab9b2a7e0c3ce66a408e957a2485522"
+ 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"
+
+css-select@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
+ dependencies:
+ boolbase "~1.0.0"
+ css-what "2.1"
+ domutils "1.5.1"
+ nth-check "~1.0.1"
+
[email protected]:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
+
+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"
+
+custom-event@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425"
+
+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"
+
+date-now@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+dateformat@~1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9"
+ dependencies:
+ get-stdin "^4.0.1"
+ meow "^3.3.0"
+
[email protected]:
+ version "0.7.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39"
+
[email protected], debug@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
+ dependencies:
+ ms "0.7.1"
+
[email protected]:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c"
+ dependencies:
+ ms "0.7.2"
+
[email protected]:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351"
+ dependencies:
+ ms "0.7.2"
+
[email protected]:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.3.tgz#0f7eb8c30965ec08c72accfa0130c8b79984141d"
+ dependencies:
+ ms "0.7.2"
+
+debug@^2.1.1, debug@^2.2.0, debug@^2.4.5:
+ version "2.6.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.4.tgz#7586a9b3c39741c0282ae33445c4e8ac74734fe0"
+ dependencies:
+ ms "0.7.3"
+
+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"
+
+deep-extend@~0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253"
+
+deep-is@~0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+
+define-properties@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
+ dependencies:
+ foreach "^2.0.5"
+ object-keys "^1.0.8"
+
+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"
+
[email protected], depd@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3"
+
+deps-sort@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5"
+ dependencies:
+ JSONStream "^1.0.3"
+ shasum "^1.0.0"
+ subarg "^1.0.0"
+ through2 "^2.0.0"
+
+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"
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ dependencies:
+ repeating "^2.0.0"
+
+detective@^4.0.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/detective/-/detective-4.5.0.tgz#6e5a8c6b26e6c7a254b1c6b6d7490d98ec91edd1"
+ dependencies:
+ acorn "^4.0.3"
+ defined "^1.0.0"
+
+di@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c"
+
+diffie-hellman@^5.0.0:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+doctrine@^1.2.2:
+ 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.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63"
+ dependencies:
+ esutils "^2.0.2"
+ isarray "^1.0.0"
+
+dom-serialize@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b"
+ dependencies:
+ custom-event "~1.0.0"
+ ent "~2.2.0"
+ extend "^3.0.0"
+ void-elements "^2.0.0"
+
+dom-serializer@0, dom-serializer@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
+ dependencies:
+ domelementtype "~1.1.1"
+ entities "~1.1.1"
+
+domain-browser@^1.1.1, domain-browser@~1.1.0:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
+
+domelementtype@1, domelementtype@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
+
+domelementtype@~1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
+
+domhandler@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738"
+ dependencies:
+ domelementtype "1"
+
[email protected], domutils@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
+ dependencies:
+ readable-stream "^2.0.2"
+
+ecc-jsbn@~0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
+ dependencies:
+ jsbn "~0.1.0"
+
[email protected]:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+
+elliptic@^6.0.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+ 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.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20"
+
+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"
+
[email protected]:
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.3.tgz#1798ed93451246453d4c6f635d7a201fe940d5ab"
+ dependencies:
+ component-emitter "1.2.1"
+ component-inherit "0.0.3"
+ debug "2.3.3"
+ engine.io-parser "1.3.2"
+ has-cors "1.1.0"
+ indexof "0.0.1"
+ parsejson "0.0.3"
+ parseqs "0.0.5"
+ parseuri "0.0.5"
+ ws "1.1.2"
+ xmlhttprequest-ssl "1.5.3"
+ yeast "0.1.2"
+
[email protected]:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.2.tgz#937b079f0007d0893ec56d46cb220b8cb435220a"
+ dependencies:
+ after "0.8.2"
+ arraybuffer.slice "0.0.6"
+ base64-arraybuffer "0.1.5"
+ blob "0.0.4"
+ has-binary "0.1.7"
+ wtf-8 "1.0.0"
+
[email protected]:
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.3.tgz#8de7f97895d20d39b85f88eeee777b2bd42b13d4"
+ dependencies:
+ accepts "1.3.3"
+ base64id "1.0.0"
+ cookie "0.3.1"
+ debug "2.3.3"
+ engine.io-parser "1.3.2"
+ ws "1.1.2"
+
+enhanced-resolve@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.1.0.tgz#9f4b626f577245edcf4b2ad83d86e17f4f421dec"
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.4.0"
+ object-assign "^4.0.1"
+ tapable "^0.2.5"
+
+ent@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d"
+
+entities@^1.1.1, entities@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
+
+enzyme@~2.8.2:
+ version "2.8.2"
+ resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-2.8.2.tgz#6c8bcb05012abc4aa4bc3213fb23780b9b5b1714"
+ dependencies:
+ cheerio "^0.22.0"
+ function.prototype.name "^1.0.0"
+ is-subset "^0.1.1"
+ lodash "^4.17.2"
+ object-is "^1.0.1"
+ object.assign "^4.0.4"
+ object.entries "^1.0.3"
+ object.values "^1.0.3"
+ prop-types "^15.5.4"
+ uuid "^2.0.3"
+
+errno@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d"
+ dependencies:
+ prr "~0.0.0"
+
+error-ex@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.6.1, es-abstract@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623fb94c"
+ dependencies:
+ es-to-primitive "^1.1.1"
+ function-bind "^1.1.0"
+ is-callable "^1.1.3"
+ is-regex "^1.0.3"
+
+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.9, es5-ext@~0.10.14:
+ version "0.10.15"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.15.tgz#c330a5934c1ee21284a7c081a86e5fd937c91ea6"
+ dependencies:
+ es6-iterator "2"
+ es6-symbol "~3.1"
+
+es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512"
+ dependencies:
+ d "1"
+ es5-ext "^0.10.14"
+ es6-symbol "^3.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.0.5"
+ resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.0.5.tgz#7882f30adde5b240ccfa7f7d78c548330951ae42"
+
+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"
+
[email protected], es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.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:
+ 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.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-plugin-react@^6.10.3:
+ version "6.10.3"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz#c5435beb06774e12c7db2f6abaddcbf900cd3f78"
+ dependencies:
+ array.prototype.find "^2.0.1"
+ doctrine "^1.2.2"
+ has "^1.0.1"
+ jsx-ast-utils "^1.3.4"
+ object.assign "^4.0.4"
+
+eslint@^3.0.0, eslint@^3.19.0:
+ version "3.19.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc"
+ dependencies:
+ babel-code-frame "^6.16.0"
+ chalk "^1.1.3"
+ concat-stream "^1.5.2"
+ debug "^2.1.1"
+ doctrine "^2.0.0"
+ escope "^3.6.0"
+ espree "^3.4.0"
+ esquery "^1.0.0"
+ estraverse "^4.2.0"
+ esutils "^2.0.2"
+ file-entry-cache "^2.0.0"
+ glob "^7.0.3"
+ globals "^9.14.0"
+ ignore "^3.2.0"
+ imurmurhash "^0.1.4"
+ inquirer "^0.12.0"
+ is-my-json-valid "^2.10.0"
+ is-resolvable "^1.0.0"
+ js-yaml "^3.5.1"
+ json-stable-stringify "^1.0.0"
+ levn "^0.3.0"
+ lodash "^4.0.0"
+ mkdirp "^0.5.0"
+ natural-compare "^1.4.0"
+ optionator "^0.8.2"
+ path-is-inside "^1.0.1"
+ pluralize "^1.2.1"
+ progress "^1.1.8"
+ require-uncached "^1.0.2"
+ shelljs "^0.7.5"
+ strip-bom "^3.0.0"
+ strip-json-comments "~2.0.1"
+ table "^3.7.8"
+ text-table "~0.2.0"
+ user-home "^2.0.0"
+
+espree@^3.4.0:
+ version "3.4.2"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.2.tgz#38dbdedbedc95b8961a1fbf04734a8f6a9c8c592"
+ dependencies:
+ acorn "^5.0.1"
+ 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"
+
+esquery@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa"
+ dependencies:
+ estraverse "^4.0.0"
+
+esrecurse@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220"
+ dependencies:
+ estraverse "~4.1.0"
+ object-assign "^4.0.1"
+
+estraverse@^4.0.0, estraverse@^4.1.1, estraverse@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+estraverse@~4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2"
+
+esutils@^2.0.0, esutils@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+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"
+
+eventemitter2@~0.4.13:
+ version "0.4.14"
+ resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab"
+
[email protected]:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508"
+
+events@^1.0.0, events@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+evp_bytestokey@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz#497b66ad9fef65cd7c08a6180824ba1476b66e53"
+ dependencies:
+ create-hash "^1.1.1"
+
+exit-hook@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
+
+exit@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+
+expand-braces@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea"
+ dependencies:
+ array-slice "^0.2.3"
+ array-unique "^0.2.1"
+ braces "^0.1.2"
+
+expand-brackets@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+ dependencies:
+ is-posix-bracket "^0.1.0"
+
+expand-range@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044"
+ dependencies:
+ is-number "^0.1.1"
+ repeat-string "^0.2.2"
+
+expand-range@^1.8.1:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+ dependencies:
+ fill-range "^2.1.0"
+
+exports-loader@~0.6.4:
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/exports-loader/-/exports-loader-0.6.4.tgz#d70fc6121975b35fc12830cf52754be2740fc886"
+ dependencies:
+ loader-utils "^1.0.2"
+ source-map "0.5.x"
+
+extend@^3.0.0, extend@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4"
+
+extglob@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+ dependencies:
+ is-extglob "^1.0.0"
+
+extract-zip@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.5.0.tgz#92ccf6d81ef70a9fa4c1747114ccef6d8688a6c4"
+ dependencies:
+ concat-stream "1.5.0"
+ debug "0.7.4"
+ mkdirp "0.5.0"
+ yauzl "2.4.1"
+
[email protected]:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
+
+fast-levenshtein@~2.0.4:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+
+faye-websocket@~0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
+ dependencies:
+ websocket-driver ">=0.5.1"
+
+fbjs@^0.8.1, fbjs@^0.8.4, fbjs@^0.8.9:
+ version "0.8.12"
+ resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.12.tgz#10b5d92f76d45575fd63a217d4ea02bea2f8ed04"
+ dependencies:
+ core-js "^1.0.0"
+ isomorphic-fetch "^2.1.1"
+ loose-envify "^1.0.0"
+ object-assign "^4.1.0"
+ promise "^7.1.1"
+ setimmediate "^1.0.5"
+ ua-parser-js "^0.7.9"
+
+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"
+
+figures@^1.0.1, figures@^1.3.5:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
+ dependencies:
+ escape-string-regexp "^1.0.5"
+ object-assign "^4.1.0"
+
+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"
+
+filename-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775"
+
+fill-range@^2.1.0:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
+ dependencies:
+ is-number "^2.1.0"
+ isobject "^2.0.0"
+ randomatic "^1.1.3"
+ repeat-element "^1.1.2"
+ repeat-string "^1.5.2"
+
[email protected]:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.1.tgz#bcd15d1689c0e5ed729b6f7f541a6df984117db8"
+ dependencies:
+ debug "2.6.3"
+ encodeurl "~1.0.1"
+ escape-html "~1.0.3"
+ on-finished "~2.3.0"
+ parseurl "~1.3.1"
+ statuses "~1.3.1"
+ unpipe "~1.0.0"
+
+find-cache-dir@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9"
+ dependencies:
+ commondir "^1.0.1"
+ mkdirp "^0.5.1"
+ pkg-dir "^1.0.0"
+
+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"
+
+findup-sync@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16"
+ dependencies:
+ glob "~5.0.0"
+
+flat-cache@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96"
+ dependencies:
+ circular-json "^0.3.1"
+ del "^2.0.2"
+ graceful-fs "^4.1.2"
+ write "^0.2.1"
+
+follow-redirects@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.2.3.tgz#01abaeca85e3609837d9fcda3167a7e42fdaca21"
+ dependencies:
+ debug "^2.4.5"
+
+for-in@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+ dependencies:
+ for-in "^1.0.1"
+
+foreach@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+
+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.1.1:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.5"
+ mime-types "^2.1.12"
+
+fs-extra@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950"
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^2.1.0"
+ klaw "^1.0.0"
+
+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.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff"
+ dependencies:
+ nan "^2.3.0"
+ node-pre-gyp "^0.6.29"
+
+fstream-ignore@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
+ dependencies:
+ fstream "^1.0.0"
+ inherits "2"
+ minimatch "^3.0.0"
+
+fstream@^1.0.0, fstream@^1.0.10, 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.0.2, function-bind@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771"
+
+function.prototype.name@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.0.0.tgz#5f523ca64e491a5f95aba80cc1e391080a14482e"
+ dependencies:
+ define-properties "^1.1.2"
+ function-bind "^1.1.0"
+ is-callable "^1.1.2"
+
+gauge@~2.7.1:
+ 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.2"
+ resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105"
+ dependencies:
+ globule "^1.0.0"
+
+generate-function@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
+
+generate-object-property@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
+ dependencies:
+ is-property "^1.0.0"
+
+get-caller-file@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
+
+get-stdin@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
+
+getobject@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/getobject/-/getobject-0.1.0.tgz#047a449789fa160d018f5486ed91320b6ec7885c"
+
+getpass@^0.1.1:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6"
+ dependencies:
+ assert-plus "^1.0.0"
+
+glob-base@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+ dependencies:
+ glob-parent "^2.0.0"
+ is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+ dependencies:
+ is-glob "^2.0.0"
+
+glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.0, glob@^7.1.1, glob@~7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.2"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@~5.0.0:
+ version "5.0.15"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
+ dependencies:
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "2 || 3"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@~7.0.0:
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.2"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^9.0.0, globals@^9.14.0:
+ version "9.17.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286"
+
+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.1.0"
+ resolved "https://registry.yarnpkg.com/globule/-/globule-1.1.0.tgz#c49352e4dc183d85893ee825385eb994bb6df45f"
+ dependencies:
+ glob "~7.1.1"
+ lodash "~4.16.4"
+ minimatch "~3.0.2"
+
+graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
+ 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"
+
+grunt-cli@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.2.0.tgz#562b119ebb069ddb464ace2845501be97b35b6a8"
+ dependencies:
+ findup-sync "~0.3.0"
+ grunt-known-options "~1.1.0"
+ nopt "~3.0.6"
+ resolve "~1.1.0"
+
+grunt-contrib-uglify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/grunt-contrib-uglify/-/grunt-contrib-uglify-3.0.0.tgz#7411fb74ed0f730cfc3d9bb6867c4fb7f93fbc49"
+ dependencies:
+ chalk "^1.0.0"
+ maxmin "^1.1.0"
+ uglify-js "~3.0.4"
+ uri-path "^1.0.0"
+
+grunt-contrib-watch@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/grunt-contrib-watch/-/grunt-contrib-watch-1.0.0.tgz#84a1a7a1d6abd26ed568413496c73133e990018f"
+ dependencies:
+ async "^1.5.0"
+ gaze "^1.0.0"
+ lodash "^3.10.1"
+ tiny-lr "^0.2.1"
+
+grunt-eslint@^19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/grunt-eslint/-/grunt-eslint-19.0.0.tgz#bb74c379061599cec1f66169def2a89d862d861b"
+ dependencies:
+ chalk "^1.0.0"
+ eslint "^3.0.0"
+
+grunt-karma@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/grunt-karma/-/grunt-karma-2.0.0.tgz#753583d115dfdc055fe57e58f96d6b3c7e612118"
+ dependencies:
+ lodash "^3.10.1"
+
+grunt-known-options@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-1.1.0.tgz#a4274eeb32fa765da5a7a3b1712617ce3b144149"
+
+grunt-legacy-log-utils@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz#a7b8e2d0fb35b5a50f4af986fc112749ebc96f3d"
+ dependencies:
+ chalk "~1.1.1"
+ lodash "~4.3.0"
+
+grunt-legacy-log@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/grunt-legacy-log/-/grunt-legacy-log-1.0.0.tgz#fb86f1809847bc07dc47843f9ecd6cacb62df2d5"
+ dependencies:
+ colors "~1.1.2"
+ grunt-legacy-log-utils "~1.0.0"
+ hooker "~0.2.3"
+ lodash "~3.10.1"
+ underscore.string "~3.2.3"
+
+grunt-legacy-util@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz#386aa78dc6ed50986c2b18957265b1b48abb9b86"
+ dependencies:
+ async "~1.5.2"
+ exit "~0.1.1"
+ getobject "~0.1.0"
+ hooker "~0.2.3"
+ lodash "~4.3.0"
+ underscore.string "~3.2.3"
+ which "~1.2.1"
+
+grunt-webpack@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/grunt-webpack/-/grunt-webpack-2.0.1.tgz#84c5d9373ade88468285de787021c42a97d5306c"
+ dependencies:
+ lodash "^4.7.0"
+
+grunt@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/grunt/-/grunt-1.0.1.tgz#e8778764e944b18f32bb0f10b9078475c9dfb56b"
+ dependencies:
+ coffee-script "~1.10.0"
+ dateformat "~1.0.12"
+ eventemitter2 "~0.4.13"
+ exit "~0.1.1"
+ findup-sync "~0.3.0"
+ glob "~7.0.0"
+ grunt-cli "~1.2.0"
+ grunt-known-options "~1.1.0"
+ grunt-legacy-log "~1.0.0"
+ grunt-legacy-util "~1.0.0"
+ iconv-lite "~0.4.13"
+ js-yaml "~3.5.2"
+ minimatch "~3.0.0"
+ nopt "~3.0.6"
+ path-is-absolute "~1.0.0"
+ rimraf "~2.2.8"
+
+gzip-size@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-1.0.0.tgz#66cf8b101047227b95bace6ea1da0c177ed5c22f"
+ dependencies:
+ browserify-zlib "^0.1.4"
+ concat-stream "^1.4.1"
+
+har-schema@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
+
+har-validator@~2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
+ dependencies:
+ chalk "^1.1.1"
+ commander "^2.9.0"
+ is-my-json-valid "^2.12.4"
+ pinkie-promise "^2.0.0"
+
+har-validator@~4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
+ dependencies:
+ ajv "^4.9.1"
+ har-schema "^1.0.5"
+
+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"
+
[email protected]:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c"
+ dependencies:
+ isarray "0.0.1"
+
[email protected]:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39"
+
+has-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has@^1.0.0, has@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
+ dependencies:
+ function-bind "^1.0.2"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.0.3.tgz#1332ff00156c0a0ffdd8236013d07b77a0451573"
+ dependencies:
+ inherits "^2.0.1"
+
+hasha@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1"
+ dependencies:
+ is-stream "^1.0.1"
+ pinkie-promise "^2.0.0"
+
+hat@^0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/hat/-/hat-0.0.3.tgz#bb014a9e64b3788aed8005917413d4ff3d502d8a"
+
+hawk@~3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
+ dependencies:
+ boom "2.x.x"
+ cryptiles "2.x.x"
+ hoek "2.x.x"
+ sntp "1.x.x"
+
+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"
+
[email protected]:
+ version "2.16.3"
+ resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
+
+home-or-tmp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.1"
+
+hooker@~0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/hooker/-/hooker-0.2.3.tgz#b834f723cc4a242aa65963459df6d984c5d3d959"
+
+hosted-git-info@^2.1.4:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67"
+
+htmlescape@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351"
+
+htmlparser2@^3.9.1:
+ version "3.9.2"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338"
+ dependencies:
+ domelementtype "^1.3.0"
+ domhandler "^2.3.0"
+ domutils "^1.5.1"
+ entities "^1.1.1"
+ inherits "^2.0.1"
+ readable-stream "^2.0.2"
+
+http-errors@~1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942"
+ dependencies:
+ inherits "~2.0.1"
+ statuses "1"
+
+http-errors@~1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257"
+ dependencies:
+ depd "1.1.0"
+ inherits "2.0.3"
+ setprototypeof "1.0.3"
+ statuses ">= 1.3.1 < 2"
+
+http-proxy@^1.13.0:
+ version "1.16.2"
+ resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742"
+ dependencies:
+ eventemitter3 "1.x.x"
+ requires-port "1.x.x"
+
+http-signature@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
+ dependencies:
+ assert-plus "^0.2.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
[email protected], https-browserify@~0.0.0:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82"
+
[email protected]:
+ version "0.4.13"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2"
+
[email protected]:
+ version "0.4.15"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb"
+
+iconv-lite@~0.4.13:
+ version "0.4.16"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.16.tgz#65de3beeb39e2960d67f049f1634ffcbcde9014b"
+
+ieee754@^1.1.4:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
+
+ignore@^3.2.0:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.7.tgz#4810ca5f1d8eca5595213a34b94f2eb4ed926bbd"
+
+"imports-loader@git+https://github.com/webpack-contrib/imports-loader.git#44d6f48463b256a17c1ba6fd9b5cc1449b4e379d":
+ version "0.7.1"
+ resolved "git+https://github.com/webpack-contrib/imports-loader.git#44d6f48463b256a17c1ba6fd9b5cc1449b4e379d"
+ dependencies:
+ loader-utils "^1.0.2"
+ source-map "^0.5.6"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+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"
+
[email protected]:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflight@^1.0.4:
+ 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, [email protected], inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
[email protected]:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@~1.3.0:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
+
+inline-source-map@~0.6.0:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5"
+ dependencies:
+ source-map "~0.5.3"
+
+inquirer@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e"
+ dependencies:
+ ansi-escapes "^1.1.0"
+ ansi-regex "^2.0.0"
+ chalk "^1.0.0"
+ cli-cursor "^1.0.1"
+ cli-width "^2.0.0"
+ figures "^1.3.5"
+ lodash "^4.3.0"
+ readline2 "^1.0.1"
+ run-async "^0.1.0"
+ rx-lite "^3.1.2"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.0"
+ through "^2.3.6"
+
+insert-module-globals@^7.0.0:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.0.1.tgz#c03bf4e01cb086d5b5e5ace8ad0afe7889d638c3"
+ dependencies:
+ JSONStream "^1.0.3"
+ combine-source-map "~0.7.1"
+ concat-stream "~1.5.1"
+ is-buffer "^1.1.0"
+ lexical-scope "^1.2.0"
+ process "~0.11.0"
+ through2 "^2.0.0"
+ xtend "^4.0.0"
+
+interpret@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90"
+
+invariant@^2.2.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
+ 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"
+
+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-buffer@^1.1.0, is-buffer@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc"
+
+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.2, is-callable@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
+
+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-dotfile@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d"
+
+is-equal-shallow@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+ dependencies:
+ is-primitive "^2.0.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-extglob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+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@^2.0.0, is-glob@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+ dependencies:
+ is-extglob "^1.0.0"
+
+is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4:
+ version "2.16.0"
+ resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693"
+ dependencies:
+ generate-function "^2.0.0"
+ generate-object-property "^1.1.0"
+ jsonpointer "^4.0.0"
+ xtend "^4.0.0"
+
+is-number@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806"
+
+is-number@^2.0.2, is-number@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+ dependencies:
+ kind-of "^3.0.2"
+
+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.0"
+ resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc"
+ dependencies:
+ is-path-inside "^1.0.0"
+
+is-path-inside@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f"
+ dependencies:
+ path-is-inside "^1.0.1"
+
+is-posix-bracket@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+is-property@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
+
+is-regex@^1.0.3:
+ 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.0.0"
+ resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62"
+ dependencies:
+ tryit "^1.0.1"
+
+is-stream@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-subset@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6"
+
+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"
+
[email protected], isarray@~0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
[email protected], 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.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621"
+
+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"
+
+isomorphic-fetch@^2.1.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
+ dependencies:
+ node-fetch "^1.0.1"
+ whatwg-fetch ">=0.10.0"
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+jasmine-core@~2.5.2:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.5.2.tgz#6f61bd79061e27f43e6f9355e44b3c6cab6ff297"
+
+jodid25519@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967"
+ dependencies:
+ jsbn "~0.1.0"
+
+js-string-escape@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef"
+
+js-tokens@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7"
+
+js-yaml@^3.5.1, js-yaml@~3.5.2:
+ version "3.5.5"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.5.5.tgz#0377c38017cabc7322b0d1fbcd25a491641f2fbe"
+ dependencies:
+ argparse "^1.0.2"
+ 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@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+
+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.4"
+ resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96e37de"
+
[email protected]:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+
+json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+ dependencies:
+ jsonify "~0.0.0"
+
+json-stable-stringify@~0.0.0:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45"
+ dependencies:
+ jsonify "~0.0.0"
+
+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"
+
[email protected]:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
+
+json5@^0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+jsonfile@^2.1.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+
+jsonparse@^1.2.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.0.tgz#85fc245b1d9259acc6941960b905adf64e7de0e8"
+
+jsonpointer@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
+
+jsprim@^1.2.2:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918"
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.0.2"
+ json-schema "0.2.3"
+ verror "1.3.6"
+
+jsx-ast-utils@^1.3.4:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1"
+
+karma-babel-preprocessor@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/karma-babel-preprocessor/-/karma-babel-preprocessor-6.0.1.tgz#7ae1d3e64950dbe11f421b74040ab08fb5a66c21"
+ dependencies:
+ babel-core "^6.0.0"
+
+karma-browserify@~5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/karma-browserify/-/karma-browserify-5.1.1.tgz#f642d70d776d9ab3b73526c5732abcfea2400319"
+ dependencies:
+ convert-source-map "^1.1.3"
+ hat "^0.0.3"
+ js-string-escape "^1.0.0"
+ lodash "^3.10.1"
+ minimatch "^3.0.0"
+ os-shim "^0.1.3"
+
+karma-jasmine-html-reporter@~0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz#48a8e5ef18807617ee2b5e33c1194c35b439524c"
+ dependencies:
+ karma-jasmine "^1.0.2"
+
+karma-jasmine@^1.0.2, karma-jasmine@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.0.tgz#22e4c06bf9a182e5294d1f705e3733811b810acf"
+
+karma-phantomjs-launcher@~1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz#d23ca34801bda9863ad318e3bb4bd4062b13acd2"
+ dependencies:
+ lodash "^4.0.1"
+ phantomjs-prebuilt "^2.1.7"
+
+karma-requirejs@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/karma-requirejs/-/karma-requirejs-1.1.0.tgz#fddae2cb87d7ebc16fb0222893564d7fee578798"
+
+karma-sourcemap-loader@~0.3.7:
+ version "0.3.7"
+ resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz#91322c77f8f13d46fed062b042e1009d4c4505d8"
+ dependencies:
+ graceful-fs "^4.1.2"
+
+karma-webpack@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-2.0.3.tgz#39cebf5ca2580139b27f9ae69b78816b9c82fae6"
+ dependencies:
+ async "~0.9.0"
+ loader-utils "^0.2.5"
+ lodash "^3.8.0"
+ source-map "^0.1.41"
+ webpack-dev-middleware "^1.0.11"
+
+karma@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/karma/-/karma-1.5.0.tgz#9c4c14f0400bef2c04c8e8e6bff59371025cc009"
+ dependencies:
+ bluebird "^3.3.0"
+ body-parser "^1.16.1"
+ chokidar "^1.4.1"
+ colors "^1.1.0"
+ combine-lists "^1.0.0"
+ connect "^3.6.0"
+ core-js "^2.2.0"
+ di "^0.0.1"
+ dom-serialize "^2.2.0"
+ expand-braces "^0.1.1"
+ glob "^7.1.1"
+ graceful-fs "^4.1.2"
+ http-proxy "^1.13.0"
+ isbinaryfile "^3.0.0"
+ lodash "^3.8.0"
+ log4js "^0.6.31"
+ mime "^1.3.4"
+ minimatch "^3.0.0"
+ optimist "^0.6.1"
+ qjobs "^1.1.4"
+ range-parser "^1.2.0"
+ rimraf "^2.6.0"
+ safe-buffer "^5.0.1"
+ socket.io "1.7.3"
+ source-map "^0.5.3"
+ tmp "0.0.31"
+ useragent "^2.1.12"
+
+kew@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b"
+
+kind-of@^3.0.2:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.0.tgz#b58abe4d5c044ad33726a8c1525b48cf891bff07"
+ dependencies:
+ is-buffer "^1.1.5"
+
+klaw@^1.0.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
+ optionalDependencies:
+ graceful-fs "^4.1.9"
+
+labeled-stream-splicer@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz#a52e1d138024c00b86b1c0c91f677918b8ae0a59"
+ dependencies:
+ inherits "^2.0.1"
+ isarray "~0.0.1"
+ stream-splicer "^2.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"
+
+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"
+
+lexical-scope@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/lexical-scope/-/lexical-scope-1.2.0.tgz#fcea5edc704a4b3a8796cdca419c3a0afaf22df4"
+ dependencies:
+ astw "^2.0.0"
+
+livereload-js@^2.2.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.2.2.tgz#6c87257e648ab475bc24ea257457edcc1f8d0bc2"
+
+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"
+
+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@^0.2.16, loader-utils@^0.2.5:
+ version "0.2.17"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
+ dependencies:
+ big.js "^3.1.3"
+ emojis-list "^2.0.0"
+ json5 "^0.5.0"
+ object-assign "^4.0.1"
+
+loader-utils@^1.0.2:
+ 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"
+
+lodash.assignin@^4.0.9:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2"
+
+lodash.bind@^4.1.4:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35"
+
+lodash.defaults@^4.0.1:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
+
+lodash.filter@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace"
+
+lodash.flatten@^4.2.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
+
+lodash.foreach@^4.3.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
+
+lodash.map@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3"
+
+lodash.memoize@~3.0.3:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f"
+
+lodash.merge@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5"
+
+lodash.pick@^4.2.1:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
+
+lodash.reduce@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b"
+
+lodash.reject@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415"
+
+lodash.some@^4.4.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
+
+lodash@^3.10.1, lodash@^3.8.0, lodash@~3.10.1:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
+
+lodash@^4.0.0, lodash@^4.0.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.7.0:
+ version "4.17.4"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
+
+lodash@~4.16.4:
+ version "4.16.6"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.6.tgz#d22c9ac660288f3843e16ba7d2b5d06cca27d777"
+
+lodash@~4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.3.0.tgz#efd9c4a6ec53f3b05412429915c3e4824e4d25a4"
+
+log4js@^0.6.31:
+ version "0.6.38"
+ resolved "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd"
+ dependencies:
+ readable-stream "~1.0.2"
+ semver "~4.3.3"
+
+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:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
+ dependencies:
+ js-tokens "^3.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"
+
[email protected]:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d"
+
+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"
+
+maxmin@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/maxmin/-/maxmin-1.1.0.tgz#71365e84a99dd8f8b3f7d5fde2f00d1e7f73be61"
+ dependencies:
+ chalk "^1.0.0"
+ figures "^1.0.1"
+ gzip-size "^1.0.0"
+ pretty-bytes "^1.0.0"
+
[email protected]:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+
+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.1.0, meow@^3.3.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"
+
+micromatch@^2.1.5:
+ version "2.3.11"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+ dependencies:
+ arr-diff "^2.0.0"
+ array-unique "^0.2.1"
+ braces "^1.8.2"
+ expand-brackets "^0.1.4"
+ extglob "^0.3.1"
+ filename-regex "^2.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.1"
+ kind-of "^3.0.2"
+ normalize-path "^2.0.1"
+ object.omit "^2.0.0"
+ parse-glob "^3.0.4"
+ regex-cache "^0.4.2"
+
+miller-rabin@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d"
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+mime-db@~1.27.0:
+ version "1.27.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1"
+
+mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7:
+ version "2.1.15"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed"
+ dependencies:
+ mime-db "~1.27.0"
+
+mime@^1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53"
+
+minimalistic-assert@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
+
+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.0, minimatch@^3.0.2, minimatch@~3.0.0, minimatch@~3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774"
+ dependencies:
+ brace-expansion "^1.0.0"
+
[email protected], minimist@~0.0.1:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
[email protected]:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12"
+ dependencies:
+ minimist "0.0.8"
+
+"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ dependencies:
+ minimist "0.0.8"
+
+module-deps@^4.0.8:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-4.1.1.tgz#23215833f1da13fd606ccb8087b44852dcb821fd"
+ dependencies:
+ JSONStream "^1.0.3"
+ browser-resolve "^1.7.0"
+ cached-path-relative "^1.0.0"
+ concat-stream "~1.5.0"
+ defined "^1.0.0"
+ detective "^4.0.0"
+ duplexer2 "^0.1.2"
+ inherits "^2.0.1"
+ parents "^1.0.0"
+ readable-stream "^2.0.2"
+ resolve "^1.1.3"
+ stream-combiner2 "^1.1.1"
+ subarg "^1.0.0"
+ through2 "^2.0.0"
+ xtend "^4.0.0"
+
[email protected]:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
+
[email protected]:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
+
[email protected]:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff"
+
[email protected]:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
+
+nan@^2.3.0:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45"
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+
[email protected]:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
+
+node-fetch@^1.0.1:
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04"
+ dependencies:
+ encoding "^0.1.11"
+ is-stream "^1.0.1"
+
+node-libs-browser@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646"
+ dependencies:
+ assert "^1.1.1"
+ browserify-zlib "^0.1.4"
+ 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 "0.0.1"
+ os-browserify "^0.2.0"
+ path-browserify "0.0.0"
+ process "^0.11.0"
+ punycode "^1.2.4"
+ querystring-es3 "^0.2.0"
+ readable-stream "^2.0.5"
+ stream-browserify "^2.0.1"
+ stream-http "^2.3.1"
+ string_decoder "^0.10.25"
+ timers-browserify "^2.0.2"
+ tty-browserify "0.0.0"
+ url "^0.11.0"
+ util "^0.10.3"
+ vm-browserify "0.0.4"
+
+node-pre-gyp@^0.6.29:
+ version "0.6.34"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7"
+ dependencies:
+ mkdirp "^0.5.1"
+ nopt "^4.0.1"
+ npmlog "^4.0.2"
+ rc "^1.1.7"
+ request "^2.81.0"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^2.2.1"
+ tar-pack "^3.4.0"
+
+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@~3.0.6:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+ dependencies:
+ abbrev "1"
+
+normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb"
+ 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@^2.0.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"
+
+npmlog@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f"
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.1"
+ set-blocking "~2.0.0"
+
+nth-check@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4"
+ dependencies:
+ boolbase "~1.0.0"
+
+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.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
+
[email protected]:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0"
+
+object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
[email protected]:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291"
+
+object-is@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6"
+
+object-keys@^1.0.10, object-keys@^1.0.8:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
+
+object.assign@^4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.0.4.tgz#b1c9cc044ef1b9fe63606fc141abbb32e14730cc"
+ dependencies:
+ define-properties "^1.1.2"
+ function-bind "^1.1.0"
+ object-keys "^1.0.10"
+
+object.entries@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d257661f05d161a5f"
+ dependencies:
+ define-properties "^1.1.2"
+ es-abstract "^1.6.1"
+ function-bind "^1.1.0"
+ has "^1.0.1"
+
+object.omit@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+ dependencies:
+ for-own "^0.1.4"
+ is-extendable "^0.1.1"
+
+object.values@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a"
+ dependencies:
+ define-properties "^1.1.2"
+ es-abstract "^1.6.1"
+ function-bind "^1.1.0"
+ has "^1.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"
+
+once@^1.3.0, once@^1.3.3:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ dependencies:
+ wrappy "1"
+
+onetime@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
+
+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"
+
+options@>=0.0.5:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f"
+
+os-browserify@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f"
+
+os-browserify@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.1.2.tgz#49ca0293e0b19590a5f5de10c7f265a617d8fe54"
+
+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 "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
+ dependencies:
+ lcid "^1.0.0"
+
+os-shim@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917"
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+outpipe@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2"
+ dependencies:
+ shell-quote "^1.4.2"
+
+pako@~0.2.0:
+ version "0.2.9"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
+
+parents@^1.0.0, parents@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751"
+ dependencies:
+ path-platform "~0.11.15"
+
+parse-asn1@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712"
+ 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-glob@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+ dependencies:
+ glob-base "^0.3.0"
+ is-dotfile "^1.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.0"
+
+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"
+
[email protected]:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab"
+ dependencies:
+ better-assert "~1.0.0"
+
[email protected]:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d"
+ dependencies:
+ better-assert "~1.0.0"
+
[email protected]:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a"
+ dependencies:
+ better-assert "~1.0.0"
+
+parseurl@~1.3.0, parseurl@~1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56"
+
[email protected], path-browserify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+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-is-absolute@^1.0.0, 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:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+
+path-parse@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+
+path-platform@~0.11.15:
+ version "0.11.15"
+ resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2"
+
+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"
+
+pbkdf2@^3.0.3:
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.9.tgz#f2c4b25a600058b3c3773c086c37dbbee1ffe693"
+ dependencies:
+ create-hmac "^1.1.2"
+
+pend@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+
+performance-now@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
+
+phantomjs-prebuilt@^2.1.7:
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.14.tgz#d53d311fcfb7d1d08ddb24014558f1188c516da0"
+ dependencies:
+ es6-promise "~4.0.3"
+ extract-zip "~1.5.0"
+ fs-extra "~1.0.0"
+ hasha "~2.2.0"
+ kew "~0.7.0"
+ progress "~1.1.8"
+ request "~2.79.0"
+ request-progress "~2.0.1"
+ which "~1.2.10"
+
+pify@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+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"
+
+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"
+
+pluralize@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+
+preserve@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+
+pretty-bytes@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84"
+ dependencies:
+ get-stdin "^4.0.1"
+ meow "^3.1.0"
+
+private@^0.1.6:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1"
+
+process-nextick-args@~1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
+
+process@^0.11.0, process@~0.11.0:
+ version "0.11.9"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.9.tgz#7bd5ad21aa6253e7da8682264f1e11d11c0318c1"
+
+progress@^1.1.8, progress@~1.1.8:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
+
+promise@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf"
+ dependencies:
+ asap "~2.0.3"
+
+prop-types@^15.5.4:
+ version "15.5.8"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.8.tgz#6b7b2e141083be38c8595aa51fc55775c7199394"
+ dependencies:
+ fbjs "^0.8.9"
+
+prr@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a"
+
+public-encrypt@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6"
+ 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"
+
[email protected]:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@^1.2.4, punycode@^1.3.2, punycode@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+qjobs@^1.1.4:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73"
+
[email protected]:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-5.2.0.tgz#a9f31142af468cb72b25b30136ba2456834916be"
+
[email protected], qs@~6.4.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
+
+qs@~5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-5.1.0.tgz#4d932e5c7ea411cca76a312d39a606200fd50cd9"
+
+qs@~6.3.0:
+ version "6.3.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c"
+
+querystring-es3@^0.2.0, querystring-es3@~0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
[email protected]:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+randomatic@^1.1.3:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb"
+ dependencies:
+ is-number "^2.0.2"
+ kind-of "^3.0.2"
+
+randombytes@^2.0.0, randombytes@^2.0.1:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.3.tgz#674c99760901c3c4112771a31e521dc349cc09ec"
+
+range-parser@^1.0.3, 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.1.5:
+ version "2.1.7"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774"
+ dependencies:
+ bytes "2.4.0"
+ iconv-lite "0.4.13"
+ unpipe "1.0.0"
+
+raw-body@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96"
+ dependencies:
+ bytes "2.4.0"
+ iconv-lite "0.4.15"
+ unpipe "1.0.0"
+
+rc@^1.1.7:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95"
+ dependencies:
+ deep-extend "~0.4.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+react-addons-test-utils@~15.4.2:
+ version "15.4.2"
+ resolved "https://registry.yarnpkg.com/react-addons-test-utils/-/react-addons-test-utils-15.4.2.tgz#93bcaa718fcae7360d42e8fb1c09756cc36302a2"
+ dependencies:
+ fbjs "^0.8.4"
+ object-assign "^4.1.0"
+
+react-dom@~15.4.2:
+ version "15.4.2"
+ resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.4.2.tgz#015363f05b0a1fd52ae9efdd3a0060d90695208f"
+ dependencies:
+ fbjs "^0.8.1"
+ loose-envify "^1.1.0"
+ object-assign "^4.1.0"
+
+react@~15.4.2:
+ version "15.4.2"
+ resolved "https://registry.yarnpkg.com/react/-/react-15.4.2.tgz#41f7991b26185392ba9bae96c8889e7e018397ef"
+ dependencies:
+ fbjs "^0.8.4"
+ loose-envify "^1.1.0"
+ object-assign "^4.1.0"
+
+read-only-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0"
+ dependencies:
+ readable-stream "^2.0.2"
+
+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@^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"
+
+readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.6:
+ version "2.2.9"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8"
+ dependencies:
+ buffer-shims "~1.0.0"
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "~1.0.0"
+ process-nextick-args "~1.0.6"
+ string_decoder "~1.0.0"
+ util-deprecate "~1.0.1"
+
+readable-stream@~1.0.2:
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@~2.0.0:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "~1.0.0"
+ process-nextick-args "~1.0.6"
+ string_decoder "~0.10.x"
+ util-deprecate "~1.0.1"
+
+readdirp@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+ dependencies:
+ graceful-fs "^4.1.2"
+ minimatch "^3.0.2"
+ readable-stream "^2.0.2"
+ set-immediate-shim "^1.0.1"
+
+readline2@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35"
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ mute-stream "0.0.5"
+
+rechoir@^0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
+ dependencies:
+ resolve "^1.1.6"
+
+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"
+
+regenerate@^1.2.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260"
+
+regenerator-runtime@^0.10.0:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e"
+
[email protected]:
+ version "0.9.11"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283"
+ dependencies:
+ babel-runtime "^6.18.0"
+ babel-types "^6.19.0"
+ private "^0.1.6"
+
+regex-cache@^0.4.2:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145"
+ dependencies:
+ is-equal-shallow "^0.1.3"
+ is-primitive "^2.0.0"
+
+regexpu-core@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+ dependencies:
+ regenerate "^1.2.1"
+ regjsgen "^0.2.0"
+ regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+
+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"
+
+remove-trailing-separator@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4"
+
+repeat-element@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae"
+
+repeat-string@^1.5.2:
+ 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-progress@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08"
+ dependencies:
+ throttleit "^1.0.0"
+
+request@^2.81.0:
+ version "2.81.0"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
+ dependencies:
+ aws-sign2 "~0.6.0"
+ aws4 "^1.2.1"
+ caseless "~0.12.0"
+ combined-stream "~1.0.5"
+ extend "~3.0.0"
+ forever-agent "~0.6.1"
+ form-data "~2.1.1"
+ har-validator "~4.2.1"
+ hawk "~3.1.3"
+ http-signature "~1.1.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.7"
+ oauth-sign "~0.8.1"
+ performance-now "^0.2.0"
+ qs "~6.4.0"
+ safe-buffer "^5.0.1"
+ stringstream "~0.0.4"
+ tough-cookie "~2.3.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.0.0"
+
+request@~2.79.0:
+ version "2.79.0"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de"
+ dependencies:
+ aws-sign2 "~0.6.0"
+ aws4 "^1.2.1"
+ caseless "~0.11.0"
+ combined-stream "~1.0.5"
+ extend "~3.0.0"
+ forever-agent "~0.6.1"
+ form-data "~2.1.1"
+ har-validator "~2.0.6"
+ hawk "~3.1.3"
+ http-signature "~1.1.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.7"
+ oauth-sign "~0.8.1"
+ qs "~6.3.0"
+ stringstream "~0.0.4"
+ tough-cookie "~2.3.0"
+ tunnel-agent "~0.4.1"
+ uuid "^3.0.0"
+
+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.2:
+ 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"
+
+requirejs@~2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/requirejs/-/requirejs-2.3.3.tgz#aa59fd3a0287eaf407959a138228044b5dd6a6a3"
+
[email protected]:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+
+resolve-from@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
+
[email protected], resolve@~1.1.0:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
+
+resolve@^1.1.3, resolve@^1.1.4, resolve@^1.1.6:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5"
+ dependencies:
+ path-parse "^1.0.5"
+
+restore-cursor@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
+ dependencies:
+ exit-hook "^1.0.0"
+ onetime "^1.0.0"
+
+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.1, rimraf@^2.6.0, rimraf@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d"
+ dependencies:
+ glob "^7.0.5"
+
+rimraf@~2.2.8:
+ version "2.2.8"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582"
+
+ripemd160@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-1.0.1.tgz#93a4bbd4942bc574b69a8fa57c71de10ecca7d6e"
+
+run-async@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389"
+ dependencies:
+ once "^1.3.0"
+
+rx-lite@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
+
+safe-buffer@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7"
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
+
+semver@~4.3.3:
+ version "4.3.6"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"
+
+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-immediate-shim@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+setimmediate@^1.0.4, setimmediate@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
[email protected]:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
+
+sha.js@^2.3.6, sha.js@~2.4.4:
+ version "2.4.8"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f"
+ dependencies:
+ inherits "^2.0.1"
+
+shasum@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f"
+ dependencies:
+ json-stable-stringify "~0.0.0"
+ sha.js "~2.4.4"
+
+shell-quote@^1.4.2, shell-quote@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
+ dependencies:
+ array-filter "~0.0.0"
+ array-map "~0.0.0"
+ array-reduce "~0.0.0"
+ jsonify "~0.0.0"
+
+shelljs@^0.7.5:
+ version "0.7.7"
+ resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1"
+ dependencies:
+ glob "^7.0.0"
+ interpret "^1.0.0"
+ rechoir "^0.6.2"
+
+signal-exit@^3.0.0:
+ 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"
+
[email protected]:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
+
[email protected]:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
+ dependencies:
+ hoek "2.x.x"
+
[email protected]:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b"
+ dependencies:
+ debug "2.3.3"
+ socket.io-parser "2.3.1"
+
[email protected]:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.7.3.tgz#b30e86aa10d5ef3546601c09cde4765e381da377"
+ dependencies:
+ backo2 "1.0.2"
+ component-bind "1.0.0"
+ component-emitter "1.2.1"
+ debug "2.3.3"
+ engine.io-client "1.8.3"
+ has-binary "0.1.7"
+ indexof "0.0.1"
+ object-component "0.0.3"
+ parseuri "0.0.5"
+ socket.io-parser "2.3.1"
+ to-array "0.1.4"
+
[email protected]:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0"
+ dependencies:
+ component-emitter "1.1.2"
+ debug "2.2.0"
+ isarray "0.0.1"
+ json3 "3.3.2"
+
[email protected]:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.7.3.tgz#b8af9caba00949e568e369f1327ea9be9ea2461b"
+ dependencies:
+ debug "2.3.3"
+ engine.io "1.8.3"
+ has-binary "0.1.7"
+ object-assign "4.1.0"
+ socket.io-adapter "0.5.0"
+ socket.io-client "1.7.3"
+ socket.io-parser "2.3.1"
+
+source-list-map@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-1.1.1.tgz#1a33ac210ca144d1e561f906ebccab5669ff4cb4"
+
+source-map-support@^0.4.2:
+ version "0.4.14"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.14.tgz#9d4463772598b86271b4f523f6c1f4e02a7d6aef"
+ dependencies:
+ source-map "^0.5.6"
+
[email protected], source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3:
+ version "0.5.6"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
+
+source-map@^0.1.41:
+ version "0.1.43"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
+ dependencies:
+ amdefine ">=0.0.4"
+
+spdx-correct@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40"
+ dependencies:
+ spdx-license-ids "^1.0.2"
+
+spdx-expression-parse@~1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c"
+
+spdx-license-ids@^1.0.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+
+sshpk@^1.7.0:
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c"
+ dependencies:
+ asn1 "~0.2.3"
+ assert-plus "^1.0.0"
+ dashdash "^1.12.0"
+ getpass "^0.1.1"
+ optionalDependencies:
+ bcrypt-pbkdf "^1.0.0"
+ ecc-jsbn "~0.1.1"
+ jodid25519 "^1.0.0"
+ jsbn "~0.1.0"
+ tweetnacl "~0.14.0"
+
+statuses@1, "statuses@>= 1.3.1 < 2", statuses@~1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
+
+stream-browserify@^2.0.0, 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-combiner2@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe"
+ dependencies:
+ duplexer2 "~0.1.0"
+ readable-stream "^2.0.2"
+
+stream-http@^2.0.0, stream-http@^2.3.1:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.0.tgz#cec1f4e3b494bc4a81b451808970f8b20b4ed5f6"
+ dependencies:
+ builtin-status-codes "^3.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.2.6"
+ to-arraybuffer "^1.0.0"
+ xtend "^4.0.0"
+
+stream-splicer@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc1935197600175910d83"
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.2"
+
+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@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e"
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^3.0.0"
+
+string_decoder@^0.10.25, string_decoder@~0.10.0, string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
+string_decoder@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b0d8ab281667"
+ dependencies:
+ buffer-shims "~1.0.0"
+
+stringstream@~0.0.4:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
+
+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-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-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-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"
+
+subarg@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2"
+ dependencies:
+ minimist "^1.1.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.1.0:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+ dependencies:
+ has-flag "^1.0.0"
+
+syntax-error@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.3.0.tgz#1ed9266c4d40be75dc55bf9bb1cb77062bb96ca1"
+ dependencies:
+ acorn "^4.0.3"
+
+table@^3.7.8:
+ version "3.8.3"
+ resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f"
+ dependencies:
+ ajv "^4.7.0"
+ ajv-keywords "^1.0.0"
+ chalk "^1.1.1"
+ lodash "^4.0.0"
+ slice-ansi "0.0.4"
+ string-width "^2.0.0"
+
+tapable@^0.2.5, tapable@~0.2.5:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.6.tgz#206be8e188860b514425375e6f1ae89bfb01fd8d"
+
+tar-pack@^3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984"
+ dependencies:
+ debug "^2.2.0"
+ fstream "^1.0.10"
+ fstream-ignore "^1.0.5"
+ once "^1.3.3"
+ readable-stream "^2.1.4"
+ rimraf "^2.5.1"
+ tar "^2.2.1"
+ uid-number "^0.0.6"
+
+tar@^2.2.1:
+ 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"
+
+text-table@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+
+throttleit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c"
+
+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.2.7 <3", through@^2.3.6:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+
+timers-browserify@^1.0.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d"
+ dependencies:
+ process "~0.11.0"
+
+timers-browserify@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af211349a00fbca56ac86b86"
+ dependencies:
+ setimmediate "^1.0.4"
+
+tiny-lr@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-0.2.1.tgz#b3fdba802e5d56a33c2f6f10794b32e477ac729d"
+ dependencies:
+ body-parser "~1.14.0"
+ debug "~2.2.0"
+ faye-websocket "~0.10.0"
+ livereload-js "^2.2.0"
+ parseurl "~1.3.0"
+ qs "~5.1.0"
+
[email protected], [email protected]:
+ version "0.0.31"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7"
+ dependencies:
+ os-tmpdir "~1.0.1"
+
[email protected]:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890"
+
+to-arraybuffer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+
+to-fast-properties@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320"
+
+tough-cookie@~2.3.0:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a"
+ dependencies:
+ punycode "^1.4.1"
+
+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"
+
+tryit@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb"
+
[email protected], 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"
+
+tunnel-agent@~0.4.1:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
+
+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-is@~1.6.10, type-is@~1.6.14:
+ version "1.6.15"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410"
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.15"
+
+typedarray@~0.0.5:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+ua-parser-js@^0.7.9:
+ version "0.7.12"
+ resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb"
+
+uglify-js@^2.8.5:
+ version "2.8.22"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.22.tgz#d54934778a8da14903fa29a326fb24c0ab51a1a0"
+ dependencies:
+ source-map "~0.5.1"
+ yargs "~3.10.0"
+ optionalDependencies:
+ uglify-to-browserify "~1.0.0"
+
+uglify-js@~3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.4.tgz#13da18bc4ecec20d29861b4ab7b60cb9ef9a9cc0"
+ dependencies:
+ commander "~2.9.0"
+ source-map "~0.5.1"
+ optionalDependencies:
+ uglify-to-browserify "~1.0.0"
+
+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"
+
+uid-number@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
+
[email protected]:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa"
+
+umd@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.1.tgz#8ae556e11011f63c2596708a8837259f01b3d60e"
+
+underscore.string@~3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.2.3.tgz#806992633665d5e5fcb4db1fb3a862eb68e9e6da"
+
+underscore@~1.8.3:
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022"
+
[email protected], unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+
+uri-path@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/uri-path/-/uri-path-1.0.0.tgz#9747f018358933c31de0fccfd82d138e67262e32"
+
+url@^0.11.0, 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"
+
+user-home@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f"
+ dependencies:
+ os-homedir "^1.0.0"
+
+useragent@^2.1.12:
+ version "2.1.13"
+ resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.1.13.tgz#bba43e8aa24d5ceb83c2937473e102e21df74c10"
+ dependencies:
+ lru-cache "2.2.x"
+ tmp "0.0.x"
+
+util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
[email protected], util@^0.10.3, util@~0.10.1:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+ dependencies:
+ inherits "2.0.1"
+
[email protected]:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8"
+
+uuid@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a"
+
+uuid@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
+ dependencies:
+ spdx-correct "~1.0.0"
+ spdx-expression-parse "~1.0.0"
+
[email protected]:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c"
+ dependencies:
+ extsprintf "1.0.2"
+
[email protected], vm-browserify@~0.0.1:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+ dependencies:
+ indexof "0.0.1"
+
+void-elements@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
+
+watchify@~3.9.0:
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/watchify/-/watchify-3.9.0.tgz#f075fd2e8a86acde84cedba6e5c2a0bedd523d9e"
+ dependencies:
+ anymatch "^1.3.0"
+ browserify "^14.0.0"
+ chokidar "^1.0.0"
+ defined "^1.0.0"
+ outpipe "^1.1.0"
+ through2 "^2.0.0"
+ xtend "^4.0.0"
+
+watchpack@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.3.1.tgz#7d8693907b28ce6013e7f3610aa2a1acf07dad87"
+ dependencies:
+ async "^2.1.2"
+ chokidar "^1.4.3"
+ graceful-fs "^4.1.2"
+
+webpack-dev-middleware@^1.0.11:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.10.2.tgz#2e252ce1dfb020dbda1ccb37df26f30ab014dbd1"
+ dependencies:
+ memory-fs "~0.4.1"
+ mime "^1.3.4"
+ path-is-absolute "^1.0.0"
+ range-parser "^1.0.3"
+
+webpack-sources@^0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.2.3.tgz#17c62bfaf13c707f9d02c479e0dcdde8380697fb"
+ dependencies:
+ source-list-map "^1.1.1"
+ source-map "~0.5.3"
+
+webpack@~2.3.1:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.3.3.tgz#eecc083c18fb7bf958ea4f40b57a6640c5a0cc78"
+ dependencies:
+ acorn "^4.0.4"
+ acorn-dynamic-import "^2.0.0"
+ ajv "^4.7.0"
+ ajv-keywords "^1.1.1"
+ async "^2.1.2"
+ enhanced-resolve "^3.0.0"
+ interpret "^1.0.0"
+ json-loader "^0.5.4"
+ loader-runner "^2.3.0"
+ loader-utils "^0.2.16"
+ memory-fs "~0.4.1"
+ mkdirp "~0.5.0"
+ node-libs-browser "^2.0.0"
+ source-map "^0.5.3"
+ supports-color "^3.1.0"
+ tapable "~0.2.5"
+ uglify-js "^2.8.5"
+ watchpack "^1.3.1"
+ webpack-sources "^0.2.3"
+ yargs "^6.0.0"
+
+websocket-driver@>=0.5.1:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36"
+ dependencies:
+ websocket-extensions ">=0.1.1"
+
+websocket-extensions@>=0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7"
+
+whatwg-fetch@>=0.10.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84"
+
+which-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
+
+which@~1.2.1, which@~1.2.10:
+ version "1.2.14"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5"
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad"
+ dependencies:
+ string-width "^1.0.1"
+
[email protected]:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+
[email protected]:
+ 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"
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/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@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
+ dependencies:
+ mkdirp "^0.5.1"
+
[email protected]:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.2.tgz#8a244fa052401e08c9886cf44a85189e1fd4067f"
+ dependencies:
+ options ">=0.0.5"
+ ultron "1.0.x"
+
[email protected]:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a"
+
[email protected]:
+ version "1.5.3"
+ resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d"
+
+xtend@^4.0.0, xtend@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+yargs-parser@^4.2.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c"
+ dependencies:
+ camelcase "^3.0.0"
+
+yargs@^6.0.0:
+ version "6.6.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208"
+ 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 "^4.2.0"
+
+yargs@~3.10.0:
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/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"
+
[email protected]:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005"
+ dependencies:
+ fd-slicer "~1.0.1"
+
[email protected]:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"
[text/plain] 0002-Creates-query-history-list.diff (49.2K, 4-0002-Creates-query-history-list.diff)
download | inline diff:
diff --git a/web/.eslintrc.js b/web/.eslintrc.js
index c60569db..98486dcd 100644
--- a/web/.eslintrc.js
+++ b/web/.eslintrc.js
@@ -5,7 +5,10 @@ module.exports = {
'amd': true,
'jasmine': true,
},
- 'extends': 'eslint:recommended',
+ 'extends': [
+ 'eslint:recommended',
+ "plugin:react/recommended",
+ ],
'parserOptions': {
'ecmaFeatures': {
'experimentalObjectRestSpread': true,
@@ -40,6 +43,6 @@ module.exports = {
'comma-dangle': [
'error',
'always-multiline'
- ]
+ ],
}
};
\ No newline at end of file
diff --git a/web/Gruntfile.js b/web/Gruntfile.js
index 000224e4..46cd3593 100644
--- a/web/Gruntfile.js
+++ b/web/Gruntfile.js
@@ -1,9 +1,9 @@
const webpackConfig = require('./webpack.config.js');
var srcFiles = [
- 'pgadmin/static/jsx/*.jsx',
+ 'pgadmin/static/jsx/**/*.jsx',
'pgadmin/static/js/selection/*.js',
- 'regression/javascript/**.js',
+ 'regression/javascript/**/*.jsx',
'regression/javascript/**/*.js',
'*.js',
];
diff --git a/web/karma.conf.js b/web/karma.conf.js
index 7fa51b50..01eb4224 100644
--- a/web/karma.conf.js
+++ b/web/karma.conf.js
@@ -16,7 +16,7 @@ module.exports = function (config) {
],
preprocessors: {
'regression/javascript/**/*.js': ['webpack'],
- // 'regression/javascript/**/*.jsx': ['webpack'],
+ 'regression/javascript/**/*.jsx': ['webpack'],
},
webpack: webpackConfig,
webpackMiddleware: {
diff --git a/web/package.json b/web/package.json
index 760e1e0c..a775057d 100644
--- a/web/package.json
+++ b/web/package.json
@@ -5,6 +5,7 @@
"babel-preset-es2015": "~6.24.0",
"babel-preset-react": "~6.23.0",
"enzyme": "~2.8.2",
+ "enzyme-matchers": "^3.1.0",
"eslint": "^3.19.0",
"eslint-plugin-react": "^6.10.3",
"grunt": "~1.0.1",
@@ -14,6 +15,7 @@
"grunt-karma": "^2.0.0",
"grunt-webpack": "~2.0.1",
"jasmine-core": "~2.5.2",
+ "jasmine-enzyme": "^3.1.0",
"karma": "~1.5.0",
"karma-babel-preprocessor": "^6.0.1",
"karma-browserify": "~5.1.1",
@@ -34,7 +36,9 @@
"babelify": "~7.3.0",
"browserify": "~14.1.0",
"exports-loader": "~0.6.4",
+ "immutability-helper": "^2.2.0",
"imports-loader": "git+https://github.com/webpack-contrib/imports-loader.git#44d6f48463b256a17c1ba6fd9b5cc1449b4e379d",
+ "moment": "^2.18.1",
"react": "~15.4.2",
"react-dom": "~15.4.2",
"requirejs": "~2.3.3",
diff --git a/web/pgadmin/feature_tests/query_tool_journey_test.py b/web/pgadmin/feature_tests/query_tool_journey_test.py
new file mode 100644
index 00000000..530ed8b2
--- /dev/null
+++ b/web/pgadmin/feature_tests/query_tool_journey_test.py
@@ -0,0 +1,112 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import pyperclip
+import time
+
+from selenium.webdriver import ActionChains
+
+from regression.python_test_utils import test_utils
+from regression.feature_utils.base_feature_test import BaseFeatureTest
+
+
+class QueryToolJourneyTest(BaseFeatureTest):
+ """
+ Tests the path through the query tool
+ """
+
+ scenarios = [
+ ("Tests the path through the query tool", dict())
+ ]
+
+ def before(self):
+ connection = test_utils.get_db_connection(self.server['db'],
+ self.server['username'],
+ self.server['db_password'],
+ self.server['host'],
+ self.server['port'])
+ test_utils.drop_database(connection, "acceptance_test_db")
+ test_utils.create_database(self.server, "acceptance_test_db")
+ test_utils.create_table(self.server, "acceptance_test_db", "test_table")
+ self.page.add_server(self.server)
+
+ def runTest(self):
+ self._navigate_to_query_tool()
+ self._execute_query("SELECT * FROM test_table ORDER BY value")
+
+ self._test_copies_rows()
+ self._test_copies_columns()
+ self._test_history_tab()
+
+ def _test_copies_rows(self):
+ pyperclip.copy("old clipboard contents")
+ time.sleep(5)
+ self.page.driver.switch_to.default_content()
+ self.page.driver.switch_to_frame(self.page.driver.find_element_by_tag_name("iframe"))
+ self.page.find_by_xpath("//*[contains(@class, 'sr')]/*[1]/input[@type='checkbox']").click()
+ self.page.find_by_xpath("//*[@id='btn-copy-row']").click()
+
+ self.assertEqual("'Some-Name','6'",
+ pyperclip.paste())
+
+ def _test_copies_columns(self):
+ pyperclip.copy("old clipboard contents")
+
+ self.page.driver.switch_to.default_content()
+ self.page.driver.switch_to_frame(self.page.driver.find_element_by_tag_name("iframe"))
+ self.page.find_by_xpath("//*[@data-test='output-column-header' and contains(., 'some_column')]/input").click()
+ self.page.find_by_xpath("//*[@id='btn-copy-row']").click()
+
+ self.assertEqual(
+ """'Some-Name'
+'Some-Other-Name'""",
+ pyperclip.paste())
+
+ def _test_history_tab(self):
+ self.__clear_query_tool()
+
+ editor_input = self.page.find_by_id("output-panel")
+ self.page.click_element(editor_input)
+ self._execute_query("SELECT * FROM shoes")
+
+ self.page.click_tab("History")
+ history_element = self.page.find_by_id("history_grid")
+ self.assertIn("SELECT * FROM test_table", history_element.text)
+ self.assertIn("SELECT * FROM shoes", history_element.text)
+
+ def __clear_query_tool(self):
+ self.page.click_element(self.page.find_by_xpath("//*[@id='btn-edit']"))
+ self.page.click_modal('Yes')
+
+ def _navigate_to_query_tool(self):
+ self.page.toggle_open_tree_item(self.server['name'])
+ self.page.toggle_open_tree_item('Databases')
+ self.page.toggle_open_tree_item('acceptance_test_db')
+ time.sleep(5)
+ self.page.find_by_partial_link_text("Tools").click()
+ self.page.find_by_partial_link_text("Query Tool").click()
+ self.page.click_tab('Query-1')
+ time.sleep(5)
+
+ def _execute_query(self, query):
+ ActionChains(self.page.driver).send_keys(query).perform()
+ self.page.driver.switch_to.default_content()
+ self.page.driver.switch_to_frame(self.page.driver.find_element_by_tag_name("iframe"))
+ self.page.find_by_id("btn-flash").click()
+
+ def after(self):
+ self.page.close_query_tool()
+ self.page.remove_server(self.server)
+
+ connection = test_utils.get_db_connection(self.server['db'],
+ self.server['username'],
+ self.server['db_password'],
+ self.server['host'],
+ self.server['port'])
+ test_utils.drop_database(connection, "acceptance_test_db")
diff --git a/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py b/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py
index 17bc7bf5..ae3af820 100644
--- a/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py
+++ b/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py
@@ -83,7 +83,7 @@ class CheckDebuggerForXssFeatureTest(BaseFeatureTest):
# If debugger plugin is not found
if is_error and is_error == "Debugger Error":
- self.page.click_modal_ok()
+ self.page.click_modal('OK')
self.skipTest("Please make sure that debugger plugin is properly configured")
else:
time.sleep(2)
diff --git a/web/pgadmin/static/js/history/history_collection.js b/web/pgadmin/static/js/history/history_collection.js
new file mode 100644
index 00000000..f7b6acd7
--- /dev/null
+++ b/web/pgadmin/static/js/history/history_collection.js
@@ -0,0 +1,34 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+export default class HistoryCollection {
+
+ constructor(history_model) {
+ this.historyList = history_model;
+ this.onChange(() => {});
+ }
+
+ length() {
+ return this.historyList.length;
+ }
+
+ add(object) {
+ this.historyList.push(object);
+ this.onChangeHandler(this.historyList);
+ }
+
+ reset() {
+ this.historyList = [];
+ this.onChangeHandler(this.historyList);
+ }
+
+ onChange(onChangeHandler) {
+ this.onChangeHandler = onChangeHandler;
+ }
+}
\ No newline at end of file
diff --git a/web/pgadmin/static/js/history/index.js b/web/pgadmin/static/js/history/index.js
new file mode 100644
index 00000000..834878a8
--- /dev/null
+++ b/web/pgadmin/static/js/history/index.js
@@ -0,0 +1,14 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import historyCollection from './history_collection';
+
+export {
+ historyCollection,
+};
diff --git a/web/pgadmin/static/jsx/components.jsx b/web/pgadmin/static/jsx/components.jsx
index 5bcb5208..6ff34e4c 100644
--- a/web/pgadmin/static/jsx/components.jsx
+++ b/web/pgadmin/static/jsx/components.jsx
@@ -1,8 +1,10 @@
import React from 'react';
import {render} from 'react-dom';
+import QueryHistory from './history/query_history';
export {
render,
React,
+ QueryHistory,
};
\ No newline at end of file
diff --git a/web/pgadmin/static/jsx/history/query_history.jsx b/web/pgadmin/static/jsx/history/query_history.jsx
new file mode 100644
index 00000000..d36f5ce9
--- /dev/null
+++ b/web/pgadmin/static/jsx/history/query_history.jsx
@@ -0,0 +1,49 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import React from 'react';
+import QueryHistoryEntry from './query_history_entry';
+
+const liStyle = {
+ borderBottom: '1px solid #cccccc',
+};
+
+export default class QueryHistory extends React.Component {
+
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ history: [],
+ };
+ }
+
+ componentWillMount() {
+ this.setState({history: this.props.historyCollection.historyList});
+ this.props.historyCollection.onChange((historyList) => this.setState({history: historyList}));
+ }
+
+ render() {
+ return <ul>
+ {_.chain(this.state.history)
+ .sortBy(historyEntry => historyEntry.start_time)
+ .reverse()
+ .map((entry, index) =>
+ <li key={index} style={liStyle}>
+ <QueryHistoryEntry historyEntry={entry}/>
+ </li>)
+ .value()
+ }
+ </ul>;
+ }
+}
+
+QueryHistory.propTypes = {
+ historyCollection: React.PropTypes.object.isRequired,
+};
\ No newline at end of file
diff --git a/web/pgadmin/static/jsx/history/query_history_entry.jsx b/web/pgadmin/static/jsx/history/query_history_entry.jsx
new file mode 100644
index 00000000..d66cb3a7
--- /dev/null
+++ b/web/pgadmin/static/jsx/history/query_history_entry.jsx
@@ -0,0 +1,93 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import React from 'react';
+import update from 'immutability-helper';
+import moment from 'moment';
+
+const outerDivStyle = {
+ paddingLeft: '10px',
+ fontFamily: 'monospace',
+ paddingRight: '20px',
+ fontSize: '14px',
+ backgroundColor: '#FFF',
+};
+const sqlStyle = {
+ textOverflow: 'ellipsis',
+ overflow: 'hidden',
+ whiteSpace: 'nowrap',
+ userSelect: 'auto',
+};
+const secondLineStyle = {
+ display: 'flex',
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ fontSize: '13px',
+ color: '#888888',
+};
+const timestampStyle = {
+ alignSelf: 'flex-start',
+};
+const rowsAffectedStyle = {
+ alignSelf: 'flex-end',
+};
+const errorMessageStyle = {
+ textOverflow: 'ellipsis',
+ overflow: 'hidden',
+ whiteSpace: 'nowrap',
+ userSelect: 'auto',
+ fontSize: '13px',
+ color: '#888888',
+};
+
+export default class QueryHistoryEntry extends React.Component {
+ formatDate(date) {
+ return (moment(date).format('MMM D YYYY [–] HH:mm:ss'));
+ }
+
+ render() {
+ return (
+ <div style={this.queryEntryBackgroundColor()}>
+ <div style={sqlStyle}>
+ {this.props.historyEntry.query}
+ </div>
+ <div style={secondLineStyle}>
+ <div style={timestampStyle}>
+ {this.formatDate(this.props.historyEntry.start_time)} /
+ total time: {this.props.historyEntry.total_time}
+ </div>
+ <div style={rowsAffectedStyle}>
+ {this.props.historyEntry.row_affected} rows affected
+ </div>
+ </div>
+ <div style={errorMessageStyle}>
+ {this.props.historyEntry.message}
+ </div>
+ </div>
+ );
+ }
+
+ queryEntryBackgroundColor() {
+ if (!this.props.historyEntry.status) {
+ return update(outerDivStyle, {$merge: {backgroundColor: '#F7D0D5'}});
+ }
+ return outerDivStyle;
+ }
+}
+
+QueryHistoryEntry.propTypes = {
+ historyEntry: React.PropTypes.shape({
+ query: React.PropTypes.string,
+ start_time: React.PropTypes.instanceOf(Date),
+ status: React.PropTypes.bool,
+ total_time: React.PropTypes.string,
+ row_affected: React.PropTypes.int,
+ message: React.PropTypes.string,
+ }),
+};
\ No newline at end of file
diff --git a/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js b/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js
index d8ae73ee..f28bc13f 100644
--- a/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js
+++ b/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js
@@ -4,6 +4,8 @@ define(
'backbone', 'backgrid', 'codemirror', 'pgadmin.misc.explain',
'sources/selection/grid_selector', 'sources/selection/clipboard',
'sources/selection/copy_data',
+ 'sources/generated/history',
+ 'sources/generated/reactComponents',
'slickgrid', 'bootstrap', 'pgadmin.browser', 'wcdocker',
'codemirror/mode/sql/sql', 'codemirror/addon/selection/mark-selection',
@@ -27,7 +29,7 @@ define(
'slickgrid/slick.grid'
],
function(
- $, _, S, alertify, pgAdmin, Backbone, Backgrid, CodeMirror, pgExplain, GridSelector, clipboard, copyData
+ $, _, S, alertify, pgAdmin, Backbone, Backgrid, CodeMirror, pgExplain, GridSelector, clipboard, copyData, HistoryBundle, reactComponents
) {
/* Return back, this has been called more than once */
if (pgAdmin.SqlEditor)
@@ -226,6 +228,7 @@ define(
self.messages_panel = main_docker.addPanel('messages', wcDocker.DOCK.STACKED, self.data_output_panel);
self.history_panel = main_docker.addPanel('history', wcDocker.DOCK.STACKED, self.data_output_panel);
+
self.render_history_grid();
if (!self.handler.is_new_browser_tab) {
@@ -944,147 +947,145 @@ define(
// Remove any existing grid first
if (self.history_grid) {
- self.history_grid.remove();
+ self.history_grid.remove();
}
- var history_model = Backbone.Model.extend({
- defaults: {
- status: undefined,
- start_time: undefined,
- query: undefined,
- row_affected: 0,
- row_retrieved: 0,
- total_time: undefined,
- message: ''
- }
- });
-
- var history_collection = self.history_collection = new (Backbone.Collection.extend({
- model: history_model,
- // comparator to sort the history in reverse order of the start_time
- comparator: function(a, b) {
- return -a.get('start_time').localeCompare(b.get('start_time'));
- }
- }));
- var columns = [{
- name: "status",
- label: "",
- cell: Backgrid.Cell.extend({
- class: 'sql-status-cell',
- render: function() {
- this.$el.empty();
- var $btn = $('<button></button>', {
- class: 'btn btn-circle'
- }).appendTo(this.$el);
- var $circleDiv = $('<i></i>', {class: 'fa'}).appendTo($btn);
- if (this.model.get('status')) {
- $btn.addClass('btn-success');
- $circleDiv.addClass('fa-check');
- } else {
- $btn.addClass('btn-danger');
- $circleDiv.addClass('fa-times');
- }
-
- return this;
- },
- editable: false
- }),
- editable: false
- }, {
- name: "start_time",
- label: "Date",
- cell: "string",
- editable: false,
- resizeable: true
- }, {
- name: "query",
- label: "Query",
- cell: "string",
- editable: false,
- resizeable: true
- }, {
- name: "row_affected",
- label: "Rows affected",
- cell: "integer",
- editable: false,
- resizeable: true
- }, {
- name: "total_time",
- label: "Total Time",
- cell: "string",
- editable: false,
- resizeable: true
- }, {
- name: "message",
- label: "Message",
- cell: "string",
- editable: false,
- resizeable: true
- }];
-
-
- // Create Collection of Backgrid columns
- var columnsColl = new Backgrid.Columns(columns);
- var $history_grid = self.$el.find('#history_grid');
-
- var grid = self.history_grid = new Backgrid.Grid({
- columns: columnsColl,
- collection: history_collection,
- className: "backgrid table-bordered presentation table backgrid-striped"
- });
-
- // Render the grid
- $history_grid.append(grid.render().$el);
-
- var sizeAbleCol = new Backgrid.Extension.SizeAbleColumns({
- collection: history_collection,
- columns: columnsColl,
- grid: self.history_grid
- });
-
- $history_grid.find('thead').before(sizeAbleCol.render().el);
-
- // Add resize handlers
- var sizeHandler = new Backgrid.Extension.SizeAbleColumnsHandlers({
- sizeAbleColumns: sizeAbleCol,
- grid: self.history_grid,
- saveColumnWidth: true
- });
-
- // sizeHandler should render only when table grid loaded completely.
- setTimeout(function() {
- $history_grid.find('thead').before(sizeHandler.render().el);
- }, 1000);
-
- // re render sizeHandler whenever history panel tab becomes visible
- self.history_panel.on(wcDocker.EVENT.VISIBILITY_CHANGED, function(ev) {
- $history_grid.find('thead').before(sizeHandler.render().el);
- });
-
- // Initialized table width 0 still not calculated
- var table_width = 0;
- // Listen to resize events
- columnsColl.on('resize',
- function(columnModel, newWidth, oldWidth, offset) {
- var $grid_el = $history_grid.find('table'),
- tbl_orig_width = $grid_el.width(),
- offset = oldWidth - newWidth,
- tbl_new_width = tbl_orig_width - offset;
-
- if (table_width == 0) {
- table_width = tbl_orig_width
- }
- // Table new width cannot be less than original width
- if (tbl_new_width >= table_width) {
- $($grid_el).css('width', tbl_new_width + 'px');
- }
- else {
- // reset if calculated tbl_new_width is less than original
- // table width
- tbl_new_width = table_width;
- $($grid_el).css('width', tbl_new_width + 'px');
- }
- });
+ self.history_collection = new HistoryBundle.historyCollection([]);
+
+ let queryHistoryElement = reactComponents.React.createElement(
+ reactComponents.QueryHistory, {historyCollection: self.history_collection});
+ reactComponents.render(queryHistoryElement, $('#history_grid')[0]);
+
+ // var history_model = Backbone.Model.extend({
+ // defaults: {
+ // status: undefined,
+ // start_time: undefined,
+ // query: undefined,
+ // row_affected: 0,
+ // row_retrieved: 0,
+ // total_time: undefined,
+ // message: ''
+ // }
+ // });
+ // var columns = [{
+ // name: "status",
+ // label: "",
+ // cell: Backgrid.Cell.extend({
+ // class: 'sql-status-cell',
+ // render: function() {
+ // this.$el.empty();
+ // var $btn = $('<button></button>', {
+ // class: 'btn btn-circle'
+ // }).appendTo(this.$el);
+ // var $circleDiv = $('<i></i>', {class: 'fa'}).appendTo($btn);
+ // if (this.model.get('status')) {
+ // $btn.addClass('btn-success');
+ // $circleDiv.addClass('fa-check');
+ // } else {
+ // $btn.addClass('btn-danger');
+ // $circleDiv.addClass('fa-times');
+ // }
+ //
+ // return this;
+ // },
+ // editable: false
+ // }),
+ // editable: false
+ // }, {
+ // name: "start_time",
+ // label: "Date",
+ // cell: "string",
+ // editable: false,
+ // resizeable: true
+ // }, {
+ // name: "query",
+ // label: "Query",
+ // cell: "string",
+ // editable: false,
+ // resizeable: true
+ // }, {
+ // name: "row_affected",
+ // label: "Rows affected",
+ // cell: "integer",
+ // editable: false,
+ // resizeable: true
+ // }, {
+ // name: "total_time",
+ // label: "Total Time",
+ // cell: "string",
+ // editable: false,
+ // resizeable: true
+ // }, {
+ // name: "message",
+ // label: "Message",
+ // cell: "string",
+ // editable: false,
+ // resizeable: true
+ // }];
+
+
+ // // Create Collection of Backgrid columns
+ // var columnsColl = new Backgrid.Columns(columns);
+ // var $history_grid = self.$el.find('#history_grid');
+ //
+ // var grid = self.history_grid = new Backgrid.Grid({
+ // columns: columnsColl,
+ // collection: self.history_collection,
+ // className: "backgrid table-bordered presentation table backgrid-striped"
+ // });
+ //
+ // // Render the grid
+ // $history_grid.append(grid.render().$el);
+ //
+ // var sizeAbleCol = new Backgrid.Extension.SizeAbleColumns({
+ // collection: self.history_collection,
+ // columns: columnsColl,
+ // grid: self.history_grid
+ // });
+ //
+ // $history_grid.find('thead').before(sizeAbleCol.render().el);
+ //
+ // // Add resize handlers
+ // var sizeHandler = new Backgrid.Extension.SizeAbleColumnsHandlers({
+ // sizeAbleColumns: sizeAbleCol,
+ // grid: self.history_grid,
+ // saveColumnWidth: true
+ // });
+ //
+ // // sizeHandler should render only when table grid loaded completely.
+ // setTimeout(function() {
+ // $history_grid.find('thead').before(sizeHandler.render().el);
+ // }, 1000);
+ //
+ // // re render sizeHandler whenever history panel tab becomes visible
+ // self.history_panel.on(wcDocker.EVENT.VISIBILITY_CHANGED, function(ev) {
+ // $history_grid.find('thead').before(sizeHandler.render().el);
+ // });
+ //
+ // // Initialized table width 0 still not calculated
+ // var table_width = 0;
+ // // Listen to resize events
+ // columnsColl.on('resize',
+ // function(columnModel, newWidth, oldWidth, offset) {
+ // var $grid_el = $history_grid.find('table'),
+ // tbl_orig_width = $grid_el.width(),
+ // offset = oldWidth - newWidth,
+ // tbl_new_width = tbl_orig_width - offset;
+ //
+ // if (table_width == 0) {
+ // table_width = tbl_orig_width
+ // }
+ // // Table new width cannot be less than original width
+ // if (tbl_new_width >= table_width) {
+ // $($grid_el).css('width', tbl_new_width + 'px');
+ // }
+ // else {
+ // // reset if calculated tbl_new_width is less than original
+ // // table width
+ // tbl_new_width = table_width;
+ // $($grid_el).css('width', tbl_new_width + 'px');
+ // }
+ // });
},
// Callback function for Add New Row button click.
@@ -1387,7 +1388,7 @@ define(
this._stopEventPropogation(ev);
this._closeDropDown(ev);
// ask for confirmation only if anything to clear
- if(!self.history_collection.length) { return; }
+ if(!self.history_collection.length()) { return; }
alertify.confirm("{{ _('Clear history') }}",
"{{ _('Are you sure you wish to clear the history?') }}",
@@ -2208,11 +2209,13 @@ define(
$("#btn-flash").prop('disabled', false);
self.trigger('pgadmin-sqleditor:loading-icon:hide');
self.gridView.history_collection.add({
- 'status' : status, 'start_time': self.query_start_time.toString(),
- 'query': self.query, 'row_affected': self.rows_affected,
- 'total_time': self.total_time, 'message':msg
+ 'status' : status,
+ 'start_time': self.query_start_time,
+ 'query': self.query,
+ 'row_affected': self.rows_affected,
+ 'total_time': self.total_time,
+ 'message':msg,
});
- self.gridView.history_collection.sort();
}
},
@@ -2478,10 +2481,13 @@ define(
// Update the sql results in history tab
_.each(res.data.query_result, function(r) {
- self.gridView.history_collection.add(
- {'status' : r.status, 'start_time': self.query_start_time.toString(),
- 'query': r.sql, 'row_affected': r.rows_affected,
- 'total_time': self.total_time, 'message': r.result
+ self.gridView.history_collection.add({
+ 'status': r.status,
+ 'start_time': self.query_start_time,
+ 'query': r.sql,
+ 'row_affected': r.rows_affected,
+ 'total_time': self.total_time,
+ 'message': r.result,
});
});
self.trigger('pgadmin-sqleditor:loading-icon:hide');
diff --git a/web/regression/feature_utils/app_starter.py b/web/regression/feature_utils/app_starter.py
index 96cc516b..f40d6921 100644
--- a/web/regression/feature_utils/app_starter.py
+++ b/web/regression/feature_utils/app_starter.py
@@ -11,6 +11,7 @@ import subprocess
import signal
import random
+import time
class AppStarter:
""" Helper for starting the full pgadmin4 app and loading the page via
@@ -40,6 +41,7 @@ class AppStarter:
)
self.driver.set_window_size(1024, 1024)
+ time.sleep(10)
self.driver.get(
"http://" + self.app_config.DEFAULT_SERVER + ":" +
random_server_port)
diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py
index b1dfa182..0a89b623 100644
--- a/web/regression/feature_utils/pgadmin_page.py
+++ b/web/regression/feature_utils/pgadmin_page.py
@@ -31,15 +31,16 @@ class PgadminPage:
def reset_layout(self):
self.click_element(self.find_by_partial_link_text("File"))
self.find_by_partial_link_text("Reset Layout").click()
- self.click_modal_ok()
+ self.click_modal('OK')
self.wait_for_reloading_indicator_to_disappear()
- def click_modal_ok(self):
+ def click_modal(self, button_text):
time.sleep(0.5)
# Find active alertify dialog in case of multiple alertify dialog & click on that dialog
- self.click_element(
- self.find_by_xpath("//div[contains(@class, 'alertify') and not(contains(@class, 'ajs-hidden'))]//button[.='OK']")
- )
+ modal_button = self.find_by_xpath(
+ "//div[contains(@class, 'alertify') and not(contains(@class, 'ajs-hidden'))]//button[.='%s']"
+ % button_text)
+ self.click_element(modal_button)
def add_server(self, server_config):
self.find_by_xpath("//*[@class='aciTreeText' and contains(.,'Servers')]").click()
@@ -71,10 +72,13 @@ class PgadminPage:
def remove_server(self, server_config):
self.driver.switch_to.default_content()
- self.find_by_xpath("//*[@id='tree']//*[.='" + server_config['name'] + "' and @class='aciTreeItem']").click()
- self.find_by_partial_link_text("Object").click()
- self.find_by_partial_link_text("Delete/Drop").click()
- self.click_modal_ok()
+ server_to_remove = self.find_by_xpath("//*[@id='tree']//*[.='" + server_config['name'] + "' and @class='aciTreeItem']")
+ self.click_element(server_to_remove)
+ object_menu_item = self.find_by_partial_link_text("Object")
+ self.click_element(object_menu_item)
+ delete_menu_item = self.find_by_partial_link_text("Delete/Drop")
+ self.click_element(delete_menu_item)
+ self.click_modal('OK')
def select_tree_item(self, tree_item_text):
self.find_by_xpath("//*[@id='tree']//*[.='" + tree_item_text + "' and @class='aciTreeItem']").click()
@@ -95,6 +99,7 @@ class PgadminPage:
)
def click_element(self, element):
+ # driver must be here to adhere to the method contract in selenium.webdriver.support.wait.WebDriverWait.until()
def click_succeeded(driver):
try:
element.click()
@@ -127,8 +132,9 @@ class PgadminPage:
time.sleep(1)
def click_tab(self, tab_name):
- self.find_by_xpath("//*[contains(@class,'wcTabTop')]//*[contains(@class,'wcPanelTab') "
- "and contains(.,'" + tab_name + "')]").click()
+ tab = self.find_by_xpath("//*[contains(@class,'wcTabTop')]//*[contains(@class,'wcPanelTab') "
+ "and contains(.,'" + tab_name + "')]")
+ self.click_element(tab)
def wait_for_input_field_content(self, field_name, content):
def input_field_has_content(driver):
diff --git a/web/regression/javascript/check_node_visiblity_spec.js b/web/regression/javascript/check_node_visibility_spec.js
similarity index 60%
rename from web/regression/javascript/check_node_visiblity_spec.js
rename to web/regression/javascript/check_node_visibility_spec.js
index 130b1c21..96a8961f 100644
--- a/web/regression/javascript/check_node_visiblity_spec.js
+++ b/web/regression/javascript/check_node_visibility_spec.js
@@ -7,24 +7,24 @@
//
//////////////////////////////////////////////////////////////////////////
-define(["sources/check_node_visibility"],
-function (checkNodeVisibility, pgBrowser) {
- describe("checkNodeVisibility", function () {
+define(['sources/check_node_visibility'],
+function (checkNodeVisibility) {
+ describe('checkNodeVisibility', function () {
var browser;
browser = jasmine.createSpyObj('browser', [
- 'node_preference_data', 'get_preference']
+ 'node_preference_data', 'get_preference']
);
- describe("when node is server collection", function () {
- it("returns true", function () {
+ describe('when node is server collection', function () {
+ it('returns true', function () {
expect(checkNodeVisibility(browser, 'coll-server')).toEqual(true);
});
});
- describe("when node is server", function () {
- it("returns true", function () {
+ describe('when node is server', function () {
+ it('returns true', function () {
expect(checkNodeVisibility(browser, 'server')).toEqual(true);
});
});
diff --git a/web/regression/javascript/history/history_collection_spec.js b/web/regression/javascript/history/history_collection_spec.js
new file mode 100644
index 00000000..e1baa554
--- /dev/null
+++ b/web/regression/javascript/history/history_collection_spec.js
@@ -0,0 +1,83 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import HistoryCollection from '../../../pgadmin/static/js/history/history_collection';
+
+describe('historyCollection', function () {
+ let historyCollection, historyModel, onChangeSpy;
+ beforeEach(() => {
+ historyModel = [{some: 'thing', someOther: ['array element']}];
+ historyCollection = new HistoryCollection(historyModel);
+ onChangeSpy = jasmine.createSpy('onChangeHandler');
+
+ historyCollection.onChange(onChangeSpy);
+ });
+
+ describe('length', function () {
+ it('returns 0 when underlying history model has no elements', function () {
+ historyCollection = new HistoryCollection([]);
+
+ expect(historyCollection.length()).toBe(0);
+ });
+
+ it('returns the length of the underlying history model', function () {
+ expect(historyCollection.length()).toBe(1);
+ });
+ });
+
+ describe('add', function () {
+ let expectedHistory;
+ beforeEach(() => {
+ historyCollection.add({some: 'new thing', someOther: ['value1', 'value2']});
+
+ expectedHistory = [
+ {some: 'thing', someOther: ['array element']},
+ {some: 'new thing', someOther: ['value1', 'value2']},
+ ];
+ });
+
+ it('adds a passed entry', function () {
+ expect(historyCollection.historyList).toEqual(expectedHistory);
+ });
+
+ it('calls the onChange function', function () {
+ expect(onChangeSpy).toHaveBeenCalledWith(expectedHistory);
+ });
+ });
+
+ describe('reset', function () {
+ beforeEach(() => {
+ historyCollection.reset();
+ });
+
+ it('drops the history', function () {
+ expect(historyCollection.historyList).toEqual([]);
+ expect(historyCollection.length()).toBe(0);
+ });
+
+ it('calls the onChange function', function () {
+ expect(onChangeSpy).toHaveBeenCalledWith([]);
+ });
+ });
+
+ describe('sort', function () {
+ it('doesn\'t sort');
+ });
+
+ describe('when instantiated', function () {
+ describe('from a history model', function () {
+ it('has the historyModel', () => {
+ let content = historyCollection.historyList;
+
+ expect(content).toEqual(historyModel);
+ });
+
+ });
+ });
+});
\ No newline at end of file
diff --git a/web/regression/javascript/history/query_history_entry_spec.jsx b/web/regression/javascript/history/query_history_entry_spec.jsx
new file mode 100644
index 00000000..c86a1cfc
--- /dev/null
+++ b/web/regression/javascript/history/query_history_entry_spec.jsx
@@ -0,0 +1,50 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import React from 'react';
+
+import QueryHistoryEntry from '../../../pgadmin/static/jsx/history/query_history_entry';
+
+import {mount} from 'enzyme';
+import jasmineEnzyme from 'jasmine-enzyme';
+
+describe('QueryHistoryEntry', () => {
+ let historyWrapper;
+ beforeEach(() => {
+ jasmineEnzyme();
+ });
+
+ describe('for a failed query', () => {
+ beforeEach(() => {
+ const historyEntry = {
+ query: 'second sql statement',
+ start_time: new Date(2016, 11, 11, 1, 33, 5, 99),
+ status: false,
+ };
+ historyWrapper = mount(<QueryHistoryEntry historyEntry={historyEntry}/>);
+ });
+ it('displays a pink background color', () => {
+ expect(historyWrapper.find('div').first()).toHaveStyle('backgroundColor', '#F7D0D5');
+ });
+ });
+
+ describe('for a successful query', () => {
+ beforeEach(() => {
+ const historyEntry = {
+ query: 'second sql statement',
+ start_time: new Date(2016, 11, 11, 1, 33, 5, 99),
+ status: true,
+ };
+ historyWrapper = mount(<QueryHistoryEntry historyEntry={historyEntry}/>);
+ });
+ it('does not display a pink background color', () => {
+ expect(historyWrapper.find('div').first()).toHaveStyle('backgroundColor', '#FFF');
+ });
+ });
+});
diff --git a/web/regression/javascript/history/query_history_spec.jsx b/web/regression/javascript/history/query_history_spec.jsx
new file mode 100644
index 00000000..e36988a8
--- /dev/null
+++ b/web/regression/javascript/history/query_history_spec.jsx
@@ -0,0 +1,103 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import React from 'react';
+import QueryHistory from '../../../pgadmin/static/jsx/history/query_history';
+import QueryHistoryEntry from '../../../pgadmin/static/jsx/history/query_history_entry';
+import HistoryCollection from '../../../pgadmin/static/js/history/history_collection';
+import jasmineEnzyme from 'jasmine-enzyme';
+
+import {mount, shallow} from 'enzyme';
+
+describe('QueryHistory', () => {
+ let historyWrapper;
+ beforeEach(() => {
+ jasmineEnzyme();
+ const historyCollection = new HistoryCollection([]);
+ historyWrapper = shallow(<QueryHistory historyCollection={historyCollection}/>);
+ });
+
+ describe('on construction', () => {
+ it('has no entries', (done) => {
+ let foundChildren = historyWrapper.find(QueryHistoryEntry);
+ expect(foundChildren.length).toBe(0);
+ done();
+ });
+ });
+
+ describe('when it has history', () => {
+ describe('when two SQL queries were executed', () => {
+ let foundChildren;
+
+ beforeEach(() => {
+ const historyObjects = [
+ {
+ query: 'second sql statement',
+ start_time: new Date(2016, 11, 11, 1, 33, 5, 99),
+ status: false,
+ row_affected: 1,
+ total_time: '234 msec',
+ message: 'some other message',
+ },
+ {
+ query: 'first sql statement',
+ start_time: new Date(2017, 5, 3, 14, 3, 15, 150),
+ status: true,
+ row_affected: 2,
+ total_time: '14 msec',
+ message: 'a very important message',
+ },
+ ];
+ const historyCollection = new HistoryCollection(historyObjects);
+
+ historyWrapper = mount(<QueryHistory historyCollection={historyCollection}/>);
+
+ foundChildren = historyWrapper.find(QueryHistoryEntry);
+ });
+
+ it('has two query history entries', () => {
+ expect(foundChildren.length).toBe(2);
+ });
+
+ it('displays the SQL of the queries in order', () => {
+ expect(foundChildren.at(0).text()).toContain('first sql statement');
+ expect(foundChildren.at(1).text()).toContain('second sql statement');
+ });
+
+ it('displays the formatted timestamp of the queries in chronological order by most recent first', () => {
+ expect(foundChildren.at(0).text()).toContain('Jun 3 2017 – 14:03:15');
+ expect(foundChildren.at(1).text()).toContain('Dec 11 2016 – 01:33:05');
+ });
+
+ it('displays the number of rows affected', () => {
+ expect(foundChildren.at(1).text()).toContain('1 rows affected');
+ expect(foundChildren.at(0).text()).toContain('2 rows affected');
+ });
+
+ it('displays the total time', () => {
+ expect(foundChildren.at(0).text()).toContain('total time: 14 msec');
+ expect(foundChildren.at(1).text()).toContain('total time: 234 msec');
+ });
+
+ it('displays the truncated message', () => {
+ expect(foundChildren.at(0).text()).toContain('a very important message');
+ expect(foundChildren.at(1).text()).toContain('some other message');
+ });
+
+ describe('when there are one failing and one successful query each', () => {
+ it('adds a white background color for the successful query', () => {
+ expect(foundChildren.at(0).find('div').first()).toHaveStyle('backgroundColor', '#FFF');
+ });
+ it('adds a red background color for the failed query', () => {
+ expect(foundChildren.at(1).find('div').first()).toHaveStyle('backgroundColor', '#F7D0D5');
+ });
+ });
+ });
+ });
+});
\ No newline at end of file
diff --git a/web/regression/python_test_utils/test_utils.py b/web/regression/python_test_utils/test_utils.py
index 2b7c6954..202802a3 100644
--- a/web/regression/python_test_utils/test_utils.py
+++ b/web/regression/python_test_utils/test_utils.py
@@ -172,6 +172,7 @@ def create_table(server, db_name, table_name):
except Exception:
traceback.print_exc(file=sys.stderr)
+
def create_constraint(
server, db_name, table_name,
constraint_type="unique", constraint_name="test_unique"):
@@ -196,6 +197,7 @@ def create_constraint(
except Exception:
traceback.print_exc(file=sys.stderr)
+
def create_debug_function(server, db_name, function_name="test_func"):
try:
connection = get_db_connection(db_name,
diff --git a/web/webpack.config.js b/web/webpack.config.js
index 91586592..fc6d29e0 100644
--- a/web/webpack.config.js
+++ b/web/webpack.config.js
@@ -1,18 +1,21 @@
/* eslint-env node */
module.exports = {
- context: __dirname + '/pgadmin/static/jsx',
- entry: './components.jsx',
+ context: __dirname + '/pgadmin/static',
+ entry: {
+ reactComponents: './jsx/components.jsx',
+ history: './js/history/index.js',
+ },
output: {
libraryTarget: 'amd',
path: __dirname + '/pgadmin/static/js/generated',
- filename: 'reactComponents.js',
+ filename: '[name].js',
},
module: {
rules: [{
test: /\.jsx?$/,
- exclude: /node_modules/,
+ exclude: [/node_modules/, /vendor/],
use: {
loader: 'babel-loader',
options: {
diff --git a/web/webpack.test.config.js b/web/webpack.test.config.js
index 49bef069..2d87ad04 100644
--- a/web/webpack.test.config.js
+++ b/web/webpack.test.config.js
@@ -21,7 +21,7 @@ module.exports = {
use: {
loader: 'babel-loader',
options: {
- presets: ['es2015'],
+ presets: ['es2015', 'react'],
},
},
},
@@ -50,6 +50,7 @@ module.exports = {
},
resolve: {
+ extensions: ['.js', '.jsx'],
alias: {
'alertify': sourcesDir + '/vendor/alertifyjs/alertify',
'jquery': sourcesDir + '/vendor/jquery/jquery-1.11.2',
@@ -62,4 +63,11 @@ module.exports = {
'slickgrid.rowselectionmodel': sourcesDir + '/vendor/slickgrid/plugins/slick.rowselectionmodel',
},
},
+ externals: {
+ 'react/addons': true,
+ 'react/lib/ReactContext': true,
+ 'react/lib/ExecutionEnvironment': true,
+ 'react-dom/test-utils': true,
+ 'react-test-renderer/shallow': true,
+ },
};
\ No newline at end of file
diff --git a/web/yarn.lock b/web/yarn.lock
index 47f2e13c..fdbcfb4e 100644
--- a/web/yarn.lock
+++ b/web/yarn.lock
@@ -1431,6 +1431,12 @@ 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"
+deep-equal-ident@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/deep-equal-ident/-/deep-equal-ident-1.1.1.tgz#06f4b89e53710cd6cea4a7781c7a956642de8dc9"
+ dependencies:
+ lodash.isequal "^3.0"
+
deep-extend@~0.4.0:
version "0.4.1"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253"
@@ -1668,6 +1674,12 @@ entities@^1.1.1, entities@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
+enzyme-matchers@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/enzyme-matchers/-/enzyme-matchers-3.1.0.tgz#097fe2b734a7493ed0f8aea727d3976c2d6eac29"
+ dependencies:
+ deep-equal-ident "^1.1.1"
+
enzyme@~2.8.2:
version "2.8.2"
resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-2.8.2.tgz#6c8bcb05012abc4aa4bc3213fb23780b9b5b1714"
@@ -2542,6 +2554,12 @@ ignore@^3.2.0:
version "3.2.7"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.7.tgz#4810ca5f1d8eca5595213a34b94f2eb4ed926bbd"
+immutability-helper@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/immutability-helper/-/immutability-helper-2.2.0.tgz#c4385ad4f68315843efaf0cff3575ee82ffa405f"
+ dependencies:
+ invariant "^2.2.0"
+
"imports-loader@git+https://github.com/webpack-contrib/imports-loader.git#44d6f48463b256a17c1ba6fd9b5cc1449b4e379d":
version "0.7.1"
resolved "git+https://github.com/webpack-contrib/imports-loader.git#44d6f48463b256a17c1ba6fd9b5cc1449b4e379d"
@@ -2817,6 +2835,12 @@ jasmine-core@~2.5.2:
version "2.5.2"
resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.5.2.tgz#6f61bd79061e27f43e6f9355e44b3c6cab6ff297"
+jasmine-enzyme@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/jasmine-enzyme/-/jasmine-enzyme-3.1.0.tgz#99cdc5bd850c6a741332928fe988b4f00dcee7d2"
+ dependencies:
+ enzyme-matchers "^3.1.0"
+
jodid25519@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967"
@@ -3081,6 +3105,22 @@ loader-utils@^1.0.2:
emojis-list "^2.0.0"
json5 "^0.5.0"
+lodash._baseisequal@^3.0.0:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz#d8025f76339d29342767dcc887ce5cb95a5b51f1"
+ dependencies:
+ lodash.isarray "^3.0.0"
+ lodash.istypedarray "^3.0.0"
+ lodash.keys "^3.0.0"
+
+lodash._bindcallback@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e"
+
+lodash._getnative@^3.0.0:
+ version "3.9.1"
+ resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
+
lodash.assignin@^4.0.9:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2"
@@ -3105,6 +3145,33 @@ lodash.foreach@^4.3.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
+lodash.isarguments@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
+
+lodash.isarray@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
+
+lodash.isequal@^3.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-3.0.4.tgz#1c35eb3b6ef0cd1ff51743e3ea3cf7fdffdacb64"
+ dependencies:
+ lodash._baseisequal "^3.0.0"
+ lodash._bindcallback "^3.0.0"
+
+lodash.istypedarray@^3.0.0:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz#c9a477498607501d8e8494d283b87c39281cef62"
+
+lodash.keys@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
+ dependencies:
+ lodash._getnative "^3.0.0"
+ lodash.isarguments "^3.0.0"
+ lodash.isarray "^3.0.0"
+
lodash.map@^4.4.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3"
@@ -3309,6 +3376,10 @@ module-deps@^4.0.8:
through2 "^2.0.0"
xtend "^4.0.0"
+moment@^2.18.1:
+ version "2.18.1"
+ resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f"
+
[email protected]:
version "0.7.1"
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
view thread (45+ messages) latest in thread
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected], [email protected], [email protected], [email protected], [email protected]
Subject: Re: [pgAdmin4] [PATCH] History Tab rewrite in React
In-Reply-To: <CAHowoHZJtKn8F9XuiK2yFT=_OcgG7Ctx83iiFab17PwexajfDQ@mail.gmail.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox